/* ============================================================
   Zinemo — Design tokens
   Palette: dark slate base, teal→amber signal gradient (echoes
   the logomark), amber for "live" states. Inter for body/UI/
   display type, JetBrains Mono for codes & timestamps.
   ============================================================ */

/* Self-hosted (see /fonts) instead of Google Fonts — the preloader used to
   sit there waiting on a request that never resolves for anyone who can't
   reach fonts.googleapis.com. */
@import url('/css/fonts.css');

:root {
  --void: #0D1117;
  --void-2: #0A0E13;
  --surface: #161B22;
  --surface-2: #1C232C;
  --line: rgba(0, 181, 173, 0.15);
  --line-strong: rgba(0, 181, 173, 0.28);
  --ink: #F0F6FC;
  --ink-dim: #A6B3C2;
  --ink-faint: #6B7785;

  --signal-1: #00B5AD;   /* teal — primary brand color */
  --signal-2: #FF9F00;   /* amber — secondary brand color */
  --signal-grad: linear-gradient(135deg, var(--signal-1), var(--signal-2));
  --live: #FF9F00;       /* amber, host/live pulses — same as secondary */
  --danger: #ff5470;
  --good: #35d68f;

  --glass: rgba(0, 181, 173, 0.05);
  --glass-strong: rgba(0, 181, 173, 0.1);
  --blur: blur(24px);

  --radius-sm: 10px;
  --radius-md: 16px;
  --radius-lg: 22px;
  --radius-xl: 28px;

  --shadow-sm: 0 2px 10px -4px rgba(0, 0, 0, 0.5);
  --shadow-md: 0 12px 32px -10px rgba(0, 0, 0, 0.55);
  --shadow-lg: 0 28px 70px -16px rgba(0, 0, 0, 0.65);
  --shadow-glow: 0 0 0 1px rgba(0, 181, 173, 0.15), 0 20px 60px -18px rgba(0, 181, 173, 0.4);

  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
  --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
  --dur-fast: 160ms;
  --dur-med: 320ms;
  --dur-slow: 560ms;

  --font-display: 'Inter', 'Vazirmatn', sans-serif;
  --font-body: 'Inter', 'Vazirmatn', sans-serif;
  --font-mono: 'JetBrains Mono', 'Vazirmatn', monospace;
}

/* Persian UI mode — switched via the language toggle (see i18n.js) */
[data-lang='fa'] {
  --font-display: 'Vazirmatn', sans-serif;
  --font-body: 'Vazirmatn', 'Inter', sans-serif;
}
[data-lang='fa'] h1, [data-lang='fa'] h2, [data-lang='fa'] h3, [data-lang='fa'] h4 { letter-spacing: 0; }

/* Text-only bidi fix: page layout stays LTR (elements never move), but
   any element whose content is actually Persian/mixed reads in its own
   correct direction instead of having word order scrambled by a forced
   LTR paragraph base direction. Covers translated UI text and dynamic
   user-generated content (chat, names, comments) alike. */
[data-i18n], [data-i18n-html], .msg-text, .msg-name, .p-name, .toast,
.hero h1, .hero p.sub, .hero-eyebrow, .action-card h3, .action-card p,
.how-step h4, .how-step p, .settings-name-input, input, textarea {
  unicode-bidi: plaintext;
}


/* ============================================================
   Reset
   ============================================================ */
/* ============================================================
   Custom scrollbar
   ============================================================ */
/* Inner scroll areas (menus, chat, lists, tables) — a slim brand-colored
   rail that stays out of the way of tight UI chrome. */
* {
  scrollbar-width: thin;
  scrollbar-color: var(--signal-1) var(--surface);
}
*::-webkit-scrollbar { width: 9px; height: 9px; }
*::-webkit-scrollbar-track { background: transparent; }
*::-webkit-scrollbar-thumb {
  background: linear-gradient(180deg, var(--signal-1), var(--signal-2));
  border-radius: 99px;
  border: 2px solid transparent;
  background-clip: padding-box;
}
*::-webkit-scrollbar-thumb:hover {
  background: linear-gradient(180deg, var(--signal-2), var(--signal-1));
  background-clip: padding-box;
}
*::-webkit-scrollbar-corner { background: transparent; }

