/* Toasts, empty states, notices, the redemption screen (Guidelines §10). */
.toast-stack { position: fixed; z-index: 1090; left: 50%; transform: translateX(-50%); bottom: calc(var(--space-4) + env(safe-area-inset-bottom));
  display: grid; gap: 8px; width: min(420px, calc(100% - 32px)); pointer-events: none; }
body.has-tabbar .toast-stack { bottom: calc(var(--tabbar-h) + var(--space-3) + env(safe-area-inset-bottom)); }
@media (min-width: 992px) { body.has-tabbar .toast-stack { bottom: var(--space-5); } }
.cmu-toast { pointer-events: auto; display: flex; align-items: center; gap: 10px; background: var(--cmu-ink); color: var(--cmu-paper);
  border-radius: var(--radius-md); padding: 12px 14px; font-size: 14.5px; box-shadow: var(--shadow-float);
  animation: cmu-rise var(--dur-base) var(--ease-standard) both; }
[data-bs-theme="dark"] .cmu-toast { background: var(--cmu-paper); color: var(--cmu-ink); }
.cmu-toast .cmu-mark { width: 20px; height: 20px; flex: none; }
.cmu-toast .msg { flex: 1; }
.cmu-toast .close { background: none; border: 0; color: inherit; opacity: .7; width: 32px; height: 32px; display: grid; place-items: center; }
.cmu-toast.is-error { background: var(--error); color: #fff; }
.cmu-toast.is-leaving { animation: cmu-fall var(--dur-base) var(--ease-standard) both; }
@keyframes cmu-rise { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
@keyframes cmu-fall { to { opacity: 0; transform: translateY(8px); } }

.empty { display: grid; justify-items: center; text-align: center; gap: 8px; padding: var(--space-7) var(--space-4); }
.empty .dots { width: 120px; color: var(--text); }
.empty b { font-family: var(--font-display); font-size: 20px; line-height: 24px; }
.empty p { color: var(--text-muted); max-width: 34ch; margin: 0; }
.empty .actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; margin-top: 8px; }

.notice { display: flex; gap: 12px; align-items: flex-start; padding: 14px 16px; border-radius: var(--radius-md);
  background: var(--tint); color: var(--text); font-size: 15px; }
.notice .icon { margin-top: 2px; }
.notice.n-success { background: var(--wash-lagoon); }
.notice.n-warning { background: var(--wash-marigold); }
.notice.n-error { background: var(--wash-petal); }
.notice.n-ink { background: var(--cmu-ink); color: var(--cmu-paper); }

.redeem { border-radius: 18px; background: var(--cmu-ink); color: var(--cmu-paper); padding: 24px; display: grid; gap: 8px;
  justify-items: center; text-align: center; }
.redeem .cmu-mark { width: 88px; height: 88px; color: var(--cmu-paper); }
.redeem b { font-family: var(--font-display); font-size: 32px; color: var(--cmu-marigold); }
.redeem small { color: var(--on-ink-muted); }

/* Dot art (core/templatetags/cmu.py dot_ring): every person is a dot, marigold is you. */
.dots { color: var(--cmu-ink); }
.dots .dots-you { fill: var(--cmu-marigold); }
.dots .dots-seat { opacity: .28; }
.dots .dots-more { font: 800 34px var(--font-display); fill: currentColor; }
[data-bs-theme="dark"] .empty .dots { color: var(--text); }

/* Offline bar, pull-to-refresh hint, rise-in cards (static/js/delights.js) */
.offline-bar { position: fixed; left: 50%; transform: translateX(-50%); bottom: calc(var(--tabbar-h) + 12px + env(safe-area-inset-bottom));
  z-index: 1080; background: var(--cmu-ink); color: var(--cmu-paper); padding: 10px 16px; border-radius: var(--radius-pill);
  font-size: 14px; font-weight: 600; box-shadow: var(--shadow-float); max-width: calc(100% - 32px); text-align: center; }
@media (min-width: 992px) { .offline-bar { bottom: 20px; } }
.ptr-hint { position: fixed; top: calc(var(--topbar-h) + 8px); left: 50%; width: 32px; height: 32px; z-index: 1040; border-radius: 50%;
  border: 4px solid var(--line-strong); border-top-color: var(--cmu-marigold); transform: translate(-50%, -48px); pointer-events: none;
  opacity: 0; visibility: hidden; transition: opacity var(--dur-fast) linear; }
.ptr-hint.on { opacity: 1; visibility: visible; }
.ptr-hint.ready { border-color: var(--cmu-marigold); border-top-color: var(--cmu-ink); }
.ptr-hint.spin { animation: ptr-spin .7s linear infinite; }
@keyframes ptr-spin { to { transform: translate(-50%, 60px) rotate(360deg); } }
.rise { opacity: 0; transform: translateY(14px); transition: opacity var(--dur-slow) var(--ease-standard), transform var(--dur-slow) var(--ease-standard); }
.rise.is-in { opacity: 1; transform: none; }

/* The door (host / crew check-in) */
.scan-result { align-items: center; font-size: 17px; font-weight: 700; }
.scan-face { width: 64px; height: 64px; border-radius: 50%; object-fit: cover; flex: none; }
.stats.door-stats { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.door-list .person-row { min-height: 52px; }
.door-list .btn { min-height: 44px; }