/* The real page scrollbar (the <html> root — see the overflow rule above)
   gets its own wider, more deliberate treatment: a visible dark rail so
   it reads clearly at the edge of the window at a glance, not just a thin
   line that only shows up once you notice it, plus a soft glow on the
   thumb so it feels like part of the brand rather than a browser default. */
html {
  scrollbar-width: auto;
  scrollbar-color: var(--signal-1) var(--void-2);
}
html::-webkit-scrollbar { width: 13px; }
html::-webkit-scrollbar-track {
  background: var(--void-2);
  border-left: 1px solid var(--line);
}
html::-webkit-scrollbar-thumb {
  background: linear-gradient(180deg, var(--signal-1), var(--signal-2));
  border-radius: 99px;
  border: 3px solid var(--void-2);
  background-clip: padding-box;
  box-shadow: 0 0 10px rgba(0, 181, 173, 0.45);
}
html::-webkit-scrollbar-thumb:hover {
  background: linear-gradient(180deg, var(--signal-2), var(--signal-1));
  background-clip: padding-box;
  box-shadow: 0 0 14px rgba(255, 159, 0, 0.5);
}

* { box-sizing: border-box; }
html, body {
  height: 100%;
  margin: 0;
  padding: 0;
  background: var(--void);
  color: var(--ink);
  font-family: var(--font-body);
  -webkit-font-smoothing: antialiased;
}
/* overflow-x goes on <html> only, not <body>. Setting it on BOTH (as this
   used to) disables the normal "body's scroll state propagates to the
   viewport" behavior, so each one starts scrolling independently — and
   since body is the one that actually holds the tall content, it quietly
   becomes its own inner scroll box while <html> (the one tied to the real
   browser viewport) never looks like it overflows. Net effect: no visible
   page scrollbar at all, even on long pages. Scoping it to html keeps the
   horizontal clip but lets <html> do the real, native, visibly-scrollbar'd
   scrolling the custom scrollbar styling above is meant to be seen on. */
html { overflow-x: hidden; }
h1, h2, h3, h4 { font-family: var(--font-display); margin: 0; letter-spacing: -0.02em; }
p { margin: 0; }
a { color: inherit; text-decoration: none; }
button { font-family: inherit; }
img { max-width: 100%; display: block; }
ul { margin: 0; padding: 0; list-style: none; }

/* Respect reduced motion everywhere */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: 0.001ms !important; transition-duration: 0.001ms !important; }
}



/* ============================================================
   Animated background — aurora + grain + vignette + particles
   ============================================================ */
#network-bg {
  position: fixed; inset: 0;
  z-index: 0;
  background: var(--void);
}
#network-bg canvas { position: absolute; inset: 0; width: 100%; height: 100%; }

/* Gentle vignette — pulls focus toward the center of the viewport rather
   than letting the eye drift to flat corners. */
#vignette {
  position: fixed; inset: 0;
  z-index: 0;
  pointer-events: none;
  background: radial-gradient(120% 100% at 50% 8%, transparent 40%, rgba(3, 2, 6, 0.6) 100%);
}

/* ============================================================
   Preloader
   ============================================================ */
#preloader {
  position: fixed; inset: 0;
  z-index: 10000;
  display: flex; align-items: center; justify-content: center; flex-direction: column;
  gap: 26px;
  background: var(--void);
  transition: opacity var(--dur-slow) var(--ease-out), filter var(--dur-slow) var(--ease-out);
}
#preloader.leaving { opacity: 0; filter: blur(18px); pointer-events: none; }

.preloader-stage {
  position: relative;
  width: 140px; height: 140px;
  display: flex; align-items: center; justify-content: center;
}

/* Sonar-style pulse rings expanding outward behind the logo, staggered */
.preloader-pulse-ring {
  position: absolute; inset: 0;
  border-radius: 50%;
  border: 1.5px solid var(--signal-1);
  opacity: 0;
  animation: pulse-out 2.4s var(--ease-out) infinite;
}
.preloader-pulse-ring.r2 { border-color: var(--signal-2); animation-delay: 0.8s; }
.preloader-pulse-ring.r3 { border-color: var(--live); animation-delay: 1.6s; }
@keyframes pulse-out {
  0% { transform: scale(0.35); opacity: 0.7; }
  80% { opacity: 0; }
  100% { transform: scale(1); opacity: 0; }
}

/* A trio of small glowing dots orbiting the logo like tiny satellites */
.preloader-orbit {
  position: absolute; inset: 0;
  animation: orbit-spin 3.2s linear infinite;
}
@keyframes orbit-spin { to { transform: rotate(360deg); } }
.orbit-dot {
  position: absolute; top: 50%; left: 50%;
  width: 7px; height: 7px; border-radius: 50%;
  background: var(--signal-grad);
  box-shadow: 0 0 10px 2px rgba(0, 181, 173, 0.7);
  transform-origin: 0 0;
}
.orbit-dot.d1 { transform: rotate(0deg) translateX(64px); }
.orbit-dot.d2 { transform: rotate(120deg) translateX(64px); background: var(--live); box-shadow: 0 0 10px 2px rgba(255, 176, 32, 0.6); }
.orbit-dot.d3 { transform: rotate(240deg) translateX(64px); background: var(--signal-2); box-shadow: 0 0 10px 2px rgba(34, 211, 238, 0.6); }

/* The logo itself: gentle breathing scale + a soft pulsing glow */
.preloader-logo-wrap {
  position: relative; z-index: 2;
  width: 64px; height: 64px;
  animation: logo-breathe 2.4s var(--ease-out) infinite;
}
@keyframes logo-breathe {
  0%, 100% { transform: scale(1); filter: drop-shadow(0 0 14px rgba(0, 181, 173, 0.45)); }
  50% { transform: scale(1.08); filter: drop-shadow(0 0 26px rgba(0, 181, 173, 0.75)); }
}
.preloader-logo-img {
  width: 100%; height: 100%;
  border-radius: 16px; object-fit: cover;
  display: block;
}

/* Wordmark with a slow shimmering gradient sweep across the text */
.preloader-word {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 15px;
  letter-spacing: 0.3em;
  text-transform: uppercase;
  background: linear-gradient(90deg, var(--ink-dim) 0%, var(--ink) 20%, var(--signal-2) 40%, var(--ink) 60%, var(--ink-dim) 100%);
  background-size: 250% 100%;
  -webkit-background-clip: text; background-clip: text; color: transparent;
  animation: word-shimmer 2.6s linear infinite;
}
@keyframes word-shimmer {
  0% { background-position: 100% 0; }
  100% { background-position: -100% 0; }
}

.preloader-bar {
  width: 160px; height: 3px;
  background: var(--line);
  border-radius: 99px;
  overflow: hidden;
}
.preloader-bar::after {
  content: '';
  display: block;
  height: 100%; width: 40%;
  background: var(--signal-grad);
  border-radius: inherit;
  animation: bar-sweep 1.3s var(--ease-out) infinite;
}
@keyframes bar-sweep {
  0% { transform: translateX(-120%); }
  100% { transform: translateX(350%); }
}

/* ============================================================
   Layout helpers
   ============================================================ */
.app-shell { position: relative; z-index: 1; min-height: 100%; }
.container { max-width: 1180px; margin: 0 auto; padding: 0 28px; }

/* ============================================================
   Glass surfaces
   ============================================================ */
.glass {
  background: var(--glass);
  border: 1px solid var(--line);
  backdrop-filter: var(--blur);
  -webkit-backdrop-filter: var(--blur);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm), inset 0 1px 0 rgba(255, 255, 255, 0.04);
}
.glass-strong {
  background: var(--glass-strong);
  border: 1px solid var(--line-strong);
  backdrop-filter: var(--blur);
  -webkit-backdrop-filter: var(--blur);
  box-shadow: var(--shadow-md), inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
.card {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm), inset 0 1px 0 rgba(255, 255, 255, 0.03);
}
.gradient-border {
  position: relative;
  border-radius: var(--radius-lg);
}
.gradient-border::before {
  content: '';
  position: absolute; inset: -1px;
  border-radius: inherit;
  padding: 1px;
  background: var(--signal-grad);
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask-composite: exclude;
  opacity: 0.55;
  pointer-events: none;
}

/* ============================================================
   Buttons
   ============================================================ */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  font-family: var(--font-body); font-weight: 600; font-size: 14.5px;
  padding: 13px 22px;
  border-radius: 999px;
  border: 1px solid transparent;
  cursor: pointer;
  transition: transform var(--dur-fast) var(--ease-spring), box-shadow var(--dur-fast) var(--ease-out),
    background var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out);
  white-space: nowrap;
  user-select: none;
}
.btn:active { transform: scale(0.96); }
.btn svg { width: 18px; height: 18px; flex-shrink: 0; }

.btn-primary {
  background: var(--signal-grad);
  color: #0a0714;
  box-shadow: 0 8px 28px -8px rgba(0, 181, 173, 0.65), inset 0 1px 0 rgba(255, 255, 255, 0.35);
  position: relative;
}
.btn-primary:hover { transform: translateY(-2px) scale(1.02); box-shadow: 0 16px 40px -8px rgba(0, 181, 173, 0.85), inset 0 1px 0 rgba(255, 255, 255, 0.4); }

.btn-ghost {
  background: var(--glass);
  color: var(--ink);
  border-color: var(--line);
}
.btn-ghost:hover { border-color: var(--line-strong); background: var(--glass-strong); transform: translateY(-1px); }

.btn-icon {
  display: flex; align-items: center; justify-content: center;
  width: 42px; height: 42px; padding: 0; border-radius: 50%;
  background: var(--glass); color: var(--ink); border-color: var(--line);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
}
.btn-icon svg { width: 18px; height: 18px; flex-shrink: 0; display: block; }
.btn-icon:hover { background: var(--glass-strong); border-color: var(--signal-1); transform: translateY(-1px) scale(1.05); }
.btn-icon.danger:hover { border-color: var(--danger); color: var(--danger); }
.btn-icon.active { background: var(--signal-grad); color: #0a0714; border-color: transparent; box-shadow: var(--shadow-glow); }
/* A dedicated red indicator for "blocking/off" toggle states (muted mic,
   deafened) — deliberately distinct from .active's bright gradient, which
   is reserved for "boosted/positive" states (screen sharing), so the two
   don't read as the same kind of thing. */
.btn-icon.blocked-active {
  background: rgba(255, 84, 112, 0.18); color: var(--danger);
  border-color: rgba(255, 84, 112, 0.4);
  box-shadow: 0 0 0 1px rgba(255, 84, 112, 0.15), 0 8px 24px -10px rgba(255, 84, 112, 0.6);
}

.btn-sm { padding: 9px 16px; font-size: 13px; }

/* ============================================================
   Inputs / custom form controls
   ============================================================ */
.field { display: flex; flex-direction: column; gap: 9px; }
.field label {
  font-size: 12.5px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--ink-faint);
}
.input {
  background: var(--surface-2);
  border: 1px solid var(--line);
  color: var(--ink);
  font-family: var(--font-body); font-size: 15px;
  padding: 14px 16px;
  border-radius: var(--radius-md);
  outline: none;
  transition: border-color var(--dur-fast) var(--ease-out), box-shadow var(--dur-fast) var(--ease-out);
}
.input:focus { border-color: var(--signal-1); box-shadow: 0 0 0 4px rgba(0, 181, 173, 0.15); }
.input.mono { font-family: var(--font-mono); letter-spacing: 0.08em; text-transform: uppercase; }
.input::placeholder { color: var(--ink-faint); }

.switch {
  --w: 44px; --h: 24px;
  width: var(--w); height: var(--h);
  background: var(--surface-2);
  border: 1px solid var(--line);
  border-radius: 99px;
  position: relative;
  cursor: pointer;
  transition: background var(--dur-fast) var(--ease-out);
  flex-shrink: 0;
}
.switch::after {
  content: '';
  position: absolute; top: 2px; left: 2px;
  width: 18px; height: 18px; border-radius: 50%;
  background: var(--ink-dim);
  transition: transform var(--dur-fast) var(--ease-spring), background var(--dur-fast) var(--ease-out);
}
.switch.on { background: var(--signal-grad); border-color: transparent; }
.switch.on::after { transform: translateX(20px); background: #0a0714; }

.checkbox {
  width: 20px; height: 20px;
  border-radius: 6px;
  border: 1.5px solid var(--line-strong);
  display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer;
  transition: all var(--dur-fast) var(--ease-out);
  flex-shrink: 0;
}
.checkbox.on { background: var(--signal-grad); border-color: transparent; }
.checkbox svg { width: 13px; height: 13px; opacity: 0; transform: scale(0.5); transition: all var(--dur-fast) var(--ease-spring); color: #0a0714; }
.checkbox.on svg { opacity: 1; transform: scale(1); }

.slider-track {
  height: 4px; border-radius: 99px; background: var(--line-strong);
  position: relative; cursor: pointer;
}
.slider-fill { position: absolute; inset: 0; border-radius: inherit; background: var(--signal-grad); }
.slider-thumb {
  position: absolute; top: 50%; width: 13px; height: 13px; border-radius: 50%;
  background: #fff; transform: translate(-50%, -50%);
  box-shadow: 0 0 0 4px rgba(0, 181, 173, 0.25);
  transition: box-shadow var(--dur-fast) var(--ease-out);
}

/* ============================================================
   Toasts
   ============================================================ */
#toast-stack {
  position: fixed; bottom: 22px; right: 22px; z-index: 6000;
  display: flex; flex-direction: column; gap: 10px;
  max-width: 340px;
  pointer-events: none;
}
.toast { pointer-events: auto; }
.toast {
  display: flex; align-items: center; gap: 12px;
  padding: 14px 16px;
  border-radius: var(--radius-md);
  background: var(--glass-strong);
  border: 1px solid var(--line-strong);
  backdrop-filter: var(--blur);
  box-shadow: 0 14px 40px -12px rgba(0, 0, 0, 0.6);
  animation: toast-in var(--dur-med) var(--ease-spring);
  font-size: 13.5px;
  font-weight: 500;
}
.toast.leaving { animation: toast-out var(--dur-fast) var(--ease-out) forwards; }
@keyframes toast-in { from { opacity: 0; transform: translateX(40px) scale(0.95); } to { opacity: 1; transform: translateX(0) scale(1); } }
@keyframes toast-out { to { opacity: 0; transform: translateX(40px) scale(0.95); } }
.toast-icon {
  width: 30px; height: 30px; border-radius: 50%; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  background: var(--signal-grad); color: #0a0714;
}
.toast-icon svg { width: 16px; height: 16px; }
.toast.success .toast-icon { background: var(--good); }
.toast.error .toast-icon { background: var(--danger); }
.toast.info .toast-icon { background: var(--signal-grad); }

/* ============================================================
   Tooltip
   ============================================================ */
/* Positioning is handled entirely in JS (see effects.js) so a tooltip
   near the edge of the window can clamp itself into view instead of
   spilling off-screen — a centered CSS ::after can't adapt to that. */
#sf-tooltip {
  position: fixed;
  background: var(--surface-2); color: var(--ink);
  border: 1px solid var(--line-strong);
  padding: 6px 10px; border-radius: 8px;
  font-size: 12px; font-weight: 500; white-space: nowrap;
  opacity: 0; pointer-events: none;
  transition: opacity var(--dur-fast) var(--ease-out), transform var(--dur-fast) var(--ease-out);
  transform: translateY(4px);
  z-index: 9500;
  max-width: min(260px, calc(100vw - 16px));
}
#sf-tooltip.visible { opacity: 1; transform: translateY(0); }

/* ============================================================
   Modal
   ============================================================ */
.modal-backdrop {
  position: fixed; inset: 0; z-index: 5000;
  background: rgba(4, 3, 10, 0.6);
  backdrop-filter: blur(6px);
  display: flex; align-items: center; justify-content: center;
  padding: 24px;
  opacity: 0; pointer-events: none;
  transition: opacity var(--dur-med) var(--ease-out);
}
.modal-backdrop.open { opacity: 1; pointer-events: auto; }
.modal {
  width: 100%; max-width: 460px;
  background: var(--surface);
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-xl);
  padding: 28px;
  transform: translateY(24px) scale(0.97);
  opacity: 0;
  transition: transform var(--dur-med) var(--ease-spring), opacity var(--dur-med) var(--ease-out);
  box-shadow: 0 40px 100px -20px rgba(0, 0, 0, 0.7);
}
.modal-backdrop.open .modal { transform: translateY(0) scale(1); opacity: 1; }
.modal-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 20px; }
.modal-title { font-size: 19px; font-weight: 700; }

/* ============================================================
   Context menu
   ============================================================ */
.context-menu {
  position: fixed; z-index: 7000;
  min-width: 190px;
  background: var(--surface-2);
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-md);
  padding: 6px;
  box-shadow: 0 20px 50px -12px rgba(0, 0, 0, 0.6);
  opacity: 0; transform: scale(0.94) translateY(-6px);
  transition: opacity var(--dur-fast) var(--ease-out), transform var(--dur-fast) var(--ease-spring);
  pointer-events: none;
}
.context-menu.open { opacity: 1; transform: scale(1) translateY(0); pointer-events: auto; }
.context-menu button {
  width: 100%; display: flex; align-items: center; gap: 10px;
  padding: 9px 11px; border-radius: 9px; border: none; background: transparent;
  color: var(--ink); font-size: 13.5px; text-align: left; cursor: pointer;
  transition: background var(--dur-fast) var(--ease-out);
}
.context-menu button:hover { background: var(--glass-strong); }
.context-menu button svg { width: 16px; height: 16px; color: var(--ink-dim); }

/* Non-button content embedded in a context menu (currently: the per-user
   volume slider) plus a divider between sections. */
.context-menu-custom { padding: 10px 11px 12px; }
.context-menu-volume-label {
  font-size: 12.5px; font-weight: 600; margin-bottom: 10px;
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
}
.context-menu-volume-label .vol-value { font-family: var(--font-mono); color: var(--signal-2); font-size: 12px; font-weight: 500; }
.context-menu-divider { height: 1px; background: var(--line); margin: 4px 6px; }

/* ============================================================
   Loading spinner (small, inline use only — preloader is the hero)
   ============================================================ */
.spin { animation: spin 0.9s linear infinite; }
@keyframes spin { to { transform: rotate(360deg); } }

/* ============================================================
   Utility
   ============================================================ */
.row { display: flex; align-items: center; }
.col { display: flex; flex-direction: column; }
.gap-6 { gap: 6px; } .gap-8 { gap: 8px; } .gap-10 { gap: 10px; } .gap-14 { gap: 14px; } .gap-20 { gap: 20px; }
.muted { color: var(--ink-dim); }
.faint { color: var(--ink-faint); }
.mono { font-family: var(--font-mono); }

/* Click-to-reveal secrets (room password, recovery code) */
.blurred { filter: blur(5px); transition: filter 0.15s ease; }
.blurred:hover { filter: blur(3px); }
.pill {
  padding: 4px 10px; border-radius: 99px; font-size: 11px; font-weight: 700;
  letter-spacing: 0.04em; text-transform: uppercase;
}
.pill-host { background: rgba(255, 176, 32, 0.16); color: var(--live); border: 1px solid rgba(255, 176, 32, 0.3); }
.pill-live { background: rgba(53, 214, 143, 0.15); color: var(--good); border: 1px solid rgba(53, 214, 143, 0.3); }

.room-code-display {
  display: flex; align-items: center; justify-content: space-between;
  padding: 18px 20px;
  background: var(--surface-2);
  border: 1px dashed var(--line-strong);
  border-radius: var(--radius-md);
}
.room-code-display .code {
  font-family: var(--font-mono); font-size: 26px; font-weight: 600; letter-spacing: 0.12em;
  background: var(--signal-grad); -webkit-background-clip: text; background-clip: text; color: transparent;
}

/* ---------- Cookie notice ---------- */
.cookie-banner {
  position: fixed;
  left: 18px; right: 18px; bottom: 18px;
  z-index: 60;
  max-width: 560px;
  margin: 0 auto;
  display: flex; flex-wrap: wrap; align-items: center; gap: 14px;
  padding: 16px 20px;
  background: var(--surface);
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-lg, 0 20px 50px -20px rgba(0, 0, 0, 0.7));
  animation: cookieRise 0.4s ease both;
}
@keyframes cookieRise {
  from { opacity: 0; transform: translateY(16px); }
  to { opacity: 1; transform: translateY(0); }
}
.cookie-banner p {
  flex: 1 1 280px;
  margin: 0;
  font-size: 13px;
  line-height: 1.6;
  color: var(--ink-dim);
}
.cookie-banner-actions {
  display: flex; align-items: center; gap: 12px;
  flex: 0 0 auto;
}
.cookie-banner-actions a {
  font-size: 13px;
  color: var(--signal-1);
  text-decoration: none;
  white-space: nowrap;
}
.cookie-banner-actions a:hover { text-decoration: underline; }
@media (max-width: 560px) {
  .cookie-banner { left: 10px; right: 10px; bottom: 10px; padding: 14px 16px; }
}
