@import url("tokens.css");

/* Native form controls (scrollbar, date picker, etc.) render in dark mode
 * by default — overlay (child.html) and Electron renderer keep this.
 * Viewer and admin pages flip html's scheme to `light` via :has() selectors
 * scoped to their body class so Chrome's scrollbar + form controls match
 * the light palette the page actually paints. */
html {
  color-scheme: dark;
}

html:has(body.admin-body) {
  color-scheme: light;
}

/* Respect user's motion preference — disable animation for vestibular safety */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

/* Basic styles and fonts */
body {
  font-family: var(--font-ui);
  background-color: var(--color-bg-deep);
  color: white;
}

/* Per-language font priority. i18n.js updates <html lang=""> so these apply.
 * Each override promotes the matching Noto to the front so Han characters
 * render with the correct regional glyph style. */
:lang(zh) {
  --font-display: "Bebas Neue", "Noto Sans", "Noto Sans TC", system-ui, sans-serif;
  --font-brand: "Noto Sans", "Noto Sans TC", system-ui, sans-serif;
  --font-ui: "Noto Sans", "Noto Sans TC", system-ui, sans-serif;
}

:lang(ja) {
  --font-display: "Bebas Neue", "Noto Sans", "Noto Sans JP", system-ui, sans-serif;
  --font-brand: "Noto Sans", "Noto Sans JP", system-ui, sans-serif;
  --font-ui: "Noto Sans", "Noto Sans JP", system-ui, sans-serif;
}

:lang(ko) {
  --font-display: "Bebas Neue", "Noto Sans", "Noto Sans KR", system-ui, sans-serif;
  --font-brand: "Noto Sans", "Noto Sans KR", system-ui, sans-serif;
  --font-ui: "Noto Sans", "Noto Sans KR", system-ui, sans-serif;
}

/* Tabular figures — numbers align column-to-column in data displays */
[data-tabular],
.composer-counter,
.history-dashboard-value,
.chart-label {
  font-variant-numeric: tabular-nums;
}

/* Every interactive element shows a pointer — no more default arrow on buttons */
button:not(:disabled),
[role="button"]:not([aria-disabled="true"]),
summary,
label[for],
select:not(:disabled) {
  cursor: pointer;
}

button:disabled,
[role="button"][aria-disabled="true"] {
  cursor: not-allowed;
}

/* Skip link — visible only when focused via keyboard */
.skip-link {
  position: fixed;
  top: 0.75rem;
  left: 0.75rem;
  z-index: 100;
  padding: 0.65rem 1rem;
  background: var(--color-primary);
  color: var(--color-bg-deep);
  border-radius: var(--radius-md);
  font-weight: 600;
  transform: translateY(-200%);
  transition: transform 0.2s ease;
}

.skip-link:focus-visible {
  transform: translateY(0);
  outline: 2px solid var(--color-text-primary);
  outline-offset: 2px;
}

.admin-body {
  /* Scoped light-theme overrides — the rest of the app (viewer, overlay,
   * Electron window) keeps the dark slate tokens; admin alone flips to
   * the prototype's light palette (hudTokens.light*). */
  --color-text-primary: var(--admin-text);
  --color-text-secondary: var(--admin-text-dim);
  --color-text-muted: var(--admin-text-dim);
  --color-text-bright: var(--admin-text);
  --color-text-strong: var(--admin-text);
  --color-bg-deep: var(--admin-raised);
  --color-bg-elevated: var(--admin-raised);
  --color-bg-base: var(--admin-panel);
  --hud-line: var(--admin-line);
  --hud-line-strong: rgba(15, 23, 42, 0.18);
  --hud-cyan-soft: rgba(56, 189, 248, 0.12);
  color-scheme: light;

  background: var(--admin-bg);
  min-height: 100vh;
  color: var(--admin-text);
  font-family: var(--font-ui);
}

.admin-app-shell {
  max-width: 1600px;
  margin: 0 auto;
  padding: 16px;
}

/* ──────────────────────────────────────────────────────────────────────────
 * Admin Login — full-screen, Hero lockup on top.
 * Mirrors AdminLogin in hero-scenes.jsx: 420px card, mono labels,
 * cyan sign-in button, status chip row.
 * ────────────────────────────────────────────────────────────────────────── */
.admin-login-shell {
  min-height: calc(100vh - 32px);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 32px 16px;
  position: relative;
  overflow: hidden;
}

/* HudBackdrop — prototype hero-scenes.jsx AdminLogin uses opacity=0.25 cyan grid. */
.admin-login-shell::before {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  opacity: 0.25;
  background-image:
    linear-gradient(rgba(56, 189, 248, 0.45) 1px, transparent 1px),
    linear-gradient(90deg, rgba(56, 189, 248, 0.45) 1px, transparent 1px);
  background-size: 40px 40px;
  -webkit-mask-image: radial-gradient(ellipse at 50% 30%, #000 0%, transparent 70%);
          mask-image: radial-gradient(ellipse at 50% 30%, #000 0%, transparent 70%);
  z-index: 0;
}

.admin-login-card {
  width: 100%;
  max-width: 420px;
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 12px;
  padding: 36px 32px 28px;
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.35);
  position: relative;
  z-index: 1;
}

.admin-login-hero {
  text-align: center;
  padding-bottom: 22px;
  border-bottom: 1px solid var(--admin-line);
}

.admin-login-subtitle {
  margin: 10px 0 0;
  font-size: 13px;
  color: var(--admin-text-dim);
  font-family: var(--font-ui);
}

.admin-login-form {
  margin-top: 22px;
  display: flex;
  flex-direction: column;
  gap: 14px;
}

.admin-login-field {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.admin-login-label {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 1.5px;
  color: var(--admin-text-dim);
  text-transform: uppercase;
}

.admin-login-input {
  width: 100%;
  padding: 11px 14px;
  background: var(--admin-raised);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
  color: var(--admin-text);
  font-family: var(--font-mono);
  font-size: 13px;
  outline: none;
  box-sizing: border-box;
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}

.admin-login-input:focus {
  border-color: var(--color-primary);
  box-shadow: 0 0 0 3px rgba(56, 189, 248, 0.18);
}

.admin-login-submit {
  margin-top: 4px;
  width: 100%;
  padding: 12px 16px;
  background: var(--color-primary);
  color: #000;
  border: none;
  border-radius: 6px;
  cursor: pointer;
  font-family: var(--font-mono);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 2px;
  text-transform: uppercase;
  transition: background-color 0.15s ease, transform 0.15s ease;
}

.admin-login-submit:hover {
  background: var(--color-primary-hover);
}

.admin-login-submit:active {
  transform: translateY(1px);
}

.admin-login-chiprow {
  margin-top: 20px;
  display: flex;
  justify-content: center;
  gap: 10px;
  flex-wrap: wrap;
}

.admin-login-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 10px;
  border-radius: 999px;
  border: 1px solid var(--admin-line);
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1.5px;
  color: var(--admin-text-dim);
}

.admin-login-chip.is-accent {
  background: rgba(56, 189, 248, 0.12);
  border-color: rgba(56, 189, 248, 0.45);
  color: var(--color-primary);
}

.admin-login-chip .hud-dot {
  width: 6px;
  height: 6px;
}

/* ──────────────────────────────────────────────────────────────────────────
 * AdminV3 Dashboard Summary — prototype admin-v3.jsx 12-col grid beneath KPI.
 * Four cards: active poll (7) + poll builder (5), messages (7) + widgets (5).
 * ────────────────────────────────────────────────────────────────────────── */
.admin-dash-summary { padding: 0 24px 24px; }

body[data-active-route]:not([data-active-route="dashboard"]) .admin-dash-summary {
  display: none;
}

.admin-dash-summary-grid {
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  gap: 18px;
}

.admin-dash-card {
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
  padding: 18px;
  display: flex;
  flex-direction: column;
  min-height: 180px;
}

.admin-dash-card.is-span-7 { grid-column: span 7; }
.admin-dash-card.is-span-5 { grid-column: span 5; }

@media (max-width: 1100px) {
  .admin-dash-card.is-span-7,
  .admin-dash-card.is-span-5 { grid-column: span 12; }
}

.admin-dash-card-head {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 14px;
}

.admin-dash-card-head .title {
  font-size: 14px;
  font-weight: 600;
  color: var(--admin-text);
}

.admin-dash-card-head .kicker {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 2px;
  color: var(--admin-text-dim);
  text-transform: uppercase;
}

.admin-dash-card-head .timer,
.admin-dash-card-head .auto {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1px;
  color: var(--color-primary);
}

.admin-dash-card-head .timer:empty { display: none; }

/* Filter chips above the messages stream — prototype admin-v3.jsx:120 */
.admin-dash-msg-filters {
  display: flex;
  gap: 6px;
  padding: 4px 0 12px;
  border-bottom: 1px solid var(--hud-line);
  margin-bottom: 10px;
  flex-wrap: wrap;
}

.admin-dash-msg-filter {
  padding: 4px 10px;
  border-radius: 4px;
  border: 1px solid var(--hud-line);
  background: transparent;
  color: var(--admin-text-dim);
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1px;
  cursor: pointer;
  transition: border-color 0.12s, color 0.12s;
}

.admin-dash-msg-filter:hover {
  border-color: var(--hud-line-strong);
}

.admin-dash-msg-filter.is-active {
  border-color: var(--color-primary);
  color: var(--color-primary);
}

.admin-dash-card-body {
  flex: 1;
  display: flex;
  flex-direction: column;
  gap: 10px;
  min-height: 0;
}

.admin-dash-empty {
  padding: 22px 6px;
  text-align: center;
  color: var(--admin-text-dim);
  font-size: 12px;
  font-family: var(--font-mono);
  letter-spacing: 0.5px;
}

.admin-dash-cta {
  display: inline-block;
  padding: 10px 14px;
  border-radius: 6px;
  border: 1px dashed var(--admin-line);
  background: transparent;
  color: var(--color-primary);
  font-family: var(--font-mono);
  font-size: 12px;
  letter-spacing: 1.5px;
  text-align: center;
  text-decoration: none;
}

.admin-dash-cta:hover {
  border-color: var(--color-primary);
  background: rgba(56, 189, 248, 0.08);
}

.admin-dash-messages {
  gap: 0;
  overflow: auto;
  max-height: 320px;
  font-family: var(--font-mono);
  font-size: 12px;
}

.admin-dash-msg-row {
  display: grid;
  grid-template-columns: 62px 74px 1fr auto;
  padding: 8px 4px;
  gap: 10px;
  align-items: center;
  border-bottom: 1px solid var(--admin-line);
}

.admin-dash-msg-row:last-child { border-bottom: none; }

.admin-dash-msg-row .time { color: var(--admin-text-dim); font-size: 10px; }
.admin-dash-msg-row .tag  { font-size: 10px; letter-spacing: 1px; text-transform: uppercase; }
.admin-dash-msg-row .text { font-family: var(--font-ui); font-size: 12px; color: var(--admin-text); }
.admin-dash-msg-row .meta { color: var(--admin-text-dim); font-size: 10px; }
.admin-dash-msg-row .more { color: var(--admin-text-dim); font-size: 14px; cursor: pointer; }

/* Quick poll inline form — prototype admin-v3.jsx:77–110 */
.admin-dash-card-head-link {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1px;
  color: var(--color-primary);
  text-decoration: none;
  cursor: pointer;
}

.admin-dash-quickpoll {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.admin-dash-qp-question {
  padding: 10px 12px;
  border-radius: 6px;
  background: var(--admin-raised);
  border: 1px solid var(--admin-line);
  color: var(--admin-text);
  font-size: 13px;
  outline: none;
}

.admin-dash-qp-question:focus {
  border-color: var(--color-primary);
}

.admin-dash-qp-options {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.admin-dash-qp-row {
  display: flex;
  gap: 8px;
  align-items: center;
}

.admin-dash-qp-row .key {
  width: 26px;
  height: 26px;
  border-radius: 4px;
  background: var(--admin-raised);
  color: var(--admin-text);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-mono);
  font-size: 11px;
  font-weight: 700;
  flex-shrink: 0;
}

.admin-dash-qp-row input {
  flex: 1;
  padding: 7px 10px;
  border-radius: 4px;
  background: transparent;
  border: 1px solid var(--admin-line);
  color: var(--admin-text);
  font-size: 12px;
  outline: none;
  min-width: 0;
}

.admin-dash-qp-row input:focus {
  border-color: var(--color-primary);
}

.admin-dash-qp-row .rm {
  background: transparent;
  border: none;
  color: var(--admin-text-dim);
  cursor: pointer;
  font-size: 14px;
  padding: 4px 6px;
}

.admin-dash-qp-row .rm:hover { color: var(--color-warning); }

.admin-dash-qp-add {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1px;
  color: var(--color-primary);
  cursor: pointer;
  text-decoration: none;
}

.admin-dash-qp-add[hidden] { display: none; }

.admin-dash-qp-foot {
  margin-top: auto;
  padding-top: 14px;
  display: flex;
  gap: 8px;
}

.admin-dash-qp-start {
  margin-left: auto;
  padding: 8px 18px;
  border-radius: 6px;
  border: 1px solid var(--color-primary);
  background: var(--color-primary);
  color: #000;
  cursor: pointer;
  font-size: 12px;
  font-weight: 700;
  font-family: var(--font-mono);
  letter-spacing: 1px;
  transition: transform 0.12s;
}

.admin-dash-qp-start:hover { transform: translateY(-1px); }
.admin-dash-qp-start:disabled { opacity: 0.45; cursor: not-allowed; transform: none; }

.admin-dash-widget-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
}

.admin-dash-widget-tile {
  border: 1px solid var(--admin-line);
  border-radius: 6px;
  padding: 10px;
  background: var(--admin-raised);
}

.admin-dash-widget-tile-head {
  display: flex;
  align-items: center;
  gap: 6px;
}

.admin-dash-widget-tile-head .dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  flex-shrink: 0;
}

.admin-dash-widget-tile-head .cat {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 0.5px;
  color: var(--admin-text-dim);
}

.admin-dash-widget-tile .title {
  font-weight: 600;
  font-size: 13px;
  margin-top: 6px;
}

.admin-dash-widget-tile .kind {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 2px;
  color: var(--admin-text-dim);
  text-transform: uppercase;
}

.admin-dash-widget-tile .uptime {
  margin-top: 6px;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.5px;
  color: var(--admin-text-dim);
}

.admin-dash-widget-tile .actions {
  margin-top: 8px;
  display: flex;
  gap: 4px;
}

.admin-dash-widget-tile .actions .chip {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 1px;
  padding: 2px 6px;
  border-radius: 3px;
  border: 1px solid var(--admin-line);
  background: transparent;
  color: var(--admin-text);
  cursor: pointer;
  transition: border-color 0.12s, color 0.12s;
}

.admin-dash-widget-tile .actions .chip.is-muted {
  color: var(--admin-text-dim);
}

.admin-dash-widget-tile .actions .chip:hover {
  border-color: var(--color-primary);
  color: var(--color-primary);
}

.admin-dash-poll-opt {
  display: flex;
  flex-direction: column;
  gap: 4px;
  margin-bottom: 10px;
}

.admin-dash-poll-opt .row {
  display: flex;
  align-items: center;
  gap: 10px;
}

.admin-dash-poll-opt .tag {
  width: 22px;
  height: 22px;
  border-radius: 4px;
  background: var(--admin-raised);
  color: var(--admin-text);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-mono);
  font-size: 11px;
  font-weight: 700;
}

.admin-dash-poll-opt.is-winner .tag {
  background: var(--color-primary);
  color: #000;
}

.admin-dash-poll-opt .label { flex: 1; font-size: 12px; color: var(--admin-text); }
.admin-dash-poll-opt .pct { font-family: var(--font-mono); font-size: 12px; font-weight: 600; color: var(--admin-text); }
.admin-dash-poll-opt.is-winner .pct { color: var(--color-primary); }
.admin-dash-poll-opt .votes { font-family: var(--font-mono); font-size: 10px; color: var(--admin-text-dim); width: 42px; text-align: right; }

.admin-dash-poll-opt .bar {
  height: 6px;
  border-radius: 3px;
  background: var(--admin-raised);
  overflow: hidden;
}

.admin-dash-poll-opt .bar > span {
  display: block;
  height: 100%;
  background: rgba(56, 189, 248, 0.45);
  border-radius: 3px;
  transition: width 0.3s ease;
}

.admin-dash-poll-opt.is-winner .bar > span { background: var(--color-primary); }

/* Poll builder buttons (sec-polls page) — prototype admin-v3.jsx cyan/ghost. */
.admin-poll-actions {
  margin-top: 14px;
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
}

.admin-poll-btn {
  padding: 8px 18px;
  border-radius: 6px;
  font-family: var(--font-mono);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 1px;
  text-transform: uppercase;
  cursor: pointer;
  transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}

.admin-poll-btn.is-primary {
  background: var(--color-primary);
  border: 1px solid var(--color-primary);
  color: #000;
}

.admin-poll-btn.is-primary:hover {
  background: var(--color-primary-hover);
  border-color: var(--color-primary-hover);
}

.admin-poll-btn.is-ghost {
  background: transparent;
  border: 1px solid var(--admin-line);
  color: var(--admin-text);
}

.admin-poll-btn.is-ghost:hover {
  border-color: var(--color-primary);
  color: var(--color-primary);
}

.admin-poll-options-actions {
  margin-top: 8px;
  display: flex;
  gap: 12px;
}

.admin-poll-link {
  background: transparent;
  border: none;
  padding: 4px 0;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1px;
  cursor: pointer;
  color: var(--color-primary);
  text-transform: uppercase;
}

.admin-poll-link.is-muted { color: var(--admin-text-dim); }
.admin-poll-link:hover { color: var(--color-primary-hover); }
.admin-poll-link.is-muted:hover { color: var(--admin-text); }

/* ──────────────────────────────────────────────────────────────────────────
 * Theme Pack cards — prototype admin-theme-packs.jsx grid of preset bundles.
 * ────────────────────────────────────────────────────────────────────────── */
#themesList {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 14px;
}

@media (max-width: 760px) {
  #themesList { grid-template-columns: 1fr; }
}

.theme-pack-card {
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
  padding: 14px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  transition: border-color 0.15s ease, background 0.15s ease;
}

.theme-pack-card.is-active {
  border-color: var(--color-primary);
  background: rgba(56, 189, 248, 0.04);
}

.theme-pack-card-head {
  display: flex;
  align-items: center;
  gap: 10px;
}

.theme-pack-swatches {
  display: flex;
  gap: 0;
}

.theme-pack-swatch {
  width: 18px;
  height: 18px;
  border-radius: 50%;
  border: 2px solid var(--admin-panel);
  margin-left: -6px;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
}

.theme-pack-swatch:first-child { margin-left: 0; }

.theme-pack-title { display: flex; flex-direction: column; min-width: 0; }
.theme-pack-title .zh { font-size: 14px; font-weight: 600; color: var(--admin-text); }
.theme-pack-title .en {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 2px;
  color: var(--admin-text-dim);
}

.theme-pack-status {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1.5px;
  color: var(--admin-text-dim);
}

.theme-pack-status.is-active { color: var(--color-primary); }

.theme-pack-desc {
  margin: 0;
  font-size: 12px;
  color: var(--admin-text-dim);
  line-height: 1.5;
}

.theme-pack-meta {
  display: flex;
  flex-direction: column;
  gap: 4px;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.5px;
}

.theme-pack-meta .row { display: flex; gap: 10px; }
.theme-pack-meta .k { width: 48px; color: var(--admin-text-dim); letter-spacing: 1.5px; }
.theme-pack-meta .v { flex: 1; color: var(--admin-text); display: flex; flex-wrap: wrap; gap: 4px; }

.theme-pack-chip {
  display: inline-block;
  padding: 1px 6px;
  border: 1px solid var(--admin-line);
  border-radius: 3px;
  font-size: 9px;
  letter-spacing: 1px;
  color: var(--admin-text-dim);
  text-transform: uppercase;
}

.theme-pack-muted { color: var(--admin-text-dim); }

.theme-pack-foot {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-top: 4px;
  padding-top: 10px;
  border-top: 1px solid var(--admin-line);
}

.theme-pack-badge {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 1.5px;
  padding: 2px 6px;
  border-radius: 3px;
  border: 1px solid var(--admin-line);
  color: var(--admin-text-dim);
}

.theme-pack-badge.is-builtin { color: var(--color-primary); border-color: rgba(56, 189, 248, 0.35); }

.theme-pack-actions { margin-left: auto; display: flex; gap: 8px; }

.theme-pack-btn {
  padding: 5px 12px;
  border-radius: 4px;
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 1px;
  text-transform: uppercase;
  cursor: pointer;
  border: 1px solid var(--color-primary);
  background: var(--color-primary);
  color: #000;
}

.theme-pack-btn.is-primary:hover { background: var(--color-primary-hover); border-color: var(--color-primary-hover); }

.theme-pack-btn.is-disabled {
  background: transparent;
  color: var(--admin-text-dim);
  border-color: var(--admin-line);
  cursor: default;
}

/* ──────────────────────────────────────────────────────────────────────────
 * Viewer Theme page (v5 handoff admin-viewer-theme.jsx)
 * Left controls (380px) + right live iframe-style preview. Entirely separate
 * from Theme Packs — governs /fire page chrome only.
 * ────────────────────────────────────────────────────────────────────────── */
.admin-vt-page {
  display: flex;
  flex-direction: column;
  gap: 14px;
}

.admin-vt-scope {
  display: flex;
  gap: 10px;
  padding: 10px 14px;
  border-radius: 6px;
  background: rgba(56, 189, 248, 0.08);
  border: 1px solid var(--color-primary);
}

.admin-vt-scope .icon {
  font-family: var(--font-mono);
  color: var(--color-primary);
  font-size: 14px;
}

.admin-vt-scope .kicker {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 2px;
  color: var(--color-primary);
  font-weight: 700;
}

.admin-vt-scope p {
  margin: 2px 0 0;
  font-size: 12px;
  line-height: 1.6;
  color: var(--admin-text);
}

.admin-vt-scope code {
  font-family: var(--font-mono);
  color: var(--color-primary);
  padding: 0 2px;
}

.admin-vt-grid {
  display: grid;
  grid-template-columns: 380px 1fr;
  gap: 20px;
}

@media (max-width: 960px) {
  .admin-vt-grid { grid-template-columns: 1fr; }
}

.admin-vt-controls {
  display: flex;
  flex-direction: column;
  gap: 14px;
}

.admin-vt-card {
  padding: 14px;
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
}

.admin-vt-card-head {
  display: flex;
  align-items: baseline;
  gap: 10px;
  margin-bottom: 10px;
}

.admin-vt-card-head .title {
  font-size: 13px;
  font-weight: 600;
  color: var(--admin-text);
}

.admin-vt-card-head .kicker {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 2px;
  color: var(--admin-text-dim);
  text-transform: uppercase;
}

.admin-vt-presets {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
}

.admin-vt-preset {
  padding: 10px;
  border-radius: 4px;
  border: 1px solid var(--admin-line);
  background: transparent;
  text-align: left;
  cursor: pointer;
  color: var(--admin-text);
}

.admin-vt-preset.is-active {
  border-color: var(--color-primary);
  background: rgba(56, 189, 248, 0.08);
}

.admin-vt-preset .swatch {
  height: 28px;
  border-radius: 3px;
  margin-bottom: 6px;
  position: relative;
  border: 1px solid var(--admin-line);
  overflow: hidden;
}

.admin-vt-preset .swatch span {
  position: absolute;
  top: 6px;
  width: 10px;
  height: 10px;
  border-radius: 50%;
}

.admin-vt-preset .swatch span:nth-child(1) { left: 6px; }
.admin-vt-preset .swatch span:nth-child(2) { left: 20px; }

.admin-vt-preset .name {
  font-size: 11px;
  font-weight: 500;
}

.admin-vt-preset .mode {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 1px;
  color: var(--admin-text-dim);
  margin-top: 2px;
}

.admin-vt-mode {
  display: flex;
  gap: 6px;
}

.admin-vt-mode button {
  flex: 1;
  padding: 9px 6px;
  border-radius: 4px;
  border: 1px solid var(--admin-line);
  background: transparent;
  color: var(--admin-text);
  cursor: pointer;
  font-family: var(--font-ui);
}

.admin-vt-mode button.is-active {
  border-color: var(--color-primary);
  background: rgba(56, 189, 248, 0.08);
  color: var(--color-primary);
}

.admin-vt-mode .icon { display: block; font-size: 16px; line-height: 1; }
.admin-vt-mode .lbl  { display: block; font-size: 11px; margin-top: 4px; }
.admin-vt-mode .sub  { display: block; font-family: var(--font-mono); font-size: 8px; letter-spacing: 1px; color: var(--admin-text-dim); margin-top: 2px; }
.admin-vt-mode button.is-active .sub { color: var(--color-primary); }

.admin-vt-color-rows {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.admin-vt-color-row {
  display: flex;
  gap: 10px;
  align-items: center;
}

.admin-vt-color-row .swatch {
  width: 40px;
  height: 40px;
  border-radius: 4px;
  border: 1px solid var(--admin-line);
  flex-shrink: 0;
}

.admin-vt-color-row .meta { flex: 1; min-width: 0; }
.admin-vt-color-row .top {
  display: flex;
  align-items: baseline;
  gap: 8px;
}

.admin-vt-color-row .label { font-size: 12px; font-weight: 500; color: var(--admin-text); }
.admin-vt-color-row .kicker {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 1.5px;
  color: var(--admin-text-dim);
}

.admin-vt-color-row .grade {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 1px;
  padding: 1px 6px;
  border-radius: 3px;
  border: 1px solid var(--admin-line);
}

.admin-vt-color-row .grade.is-good { color: #86efac; border-color: #86efac; }
.admin-vt-color-row .grade.is-ok   { color: var(--color-primary); border-color: var(--color-primary); }
.admin-vt-color-row .grade.is-meh  { color: #fbbf24; border-color: #fbbf24; }
.admin-vt-color-row .grade.is-fail { color: #f87171; border-color: #f87171; }

.admin-vt-color-row .bottom {
  display: flex;
  gap: 6px;
  align-items: center;
  margin-top: 4px;
}

.admin-vt-color-row input[type="color"] {
  width: 32px;
  height: 26px;
  padding: 0;
  border: 1px solid var(--admin-line);
  border-radius: 3px;
  background: transparent;
  cursor: pointer;
}

.admin-vt-color-row input[type="text"] {
  flex: 1;
  padding: 5px 8px;
  border: 1px solid var(--admin-line);
  border-radius: 3px;
  font-family: var(--font-mono);
  font-size: 11px;
  background: var(--admin-raised);
  color: var(--admin-text);
  outline: none;
}

.admin-vt-color-row .vs {
  font-family: var(--font-mono);
  font-size: 9px;
  color: var(--admin-text-dim);
  letter-spacing: 0.5px;
}

.admin-vt-logo-drop {
  display: block;
  height: 96px;
  border-radius: 4px;
  border: 1px dashed var(--admin-line);
  background: var(--admin-raised);
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-mono);
  font-size: 11px;
  text-align: center;
  color: var(--admin-text-dim);
}

.admin-vt-logo-drop .hint-preview {
  max-height: 64px;
  max-width: 160px;
  object-fit: contain;
}

.admin-vt-logo-drop small {
  display: block;
  font-size: 9px;
  margin-top: 3px;
  opacity: 0.7;
}

.admin-vt-logo-actions {
  display: flex;
  gap: 6px;
  margin-top: 8px;
}

.admin-vt-logo-actions button {
  flex: 1;
  padding: 6px 10px;
  border-radius: 3px;
  border: 1px solid var(--admin-line);
  background: transparent;
  color: var(--admin-text-dim);
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1px;
  cursor: pointer;
}

.admin-vt-card select {
  width: 100%;
  padding: 8px 10px;
  border-radius: 3px;
  background: var(--admin-raised);
  border: 1px solid var(--admin-line);
  color: var(--admin-text);
  font-size: 13px;
  outline: none;
}

.admin-vt-font-specimen {
  margin-top: 8px;
  padding: 10px 12px;
  border-radius: 3px;
  background: var(--admin-raised);
  border: 1px solid var(--admin-line);
  font-size: 16px;
  color: var(--admin-text);
  line-height: 1.4;
  letter-spacing: 0.3px;
}

.admin-vt-persist {
  display: flex;
  gap: 8px;
  margin-top: 4px;
}

.admin-vt-persist > button { flex: 1; }
.admin-vt-persist > .admin-be-placeholder-control {
  flex: 1;
  justify-content: center;
}

/* Right preview panel */
.admin-vt-preview {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.admin-vt-preview-head {
  display: flex;
  align-items: center;
  gap: 10px;
}

.admin-vt-preview-head .kicker {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 2px;
  color: var(--admin-text-dim);
}

.admin-vt-device {
  margin-left: auto;
  display: flex;
  gap: 2px;
  padding: 2px;
  border: 1px solid var(--admin-line);
  border-radius: 4px;
  background: var(--admin-panel);
}

.admin-vt-device button {
  padding: 4px 10px;
  border-radius: 3px;
  border: none;
  background: transparent;
  color: var(--admin-text-dim);
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1px;
  cursor: pointer;
}

.admin-vt-device button.is-active {
  background: rgba(56, 189, 248, 0.12);
  color: var(--color-primary);
}

.admin-vt-contrast {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}

.vt-contrast-chip {
  padding: 2px 8px;
  border-radius: 3px;
  border: 1px solid var(--admin-line);
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 0.8px;
  color: var(--admin-text-dim);
}

.vt-contrast-chip.is-good { color: #86efac; border-color: #86efac; }
.vt-contrast-chip.is-ok   { color: var(--color-primary); border-color: var(--color-primary); }
.vt-contrast-chip.is-meh  { color: #fbbf24; border-color: #fbbf24; }
.vt-contrast-chip.is-fail { color: #f87171; border-color: #f87171; }

.admin-vt-preview-frame {
  flex: 1;
  min-height: 420px;
  padding: 12px;
  border: 1px solid var(--admin-line);
  border-radius: 6px;
  background: var(--admin-panel);
  display: flex;
  align-items: center;
  justify-content: center;
}

.admin-vt-preview-frame[data-device="tablet"] .admin-vt-preview-stage {
  max-width: 560px;
}

.admin-vt-preview-frame[data-device="mobile"] .admin-vt-preview-stage {
  max-width: 320px;
}

.admin-vt-preview-stage {
  width: 100%;
  max-width: 720px;
  min-height: 400px;
  border-radius: 8px;
  background: var(--vt-bg);
  color: var(--vt-fg);
  padding: 20px 16px;
  display: flex;
  flex-direction: column;
  gap: 14px;
  transition: background 0.15s ease, color 0.15s ease;
}

.admin-vt-preview-stage .hero { text-align: center; }

.admin-vt-preview-stage .hero .logo {
  font-family: inherit;
  font-size: 32px;
  font-weight: 700;
  color: var(--vt-primary);
  letter-spacing: 0.05em;
}

.admin-vt-preview-stage .hero .subtitle {
  margin: 8px 0 0;
  font-size: 14px;
  opacity: 0.75;
}

.admin-vt-preview-stage .hero .chip {
  margin-top: 10px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 10px;
  border-radius: 999px;
  border: 1px solid var(--vt-primary);
  background: color-mix(in srgb, var(--vt-primary) 10%, transparent);
  font-family: "JetBrains Mono", ui-monospace, monospace;
  font-size: 9px;
  letter-spacing: 1.5px;
  color: var(--vt-primary);
  text-transform: uppercase;
}

.admin-vt-preview-stage .hero .chip .dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--vt-primary);
}

.admin-vt-preview-stage .stream {
  display: flex;
  flex-direction: column;
  gap: 6px;
  font-size: 13px;
}

.admin-vt-preview-stage .stream .row {
  display: flex;
  gap: 8px;
  padding: 6px 10px;
  border-radius: 4px;
  background: color-mix(in srgb, var(--vt-fg) 5%, transparent);
}

.admin-vt-preview-stage .stream .row b {
  font-family: "JetBrains Mono", ui-monospace, monospace;
  font-weight: 500;
  opacity: 0.6;
  font-size: 11px;
}

.admin-vt-preview-stage .stream .row.self {
  background: color-mix(in srgb, var(--vt-primary) 20%, transparent);
  color: var(--vt-primary);
}

.admin-vt-preview-stage .composer {
  margin-top: auto;
  display: flex;
  gap: 6px;
  padding: 4px;
  border-radius: 999px;
  border: 1px solid color-mix(in srgb, var(--vt-fg) 15%, transparent);
  background: color-mix(in srgb, var(--vt-fg) 3%, transparent);
}

.admin-vt-preview-stage .composer input {
  flex: 1;
  border: none;
  background: transparent;
  color: var(--vt-fg);
  padding: 8px 14px;
  font-size: 13px;
  outline: none;
  opacity: 0.6;
}

.admin-vt-preview-stage .composer button {
  padding: 8px 16px;
  border-radius: 999px;
  border: none;
  background: var(--vt-primary);
  color: #000;
  font-family: "JetBrains Mono", ui-monospace, monospace;
  font-size: 11px;
  letter-spacing: 1.5px;
  font-weight: 700;
  cursor: default;
}

/* ──────────────────────────────────────────────────────────────────────────
 * Rate Limits editable page (prototype admin-rate-limits.jsx)
 * 4 rows · each has limit count + window dropdown + current usage bar
 * ────────────────────────────────────────────────────────────────────────── */
.admin-ratelimit-page {
  display: flex;
  flex-direction: column;
  gap: 16px;
}

.admin-ratelimit-summary {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 14px;
}

@media (max-width: 760px) {
  .admin-ratelimit-summary { grid-template-columns: repeat(2, 1fr); }
}

.admin-ratelimit-summary .tile {
  padding: 14px 16px;
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.admin-ratelimit-summary .lbl {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1.5px;
  color: var(--admin-text-dim);
  text-transform: uppercase;
}

.admin-ratelimit-summary .val {
  font-family: var(--font-display);
  font-size: 24px;
  font-weight: 700;
  color: var(--admin-text);
  line-height: 1.1;
  letter-spacing: -0.5px;
}

.admin-ratelimit-summary .delta {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.5px;
}

.admin-ratelimit-summary .delta.is-good   { color: #86efac; }
.admin-ratelimit-summary .delta.is-warn   { color: #fbbf24; }
.admin-ratelimit-summary .delta.is-danger { color: #f87171; }
.admin-ratelimit-summary .delta.is-muted  { color: var(--admin-text-dim); }

.admin-ratelimit-head {
  padding: 16px 18px;
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
}

.admin-ratelimit-kicker {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 2px;
  color: var(--admin-text-dim);
  text-transform: uppercase;
}

.admin-ratelimit-title {
  font-size: 16px;
  font-weight: 600;
  color: var(--admin-text);
  margin-top: 4px;
}

.admin-ratelimit-note {
  margin: 8px 0 0;
  font-size: 12px;
  line-height: 1.6;
  color: var(--admin-text-dim);
}

.admin-ratelimit-rows {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.admin-ratelimit-row {
  padding: 14px 16px;
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
}

.admin-ratelimit-row-head {
  display: flex;
  align-items: baseline;
  gap: 12px;
  margin-bottom: 10px;
}

.admin-ratelimit-row-label {
  font-size: 13px;
  font-weight: 600;
  color: var(--admin-text);
}

.admin-ratelimit-row-env {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1.5px;
  color: var(--admin-text-dim);
}

.admin-ratelimit-row-body {
  display: grid;
  grid-template-columns: 140px 140px 1fr;
  gap: 14px;
  align-items: end;
}

@media (max-width: 760px) {
  .admin-ratelimit-row-body { grid-template-columns: 1fr 1fr; }
  .admin-ratelimit-bar-field { grid-column: span 2; }
}

.admin-ratelimit-field {
  display: flex;
  flex-direction: column;
  gap: 6px;
  font-size: 12px;
}

.admin-ratelimit-field > span {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1.5px;
  color: var(--admin-text-dim);
  text-transform: uppercase;
}

.admin-ratelimit-field input,
.admin-ratelimit-field select {
  padding: 8px 10px;
  border-radius: 6px;
  border: 1px solid var(--admin-line);
  background: var(--admin-raised);
  color: var(--admin-text);
  font-family: var(--font-mono);
  font-size: 12px;
  outline: none;
}

.admin-ratelimit-field input:focus,
.admin-ratelimit-field select:focus {
  border-color: var(--color-primary);
  box-shadow: 0 0 0 2px rgba(56, 189, 248, 0.18);
}

.admin-ratelimit-bar-field {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.admin-ratelimit-bar {
  height: 6px;
  border-radius: 3px;
  background: var(--admin-raised);
  overflow: hidden;
}

.admin-ratelimit-bar-fill {
  height: 100%;
  background: var(--color-primary);
  opacity: 0.6;
  transition: width 0.3s ease;
}

.admin-ratelimit-bar-text {
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--admin-text-dim);
  text-transform: none;
  letter-spacing: 0;
}

.admin-ratelimit-footer {
  display: flex;
  gap: 8px;
  justify-content: flex-end;
  padding-top: 4px;
}

/* ──────────────────────────────────────────────────────────────────────────
 * Polls Builder · v5 master-detail (admin-polls.jsx)
 * Left 380px queue with HTML5 drag-reorder · right active question editor.
 * ────────────────────────────────────────────────────────────────────────── */
.admin-poll-page-v5 {
  display: flex;
  flex-direction: column;
  gap: 14px;
}

.admin-poll-page-v5 .admin-poll-head {
  padding: 16px 18px;
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
}

.admin-poll-master-detail {
  display: grid;
  /* Prototype-like 12-col balance (builder 5 + active editor 7) while
   * preserving current master-detail interaction model. */
  grid-template-columns: minmax(300px, 5fr) minmax(420px, 7fr);
  gap: 20px;
}

@media (max-width: 1280px) and (min-width: 1024px) {
  /* Desktop with sidebar collapsing — tighter master/editor split. */
  .admin-poll-master-detail {
    grid-template-columns: minmax(280px, 38%) minmax(0, 62%);
  }
}

/* Tablet + mobile — stack master over editor. Bumped from 960px to
   1023px (polestar polish 2026-05-18) because at 961-1023 the editor
   minmax(420px) squeezed the queue panel to ~280px which felt cramped.
   At tablet width users can scroll between queue + editor; the stacked
   layout reads better. */
@media (max-width: 1023px) {
  .admin-poll-master-detail { grid-template-columns: 1fr; }
}

.admin-poll-queue-panel {
  padding: 18px;
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
  height: fit-content;
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.admin-poll-card-head {
  display: flex;
  align-items: baseline;
  gap: 10px;
  margin-bottom: 4px;
}

.admin-poll-card-head .title { font-size: 13px; font-weight: 600; color: var(--admin-text); }
.admin-poll-card-head .kicker {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1.5px;
  color: var(--admin-text-dim);
  text-transform: uppercase;
}

.admin-poll-qrow {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 12px;
  border-radius: 4px;
  border: 1px solid var(--admin-line);
  background: var(--admin-raised);
  cursor: pointer;
  transition: opacity 0.12s ease, border-color 0.12s ease, background 0.12s ease;
}

.admin-poll-qrow.is-active {
  border-color: var(--color-primary);
  background: var(--hud-cyan-soft);
}

.admin-poll-qrow.is-running {
  border-color: var(--color-primary);
  box-shadow: 0 0 0 1px rgba(56, 189, 248, 0.35);
}

.admin-poll-qrow.is-dragging { opacity: 0.35; }
/* Drop-hint cyan line — prototype admin-polls.jsx:117 shows a glowing
 * 3px bar at the drop target. Use ::before so the row doesn't shift. */
.admin-poll-qrow { position: relative; }
.admin-poll-qrow.is-drag-over::before {
  content: "";
  position: absolute;
  left: 4px;
  right: 4px;
  top: -2px;
  height: 3px;
  border-radius: 2px;
  background: var(--color-primary);
  box-shadow: 0 0 8px var(--color-primary);
  pointer-events: none;
}

.admin-poll-qrow .drag-handle {
  cursor: grab;
  user-select: none;
  color: var(--admin-text-dim);
  font-family: var(--font-mono);
  font-size: 13px;
  padding: 4px 2px;
}

.admin-poll-qrow .idx {
  width: 22px;
  height: 22px;
  border-radius: 3px;
  border: 1px solid var(--admin-line);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-mono);
  font-size: 11px;
  font-weight: 700;
  color: var(--admin-text-dim);
  flex-shrink: 0;
}

.admin-poll-qrow.is-active .idx {
  background: var(--color-primary);
  color: #000;
  border-color: var(--color-primary);
}

.admin-poll-qrow .info { flex: 1; min-width: 0; }
.admin-poll-qrow .text {
  font-size: 12.5px;
  color: var(--admin-text);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.admin-poll-qrow .meta {
  margin-top: 2px;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.5px;
  color: var(--admin-text-dim);
}

.admin-poll-qrow .editing-chip {
  padding: 2px 7px;
  border-radius: 999px;
  background: var(--hud-cyan-soft);
  border: 1px solid var(--color-primary);
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 1px;
  color: var(--color-primary);
  flex-shrink: 0;
}

.admin-poll-add-btn {
  padding: 10px;
  border-radius: 4px;
  border: 1px dashed var(--admin-line);
  background: transparent;
  color: var(--admin-text-dim);
  cursor: pointer;
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 1px;
}

.admin-poll-mode {
  margin-top: 16px;
  padding-top: 14px;
  border-top: 1px solid var(--admin-line);
}

.admin-poll-mode .mode-label {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1px;
  color: var(--admin-text-dim);
  margin-bottom: 8px;
}

.admin-poll-mode .mode-row { display: flex; gap: 6px; }
.admin-poll-mode button {
  flex: 1;
  padding: 8px;
  border-radius: 4px;
  border: 1px solid var(--admin-line);
  background: transparent;
  color: var(--admin-text);
  cursor: pointer;
  font-family: var(--font-ui);
}

.admin-poll-mode button.is-active {
  border-color: var(--color-primary);
  background: var(--hud-cyan-soft);
  color: var(--color-primary);
}

.admin-poll-mode .lbl { display: block; font-size: 12px; font-weight: 500; }
.admin-poll-mode .sub {
  display: block;
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 0.5px;
  color: var(--admin-text-dim);
  margin-top: 2px;
}
.admin-poll-mode button.is-active .sub { color: var(--color-primary); opacity: 0.8; }

/* RIGHT · editor */
.admin-poll-editor {
  padding: 22px;
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
}

.admin-poll-edit-head {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 18px;
}

.admin-poll-edit-head .idx {
  width: 28px;
  height: 28px;
  border-radius: 4px;
  background: var(--color-primary);
  color: #000;
  font-family: var(--font-mono);
  font-size: 13px;
  font-weight: 700;
  display: flex;
  align-items: center;
  justify-content: center;
}

.admin-poll-edit-head .head-info { display: flex; flex-direction: column; gap: 2px; }
.admin-poll-edit-head .title { font-size: 14px; font-weight: 600; color: var(--admin-text); }
.admin-poll-edit-head .kicker {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1.5px;
  color: var(--admin-text-dim);
}

.admin-poll-edit-head .progress {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1px;
  color: var(--admin-text-dim);
}

.admin-poll-field-label {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1.5px;
  color: var(--admin-text-dim);
  margin: 14px 0 6px;
  text-transform: uppercase;
}

.admin-poll-page-v5 .admin-poll-q-text {
  width: 100%;
  padding: 12px 14px;
  border-radius: 4px;
  background: var(--admin-raised);
  border: 1px solid var(--admin-line);
  color: var(--admin-text);
  font-size: 15px;
  outline: none;
  box-sizing: border-box;
}

.admin-poll-page-v5 .admin-poll-q-text:focus {
  border-color: var(--color-primary);
  box-shadow: 0 0 0 2px rgba(56, 189, 248, 0.18);
}

.admin-poll-crop {
  margin-top: 12px;
  padding: 10px 12px;
  background: var(--admin-raised);
  border: 1px solid var(--admin-line);
  border-radius: 4px;
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
}

.admin-poll-crop .crop-label {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1px;
  color: var(--admin-text-dim);
}

.admin-poll-crop button {
  padding: 4px 10px;
  border-radius: 3px;
  border: 1px solid var(--admin-line);
  background: transparent;
  color: var(--admin-text);
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 1px;
  cursor: pointer;
}

.admin-poll-crop button.is-active {
  border-color: var(--color-primary);
  background: rgba(56, 189, 248, 0.08);
  color: var(--color-primary);
  font-weight: 700;
}

.admin-poll-crop .crop-note {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 9px;
  color: var(--admin-text-dim);
}

.admin-poll-opts {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.admin-poll-opt {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px;
  border-radius: 4px;
  border: 1px solid var(--admin-line);
  background: var(--admin-raised);
  cursor: grab;
  transition: opacity 0.12s ease;
}

.admin-poll-opt.is-dragging { opacity: 0.4; }
.admin-poll-opt.is-drag-over { border-top-color: var(--color-primary); border-top-width: 2px; }

.admin-poll-opt .drag-handle {
  color: var(--admin-text-dim);
  font-family: var(--font-mono);
  font-size: 13px;
  padding: 2px;
}

.admin-poll-opt .opt-tag {
  width: 28px;
  height: 28px;
  border-radius: 4px;
  background: var(--color-primary);
  color: #000;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-mono);
  font-size: 12px;
  font-weight: 700;
  flex-shrink: 0;
}

.admin-poll-opt .opt-img-toggle {
  flex-shrink: 0;
  padding: 4px 8px;
  border-radius: 3px;
  border: 1px solid var(--admin-line);
  background: transparent;
  color: var(--admin-text-dim);
  cursor: pointer;
  font-size: 11px;
  min-width: 44px;
}

.admin-poll-opt .opt-img-toggle.is-on {
  border-color: var(--color-primary);
  color: var(--color-primary);
  background: rgba(56, 189, 248, 0.08);
}

.admin-poll-opt input[type="text"] {
  flex: 1;
  padding: 6px 10px;
  border-radius: 3px;
  border: 1px solid var(--admin-line);
  background: transparent;
  color: var(--admin-text);
  font-size: 12px;
  outline: none;
  cursor: text;
}

.admin-poll-opt input[type="text"]:focus {
  border-color: var(--color-primary);
  box-shadow: 0 0 0 2px rgba(56, 189, 248, 0.18);
}

.admin-poll-opt .opt-remove {
  flex-shrink: 0;
  width: 24px;
  height: 24px;
  border: 1px solid var(--admin-line);
  border-radius: 3px;
  background: transparent;
  color: var(--admin-text-dim);
  cursor: pointer;
}

.admin-poll-opt .opt-remove:hover {
  color: #f87171;
  border-color: #f87171;
}

.admin-poll-opt-add {
  margin-top: 8px;
  padding: 8px 14px;
  border-radius: 4px;
  border: 1px dashed var(--admin-line);
  background: transparent;
  color: var(--admin-text-dim);
  cursor: pointer;
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 1px;
}

.admin-poll-edit-foot {
  margin-top: 22px;
  padding-top: 18px;
  border-top: 1px solid var(--admin-line);
  display: flex;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
}

.admin-poll-edit-foot .foot-field {
  display: inline-flex;
  align-items: center;
  gap: 8px;
}

.admin-poll-edit-foot .foot-field > span {
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--admin-text-dim);
  letter-spacing: 1px;
}

.admin-poll-edit-foot .foot-field select {
  padding: 8px 10px;
  border-radius: 4px;
  background: var(--admin-raised);
  border: 1px solid var(--admin-line);
  color: var(--admin-text);
  font-family: var(--font-mono);
  font-size: 11px;
  outline: none;
}

.admin-poll-edit-foot .foot-check input { accent-color: var(--color-primary); }

.admin-poll-edit-foot .foot-spacer { flex: 1; }

/* ────── Legacy Polls styles (v4) kept for backward compatibility ────── */
/* ──────────────────────────────────────────────────────────────────────────
 * Multi-question Poll Builder (v4 prototype admin-poll-spec)
 * Question queue with drag handle + per-question image upload + run bar.
 * ────────────────────────────────────────────────────────────────────────── */
.admin-poll-page {
  display: flex;
  flex-direction: column;
  gap: 14px;
}

.admin-poll-head {
  padding: 16px 18px;
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
}

.admin-poll-kicker {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 2px;
  color: var(--admin-text-dim);
  text-transform: uppercase;
}

.admin-poll-title {
  font-size: 16px;
  font-weight: 600;
  color: var(--admin-text);
  margin-top: 4px;
}

.admin-poll-subnote {
  margin: 8px 0 0;
  font-size: 12px;
  color: var(--admin-text-dim);
  line-height: 1.6;
}

.admin-poll-queue {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.admin-poll-q {
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
  overflow: hidden;
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}

.admin-poll-q.is-running {
  border-color: var(--color-primary);
  box-shadow: 0 0 0 1px rgba(56, 189, 248, 0.25);
}

.admin-poll-q-head {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 14px;
  border-bottom: 1px solid var(--admin-line);
  background: var(--admin-raised);
}

.admin-poll-q-handle {
  cursor: grab;
  color: var(--admin-text-dim);
  font-size: 14px;
  user-select: none;
}

.admin-poll-q-index {
  width: 22px;
  height: 22px;
  border-radius: 4px;
  background: var(--color-primary);
  color: #000;
  font-family: var(--font-mono);
  font-size: 11px;
  font-weight: 700;
  display: flex;
  align-items: center;
  justify-content: center;
}

.admin-poll-q.is-running .admin-poll-q-index {
  background: var(--color-primary);
  box-shadow: 0 0 6px var(--color-primary);
}

.admin-poll-q-label {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1.5px;
  color: var(--admin-text-dim);
  text-transform: uppercase;
}

.admin-poll-q.is-running .admin-poll-q-label {
  color: var(--color-primary);
}

.admin-poll-q-actions {
  margin-left: auto;
  display: flex;
  gap: 4px;
}

.admin-poll-q-btn {
  width: 24px;
  height: 24px;
  border-radius: 4px;
  border: 1px solid var(--admin-line);
  background: transparent;
  color: var(--admin-text-dim);
  cursor: pointer;
  font-size: 11px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0;
}

.admin-poll-q-btn:hover {
  color: var(--admin-text);
  border-color: var(--admin-text-dim);
}

.admin-poll-q-btn.is-danger:hover {
  color: #f87171;
  border-color: #f87171;
}

.admin-poll-q-body {
  padding: 14px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.admin-poll-q-text {
  padding: 10px 12px;
  border-radius: 6px;
  border: 1px solid var(--admin-line);
  background: var(--admin-raised);
  color: var(--admin-text);
  font-size: 14px;
  outline: none;
}

.admin-poll-q-text:focus {
  border-color: var(--color-primary);
  box-shadow: 0 0 0 2px rgba(56, 189, 248, 0.18);
}

.admin-poll-q-image-row {
  display: flex;
  gap: 10px;
  align-items: stretch;
}

.admin-poll-q-image-drop {
  flex: 1;
  min-height: 70px;
  border: 1px dashed var(--admin-line);
  border-radius: 6px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 2px;
  padding: 10px;
  cursor: pointer;
  color: var(--admin-text-dim);
  font-size: 12px;
  transition: border-color 0.12s ease, color 0.12s ease;
}

.admin-poll-q-image-drop:hover {
  border-color: var(--color-primary);
  color: var(--color-primary);
}

.admin-poll-q-image-drop small {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.5px;
}

.admin-poll-q-image-drop img {
  max-height: 100px;
  max-width: 100%;
  border-radius: 4px;
  object-fit: contain;
}

.admin-poll-q-opts {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.admin-poll-q-opt {
  display: flex;
  align-items: center;
  gap: 8px;
}

.admin-poll-q-opt-tag {
  width: 26px;
  height: 26px;
  border-radius: 4px;
  background: var(--admin-raised);
  color: var(--admin-text);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-mono);
  font-size: 11px;
  font-weight: 700;
  flex-shrink: 0;
}

.admin-poll-q-opt input {
  flex: 1;
  padding: 7px 10px;
  border-radius: 4px;
  border: 1px solid var(--admin-line);
  background: transparent;
  color: var(--admin-text);
  font-size: 12px;
  outline: none;
}

.admin-poll-q-opt input:focus {
  border-color: var(--color-primary);
  box-shadow: 0 0 0 2px rgba(56, 189, 248, 0.18);
}

.admin-poll-queue-actions {
  display: flex;
  align-items: center;
  gap: 10px;
}

.admin-poll-queue-count {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1.5px;
  color: var(--admin-text-dim);
  text-transform: uppercase;
  margin-left: auto;
}

.admin-poll-runbar {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px 14px;
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
}

.admin-poll-runbar-field {
  display: flex;
  flex-direction: column;
  gap: 4px;
  font-size: 12px;
}

.admin-poll-runbar-field > span {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1.5px;
  color: var(--admin-text-dim);
  text-transform: uppercase;
}

.admin-poll-runbar-field select {
  padding: 7px 10px;
  border-radius: 4px;
  border: 1px solid var(--admin-line);
  background: var(--admin-raised);
  color: var(--admin-text);
  font-family: var(--font-mono);
  font-size: 12px;
  outline: none;
}

.admin-poll-runbar-spacer { flex: 1; }

.admin-poll-status {
  margin-top: 4px;
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--admin-text-dim);
  letter-spacing: 0.5px;
}

.admin-poll-legacy { display: none; }

.admin-ratelimit-export {
  margin: 0;
  padding: 12px 14px;
  border-radius: 6px;
  border: 1px dashed var(--color-primary);
  background: var(--admin-raised);
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--admin-text);
  white-space: pre-wrap;
  user-select: all;
}

.theme-pack-toolbar {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 14px;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1px;
  color: var(--admin-text-dim);
}

.theme-pack-actions-head {
  margin-left: auto;
  color: var(--color-primary);
  cursor: pointer;
  letter-spacing: 1px;
}

/* ──────────────────────────────────────────────────────────────────────────
 * AdminV3 Soft Holo — design-v2 two-column shell.
 * Sidebar (240px) + main; main has topbar + KPI strip + section stack.
 * Replaces the single-card hero with a HUD dashboard lockup.
 * ────────────────────────────────────────────────────────────────────────── */
.admin-dash-grid {
  display: grid;
  grid-template-columns: 240px 1fr;
  gap: var(--space-6);
  align-items: start;
}

.admin-dash-sidebar {
  position: sticky;
  top: var(--space-4);
  align-self: start;
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  max-height: calc(100vh - 3rem);
}

.admin-dash-brand {
  padding: 18px 22px 16px;
  border-bottom: 1px solid var(--admin-line);
}

.admin-dash-brand-hero {
  display: inline-flex;
  align-items: baseline;
  gap: 0.5rem;
  font-family: var(--font-display);
  font-size: 1.5rem;
  font-weight: 400;
  color: #7dd3fc;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  line-height: 1;
}

.admin-dash-brand-suffix {
  display: block;
  margin-top: 6px;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.15em;
  color: var(--color-text-muted);
  text-transform: uppercase;
}

.admin-dash-nav {
  flex: 1;
  padding: 14px 10px;
  overflow-y: auto;
}

.admin-dash-nav-label {
  padding: 8px 12px 4px;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--color-text-muted);
}

.admin-dash-nav-row {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 0 12px;
  height: 34px;
  border-radius: 4px;
  margin-bottom: 2px;
  color: var(--color-text-bright);
  text-decoration: none;
  font-size: 13px;
  transition: background 120ms ease;
  /* Reset for <button> elements used as nav rows */
  width: 100%;
  background: transparent;
  border: 0;
  cursor: pointer;
  text-align: left;
  font-family: inherit;
}

.admin-dash-nav-row:hover {
  background: color-mix(in srgb, var(--color-primary) 10%, transparent);
}

.admin-dash-nav-row.is-active {
  background: var(--hud-cyan-soft, rgba(56, 189, 248, 0.12));
  font-weight: 500;
}

/* Phase A IA reorg (2026-05-06): Security is a standalone nav row, NOT
 * inside the System accordion (locked decision per polestar 2026-05-04).
 * The divider + small top margin make the visual separation clear so it
 * doesn't get mistaken for a System sub-item. */
.admin-dash-nav-divider {
  height: 1px;
  background: color-mix(in srgb, var(--color-text-muted) 25%, transparent);
  margin: 12px 12px 8px;
}

.admin-dash-nav-row[data-nav-standalone="true"] {
  margin-top: 0;
}

.admin-dash-nav-icon {
  width: 16px;
  text-align: center;
  color: var(--color-text-muted);
  font-family: var(--font-mono);
}

.admin-dash-nav-row.is-active .admin-dash-nav-icon {
  color: var(--color-primary);
}

.admin-dash-nav-badge {
  margin-left: auto;
  padding: 1px 6px;
  border: 1px solid var(--admin-line);
  border-radius: 4px;
  font-family: var(--font-mono);
  font-size: 9px;
  color: var(--color-text-muted);
  letter-spacing: 0.05em;
}

.admin-dash-nav-live {
  margin-left: auto;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--hud-amber);
  box-shadow: 0 0 6px var(--hud-amber), 0 0 12px color-mix(in srgb, var(--hud-amber) 33%, transparent);
  animation: hud-pulse 2s ease-in-out infinite;
}

.admin-dash-telem {
  padding: 12px 16px;
  border-top: 1px solid var(--admin-line);
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.05em;
}

.admin-dash-telem-head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 6px;
  color: var(--color-text-muted);
  letter-spacing: 0.05em;
}

.admin-dash-telem-head .status {
  color: var(--hud-lime);
}

.admin-dash-telem-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 6px;
  margin-top: 6px;
  color: var(--color-text-muted);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.05em;
}

.admin-dash-telem-grid > div span {
  color: var(--color-text-bright);
  margin-left: 4px;
}

.admin-dash-main {
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-6);
}

.admin-dash-topbar {
  display: flex;
  align-items: center;
  gap: 18px;
  padding: 18px 24px;
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
  flex-wrap: wrap;
}

.admin-dash-topbar-title {
  display: flex;
  flex-direction: column;
  gap: 4px;
  min-width: 0;
}

.admin-dash-topbar-title h1 {
  font-size: 22px;
  font-weight: 600;
  letter-spacing: -0.3px;
  color: var(--color-text-bright);
  margin: 0;
}

.admin-dash-topbar-title h1 .accent {
  color: var(--color-primary);
}

.admin-dash-topbar-actions {
  margin-left: auto;
  display: flex;
  gap: 10px;
  align-items: center;
  flex-wrap: wrap;
}

.admin-dash-search {
  padding: 7px 14px;
  border-radius: 6px;
  border: 1px solid var(--admin-line);
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.08em;
  color: var(--color-text-muted);
  background: transparent;
  display: inline-flex;
  align-items: center;
  gap: 10px;
}

.admin-dash-search .sep {
  color: var(--admin-line);
  margin: 0 2px;
}

.admin-dash-broadcast {
  padding: 7px 14px;
  border-radius: 6px;
  border: 1px solid var(--color-primary);
  background: var(--color-primary);
  color: #000;
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.12em;
  font-weight: 700;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
}

.admin-dash-broadcast .dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: #000;
}

.admin-kpi-strip {
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
  padding: var(--space-5);
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--space-5);
}

.admin-kpi-tile {
  display: flex;
  flex-direction: column;
  gap: 6px;
  min-width: 0;
}

.admin-kpi-tile-head {
  display: flex;
  align-items: baseline;
  gap: 8px;
}

.admin-kpi-tile-head .label {
  font-size: 12px;
  color: var(--color-text-muted);
}

.admin-kpi-tile-head .en {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--color-text-muted);
}

.admin-kpi-tile-value {
  font-family: var(--font-display);
  font-size: 34px;
  font-weight: 400;
  color: var(--color-text-bright);
  letter-spacing: -0.5px;
  line-height: 1;
  margin-top: 6px;
}

.admin-kpi-tile-bars {
  display: flex;
  gap: 2px;
  height: 16px;
  align-items: flex-end;
  margin-top: 6px;
}

.admin-kpi-tile-bars > span {
  flex: 1;
  min-height: 2px;
  background: var(--color-primary);
}

.admin-kpi-tile-delta {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.05em;
  margin-top: 4px;
}

.admin-kpi-tile-delta.is-success {
  color: #84cc16;
}

.admin-kpi-tile-delta.is-muted {
  color: var(--color-text-muted);
}

/* ──────────────────────────────────────────────────────────────────────────
 * AdminV3 inner card — flat HUD panel replacing .glass-effect rounded-2xl.
 * Used across every admin section (settings, moderation, assets, advanced).
 * ────────────────────────────────────────────────────────────────────────── */
.admin-v3-card {
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
  padding: var(--space-5);
  transition: border-color 180ms ease, background 180ms ease;
  scroll-margin-top: var(--space-6);
}

.admin-v3-card:hover {
  border-color: color-mix(in srgb, var(--color-primary) 40%, var(--admin-line));
}

.admin-v3-card > summary {
  cursor: pointer;
  list-style: none;
}

.admin-v3-card > summary::-webkit-details-marker {
  display: none;
}

.admin-v3-card-kicker {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--color-text-muted);
  margin-bottom: 4px;
  display: block;
}

.admin-v3-card-kicker.is-accent {
  color: var(--color-primary);
}

/* ──────────────────────────────────────────────────────────────────────────
 * HUD utilities — shared across per-route admin pages.
 * Stats strips, tables, filter chips, console panes, status pills.
 * ────────────────────────────────────────────────────────────────────────── */
.hud-stats-strip {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--space-5);
  padding: var(--space-5);
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
}

.hud-stat-tile {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.hud-stat-tile-en {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--color-text-muted);
}

.hud-stat-tile-value {
  font-family: var(--font-display);
  font-size: 28px;
  font-weight: 600;
  line-height: 1;
  letter-spacing: -0.5px;
  color: var(--color-text-strong);
  margin-top: 4px;
}

.hud-stat-tile-value.is-lime    { color: #86efac; }
.hud-stat-tile-value.is-amber   { color: #fbbf24; }
.hud-stat-tile-value.is-cyan    { color: var(--color-primary); }
.hud-stat-tile-value.is-crimson { color: #f87171; }

.hud-stat-tile-label {
  font-size: 11px;
  color: var(--color-text-muted);
  margin-top: 4px;
}

.hud-table {
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
  overflow: hidden;
}

.hud-table-head,
.hud-table-row {
  display: grid;
  gap: 10px;
  align-items: center;
}

.hud-table-head {
  padding: 10px 14px;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.1em;
  color: var(--color-text-muted);
  border-bottom: 1px solid var(--admin-line);
}

.hud-table-row {
  padding: 12px 14px;
  border-bottom: 1px solid var(--admin-line);
}
.hud-table-row:last-child { border-bottom: 0; }

.hud-table-row:hover {
  background: color-mix(in srgb, var(--color-primary) 4%, transparent);
}

.hud-status-dot {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  display: inline-block;
}
.hud-status-dot.is-live    { background: #86efac; box-shadow: 0 0 6px #86efac, 0 0 14px rgba(134, 239, 172, 0.3); animation: hud-pulse 2s ease-in-out infinite; }
.hud-status-dot.is-paused  { background: #fbbf24; }
.hud-status-dot.is-danger  { background: #f87171; }
.hud-status-dot.is-mute    { background: var(--color-text-muted); }

@keyframes hud-pulse {
  0%, 100% { opacity: 1; }
  50%      { opacity: 0.55; }
}

.hud-pill {
  display: inline-block;
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 0.1em;
  padding: 2px 8px;
  border-radius: 3px;
  border: 1px solid var(--admin-line);
  color: var(--color-text-muted);
  width: fit-content;
}
.hud-pill.is-lime   { border-color: #86efac; color: #86efac; }
.hud-pill.is-amber  { border-color: #fbbf24; color: #fbbf24; }
.hud-pill.is-cyan   { border-color: var(--color-primary); color: var(--color-primary); }
.hud-pill.is-danger { border-color: #f87171; color: #f87171; }
.hud-pill.is-default {
  background: var(--color-primary);
  color: #000;
  border-color: var(--color-primary);
  font-weight: 700;
}

.hud-filter-row {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: wrap;
}

.hud-filter-chip {
  padding: 5px 12px;
  border-radius: 4px;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.1em;
  border: 1px solid var(--admin-line);
  color: var(--color-text-muted);
  background: transparent;
  cursor: pointer;
}
.hud-filter-chip.is-active {
  border-color: var(--color-primary);
  color: var(--color-primary);
  background: var(--hud-cyan-soft, rgba(56, 189, 248, 0.14));
}

.hud-toolbar-action {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.12em;
  color: var(--color-primary);
  cursor: pointer;
  background: transparent;
  border: 1px solid transparent;
  padding: 6px 10px;
  border-radius: 4px;
  transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}
.hud-toolbar-action:hover {
  border-color: var(--admin-line);
  background: color-mix(in srgb, var(--color-bg-elevated) 60%, transparent);
}
.hud-toolbar-action.is-primary {
  border-color: var(--color-primary);
  background: var(--hud-cyan-soft, rgba(56, 189, 248, 0.14));
  font-weight: 700;
}
.hud-toolbar-action:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

/* Effects grid + YAML inspector */
.hud-effects-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 10px;
}
.hud-effect-card {
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
  padding: 12px;
  display: flex;
  flex-direction: column;
  gap: 8px;
  cursor: pointer;
  transition: border-color 0.15s ease, background 0.15s ease;
}
.hud-effect-card:hover {
  border-color: var(--color-primary);
}
.hud-effect-card.is-selected {
  border-color: var(--color-primary);
  background: var(--hud-cyan-soft, rgba(56, 189, 248, 0.14));
}
.hud-effect-card-head {
  display: flex;
  align-items: center;
  gap: 6px;
}
.hud-effect-card-preview {
  height: 44px;
  border-radius: 4px;
  background: color-mix(in srgb, var(--color-bg-deep) 70%, transparent);
  border: 1px solid var(--admin-line);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-display);
  font-size: 16px;
  font-weight: 600;
  color: var(--color-text-strong);
}
.hud-effect-card-preview.is-glow { color: var(--color-primary); text-shadow: 0 0 12px var(--color-primary); }
.hud-effect-card-preview.is-color { color: #ec4899; }
.hud-effect-card-preview.is-text { letter-spacing: 2px; }
.hud-effect-card-name {
  font-family: var(--font-mono);
  font-size: 12px;
  color: var(--color-text-strong);
  word-break: break-all;
}
.hud-effect-card-meta {
  font-family: var(--font-mono);
  font-size: 9px;
  color: var(--color-text-muted);
  letter-spacing: 0.05em;
  margin-top: 2px;
}
.hud-effect-card-actions {
  display: flex;
  gap: 4px;
  align-items: center;
}
.hud-effect-chip {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 0.12em;
  padding: 2px 8px;
  border-radius: 3px;
  border: 1px solid var(--admin-line);
  color: var(--color-text-muted);
  cursor: pointer;
  background: transparent;
}
.hud-effect-chip.is-on {
  border-color: var(--color-primary);
  color: var(--color-primary);
}

.hud-inspector {
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  min-height: 320px;
}
.hud-inspector-head {
  padding: 12px 14px;
  border-bottom: 1px solid var(--admin-line);
  display: flex;
  align-items: center;
  gap: 8px;
}
.hud-inspector-body {
  padding: 14px;
  font-family: var(--font-mono);
  font-size: 11px;
  line-height: 1.7;
  color: var(--color-text-strong);
  background: color-mix(in srgb, var(--color-bg-deep) 65%, transparent);
  flex: 1;
  overflow: auto;
  margin: 0;
  white-space: pre;
}
.hud-inspector-foot {
  padding: 12px;
  border-top: 1px solid var(--admin-line);
  display: flex;
  gap: 6px;
}

/* DS-004 · Effect Parameter Panel (inside hud-inspector-body) ────────────── */
.hud-inspector-body.has-param-panel {
  white-space: normal;
  padding: 0;
  font-family: var(--font-sans);
  font-size: inherit;
}
.fx-param-body {
  padding: 14px;
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.fx-section-head {
  font-family: var(--font-mono);
  font-size: 9.5px;
  color: var(--color-text-muted);
  letter-spacing: 1.5px;
  margin-bottom: 10px;
}
.fx-divider {
  height: 1px;
  background: var(--color-border, #1f2944);
  margin: 0 -14px;
}
/* Slider */
.fx-slider-track {
  position: relative;
  height: 6px;
  background: var(--color-bg-elevated, #0f1524);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 3px;
}
.fx-slider-fill {
  position: absolute;
  left: 0; top: -1px; bottom: -1px;
  background: var(--color-primary);
  border-radius: 3px;
  opacity: 0.85;
}
.fx-slider-knob {
  position: absolute;
  top: -5px;
  width: 14px; height: 14px;
  border-radius: 50%;
  background: var(--admin-panel, #0f1421);
  border: 2px solid var(--color-primary);
  box-shadow: 0 0 8px rgba(56,189,248,0.40);
  transform: translateX(-50%);
}
.fx-slider-minmax {
  display: flex;
  justify-content: space-between;
  margin-top: 4px;
  font-family: var(--font-mono);
  font-size: 9px;
  color: var(--color-text-muted);
  letter-spacing: 0.3px;
}
/* Radio / segmented */
.fx-radio-group {
  display: flex;
  background: var(--color-bg-elevated, #0f1524);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 3px;
  padding: 2px;
  gap: 2px;
}
.fx-radio-btn {
  flex: 1;
  padding: 5px 6px;
  border: none;
  cursor: default;
  background: transparent;
  color: var(--color-text-dim);
  font-family: var(--font-mono);
  font-size: 9.5px;
  letter-spacing: 0.4px;
  font-weight: 600;
  border-radius: 2px;
  text-align: center;
}
.fx-radio-btn.is-active {
  background: var(--color-primary);
  color: #0B1020;
}
/* Warn box */
.fx-warn-box {
  padding: 9px 10px;
  border-radius: 3px;
  display: flex;
  gap: 8px;
  align-items: flex-start;
  background: rgba(132,204,22,0.10);
  border: 1px solid rgba(132,204,22,0.45);
}
.fx-warn-box.is-amber {
  background: rgba(251,191,36,0.10);
  border-color: rgba(251,191,36,0.45);
}
.fx-warn-box.is-crimson {
  background: rgba(244,63,94,0.10);
  border-color: rgba(244,63,94,0.45);
}
.fx-warn-chip {
  display: inline-flex;
  align-items: center;
  padding: 1px 6px;
  border-radius: 2px;
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 1px;
  font-weight: 600;
  flex-shrink: 0;
  background: rgba(132,204,22,0.12);
  border: 1px solid rgba(132,204,22,0.45);
  color: var(--hud-lime, #84cc16);
}
.fx-warn-chip.is-amber {
  background: rgba(251,191,36,0.12);
  border-color: rgba(251,191,36,0.45);
  color: var(--hud-amber);
}
.fx-warn-chip.is-crimson {
  background: rgba(244,63,94,0.12);
  border-color: rgba(244,63,94,0.45);
  color: var(--hud-crimson, #f43f5e);
}
.fx-warn-text {
  font-size: 10.5px;
  color: var(--color-text-strong);
  line-height: 1.55;
  flex: 1;
}
/* Live preview 3-grid */
.fx-preview-3 {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 5px;
}
.fx-preview-cell {
  position: relative;
  border-radius: 3px;
  border: 1px solid var(--color-border, #1f2944);
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 68px;
  overflow: hidden;
}
.fx-preview-cell.is-dark  { background: #0B0E18; }
.fx-preview-cell.is-light { background: #F8FAFC; }
.fx-preview-cell.is-photo {
  background: linear-gradient(135deg, #5B5142 0%, #886A45 30%, #4A6B82 60%, #2D3F58 100%);
}
.fx-preview-bg-label {
  position: absolute;
  top: 4px; left: 5px;
  font-family: var(--font-mono);
  font-size: 7px;
  letter-spacing: 0.9px;
  color: rgba(154,164,178,0.65);
  pointer-events: none;
}
.fx-preview-text {
  font-size: 17px;
  font-weight: 700;
  letter-spacing: 0.3px;
  display: inline-block;
}

.hud-banned-row {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 4px;
  border-bottom: 1px solid color-mix(in srgb, var(--admin-line) 55%, transparent);
}
.hud-banned-row:last-child {
  border-bottom: none;
}

.hud-rules-body {
  max-height: 360px;
  overflow-y: auto;
}
.hud-rule-row {
  padding: 8px 14px;
  border-bottom: 1px solid color-mix(in srgb, var(--admin-line) 55%, transparent);
  gap: 10px;
  align-items: center;
}
.hud-rule-row:last-child {
  border-bottom: none;
}

.hud-system-grid {
  display: grid;
  grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr) minmax(0, 1fr);
  gap: 16px;
  align-items: stretch;
}

/* ──────────────────────────────────────────────────────────────────────
 * Admin System Overview — design v4 (2026-05-17)
 *   6 metric tiles w/ sparkline · services + recent errors panes ·
 *   action buttons row. Replaces 3-pane server/rates/backup layout.
 * ────────────────────────────────────────────────────────────────────── */
.admin-soh-v4 { display: flex; flex-direction: column; gap: 14px; }

.admin-soh-v4__metrics {
  display: grid; grid-template-columns: repeat(6, 1fr); gap: 10px;
}
@media (max-width: 1100px) { .admin-soh-v4__metrics { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 600px)  { .admin-soh-v4__metrics { grid-template-columns: repeat(2, 1fr); } }

.admin-soh-v4__metric {
  background: var(--hud-bg1);
  border: 1px solid var(--hud-line);
  border-radius: 6px; padding: 12px;
}
.admin-soh-v4__metric-en {
  font-family: var(--hud-font-mono);
  font-size: 9px; letter-spacing: 1px;
  color: var(--hud-textDim);
}
.admin-soh-v4__metric-v {
  font-size: 18px; font-weight: 600; margin-top: 4px;
  color: var(--hud-text);
}
.admin-soh-v4__spark {
  width: 100%; height: 22px; margin-top: 6px;
  display: block; color: var(--hud-cyan);
}
.admin-soh-v4__metric-zh {
  font-family: var(--hud-font-mono);
  font-size: 9px; color: var(--hud-textDim); margin-top: 4px;
}

.admin-soh-v4__panes {
  display: grid; grid-template-columns: 1fr 1fr; gap: 14px;
}
@media (max-width: 900px) { .admin-soh-v4__panes { grid-template-columns: 1fr; } }

.admin-soh-v4__pane {
  background: var(--hud-bg1);
  border: 1px solid var(--hud-line);
  border-radius: 6px; overflow: hidden;
}
.admin-soh-v4__pane-head {
  padding: 12px 16px;
  border-bottom: 1px solid var(--hud-line);
  display: flex; align-items: center; gap: 8px;
}
.admin-soh-v4__pane-label {
  font-family: var(--hud-font-mono);
  font-size: 9px; letter-spacing: 1.5px; text-transform: uppercase;
  color: var(--hud-textDim);
}
.admin-soh-v4__pane-label.is-crimson { color: var(--hud-crimson, #ff4d4f); }
.admin-soh-v4__spacer { flex: 1; }
.admin-soh-v4__pane-link {
  font-family: var(--hud-font-mono);
  font-size: 10px; letter-spacing: 0.5px;
  color: var(--hud-cyan); text-decoration: none;
}

.admin-soh-v4__svc {
  padding: 10px 16px;
  border-bottom: 1px solid var(--hud-line);
  display: flex; align-items: center; gap: 10px;
}
.admin-soh-v4__svc:last-child { border-bottom: none; }
.admin-soh-v4__svc-dot {
  width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;
  animation: soh-pulse 1.4s ease-in-out infinite;
}
.admin-soh-v4__svc-id { flex: 1; min-width: 0; }
.admin-soh-v4__svc-name { font-size: 12px; font-weight: 500; color: var(--hud-text); }
.admin-soh-v4__svc-note {
  font-family: var(--hud-font-mono);
  font-size: 9px; color: var(--hud-amber); margin-top: 2px;
  letter-spacing: 0.3px;
}
.admin-soh-v4__svc-ver,
.admin-soh-v4__svc-uptime {
  font-family: var(--hud-font-mono);
  font-size: 9px; letter-spacing: 0.5px;
  color: var(--hud-textDim);
}
.admin-soh-v4__svc-state {
  font-family: var(--hud-font-mono);
  font-size: 9px; letter-spacing: 1px;
  padding: 2px 8px; border-radius: 3px;
  border: 1px solid;
}
@keyframes soh-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.55; } }
@media (prefers-reduced-motion: reduce) { .admin-soh-v4__svc-dot { animation: none; } }

.admin-soh-v4__err-empty {
  padding: 16px;
  font-family: var(--hud-font-mono);
  font-size: 10px; color: var(--hud-textDim);
  text-align: center;
}
.admin-soh-v4__err {
  padding: 10px 16px;
  border-bottom: 1px solid var(--hud-line);
  display: flex; align-items: center; gap: 8px;
  background: rgba(251, 191, 36, 0.04);
}
.admin-soh-v4__err[data-sev="error"] { background: rgba(255, 77, 79, 0.05); }
.admin-soh-v4__err:last-child { border-bottom: none; }
.admin-soh-v4__err-dot {
  width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0;
  background: var(--hud-amber);
}
.admin-soh-v4__err-dot[data-sev="error"] { background: var(--hud-crimson, #ff4d4f); }
.admin-soh-v4__err-time {
  font-family: var(--hud-font-mono);
  font-size: 10px; color: var(--hud-textDim); flex-shrink: 0;
}
.admin-soh-v4__err-msg {
  font-size: 11px; color: var(--hud-text); flex: 1;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.admin-soh-v4__err-arrow {
  font-family: var(--hud-font-mono);
  font-size: 11px; color: var(--hud-cyan); flex-shrink: 0;
}

.admin-soh-v4__actions {
  display: flex; gap: 10px; flex-wrap: wrap;
}
.admin-soh-v4__action {
  flex: 1; min-width: 140px;
  padding: 10px 14px; border-radius: 6px;
  font-family: var(--hud-font-mono);
  font-size: 11px; letter-spacing: 0.5px; font-weight: 600;
  cursor: pointer; text-decoration: none;
  display: flex; align-items: center; justify-content: center; gap: 6px;
}
.admin-soh-v4__action:disabled { opacity: 0.4; cursor: not-allowed; }
.admin-soh-v4__action.is-amber  { border: 1px solid rgba(251, 191, 36, 0.33); background: rgba(251, 191, 36, 0.04); color: var(--hud-amber); }
.admin-soh-v4__action.is-cyan   { border: 1px solid rgba(56, 189, 248, 0.33); background: rgba(56, 189, 248, 0.04); color: var(--hud-cyan); }
.admin-soh-v4__action.is-dim    { border: 1px solid rgba(148, 163, 184, 0.20); background: transparent;                color: var(--hud-textDim); }

.admin-soh-v4__pubchip {
  padding: 12px 16px; border-radius: 6px;
  background: var(--hud-bg2);
  border: 1px solid var(--hud-line);
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  font-family: var(--hud-font-mono);
  font-size: 11px;
}
.admin-soh-v4__pubchip code {
  color: var(--hud-cyan); word-break: break-all;
}
.admin-soh-v4__pub-hint {
  margin-left: auto;
  font-size: 10px; color: var(--hud-textDim);
}
.hud-system-grid > .hud-inspector {
  min-height: auto;
}
@media (max-width: 1180px) {
  .hud-system-grid {
    grid-template-columns: 1fr 1fr;
  }
  .hud-system-grid > .hud-system-server {
    grid-column: 1 / -1;
  }
}
@media (max-width: 720px) {
  .hud-system-grid {
    grid-template-columns: 1fr;
  }
  .hud-system-grid > .hud-system-server {
    grid-column: auto;
  }
}

.hud-console {
  background: var(--admin-panel);
  border: 1px solid var(--admin-line);
  border-radius: 6px;
  overflow: hidden;
}
.hud-console-head {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 14px;
  border-bottom: 1px solid var(--admin-line);
}
.hud-console-body {
  padding: 12px 14px;
  font-family: var(--font-mono);
  font-size: 11px;
  line-height: 1.7;
  background: color-mix(in srgb, var(--color-bg-deep) 65%, transparent);
  max-height: 240px;
  overflow: auto;
}
.hud-console-line {
  display: grid;
  grid-template-columns: 70px 50px 130px 1fr;
  gap: 10px;
}
.hud-console-lv-info  { color: #86efac; letter-spacing: 0.1em; }
.hud-console-lv-warn  { color: #fbbf24; letter-spacing: 0.1em; }
.hud-console-lv-debug { color: var(--color-text-muted); letter-spacing: 0.1em; }
.hud-console-lv-err   { color: #f87171; letter-spacing: 0.1em; }

.hud-sample-square {
  height: 44px;
  border-radius: 4px;
  background: color-mix(in srgb, var(--color-bg-deep) 70%, transparent);
  border: 1px solid var(--admin-line);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-display);
  font-size: 16px;
  font-weight: 600;
  color: var(--color-text-strong);
}

.hud-kv {
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.hud-kv-k {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.12em;
  color: var(--color-text-muted);
  text-transform: uppercase;
}
.hud-kv-v {
  font-family: var(--font-mono);
  font-size: 13px;
  color: var(--color-text-strong);
}

.hud-page-grid-2 {
  display: grid;
  grid-template-columns: 1fr 340px;
  gap: 20px;
}
.hud-page-grid-2-wide {
  display: grid;
  grid-template-columns: 1fr 420px;
  gap: 20px;
}
.hud-page-stack {
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.hud-page-col-gap {
  display: flex;
  flex-direction: column;
  gap: 16px;
}

@media (max-width: 1100px) {
  .hud-page-grid-2,
  .hud-page-grid-2-wide {
    grid-template-columns: 1fr;
  }
  .hud-stats-strip {
    grid-template-columns: repeat(2, 1fr);
  }
  .hud-effects-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}
/* Tablet — keep 2 cols up to 1023 (polestar polish 2026-05-18). At
   3 cols + 769-1023 viewport, cards squeeze to ~250px which truncates
   their name + description. 2-col gives ~370-500 per card = comfy. */
@media (min-width: 769px) and (max-width: 1023px) {
  .hud-effects-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}
@media (max-width: 640px) {
  .hud-effects-grid {
    grid-template-columns: 1fr;
  }
}

@media (max-width: 1023px) {
  .admin-dash-grid {
    grid-template-columns: 1fr;
  }
  .admin-dash-sidebar {
    position: static;
    max-height: none;
  }
  .admin-dash-nav {
    display: flex;
    flex-wrap: wrap;
    gap: 2px;
  }
  .admin-dash-nav-label {
    width: 100%;
  }
  .admin-dash-nav-row {
    flex: 1 1 auto;
  }
}

/* Tablet (641-1023px) — 2-col KPI tile to avoid the tall stack of 4
   tiles you get going straight to single column. design v4 2026-05-18. */
@media (min-width: 641px) and (max-width: 1023px) {
  .admin-kpi-strip {
    grid-template-columns: repeat(2, 1fr) !important;
  }
}
@media (max-width: 640px) {
  .admin-kpi-strip {
    grid-template-columns: 1fr;
  }
}

@media (max-width: 640px) {
  .admin-dash-topbar {
    padding: 14px 16px;
  }
  .admin-dash-topbar-title h1 {
    font-size: 18px;
  }
  .admin-kpi-tile-value {
    font-size: 28px;
  }
}

.admin-app-shell input:focus,
.admin-app-shell select:focus,
.admin-app-shell textarea:focus {
  border-color: var(--color-primary);
  box-shadow: 0 0 0 2px rgba(56, 189, 248, 0.22);
  outline: none;
}

/* Sky/cyan accent classes now emitted directly from admin.js + submodules.
   The former !important violet→sky override block is gone. */

/* Glass effect */
.glass-effect {
  background: var(--color-bg-card);
  backdrop-filter: blur(16px) saturate(150%);
  border: 1px solid var(--color-border);
}

/* Custom range input styles */
input[type="range"] {
  -webkit-appearance: none;
  appearance: none;
  width: 100%;
  height: 6px;
  /* Theme-aware track — token resolves to light slate-darken in light
     mode. (2026-05-18 polestar light audit pass 2.) */
  background: var(--color-border-strong, rgba(255, 255, 255, 0.2));
  border-radius: var(--radius-pill);
  outline: none;
  transition: background-color 0.2s ease, box-shadow 0.2s ease;
}

input[type="range"]::-webkit-slider-thumb {
  -webkit-appearance: none;
  appearance: none;
  width: 20px;
  height: 20px;
  background: var(--color-primary);
  cursor: pointer;
  border-radius: 50%;
  border: 2px solid var(--color-bg-base);
  transition: transform 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease;
}

input[type="range"]::-webkit-slider-thumb:hover {
  transform: scale(1.1);
  box-shadow: 0 0 10px var(--color-primary);
}

/* Focus-visible outline for keyboard navigation */
*:focus-visible {
  outline: 2px solid var(--color-primary);
  outline-offset: 2px;
}

summary:focus-visible {
  border-radius: var(--radius-lg);
}

.password-toggle:focus-visible {
  outline: 2px solid var(--color-primary);
  outline-offset: 2px;
  border-radius: var(--radius-sm);
}

/* Page load animation */
@keyframes fadeInScaleUp {
  from {
    opacity: 0;
    transform: scale(0.95);
  }

  to {
    opacity: 1;
    transform: scale(1);
  }
}

.animate-fade-in-scale-up {
  animation: fadeInScaleUp 0.5s ease-out forwards;
}

.admin-shell {
  position: relative;
  overflow: clip;
}

.admin-shell::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 240px;
  background:
    radial-gradient(circle at top left, rgba(249, 115, 22, 0.22), transparent 42%),
    radial-gradient(circle at top right, rgba(245, 158, 11, 0.16), transparent 38%);
  pointer-events: none;
}

.admin-hero {
  position: relative;
  border: 1px solid rgba(120, 53, 15, 0.42);
  background:
    linear-gradient(145deg, rgba(41, 20, 7, 0.92), rgba(12, 10, 9, 0.82)),
    radial-gradient(circle at top, rgba(251, 146, 60, 0.18), transparent 42%);
}

.admin-kicker {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: 0.35rem 0.7rem;
  border: 1px solid rgba(56, 189, 248, 0.25);
  border-radius: var(--radius-pill);
  background: rgba(8, 47, 73, 0.35);
  color: var(--color-sky-300);
  font-size: 0.75rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

.admin-summary-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 0.9rem;
}

.admin-summary-card {
  border: 1px solid rgba(120, 53, 15, 0.55);
  border-radius: var(--radius-xl);
  background: rgba(28, 25, 23, 0.74);
  padding: 0.95rem 1rem;
}

.admin-summary-label {
  display: block;
  margin-bottom: 0.35rem;
  color: var(--color-slate-400);
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
}

.admin-summary-value {
  display: block;
  color: var(--color-slate-100);
  font-size: 1rem;
  font-weight: 600;
}

.admin-section {
  border: 1px solid rgba(68, 64, 60, 0.75);
  background: rgba(17, 24, 39, 0.36);
}

.admin-section-heading {
  display: flex;
  justify-content: space-between;
  gap: var(--space-4);
  align-items: start;
  margin-bottom: 1.25rem;
}

/* Enforce heading hierarchy: section H2 must outrank card H3 */
.admin-section-heading h2 {
  font-size: 1.5rem;
  line-height: 1.2;
  letter-spacing: -0.01em;
  text-wrap: balance;
}

/* Long English section titles shrink slightly on narrow mobile to avoid 3-line wrap */
@media (max-width: 480px) {
  .admin-section-heading h2 {
    font-size: 1.25rem;
  }
}

.admin-primary-stack > .admin-section > * h3,
.admin-section > .admin-section-heading ~ * h3 {
  font-size: 1rem;
}

.admin-section-kicker {
  display: block;
  margin-bottom: 0.35rem;
  color: var(--color-sky-400);
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
}

.admin-chip-nav {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2);
}

.admin-chip {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0.45rem 0.75rem;
  border-radius: var(--radius-pill);
  border: 1px solid rgba(120, 53, 15, 0.42);
  background: rgba(41, 37, 36, 0.78);
  color: var(--color-stone-200, #e7e5e4);
  font-size: 0.75rem;
  transition: background-color 0.2s, border-color 0.2s, color 0.2s;
}

.admin-chip:hover {
  background: rgba(68, 64, 60, 0.95);
  border-color: rgba(251, 146, 60, 0.58);
  color: #fdba74;
}

#live-ops-grid>*,
#review-grid>*,
#library-grid>*,
#automation-grid>*,
#advanced-grid>* {
  width: 100%;
}

.admin-workspace-rail {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 0.9rem;
}

.workspace-pill {
  display: grid;
  gap: 0.35rem;
  padding: 1rem 1.05rem;
  border-radius: var(--radius-xl);
  border: 1px solid rgba(120, 53, 15, 0.55);
  background: linear-gradient(180deg, rgba(41, 37, 36, 0.86), rgba(24, 24, 27, 0.92));
  color: #fafaf9;
  transition: transform 0.2s ease, border-color 0.2s ease, background-color 0.2s ease;
}

.workspace-pill:hover {
  transform: translateY(-1px);
  border-color: rgba(251, 146, 60, 0.72);
}

.workspace-pill-kicker {
  color: #fdba74;
  font-size: 0.72rem;
  text-transform: uppercase;
}

.workspace-pill strong {
  font-size: 1rem;
}

.workspace-pill-copy {
  color: #d6d3d1;
  font-size: 0.82rem;
  line-height: 1.45;
}

.workspace-stack {
  display: grid;
  gap: var(--space-6);
}

.workspace-band {
  display: grid;
  gap: 1.25rem;
}

.workspace-overview-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 0.9rem;
}

.workspace-overview-card {
  padding: 1rem;
  border-radius: var(--radius-xl);
  border: 1px solid rgba(120, 53, 15, 0.45);
  background: rgba(28, 25, 23, 0.62);
}

.workspace-overview-label {
  display: block;
  color: #fdba74;
  font-size: 0.72rem;
  text-transform: uppercase;
  margin-bottom: 0.35rem;
}

.workspace-overview-card strong {
  display: block;
  color: #fafaf9;
  font-size: 1rem;
  margin-bottom: 0.25rem;
}

.workspace-overview-card p {
  color: #d6d3d1;
  font-size: 0.84rem;
  line-height: 1.5;
}

.workspace-split {
  display: grid;
  gap: var(--space-6);
}

.workspace-split-live {
  grid-template-columns: minmax(0, 1.65fr) minmax(280px, 0.9fr);
}

.asset-dashboard-card {
  border-color: rgba(120, 53, 15, 0.45);
  background: rgba(28, 25, 23, 0.62);
}

@media (max-width: 1024px) {
  .admin-workspace-rail,
  .workspace-overview-grid,
  .workspace-split-live {
    grid-template-columns: 1fr;
  }
}

/* ─── Stream mode toggle + hiding ──────────────────────────────────────────
 * When body.stream-mode is set, low-frequency sections collapse so the
 * streamer only sees the controls they touch mid-broadcast (live feed,
 * blacklist, core controls, effects, history). Toggle persists to
 * localStorage "danmu-stream-mode". Selector list intentionally narrow
 * — new sections default to visible unless added here. */
.stream-mode-toggle {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  cursor: pointer;
  user-select: none;
  font-size: 0.75rem;
  color: var(--color-text-secondary);
  padding: 0.25rem 0.65rem 0.25rem 0.25rem;
  border: 1px solid rgba(51, 65, 85, 0.72);
  border-radius: var(--radius-pill);
  background: rgba(15, 23, 42, 0.62);
  transition: border-color 0.2s, background-color 0.2s, color 0.2s;
}
.stream-mode-toggle:hover {
  border-color: rgba(56, 189, 248, 0.45);
  color: var(--color-text-primary);
}
.stream-mode-toggle input {
  position: absolute;
  opacity: 0;
  pointer-events: none;
}
.stream-mode-track {
  position: relative;
  display: inline-block;
  width: 32px;
  height: 18px;
  background: rgba(71, 85, 105, 0.8);
  border-radius: var(--radius-pill);
  transition: background-color 0.2s;
}
.stream-mode-track::after {
  content: "";
  position: absolute;
  top: 2px;
  left: 2px;
  width: 14px;
  height: 14px;
  background: var(--color-white);
  border-radius: 50%;
  transition: transform 0.2s;
}
.stream-mode-toggle input:checked + .stream-mode-track {
  background: var(--color-primary);
}
.stream-mode-toggle input:checked + .stream-mode-track::after {
  transform: translateX(14px);
}
.stream-mode-toggle input:focus-visible + .stream-mode-track {
  outline: 2px solid var(--color-primary);
  outline-offset: 2px;
}

/* Hide low-frequency sections when stream mode is on.
 * Keep high-freq visible: live-feed, blacklist, effects, history,
 * moderation core controls (sec-moderation), and the chip quick-nav. */
body.stream-mode #sec-themes,
body.stream-mode #sec-emojis,
body.stream-mode #sec-stickers,
body.stream-mode #sec-sounds,
body.stream-mode #sec-polls,
body.stream-mode #sec-plugins,
body.stream-mode #sec-webhooks,
body.stream-mode #sec-scheduler,
body.stream-mode #sec-security,
body.stream-mode #sec-filters,
body.stream-mode #sec-advanced,
body.stream-mode #workspace-library,
body.stream-mode #workspace-automation {
  display: none;
}

/* Slim the hero while streaming — less ornament, more signal */
body.stream-mode .admin-hero {
  padding: 1rem 1.25rem;
}
body.stream-mode .admin-hero .admin-summary-grid {
  display: none;
}

@media (max-width: 640px) {
  .admin-summary-grid {
    grid-template-columns: 1fr;
  }

  .workspace-overview-grid {
    grid-template-columns: 1fr;
  }

  .admin-section-heading {
    flex-direction: column;
  }
}

/* Blacklist Warning Modal Styles */
#blacklistWarningModal {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: var(--color-overlay);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 1050;
  opacity: 0;
  transition: opacity 0.3s ease-in-out;
  pointer-events: none;
}

#blacklistWarningModal.visible {
  opacity: 1;
  pointer-events: auto;
}

#blacklistWarningModal .modal-content {
  background-color: var(--color-bg-elevated);
  padding: var(--space-8);
  border-radius: var(--radius-lg);
  text-align: center;
  border: 2px solid var(--color-error);
  box-shadow: 0 10px 25px var(--shadow-base);
  transform: scale(0.95);
  transition: transform 0.3s ease-in-out;
}

#blacklistWarningModal.visible .modal-content {
  transform: scale(1);
}

#blacklistWarningModal .warning-triangle {
  fill: var(--color-error);
  margin-bottom: 1rem;
  width: 48px;
  height: 48px;
  display: inline-block;
}

#blacklistWarningModal .warning-message {
  color: var(--color-text-primary);
  font-size: 1.125rem;
  margin-bottom: 1.5rem;
}

#blacklistWarningModal .ok-button {
  background-color: var(--color-error);
  color: white;
  font-weight: bold;
  padding: 0.75rem 1.5rem;
  border: none;
  border-radius: var(--radius-md);
  cursor: pointer;
  transition: background-color 0.2s;
}

#blacklistWarningModal .ok-button:hover {
  background-color: var(--color-error-hover);
}

/* Flashing Animation for the modal border */
@keyframes flashWarningBorder {

  0%,
  100% {
    border-color: var(--color-error);
  }

  50% {
    border-color: var(--color-error-light);
  }
}

#blacklistWarningModal.flashing .modal-content {
  animation: flashWarningBorder 0.7s infinite;
}

@keyframes flashIcon {

  0%,
  100% {
    transform: scale(1);
    opacity: 1;
  }

  50% {
    transform: scale(1.2);
    opacity: 0.7;
  }
}

#blacklistWarningModal.flashing .warning-triangle {
  animation: flashIcon 0.7s infinite ease-in-out;
}

/* Effect button — ensure WCAG 2.5.5 minimum 44px touch target */
.effect-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
  min-height: 44px;
  min-width: 44px;
  padding-inline: 0.9rem;
  padding-block: 0.65rem;
}

/* Effect button active (selected) state */
.effect-btn--active {
  /* Prototype alignment (viewer.jsx):
   * selected = cyanSoft tint + accent border + 600 weight.
   * Use !important to override the generic .viewer-chip baseline. */
  background-color: var(--hud-cyan-soft) !important;
  color: var(--color-primary) !important;
  border-color: var(--color-primary) !important;
  font-weight: 600;
}

/* Admin Toggle Checkbox */
.toggle-checkbox:checked {
  right: 0;
  border-color: var(--color-primary);
}

.toggle-checkbox:checked+.toggle-label {
  background-color: var(--color-primary);
}

/* --- Connection Status Indicator --- */
.connection-dot {
  display: inline-block;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  flex-shrink: 0;
}

.connection-dot--connected {
  background-color: var(--color-success);
  box-shadow: 0 0 6px var(--glow-success);
}

.connection-dot--connecting {
  background-color: var(--color-warning);
  animation: pulse-dot 1.5s ease-in-out infinite;
}

.connection-dot--disconnected {
  background-color: var(--color-error);
}

@keyframes pulse-dot {

  0%,
  100% {
    opacity: 1;
  }

  50% {
    opacity: 0.4;
  }
}

/* --- Button Loading Spinner --- */
.btn-spinner {
  width: 20px;
  height: 20px;
  animation: spin 0.8s linear infinite;
}

@keyframes spin {
  from {
    transform: rotate(0deg);
  }

  to {
    transform: rotate(360deg);
  }
}

/* --- Skeleton Loading --- */
.skeleton {
  background: linear-gradient(90deg, rgba(255, 255, 255, 0.06) 25%, rgba(255, 255, 255, 0.12) 50%, rgba(255, 255, 255, 0.06) 75%);
  background-size: 200% 100%;
  animation: skeleton-shimmer 1.5s ease-in-out infinite;
  border-radius: var(--radius-md);
}

.skeleton-title {
  height: 2rem;
  width: 60%;
  margin-bottom: 1rem;
}

.skeleton-text {
  height: 1rem;
  width: 100%;
}

.skeleton-input {
  height: 2.75rem;
  width: 100%;
}

.skeleton-btn {
  height: 3rem;
  width: 100%;
  margin-top: 0.5rem;
}

@keyframes skeleton-shimmer {
  0% {
    background-position: 200% 0;
  }

  100% {
    background-position: -200% 0;
  }
}

/* --- Password Show/Hide Toggle --- */
.password-wrapper {
  position: relative;
}

.password-toggle {
  position: absolute;
  right: 0.75rem;
  top: 50%;
  transform: translateY(-50%);
  background: none;
  border: none;
  color: var(--color-text-secondary);
  cursor: pointer;
  padding: var(--space-1);
  line-height: 1;
  transition: color 0.2s;
}

.password-toggle:hover {
  color: var(--color-text-bright);
}

.password-toggle svg {
  width: 18px;
  height: 18px;
}

/* --- Home composer shell --- */
.server-home-shell {
  max-width: 980px;
}

.server-main-shell {
  --server-shell-radius: 1.9rem;
  position: relative;
  overflow: visible;
  border-radius: var(--server-shell-radius);
  background: rgba(2, 6, 23, 0.72);
}

.server-hero-band {
  display: grid;
  gap: var(--space-5);
  margin-bottom: 1.35rem;
}

.server-hero-copy {
  display: grid;
  gap: 0.55rem;
}

.server-hero-kicker {
  color: var(--color-sky-400);
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

.server-hero-title {
  margin: 0;
  font-family: var(--font-display);
  font-size: clamp(3.2rem, 8vw, 6rem);
  line-height: 0.95;
  font-weight: 400; /* Bebas Neue only ships one weight */
  letter-spacing: 0.02em;
}

.server-hero-subtitle {
  margin: 0;
  max-width: 40rem;
  font-size: clamp(1rem, 2vw, 1.25rem);
  line-height: 1.45;
}

.server-hero-side {
  display: grid;
  gap: 0.85rem;
  align-content: start;
}

.server-status-stack {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-3);
}

.server-status-chip {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  min-height: 2.6rem;
  padding: 0.65rem 0.85rem;
  border: 1px solid rgba(51, 65, 85, 0.72);
  border-radius: var(--radius-pill);
  background: rgba(15, 23, 42, 0.62);
  box-shadow: inset 0 1px 0 rgba(148, 163, 184, 0.04);
}

.server-hero-note {
  margin: 0;
  color: var(--color-slate-400);
  font-size: 0.875rem;
  line-height: 1.5;
}

@media (min-width: 860px) {
  .server-hero-band {
    grid-template-columns: minmax(0, 1.15fr) minmax(280px, 0.85fr);
    align-items: end;
  }
}

/* --- Floating Composer (input + preview) --- */
.composer-dock {
  position: sticky;
  top: 1rem;
  z-index: 30;
  margin: 0 0 1.5rem;
}

.composer-bar {
  position: relative;
  z-index: 1;
  overflow: hidden;
  border-radius: var(--server-shell-radius);
  padding: var(--space-4);
  isolation: isolate;
  background: rgb(2 6 23);
  transition:
    padding 0.25s ease,
    background-color 0.25s ease,
    border-color 0.25s ease,
    box-shadow 0.25s ease;
}

.composer-card {
  overflow: hidden;
  border-radius: var(--server-shell-radius);
  border: 1px solid rgba(56, 189, 248, 0.14);
  box-shadow:
    0 18px 48px rgba(2, 6, 23, 0.42),
    inset 0 1px 0 rgba(148, 163, 184, 0.06);
}

.composer-card::before {
  content: none;
}

.composer-card::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  border: 1px solid rgba(255, 255, 255, 0.04);
  pointer-events: none;
}

.composer-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-4);
  margin-bottom: 1rem;
}

@media (min-width: 640px) {
  .composer-grid {
    grid-template-columns: minmax(0, 1.15fr) minmax(260px, 0.85fr);
    align-items: stretch;
  }
}

.composer-input,
.composer-preview {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.composer-label {
  min-height: 1rem;
  margin-bottom: 0.65rem;
  transition: opacity 0.2s ease, height 0.2s ease, margin 0.2s ease;
}

.composer-panel {
  display: flex;
  flex-direction: column;
  min-width: 0;
  overflow: hidden;
  border: 1px solid rgba(71, 85, 105, 0.42);
  border-radius: 1.15rem;
  background: rgba(15, 23, 42, 0.58);
  padding: 0.8rem;
  box-shadow: inset 0 1px 0 rgba(148, 163, 184, 0.05);
}

.composer-panel-body {
  position: relative;
  flex: 1 1 auto;
  overflow: hidden;
  min-height: 132px;
  border: 1px solid rgba(71, 85, 105, 0.46);
  border-radius: 0.95rem;
  background: rgba(15, 23, 42, 0.54);
  padding: 0.8rem 0.9rem;
  box-shadow: inset 0 1px 0 rgba(148, 163, 184, 0.04);
}

.composer-input-body {
  display: flex;
  flex: 1 1 auto;
  height: 100%;
}

.composer-textarea {
  min-height: 100px;
  height: 100%;
  line-height: 1.45;
  position: relative;
  z-index: 1;
}

.composer-preview-box {
  min-height: 132px;
  transition: min-height 0.25s ease;
}

.composer-counter {
  line-height: 1;
}

.composer-preview-text {
  text-shadow: 0 0 20px rgba(34, 211, 238, 0.18);
}

.composer-footer {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 0.9rem;
  padding-top: 0.15rem;
}

.composer-send {
  position: relative;
  z-index: 1;
  width: min(100%, 22rem);
  background: rgb(14 165 233);
  /* Shadow sized to fit within .composer-bar's `overflow: hidden` clip +
   * 16px padding — prior `0 16px 32px` extended ~48px below the button
   * and got chopped at the parent edge, looking like the bottom-right
   * corner was visually "covered" by the card frame. */
  box-shadow: 0 3px 10px rgba(14, 165, 233, 0.34);
  transition:
    padding 0.2s ease,
    font-size 0.2s ease,
    box-shadow 0.2s ease,
    transform 0.2s ease,
    background-color 0.2s ease;
}

.composer-send:hover {
  background: rgb(56 189 248);
  box-shadow: 0 5px 12px rgba(56, 189, 248, 0.4);
}

.server-settings-panel {
  margin-top: 0.4rem;
}

.server-settings-panel > details > summary {
  box-shadow: inset 0 1px 0 rgba(148, 163, 184, 0.04);
}

.settings-summary-header {
  gap: var(--space-4);
}

.settings-summary-copy {
  display: grid;
  gap: 0.45rem;
  min-width: 0;
}

.settings-summary-subtitle {
  color: var(--color-slate-400);
  font-size: 0.875rem;
  line-height: 1.4;
}

.settings-dashboard {
  display: grid;
  gap: var(--space-4);
}

.settings-block-heading {
  display: grid;
  gap: 0.18rem;
}

.settings-block-kicker {
  color: var(--color-sky-400);
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}

.settings-block-title {
  color: var(--color-slate-300);
  font-size: 0.875rem;
  line-height: 1.35;
}

.settings-primary-grid,
.settings-secondary-grid {
  display: grid;
  gap: 0.85rem;
}

.settings-utility-stack {
  display: grid;
  gap: 0.9rem;
}

.settings-card {
  border: 1px solid rgba(51, 65, 85, 0.7);
  border-radius: var(--radius-xl);
  background: rgba(15, 23, 42, 0.62);
  padding: 0.95rem 1rem;
  box-shadow: inset 0 1px 0 rgba(148, 163, 184, 0.04);
}

.settings-card--accent {
  border-color: rgba(56, 189, 248, 0.24);
}

.settings-card--wide {
  grid-column: 1 / -1;
}

.settings-more-controls {
  border: 1px solid rgba(51, 65, 85, 0.68);
  border-radius: var(--radius-xl);
  background: rgba(2, 6, 23, 0.34);
  overflow: hidden;
}

.settings-more-summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
  cursor: pointer;
  list-style: none;
  padding: 0.9rem 1rem;
  background: rgba(15, 23, 42, 0.56);
}

.settings-more-kicker {
  display: block;
  color: var(--color-sky-400);
  font-size: 0.75rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

.settings-more-title {
  display: block;
  margin-top: 0.18rem;
  color: var(--color-slate-200);
  font-size: 0.875rem;
  font-weight: 600;
}

.settings-more-body {
  display: grid;
  gap: 0.9rem;
  padding: 0.95rem;
}

.site-footer {
  display: flex;
  justify-content: center;
  align-items: center;
  gap: 0.55rem;
  margin-top: 1.25rem;
  color: var(--color-slate-600);
  font-size: 0.75rem;
}

.site-footer-link {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  color: var(--color-slate-500);
  transition: color 0.2s ease;
}

.site-footer-link:hover {
  color: var(--color-sky-400);
}

.site-footer-separator {
  color: var(--color-slate-700);
}

.site-footer-version {
  color: var(--color-slate-600);
  font-size: 0.75rem;
}

.asset-dashboard-strip {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 0.9rem;
  margin-bottom: 1.1rem;
}

.asset-dashboard-card {
  border: 1px solid rgba(120, 53, 15, 0.45);
  border-radius: var(--radius-xl);
  background: linear-gradient(145deg, rgba(41, 37, 36, 0.8), rgba(28, 25, 23, 0.72));
  padding: 0.9rem 1rem;
}

.asset-dashboard-label {
  display: block;
  margin-bottom: 0.45rem;
  color: #fdba74;
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
}

.asset-dashboard-card strong {
  display: block;
  margin-bottom: 0.45rem;
  color: #fafaf9;
  font-size: 1rem;
  font-weight: 600;
}

.asset-dashboard-card p {
  margin: 0;
  color: #d6d3d1;
  font-size: 0.875rem;
  line-height: 1.45;
}

.history-section-body {
  display: grid;
  gap: 0.95rem;
}

.history-dashboard-grid {
  display: grid;
  grid-template-columns: minmax(220px, 0.8fr) minmax(0, 1.2fr) minmax(0, 1fr);
  gap: 0.9rem;
}

.history-dashboard-card {
  border: 1px solid rgba(51, 65, 85, 0.68);
  border-radius: var(--radius-xl);
  background: linear-gradient(180deg, rgba(15, 23, 42, 0.78), rgba(2, 6, 23, 0.62));
  padding: 0.9rem 1rem;
}

.history-dashboard-card--chart,
.history-dashboard-card--table {
  min-width: 0;
}

.history-dashboard-meta + .history-dashboard-meta {
  margin-top: 0.85rem;
}

.history-dashboard-label {
  display: block;
  margin-bottom: 0.35rem;
  color: var(--color-slate-400);
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
}

.history-dashboard-value {
  color: var(--color-slate-100);
  font-size: 1.25rem;
  font-weight: 700;
}

.history-dashboard-title-row {
  display: flex;
  justify-content: space-between;
  gap: var(--space-3);
  margin-bottom: 0.75rem;
  align-items: baseline;
}

.history-dashboard-title {
  color: var(--color-slate-200);
  font-size: 0.75rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.08em;
}

.history-dashboard-caption {
  color: var(--color-slate-500);
  font-size: 0.75rem;
}

.stats-chart {
  display: flex;
  align-items: flex-end;
  gap: 2px;
  height: 80px;
  /* Viewport-fit: 24 bars never overflow parent card — bars flex down when cramped */
  overflow-x: hidden;
}

.chart-bar {
  background: var(--color-accent);
  flex: 1 1 0;
  min-width: 4px;
  border-radius: 2px 2px 0 0;
  position: relative;
  transition: height 0.3s ease, background-color 0.2s ease;
}

.chart-bar:hover {
  background: var(--color-accent-light);
}

.chart-label {
  position: absolute;
  bottom: -18px;
  left: 50%;
  transform: translateX(-50%);
  font-size: 10px;
  color: var(--color-text-secondary);
}

.history-command-bar,
.history-replay-toolbar {
  display: flex;
  gap: var(--space-2);
  align-items: center;
  flex-wrap: wrap;
}

.history-stats-strip {
  border: 1px solid rgba(51, 65, 85, 0.66);
  border-radius: 0.9rem;
  background: rgba(15, 23, 42, 0.5);
  padding: 0.7rem 0.9rem;
}

.history-list-shell {
  border: 1px solid rgba(51, 65, 85, 0.66);
  border-radius: var(--radius-xl);
  background: rgba(2, 6, 23, 0.42);
  padding: 0.85rem 0.9rem;
}

@media (max-width: 1023px) {
  .asset-dashboard-strip,
  .history-dashboard-grid {
    grid-template-columns: 1fr;
  }
}

@media (min-width: 640px) {
  .settings-primary-grid,
  .settings-secondary-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 639px) {
  .composer-dock {
    top: 0.5rem;
    margin: 0 0 1rem;
  }

  .composer-bar {
    padding: 0.85rem;
  }

  .composer-panel {
    padding: 0.7rem;
  }

  .composer-panel-body {
    min-height: 92px;
    padding: 0.65rem 0.75rem;
  }

  .composer-textarea,
  .composer-preview-box {
    min-height: 92px;
  }

  .composer-footer {
    flex-direction: column;
    align-items: stretch;
    gap: 0.65rem;
  }

  .server-status-stack {
    gap: 0.55rem;
  }

  .server-status-chip {
    width: 100%;
    justify-content: center;
  }

  .site-footer {
    flex-wrap: wrap;
    gap: 0.3rem 0.45rem;
    font-size: 0.75rem;
  }
}

/* ═══════════════════════════════════════════════════════════════════════════
 * Admin Tailwind dark → light flip
 *
 * The admin chrome is now a light theme (var(--admin-bg) #f8fafc). Many admin
 * sub-modules (admin-sounds / admin-webhooks / admin-scheduler / admin-filters
 * etc.) still emit Tailwind utility classes that were written for a dark slate
 * palette. Rewriting every JS module is impractical; instead, scope a CSS
 * override to `.admin-body` that inverts those utilities to light values.
 *
 * This keeps the handoff-bundle Soft Holo palette without touching 16 JS files.
 * ═══════════════════════════════════════════════════════════════════════════ */
.admin-body .text-white { color: var(--admin-text); }
.admin-body .text-slate-100,
.admin-body .text-slate-200,
.admin-body .text-slate-300 { color: var(--admin-text-dim); }
.admin-body .text-slate-400,
.admin-body .text-slate-500 { color: var(--admin-text-dim); }
.admin-body .text-slate-600,
.admin-body .text-slate-700,
.admin-body .text-slate-800,
.admin-body .text-slate-900 { color: var(--admin-text); }

.admin-body .border-slate-600,
.admin-body .border-slate-700,
.admin-body .border-slate-800,
.admin-body .border-slate-900 { border-color: var(--admin-line); }

.admin-body .bg-slate-700,
.admin-body .bg-slate-800,
.admin-body .bg-slate-900,
.admin-body .bg-slate-950 { background-color: var(--admin-raised); }
.admin-body .bg-slate-700\/50,
.admin-body .bg-slate-800\/50,
.admin-body .bg-slate-900\/50 { background-color: var(--admin-panel); }

.admin-body .bg-red-900,
.admin-body .bg-red-900\/30,
.admin-body .bg-rose-900 { background-color: rgba(248, 113, 113, 0.12); }
.admin-body .bg-amber-900,
.admin-body .bg-amber-900\/30 { background-color: rgba(251, 191, 36, 0.14); }
.admin-body .bg-emerald-900,
.admin-body .bg-emerald-900\/30 { background-color: rgba(134, 239, 172, 0.16); }

.admin-body .text-cyan-300,
.admin-body .text-cyan-400,
.admin-body .text-sky-300,
.admin-body .text-sky-400 { color: #0284c7; }
.admin-body .text-rose-300,
.admin-body .text-rose-400 { color: #dc2626; }
.admin-body .text-amber-300,
.admin-body .text-amber-400 { color: #b45309; }
.admin-body .text-emerald-300,
.admin-body .text-emerald-400 { color: #047857; }

/* Inputs inside admin inner pages should match the light chrome */
.admin-body input[type="text"],
.admin-body input[type="number"],
.admin-body input[type="password"],
.admin-body input[type="email"],
.admin-body input[type="url"],
.admin-body input[type="search"],
.admin-body select,
.admin-body textarea {
  background-color: var(--admin-panel);
  color: var(--admin-text);
  border-color: var(--admin-line);
}
.admin-body input::placeholder,
.admin-body textarea::placeholder { color: var(--admin-text-dim); opacity: 0.65; }

/* ─── Admin Assets Library (v5.1 2026-04-27) ──────────────────────────
 * Unified asset overview rendered by admin-assets.js. Stat strip + filter
 * chips + grid + right rail with source-page links. Editing happens on
 * the source pages — clicking an asset card navigates there.
 */
.admin-assets-page { gap: 14px; display: flex; flex-direction: column; }

.admin-assets-statstrip {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 14px;
  padding: 14px;
  background: var(--admin-panel, var(--color-bg-base));
  border: 1px solid var(--hud-line);
  border-radius: 6px;
}
.admin-assets-stat-head {
  display: flex; align-items: baseline; gap: 6px;
  font-size: 11px; color: var(--color-text-muted);
}
.admin-assets-stat-head .en {
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.12em;
  color: var(--color-text-muted); text-transform: uppercase;
}
.admin-assets-stat-val {
  font-family: var(--font-display, var(--font-mono));
  font-size: 26px; font-weight: 600; color: var(--color-text-strong);
  letter-spacing: -0.02em; margin-top: 4px;
}
.admin-assets-stat-val.is-amber { color: var(--color-warning); }
.admin-assets-stat-val.is-cyan  { color: var(--color-primary); }

.admin-assets-filter-row {
  display: flex; gap: 6px; flex-wrap: wrap; align-items: center;
}
.admin-assets-chip {
  padding: 5px 12px; border-radius: 4px; cursor: pointer;
  border: 1px solid var(--hud-line);
  font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.05em;
  color: var(--color-text-muted);
  transition: border-color 120ms, background 120ms, color 120ms;
}
.admin-assets-chip:hover { border-color: var(--hud-line-strong); }
.admin-assets-chip.is-active {
  border-color: var(--color-primary);
  background: var(--hud-cyan-soft);
  color: var(--color-primary);
}
.admin-assets-chip [data-count] {
  font-size: 9px; color: inherit; opacity: 0.75; margin-left: 4px;
}

.admin-assets-grid-wrap {
  display: grid; grid-template-columns: 1fr 320px; gap: 16px;
}
@media (max-width: 1100px) {
  .admin-assets-grid-wrap { grid-template-columns: 1fr; }
}

.admin-assets-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 10px;
  align-content: start;
}
.admin-assets-empty {
  grid-column: 1 / -1;
  padding: 28px 14px; text-align: center;
  font-family: var(--font-mono); font-size: 11px;
  color: var(--color-text-muted); letter-spacing: 0.05em;
  background: var(--admin-panel, var(--color-bg-base));
  border: 1px dashed var(--hud-line); border-radius: 6px;
}

.admin-assets-card {
  display: flex; flex-direction: column; gap: 8px;
  padding: 12px; border-radius: 6px;
  background: var(--admin-panel, var(--color-bg-base));
  border: 1px solid var(--hud-line);
  text-decoration: none; color: inherit;
  transition: border-color 120ms, transform 120ms;
}
.admin-assets-card:hover {
  border-color: var(--color-primary);
  transform: translateY(-1px);
}
.admin-assets-card-head {
  display: flex; align-items: center; gap: 6px;
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.12em;
}
.admin-assets-card-head .kind { font-weight: 700; }
.admin-assets-card-flag {
  margin-left: auto;
  padding: 1px 6px; border-radius: 3px;
  border: 1px solid var(--hud-line);
  font-size: 8px; letter-spacing: 0.1em;
  color: var(--color-text-muted);
  text-transform: uppercase;
}
.admin-assets-card-name {
  font-family: var(--font-mono); font-size: 13px;
  color: var(--color-text-strong);
  word-break: break-all;
}
.admin-assets-card-meta {
  display: flex; align-items: center; gap: 4px;
  font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.05em;
  color: var(--color-text-muted);
}
.admin-assets-card-meta .dot { opacity: 0.55; }

.admin-assets-rail { display: flex; flex-direction: column; gap: 14px; }
.admin-assets-rail-card {
  padding: 14px; border-radius: 6px;
  background: var(--admin-panel, var(--color-bg-base));
  border: 1px solid var(--hud-line);
}

.admin-assets-source-list {
  display: flex; flex-direction: column; gap: 4px; margin-top: 10px;
}
.admin-assets-source {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 10px; border-radius: 4px;
  text-decoration: none; color: inherit;
  border: 1px solid transparent;
  transition: background 120ms, border-color 120ms;
}
.admin-assets-source:hover {
  background: var(--hud-cyan-soft);
  border-color: var(--hud-cyan-line);
}
.admin-assets-source .ico {
  font-size: 14px; width: 18px; text-align: center;
}
.admin-assets-source .lbl { font-size: 13px; color: var(--color-text-strong); }
.admin-assets-source .en {
  margin-left: auto;
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.12em;
  color: var(--color-text-muted);
}
.admin-assets-source .arrow {
  font-family: var(--font-mono); font-size: 11px;
  color: var(--color-text-muted);
}
.admin-assets-source-hint {
  margin-top: 12px; padding-top: 10px;
  border-top: 1px solid var(--hud-line);
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.04em;
  color: var(--color-text-muted); line-height: 1.6;
}

/* ─── Admin Konami easter egg HUD (v5.1 2026-04-27) ───────────────────
 * Bottom-right corner combo indicator. Only visible to the operator —
 * overlay (web danmu screen) has separate freeze+explode animation
 * driven by overlay.js on receiving the WS broadcast.
 */
.admin-konami-hud {
  position: fixed;
  bottom: 20px;
  right: 20px;
  z-index: 9999;
  padding: 10px 14px;
  border-radius: 6px;
  background: rgba(2, 6, 23, 0.92);
  border: 1px solid var(--hud-cyan-line, rgba(56, 189, 248, 0.5));
  box-shadow: 0 0 20px rgba(56, 189, 248, 0.3);
  font-family: var(--font-mono);
  pointer-events: none;
  opacity: 0;
  transform: translateY(8px);
  transition: opacity 150ms, transform 150ms;
}
.admin-konami-hud.is-on {
  opacity: 1;
  transform: translateY(0);
}
.admin-konami-hud-label {
  font-size: 9px;
  letter-spacing: 0.2em;
  color: var(--color-primary);
  font-weight: 700;
  margin-bottom: 6px;
}
.admin-konami-hud-keys {
  display: flex;
  gap: 4px;
  align-items: center;
}
.admin-konami-hud-key {
  width: 18px;
  height: 18px;
  border-radius: 3px;
  border: 1px solid rgba(148, 163, 184, 0.35);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 11px;
  color: rgba(148, 163, 184, 0.7);
  background: rgba(15, 23, 42, 0.6);
  transition: border-color 100ms, color 100ms, background 100ms;
}
.admin-konami-hud-key.is-filled {
  border-color: var(--color-primary);
  color: var(--color-primary);
  background: var(--hud-cyan-soft);
  box-shadow: 0 0 6px rgba(56, 189, 248, 0.4);
}
.admin-konami-hud-progress {
  margin-top: 6px;
  height: 2px;
  width: 0;
  background: var(--color-primary);
  border-radius: 1px;
  transition: width 120ms;
}
@media (prefers-reduced-motion: reduce) {
  .admin-konami-hud { transition: none; }
  .admin-konami-hud-key { transition: none; }
  .admin-konami-hud-progress { transition: none; }
}

/* ─── Admin Extensions Catalog (v5.2 Sprint 1 · 2026-04-27) ─────────
 * Single page replacing .env-only Slido setup. Card grid; Slido card
 * has Fire Token inline UI; others are placeholders ("即將支援").
 * Status dot per card driven by /admin/integrations/sources/recent.
 */
.admin-ext-page { display: flex; flex-direction: column; gap: 14px; }

.admin-ext-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(360px, 1fr));
  gap: 14px;
}

.admin-ext-card {
  display: flex; flex-direction: column; gap: 12px;
  padding: 16px; border-radius: 6px;
  background: var(--admin-panel, var(--color-bg-base));
  border: 1px solid var(--hud-line);
}

.admin-ext-head {
  display: flex; align-items: center; gap: 10px;
}
.admin-ext-status-dot {
  width: 8px; height: 8px; border-radius: 50%;
  background: rgba(148, 163, 184, 0.4);
  flex-shrink: 0;
  transition: background 200ms, box-shadow 200ms;
}
.admin-ext-status-dot.is-live {
  background: #86efac;
  box-shadow: 0 0 8px #86efac, 0 0 16px rgba(132,204,22,0.4);
  animation: hud-pulse 2s ease-in-out infinite;
}
.admin-ext-icon {
  font-size: 22px;
  width: 28px; height: 28px;
  display: inline-flex; align-items: center; justify-content: center;
}
.admin-ext-title {
  flex: 1; min-width: 0;
}
.admin-ext-title .name {
  font-size: 15px; font-weight: 600; color: var(--color-text-strong);
}
.admin-ext-title .meta {
  font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.05em;
  color: var(--color-text-muted); margin-top: 2px;
}
.admin-ext-flag {
  padding: 2px 8px; border-radius: 3px;
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.12em;
  text-transform: uppercase;
}
.admin-ext-flag.is-ready {
  background: var(--hud-cyan-soft);
  color: var(--color-primary);
  border: 1px solid var(--hud-cyan-line, rgba(56,189,248,0.45));
}
.admin-ext-flag.is-soon {
  background: rgba(148,163,184,0.12);
  color: var(--color-text-muted);
  border: 1px solid var(--hud-line);
}

.admin-ext-desc {
  margin: 0;
  font-size: 12px; color: var(--color-text-muted); line-height: 1.6;
}

.admin-ext-install {
  padding: 10px;
  background: var(--color-bg-elevated, var(--color-bg-deep));
  border: 1px solid var(--hud-line);
  border-radius: 4px;
}
.admin-ext-install-steps {
  margin: 8px 0 0 18px;
  padding: 0;
  font-size: 12px; color: var(--color-text-strong);
  line-height: 1.7;
}
.admin-ext-install-steps li { margin-bottom: 4px; }
.admin-ext-step-link {
  color: var(--color-primary); text-decoration: none;
  font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.04em;
}
.admin-ext-step-link:hover { text-decoration: underline; }

.admin-ext-token {
  padding: 12px;
  background: var(--color-bg-deep);
  border: 1px solid var(--hud-cyan-line, rgba(56,189,248,0.35));
  border-radius: 4px;
}
.admin-ext-token-row {
  display: flex; gap: 6px; align-items: center; margin-top: 8px;
}
.admin-ext-token-code {
  flex: 1; min-width: 0;
  padding: 8px 10px; border-radius: 3px;
  background: var(--color-bg-base);
  border: 1px solid var(--hud-line);
  color: var(--color-text-muted);
  font-family: var(--font-mono); font-size: 11px;
  letter-spacing: 0.02em;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.admin-ext-token-code.is-plain {
  color: var(--color-primary);
  background: var(--hud-cyan-soft);
  border-color: var(--color-primary);
  user-select: all;
}
.admin-ext-token-btn {
  padding: 8px 12px; border-radius: 3px;
  border: 1px solid var(--hud-line);
  background: transparent; color: var(--color-text-muted);
  font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.05em;
  cursor: pointer;
  transition: border-color 120ms, color 120ms, background 120ms;
}
.admin-ext-token-btn:hover:not(:disabled) {
  border-color: var(--color-primary);
  color: var(--color-primary);
  background: var(--hud-cyan-soft);
}
.admin-ext-token-btn:disabled {
  opacity: 0.4; cursor: default;
}
.admin-ext-token-btn--danger:hover:not(:disabled) {
  border-color: #f87171;
  color: #f87171;
  background: rgba(248,113,113,0.08);
}
.admin-ext-token-hint {
  margin-top: 8px;
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.04em;
  color: var(--color-text-muted); line-height: 1.6;
}

/* ─── Admin Fire Token deep page (v5.2 Sprint 2 · 2026-04-27) ─────────
 * Per prototype admin-firetoken.jsx. Token card + 24h chart + recent
 * IPs + audit timeline + curl example. Lives at #/firetoken.
 */
.admin-ft-page { display: flex; flex-direction: column; gap: 16px; }

.admin-ft-grid {
  display: grid;
  grid-template-columns: 1fr 360px;
  gap: 16px;
  align-items: start;
}
@media (max-width: 1100px) {
  .admin-ft-grid { grid-template-columns: 1fr; }
}

.admin-ft-main {
  display: flex; flex-direction: column; gap: 14px;
  min-width: 0;
}
.admin-ft-rail {
  display: flex; flex-direction: column; gap: 14px;
}

.admin-ft-card {
  background: var(--admin-panel, var(--color-bg-base));
  border: 1px solid var(--hud-line);
  border-radius: 6px;
  padding: 14px;
}
.admin-ft-card-head {
  display: flex; align-items: center; gap: 10px;
  margin-bottom: 10px;
}
.admin-ft-meta {
  margin-left: auto;
  font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.04em;
  color: var(--color-text-muted);
}

/* Token card */
.admin-ft-token-card {
  background: var(--admin-panel, var(--color-bg-base));
  border: 1px solid var(--hud-cyan-line);
  border-radius: 6px;
  padding: 16px;
}
.admin-ft-token-head {
  display: flex; align-items: center; gap: 12px; margin-bottom: 12px;
}
.admin-ft-token-icon {
  width: 38px; height: 38px; border-radius: 6px;
  background: var(--hud-cyan-soft);
  color: var(--color-primary);
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 18px;
  border: 1px solid var(--hud-cyan-line, rgba(56,189,248,0.45));
}
.admin-ft-token-title { flex: 1; min-width: 0; }
.admin-ft-token-title .name {
  font-size: 14px; font-weight: 600; color: var(--color-text-strong);
}
.admin-ft-token-title .meta {
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-muted);
  margin-top: 2px; letter-spacing: 0.02em;
}
.admin-ft-status {
  font-family: var(--font-mono); font-size: 10px;
  letter-spacing: 0.06em;
}
.admin-ft-status.is-good  { color: #86efac; }
.admin-ft-status.is-warn  { color: var(--color-warning); }
.admin-ft-status.is-muted { color: var(--color-text-muted); }

.admin-ft-token-display {
  padding: 14px;
  background: #000;
  border: 1px solid var(--hud-cyan-line);
  border-radius: 4px;
  display: flex; align-items: center; gap: 10px;
}
.admin-ft-token-code {
  flex: 1; min-width: 0;
  font-family: var(--font-mono); font-size: 13px;
  color: var(--color-text-muted);
  letter-spacing: 0.04em;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.admin-ft-token-code.is-plain {
  color: #86efac;
  user-select: all;
}
.admin-ft-action-btn {
  padding: 6px 12px; border-radius: 3px;
  font-family: var(--font-mono); font-size: 11px;
  letter-spacing: 0.04em;
  cursor: pointer;
  border: 1px solid var(--hud-cyan-line);
  background: var(--hud-cyan-soft);
  color: var(--color-primary);
  white-space: nowrap;
  transition: background 120ms, border-color 120ms;
}
.admin-ft-action-btn:hover:not(:disabled) {
  background: rgba(56, 189, 248, 0.22);
}
.admin-ft-action-btn:disabled { opacity: 0.4; cursor: default; }
.admin-ft-action-btn--warn {
  background: rgba(245, 158, 11, 0.12);
  border-color: rgba(245, 158, 11, 0.5);
  color: var(--color-warning);
}
.admin-ft-action-btn--warn:hover:not(:disabled) { background: rgba(245, 158, 11, 0.22); }
.admin-ft-action-btn--danger {
  background: rgba(248, 113, 113, 0.10);
  border-color: rgba(248, 113, 113, 0.45);
  color: #f87171;
}
.admin-ft-action-btn--danger:hover:not(:disabled) { background: rgba(248, 113, 113, 0.22); }

.admin-ft-token-stats {
  margin-top: 12px;
  padding: 10px 0 0;
  border-top: 1px dashed var(--hud-line);
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px;
  font-family: var(--font-mono); font-size: 10px;
  letter-spacing: 0.02em;
}
.admin-ft-token-stats .kv .k {
  display: block;
  color: var(--color-text-muted);
  font-size: 9px; letter-spacing: 0.08em;
}
.admin-ft-token-stats .kv .v {
  display: block;
  color: var(--color-text-strong);
  font-size: 14px; margin-top: 2px;
  font-weight: 600;
}
.admin-ft-token-stats .v.is-good { color: #86efac; }
.admin-ft-token-stats .v.is-cyan { color: var(--color-primary); }

/* 24h chart */
.admin-ft-chart {
  position: relative; height: 160px;
}
.admin-ft-chart-empty {
  height: 100%; display: flex; align-items: center; justify-content: center;
  font-family: var(--font-mono); font-size: 11px;
  color: var(--color-text-muted);
}
.admin-ft-chart-bars {
  position: absolute; left: 0; right: 0; top: 8px; bottom: 22px;
  display: flex; align-items: flex-end; gap: 2px;
}
.admin-ft-chart-bars .bar {
  flex: 1;
  min-height: 2px;
  background: linear-gradient(180deg, rgba(56, 189, 248, 0.55), rgba(56, 189, 248, 0.20));
  border: 1px solid var(--hud-cyan-line, rgba(56, 189, 248, 0.4));
  border-radius: 2px 2px 0 0;
}
.admin-ft-chart-bars .bar.is-peak {
  background: linear-gradient(180deg, var(--color-warning), var(--color-primary));
  border-color: var(--color-warning);
}
.admin-ft-chart-axis {
  position: absolute; left: 0; right: 0; bottom: 0;
  display: flex; gap: 2px;
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.04em;
  color: var(--color-text-muted);
}
.admin-ft-chart-axis span { flex: 1; text-align: center; }

/* Audit timeline */
.admin-ft-audit { display: flex; flex-direction: column; gap: 4px; }
.admin-ft-audit-empty {
  padding: 12px; text-align: center;
  font-family: var(--font-mono); font-size: 11px;
  color: var(--color-text-muted);
}
.admin-ft-audit-row {
  display: grid; grid-template-columns: 130px 80px 1fr; gap: 10px;
  padding: 6px 4px;
  border-bottom: 1px dashed var(--hud-line);
  font-family: var(--font-mono); font-size: 11px;
}
.admin-ft-audit-row .ts { color: var(--color-text-muted); font-size: 10px; }
.admin-ft-audit-row .kind { font-weight: 600; }
.admin-ft-audit-row .detail { color: var(--color-text-muted); font-size: 10px; }
.admin-ft-audit-row.is-rotated .kind { color: var(--color-primary); }
.admin-ft-audit-row.is-revoked .kind { color: #f87171; }
.admin-ft-audit-row.is-toggled .kind { color: var(--color-warning); }

/* IP list */
.admin-ft-ip-list { display: flex; flex-direction: column; gap: 4px; }
.admin-ft-ip-row {
  display: grid;
  grid-template-columns: minmax(0, 1.4fr) auto minmax(0, 0.7fr) auto auto;
  gap: 6px;
  align-items: center;
  padding: 6px 4px;
  border-bottom: 1px dashed var(--hud-line);
  font-family: var(--font-mono); font-size: 11px;
}
.admin-ft-ip-row .ip {
  color: var(--color-text-strong);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.admin-ft-ip-row .src {
  color: var(--color-primary);
  font-size: 10px; letter-spacing: 0.05em;
}
.admin-ft-ip-row .cnt {
  color: var(--color-text-muted);
  font-size: 10px;
}
.admin-ft-ip-row .when {
  color: var(--color-text-muted);
  font-size: 9px; letter-spacing: 0.04em;
}
.admin-ft-ip-row .tag {
  padding: 1px 5px; border-radius: 3px;
  font-size: 8px; letter-spacing: 0.08em;
  border: 1px solid currentColor;
}
.admin-ft-ip-row .tag.is-top  { color: var(--color-primary); }
.admin-ft-ip-row .tag.is-warn { color: var(--color-warning); }
.admin-ft-ip-row.is-top .ip { color: var(--color-primary); font-weight: 600; }

/* curl card */
.admin-ft-curl-card { background: var(--color-bg-deep); }
.admin-ft-curl {
  margin: 0;
  font-family: var(--font-mono); font-size: 11px;
  color: #86efac;
  letter-spacing: 0.02em;
  white-space: pre-wrap; word-break: break-all;
  background: transparent;
}

/* Rotation hint */
.admin-ft-rotation-card {
  background: rgba(245, 158, 11, 0.06);
  border-color: rgba(245, 158, 11, 0.35);
}
.admin-ft-rotation-body ul {
  margin: 0; padding-left: 18px;
  font-size: 12px; color: var(--color-text-strong); line-height: 1.6;
}
.admin-ft-rotation-body li { margin-bottom: 4px; }

/* sidebar sub-row indent */
.admin-dash-nav-row--sub {
  padding-left: 26px !important;
  opacity: 0.85;
  font-size: 12px !important;
}

.admin-ext-token-deeplink {
  margin-left: auto;
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.06em;
  color: var(--color-primary); text-decoration: none;
  float: right;
}
.admin-ext-token-deeplink:hover { text-decoration: underline; }

/* ─── v5.2 sidebar consolidation (2026-04-27) ────────────────────────── */
/* Tab strip at the top of consolidated routes (history, viewer-config). */
.admin-v2-tabbar {
  display: flex; gap: 6px;
  margin-bottom: 8px;
  padding: 4px;
  background: var(--color-surface);
  border: 1px solid var(--color-border, #1f2937);
  border-radius: 8px;
}
.admin-v2-tab {
  flex: 1;
  padding: 9px 14px;
  font-family: var(--font-mono); font-size: 11px; font-weight: 600;
  letter-spacing: 0.08em;
  color: var(--color-text-muted);
  background: transparent;
  border: 1px solid transparent;
  border-radius: 6px;
  cursor: pointer;
  transition: all 120ms ease;
}
.admin-v2-tab:hover { color: var(--color-text-strong); }
.admin-v2-tab.is-active {
  color: var(--color-primary);
  background: rgba(56, 189, 248, 0.08);
  border-color: rgba(56, 189, 248, 0.35);
  box-shadow: 0 0 0 1px rgba(56, 189, 248, 0.15) inset;
}

/* Strict 1:1 prototype placeholders (2026-04-30):
   only text + boxed controls for missing design artboards. */
.admin-proto-placeholder-box {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-bottom: 8px;
  padding: 10px 12px;
  border-radius: 8px;
  border: 1px dashed var(--color-border, #334155);
  background: var(--color-surface);
}
.admin-proto-placeholder-title {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.08em;
  color: var(--color-text-strong);
}
.admin-proto-placeholder-body {
  font-size: 11px;
  line-height: 1.6;
  color: var(--color-text-muted);
}
.admin-proto-placeholder-actions {
  display: flex;
  gap: 6px;
  flex-wrap: wrap;
}
.admin-proto-placeholder-btn {
  padding: 7px 12px;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.06em;
  border-radius: 4px;
  border: 1px solid var(--color-border, #334155);
  background: transparent;
  color: var(--color-text-muted);
  cursor: pointer;
}
.admin-proto-placeholder-btn.is-active {
  color: var(--color-primary);
  border-color: rgba(56, 189, 248, 0.45);
  background: rgba(56, 189, 248, 0.10);
}

/* BE-blocked controls (strict 1:1 mode):
   render as text+box placeholder, never as clickable actions. */
.admin-be-placeholder-control {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 8px 10px;
  border-radius: 4px;
  border: 1px dashed var(--color-border, #334155);
  background: rgba(15, 23, 42, 0.55);
  color: var(--color-text-muted);
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.05em;
  line-height: 1.5;
  cursor: default;
  user-select: none;
}
.admin-be-placeholder-inline {
  pointer-events: none;
}

/* History tab visibility — 3 tabs: export (v2 picker) / list (v1 detail) /
   replay. body[data-history-tab] drives which pane shows.
   - export tab → only #history-v2-section
   - list tab → only #sec-history (legacy detail viewer)
   - replay tab → only #replay-v2-section
*/
body[data-history-tab="export"] #sec-history { display: none !important; }
body[data-history-tab="export"] #replay-v2-section { display: none !important; }
body[data-history-tab="list"] #history-v2-section { display: none !important; }
body[data-history-tab="list"] #replay-v2-section { display: none !important; }
body[data-history-tab="replay"] #sec-history { display: none !important; }
body[data-history-tab="replay"] #history-v2-section { display: none !important; }

/* History v2 (Timeline Export) page — prototype admin-batch1.jsx:218.
   Mirrors AdminPageShell layout: 1fr 380px grid, two card panes. */
#history-v2-section.history-v2-section {
  background: transparent;
  padding: 0;
  border: none;
  box-shadow: none;
}
.histv2-grid {
  display: grid;
  grid-template-columns: 1fr 380px;
  gap: 16px;
  align-items: start;
}
@media (max-width: 1024px) {
  .histv2-grid { grid-template-columns: 1fr; }
}
.histv2-pane {
  background: var(--color-bg-elevated);
  border: 1px solid var(--hud-line);
  border-radius: 8px;
  padding: 24px;
  overflow: auto;
}
.histv2-recent { padding: 18px; }

.histv2-section-hd {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 1.5px;
  color: var(--color-primary);
  margin: 14px 0 10px;
  text-transform: uppercase;
}
.histv2-section-hd:first-child { margin-top: 0; }

.histv2-chips, .histv2-toggles {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  margin-bottom: 18px;
}
.histv2-chip, .histv2-toggle {
  padding: 8px 14px;
  border: 1px solid var(--hud-line);
  background: transparent;
  color: var(--color-text-primary, #e2e8f0);
  border-radius: 4px;
  font-size: 12px;
  cursor: pointer;
  font-family: inherit;
}
.histv2-chip:hover, .histv2-toggle:hover {
  border-color: rgba(56, 189, 248, 0.4);
}
.histv2-chip.is-active {
  background: var(--hud-cyan-soft);
  border-color: var(--color-primary);
  color: var(--color-primary);
}
.histv2-toggle {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 7px 14px;
}
.histv2-toggle.is-on {
  background: rgba(56, 189, 248, 0.11);
  border-color: var(--color-primary);
  color: var(--color-primary);
}
.histv2-toggle-mark {
  font-family: var(--font-mono);
  font-size: 10px;
}

.histv2-formats {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 10px;
  margin-bottom: 28px;
}
@media (max-width: 600px) {
  .histv2-formats { grid-template-columns: 1fr; }
}
.histv2-fmt {
  position: relative;
  padding: 14px;
  border-radius: 6px;
  background: var(--color-bg-base);
  border: 2px solid var(--hud-line);
  color: var(--color-text-primary, #e2e8f0);
  cursor: pointer;
  text-align: left;
  font-family: inherit;
}
.histv2-fmt:hover { border-color: rgba(56, 189, 248, 0.4); }
.histv2-fmt.is-selected {
  border-color: var(--color-primary);
}
.histv2-fmt.is-selected .histv2-fmt-ext {
  color: var(--color-primary);
}
.histv2-fmt-check {
  position: absolute;
  top: 8px;
  right: 8px;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: var(--color-primary);
  color: #000;
  font-weight: 700;
  font-size: 12px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.histv2-fmt-badge {
  position: absolute;
  top: 8px;
  right: 8px;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1px;
  padding: 2px 6px;
  background: var(--color-warning);
  color: #000;
  border-radius: 3px;
}
.histv2-fmt-ext {
  font-family: var(--font-display, var(--font-sans));
  font-size: 32px;
  font-weight: 700;
  letter-spacing: 1px;
}
.histv2-fmt-desc {
  font-size: 12px;
  color: var(--color-text-secondary);
  margin-top: 6px;
  line-height: 1.5;
  min-height: 48px;
}

.histv2-actions {
  display: flex;
  gap: 12px;
  align-items: center;
  margin-top: 8px;
}
.histv2-go {
  padding: 12px 26px;
  border-radius: 4px;
  border: none;
  background: var(--color-primary);
  color: #000;
  font-family: var(--font-mono);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 1.5px;
  cursor: pointer;
}
.histv2-go:hover { filter: brightness(1.05); }
.histv2-go:disabled { opacity: 0.5; cursor: wait; }
.histv2-estimate {
  font-family: var(--font-mono);
  font-size: 12px;
  color: var(--color-text-secondary);
  letter-spacing: 0.5px;
}

.histv2-recent-hd {
  display: flex;
  align-items: center;
  margin-bottom: 12px;
}
.histv2-recent-label {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 1.5px;
  color: var(--color-text-secondary);
  text-transform: uppercase;
}
.histv2-recent-period {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--color-text-secondary);
}
.histv2-recent-row {
  padding: 10px 12px;
  border-bottom: 1px solid var(--hud-line);
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 12px;
}
.histv2-recent-row:last-child { border-bottom: none; }
.histv2-recent-fmt {
  width: 36px;
  height: 36px;
  border-radius: 4px;
  background: var(--hud-cyan-soft);
  color: var(--color-primary);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.5px;
  flex-shrink: 0;
}
.histv2-recent-meta { flex: 1; min-width: 0; }
.histv2-recent-name {
  color: var(--color-text-primary);
  font-family: var(--font-mono);
  font-size: 12px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.histv2-recent-sub {
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--color-text-secondary);
  letter-spacing: 0.3px;
  margin-top: 2px;
}
.histv2-recent-empty {
  padding: 24px 12px;
  text-align: center;
  font-size: 12px;
  color: var(--color-text-secondary);
}

.histv2-privacy {
  margin-top: 14px;
  padding: 10px 12px;
  background: rgba(251, 191, 36, 0.08);
  border: 1px solid rgba(251, 191, 36, 0.3);
  border-radius: 4px;
  font-size: 11px;
  color: var(--color-text-primary);
  line-height: 1.6;
}
.histv2-privacy-hd {
  color: var(--color-warning);
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 1px;
  margin-bottom: 4px;
}

/* ─── About page (Phase 2 P0-1, 2026-04-27) ──────────────────────────── */
.admin-about-page { padding: 0; }
.admin-about-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 14px;
  align-items: start;
}
@media (max-width: 768px) {
  .admin-about-grid { grid-template-columns: 1fr; }
}
.admin-about-col { display: flex; flex-direction: column; gap: 12px; }

.admin-about-version-card {
  position: relative; overflow: hidden;
  background: var(--color-surface);
  border: 1px solid rgba(56, 189, 248, 0.35);
  border-radius: 8px;
  padding: 22px;
}
.admin-about-version-glow {
  position: absolute; right: -40px; top: -40px;
  width: 240px; height: 240px;
  background: radial-gradient(circle, rgba(56, 189, 248, 0.18), transparent 70%);
  pointer-events: none;
}
.admin-about-version-head { display: flex; align-items: flex-start; gap: 16px; position: relative; z-index: 1; }
.admin-about-version-icon {
  width: 64px; height: 64px;
  display: flex; align-items: center; justify-content: center;
  background: rgba(56, 189, 248, 0.10);
  border: 1px solid rgba(56, 189, 248, 0.35);
  border-radius: 12px;
  color: var(--color-primary);
  font-size: 32px;
}
.admin-about-version-meta { flex: 1; }
.admin-about-version-name {
  font-size: 26px; font-weight: 700;
  color: var(--color-text-strong);
  letter-spacing: 0.5px;
}
.admin-about-version-tag {
  margin-top: 4px;
  font-family: var(--font-mono);
  font-size: 13px; letter-spacing: 0.5px;
  color: var(--color-primary);
}
.admin-about-version-build {
  margin-top: 6px;
  font-family: var(--font-mono);
  font-size: 11px; letter-spacing: 0.3px;
  color: var(--color-text-muted);
}

.admin-about-stats {
  margin-top: 16px;
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px;
  position: relative; z-index: 1;
}
.admin-about-stat {
  padding: 10px;
  background: var(--color-bg);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 3px; min-height: 64px;
  display: flex; flex-direction: column; justify-content: space-between;
}
.admin-about-stat .k {
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 1px; text-transform: uppercase;
  color: var(--color-text-muted);
}
.admin-about-stat .v-row {
  display: flex; align-items: baseline; gap: 6px; margin-top: 6px;
}
.admin-about-stat .vi {
  font-size: 12px; line-height: 1; width: 12px; text-align: left; flex-shrink: 0;
}
.admin-about-stat .v {
  font-size: 16px; font-weight: 600; line-height: 1.1; letter-spacing: 0.2px;
  color: var(--color-text-strong);
}

.admin-about-actions {
  margin-top: 14px;
  display: flex; gap: 6px;
  position: relative; z-index: 1;
}
.admin-about-btn {
  flex: 1;
  padding: 9px 10px;
  text-align: center;
  border: 1px solid var(--color-border, #1f2944);
  background: transparent;
  border-radius: 4px;
  cursor: pointer;
  font-family: var(--font-mono);
  font-size: 11px; letter-spacing: 0.4px;
  color: var(--color-text-strong);
  text-decoration: none;
  transition: all 120ms ease;
}
.admin-about-btn:hover {
  background: var(--hover-tint);
  color: var(--color-primary);
}
.admin-about-btn--accent {
  background: rgba(56, 189, 248, 0.10);
  border-color: rgba(56, 189, 248, 0.45);
  color: var(--color-primary);
}
.admin-about-btn--accent:hover {
  background: rgba(56, 189, 248, 0.18);
}

.admin-about-oss {
  background: var(--color-surface);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 8px;
  padding: 16px;
}
.admin-about-oss-list { margin-top: 10px; font-family: var(--font-mono); font-size: 11px; line-height: 1.7; }
.admin-about-oss-row {
  display: grid; grid-template-columns: 1fr 80px 80px;
  gap: 8px; padding: 4px 0;
  border-bottom: 1px dashed var(--color-border, #1f2944);
}
.admin-about-oss-row:last-child { border-bottom: 0; }
.admin-about-oss-row .n { color: var(--color-text-strong); }
.admin-about-oss-row .v { text-align: right; color: var(--color-text-muted); }
.admin-about-oss-row .l { text-align: right; color: #86efac; }
.admin-about-oss-more {
  display: inline-block; margin-top: 10px;
  font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.3px;
  color: var(--color-primary);
  text-decoration: none;
}
.admin-about-oss-more:hover { text-decoration: underline; }

.admin-about-changelog {
  background: var(--color-surface);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 8px;
  padding: 16px;
  display: flex; flex-direction: column;
}
.admin-about-changelog-head {
  display: flex; align-items: center; gap: 10px;
  margin-bottom: 14px;
}
.admin-about-changelog-more {
  margin-left: auto;
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-primary);
  letter-spacing: 0.4px;
  text-decoration: none;
}
.admin-about-changelog-more:hover { text-decoration: underline; }

.admin-about-cl-entry { margin-bottom: 18px; }
.admin-about-cl-entry:last-of-type { margin-bottom: 0; }
.admin-about-cl-head {
  display: flex; align-items: baseline; gap: 10px; margin-bottom: 8px;
}
.admin-about-cl-head .ver {
  font-family: var(--font-mono); font-size: 16px; font-weight: 700;
  color: var(--color-text-strong);
  letter-spacing: 0.5px;
}
.admin-about-cl-head .cur {
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 1.2px;
  color: var(--color-primary);
  padding: 2px 8px;
  background: rgba(56, 189, 248, 0.12);
  border: 1px solid rgba(56, 189, 248, 0.40);
  border-radius: 2px;
}
.admin-about-cl-head .date {
  margin-left: auto;
  font-family: var(--font-mono); font-size: 11px;
  color: var(--color-text-muted);
  letter-spacing: 0.3px;
}
.admin-about-cl-notes {
  display: flex; flex-direction: column; gap: 4px;
  padding-left: 6px;
  border-left: 2px solid var(--color-border, #1f2944);
}
.admin-about-cl-row {
  display: grid; grid-template-columns: 56px 1fr;
  gap: 8px; padding: 4px 0 4px 8px;
  align-items: start;
}
.admin-about-cl-row .tag {
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 1px;
  text-align: center;
  padding: 2px 4px;
  border-radius: 2px;
}
.admin-about-cl-row .tag-feat { color: #86efac; background: rgba(134, 239, 172, 0.10); border: 1px solid rgba(134, 239, 172, 0.35); }
.admin-about-cl-row .tag-fix  { color: var(--color-primary); background: rgba(56, 189, 248, 0.10); border: 1px solid rgba(56, 189, 248, 0.35); }
.admin-about-cl-row .tag-perf { color: var(--color-warning); background: rgba(251, 191, 36, 0.10); border: 1px solid rgba(251, 191, 36, 0.35); }
.admin-about-cl-row .msg {
  font-size: 12px; line-height: 1.5;
  color: var(--color-text-strong);
  letter-spacing: 0.2px;
}

.admin-about-support {
  margin-top: 16px;
  padding: 12px;
  background: var(--color-bg);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 4px;
  font-family: var(--font-mono); font-size: 11px; line-height: 1.8;
  color: var(--color-text-muted);
}
.admin-about-support .t { color: var(--color-text-strong); margin-bottom: 6px; }
.admin-about-support a {
  display: block;
  color: var(--color-primary);
  text-decoration: none;
}
.admin-about-support a:hover { text-decoration: underline; }

/* ─── Setup Wizard (Phase 2 P0-2, 2026-04-27) ──────────────────────── */
.admin-setup-overlay {
  position: fixed; inset: 0; z-index: 9000;
  background: rgba(5, 9, 16, 0.78);
  backdrop-filter: blur(6px);
  display: flex; align-items: center; justify-content: center;
  padding: 24px;
  animation: hud-fade-in 180ms ease-out;
}
@keyframes hud-fade-in { from { opacity: 0; } to { opacity: 1; } }

.admin-setup-modal {
  width: 100%; max-width: 880px;
  max-height: calc(100vh - 48px);
  display: flex; flex-direction: column;
  background: var(--color-surface);
  border: 1px solid rgba(56, 189, 248, 0.35);
  border-radius: 8px;
  box-shadow: 0 24px 60px rgba(0, 0, 0, 0.55), 0 0 0 1px rgba(56, 189, 248, 0.15);
  overflow: hidden;
}

.admin-setup-head {
  display: flex; align-items: center; gap: 12px;
  padding: 22px 32px;
  border-bottom: 1px solid var(--color-border, #1f2944);
}
.admin-setup-brand-name {
  font-size: 22px; font-weight: 700;
  color: var(--color-text-strong);
  letter-spacing: 0.5px;
}
.admin-setup-brand-sub {
  margin-top: 2px;
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 1.5px;
  color: var(--color-text-muted);
}
.admin-setup-close {
  margin-left: auto;
  width: 32px; height: 32px;
  display: flex; align-items: center; justify-content: center;
  background: transparent;
  border: 1px solid var(--color-border, #1f2944);
  color: var(--color-text-muted);
  border-radius: 4px;
  cursor: pointer;
  font-size: 16px;
}
.admin-setup-close:hover { color: var(--color-text-strong); border-color: var(--color-primary); }

.admin-setup-stepbar {
  display: flex; align-items: center; gap: 0;
  padding: 16px 32px;
  border-bottom: 1px solid var(--color-border, #1f2944);
}
.admin-setup-step {
  display: flex; align-items: center; gap: 10px;
  flex-shrink: 0;
}
.admin-setup-step .bullet {
  width: 26px; height: 26px;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1.5px solid var(--color-border, #1f2944);
  border-radius: 50%;
  font-family: var(--font-mono);
  font-size: 11px; font-weight: 700;
  color: var(--color-text-muted);
  transition: all 160ms ease;
}
.admin-setup-step .lbl {
  font-size: 12px;
  color: var(--color-text-muted);
}
.admin-setup-step.is-active .bullet {
  border-color: var(--color-primary);
  background: rgba(56, 189, 248, 0.10);
  color: var(--color-primary);
}
.admin-setup-step.is-active .lbl {
  color: var(--color-text-strong);
  font-weight: 600;
}
.admin-setup-step.is-done .bullet {
  border-color: var(--color-primary);
  background: var(--color-primary);
  color: #000;
}
.admin-setup-step.is-done .bullet::after { content: "✓"; }
.admin-setup-step.is-done .bullet { font-size: 0; }
.admin-setup-step.is-done .bullet::after { font-size: 11px; }
.admin-setup-step-sep {
  flex: 1;
  height: 1px;
  margin: 0 14px;
  background: var(--color-border, #1f2944);
  min-width: 24px;
  transition: background 160ms ease;
}
.admin-setup-step-sep.is-done {
  background: var(--color-primary);
}

.admin-setup-content {
  flex: 1;
  overflow: auto;
  padding: 32px;
}
.admin-setup-step-pad { max-width: 720px; margin: 0 auto; }
.admin-setup-step-kicker {
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 1.5px;
  color: var(--color-primary);
  margin-bottom: 8px;
}
.admin-setup-step-title {
  margin: 0 0 8px;
  font-size: 24px; font-weight: 600;
  color: var(--color-text-strong);
  line-height: 1.3;
  letter-spacing: 0.3px;
}
.admin-setup-step-desc {
  font-size: 13px; line-height: 1.7;
  color: var(--color-text-muted);
  letter-spacing: 0.2px;
  margin-bottom: 22px;
}
.admin-setup-backend-blocked {
  margin: -6px 0 18px;
  padding: 10px 12px;
  display: flex;
  flex-direction: column;
  gap: 4px;
  border: 1px solid rgba(248, 113, 113, 0.4);
  border-radius: 4px;
  background: rgba(248, 113, 113, 0.08);
  color: #fecaca;
  font-size: 12px;
}
.admin-setup-backend-blocked b {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.5px;
  text-transform: uppercase;
}

/* Theme step */
.admin-setup-theme-grid {
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: 12px;
}
@media (max-width: 720px) {
  .admin-setup-theme-grid { grid-template-columns: repeat(2, 1fr); }
}
.admin-setup-theme-card {
  position: relative;
  padding: 14px;
  border: 2px solid var(--color-border, #1f2944);
  border-radius: 6px;
  background: var(--color-bg);
  cursor: pointer;
  transition: all 140ms ease;
}
.admin-setup-theme-card:hover {
  border-color: rgba(56, 189, 248, 0.55);
  background: rgba(56, 189, 248, 0.04);
}
.admin-setup-theme-card.is-selected {
  border-color: var(--color-primary);
  background: rgba(56, 189, 248, 0.08);
}
.admin-setup-theme-check {
  position: absolute; top: 6px; right: 6px;
  width: 20px; height: 20px;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--color-primary);
  color: #000;
  border-radius: 50%;
  font-size: 11px; font-weight: 700;
}
.admin-setup-theme-swatch {
  height: 60px;
  display: flex; align-items: center; justify-content: center;
  gap: 6px;
  background: #000;
  border-radius: 4px;
  padding: 6px;
  overflow: hidden;
}
.admin-setup-theme-swatch-token {
  font-family: var(--font-display, var(--font-sans));
  font-weight: 700;
  opacity: 0.85;
}
.admin-setup-theme-name {
  margin-top: 10px;
  font-size: 13px; font-weight: 600;
  color: var(--color-text-strong);
}
.admin-setup-theme-sub {
  margin-top: 2px;
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.3px;
  color: var(--color-text-muted);
  min-height: 1em;
}
.admin-setup-theme-empty {
  grid-column: 1 / -1;
  padding: 28px;
  text-align: center;
  font-family: var(--font-mono); font-size: 11px;
  color: var(--color-text-muted);
}

/* Lang step */
.admin-setup-lang-grid {
  display: grid; grid-template-columns: repeat(2, 1fr);
  gap: 10px;
}
@media (max-width: 540px) {
  .admin-setup-lang-grid { grid-template-columns: 1fr; }
}
.admin-setup-lang-card {
  display: flex; align-items: center; gap: 12px;
  padding: 12px 14px;
  border: 2px solid var(--color-border, #1f2944);
  border-radius: 6px;
  background: var(--color-bg);
  cursor: pointer;
  transition: all 140ms ease;
}
.admin-setup-lang-card:hover { border-color: rgba(56, 189, 248, 0.45); }
.admin-setup-lang-card.is-selected {
  border-color: var(--color-primary);
  background: rgba(56, 189, 248, 0.08);
}
.admin-setup-lang-card .lang-key {
  font-family: var(--font-mono);
  font-size: 11px; letter-spacing: 0.5px;
  color: var(--color-text-muted);
}
.admin-setup-lang-card.is-selected .lang-key { color: var(--color-primary); }
.admin-setup-lang-card .lang-meta { flex: 1; }
.admin-setup-lang-card .lang-meta .name { font-size: 13px; font-weight: 600; color: var(--color-text-strong); }
.admin-setup-lang-card .lang-meta .sub {
  margin-top: 2px;
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.3px;
  color: var(--color-text-muted);
}
.admin-setup-lang-card .lang-check { color: var(--color-primary); font-size: 16px; }
.admin-setup-lang-toggle {
  margin-top: 18px;
  padding: 12px;
  background: var(--color-bg);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 4px;
}
.admin-setup-lang-toggle label {
  display: flex; align-items: center; gap: 8px;
  font-size: 12px; color: var(--color-text-strong);
  cursor: pointer;
}
.admin-setup-lang-toggle input { accent-color: var(--color-primary); }

/* Done step */
.admin-setup-done { text-align: center; padding-top: 20px; }
.admin-setup-done-icon {
  width: 72px; height: 72px;
  margin: 0 auto 18px;
  display: flex; align-items: center; justify-content: center;
  background: rgba(56, 189, 248, 0.10);
  border: 1px solid rgba(56, 189, 248, 0.45);
  color: var(--color-primary);
  border-radius: 50%;
  font-size: 32px;
}
.admin-setup-done .admin-setup-step-title { text-align: center; }
.admin-setup-done .admin-setup-step-desc { text-align: center; }
.admin-setup-done-summary {
  display: flex; flex-direction: column; gap: 0;
  max-width: 360px; margin: 18px auto 0;
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 4px;
  overflow: hidden;
}
.admin-setup-done-summary .row {
  display: flex; justify-content: space-between; align-items: center;
  padding: 10px 14px;
  font-size: 12px;
  border-bottom: 1px solid var(--color-border, #1f2944);
}
.admin-setup-done-summary .row:last-child { border-bottom: 0; }
.admin-setup-done-summary .k { color: var(--color-text-muted); font-family: var(--font-mono); letter-spacing: 0.3px; }
.admin-setup-done-summary .v { color: var(--color-text-strong); font-weight: 600; }
.admin-setup-done-tip {
  margin-top: 18px;
  font-size: 11px; line-height: 1.7;
  color: var(--color-text-muted);
}

/* ── Password step (P0-2 expansion, 2026-04-29) ── */
.admin-setup-pw-form {
  display: flex; flex-direction: column; gap: 16px;
  max-width: 360px;
}
.admin-setup-field {
  display: flex; flex-direction: column; gap: 6px;
}
.admin-setup-field-label {
  font-family: var(--font-mono); font-size: 10px;
  letter-spacing: 0.8px; font-weight: 600;
  color: var(--color-text-muted);
  text-transform: uppercase;
}
.admin-setup-input {
  width: 100%;
  padding: 9px 12px;
  background: var(--color-bg);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 4px;
  color: var(--color-text-strong);
  font-family: inherit; font-size: 13px;
  transition: border-color 120ms ease;
  box-sizing: border-box;
}
.admin-setup-input:focus {
  outline: none;
  border-color: var(--color-primary);
}
.admin-setup-input.is-error {
  border-color: var(--color-danger, #f87171);
}
.admin-setup-field-err {
  font-size: 11px;
  color: var(--color-danger, #f87171);
  line-height: 1.4;
}
.admin-setup-pw-strength {
  height: 3px;
  border-radius: 2px;
  background: var(--color-border, #1f2944);
  margin-top: 4px;
  overflow: hidden;
}
.admin-setup-pw-strength-bar {
  height: 100%;
  border-radius: 2px;
  transition: width 200ms ease, background 200ms ease;
}
.admin-setup-note {
  font-size: 11px; line-height: 1.6;
  color: var(--color-text-muted);
  padding: 10px 12px;
  background: var(--color-bg);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 3px;
}

/* ── Logo step (P0-2 expansion, 2026-04-29) ── */
.admin-setup-logo-grid {
  display: grid;
  grid-template-columns: 1fr 180px;
  gap: 16px;
  align-items: start;
}
@media (max-width: 600px) {
  .admin-setup-logo-grid { grid-template-columns: 1fr; }
}
.admin-setup-dropzone {
  display: flex; flex-direction: column;
  align-items: center; justify-content: center;
  gap: 10px;
  padding: 28px 16px;
  border: 2px dashed var(--color-border, #1f2944);
  border-radius: 6px;
  background: var(--color-bg);
  cursor: pointer;
  transition: border-color 140ms ease, background 140ms ease;
  text-align: center;
  min-height: 120px;
}
.admin-setup-dropzone:hover,
.admin-setup-dropzone.is-drag-over {
  border-color: var(--color-primary);
  background: rgba(56, 189, 248, 0.04);
}
.admin-setup-dropzone .icon {
  font-size: 28px;
  color: var(--color-text-muted);
}
.admin-setup-dropzone .lbl {
  font-size: 12px;
  color: var(--color-text-muted);
  line-height: 1.5;
}
.admin-setup-file-btn {
  display: inline-block;
  padding: 6px 14px;
  background: transparent;
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 3px;
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-muted);
  cursor: pointer;
  letter-spacing: 0.3px;
  transition: all 120ms ease;
}
.admin-setup-file-btn:hover {
  color: var(--color-primary);
  border-color: rgba(56, 189, 248, 0.40);
}
.admin-setup-logo-preview-panel {
  display: flex; flex-direction: column;
  align-items: center; justify-content: center;
  gap: 10px;
  min-height: 120px;
  padding: 12px;
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 6px;
  background: var(--color-bg);
}
.admin-setup-logo-preview-img {
  max-width: 100%; max-height: 80px;
  object-fit: contain;
  border-radius: 2px;
}
.admin-setup-logo-remove {
  padding: 4px 10px;
  background: transparent;
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 2px;
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-danger, #f87171);
  cursor: pointer;
  letter-spacing: 0.3px;
  transition: all 120ms ease;
}
.admin-setup-logo-remove:hover {
  border-color: var(--color-danger, #f87171);
  background: rgba(248, 113, 113, 0.08);
}

/* Footer */
.admin-setup-foot {
  display: flex; align-items: center; gap: 8px;
  padding: 14px 32px;
  border-top: 1px solid var(--color-border, #1f2944);
  background: rgba(0, 0, 0, 0.15);
}
.admin-setup-foot-meta {
  font-family: var(--font-mono); font-size: 11px;
  color: var(--color-text-muted);
  letter-spacing: 0.4px;
  margin-left: 8px;
}
.admin-setup-foot-spacer { flex: 1; }
.admin-setup-foot-btn {
  padding: 9px 16px;
  border-radius: 4px;
  font-family: var(--font-mono); font-size: 11px;
  letter-spacing: 0.4px; font-weight: 600;
  cursor: pointer;
  transition: all 140ms ease;
}
.admin-setup-foot-btn:disabled { opacity: 0.4; cursor: not-allowed; }
.admin-setup-foot-btn--ghost {
  background: transparent;
  border: 1px solid var(--color-border, #1f2944);
  color: var(--color-text-muted);
}
.admin-setup-foot-btn--ghost:hover:not(:disabled) {
  color: var(--color-text-strong);
  border-color: var(--color-primary);
}
.admin-setup-foot-btn--primary {
  background: var(--color-primary);
  border: 1px solid var(--color-primary);
  color: #000;
}
.admin-setup-foot-btn--primary:hover:not(:disabled) {
  background: #5fc8ff;
}

body[data-setup-wizard-open="1"] { overflow: hidden; }

/* ─── Poll Deep-Dive (Phase 2 P0-3, 2026-04-27) ────────────────────── */
.admin-poll-deeplink {
  margin-left: 12px;
  font-family: var(--font-mono);
  font-size: 11px; letter-spacing: 0.4px;
  color: var(--color-primary);
  text-decoration: none;
  vertical-align: middle;
}
.admin-poll-deeplink:hover { text-decoration: underline; }

.admin-pdd-page { padding: 0; }
.admin-pdd-grid {
  display: grid;
  grid-template-columns: 1.4fr 1fr;
  gap: 14px;
  align-items: start;
}
@media (max-width: 880px) {
  .admin-pdd-grid { grid-template-columns: 1fr; }
}

.admin-pdd-main, .admin-pdd-aside {
  display: flex; flex-direction: column; gap: 12px;
  min-width: 0;
}

.admin-pdd-card {
  background: var(--color-surface);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 8px;
  padding: 16px;
}

.admin-pdd-back {
  margin-left: 8px;
  color: var(--color-primary);
  text-decoration: none;
  font-family: var(--font-mono); font-size: 11px;
}
.admin-pdd-back:hover { text-decoration: underline; }

.admin-pdd-loading {
  grid-column: 1 / -1;
  padding: 40px 20px;
  text-align: center;
  font-family: var(--font-mono); font-size: 12px;
  color: var(--color-text-muted);
}

.admin-pdd-empty {
  grid-column: 1 / -1;
  padding: 60px 20px;
  text-align: center;
  background: var(--color-surface);
  border: 1px dashed var(--color-border, #1f2944);
  border-radius: 8px;
}
.admin-pdd-empty-icon { font-size: 48px; color: var(--color-text-muted); margin-bottom: 14px; }
.admin-pdd-empty-title { font-size: 16px; font-weight: 600; color: var(--color-text-strong); }
.admin-pdd-empty-desc { margin: 8px auto 16px; font-size: 12px; color: var(--color-text-muted); max-width: 380px; line-height: 1.6; }
.admin-pdd-empty-action {
  display: inline-block;
  padding: 9px 18px;
  background: rgba(56, 189, 248, 0.10);
  border: 1px solid rgba(56, 189, 248, 0.45);
  color: var(--color-primary);
  border-radius: 4px;
  font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.4px;
  text-decoration: none;
}
.admin-pdd-empty-action:hover { background: rgba(56, 189, 248, 0.18); }

/* Header card */
.admin-pdd-header-meta {
  display: flex; align-items: center; gap: 10px; margin-bottom: 8px;
}
.admin-pdd-chip {
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 1.2px;
  padding: 2px 8px;
  border-radius: 2px;
}
.admin-pdd-chip.is-live  { color: #86efac; background: rgba(134, 239, 172, 0.10); border: 1px solid rgba(134, 239, 172, 0.40); }
.admin-pdd-chip.is-ended { color: #86efac; background: rgba(134, 239, 172, 0.10); border: 1px solid rgba(134, 239, 172, 0.40); }
.admin-pdd-chip.is-idle  { color: var(--color-text-muted); background: var(--color-bg); border: 1px solid var(--color-border, #1f2944); }
.admin-pdd-id {
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-muted);
  letter-spacing: 0.3px;
}
.admin-pdd-question {
  font-size: 18px; font-weight: 600;
  color: var(--color-text-strong);
  letter-spacing: 0.2px;
  margin-bottom: 12px;
  line-height: 1.4;
}
.admin-pdd-kpis {
  display: grid; grid-template-columns: repeat(4, 1fr);
  gap: 12px;
  padding-top: 10px;
  border-top: 1px dashed var(--color-border, #1f2944);
}
@media (max-width: 600px) {
  .admin-pdd-kpis { grid-template-columns: repeat(2, 1fr); }
}
.admin-pdd-kpi .k {
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 1.2px;
  color: var(--color-text-muted);
}
.admin-pdd-kpi .v {
  margin-top: 2px;
  font-size: 20px; font-weight: 600;
  color: var(--color-text-strong);
}
.admin-pdd-kpi .sub {
  margin-top: 2px;
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.4px;
  color: var(--color-text-muted);
}

/* Distribution rows */
.admin-pdd-rows { display: flex; flex-direction: column; gap: 12px; margin-top: 10px; }
.admin-pdd-row-head {
  display: flex; align-items: baseline;
  gap: 8px; margin-bottom: 4px;
}
.admin-pdd-row-head .lbl { font-size: 13px; font-weight: 600; color: var(--color-text-strong); }
.admin-pdd-row-head .votes { margin-left: auto; font-family: var(--font-mono); font-size: 11px; color: var(--color-text-muted); letter-spacing: 0.3px; }
.admin-pdd-row-head .pct { margin-left: 12px; font-family: var(--font-mono); font-size: 15px; font-weight: 600; }
.admin-pdd-row-bar {
  height: 8px;
  background: var(--color-bg);
  border-radius: 2px;
  overflow: hidden;
}
.admin-pdd-row-fill { height: 100%; transition: width 240ms ease; }
.admin-pdd-empty-rows {
  padding: 20px;
  text-align: center;
  font-family: var(--font-mono); font-size: 11px;
  color: var(--color-text-muted);
}

/* Sentiment Index + vs 上次 row (G8) */
.admin-pdd-sentiment-row {
  margin-top: 14px;
  display: grid; grid-template-columns: repeat(2, 1fr);
  gap: 10px;
}
.admin-pdd-sentiment-tile {
  padding: 12px;
  background: var(--color-bg);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 4px;
}
.admin-pdd-sentiment-tile.is-placeholder { opacity: 0.55; }
.admin-pdd-sentiment-tile .k {
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 1.2px;
  color: var(--color-text-muted);
}
.admin-pdd-sentiment-tile .v {
  margin-top: 4px;
  font-size: 28px; font-weight: 600;
  color: var(--color-text-strong);
  letter-spacing: 0.3px;
}
.admin-pdd-sentiment-tile .sub {
  margin-top: 4px;
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.4px;
  color: var(--color-text-muted);
}

/* Placeholder card (geo / timeline) */
.admin-pdd-placeholder { opacity: 0.85; }
.admin-pdd-placeholder-body {
  display: flex; gap: 12px; align-items: flex-start;
  margin-top: 10px;
  padding: 14px;
  background: var(--color-bg);
  border: 1px dashed var(--color-border, #1f2944);
  border-radius: 4px;
}
.admin-pdd-placeholder-icon {
  font-size: 24px; color: var(--color-text-muted);
  flex-shrink: 0;
}
.admin-pdd-placeholder-text .t {
  font-size: 12px; font-weight: 600;
  color: var(--color-text-strong);
}
.admin-pdd-placeholder-text .s {
  margin-top: 4px;
  font-size: 11px; line-height: 1.6;
  color: var(--color-text-muted);
}
.admin-pdd-placeholder-text a {
  color: var(--color-primary);
  text-decoration: none;
}
.admin-pdd-placeholder-text a:hover { text-decoration: underline; }

/* Integrity */
.admin-pdd-integrity { display: flex; flex-direction: column; gap: 6px; margin-top: 10px; }
.admin-pdd-integrity .row {
  display: grid; grid-template-columns: 12px 1fr auto;
  gap: 8px; align-items: center;
  padding: 8px 10px;
  background: var(--color-bg);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 3px;
}
.admin-pdd-integrity .dot {
  width: 8px; height: 8px; border-radius: 50%;
}
.admin-pdd-integrity .dot.is-good { background: #86efac; }
.admin-pdd-integrity .dot.is-warn { background: var(--color-warning); }
.admin-pdd-integrity .meta .t {
  font-size: 11px; color: var(--color-text-strong);
  letter-spacing: 0.3px;
}
.admin-pdd-integrity .meta .s {
  margin-top: 1px;
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-muted);
  letter-spacing: 0.3px;
}
.admin-pdd-integrity .v {
  font-family: var(--font-mono); font-size: 11px; font-weight: 600;
}
.admin-pdd-integrity .v.is-good { color: #86efac; }
.admin-pdd-integrity .v.is-warn { color: var(--color-warning); }

/* Actions */
.admin-pdd-actions {
  display: flex; flex-direction: column; gap: 6px;
}
.admin-pdd-action {
  width: 100%; padding: 9px 12px;
  background: transparent;
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 3px;
  font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.4px;
  color: var(--color-text-strong);
  text-align: center;
  cursor: pointer;
  text-decoration: none;
  transition: all 140ms ease;
}
.admin-pdd-action:hover {
  border-color: var(--color-primary);
  color: var(--color-primary);
}
.admin-pdd-action--primary {
  background: rgba(56, 189, 248, 0.10);
  border-color: rgba(56, 189, 248, 0.45);
  color: var(--color-primary);
}
.admin-pdd-action--ghost { color: var(--color-text-muted); }

/* ─── Admin Help Drawer (F1) — design v4 follow-up 2026-05-18 ──────
   Slide-in right-side panel with contextual help per route. Triggered
   by F1 / `?` keystroke. See admin-help-drawer.js. */
.admin-help {
  position: fixed; inset: 0; z-index: 9200;
  display: flex; justify-content: flex-end;
  pointer-events: none;
  font-family: var(--font-sans);
}
.admin-help__backdrop {
  position: absolute; inset: 0;
  background: rgba(5, 9, 16, 0.50);
  pointer-events: auto;
  animation: hud-fade-in 160ms ease-out;
}
.admin-help__drawer {
  position: relative;
  width: 100%; max-width: 460px;
  height: 100vh; height: 100dvh;
  background: var(--hud-bg1);
  color: var(--color-text-strong);
  border-left: 2px solid var(--color-primary);
  box-shadow: -16px 0 40px rgba(0, 0, 0, 0.5);
  display: flex; flex-direction: column;
  pointer-events: auto;
  animation: admin-help-slide 220ms cubic-bezier(0.32, 1.2, 0.34, 1);
}
@keyframes admin-help-slide {
  from { transform: translateX(100%); }
  to   { transform: translateX(0); }
}

.admin-help__head {
  display: flex; align-items: center; gap: 10px;
  padding: 16px 20px;
  border-bottom: 1px solid var(--hud-line);
}
.admin-help__title {
  font-size: 16px; font-weight: 600;
  color: var(--color-text-strong);
}
.admin-help__subtitle {
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 1.5px;
  color: var(--color-primary);
  margin-top: 2px;
}
.admin-help__spacer { flex: 1; }
.admin-help__close {
  background: transparent; border: none; cursor: pointer;
  color: var(--color-text-muted);
  font-size: 16px; padding: 4px 8px;
}
.admin-help__close:hover { color: var(--color-text-primary); }

.admin-help__body {
  flex: 1; overflow: auto;
  padding: 16px 20px;
  display: flex; flex-direction: column; gap: 22px;
}
.admin-help__section { display: flex; flex-direction: column; gap: 10px; }
.admin-help__sec-label {
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 1.5px;
  color: var(--color-text-muted);
  text-transform: uppercase;
}
.admin-help__row {
  display: flex; align-items: flex-start; gap: 12px;
  padding: 8px 0;
  border-bottom: 1px solid rgba(148, 163, 184, 0.10);
}
.admin-help__row:last-child { border-bottom: none; }
.admin-help__keys {
  display: flex; gap: 4px; flex-shrink: 0;
  min-width: 90px;
}
.admin-help__kbd {
  padding: 2px 7px; border-radius: 3px;
  background: var(--hud-bg2);
  border: 1px solid rgba(148, 163, 184, 0.30);
  font-family: var(--font-mono);
  font-size: 10px; font-weight: 600;
  color: var(--color-text-primary);
  letter-spacing: 0.3px;
  line-height: 1.2;
}
.admin-help__desc {
  flex: 1; min-width: 0;
  font-size: 12px; line-height: 1.6;
  color: var(--color-text-secondary);
}
.admin-help__desc b {
  color: var(--color-text-strong);
  font-weight: 600;
}

.admin-help__foot {
  display: flex; align-items: center; gap: 8px;
  padding: 12px 20px;
  border-top: 1px solid var(--hud-line);
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--color-text-muted);
}
.admin-help__more {
  margin-left: auto;
  color: var(--color-primary);
  text-decoration: none;
}
.admin-help__more:hover { text-decoration: underline; }

@media (max-width: 600px) {
  .admin-help__drawer {
    max-width: 100%;
    height: 88vh; height: 88dvh;
    align-self: flex-end;
    border-left: none;
    border-top: 2px solid var(--color-primary);
    border-radius: 16px 16px 0 0;
    animation: admin-help-slide-up 220ms cubic-bezier(0.32, 1.2, 0.34, 1);
  }
  @keyframes admin-help-slide-up {
    from { transform: translateY(100%); }
    to   { transform: translateY(0); }
  }
  .admin-help { align-items: flex-end; }
}

@media (prefers-reduced-motion: reduce) {
  .admin-help__drawer, .admin-help__backdrop { animation: none; }
}

/* ─── Admin WS Reconnect Banner (design v4-r6 2026-05-18) ──────────
   Sticky 36px strip rendered at body-top by admin-reconnect-banner.js.
   Two states (amber RECONNECTING / crimson CONNECTION LOST) keyed by
   data-state. Page body acquires .admin-rcb-active for a soft dim. */
.admin-rcb {
  position: sticky; top: 0; z-index: 9080;
  height: 36px;
  display: flex; align-items: center; gap: 10px;
  padding: 0 16px;
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.5px;
}
.admin-rcb--amber {
  background: rgba(251, 191, 36, 0.08);
  border-bottom: 1px solid rgba(251, 191, 36, 0.27);
  color: var(--color-warning);
}
.admin-rcb--crimson {
  background: rgba(255, 77, 79, 0.08);
  border-bottom: 1px solid rgba(255, 77, 79, 0.27);
  color: var(--color-danger);
}
.admin-rcb__dot {
  width: 7px; height: 7px; border-radius: 50%;
  background: currentColor;
  animation: hud-pulse 1.2s ease-in-out infinite;
  flex-shrink: 0;
}
.admin-rcb__dot--static { animation: none; }
.admin-rcb__label {
  font-weight: 700; letter-spacing: 1.5px;
  color: currentColor;
}
.admin-rcb__sep { color: var(--color-text-muted); }
.admin-rcb__countdown { color: currentColor; }
.admin-rcb__attempt,
.admin-rcb__hint { color: var(--color-text-muted); }
.admin-rcb__progress {
  width: 60px; height: 3px; border-radius: 2px;
  background: var(--color-bg-elevated, #182239);
  overflow: hidden;
}
.admin-rcb__progress-fill {
  height: 100%;
  background: currentColor;
  border-radius: 2px;
  transition: width 0.25s linear;
}
.admin-rcb__spacer { flex: 1; }
.admin-rcb__btn {
  padding: 3px 10px; border-radius: 3px; cursor: pointer;
  font-family: inherit; font-size: 9px; letter-spacing: 0.5px;
  background: transparent;
}
.admin-rcb__btn--ghost {
  border: 1px solid rgba(148, 163, 184, 0.30);
  color: var(--color-text-muted);
}
.admin-rcb__btn--ghost:hover { color: var(--color-text-primary); }
.admin-rcb__btn--retry {
  border: 1px solid currentColor;
  color: var(--color-danger);
  font-weight: 700;
}
.admin-rcb__close {
  background: transparent; border: none; cursor: pointer;
  color: var(--color-text-muted);
  font-size: 13px; padding: 2px 6px;
}
.admin-rcb__close:hover { color: var(--color-text-primary); }

body.admin-rcb-active .admin-app-shell { opacity: 0.7; transition: opacity 0.3s; }
body.admin-rcb-exhausted .admin-app-shell { opacity: 0.3; }

@media (prefers-reduced-motion: reduce) {
  .admin-rcb__dot { animation: none; }
  .admin-rcb__progress-fill { transition: none; }
  body.admin-rcb-active .admin-app-shell { transition: none; }
}


/* ─── Viewer Extended Offline modal (design v4-r6 ViewerExtendedOffline)
   Mounts on top of the bottom offline-banner when offline > 60s.
   Built by main.js _ensureExtendedOffline(). */
.admin-eoff {
  position: fixed; inset: 0; z-index: 9070;
  display: flex; align-items: center; justify-content: center;
  background: rgba(5, 9, 16, 0.65);
  padding: 16px;
}
.admin-eoff__card {
  width: 300px; max-width: 100%;
  padding: 32px 24px; text-align: center;
  background: var(--hud-bg1);
  border: 1px solid rgba(255, 77, 79, 0.21);
  border-radius: 12px;
  box-shadow: 0 12px 48px rgba(0, 0, 0, 0.6);
}
.admin-eoff__icon {
  width: 56px; height: 56px; margin: 0 auto;
  border-radius: 12px;
  background: rgba(255, 77, 79, 0.05);
  border: 1px solid rgba(255, 77, 79, 0.15);
  display: flex; align-items: center; justify-content: center;
  font-size: 24px;
  color: var(--color-danger);
}
.admin-eoff__title {
  font-size: 16px; font-weight: 600; margin-top: 14px;
  color: var(--color-text-primary);
}
.admin-eoff__sub {
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 1px;
  color: var(--color-danger);
  margin-top: 6px;
}
.admin-eoff__desc {
  font-size: 11px; line-height: 1.6;
  color: var(--color-text-muted);
  margin-top: 10px;
}
.admin-eoff__queue {
  margin-top: 14px; padding: 8px 10px; border-radius: 6px;
  background: rgba(251, 191, 36, 0.05);
  border: 1px solid rgba(251, 191, 36, 0.15);
  text-align: left;
}
.admin-eoff__queue-label {
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 0.5px;
  color: var(--color-warning);
  margin-bottom: 4px;
}
.admin-eoff__queue-text {
  font-size: 11px;
  color: var(--color-text-primary);
  word-break: break-word;
}
.admin-eoff__queue-foot {
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 0.3px;
  color: var(--color-text-muted);
  margin-top: 3px;
}
.admin-eoff__retry {
  width: 100%; margin-top: 16px;
  padding: 10px 24px; border-radius: 6px; cursor: pointer;
  border: 1px solid var(--color-danger);
  background: var(--color-danger);
  color: #fff;
  font-family: var(--font-mono);
  font-size: 11px; font-weight: 700; letter-spacing: 1.5px;
}
.admin-eoff__retry:hover { filter: brightness(1.05); }
.admin-eoff__home {
  display: inline-block; margin-top: 10px;
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 0.5px;
  color: var(--color-text-muted);
  text-decoration: none;
}
.admin-eoff__home:hover { text-decoration: underline; }


/* ─── Overlay Silent Mode (design v4-r6 OverlaySilentMode) ──────────
   Full-screen chrome that takes over the overlay after 3 failed WS
   reconnect attempts. Concentric pulsing rings + dim Danmu Fire brand
   + attempt counter + last-connected + target WS URL. */
.overlay-silent {
  position: fixed; inset: 0; z-index: 9090;
  background: #000;
  color: var(--color-text-primary);
  font-family: var(--font-ui, system-ui);
  overflow: hidden;
}
.overlay-silent::before {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  opacity: 0.025;
  background-image: repeating-linear-gradient(0deg,
    rgba(255, 255, 255, 0.10) 0,
    rgba(255, 255, 255, 0.10) 1px,
    transparent 1px,
    transparent 3px);
}
.overlay-silent::after {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  opacity: 0.04;
  background-image:
    linear-gradient(rgba(56, 189, 248, 0.45) 1px, transparent 1px),
    linear-gradient(90deg, rgba(56, 189, 248, 0.45) 1px, transparent 1px);
  background-size: 64px 64px;
  mask-image: radial-gradient(ellipse at 50% 50%, #000 0%, transparent 60%);
  -webkit-mask-image: radial-gradient(ellipse at 50% 50%, #000 0%, transparent 60%);
}
.overlay-silent__chrome {
  position: absolute; top: 16px; left: 20px; right: 20px;
  display: flex; align-items: center; gap: 12px;
}
.overlay-silent__brand {
  font-family: var(--font-display);
  font-size: 20px;
  color: rgba(125, 211, 252, 0.21);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
.overlay-silent__mode {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 1.5px;
  color: rgba(148, 163, 184, 0.33);
}
.overlay-silent__pill {
  padding: 4px 12px; border-radius: 4px;
  background: rgba(255, 77, 79, 0.08);
  border: 1px solid rgba(255, 77, 79, 0.15);
  font-family: var(--font-mono);
  font-size: 9px;
  color: rgba(255, 77, 79, 0.67);
  letter-spacing: 1px;
  display: flex; align-items: center; gap: 6px;
}
.overlay-silent__pill-dot {
  width: 6px; height: 6px; border-radius: 50%;
  background: rgba(255, 77, 79, 0.53);
  animation: hud-pulse 1.5s ease-in-out infinite;
}
.overlay-silent__center {
  position: absolute; top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  text-align: center;
}
.overlay-silent__ring {
  border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  margin: 0 auto;
}
.overlay-silent__ring--outer {
  width: 80px; height: 80px;
  border: 2px solid rgba(255, 77, 79, 0.21);
}
.overlay-silent__ring--inner {
  width: 48px; height: 48px;
  border: 1.5px solid rgba(255, 77, 79, 0.33);
}
.overlay-silent__core {
  width: 12px; height: 12px; border-radius: 50%;
  background: rgba(255, 77, 79, 0.40);
  animation: hud-pulse 1.5s ease-in-out infinite;
}
.overlay-silent__title {
  font-size: 14px; font-weight: 600; margin-top: 20px;
  color: rgba(241, 245, 249, 0.33);
}
.overlay-silent__sub {
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.5px; margin-top: 6px;
  color: rgba(148, 163, 184, 0.33);
}
.overlay-silent__note {
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 1.2px;
  color: rgba(148, 163, 184, 0.27);
  margin-top: 10px;
}
.overlay-silent__attempt {
  display: inline-flex; align-items: center; gap: 6px;
  margin-top: 16px;
  padding: 4px 14px; border-radius: 999px;
  background: rgba(24, 34, 57, 0.53);
  border: 1px solid rgba(148, 163, 184, 0.18);
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 0.5px;
  color: rgba(148, 163, 184, 0.40);
}
.overlay-silent__last,
.overlay-silent__target {
  position: absolute; bottom: 16px;
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 0.5px;
  color: rgba(148, 163, 184, 0.20);
}
.overlay-silent__last { left: 20px; }
.overlay-silent__target { right: 20px; }
@media (prefers-reduced-motion: reduce) {
  .overlay-silent__pill-dot,
  .overlay-silent__core { animation: none; }
}


/* ─── Dropzone 3-state (design v4-r6 DropzoneStates) ────────────────
   Lifts admin-emojis upload zone to the documented spec.
   Resting: 1.5px dashed line + bg2 + ↑ dim
   Hover  : 2px dashed cyan + cyan@0c + ↓ cyan + glow 22 + scale
   Drop   : 2px solid cyan + cyan@08 + ⟳ pulse + glow 30 + spinner */
.admin-em-v4__upzone {
  transition: border-color 200ms, background-color 200ms, box-shadow 200ms;
}
.admin-em-v4__upzone.is-dragover {
  border-style: dashed;
  border-width: 2px;
  border-color: var(--color-primary);
  background: rgba(56, 189, 248, 0.05);
  box-shadow: 0 0 24px rgba(56, 189, 248, 0.13), inset 0 0 48px rgba(56, 189, 248, 0.03);
}
.admin-em-v4__upzone.is-dragover .admin-em-v4__upicon {
  color: var(--color-primary);
  border-color: rgba(56, 189, 248, 0.33);
  background: rgba(56, 189, 248, 0.07);
}
.admin-em-v4__upzone.is-dragover .admin-em-v4__uptitle::after {
  content: " · 放開以上傳";
  color: var(--color-primary);
  font-weight: 600;
}

.admin-em-v4__upzone.is-dropping {
  border-style: solid;
  border-width: 2px;
  border-color: var(--color-primary);
  background: rgba(56, 189, 248, 0.03);
  box-shadow: 0 0 32px rgba(56, 189, 248, 0.19);
  animation: dropzone-drop-pulse 1s ease-in-out infinite;
}
.admin-em-v4__upzone.is-dropping .admin-em-v4__upicon {
  position: relative;
  color: var(--color-primary);
  background: rgba(56, 189, 248, 0.05);
  border-color: rgba(56, 189, 248, 0.33);
}
.admin-em-v4__upzone.is-dropping .admin-em-v4__upicon::before {
  content: "";
  position: absolute; inset: -4px;
  border-radius: inherit;
  border: 2px solid rgba(56, 189, 248, 0.20);
  border-top-color: var(--color-primary);
  animation: dropzone-spin 0.8s linear infinite;
}
.admin-em-v4__upzone.is-dropping .admin-em-v4__uptitle::after {
  content: " · 處理中...";
  color: var(--color-primary);
}

@keyframes dropzone-drop-pulse {
  0%, 100% { box-shadow: 0 0 32px rgba(56, 189, 248, 0.19); }
  50%      { box-shadow: 0 0 48px rgba(56, 189, 248, 0.33); }
}
@keyframes dropzone-spin {
  to { transform: rotate(360deg); }
}
@media (prefers-reduced-motion: reduce) {
  .admin-em-v4__upzone.is-dropping { animation: none; }
  .admin-em-v4__upzone.is-dropping .admin-em-v4__upicon::before { animation: none; }
}


/* ─── Error Pages (design v4-r5 admin-errors.jsx 2026-05-18) ────────
   Full-screen states for HTTP 500 / 502 / 503 — viewer or admin
   surfaces depending on which path triggered. Rendered via Flask
   error handlers + templates/errors/_layout.html. */
.admin-err {
  margin: 0; min-height: 100vh; min-height: 100dvh;
  background: var(--color-bg-base, #050912);
  color: var(--color-text-strong);
  font-family: var(--font-sans);
  display: flex; align-items: center; justify-content: center;
  position: relative; overflow: hidden;
}
.admin-err__grid {
  position: absolute; inset: 0; pointer-events: none; opacity: 0.08;
  background-image:
    linear-gradient(rgba(56, 189, 248, 0.40) 1px, transparent 1px),
    linear-gradient(90deg, rgba(56, 189, 248, 0.40) 1px, transparent 1px);
  background-size: 48px 48px;
  mask-image: radial-gradient(ellipse at 50% 40%, #000 0%, transparent 70%);
  -webkit-mask-image: radial-gradient(ellipse at 50% 40%, #000 0%, transparent 70%);
}
.admin-err__center {
  position: relative; z-index: 1; text-align: center;
  max-width: 520px; padding: 0 24px;
}
.admin-err--viewer .admin-err__center { max-width: 320px; }

.admin-err__icon {
  width: 80px; height: 80px; margin: 0 auto;
  border-radius: 16px;
  display: flex; align-items: center; justify-content: center;
  font-size: 36px;
}
.admin-err--viewer .admin-err__icon {
  width: 64px; height: 64px; font-size: 28px;
}
.admin-err__icon[data-tone="crimson"] {
  color: var(--color-danger);
  background: rgba(255, 77, 79, 0.05);
  border: 1px solid rgba(255, 77, 79, 0.19);
}
.admin-err__icon[data-tone="amber"] {
  color: var(--color-warning);
  background: rgba(251, 191, 36, 0.05);
  border: 1px solid rgba(251, 191, 36, 0.19);
}
.admin-err__icon[data-tone="info"] {
  color: var(--color-primary);
  background: rgba(56, 189, 248, 0.05);
  border: 1px solid rgba(56, 189, 248, 0.19);
}
.admin-err__subtitle[data-tone="info"] { color: var(--color-primary); }
.admin-err__retry-btn[data-tone="info"] {
  background: var(--color-primary);
  border-color: var(--color-primary);
  color: #000;
}
.admin-err__trace-status--info { color: var(--color-primary); }

.admin-err__title {
  font-size: 24px; font-weight: 600;
  color: var(--color-text-strong);
  margin: 20px 0 0;
}
.admin-err--viewer .admin-err__title { font-size: 20px; }

.admin-err__subtitle {
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 1.5px;
  margin-top: 8px;
}
.admin-err__subtitle[data-tone="crimson"] { color: var(--color-danger); }
.admin-err__subtitle[data-tone="amber"]   { color: var(--color-warning); }

.admin-err__desc {
  font-size: 12px; line-height: 1.7;
  color: var(--color-text-muted);
  margin: 12px auto 0; max-width: 360px;
}

.admin-err__retry {
  margin-top: 24px;
  display: flex; flex-direction: column; align-items: center; gap: 10px;
}
.admin-err__retry-btn {
  padding: 12px 32px; border-radius: 6px; cursor: pointer;
  font-family: var(--font-mono);
  font-size: 12px; font-weight: 700; letter-spacing: 1.5px;
  color: #000; border: 1px solid;
}
.admin-err__retry-btn[data-tone="crimson"] {
  background: var(--color-danger);
  border-color: var(--color-danger);
  color: #fff;
}
.admin-err__retry-btn[data-tone="amber"] {
  background: var(--color-warning);
  border-color: var(--color-warning);
}
.admin-err__retry-btn:hover { filter: brightness(1.05); }
.admin-err--viewer .admin-err__retry-btn {
  padding: 10px 28px;
}
.admin-err__retry-meta {
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.5px;
  color: var(--color-text-muted);
}

.admin-err__secondary { margin-top: 16px; }
.admin-err__secondary-link {
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.5px;
  color: var(--color-primary);
  text-decoration: none;
}
.admin-err__secondary-link:hover { text-decoration: underline; }

/* Inline trace / hint blocks slotted into {% block extra %} */
.admin-err__trace,
.admin-err__trace--inline {
  margin-top: 16px;
  padding: 10px 14px; border-radius: 6px;
  background: rgba(255, 77, 79, 0.05);
  border: 1px solid rgba(255, 77, 79, 0.15);
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.3px; line-height: 1.6;
  color: var(--color-text-muted);
  max-width: 420px; margin-left: auto; margin-right: auto;
}
.admin-err__trace-status { color: var(--color-danger); font-weight: 700; }

.admin-err__hint {
  margin-top: 16px;
  padding: 10px 14px; border-radius: 6px;
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.3px;
  display: inline-flex; align-items: center; gap: 8px;
}
.admin-err__hint--ok {
  background: rgba(132, 225, 0, 0.05);
  border: 1px solid rgba(132, 225, 0, 0.19);
  color: var(--color-success, #86efac);
}
.admin-err__hint--amber {
  background: rgba(251, 191, 36, 0.05);
  border: 1px solid rgba(251, 191, 36, 0.19);
  color: var(--color-warning);
}
.admin-err__hint-dot {
  width: 6px; height: 6px; border-radius: 50%;
  background: currentColor;
}
.admin-err__hint code {
  background: var(--hover-tint);
  padding: 1px 6px; border-radius: 3px;
}

.admin-err__progress {
  width: 240px; margin: 16px auto 0;
}
.admin-err__progress-bar {
  height: 4px; border-radius: 2px;
  background: var(--color-bg-elevated, #182239);
  overflow: hidden;
}
.admin-err__progress-fill {
  height: 100%; width: 0%;
  background: var(--color-warning);
  border-radius: 2px;
  transition: width 0.1s linear;
}
.admin-err__progress-labels {
  display: flex; justify-content: space-between; margin-top: 4px;
  font-family: var(--font-mono);
  font-size: 9px;
  color: var(--color-text-muted);
}
.admin-err__progress-end { color: var(--color-warning); }

.admin-err__reconnect-pulse {
  margin-top: 16px;
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 0.5px;
  color: var(--color-warning);
  display: inline-flex; align-items: center; gap: 6px;
}
.admin-err__reconnect-dot {
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--color-warning);
  animation: hud-pulse 1s ease-in-out infinite;
}

@media (prefers-reduced-motion: reduce) {
  .admin-err__reconnect-dot { animation: none; }
}

/* Runtime "offline" banner injected into viewer / admin when WS drops
   mid-session (design v4-r5 ErrorViewerOffline). Sticky bottom strip
   above the sendbar — preserves composed message until reconnect. */
.admin-offline-banner {
  position: fixed; left: 0; right: 0; bottom: 0;
  z-index: 9050;
  padding: 14px 16px;
  background: rgba(251, 191, 36, 0.08);
  border-top: 1px solid rgba(251, 191, 36, 0.33);
  font-family: var(--font-sans);
  display: flex; flex-direction: column; gap: 8px;
}
.admin-offline-banner__head {
  display: flex; align-items: center; gap: 8px;
}
.admin-offline-banner__dot {
  width: 8px; height: 8px; border-radius: 50%;
  background: var(--color-warning);
  animation: hud-pulse 1.5s ease-in-out infinite;
}
.admin-offline-banner__title {
  font-size: 13px; font-weight: 600;
  color: var(--color-warning);
}
.admin-offline-banner__meta {
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 0.3px;
  color: var(--color-text-muted);
}
.admin-offline-banner__progress {
  height: 3px; border-radius: 2px;
  background: var(--color-bg-elevated, #182239);
  overflow: hidden;
}
.admin-offline-banner__progress-fill {
  height: 100%; width: 0%;
  background: var(--color-warning);
  border-radius: 2px;
  transition: width 0.25s linear;
}
@media (prefers-reduced-motion: reduce) {
  .admin-offline-banner__dot { animation: none; }
  .admin-offline-banner__progress-fill { transition: none; }
}

/* ─── Admin Theme Switcher (design v4-r7 polestar pivot 2026-05-18) ─
   Small ☀/☾ button in the admin topbar. Cycles auto → light → dark. */
.admin-theme-toggle {
  width: 32px; height: 32px; border-radius: 50%; cursor: pointer;
  background: var(--hud-bg2);
  border: 1px solid var(--hud-line, rgba(148, 163, 184, 0.30));
  color: var(--hud-text);
  font-size: 14px; line-height: 1;
  display: inline-flex; align-items: center; justify-content: center;
  padding: 0; margin-right: 6px;
  transition: background 0.15s, color 0.15s;
}
.admin-theme-toggle:hover {
  border-color: var(--color-primary);
  color: var(--color-primary);
}
.admin-theme-toggle[data-mode="auto"]::after {
  content: ""; position: absolute;
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--color-primary);
  transform: translate(10px, -10px);
}
.admin-theme-toggle--floating {
  position: fixed; top: 12px; right: 64px; z-index: 9050;
}

/* ─── Admin Mobile Shell (P0-mobile-shell, design v4-r4 2026-05-18) ──
   Bottom nav (5 tabs + overflow drawer), responsive shell conversions:
   - <=768px: hide desktop sidebar, show .admin-mobile-nav
   - <=600px: HudConfirm modal + message drawer become bottom sheets
   - <=600px: FAB shrinks to 36px and repositions top-right under topbar
   Implemented by admin-mobile-nav.js + CSS below. */

.admin-mobile-nav {
  position: fixed; left: 0; right: 0; bottom: 0;
  z-index: 9000;
  display: none; /* shown only at mobile breakpoint via media query */
  font-family: var(--font-sans);
}

.admin-mobile-nav__backdrop {
  position: fixed; inset: 0; top: 0;
  background: rgba(0, 0, 0, 0.55);
  animation: hud-fade-in 160ms ease-out;
}

.admin-mobile-nav__overflow {
  position: absolute; left: 0; right: 0; bottom: 56px;
  background: var(--color-surface);
  border-top: 1px solid rgba(148, 163, 184, 0.18);
  box-shadow: 0 -8px 32px rgba(0, 0, 0, 0.5);
  animation: hud-mobile-nav-slide 200ms ease-out;
}
@keyframes hud-mobile-nav-slide {
  from { transform: translateY(8px); opacity: 0; }
  to   { transform: translateY(0); opacity: 1; }
}

.admin-mobile-nav__o-row {
  width: 100%; padding: 12px 16px;
  display: flex; align-items: center; gap: 12px;
  background: transparent; border: none; cursor: pointer;
  border-bottom: 1px solid rgba(148, 163, 184, 0.12);
  text-align: left;
}
.admin-mobile-nav__o-row:last-child { border-bottom: none; }
.admin-mobile-nav__o-row:active { background: rgba(56, 189, 248, 0.05); }

.admin-mobile-nav__o-icon {
  width: 36px; height: 36px; border-radius: 8px;
  background: rgba(56, 189, 248, 0.07);
  display: flex; align-items: center; justify-content: center;
  font-size: 16px; color: var(--color-primary);
  flex-shrink: 0;
}
.admin-mobile-nav__o-txt { flex: 1; }
.admin-mobile-nav__o-label {
  display: block;
  font-size: 13px; font-weight: 600;
  color: var(--color-text-strong);
}
.admin-mobile-nav__o-desc {
  display: block;
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 0.3px;
  color: var(--color-text-muted);
  margin-top: 1px;
}
.admin-mobile-nav__o-chev {
  color: var(--color-text-muted);
  font-size: 14px;
}

.admin-mobile-nav__bar {
  display: flex; height: 56px;
  background: var(--color-surface);
  border-top: 1px solid rgba(148, 163, 184, 0.18);
  /* Honour iOS home-bar safe area. */
  padding-bottom: env(safe-area-inset-bottom);
}

.admin-mobile-nav__tab {
  flex: 1;
  background: transparent; border: none; cursor: pointer;
  display: flex; flex-direction: column; align-items: center;
  justify-content: center; gap: 2px;
  position: relative; padding: 0;
}
.admin-mobile-nav__icon {
  font-size: 16px;
  color: var(--color-text-muted);
}
.admin-mobile-nav__label {
  font-family: var(--font-mono);
  font-size: 8px; letter-spacing: 0.5px;
  color: var(--color-text-muted);
}
.admin-mobile-nav__tab.is-active .admin-mobile-nav__icon,
.admin-mobile-nav__tab.is-active .admin-mobile-nav__label {
  color: var(--color-primary);
}
.admin-mobile-nav__active-line {
  position: absolute; top: 0; left: 20%; right: 20%;
  height: 2px; border-radius: 1px;
  background: var(--color-primary);
  opacity: 0;
}
.admin-mobile-nav__tab.is-active .admin-mobile-nav__active-line { opacity: 1; }

.admin-mobile-nav__badge {
  position: absolute; top: 4px; right: 25%;
  min-width: 14px; height: 14px; border-radius: 999px;
  background: var(--color-danger);
  color: #fff; padding: 0 4px;
  font-family: var(--font-mono);
  font-size: 8px; font-weight: 700;
  display: flex; align-items: center; justify-content: center;
}

/* ── Mobile shell breakpoint (<= 768px) ── */
@media (max-width: 768px) {
  /* 2026-05-18: hide bottom-nav while keyboard is up (any input or
     textarea focused). :has() is well supported in mobile Safari/Chrome
     2023+; older browsers fall back to the JS toggle below. */
  body:has(input:focus, textarea:focus, [contenteditable=true]:focus) .admin-mobile-nav,
  body.admin-mobile-nav--hidden .admin-mobile-nav {
    transform: translateY(100%);
    transition: transform 180ms ease-out;
  }
  .admin-mobile-nav { display: block; }
  /* Pad page body so content isn't hidden behind the 56px nav. */
  body.admin-body { padding-bottom: 56px; }
  /* iOS safe area inset is applied to the nav itself; add a touch of
     extra room when the inset is non-zero. */
  body.admin-body { padding-bottom: calc(56px + env(safe-area-inset-bottom)); }
  /* Hide desktop sidebar so it doesn't compete for space. */
  .admin-dash-sidebar,
  .admin-sidebar,
  .admin-shell-sidebar { display: none !important; }
  /* Existing FAB stays but shrinks on mobile. */
  .admin-qa-fab { top: 60px; right: 12px; }
  .admin-qa-fab__btn { width: 36px; height: 36px; font-size: 16px; }
  .admin-qa-fab__menu { width: calc(100vw - 24px); max-width: 320px; }
}

/* ── Modal-as-bottom-sheet at <= 600px ── */
@media (max-width: 600px) {
  .admin-hud-modal { align-items: flex-end; }
  .admin-hud-modal__panel {
    width: 100% !important;
    max-width: 100%;
    border-radius: 16px 16px 0 0;
    animation: hud-mobile-sheet-up 220ms cubic-bezier(0.32, 1.4, 0.34, 1);
  }
  @keyframes hud-mobile-sheet-up {
    from { transform: translateY(100%); }
    to   { transform: translateY(0); }
  }
  .admin-hud-modal__panel::before {
    content: "";
    display: block;
    width: 36px; height: 4px; border-radius: 2px;
    background: rgba(148, 163, 184, 0.30);
    margin: 8px auto 0;
  }

  /* Message detail drawer also becomes a bottom sheet. */
  .admin-msgd-drawer {
    width: 100% !important; max-width: 100%;
    height: 78vh; height: 78dvh;
    border-left: none !important;
    border-top: 2px solid var(--color-primary);
    border-radius: 16px 16px 0 0;
    align-self: flex-end;
    box-shadow: 0 -12px 48px rgba(0, 0, 0, 0.6) !important;
    animation: hud-mobile-sheet-up 220ms cubic-bezier(0.32, 1.4, 0.34, 1);
  }
  .admin-msgd-overlay { align-items: flex-end; }
  .admin-msgd-drawer::before {
    content: "";
    display: block;
    width: 36px; height: 4px; border-radius: 2px;
    background: rgba(148, 163, 184, 0.30);
    margin: 8px auto 4px;
  }
}

/* ── Live-feed swipe-to-action (touch) ── */
.admin-live-feed-row {
  position: relative;
  touch-action: pan-y;
}
.admin-live-feed-row.is-swiping {
  background: var(--color-surface);
  box-shadow: 4px 0 16px rgba(0, 0, 0, 0.4);
  transition: transform 60ms linear;
}
.admin-live-feed-row.is-swiped {
  transform: translateX(-180px);
  transition: transform 220ms cubic-bezier(0.32, 1.4, 0.34, 1);
  background: var(--color-surface);
}
.admin-live-feed-row__swipe-actions {
  position: absolute; top: 0; right: -180px; bottom: 0;
  width: 180px;
  display: flex;
  pointer-events: none;
}
.admin-live-feed-row.is-swiped .admin-live-feed-row__swipe-actions {
  right: 0; pointer-events: auto;
}
.admin-live-feed-row__swipe-btn {
  flex: 1; border: none; cursor: pointer;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 2px;
  font-family: var(--font-mono);
  font-size: 8px; letter-spacing: 0.5px; font-weight: 700;
}
.admin-live-feed-row__swipe-btn--mask {
  background: var(--color-warning); color: #000;
}
.admin-live-feed-row__swipe-btn--mute {
  background: var(--color-danger); color: #fff;
}
.admin-live-feed-row__swipe-btn--ban {
  background: #7f1d1d; color: #fff;
}
.admin-live-feed-row__swipe-btn-icon { font-size: 16px; }

@media (prefers-reduced-motion: reduce) {
  .admin-hud-modal__panel,
  .admin-msgd-drawer,
  .admin-mobile-nav__overflow {
    animation: none;
  }
}

/* ─── Admin Moderation Queue (P0-4, design v4-r3 2026-05-18) ────────
   3-column swimlane Kanban (Pending / Approved / Rejected) for flagged
   messages awaiting human decision. Auto-reject countdown on pending
   cards. Backed by admin-modqueue.js + /admin/modqueue/*. */
.admin-mq { display: flex; flex-direction: column; gap: 12px; min-height: 600px; }

.admin-mq__toolbar {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
}
.admin-mq__chip {
  padding: 5px 14px; border-radius: 4px;
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 1px;
  display: flex; align-items: center; gap: 6px;
}
.admin-mq__chip--pending {
  background: rgba(251, 191, 36, 0.07);
  border: 1px solid rgba(251, 191, 36, 0.33);
  color: var(--color-warning);
}
.admin-mq__dot {
  width: 6px; height: 6px; border-radius: 50%;
  animation: hud-pulse 1.4s ease-in-out infinite;
}
.admin-mq__dot--amber  { background: var(--color-warning); }
.admin-mq__counter {
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.5px;
}
.admin-mq__counter--ok  { color: var(--color-success, #86efac); }
.admin-mq__counter--rej { color: var(--color-danger); }
.admin-mq__spacer { flex: 1; }

.admin-mq__bulk {
  padding: 5px 12px; border-radius: 4px; cursor: pointer;
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.5px; font-weight: 600;
}
.admin-mq__bulk--ok {
  background: rgba(132, 225, 0, 0.05);
  border: 1px solid rgba(132, 225, 0, 0.33);
  color: var(--color-success, #86efac);
}
.admin-mq__bulk--rej {
  background: rgba(255, 77, 79, 0.05);
  border: 1px solid rgba(255, 77, 79, 0.33);
  color: var(--color-danger);
}
.admin-mq__bulk:hover { filter: brightness(1.15); }

.admin-mq__autoreject {
  display: flex; align-items: center; gap: 6px;
  padding: 5px 12px; border-radius: 4px;
  background: var(--color-bg-elevated, #182239);
  border: 1px solid rgba(148, 163, 184, 0.18);
}
.admin-mq__autoreject-label {
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 1.5px;
  color: var(--color-text-muted);
}
.admin-mq__autoreject-val {
  font-family: var(--font-mono);
  font-size: 11px; font-weight: 600;
  color: var(--color-warning);
}

.admin-mq__hint {
  padding: 6px 14px; border-radius: 6px;
  background: rgba(56, 189, 248, 0.07);
  border: 1px solid rgba(56, 189, 248, 0.30);
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.3px;
  color: var(--color-primary);
  display: flex; align-items: center; gap: 8px;
}

.admin-mq__body {
  flex: 1; display: flex; gap: 14px; min-height: 0;
}
.admin-mq__col {
  flex: 1; display: flex; flex-direction: column;
  min-width: 0; min-height: 0;
}
.admin-mq__col-head {
  padding: 10px 14px; margin-bottom: 10px;
  display: flex; align-items: center; gap: 8px;
  border-bottom: 2px solid;
}
.admin-mq__col-head--pending  { border-bottom-color: var(--color-warning); }
.admin-mq__col-head--approved { border-bottom-color: var(--color-success, #86efac); }
.admin-mq__col-head--rejected { border-bottom-color: var(--color-danger); }
.admin-mq__col-dot {
  width: 8px; height: 8px; border-radius: 50%;
}
.admin-mq__col-title {
  font-family: var(--font-mono);
  font-size: 11px; letter-spacing: 1.5px; font-weight: 700;
}
.admin-mq__col-head--pending  .admin-mq__col-title { color: var(--color-warning); }
.admin-mq__col-head--approved .admin-mq__col-title { color: var(--color-success, #86efac); }
.admin-mq__col-head--rejected .admin-mq__col-title { color: var(--color-danger); }
.admin-mq__col-count {
  font-family: var(--font-mono);
  font-size: 10px;
  padding: 2px 8px; border-radius: 999px;
  border: 1px solid;
}
.admin-mq__col-head--pending  .admin-mq__col-count { color: var(--color-warning); border-color: rgba(251, 191, 36, 0.33); background: rgba(251, 191, 36, 0.07); }
.admin-mq__col-head--approved .admin-mq__col-count { color: var(--color-success, #86efac); border-color: rgba(132, 225, 0, 0.33); background: rgba(132, 225, 0, 0.07); }
.admin-mq__col-head--rejected .admin-mq__col-count { color: var(--color-danger); border-color: rgba(255, 77, 79, 0.33); background: rgba(255, 77, 79, 0.07); }
.admin-mq__col-badge {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 9px;
  color: var(--color-warning);
}
.admin-mq__col-cards {
  flex: 1; overflow: auto;
  display: flex; flex-direction: column; gap: 8px;
  padding-right: 4px;
}

/* Card */
.admin-mq-card {
  background: var(--color-surface);
  border: 1px solid rgba(148, 163, 184, 0.18);
  border-left: 3px solid var(--mq-sev, var(--color-text-muted));
  border-radius: 6px;
  padding: 12px;
  display: flex; flex-direction: column; gap: 8px;
  position: relative;
}
.admin-mq-card__head {
  display: flex; align-items: center; gap: 8px;
}
.admin-mq-card__avatar {
  width: 28px; height: 28px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  font-family: var(--font-mono);
  font-size: 10px; font-weight: 700; color: #fff;
  flex-shrink: 0;
}
.admin-mq-card__id { flex: 1; min-width: 0; }
.admin-mq-card__nick {
  font-size: 12px; font-weight: 600;
  color: var(--color-text-strong);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.admin-mq-card__fp {
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 0.3px;
  color: var(--color-primary);
}
.admin-mq-card__time {
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 0.5px;
  color: var(--color-text-muted);
  flex-shrink: 0;
}
.admin-mq-card__body {
  padding: 8px 10px; border-radius: 4px;
  background: var(--color-bg-elevated, #182239);
  border: 1px solid rgba(148, 163, 184, 0.18);
  font-size: 12px; line-height: 1.6;
  color: var(--color-text-strong);
  word-break: break-word;
}
.admin-mq-card__meta {
  display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
}
.admin-mq-card__sev {
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 0.5px; font-weight: 700;
  padding: 2px 8px; border-radius: 3px;
  background: color-mix(in srgb, var(--mq-sev) 12%, transparent);
  border: 1px solid color-mix(in srgb, var(--mq-sev) 33%, transparent);
  color: var(--mq-sev);
}
.admin-mq-card__rule {
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 0.3px;
  padding: 2px 8px; border-radius: 3px;
  border: 1px solid rgba(148, 163, 184, 0.18);
  color: var(--color-text-muted);
}
.admin-mq-card__countdown {
  margin-left: auto;
  display: flex; align-items: center; gap: 4px;
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 0.3px;
  color: var(--color-warning);
}
.admin-mq-card__countdown-dot {
  width: 4px; height: 4px; border-radius: 50%;
  background: var(--color-warning);
  animation: hud-pulse 1s ease-in-out infinite;
}

.admin-mq-card__actions {
  display: flex; gap: 6px; margin-top: 2px;
}
.admin-mq-card__btn {
  flex: 1;
  padding: 6px 10px; border-radius: 4px; cursor: pointer;
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.5px; font-weight: 600;
}
.admin-mq-card__btn--approve {
  border: 1px solid rgba(132, 225, 0, 0.33);
  background: rgba(132, 225, 0, 0.07);
  color: var(--color-success, #86efac);
}
.admin-mq-card__btn--reject {
  border: 1px solid rgba(255, 77, 79, 0.33);
  background: rgba(255, 77, 79, 0.07);
  color: var(--color-danger);
}
.admin-mq-card__btn--more {
  flex: 0; padding: 6px 10px;
  border: 1px solid rgba(148, 163, 184, 0.18);
  background: transparent;
  color: var(--color-text-muted);
}
.admin-mq-card__btn:hover:not(:disabled) { filter: brightness(1.15); }

.admin-mq-card__stamp {
  display: flex; align-items: center; gap: 4px;
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 1px;
}
.admin-mq-card__stamp--ok  { color: var(--color-success, #86efac); }
.admin-mq-card__stamp--rej { color: var(--color-danger); }
.admin-mq-card__stamp-dot {
  width: 6px; height: 6px; border-radius: 50%;
  background: currentColor;
}

.admin-mq__empty[hidden] { display: none; }

.admin-mq__footer {
  padding: 8px 14px;
  border-top: 1px solid rgba(148, 163, 184, 0.18);
  display: flex; align-items: center; gap: 16px;
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.5px;
  color: var(--color-text-muted);
  flex-wrap: wrap;
}
.admin-mq__health { color: var(--color-success, #86efac); }

@media (max-width: 1100px) {
  .admin-mq__body { flex-direction: column; }
  .admin-mq__col { min-height: 240px; }
}
@media (prefers-reduced-motion: reduce) {
  .admin-mq__dot,
  .admin-mq-card__countdown-dot { animation: none; }
}

/* ─── Admin HUD Confirm Modal (design v4-r2 2026-05-18) ─────────────
   Reusable modal template (severity: warn/danger/info/success). The
   inline BanConfirm in admin-message-drawer is being migrated to call
   window.HudConfirm.open() instead of building its own DOM.
   See admin-hud-modal.js. */
.admin-hud-modal {
  position: fixed; inset: 0; z-index: 9300;
  display: flex; align-items: center; justify-content: center;
  font-family: var(--font-sans);
}
.admin-hud-modal__backdrop {
  position: absolute; inset: 0;
  background: rgba(5, 9, 16, 0.65);
  animation: hud-fade-in 160ms ease-out;
}
.admin-hud-modal__panel {
  position: relative; max-width: calc(100% - 32px);
  background: var(--color-bg-base, #050912);
  color: var(--color-text-strong);
  border-radius: 8px; overflow: hidden;
  border: 1px solid rgba(251, 191, 36, 0.33);
  box-shadow: 0 16px 64px rgba(0, 0, 0, 0.6);
  animation: hud-modal-rise 200ms ease-out;
}
@keyframes hud-modal-rise {
  from { transform: translateY(12px); opacity: 0; }
  to   { transform: translateY(0);   opacity: 1; }
}

.admin-hud-modal--danger  .admin-hud-modal__panel { border-color: rgba(255, 77, 79, 0.45); }
.admin-hud-modal--info    .admin-hud-modal__panel { border-color: rgba(56, 189, 248, 0.45); }
.admin-hud-modal--success .admin-hud-modal__panel { border-color: rgba(132, 225, 0, 0.45); }

.admin-hud-modal__head {
  display: flex; align-items: center; gap: 10px;
  padding: 16px 20px;
  background: rgba(251, 191, 36, 0.07);
  border-bottom: 1px solid rgba(251, 191, 36, 0.21);
}
.admin-hud-modal--danger  .admin-hud-modal__head { background: rgba(255, 77, 79, 0.07); border-bottom-color: rgba(255, 77, 79, 0.21); }
.admin-hud-modal--info    .admin-hud-modal__head { background: rgba(56, 189, 248, 0.07); border-bottom-color: rgba(56, 189, 248, 0.21); }
.admin-hud-modal--success .admin-hud-modal__head { background: rgba(132, 225, 0, 0.07); border-bottom-color: rgba(132, 225, 0, 0.21); }

.admin-hud-modal__icon {
  font-size: 18px;
  color: var(--color-warning);
}
.admin-hud-modal--danger  .admin-hud-modal__icon { color: var(--color-danger); }
.admin-hud-modal--info    .admin-hud-modal__icon { color: var(--color-primary); }
.admin-hud-modal--success .admin-hud-modal__icon { color: var(--color-success, #84e100); }

.admin-hud-modal__title {
  font-size: 15px; font-weight: 600;
  color: var(--color-warning);
}
.admin-hud-modal--danger  .admin-hud-modal__title { color: var(--color-danger); }
.admin-hud-modal--info    .admin-hud-modal__title { color: var(--color-primary); }
.admin-hud-modal--success .admin-hud-modal__title { color: var(--color-success, #84e100); }

.admin-hud-modal__subtitle {
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 1px;
  color: var(--color-text-muted); margin-top: 2px;
}

.admin-hud-modal__body {
  padding: 16px 20px;
  font-size: 13px; line-height: 1.6;
  color: var(--color-text-strong);
}

.admin-hud-modal__foot {
  display: flex; gap: 10px; justify-content: flex-end;
  padding: 12px 20px;
  border-top: 1px solid rgba(148, 163, 184, 0.18);
}
.admin-hud-modal__btn {
  padding: 8px 20px; border-radius: 4px; cursor: pointer;
  font-family: var(--font-mono);
  font-size: 11px; letter-spacing: 1px;
}
.admin-hud-modal__btn--cancel {
  background: transparent;
  border: 1px solid rgba(148, 163, 184, 0.30);
  color: var(--color-text-muted);
}
.admin-hud-modal__btn--cancel:hover { color: var(--color-text-strong); }
.admin-hud-modal__btn--confirm {
  background: var(--color-warning);
  border: 1px solid var(--color-warning);
  color: #000; font-weight: 700;
}
.admin-hud-modal--danger  .admin-hud-modal__btn--confirm { background: var(--color-danger); border-color: var(--color-danger); color: #fff; }
.admin-hud-modal--info    .admin-hud-modal__btn--confirm { background: var(--color-primary); border-color: var(--color-primary); color: #000; }
.admin-hud-modal--success .admin-hud-modal__btn--confirm { background: var(--color-success, #84e100); border-color: var(--color-success, #84e100); color: #000; }
.admin-hud-modal__btn--confirm:hover { filter: brightness(1.05); }
.admin-hud-modal__btn:focus-visible {
  outline: 2px solid var(--color-primary);
  outline-offset: 2px;
}

/* ─── Admin Loading Skeletons (design v4-r2 2026-05-18) ─────────────
   3 variants exposed by admin-skeletons.js. Shimmer animation runs
   on .admin-skel only, respects prefers-reduced-motion. */
@keyframes admin-skel-shimmer {
  0%   { background-position: 100% 0; }
  100% { background-position: -100% 0; }
}
.admin-skel {
  background: linear-gradient(
    90deg,
    rgba(148, 163, 184, 0.06) 0%,
    rgba(148, 163, 184, 0.14) 40%,
    rgba(148, 163, 184, 0.06) 80%
  );
  background-size: 200% 100%;
  animation: admin-skel-shimmer 1.8s ease-in-out infinite;
  border-radius: 2px;
  display: block;
}
.admin-skel-bar { border-radius: 2px; }
.admin-skel-circle { border-radius: 50%; }

.admin-skel-card {
  background: var(--color-surface);
  border: 1px solid rgba(148, 163, 184, 0.18);
  border-radius: 6px; overflow: hidden;
}

.admin-skel-list__head {
  display: flex; gap: 40px;
  padding: 10px 16px;
  border-bottom: 1px solid rgba(148, 163, 184, 0.18);
}
.admin-skel-list__row {
  display: flex; align-items: center; gap: 12px;
  padding: 12px 16px;
  border-bottom: 1px solid rgba(148, 163, 184, 0.12);
}
.admin-skel-list__row:last-child { border-bottom: none; }
.admin-skel-list__col {
  flex: 1; display: flex; flex-direction: column; gap: 6px;
}

.admin-skel-stats {
  display: grid; gap: 14px;
}
.admin-skel-tile { padding: 16px; display: flex; flex-direction: column; gap: 10px; }

.admin-skel-chart { padding: 16px; }
.admin-skel-chart__head {
  display: flex; align-items: center; gap: 10px;
  margin-bottom: 16px;
}
.admin-skel-chart__body { display: flex; gap: 8px; height: 160px; }
.admin-skel-chart__y {
  width: 30px;
  display: flex; flex-direction: column; justify-content: space-between;
}
.admin-skel-chart__bars {
  flex: 1; display: flex; gap: 3px; align-items: flex-end;
}
.admin-skel-chart__bar { flex: 1; opacity: 0.7; }

@media (prefers-reduced-motion: reduce) {
  .admin-skel { animation: none; background-position: 0 0; }
}

/* ─── Admin Empty States (design v4-r2 2026-05-18) ──────────────────
   8 named presets + custom shell built by admin-empty-states.js. */
.admin-empty {
  width: 480px; max-width: calc(100% - 32px);
  margin: 40px auto;
  padding: 48px 36px; text-align: center;
  background: var(--color-surface);
  border: 1px solid rgba(148, 163, 184, 0.18);
  border-radius: 6px;
}
.admin-empty__icon {
  width: 64px; height: 64px; margin: 0 auto;
  border-radius: 8px;
  display: flex; align-items: center; justify-content: center;
  font-size: 28px;
  border: 1px solid transparent;
}
.admin-empty__title {
  font-size: 18px; font-weight: 600;
  color: var(--color-text-strong);
  margin-top: 20px;
}
.admin-empty__desc {
  font-size: 12px; line-height: 1.7;
  color: var(--color-text-muted);
  max-width: 360px;
  margin: 8px auto 0;
}
.admin-empty__btn {
  margin-top: 22px; padding: 10px 24px;
  border: 1px solid; border-radius: 6px; cursor: pointer;
  color: #000; font-weight: 700;
  font-family: var(--font-mono);
  font-size: 12px; letter-spacing: 1.5px;
}
.admin-empty__btn:hover { filter: brightness(1.1); }
.admin-empty__extra {
  margin-top: 16px;
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 0.5px;
  color: var(--color-text-muted);
}

/* ─── Admin Quick Action FAB (P3-1, design v4 2026-05-17) ───────────
   Floating "+" top-right · 7-action menu (with kbd shortcuts).
   Mounted at <body> level by admin-quick-action-fab.js. */
.admin-qa-fab {
  position: fixed; top: 16px; right: 16px; z-index: 9100;
}
.admin-qa-fab__btn {
  width: 44px; height: 44px; border-radius: 50%; cursor: pointer;
  background: var(--color-primary); color: #000;
  border: none;
  display: flex; align-items: center; justify-content: center;
  font-size: 22px; font-weight: 700;
  box-shadow: 0 4px 16px rgba(56, 189, 248, 0.33), 0 2px 8px rgba(0, 0, 0, 0.3);
  transition: transform 0.15s;
}
.admin-qa-fab__btn:hover { transform: scale(1.05); }
.admin-qa-fab[data-state="open"] .admin-qa-fab__btn { transform: rotate(45deg); }

.admin-qa-fab__backdrop {
  position: fixed; inset: 0; z-index: -1;
  background: rgba(0, 0, 0, 0.5);
  animation: hud-fade-in 160ms ease-out;
}
.admin-qa-fab__menu {
  position: absolute; top: 0; right: 0; width: 320px;
  background: var(--color-surface);
  border: 1px solid rgba(148, 163, 184, 0.18);
  border-radius: 6px; overflow: hidden;
  box-shadow: 0 12px 48px rgba(0, 0, 0, 0.5);
  animation: qa-fab-slide 200ms cubic-bezier(0.34, 1.56, 0.64, 1);
}
@keyframes qa-fab-slide {
  from { opacity: 0; transform: translateY(-8px) scale(0.97); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}

.admin-qa-fab__menu-head {
  display: flex; align-items: center; gap: 8px;
  padding: 12px 16px;
  border-bottom: 1px solid rgba(148, 163, 184, 0.18);
}
.admin-qa-fab__kicker {
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 1.5px;
  color: var(--color-primary);
  text-transform: uppercase;
}
.admin-qa-fab__spacer { flex: 1; }
.admin-qa-fab__esc {
  font-family: var(--font-mono);
  font-size: 9px;
  color: var(--color-text-muted);
}

.admin-qa-fab__row {
  width: 100%;
  padding: 10px 16px;
  display: flex; align-items: center; gap: 10px;
  background: transparent; border: none; cursor: pointer;
  border-bottom: 1px solid rgba(148, 163, 184, 0.12);
  text-align: left;
}
.admin-qa-fab__row:last-child { border-bottom: none; }
.admin-qa-fab__row:hover:not(:disabled) {
  background: rgba(56, 189, 248, 0.07);
}
.admin-qa-fab__row:disabled { opacity: 0.4; cursor: not-allowed; }

.admin-qa-fab__icon {
  width: 28px; height: 28px; border-radius: 4px;
  background: var(--color-bg-elevated, #182239);
  border: 1px solid rgba(148, 163, 184, 0.18);
  display: flex; align-items: center; justify-content: center;
  font-size: 13px;
  color: var(--color-primary);
  flex-shrink: 0;
}
.admin-qa-fab__txt { flex: 1; min-width: 0; }
.admin-qa-fab__label {
  display: block;
  font-size: 12px; font-weight: 500;
  color: var(--color-text-strong);
}
.admin-qa-fab__desc {
  display: block;
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 0.3px;
  color: var(--color-text-muted);
  margin-top: 1px;
}
.admin-qa-fab__kbd {
  flex-shrink: 0;
  padding: 2px 8px; border-radius: 3px;
  border: 1px solid rgba(148, 163, 184, 0.18);
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--color-text-muted);
}

@media (prefers-reduced-motion: reduce) {
  .admin-qa-fab__btn:hover { transform: none; }
  .admin-qa-fab__menu { animation: none; }
  .admin-qa-fab__backdrop { animation: none; }
}

/* ─── Admin Live Filters (P2-1, design v4 2026-05-18) ────────────────
   Quick-filter chips bar wired to /admin/filters backend. Lives ABOVE
   the existing rules library; the library still owns custom regex. */
.admin-flt-v4__explain {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 16px; border-radius: 6px;
  background: rgba(148, 163, 184, 0.04);
  border: 1px solid rgba(148, 163, 184, 0.18);
  font-size: 11px; color: var(--color-text-muted);
  margin-bottom: 12px;
}
.admin-flt-v4__amber-kicker {
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 1.5px; font-weight: 700;
  color: var(--color-warning);
}
.admin-flt-v4__dim-kicker {
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 1.5px;
  color: var(--color-text-muted);
}
.admin-flt-v4__spacer { flex: 1; }

.admin-flt-v4__card {
  background: var(--color-surface);
  border: 1px solid rgba(148, 163, 184, 0.18);
  border-radius: 6px; overflow: hidden;
  margin-bottom: 14px;
}
.admin-flt-v4__head {
  padding: 12px 16px;
  border-bottom: 1px solid rgba(148, 163, 184, 0.18);
}
.admin-flt-v4__kicker {
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 1.5px;
  color: var(--color-text-muted);
  text-transform: uppercase;
}
.admin-flt-v4__quick {
  display: flex; gap: 10px; padding: 14px 16px; flex-wrap: wrap;
}
.admin-flt-v4__qchip {
  padding: 10px 18px; border-radius: 6px; cursor: pointer;
  background: transparent;
  border: 1.5px solid rgba(148, 163, 184, 0.18);
  display: flex; align-items: center; gap: 10px;
  font-family: var(--font-sans);
}
.admin-flt-v4__qchip.is-active {
  background: rgba(56, 189, 248, 0.08);
  border-color: var(--color-primary);
}
.admin-flt-v4__qchip-toggle {
  display: inline-flex; align-items: center;
  width: 32px; height: 18px; border-radius: 999px; padding: 2px;
  background: transparent;
  border: 1px solid rgba(148, 163, 184, 0.30);
}
.admin-flt-v4__qchip.is-active .admin-flt-v4__qchip-toggle {
  background: rgba(56, 189, 248, 0.33);
  border-color: var(--color-primary);
}
.admin-flt-v4__qchip-knob {
  width: 12px; height: 12px; border-radius: 50%;
  background: var(--color-text-muted);
  margin-left: 0; transition: margin-left 0.2s, background 0.2s;
}
.admin-flt-v4__qchip.is-active .admin-flt-v4__qchip-knob {
  margin-left: 12px;
  background: var(--color-primary);
}
.admin-flt-v4__qchip-label {
  font-size: 13px;
  color: var(--color-text-strong);
}
.admin-flt-v4__qchip.is-active .admin-flt-v4__qchip-label {
  color: var(--color-primary); font-weight: 600;
}
.admin-flt-v4__qchip-hits {
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.3px;
  color: var(--color-text-muted);
}
.admin-flt-v4__qchip.is-active .admin-flt-v4__qchip-hits {
  color: var(--color-primary);
}

@media (prefers-reduced-motion: reduce) {
  .admin-flt-v4__qchip-knob { transition: none; }
}

/* ─── Admin System Events Log (P2-3, design v4 2026-05-17) ───────────
   Aliases /admin/audit with severity-coded rows. Hooked from
   admin-events-log.js (#sec-events). */
.admin-ev-v4 { display: flex; flex-direction: column; gap: 14px; }
.admin-ev-v4__explain {
  padding: 10px 16px; border-radius: 6px;
  background: rgba(56, 189, 248, 0.05);
  border: 1px solid rgba(56, 189, 248, 0.21);
  font-size: 11px;
  color: var(--color-text-muted);
}
.admin-ev-v4__explain a {
  color: var(--color-primary);
  text-decoration: underline;
}

.admin-ev-v4__filterbar {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
}
.admin-ev-v4__sev-chips { display: flex; gap: 6px; flex-wrap: wrap; }
.admin-ev-v4__sev-chip {
  padding: 5px 12px; border-radius: 4px;
  background: transparent;
  border: 1px solid rgba(148, 163, 184, 0.18);
  color: var(--color-text-muted);
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.8px; font-weight: 600;
  cursor: pointer;
  display: inline-flex; align-items: center; gap: 6px;
}
.admin-ev-v4__sev-chip.is-active {
  border-color: var(--color-primary);
  color: var(--color-primary);
  background: rgba(56, 189, 248, 0.10);
}
.admin-ev-v4__sev-chip.is-info.is-active  { border-color: #38bdf8;  color: #38bdf8;  background: rgba(56, 189, 248, 0.10); }
.admin-ev-v4__sev-chip.is-warn.is-active  { border-color: #fbbf24;  color: #fbbf24;  background: rgba(251, 191, 36, 0.10); }
.admin-ev-v4__sev-chip.is-error.is-active { border-color: #ff4d4f;  color: #ff4d4f;  background: rgba(255, 77, 79, 0.10); }
.admin-ev-v4__sev-count {
  font-size: 9px; font-weight: 700; opacity: 0.7;
}

.admin-ev-v4__spacer { flex: 1; }
.admin-ev-v4__count {
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.5px;
  color: var(--color-text-muted);
}
.admin-ev-v4__refresh {
  padding: 5px 12px; border-radius: 4px;
  background: transparent;
  border: 1px solid rgba(148, 163, 184, 0.18);
  color: var(--color-text-muted);
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.5px; cursor: pointer;
}
.admin-ev-v4__refresh:hover {
  color: var(--color-primary);
  border-color: var(--color-primary);
}

.admin-ev-v4__card {
  background: var(--color-surface);
  border: 1px solid rgba(148, 163, 184, 0.18);
  border-radius: 6px; overflow: hidden;
}
.admin-ev-v4__row {
  display: grid; grid-template-columns: 70px 28px 160px 100px 1fr 50px;
  padding: 10px 16px; align-items: center; gap: 8px;
  border-bottom: 1px solid rgba(148, 163, 184, 0.12);
  background: transparent;
}
.admin-ev-v4__row:last-child { border-bottom: none; }
.admin-ev-v4__row--head {
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 1px;
  color: var(--color-text-muted);
  background: rgba(148, 163, 184, 0.04);
  padding: 8px 16px;
}
.admin-ev-v4__row[data-sev="warn"]  { background: rgba(251, 191, 36, 0.04); }
.admin-ev-v4__row[data-sev="error"] { background: rgba(255, 77, 79, 0.05); }

.admin-ev-v4__time {
  font-family: var(--font-mono);
  font-size: 10px; color: var(--color-text-muted);
}
.admin-ev-v4__sev { display: flex; align-items: center; justify-content: center; }
.admin-ev-v4__sev-dot {
  width: 8px; height: 8px; border-radius: 50%;
  background: #38bdf8;
}
.admin-ev-v4__sev-dot[data-sev="info"]  { background: #38bdf8; }
.admin-ev-v4__sev-dot[data-sev="warn"]  { background: #fbbf24; }
.admin-ev-v4__sev-dot[data-sev="error"] { background: #ff4d4f; }
.admin-ev-v4__type {
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.5px;
  color: #38bdf8;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.admin-ev-v4__type[data-sev="warn"]  { color: #fbbf24; }
.admin-ev-v4__type[data-sev="error"] { color: #ff4d4f; }
.admin-ev-v4__actor {
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--color-text-muted);
}
.admin-ev-v4__msg {
  font-size: 11px; color: var(--color-text-strong);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.admin-ev-v4__empty {
  padding: 24px 16px; text-align: center;
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--color-text-muted);
}

@media (max-width: 720px) {
  .admin-ev-v4__row {
    grid-template-columns: 60px 20px 1fr;
    grid-template-areas:
      "time sev type"
      "time sev msg";
    row-gap: 2px;
  }
  .admin-ev-v4__time   { grid-area: time; }
  .admin-ev-v4__sev    { grid-area: sev; align-self: start; padding-top: 4px; }
  .admin-ev-v4__type   { grid-area: type; }
  .admin-ev-v4__msg    { grid-area: msg; }
  .admin-ev-v4__actor, .admin-ev-v4__link { display: none; }
}

/* ─── Message Detail Drawer (P1, 2026-04-27) — design v4 retrofit ─────
   2026-05-17 design v4: kept overlay/backdrop/drawer shell + slide-in;
   replaced inner body chrome with admin-msgd-v4__* classes that match
   the design canvas (header avatar + sender profile + moderation row
   + reply textarea + prev/next footer). */
.admin-msgd-overlay {
  position: fixed; inset: 0; z-index: 8500;
  display: flex; justify-content: flex-end;
  pointer-events: none;
}

/* Design v4 drawer interior */
.admin-msgd-v4__topbar {
  display: flex; align-items: center; gap: 8px;
  padding: 10px 14px;
  border-bottom: 1px solid var(--hud-line);
}
.admin-msgd-v4__kicker {
  font-family: var(--hud-font-mono);
  font-size: 10px; letter-spacing: 1px;
  color: var(--hud-textDim);
}
.admin-msgd-v4__spacer { flex: 1; }
.admin-msgd-v4__close {
  background: transparent; border: none; cursor: pointer;
  color: var(--hud-textDim);
  font-size: 14px; padding: 2px 6px;
}
.admin-msgd-v4__close:hover { color: var(--hud-text); }

.admin-msgd-v4__header {
  display: flex; align-items: center; gap: 10px;
  padding: 14px 16px;
  border-bottom: 1px solid var(--hud-line);
}
.admin-msgd-v4__avatar {
  width: 36px; height: 36px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  font-family: var(--hud-font-mono);
  font-size: 13px; font-weight: 700; color: #fff; flex-shrink: 0;
}
.admin-msgd-v4__id { flex: 1; min-width: 0; }
.admin-msgd-v4__nick {
  font-size: 14px; font-weight: 600;
  color: var(--hud-text);
}
.admin-msgd-v4__fp {
  font-family: var(--hud-font-mono);
  font-size: 10px; letter-spacing: 0.3px;
  color: var(--hud-cyan);
}
.admin-msgd-v4__ts {
  font-family: var(--hud-font-mono);
  font-size: 10px; letter-spacing: 0.5px;
  color: var(--hud-textDim);
}

.admin-msgd-v4__body {
  padding: 14px 16px;
  border-bottom: 1px solid var(--hud-line);
  font-size: 14px; line-height: 1.6;
  color: var(--hud-text);
  word-break: break-word;
}

.admin-msgd-v4__section {
  padding: 14px 16px;
  border-bottom: 1px solid var(--hud-line);
}
.admin-msgd-v4__section.is-grow { flex: 1; }
.admin-msgd-v4__seclabel {
  font-family: var(--hud-font-mono);
  font-size: 9px; letter-spacing: 1.5px;
  color: var(--hud-textDim);
  text-transform: uppercase;
}

.admin-msgd-v4__sender-stats {
  display: grid; grid-template-columns: 1fr 1fr 1fr;
  gap: 8px; margin-top: 10px;
}
.admin-msgd-v4__sender-stats > div {
  background: var(--hud-bg2);
  border-radius: 4px; padding: 8px; text-align: center;
}
.admin-msgd-v4__sender-stats .k {
  font-family: var(--hud-font-mono);
  font-size: 9px; letter-spacing: 0.8px;
  color: var(--hud-textDim);
}
.admin-msgd-v4__sender-stats .v {
  font-size: 16px; font-weight: 600;
  color: var(--hud-text); margin-top: 2px;
}
.admin-msgd-v4__sender-stats .v .u { font-size: 10px; opacity: 0.7; margin-left: 2px; }
.admin-msgd-v4__sender-stats .v.dim { color: var(--hud-textDim); }
.admin-msgd-v4__sender-stats .v.warn { color: var(--hud-crimson, #ff4d4f); }
.admin-msgd-v4__sender-stats .v.good { color: var(--hud-lime, #84e100); }

.admin-msgd-v4__sender-meta {
  margin-top: 8px;
  font-family: var(--hud-font-mono);
  font-size: 10px; letter-spacing: 0.3px;
  color: var(--hud-textDim);
}

.admin-msgd-v4__mod-buttons {
  display: flex; gap: 8px; margin-top: 10px; flex-wrap: wrap;
}
.admin-msgd-v4__modbtn {
  padding: 8px 14px; border-radius: 4px;
  background: rgba(56, 189, 248, 0.07);
  border: 1px solid rgba(56, 189, 248, 0.33);
  color: var(--hud-cyan);
  font-family: var(--hud-font-mono);
  font-size: 11px; letter-spacing: 0.5px; font-weight: 600;
  cursor: pointer;
}
.admin-msgd-v4__modbtn:disabled { opacity: 0.4; cursor: default; }
.admin-msgd-v4__modbtn.is-ban       { color: var(--hud-crimson, #ff4d4f); border-color: rgba(255, 77, 79, 0.33); background: rgba(255, 77, 79, 0.07); }
.admin-msgd-v4__modbtn.is-mute      { color: var(--hud-amber);   border-color: rgba(251, 191, 36, 0.33); background: rgba(251, 191, 36, 0.07); }
.admin-msgd-v4__modbtn.is-mask      { color: var(--hud-textDim); border-color: rgba(148, 163, 184, 0.33); background: transparent; }
.admin-msgd-v4__modbtn.is-blacklist { color: var(--hud-crimson, #ff4d4f); border-color: rgba(255, 77, 79, 0.33); background: rgba(255, 77, 79, 0.07); }

.admin-msgd-v4__reply {
  width: 100%; height: 60px; margin-top: 10px;
  padding: 8px 10px; border-radius: 4px;
  background: var(--hud-bg2);
  border: 1px solid var(--hud-line);
  color: var(--hud-text);
  font-family: var(--hud-font-sans, system-ui);
  font-size: 12px; resize: none; outline: none;
}
.admin-msgd-v4__reply:focus { border-color: var(--hud-cyan); }
.admin-msgd-v4__replybtn {
  align-self: flex-end; margin-top: 8px;
  padding: 7px 16px; border-radius: 4px;
  border: 1px solid var(--hud-cyan);
  background: rgba(56, 189, 248, 0.10);
  color: var(--hud-cyan);
  font-family: var(--hud-font-mono);
  font-size: 11px; letter-spacing: 1px; font-weight: 600; cursor: pointer;
}

.admin-msgd-v4__footer {
  display: flex; justify-content: space-between;
  padding: 10px 16px;
  border-top: 1px solid var(--hud-line);
}
.admin-msgd-v4__footer button {
  padding: 6px 14px; border-radius: 4px;
  background: transparent;
  border: 1px solid var(--hud-line);
  color: var(--hud-textDim);
  font-family: var(--hud-font-mono);
  font-size: 10px; letter-spacing: 1px; cursor: pointer;
}
.admin-msgd-v4__footer button:hover {
  color: var(--hud-cyan);
  border-color: var(--hud-cyan);
}

/* ─── Ban Confirm Modal — design v4 (2026-05-17) ─────────────────── */
.admin-bancfm-overlay {
  position: fixed; inset: 0; z-index: 9000;
  display: flex; align-items: center; justify-content: center;
}
.admin-bancfm-backdrop {
  position: absolute; inset: 0;
  background: rgba(5, 9, 16, 0.65);
  animation: hud-fade-in 160ms ease-out;
}
.admin-bancfm-modal {
  position: relative; width: 480px; max-width: calc(100% - 32px);
  background: var(--hud-bg0);
  color: var(--hud-text);
  border-radius: 8px; overflow: hidden;
  border: 1px solid rgba(255, 77, 79, 0.33);
  box-shadow: 0 24px 64px rgba(0, 0, 0, 0.6);
  animation: msgd-slide-up 200ms ease-out;
}
@keyframes msgd-slide-up { from { transform: translateY(12px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }

.admin-bancfm-head {
  padding: 16px 20px;
  background: rgba(255, 77, 79, 0.07);
  border-bottom: 1px solid rgba(255, 77, 79, 0.21);
  display: flex; align-items: center; gap: 10px;
}
.admin-bancfm-icon { font-size: 18px; color: var(--hud-crimson, #ff4d4f); }
.admin-bancfm-title { font-size: 15px; font-weight: 600; color: var(--hud-crimson, #ff4d4f); }
.admin-bancfm-en {
  font-family: var(--hud-font-mono);
  font-size: 10px; letter-spacing: 1px;
  color: var(--hud-textDim); margin-top: 2px;
}

.admin-bancfm-body { padding: 16px 20px; }
.admin-bancfm-target {
  display: flex; align-items: center; gap: 10px;
  padding: 12px; border-radius: 6px;
  background: var(--hud-bg2);
  border: 1px solid var(--hud-line);
}
.admin-bancfm-avatar {
  width: 40px; height: 40px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  font-family: var(--hud-font-mono);
  font-size: 14px; font-weight: 700; color: #fff;
}
.admin-bancfm-meta .nick { font-size: 13px; font-weight: 600; color: var(--hud-text); }
.admin-bancfm-meta .fp   {
  font-family: var(--hud-font-mono);
  font-size: 10px; color: var(--hud-cyan);
  letter-spacing: 0.3px;
}
.admin-bancfm-meta .ip   {
  font-family: var(--hud-font-mono);
  font-size: 10px; color: var(--hud-textDim); margin-top: 2px;
}

.admin-bancfm-section { margin-top: 14px; }
.admin-bancfm-sec-label {
  font-family: var(--hud-font-mono);
  font-size: 9px; letter-spacing: 1.5px;
  color: var(--hud-textDim);
  text-transform: uppercase;
}
.admin-bancfm-duration { display: flex; gap: 8px; margin-top: 8px; }
.admin-bancfm-dchip {
  flex: 1; padding: 8px 10px; border-radius: 4px;
  border: 1px solid var(--hud-line);
  color: var(--hud-text);
  font-family: var(--hud-font-mono);
  font-size: 11px; letter-spacing: 0.5px; text-align: center;
  background: transparent; cursor: pointer;
}
.admin-bancfm-dchip.is-active {
  background: rgba(255, 77, 79, 0.07);
  border-color: var(--hud-crimson, #ff4d4f);
  color: var(--hud-crimson, #ff4d4f);
}
.admin-bancfm-dchip.is-disabled {
  opacity: 0.35; cursor: not-allowed;
}

.admin-bancfm-reason {
  width: 100%; margin-top: 6px;
  padding: 8px 10px; border-radius: 4px;
  background: var(--hud-bg2);
  border: 1px solid var(--hud-line);
  color: var(--hud-text);
  font-family: var(--hud-font-sans, system-ui);
  font-size: 12px; outline: none;
}
.admin-bancfm-reason:focus { border-color: var(--hud-cyan); }

.admin-bancfm-warn {
  margin-top: 14px; padding: 10px 12px; border-radius: 4px;
  background: rgba(251, 191, 36, 0.05);
  border: 1px solid rgba(251, 191, 36, 0.19);
  font-family: var(--hud-font-mono);
  font-size: 10px; color: var(--hud-amber);
  letter-spacing: 0.3px; line-height: 1.5;
}

.admin-bancfm-foot {
  display: flex; gap: 10px; justify-content: flex-end;
  padding: 12px 20px;
  border-top: 1px solid var(--hud-line);
}
.admin-bancfm-cancel, .admin-bancfm-confirm {
  padding: 8px 20px; border-radius: 4px;
  font-family: var(--hud-font-mono);
  font-size: 11px; letter-spacing: 1px; cursor: pointer;
}
.admin-bancfm-cancel {
  background: transparent;
  border: 1px solid var(--hud-line);
  color: var(--hud-textDim);
}
.admin-bancfm-cancel:hover { color: var(--hud-text); }
.admin-bancfm-confirm {
  background: var(--hud-crimson, #ff4d4f);
  border: 1px solid var(--hud-crimson, #ff4d4f);
  color: #fff; font-weight: 700;
}
.admin-bancfm-confirm:hover { filter: brightness(1.05); }

@media (max-width: 720px) {
  .admin-bancfm-modal { width: calc(100% - 24px); }
  .admin-bancfm-duration { flex-wrap: wrap; }
  .admin-bancfm-dchip    { min-width: 80px; flex: 1 1 calc(50% - 4px); }
}


.admin-msgd-backdrop {
  position: absolute; inset: 0;
  background: rgba(5, 9, 16, 0.45);
  pointer-events: auto;
  animation: hud-fade-in 160ms ease-out;
}
.admin-msgd-drawer {
  position: relative;
  width: 100%; max-width: 480px;
  height: 100vh;
  background: var(--color-surface);
  border-left: 1px solid rgba(56, 189, 248, 0.45);
  box-shadow: -16px 0 40px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(56, 189, 248, 0.15);
  padding: 18px 18px 24px;
  overflow: auto;
  pointer-events: auto;
  animation: msgd-slide 200ms ease-out;
}
@keyframes msgd-slide {
  from { transform: translateX(100%); }
  to   { transform: translateX(0); }
}
@media (max-width: 540px) {
  .admin-msgd-drawer { max-width: 100%; padding: 14px; }
}

.admin-msgd-head {
  display: flex; align-items: center;
  margin-bottom: 12px;
}
.admin-msgd-kicker {
  font-family: var(--font-mono); font-size: 10px;
  letter-spacing: 1.5px;
  color: var(--color-primary);
}
.admin-msgd-nav {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 3px 7px;
  background: transparent;
  border: 1px solid var(--color-border, #1f2944);
  color: var(--color-text-strong);
  border-radius: 3px;
  cursor: pointer;
  font-family: var(--font-mono);
  font-size: 10px; letter-spacing: 0.4px;
  transition: all 120ms ease;
}
.admin-msgd-nav .arrow { font-size: 11px; }
.admin-msgd-nav + .admin-msgd-nav { margin-left: 0; }
.admin-msgd-nav:hover {
  color: var(--color-primary);
  border-color: rgba(56, 189, 248, 0.40);
}
.admin-msgd-close {
  display: inline-flex; align-items: center; gap: 4px; margin-left: 4px;
  padding: 3px 7px;
  background: transparent;
  border: 1px solid var(--color-border, #1f2944);
  color: var(--color-text-strong);
  border-radius: 3px;
  cursor: pointer;
  font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.4px;
  transition: all 120ms ease;
}
.admin-msgd-close .arrow { font-size: 11px; }
.admin-msgd-close:hover { color: var(--color-text-strong); border-color: var(--color-primary); }
.admin-msgd-counter {
  margin-left: auto;
  font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.4px;
  color: var(--color-text-muted);
}
.admin-msgd-keycap {
  display: inline-flex; align-items: center; justify-content: center;
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.3px;
  padding: 0 3px;
  border-radius: 2px;
  color: var(--color-text-muted);
  border: 1px solid var(--color-border, #1f2944);
  line-height: 1.4;
  user-select: none;
}

/* Bubble */
.admin-msgd-bubble {
  padding: 14px;
  background: var(--color-bg);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 4px;
}
.admin-msgd-bubble-head {
  display: flex; align-items: center; gap: 10px;
  margin-bottom: 10px;
}
.admin-msgd-avatar {
  width: 32px; height: 32px;
  display: flex; align-items: center; justify-content: center;
  border-radius: 50%;
  color: #fff;
  font-weight: 600; font-size: 14px;
  flex-shrink: 0;
}
.admin-msgd-bubble-meta { flex: 1; min-width: 0; }
.admin-msgd-bubble-meta .nick {
  font-size: 12px; font-weight: 600;
  color: var(--color-text-strong);
}
.admin-msgd-bubble-meta .ts {
  margin-top: 2px;
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-muted);
  letter-spacing: 0.3px;
}
.admin-msgd-status {
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.5px;
  padding: 2px 8px;
  border-radius: 2px;
}
.admin-msgd-status.is-good { color: #86efac; background: rgba(134, 239, 172, 0.10); border: 1px solid rgba(134, 239, 172, 0.40); }
.admin-msgd-status.is-warn { color: var(--color-warning); background: rgba(251, 191, 36, 0.10); border: 1px solid rgba(251, 191, 36, 0.40); }
.admin-msgd-bubble-text {
  font-size: 16px; line-height: 1.5;
  color: var(--color-text-strong);
  letter-spacing: 0.3px;
  padding: 6px 0;
  word-break: break-word;
}
.admin-msgd-bubble-foot {
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px dashed var(--color-border, #1f2944);
  display: flex; gap: 14px; flex-wrap: wrap;
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-muted);
  letter-spacing: 0.3px;
}
.admin-msgd-bubble-foot b {
  color: var(--color-text-strong);
  font-weight: 600;
}

/* Action bar */
.admin-msgd-actions {
  margin-top: 12px;
  display: grid; grid-template-columns: repeat(5, 1fr);
  gap: 4px;
}
.admin-msgd-actions button {
  padding: 8px 4px;
  background: transparent;
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 3px;
  cursor: pointer;
  text-align: center;
  font-family: inherit;
  color: var(--color-text-strong);
  transition: all 120ms ease;
}
.admin-msgd-actions button:disabled { opacity: 0.4; cursor: not-allowed; }
.admin-msgd-actions button:hover:not(:disabled) {
  background: var(--hover-tint);
  border-color: var(--color-primary);
}
.admin-msgd-actions button .icon { display: block; font-size: 14px; margin-bottom: 2px; }
.admin-msgd-actions button .lbl {
  font-family: var(--font-mono); font-size: 9px;
  letter-spacing: 0.4px;
  color: var(--color-text-muted);
}
.admin-msgd-actions button.is-danger {
  background: rgba(248, 113, 113, 0.05);
  border-color: rgba(248, 113, 113, 0.35);
  color: #f87171;
}
.admin-msgd-actions button.is-danger:hover:not(:disabled) {
  background: rgba(248, 113, 113, 0.12);
}
.admin-msgd-actions .admin-msgd-action-placeholder {
  justify-content: center;
  flex-direction: column;
  gap: 2px;
  min-height: 52px;
  border-radius: 3px;
  padding: 8px 4px;
}
.admin-msgd-actions .admin-msgd-action-placeholder .icon {
  font-size: 14px;
  line-height: 1;
}
.admin-msgd-actions .admin-msgd-action-placeholder .lbl {
  font-size: 9px;
  letter-spacing: 0.4px;
  text-transform: uppercase;
}

/* FP stats */
.admin-msgd-section-top { margin-top: 14px; }
.admin-msgd-fp-stats {
  margin-top: 8px;
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: 6px;
  padding: 10px;
  background: var(--color-bg);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 3px;
}
.admin-msgd-fp-stats .kpi .k {
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 1px;
  color: var(--color-text-muted);
}
.admin-msgd-fp-stats .kpi .v {
  margin-top: 2px;
  font-size: 18px; font-weight: 600;
  color: var(--color-text-strong);
}
.admin-msgd-fp-stats .kpi .v.is-warn { color: var(--color-warning); }
.admin-msgd-fp-stats .kpi .v .unit {
  font-size: 10px; margin-left: 4px;
  color: var(--color-text-muted); font-weight: 400;
}

.admin-msgd-fp-meta {
  margin-top: 6px;
  font-family: var(--font-mono); font-size: 10px;
  letter-spacing: 0.3px; line-height: 1.7;
  color: var(--color-text-muted);
}
.admin-msgd-fp-meta b { color: var(--color-text-strong); font-weight: 600; }

/* FP message list */
.admin-msgd-fp-list {
  margin-top: 8px;
  display: flex; flex-direction: column; gap: 4px;
}
.admin-msgd-fp-row {
  display: grid; grid-template-columns: 60px 1fr 50px;
  gap: 8px; padding: 6px 8px;
  background: transparent;
  border: 1px solid transparent;
  border-radius: 2px;
  font-family: var(--font-mono); font-size: 11px;
  align-items: center;
}
.admin-msgd-fp-row.is-current {
  background: rgba(56, 189, 248, 0.08);
  border-color: rgba(56, 189, 248, 0.40);
}
.admin-msgd-fp-row .t { color: var(--color-text-muted); }
.admin-msgd-fp-row .m { color: var(--color-text-strong); font-size: 11.5px; word-break: break-word; }
.admin-msgd-fp-row .s {
  color: #86efac;
  font-size: 9px; letter-spacing: 0.5px;
  text-align: right;
}
.admin-msgd-fp-row .s.is-masked { color: var(--color-warning); }
.admin-msgd-empty-rows {
  padding: 14px;
  text-align: center;
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-muted);
  border: 1px dashed var(--color-border, #1f2944);
  border-radius: 2px;
}

/* Ban preview */
.admin-msgd-ban-preview {
  margin-top: 14px;
  padding: 12px;
  background: rgba(56, 189, 248, 0.06);
  border: 1px solid rgba(56, 189, 248, 0.35);
  border-radius: 3px;
  font-size: 11px; line-height: 1.6;
  color: var(--color-text-strong);
}
.admin-msgd-ban-preview .kicker {
  display: block;
  font-family: var(--font-mono); font-size: 9px;
  letter-spacing: 1.2px;
  color: var(--color-primary);
  margin-bottom: 6px;
}
.admin-msgd-ban-preview b { font-weight: 600; }
.admin-msgd-ban-preview .impact { margin-top: 6px; }
.admin-msgd-empty {
  padding: 24px;
  text-align: center;
  color: var(--color-text-muted);
  font-size: 12px;
}

/* Strict prototype-aligned empty state blocks (Messages / Polls / Fonts). */
.admin-proto-empty {
  position: relative;
  min-height: 300px;
  border: 1px solid var(--hud-cyan-line, rgba(125, 211, 252, 0.3));
  background:
    linear-gradient(180deg, rgba(125, 211, 252, 0.05), rgba(8, 14, 26, 0.86));
  border-radius: 8px;
  padding: 30px 22px;
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 10px;
  overflow: hidden;
}
.admin-proto-empty::before,
.admin-proto-empty::after {
  content: "";
  position: absolute;
  width: 16px;
  height: 16px;
  border: 1px solid var(--hud-cyan-line, rgba(125, 211, 252, 0.35));
  pointer-events: none;
}
.admin-proto-empty::before {
  left: 14px;
  top: 14px;
  border-right: none;
  border-bottom: none;
}
.admin-proto-empty::after {
  right: 14px;
  bottom: 14px;
  border-left: none;
  border-top: none;
}
.admin-proto-empty-title {
  margin: 0;
  font-family: var(--font-display, "Zen Kaku Gothic New", "Noto Sans TC", sans-serif);
  font-size: 22px;
  font-weight: 600;
  letter-spacing: 0.03em;
  color: var(--color-text-strong);
}
.admin-proto-empty-desc {
  margin: 0;
  max-width: 520px;
  font-size: 13px;
  line-height: 1.7;
  color: var(--color-text-muted);
}
.admin-proto-empty-actions {
  display: flex;
  gap: 10px;
  margin-top: 2px;
}
.admin-proto-empty-primary,
.admin-proto-empty-secondary {
  padding: 10px 18px;
  border-radius: 4px;
  font-family: var(--font-mono);
  font-size: 12px;
  letter-spacing: 0.06em;
  cursor: pointer;
}
.admin-proto-empty-primary {
  border: 1px solid color-mix(in srgb, var(--color-primary) 70%, #ffffff 0%);
  background: var(--color-primary);
  color: #07101a;
  font-weight: 700;
}
.admin-proto-empty-secondary {
  border: 1px solid var(--color-border, #334155);
  background: transparent;
  color: var(--color-text-strong);
}
.admin-proto-empty-hint {
  margin-top: 2px;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.04em;
  color: var(--color-text-muted);
}
.admin-proto-empty--poll {
  margin-top: 10px;
}
.admin-proto-empty--fonts {
  margin-top: 12px;
}
.admin-proto-poll-template-grid {
  width: 100%;
  max-width: 700px;
  margin-top: 8px;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 10px;
}
.admin-proto-poll-template-card {
  text-align: left;
  padding: 12px;
  border-radius: 4px;
  border: 1px solid var(--hud-cyan-line, rgba(125, 211, 252, 0.3));
  background: rgba(56, 189, 248, 0.08);
}
.admin-proto-poll-template-card .t {
  font-size: 12px;
  font-weight: 600;
  color: var(--color-text-strong);
}
.admin-proto-poll-template-card .d {
  margin-top: 2px;
  font-size: 10px;
  color: var(--color-text-muted);
}
.admin-proto-poll-template-card .eta {
  margin-top: 6px;
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--color-primary);
}
.admin-proto-empty-qr {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 16px;
  border-radius: 4px;
  border: 1px solid var(--hud-cyan-line, rgba(125, 211, 252, 0.3));
  background: rgba(56, 189, 248, 0.08);
}
.admin-proto-empty-qr-box {
  width: 48px;
  height: 48px;
  border-radius: 4px;
  background: #ffffff;
  color: #000000;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-mono);
  font-size: 10px;
}
.admin-proto-empty-qr-meta {
  text-align: left;
}
.admin-proto-empty-qr-url {
  font-family: var(--font-mono);
  font-size: 14px;
  letter-spacing: 0.04em;
  color: var(--color-primary);
}
.admin-proto-empty-qr-label {
  margin-top: 2px;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.04em;
  color: var(--color-text-muted);
}
.admin-proto-empty-qr-copy {
  margin-left: 12px;
  padding: 6px 12px;
  border-radius: 3px;
  border: 1px solid var(--color-primary);
  background: transparent;
  color: var(--color-primary);
  font-family: var(--font-mono);
  font-size: 11px;
  cursor: pointer;
}
.admin-live-feed-empty-placeholder {
  min-height: 300px;
  margin-top: 0;
  justify-content: center;
}
.admin-live-feed-list {
  min-height: 300px;
}
.admin-font-upload-error {
  margin-top: 10px;
}
.admin-error-panel {
  border: 1px solid rgba(248, 113, 113, 0.45);
  background: rgba(248, 113, 113, 0.1);
  border-radius: 8px;
  padding: 12px;
}
.admin-error-panel-title {
  font-size: 13px;
  font-weight: 600;
  color: #fecaca;
}
.admin-error-panel-desc {
  margin-top: 6px;
  font-size: 11px;
  line-height: 1.55;
  color: #fca5a5;
}
.admin-error-panel-cta {
  margin-top: 10px;
  padding: 7px 10px;
  border: 1px solid rgba(248, 113, 113, 0.5);
  border-radius: 6px;
  background: rgba(248, 113, 113, 0.16);
  color: #fee2e2;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.5px;
  cursor: pointer;
}
.admin-error-panel-cta:hover {
  background: rgba(248, 113, 113, 0.24);
}

/* Live feed row clickability */
.admin-live-feed-row { cursor: pointer; }
.admin-live-feed-row:hover { background: rgba(56, 189, 248, 0.04); }

body[data-message-drawer-open="1"] .admin-msgd-overlay { pointer-events: auto; }

/* ─── Notifications Inbox (P1, 2026-04-27) ─────────────────────────── */
.admin-notif-page { padding: 0; }
.admin-notif-grid {
  display: grid;
  grid-template-columns: 240px 1fr;
  gap: 14px;
  align-items: start;
}
@media (max-width: 720px) {
  .admin-notif-grid { grid-template-columns: 1fr; }
}

.admin-notif-filters {
  background: var(--color-surface);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 8px;
  padding: 14px;
}
.admin-notif-tabs, .admin-notif-sources {
  display: flex; flex-direction: column; gap: 4px;
  margin-top: 10px;
}
.admin-notif-tab, .admin-notif-src {
  display: flex; align-items: center; gap: 8px;
  padding: 8px 10px;
  background: transparent;
  border: 1px solid transparent;
  border-radius: 3px;
  cursor: pointer;
  text-align: left;
  font-size: 12px;
  color: var(--color-text-muted);
  font-family: inherit;
  transition: all 120ms ease;
}
.admin-notif-tab .cnt, .admin-notif-src .cnt {
  margin-left: auto;
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-muted);
  letter-spacing: 0.4px;
}
.admin-notif-tab:hover, .admin-notif-src:hover {
  color: var(--color-text-strong);
}
.admin-notif-tab.is-active, .admin-notif-src.is-active {
  background: rgba(56, 189, 248, 0.10);
  border-color: rgba(56, 189, 248, 0.40);
  color: var(--color-text-strong);
}
.admin-notif-src.is-disabled {
  opacity: 0.6;
  border-style: dashed;
  pointer-events: none;
  cursor: default;
}
.admin-notif-tab.is-active .cnt, .admin-notif-src.is-active .cnt {
  color: var(--color-primary);
}
.admin-notif-src.admin-notif-src-placeholder {
  justify-content: flex-start;
}
.admin-notif-src.admin-notif-src-placeholder .cnt {
  margin-left: auto;
}
.admin-notif-label-top { margin-top: 14px; display: block; }
.admin-notif-tip {
  margin-top: 14px;
  padding: 10px;
  background: var(--color-bg);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 3px;
  font-family: var(--font-mono); font-size: 10px;
  letter-spacing: 0.3px; line-height: 1.6;
  color: var(--color-text-muted);
}
.admin-notif-tip .kicker {
  display: inline-block;
  margin-bottom: 4px;
  color: var(--color-primary);
}

.admin-notif-main {
  display: flex; flex-direction: column;
  min-width: 0;
}
.admin-notif-toolbar {
  display: flex; align-items: center; gap: 10px;
  padding-bottom: 10px;
  border-bottom: 1px solid var(--color-border, #1f2944);
  margin-bottom: 12px;
}
.admin-notif-summary {
  font-family: var(--font-mono); font-size: 11px;
  letter-spacing: 0.3px;
  color: var(--color-text-strong);
}
.admin-notif-actions {
  margin-left: auto;
  display: flex; gap: 4px;
  flex-wrap: wrap;
}
.admin-notif-action {
  padding: 6px 10px;
  background: transparent;
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 3px;
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-muted);
  cursor: pointer;
  letter-spacing: 0.3px;
  transition: all 120ms ease;
}
.admin-notif-action:hover {
  color: var(--color-primary);
  border-color: rgba(56, 189, 248, 0.40);
}

.admin-notif-list {
  display: flex; flex-direction: column; gap: 6px;
  min-height: 200px;
}
.admin-notif-loading {
  padding: 40px;
  text-align: center;
  font-family: var(--font-mono); font-size: 11px;
  color: var(--color-text-muted);
}

.admin-notif-item {
  padding: 12px;
  background: transparent;
  border: 1px solid transparent;
  border-left: 3px solid;
  border-radius: 4px;
  cursor: pointer;
  transition: all 140ms ease;
}
.admin-notif-item:hover {
  background: var(--hover-tint-weak);
  border-color: var(--color-border, #1f2944);
}
.admin-notif-item.is-unread {
  background: var(--color-bg);
  border-color: var(--color-border, #1f2944);
}
/* Row-level sev tint — matches admin-ev-v4__row[data-sev] from
   admin-events-log.js so both pages read with the same visual cadence
   (design v4 2026-05-17). Only warn/error tint; info stays neutral. */
.admin-notif-item[data-sev="warn"]  { background: rgba(251, 191, 36, 0.04); }
.admin-notif-item[data-sev="error"] { background: rgba(255, 77, 79, 0.05); }
.admin-notif-item.is-unread[data-sev="warn"]  { background: rgba(251, 191, 36, 0.07); }
.admin-notif-item.is-unread[data-sev="error"] { background: rgba(255, 77, 79, 0.09); }
.admin-notif-item.is-read { opacity: 0.7; }
.admin-notif-item.is-archived { opacity: 0.5; }
/* Inline "vs events" explainer under the page head — visually inherits
   from admin-ev-v4__explain; this rule only adds spacing context. */
.admin-notif-explain { margin-bottom: 14px; }
.admin-notif-item .head {
  display: flex; align-items: center; gap: 8px;
  margin-bottom: 4px;
}
.admin-notif-item .dot {
  width: 6px; height: 6px;
  border-radius: 50%;
  flex-shrink: 0;
}
.admin-notif-item .sev {
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 1.2px;
  padding: 2px 6px;
  border: 1px solid;
  border-radius: 2px;
  font-weight: 600;
}
.admin-notif-item .src {
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-muted);
  letter-spacing: 0.3px;
}
.admin-notif-item .ts {
  margin-left: auto;
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-muted);
  letter-spacing: 0.3px;
}
.admin-notif-item .title {
  font-size: 13px; font-weight: 600;
  color: var(--color-text-strong);
  margin-bottom: 4px;
}
.admin-notif-item.is-read .title,
.admin-notif-item.is-archived .title { font-weight: 400; }
.admin-notif-item .desc {
  font-size: 11px; line-height: 1.5;
  color: var(--color-text-muted);
  letter-spacing: 0.2px;
  word-break: break-word;
}
.admin-notif-item .actions {
  display: flex; gap: 4px;
  margin-top: 8px;
  flex-wrap: wrap;
}
.admin-notif-item .actions button {
  padding: 4px 10px;
  background: transparent;
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 2px;
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-muted);
  cursor: pointer;
  letter-spacing: 0.3px;
}
.admin-notif-item .actions button:hover {
  color: var(--color-primary);
  border-color: rgba(56, 189, 248, 0.40);
}

/* Starred state — prototype admin-batch7.jsx:169.
   ★ icon next to severity chip (amber) + amber tint when star button is on. */
.admin-notif-item .star {
  color: var(--color-warning);
  font-size: 11px;
  line-height: 1;
  flex-shrink: 0;
}
.admin-notif-item.is-starred {
  border-color: rgba(251, 191, 36, 0.25);
}
.admin-notif-item.is-archived.is-starred .star { opacity: 0.5; }
.admin-notif-item .actions button.is-on {
  color: var(--color-warning);
  border-color: rgba(251, 191, 36, 0.45);
  background: rgba(251, 191, 36, 0.08);
}
.admin-notif-item .actions button.is-on:hover {
  color: var(--color-warning);
  border-color: rgba(251, 191, 36, 0.65);
}

.admin-notif-empty {
  padding: 40px 20px;
  text-align: center;
  background: var(--color-bg);
  border: 1px dashed var(--color-border, #1f2944);
  border-radius: 4px;
}
.admin-notif-empty .icon {
  font-size: 36px;
  color: var(--color-text-muted);
  margin-bottom: 10px;
}
.admin-notif-empty .t {
  font-size: 13px; font-weight: 600;
  color: var(--color-text-strong);
}
.admin-notif-empty .s {
  margin-top: 6px;
  font-size: 11px; line-height: 1.6;
  color: var(--color-text-muted);
}

/* ── Notifications 3-col detail pane (2026-04-29) ── */
.admin-notif-grid--3col {
  grid-template-columns: 240px 1fr 300px;
}
@media (max-width: 960px) {
  .admin-notif-grid--3col { grid-template-columns: 240px 1fr; }
}
.admin-notif-detail {
  background: var(--color-surface);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 8px;
  padding: 0;
  min-height: 200px;
  overflow: hidden;
  display: flex; flex-direction: column;
}
.admin-notif-detail[hidden] { display: none; }
.admin-notif-detail-head {
  display: flex; align-items: center; gap: 8px;
  padding: 12px 14px;
  border-bottom: 1px solid var(--color-border, #1f2944);
}
.admin-notif-detail-close {
  margin-left: auto;
  background: transparent; border: none;
  color: var(--color-text-muted);
  cursor: pointer; font-size: 16px; line-height: 1;
  padding: 0 4px;
  transition: color 120ms ease;
}
.admin-notif-detail-close:hover { color: var(--color-text-strong); }
.admin-notif-detail-sev {
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 1.2px;
  padding: 2px 6px;
  border: 1px solid;
  border-radius: 2px;
  font-weight: 600;
}
.admin-notif-detail-body {
  padding: 14px;
  overflow-y: auto;
  flex: 1;
  display: flex; flex-direction: column; gap: 12px;
}
.admin-notif-detail-title {
  font-size: 13px; font-weight: 600;
  color: var(--color-text-strong);
  line-height: 1.4;
}
.admin-notif-detail-meta {
  display: flex; flex-direction: column; gap: 4px;
}
.admin-notif-detail-ts,
.admin-notif-detail-src-row {
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-muted);
  letter-spacing: 0.3px;
}
.admin-notif-detail-desc {
  font-size: 12px; line-height: 1.6;
  color: var(--color-text-muted);
}
.admin-notif-detail-raw-label {
  font-family: var(--font-mono); font-size: 9px;
  letter-spacing: 0.8px; text-transform: uppercase;
  color: var(--color-text-muted);
  margin-bottom: 4px;
}
.admin-notif-detail-raw {
  font-family: var(--font-mono); font-size: 10px;
  background: var(--color-bg);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 3px;
  padding: 10px;
  overflow-x: auto;
  color: var(--color-text-muted);
  white-space: pre;
  line-height: 1.5;
  letter-spacing: 0.2px;
}
.admin-notif-detail-actions {
  display: flex; gap: 6px; flex-wrap: wrap;
  padding-top: 8px;
  border-top: 1px solid var(--color-border, #1f2944);
}
.admin-notif-detail-actions button {
  padding: 6px 12px;
  background: transparent;
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 3px;
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-muted);
  cursor: pointer;
  letter-spacing: 0.3px;
  transition: all 120ms ease;
}
.admin-notif-detail-actions button:hover {
  color: var(--color-primary);
  border-color: rgba(56, 189, 248, 0.40);
}

/* ─── Audit Log (P1, 2026-04-27) ───────────────────────────────────── */
.admin-audit-page { padding: 0; }
.admin-audit-grid {
  display: grid;
  grid-template-columns: 240px 1fr;
  gap: 14px;
  align-items: start;
}
@media (max-width: 720px) {
  .admin-audit-grid { grid-template-columns: 1fr; }
}

.admin-audit-filters {
  background: var(--color-surface);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 8px;
  padding: 14px;
}
.admin-audit-source-list {
  display: flex; flex-direction: column; gap: 4px;
  margin-top: 10px;
}
.admin-audit-label-top { margin-top: 12px; display: block; }
.admin-audit-src {
  display: flex; align-items: center; gap: 8px;
  padding: 8px 10px;
  background: transparent;
  border: 1px solid transparent;
  border-radius: 3px;
  cursor: pointer;
  text-align: left;
  font-size: 12px;
  color: var(--color-text-muted);
  font-family: inherit;
}
.admin-audit-src .cnt {
  margin-left: auto;
  font-family: var(--font-mono); font-size: 10px;
  letter-spacing: 0.4px;
}
.admin-audit-src:hover { color: var(--color-text-strong); }
.admin-audit-src.is-active {
  background: rgba(56, 189, 248, 0.10);
  border-color: rgba(56, 189, 248, 0.40);
  color: var(--color-text-strong);
}
.admin-audit-src.is-active .cnt { color: var(--color-primary); }

.admin-audit-tip {
  margin-top: 14px;
  padding: 10px;
  background: var(--color-bg);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 3px;
  font-family: var(--font-mono); font-size: 10px;
  letter-spacing: 0.3px; line-height: 1.7;
  color: var(--color-text-muted);
}
.admin-audit-tip .kicker {
  display: block; margin-bottom: 4px;
  color: var(--color-primary);
}
.admin-audit-tip a { color: var(--color-primary); text-decoration: none; }
.admin-audit-tip a:hover { text-decoration: underline; }
.admin-audit-tip code {
  font-family: var(--font-mono);
  color: var(--color-text-strong);
  background: var(--hover-tint);
  padding: 1px 4px;
  border-radius: 2px;
}

.admin-audit-main { min-width: 0; }
.admin-audit-toolbar {
  display: flex; align-items: center; gap: 10px;
  padding-bottom: 10px;
  border-bottom: 1px solid var(--color-border, #1f2944);
  margin-bottom: 12px;
}
.admin-audit-summary {
  font-family: var(--font-mono); font-size: 11px;
  letter-spacing: 0.3px;
  color: var(--color-text-strong);
}
.admin-audit-actions { margin-left: auto; display: flex; gap: 4px; }
.admin-audit-action {
  padding: 6px 10px;
  background: transparent;
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 3px;
  font-family: var(--font-mono); font-size: 10px;
  letter-spacing: 0.3px;
  color: var(--color-text-muted);
  cursor: pointer;
}
.admin-audit-action:hover {
  color: var(--color-primary);
  border-color: rgba(56, 189, 248, 0.40);
}

.admin-audit-table-wrap {
  overflow-x: auto;
  background: var(--color-surface);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 4px;
}
.admin-audit-table {
  width: 100%;
  border-collapse: collapse;
  font-family: var(--font-mono);
  font-size: 11px;
}
.admin-audit-table thead {
  background: var(--color-bg);
  border-bottom: 1px solid var(--color-border, #1f2944);
}
.admin-audit-table th {
  padding: 8px 10px;
  text-align: left;
  font-size: 9px;
  letter-spacing: 1.2px;
  color: var(--color-text-muted);
  font-weight: 600;
  white-space: nowrap;
}
.admin-audit-table td {
  padding: 8px 10px;
  border-bottom: 1px solid var(--color-border, #1f2944);
  vertical-align: top;
}
.admin-audit-table .col-ts { color: var(--color-text-muted); white-space: nowrap; width: 1%; }
.admin-audit-table .col-src { width: 1%; white-space: nowrap; }
.admin-audit-table .col-kind { color: var(--color-text-strong); white-space: nowrap; }
.admin-audit-table .col-actor { color: var(--color-text-muted); white-space: nowrap; width: 1%; }
.admin-audit-table .col-meta {
  color: var(--color-text-muted);
  word-break: break-all;
}
.admin-audit-table .col-meta code {
  font-family: inherit;
  font-size: 10px;
  color: var(--color-text-secondary);
}
.admin-audit-row:hover { background: rgba(56, 189, 248, 0.04); }
.admin-audit-src-chip {
  display: inline-block;
  padding: 2px 8px;
  font-size: 9px;
  letter-spacing: 0.6px;
  border: 1px solid;
  border-radius: 2px;
  font-weight: 600;
}
.admin-audit-loading,
.admin-audit-empty {
  padding: 24px !important;
  text-align: center;
  color: var(--color-text-muted);
  font-size: 11px;
}
.admin-audit-hash-chip {
  margin-left: auto;
  display: inline-flex; align-items: center; gap: 6px;
  padding: 3px 8px;
  font-family: var(--font-mono);
  font-size: 9px; letter-spacing: 1.2px;
  background: var(--hud-cyan-soft, rgba(56,189,248,0.14));
  border: 1px solid var(--hud-cyan-line, rgba(56,189,248,0.30));
  border-radius: 2px;
  color: var(--color-primary);
  user-select: none; cursor: default;
}
.admin-audit-hash-chip .icon { font-size: 10px; }
.admin-audit-retain {
  padding: 3px 8px;
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.6px;
  border: 1px solid var(--color-border, #1f2944); border-radius: 2px;
  color: var(--color-text-muted);
  user-select: none;
}
.admin-audit-actor-chip {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: 11px; color: var(--color-text-strong);
}
.admin-audit-actor-av {
  width: 22px; height: 22px; border-radius: 50%;
  background: var(--hud-cyan-soft, rgba(56, 189, 248, 0.14));
  color: var(--color-primary);
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 10px; font-weight: 700;
  flex-shrink: 0;
}
.admin-audit-diff {
  font-family: var(--font-mono); font-size: 10px;
  letter-spacing: 0.3px;
}
.admin-audit-diff-b { color: var(--hud-crimson); }
.admin-audit-diff-a { color: var(--hud-lime, #a3e635); }
.admin-audit-meta-extra {
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-muted);
  margin-left: 4px;
}

/* ─── TabStrip (DS-001 / DS-002) ────────────────────────────────────── */
.admin-tabstrip {
  display: flex; gap: 0;
  border-bottom: 1px solid var(--color-border, #1f2944);
  background: var(--color-bg-elevated, #0f1524);
  padding: 0 4px;
}
.admin-tabstrip-tab {
  position: relative;
  padding: 14px 20px 12px;
  background: transparent; border: none; cursor: pointer;
  color: var(--color-text-muted);
  font-family: var(--font-sans); font-size: 13px;
  font-weight: 500; letter-spacing: 0.3px;
  display: inline-flex; align-items: center; gap: 8px;
  transition: color 120ms ease;
}
.admin-tabstrip-tab.is-active { color: var(--color-primary); font-weight: 600; }
.admin-tabstrip-tab:hover:not(.is-active) { color: var(--color-text-strong); }
.admin-tabstrip-tab__indicator {
  position: absolute; left: 8px; right: 8px; bottom: -1px; height: 2px;
  background: transparent; transition: background 120ms ease, box-shadow 120ms ease;
}
.admin-tabstrip-tab.is-active .admin-tabstrip-tab__indicator {
  background: var(--color-primary);
  box-shadow: 0 0 8px var(--color-primary);
}
.admin-tabstrip-icon { font-family: var(--font-mono); font-size: 12px; line-height: 1; }
.admin-tabstrip-en  { font-family: var(--font-mono); font-size: 10px; letter-spacing: 1px; }
.admin-tabstrip-count {
  font-family: var(--font-mono); font-size: 9.5px; letter-spacing: 0.5px;
  padding: 2px 6px; border-radius: 2px;
  background: transparent; border: 1px solid var(--color-border, #1f2944);
  color: var(--color-text-muted);
}
.admin-tabstrip-tab.is-active .admin-tabstrip-count {
  background: var(--hud-cyan-soft, rgba(56,189,248,0.14));
  border-color: var(--hud-cyan-line, rgba(56,189,248,0.30));
  color: var(--color-primary);
}

/* ─── History List tab content ───────────────────────────────────────── */
.admin-history-list-section { padding: 16px; }
.admin-history-list-head {
  display: flex; align-items: center; gap: 10px; margin-bottom: 10px;
}
.admin-history-list-count {
  font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.5px;
  color: var(--hud-lime, #a3e635);
}
.admin-history-list-header {
  display: grid; grid-template-columns: 80px 120px 1fr 80px;
  gap: 8px; padding: 6px 10px;
  border-bottom: 1px solid var(--color-border, #1f2944);
  font-family: var(--font-mono); font-size: 9.5px;
  color: var(--color-text-muted); letter-spacing: 1px;
}
.admin-history-list-row {
  display: grid; grid-template-columns: 80px 120px 1fr 80px;
  gap: 8px; padding: 7px 10px;
  border-bottom: 1px solid var(--color-border, #1f2944);
  font-size: 12px; align-items: center;
}
.admin-history-list-row .t {
  font-family: var(--font-mono); font-size: 11px;
  color: var(--color-text-muted);
}
.admin-history-list-row .n { color: var(--color-text-strong); }
.admin-history-list-row .m { color: var(--color-text-secondary); }
.admin-history-list-row .m em { font-style: italic; opacity: 0.7; }
.admin-history-list-row .s {
  justify-self: end; font-family: var(--font-mono);
  font-size: 9.5px; letter-spacing: 1px;
  padding: 2px 6px; border-radius: 2px;
}
.admin-history-list-row .s.is-shown  { color: var(--hud-lime, #a3e635); background: rgba(163,230,53,0.1); border: 1px solid rgba(163,230,53,0.3); }
.admin-history-list-row .s.is-masked { color: var(--hud-amber); background: rgba(251,191,36,0.1); border: 1px solid rgba(251,191,36,0.3); }
.admin-history-list-row .s.is-blocked { color: var(--hud-crimson); background: rgba(248,113,113,0.1); border: 1px solid rgba(248,113,113,0.3); }
.admin-history-list-body { max-height: 480px; overflow-y: auto; }
.admin-history-list-loading,
.admin-history-list-empty,
.admin-history-list-err {
  padding: 24px; text-align: center;
  color: var(--color-text-muted); font-size: 12px;
}

/* ─── Viewer Config FIELDS tab content ───────────────────────────────── */
.admin-vc-fields-grid {
  display: grid; grid-template-columns: 1fr 320px; gap: 14px; overflow: hidden;
}
.admin-vc-fields-list { display: flex; flex-direction: column; gap: 8px; overflow-y: auto; }
.admin-vc-field-row {
  display: grid; grid-template-columns: 8px 1fr auto; gap: 10px;
  padding: 10px 12px;
  background: var(--color-bg-elevated, #0f1524);
  border: 1px solid var(--color-border, #1f2944); border-radius: 3px;
  align-items: center;
}
.admin-vc-field-dot {
  width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;
}
.admin-vc-field-label {
  font-size: 13px; color: var(--color-text-strong);
  display: flex; align-items: center; gap: 6px;
}
.admin-vc-field-desc {
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-muted); margin-top: 2px; letter-spacing: 0.3px;
}
.admin-vc-field-badge {
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.5px;
  padding: 1px 5px; border-radius: 2px; border: 1px solid;
}
.admin-vc-field-badge--required {
  color: var(--color-text-muted);
  border-color: var(--color-border, #1f2944);
}
.admin-vc-field-badge--blocked {
  color: var(--hud-amber);
  border-color: rgba(251,191,36,0.35);
  background: rgba(251,191,36,0.1);
}
.admin-vc-toggle {
  font-family: var(--font-mono); font-size: 10px; letter-spacing: 1px;
  padding: 4px 10px; border-radius: 3px; cursor: pointer; border: 1px solid;
  transition: all 120ms ease;
}
.admin-vc-toggle.is-on {
  color: var(--color-primary);
  background: var(--hud-cyan-soft, rgba(56,189,248,0.14));
  border-color: var(--hud-cyan-line, rgba(56,189,248,0.30));
}
.admin-vc-toggle.is-off {
  color: var(--color-text-muted);
  background: transparent;
  border-color: var(--color-border, #1f2944);
}
.admin-vc-toggle[disabled] { cursor: not-allowed; opacity: 0.55; }
.admin-vc-preview { display: flex; flex-direction: column; gap: 10px; }
.admin-vc-preview-field { margin-bottom: 2px; }
.admin-vc-preview-label {
  font-family: var(--font-mono); font-size: 9.5px; letter-spacing: 1px;
  color: var(--color-text-muted); margin-bottom: 4px;
}
.admin-vc-preview-input {
  padding: 8px 12px;
  background: var(--hover-tint);
  border: 1px solid var(--color-border, #1f2944); border-radius: 3px;
  font-size: 13px; color: var(--color-text-strong); line-height: 1.5;
}
.admin-vc-preview-submit {
  margin-top: 4px; padding: 10px 14px; text-align: center;
  background: var(--color-primary); color: #000;
  font-family: var(--font-mono); font-size: 12px; font-weight: 700; letter-spacing: 1.5px;
  border-radius: 3px;
}
.admin-vc-tip {
  margin-top: auto; padding: 10px;
  background: var(--color-bg-elevated, #0f1524);
  border: 1px solid var(--color-border, #1f2944); border-radius: 3px;
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-muted); line-height: 1.6; letter-spacing: 0.3px;
}
.admin-vc-info-banner {
  padding: 8px 12px; margin-bottom: 2px;
  background: var(--hud-cyan-soft, rgba(56,189,248,0.14));
  border: 1px solid var(--hud-cyan-line, rgba(56,189,248,0.30)); border-radius: 3px;
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-strong); letter-spacing: 0.3px; line-height: 1.5;
}
.admin-vc-info-accent { color: var(--color-primary); letter-spacing: 1.2px; }
.admin-vc-fields-head {
  display: flex; align-items: center; gap: 10px; margin-bottom: 8px;
  font-family: var(--font-mono); font-size: 10px;
  color: var(--color-text-muted); letter-spacing: 0.5px;
}
.admin-vc-fields-count { margin-left: auto; }
.admin-vc-field-dot { background: var(--color-border, #1f2944); }
.admin-vc-field-dot.is-on { background: var(--color-primary); box-shadow: 0 0 6px var(--color-primary); }
.admin-vc-field-row.is-blocked { opacity: 0.55; }
.admin-vc-col-panel {
  background: var(--color-bg-elevated, #0f1524);
  border: 1px solid var(--color-border, #1f2944); border-radius: 3px;
  padding: 14px; overflow: auto; display: flex; flex-direction: column; gap: 10px;
}
.admin-vc-preview-form {
  background: var(--color-bg);
  border: 1px solid var(--color-border, #1f2944); border-radius: 3px;
  padding: 14px; display: flex; flex-direction: column; gap: 10px;
}
.admin-vc-swatch {
  display: inline-flex; gap: 4px; align-items: center;
}
.admin-vc-swatch-dot {
  width: 18px; height: 18px; border-radius: 9px;
}

/* ─── Audience (P3 Group B, 2026-04-27) ────────────────────────────── */
.admin-audience-page { padding: 0; }
.admin-aud-grid { display: flex; flex-direction: column; gap: 14px; }
.admin-aud-stats {
  display: grid; grid-template-columns: repeat(5, 1fr);
  gap: 10px;
}
@media (max-width: 720px) {
  .admin-aud-stats { grid-template-columns: repeat(2, 1fr); }
}
.admin-aud-stat {
  background: var(--color-surface);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 8px;
  padding: 12px;
}
.admin-aud-stat .k {
  font-family: var(--font-mono); font-size: 9px; letter-spacing: 1.2px;
  color: var(--color-text-muted);
}
.admin-aud-stat .v {
  margin-top: 4px;
  font-size: 22px; font-weight: 600;
  color: var(--color-text-strong);
}

.admin-aud-table-wrap {
  background: var(--color-surface);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 8px;
  padding: 14px;
}
.admin-aud-toolbar {
  display: flex; align-items: center; gap: 10px;
  margin-bottom: 10px; flex-wrap: wrap;
}
.admin-aud-summary {
  font-family: var(--font-mono); font-size: 11px;
  color: var(--color-text-muted);
}
.admin-aud-filters { display: flex; gap: 4px; margin-left: auto; }
.admin-aud-filters .chip {
  padding: 4px 10px;
  font-family: var(--font-mono); font-size: 11px;
  color: var(--color-text-muted);
  background: transparent;
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 2px;
  cursor: pointer;
}
.admin-aud-filters .chip.is-active {
  color: var(--color-primary);
  background: rgba(56, 189, 248, 0.10);
  border-color: rgba(56, 189, 248, 0.45);
}
.admin-aud-refresh {
  padding: 4px 10px;
  background: transparent;
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 3px;
  font-family: var(--font-mono); font-size: 12px;
  color: var(--color-text-muted);
  cursor: pointer;
}
.admin-aud-refresh:hover { color: var(--color-primary); border-color: rgba(56, 189, 248, 0.40); }

.admin-aud-list {
  display: flex; flex-direction: column;
  overflow-x: auto;
}
.admin-aud-row {
  display: grid;
  grid-template-columns: 32px 1.6fr 1.4fr 70px 70px 90px 80px;
  gap: 10px;
  padding: 10px 12px;
  align-items: center;
  border-bottom: 1px solid var(--color-border, #1f2944);
  min-width: 720px;
}
.admin-aud-row--head {
  font-family: var(--font-mono); font-size: 9px;
  letter-spacing: 1.2px;
  color: var(--color-text-muted);
  background: var(--color-bg);
}
.admin-aud-row .col-msgs,
.admin-aud-row .col-joined { text-align: right; }
.admin-aud-row .col-status,
.admin-aud-row .col-actions { text-align: right; }

.admin-aud-row .avatar {
  width: 26px; height: 26px;
  border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-weight: 600; font-size: 12px;
}
.admin-aud-row .nick {
  font-size: 12px; font-weight: 600;
  color: var(--color-text-strong);
}
.admin-aud-row .fp {
  margin-top: 2px;
  font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.3px;
  color: var(--color-text-muted);
}
.admin-aud-row .ip {
  font-family: var(--font-mono); font-size: 11px;
  color: var(--color-text-strong);
}
.admin-aud-row .ua {
  margin-top: 2px;
  font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.3px;
  color: var(--color-text-muted);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.admin-aud-row .col-joined {
  font-family: var(--font-mono); font-size: 11px;
  color: var(--color-text-strong);
}
.admin-aud-row .col-msgs {
  font-family: var(--font-mono); font-size: 12px; font-weight: 600;
  color: #86efac;
}
.admin-aud-row .col-status .chip {
  font-family: var(--font-mono); font-size: 9px;
  letter-spacing: 0.5px; font-weight: 600;
  padding: 2px 6px;
  border: 1px solid;
  border-radius: 2px;
  display: inline-block;
}
.admin-aud-action {
  padding: 3px 8px;
  font-family: var(--font-mono); font-size: 10px;
  color: #f87171;
  border: 1px solid rgba(248, 113, 113, 0.40);
  border-radius: 2px;
  background: transparent;
  cursor: pointer;
}
.admin-aud-action:hover {
  background: rgba(248, 113, 113, 0.10);
}
.admin-aud-row[data-aud-row]:not(.admin-aud-row--head) {
  cursor: pointer;
}
.admin-aud-row[data-aud-row]:not(.admin-aud-row--head):hover {
  background: rgba(56, 189, 248, 0.04);
}
.admin-aud-row.is-selected {
  background: rgba(56, 189, 248, 0.10) !important;
  box-shadow: inset 3px 0 0 var(--color-primary);
}

/* Detail panel — prototype admin-batch7.jsx:723. 360px right rail
   visible whenever a row is selected. */
.admin-aud-main-row {
  display: grid;
  grid-template-columns: 1fr;
  gap: 14px;
  align-items: start;
}
.admin-aud-main-row:has(> .admin-aud-detail:not([hidden])) {
  grid-template-columns: 1fr 360px;
}
@media (max-width: 1100px) {
  .admin-aud-main-row:has(> .admin-aud-detail:not([hidden])) {
    grid-template-columns: 1fr; /* stack on narrow */
  }
}
.admin-aud-detail {
  background: var(--color-bg-elevated, #0f1421);
  border: 1px solid rgba(248, 113, 113, 0.35);
  border-radius: 6px;
  padding: 16px;
  overflow: auto;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.admin-aud-detail[data-risk-level="normal"] { border-color: rgba(134, 239, 172, 0.30); }
.admin-aud-detail[data-risk-level="mid"] { border-color: rgba(251, 191, 36, 0.45); }
.admin-aud-detail[data-risk-level="blocked"],
.admin-aud-detail[data-risk-level="high"] { border-color: rgba(248, 113, 113, 0.50); }

.admin-aud-detail-head {
  display: flex;
  align-items: center;
  gap: 8px;
}
.admin-aud-detail-head .risk {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 1.5px;
  padding: 2px 8px;
  border: 1px solid;
  border-radius: 2px;
  font-weight: 600;
}
.admin-aud-detail-head .close {
  margin-left: auto;
  background: transparent;
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 2px;
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--color-text-muted);
  width: 24px; height: 22px;
  cursor: pointer;
}
.admin-aud-detail-head .close:hover {
  color: var(--color-primary);
  border-color: rgba(56, 189, 248, 0.40);
}
.admin-aud-detail-id {
  display: flex;
  align-items: center;
  gap: 10px;
}
.admin-aud-detail-id .avatar {
  width: 36px; height: 36px;
  border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-weight: 600; font-size: 16px;
}
.admin-aud-detail-id .nick {
  font-size: 14px; font-weight: 600;
  color: var(--color-text-strong);
}
.admin-aud-detail-id .fp {
  margin-top: 2px;
  font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.3px;
  color: var(--color-text-muted);
}

.admin-aud-detail-flag {
  padding: 10px;
  border-radius: 3px;
  font-size: 11px;
  line-height: 1.6;
  background: rgba(248, 113, 113, 0.06);
  border: 1px solid rgba(248, 113, 113, 0.40);
  color: var(--color-text-strong);
}
.admin-aud-detail-flag[data-risk="normal"] {
  background: rgba(134, 239, 172, 0.06);
  border-color: rgba(134, 239, 172, 0.30);
}
.admin-aud-detail-flag[data-risk="mid"] {
  background: rgba(251, 191, 36, 0.06);
  border-color: rgba(251, 191, 36, 0.40);
}
.admin-aud-detail-flag .hd {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 1.2px;
  color: #f87171;
  margin-bottom: 4px;
}
.admin-aud-detail-flag[data-risk="normal"] .hd { color: #86efac; }
.admin-aud-detail-flag[data-risk="mid"] .hd { color: #fbbf24; }
.admin-aud-detail-flag ul {
  margin: 0;
  padding-left: 14px;
  list-style: "· ";
}
.admin-aud-detail-flag li { padding: 2px 0; }
.admin-aud-detail-flag li.ok { list-style: "✓ "; color: #86efac; }

.admin-aud-detail-label { margin-top: 4px; }

.admin-aud-detail-messages {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.admin-aud-detail-msg {
  display: grid;
  grid-template-columns: 60px 1fr 60px;
  gap: 8px;
  padding: 6px 8px;
  background: var(--color-bg);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 2px;
  font-family: var(--font-mono);
  font-size: 11px;
  align-items: center;
}
.admin-aud-detail-msg .ts { color: var(--color-text-muted); }
.admin-aud-detail-msg .m {
  color: var(--color-text-strong);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.admin-aud-detail-msg .s {
  font-size: 9px;
  letter-spacing: 0.5px;
  text-align: right;
}
.admin-aud-detail-loading,
.admin-aud-detail-empty {
  padding: 14px;
  text-align: center;
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--color-text-muted);
}

.admin-aud-detail-actions {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.admin-aud-detail-actions button {
  padding: 10px;
  border-radius: 3px;
  font-family: var(--font-mono);
  font-size: 12px;
  letter-spacing: 0.5px;
  cursor: pointer;
  background: transparent;
  border: 1px solid var(--color-border, #1f2944);
  color: var(--color-text-strong);
}
.admin-aud-detail-actions button:hover:not(:disabled) {
  background: rgba(56, 189, 248, 0.04);
}
.admin-aud-detail-actions button.primary {
  background: #f87171;
  color: #000;
  border-color: #f87171;
  font-weight: 600;
}
.admin-aud-detail-actions button.primary:hover {
  filter: brightness(1.05);
  background: #f87171;
}
.admin-aud-detail-actions button.warn {
  color: #fbbf24;
  border-color: rgba(251, 191, 36, 0.45);
}
.admin-aud-detail-actions button.warn:hover {
  background: rgba(251, 191, 36, 0.08);
}
.admin-aud-detail-actions button:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}
.admin-aud-detail-actions .admin-be-placeholder-control {
  width: 100%;
  justify-content: flex-start;
  padding: 10px;
  font-size: 11px;
}
.admin-aud-empty {
  padding: 40px 20px; text-align: center;
}
.admin-aud-empty .t {
  font-size: 13px; font-weight: 600;
  color: var(--color-text-strong);
}
.admin-aud-empty .s {
  margin-top: 6px;
  font-size: 11px; line-height: 1.6;
  color: var(--color-text-muted);
}
.admin-aud-loading {
  padding: 30px; text-align: center;
  font-family: var(--font-mono); font-size: 11px;
  color: var(--color-text-muted);
}

/* ─── Webhooks v2 (prototype admin-batch6.jsx:6, 2026-04-29) ──────────
   1fr 380px grid: 4-KPI stats + endpoint cards + delivery log on left,
   selected-endpoint detail (events / retry / payload / actions) on right. */
.admin-webhooks-page { padding: 0; }

.admin-wh-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 14px;
  align-items: start;
}
.admin-wh-grid:has(> .admin-wh-detail:not([hidden])) {
  grid-template-columns: 1fr 380px;
}
@media (max-width: 1100px) {
  .admin-wh-grid:has(> .admin-wh-detail:not([hidden])) {
    grid-template-columns: 1fr;
  }
}
.admin-wh-main { display: flex; flex-direction: column; gap: 14px; min-width: 0; }

/* 4-KPI stats strip */
.admin-wh-stats {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 10px;
}
@media (max-width: 768px) { .admin-wh-stats { grid-template-columns: 1fr 1fr; } }
.admin-wh-stat {
  background: var(--color-bg-elevated);
  border: 1px solid var(--hud-line);
  border-radius: 6px;
  padding: 12px;
}
.admin-wh-stat .k {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 1.2px;
  color: var(--color-text-muted);
  text-transform: uppercase;
}
.admin-wh-stat .v {
  font-size: 22px;
  font-weight: 600;
  color: var(--color-text-strong);
  margin-top: 4px;
}

/* Section heads (endpoint card + log card) */
.admin-wh-section-head {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 10px;
}
.admin-wh-section-head .admin-wh-add-btn,
.admin-wh-section-head .admin-wh-log-filters { margin-left: auto; }
.admin-wh-add-btn {
  padding: 6px 12px;
  background: var(--hud-cyan-soft);
  color: var(--color-primary);
  border: 1px solid rgba(56, 189, 248, 0.45);
  border-radius: 3px;
  font-family: var(--font-mono);
  font-size: 11px;
  cursor: pointer;
}
.admin-wh-add-btn:hover { background: rgba(56, 189, 248, 0.16); }

/* Add form */
.admin-wh-add-form {
  border: 1px dashed var(--hud-line);
  border-radius: 4px;
  padding: 14px;
  margin-bottom: 12px;
}
.admin-wh-form-grid {
  display: grid;
  grid-template-columns: 2fr 1fr 1fr;
  gap: 10px;
}
@media (max-width: 768px) { .admin-wh-form-grid { grid-template-columns: 1fr; } }
.admin-wh-form-field { display: flex; flex-direction: column; gap: 4px; }
.admin-wh-form-events {
  margin-top: 12px;
  border: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
}
.admin-wh-form-events label {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--color-text-strong);
}
.admin-wh-form-actions {
  margin-top: 12px;
  display: flex;
  gap: 8px;
}

/* Endpoints list */
.admin-wh-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.admin-wh-card {
  padding: 12px;
  background: var(--color-bg);
  border: 1px solid var(--hud-line);
  border-radius: 4px;
  cursor: pointer;
  transition: border-color 140ms, background 140ms;
}
.admin-wh-card:hover { background: rgba(56, 189, 248, 0.04); }
.admin-wh-card.is-selected {
  background: rgba(56, 189, 248, 0.10);
  border-color: rgba(56, 189, 248, 0.45);
}
.admin-wh-card-head {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 6px;
  flex-wrap: wrap;
}
.admin-wh-card-head .dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  flex-shrink: 0;
}
.admin-wh-card-head .name {
  font-size: 13px;
  font-weight: 600;
  color: var(--color-text-strong);
}
.admin-wh-card-head .status {
  font-family: var(--font-mono);
  font-size: 9px;
  padding: 2px 8px;
  border: 1px solid;
  border-radius: 2px;
  letter-spacing: 0.8px;
}
.admin-wh-card-head .last {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--color-text-muted);
  letter-spacing: 0.4px;
}
.admin-wh-card-url {
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--color-text-muted);
  letter-spacing: 0.3px;
  margin-bottom: 8px;
  word-break: break-all;
}
.admin-wh-card-events {
  display: flex;
  gap: 6px;
  flex-wrap: wrap;
  margin-bottom: 8px;
}
.admin-wh-evt-chip {
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--color-text-strong);
  padding: 3px 8px;
  background: var(--color-bg-elevated);
  border: 1px solid var(--hud-line);
  border-radius: 2px;
  letter-spacing: 0.3px;
}
.admin-wh-card-warn {
  font-size: 11px;
  color: var(--color-warning);
  padding: 6px 10px;
  background: rgba(251, 191, 36, 0.08);
  border: 1px solid rgba(251, 191, 36, 0.40);
  border-radius: 3px;
  margin-bottom: 8px;
  font-family: var(--font-mono);
  letter-spacing: 0.3px;
}
.admin-wh-card-foot {
  display: grid;
  grid-template-columns: 1fr auto auto auto auto;
  gap: 12px;
  align-items: center;
}
@media (max-width: 768px) {
  .admin-wh-card-foot { grid-template-columns: 1fr; gap: 6px; }
}
.admin-wh-card-rate {
  display: flex;
  align-items: center;
  gap: 6px;
}
.admin-wh-card-rate .lbl {
  font-family: var(--font-mono);
  font-size: 9px;
  color: var(--color-text-muted);
  letter-spacing: 0.5px;
}
.admin-wh-card-rate .bar {
  flex: 1;
  max-width: 120px;
  height: 4px;
  background: var(--hud-line);
  border-radius: 2px;
  overflow: hidden;
}
.admin-wh-card-rate .fill { height: 100%; }
.admin-wh-card-rate .pct {
  font-family: var(--font-mono);
  font-size: 11px;
  font-weight: 600;
}
.admin-wh-card-foot .counter {
  font-family: var(--font-mono);
  font-size: 11px;
}
.admin-wh-card-foot .counter.ok { color: #86efac; }
.admin-wh-card-foot .counter.fail { color: var(--color-warning); }
.admin-wh-card-foot .counter.fail-zero { color: var(--color-text-muted); }
.admin-wh-card-btn {
  font-family: var(--font-mono);
  font-size: 10px;
  padding: 4px 8px;
  background: transparent;
  border: 1px solid var(--hud-line);
  border-radius: 2px;
  color: var(--color-text-muted);
  cursor: pointer;
}
.admin-wh-card-btn:hover {
  color: var(--color-primary);
  border-color: rgba(56, 189, 248, 0.40);
}
.admin-wh-card-btn.is-primary {
  color: var(--color-primary);
  border-color: rgba(56, 189, 248, 0.45);
}

/* Delivery log */
.admin-wh-log-filters .chip {
  padding: 4px 10px;
  background: transparent;
  border: 1px solid var(--hud-line);
  border-radius: 2px;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.4px;
  color: var(--color-text-muted);
  cursor: pointer;
  margin-left: 4px;
}
.admin-wh-log-filters .chip.is-active {
  background: var(--hud-cyan-soft);
  color: var(--color-primary);
  border-color: rgba(56, 189, 248, 0.45);
}
.admin-wh-log-list { display: flex; flex-direction: column; }
.admin-wh-log-row {
  display: grid;
  grid-template-columns: 70px 60px 70px 1.4fr 1.6fr 60px;
  gap: 8px;
  padding: 8px 10px;
  align-items: center;
  border-bottom: 1px solid var(--hud-line);
  font-family: var(--font-mono);
  font-size: 11px;
}
.admin-wh-log-row--head {
  font-size: 9px;
  letter-spacing: 1px;
  color: var(--color-text-muted);
  background: var(--color-bg);
}
.admin-wh-log-row.is-dropped { background: rgba(248, 113, 113, 0.04); }
.admin-wh-log-row .time { color: var(--color-text-muted); }
.admin-wh-log-row .code {
  padding: 2px 6px;
  border: 1px solid;
  border-radius: 2px;
  text-align: center;
  font-size: 10px;
}
.admin-wh-log-row .ep {
  color: var(--color-text-strong);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.admin-wh-log-row .evt { color: var(--color-primary); }
.admin-wh-log-row .retry { text-align: center; }

/* Right detail panel */
.admin-wh-detail {
  background: var(--color-bg-elevated);
  border: 1px solid var(--hud-line);
  border-radius: 6px;
  padding: 16px;
  overflow: auto;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.admin-wh-detail-head {
  display: flex;
  align-items: center;
  gap: 8px;
}
.admin-wh-detail-head .dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
}
.admin-wh-detail-head .name {
  font-size: 13px;
  font-weight: 600;
  color: var(--color-text-strong);
}
.admin-wh-detail-head .close {
  margin-left: auto;
  background: transparent;
  border: 1px solid var(--hud-line);
  border-radius: 2px;
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--color-text-muted);
  width: 24px; height: 22px;
  cursor: pointer;
}
.admin-wh-detail-label { margin-top: 4px; }
.admin-wh-detail-events {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.admin-wh-detail-evt {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px 10px;
  background: var(--color-bg);
  border: 1px solid var(--hud-line);
  border-radius: 3px;
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--color-text-muted);
  cursor: default;
}
.admin-wh-detail-evt.is-on {
  background: var(--hud-cyan-soft);
  border-color: rgba(56, 189, 248, 0.45);
  color: var(--color-text-strong);
}
.admin-wh-detail-evt .check {
  width: 12px;
  height: 12px;
  border: 1px solid var(--hud-line);
  border-radius: 2px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 9px;
  font-weight: 700;
}
.admin-wh-detail-evt.is-on .check {
  background: var(--color-primary);
  color: #000;
  border-color: var(--color-primary);
}
.admin-wh-detail-evt.is-unsupported {
  opacity: 0.55;
}
.admin-wh-detail-evt .tag {
  margin-left: auto;
  font-size: 9px;
  color: var(--color-warning);
  letter-spacing: 0.5px;
}

.admin-wh-detail-policy {
  padding: 10px;
  background: var(--color-bg);
  border: 1px solid var(--hud-line);
  border-radius: 4px;
  font-family: var(--font-mono);
  font-size: 11px;
  line-height: 1.7;
}
.admin-wh-detail-policy > div {
  display: flex;
  justify-content: space-between;
  gap: 8px;
}
.admin-wh-detail-policy .k { color: var(--color-text-muted); }
.admin-wh-detail-policy .v { color: var(--color-text-strong); }

.admin-wh-detail-payload {
  margin: 0;
  padding: 10px;
  background: #000;
  color: #86efac;
  font-family: var(--font-mono);
  font-size: 10px;
  line-height: 1.6;
  border-radius: 4px;
  border: 1px solid var(--hud-line);
  white-space: pre-wrap;
  word-break: break-all;
}

.admin-wh-detail-actions {
  display: flex;
  gap: 8px;
  margin-top: auto;
  padding-top: 6px;
}
.admin-wh-detail-actions button {
  padding: 8px 12px;
  border-radius: 3px;
  font-family: var(--font-mono);
  font-size: 11px;
  cursor: pointer;
  background: transparent;
  border: 1px solid var(--hud-line);
  color: var(--color-text-strong);
}
.admin-wh-detail-actions button.primary {
  flex: 1;
  background: var(--hud-cyan-soft);
  color: var(--color-primary);
  border-color: rgba(56, 189, 248, 0.45);
}
.admin-wh-detail-actions button.warn {
  color: var(--color-warning);
  border-color: rgba(251, 191, 36, 0.45);
}
.admin-wh-detail-actions button.danger {
  color: #f87171;
  border-color: rgba(248, 113, 113, 0.40);
}
.admin-wh-detail-actions .admin-be-placeholder-control {
  flex: 1;
  justify-content: center;
}

.admin-wh-empty {
  padding: 20px;
  text-align: center;
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--color-text-muted);
}

/* ─── Session Banner (2026-04-29) ──────────────────────────────────────── */
.admin-session-banner {
  margin-bottom: 12px;
  border-radius: 6px;
  overflow: hidden;
}

/* IDLE state */
.admin-session-banner-idle {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 14px 16px;
  background: var(--color-surface);
  border: 1px dashed var(--color-border, #1f2944);
  border-radius: 6px;
}
.admin-session-banner-idle-label {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.4px;
  color: var(--color-text-muted);
}
.admin-session-open-row {
  display: flex;
  gap: 8px;
  align-items: center;
}
.admin-session-name-input {
  flex: 1;
  padding: 8px 12px;
  background: var(--color-bg);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 4px;
  color: var(--color-text-strong);
  font-family: inherit;
  font-size: 13px;
  transition: border-color 120ms ease;
}
.admin-session-name-input:focus {
  outline: none;
  border-color: var(--color-primary);
}
.admin-session-open-btn {
  padding: 8px 16px;
  background: var(--color-primary);
  border: none;
  border-radius: 4px;
  color: #000;
  font-family: var(--font-mono);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.4px;
  cursor: pointer;
  white-space: nowrap;
  transition: background 120ms ease;
}
.admin-session-open-btn:hover:not(:disabled) { background: #5fc8ff; }
.admin-session-open-btn:disabled { opacity: 0.5; cursor: not-allowed; }
.admin-session-banner-idle-hint {
  font-size: 10px;
  color: var(--color-text-muted);
  letter-spacing: 0.2px;
}

/* LIVE state */
.admin-session-banner-live {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 12px 16px;
  background: rgba(56, 189, 248, 0.06);
  border: 1px solid rgba(56, 189, 248, 0.35);
  border-radius: 6px;
  flex-wrap: wrap;
}
.admin-session-live-dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--color-success, #86efac);
  flex-shrink: 0;
  animation: admin-sess-pulse 2s ease-in-out infinite;
}
@keyframes admin-sess-pulse {
  0%, 100% { box-shadow: 0 0 0 0 rgba(134, 239, 172, 0.5); }
  50%       { box-shadow: 0 0 0 5px rgba(134, 239, 172, 0); }
}
.admin-session-live-info {
  display: flex;
  flex-direction: column;
  gap: 2px;
  flex: 1;
  min-width: 0;
}
.admin-session-live-name {
  font-size: 13px;
  font-weight: 600;
  color: var(--color-text-strong);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.admin-session-live-timer {
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--color-text-muted);
  letter-spacing: 0.4px;
}
.admin-session-live-actions {
  display: flex;
  gap: 6px;
  flex-shrink: 0;
}
.admin-session-pause-btn,
.admin-session-end-btn {
  padding: 6px 12px;
  border-radius: 3px;
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.4px;
  cursor: pointer;
  transition: all 120ms ease;
}
.admin-session-pause-btn {
  background: transparent;
  border: 1px solid rgba(56, 189, 248, 0.40);
  color: var(--color-primary);
}
.admin-session-pause-btn:hover { background: rgba(56, 189, 248, 0.08); }
.admin-session-pause-btn.is-paused {
  background: rgba(56, 189, 248, 0.12);
  border-color: var(--color-primary);
}
.admin-session-end-btn {
  background: transparent;
  border: 1px solid rgba(248, 113, 113, 0.45);
  color: #f87171;
}
.admin-session-end-btn:hover { background: rgba(248, 113, 113, 0.08); }
.admin-session-live-behavior {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-shrink: 0;
}
.admin-session-live-behavior-label {
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--color-text-muted);
  letter-spacing: 0.3px;
  white-space: nowrap;
}
.admin-session-behavior-select {
  padding: 4px 8px;
  background: var(--color-bg);
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 3px;
  color: var(--color-text-strong);
  font-family: var(--font-mono);
  font-size: 10px;
  cursor: pointer;
}

/* Slice 8: Backstage panel CSS removed — Slice 4 collapsed the sidebar to
 * 10 P0-0 buttons + Slice 6 added system accordion, so the dashed-border
 * collapsible panel + sub-labels have nothing to host. */
/* 關於 — standalone item pinned below sidebar with a faint separator */
.admin-dash-nav-row--about {
  margin-top: 8px;
  border-top: 1px solid var(--color-border, #1f2944);
  padding-top: 4px;
  opacity: 0.7;
}
.admin-dash-nav-row--about:hover {
  opacity: 1;
}

/* ── P0-0a · Tab strip (Slice 3) ──────────────────────────────────────── */
[data-admin-tabs-host] {
  padding: 0 24px;
  border-bottom: 1px solid var(--color-border, #1f2944);
  background: var(--color-panel);
}
[data-admin-tabs-host][hidden] { display: none; }

.admin-tabs-strip {
  display: flex;
  gap: 4px;
  align-items: stretch;
  height: 40px;
}

.admin-tabs-btn {
  background: transparent;
  border: 0;
  border-bottom: 2px solid transparent;
  color: var(--color-text-secondary);
  cursor: pointer;
  display: inline-flex;
  flex-direction: column;
  justify-content: center;
  gap: 2px;
  padding: 0 14px;
  font-family: inherit;
  text-align: left;
  transition: color 0.12s ease, border-color 0.12s ease, background 0.12s ease;
}

.admin-tabs-btn:hover {
  color: var(--color-text-bright, #f1f5f9);
  background: rgba(56, 189, 248, 0.06);
}

.admin-tabs-btn.is-active {
  color: #38bdf8;
  border-bottom-color: rgba(56, 189, 248, 0.45);
  background: rgba(56, 189, 248, 0.08);
}

.admin-tabs-btn-label {
  font-size: 13px;
  font-weight: 600;
  line-height: 1;
}

.admin-tabs-btn-en {
  font-family: "IBM Plex Mono", "JetBrains Mono", ui-monospace, monospace;
  font-size: 9px;
  letter-spacing: 1.4px;
  opacity: 0.7;
}

@media (max-width: 640px) {
  [data-admin-tabs-host] { padding: 0 12px; }
  .admin-tabs-btn { padding: 0 10px; }
  .admin-tabs-btn-en { display: none; }
}

/* ── Slice 6 · System accordion (vertical mode of tabs host) ───────────── */
[data-admin-tabs-host].admin-tabs-host--accordion {
  padding: 16px 24px;
  background: var(--color-panel);
  border-bottom: 1px solid var(--color-border, #1f2944);
}

.admin-system-accordion {
  display: flex;
  flex-direction: column;
  gap: 4px;
  max-width: 720px;
}

/* Phase B (2026-05-06): group dividers between settings / tokens /
 * automation / history. The first group's divider gets no top margin so
 * the panel header doesn't sit too far from the first row. */
.admin-system-accordion-group {
  display: flex;
  align-items: baseline;
  gap: 10px;
  padding: 0 4px 4px;
  margin-top: 18px;
  border-bottom: 1px solid var(--color-border-soft, rgba(148, 163, 184, 0.18));
  user-select: none;
}

.admin-system-accordion-group:first-child {
  margin-top: 0;
}

.admin-system-accordion-group-zh {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 1.2px;
  color: var(--color-text-secondary);
  text-transform: uppercase;
}

.admin-system-accordion-group-en {
  font-family: "IBM Plex Mono", "JetBrains Mono", ui-monospace, monospace;
  font-size: 9px;
  letter-spacing: 1.6px;
  color: var(--color-text-muted, #64748b);
  opacity: 0.85;
}

.admin-system-accordion-row {
  display: grid;
  grid-template-columns: 1fr auto auto;
  gap: 12px;
  align-items: center;
  padding: 10px 14px;
  background: var(--hud-bg2, rgba(15, 23, 42, 0.5));
  border: 1px solid var(--color-border, #1f2944);
  border-radius: 4px;
  color: var(--color-text-primary, #cbd5e1);
  cursor: pointer;
  font-family: inherit;
  text-align: left;
  transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;
}

.admin-system-accordion-row:hover {
  background: rgba(56, 189, 248, 0.06);
  color: var(--color-text-bright, #f1f5f9);
}

.admin-system-accordion-row.is-open {
  background: rgba(56, 189, 248, 0.08);
  border-color: rgba(56, 189, 248, 0.45);
  color: #38bdf8;
}

.admin-system-accordion-label {
  font-size: 13px;
  font-weight: 600;
}

.admin-system-accordion-en {
  font-family: "IBM Plex Mono", "JetBrains Mono", ui-monospace, monospace;
  font-size: 9px;
  letter-spacing: 1.4px;
  opacity: 0.7;
}

.admin-system-accordion-chev {
  font-family: "IBM Plex Mono", ui-monospace, monospace;
  font-size: 12px;
  transition: transform 0.12s ease;
  opacity: 0.6;
}

.admin-system-accordion-row.is-open .admin-system-accordion-chev {
  transform: rotate(180deg);
  opacity: 1;
}

@media (max-width: 640px) {
  [data-admin-tabs-host].admin-tabs-host--accordion { padding: 12px; }
  .admin-system-accordion-en { display: none; }
}

/* ── Slice 5 · Inline undo bar (Q3 reversible action feedback) ─────────── */
[data-quick-action-host] {
  padding: 0 24px;
  margin-top: 8px;
  pointer-events: none;
}

.admin-quick-action-bar {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  padding: 8px 14px;
  border-radius: 6px;
  background: rgba(134, 239, 172, 0.10);
  border: 1px solid rgba(134, 239, 172, 0.45);
  color: #86efac;
  font-family: inherit;
  pointer-events: auto;
  opacity: 0;
  transform: translateY(-4px);
  transition: opacity 0.18s ease, transform 0.18s ease;
}

.admin-quick-action-bar.is-entering {
  opacity: 1;
  transform: translateY(0);
}

.admin-quick-action-bar.is-leaving {
  opacity: 0;
  transform: translateY(-4px);
}

.admin-quick-action-bar-text {
  font-size: 13px;
  font-weight: 500;
}

.admin-quick-action-bar-undo {
  background: transparent;
  border: 1px solid rgba(134, 239, 172, 0.45);
  border-radius: 4px;
  color: #86efac;
  cursor: pointer;
  font-family: "IBM Plex Mono", "JetBrains Mono", ui-monospace, monospace;
  font-size: 11px;
  padding: 3px 9px;
  letter-spacing: 0.4px;
  transition: background 0.12s ease, color 0.12s ease;
}

.admin-quick-action-bar-undo:hover {
  background: rgba(134, 239, 172, 0.18);
  color: var(--color-text-bright, #f1f5f9);
}

.admin-quick-action-bar-undo:disabled {
  opacity: 0.5;
  cursor: progress;
}

@media (max-width: 640px) {
  [data-quick-action-host] { padding: 0 12px; }
}

/* ── Slice 5/8 · Widgets v2 retrofit (replaces legacy details.settings-card) ── */
.admin-widgets-page {
  display: flex;
  flex-direction: column;
  gap: 14px;
}

.admin-widgets-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  padding: 14px 18px;
  background: var(--admin-panel, #0f172a);
  border: 1px solid var(--admin-line, #1f2944);
  border-radius: 6px;
}

.admin-widgets-actions .spacer { flex: 1 1 auto; }

.admin-widgets-list {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.admin-widgets-empty {
  padding: 22px 18px;
  background: var(--admin-panel, #0f172a);
  border: 1px dashed var(--admin-line, #1f2944);
  border-radius: 6px;
  color: var(--admin-text-dim, #94a3b8);
  font-size: 13px;
  text-align: center;
}

.admin-widget-card {
  background: var(--admin-panel, #0f172a);
  border: 1px solid var(--admin-line, #1f2944);
  border-radius: 6px;
  overflow: hidden;
}

.admin-widget-card-head {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 16px;
  border-bottom: 1px solid var(--admin-line, #1f2944);
  background: rgba(56, 189, 248, 0.04);
}

.admin-widget-card-type {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 2px;
  text-transform: uppercase;
  color: var(--color-primary);
  font-weight: 600;
}

.admin-widget-card-pos {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 1px;
  color: var(--admin-text-dim, #94a3b8);
}

.admin-widget-card-actions { display: flex; gap: 6px; }

.admin-widget-card-body {
  padding: 12px 16px;
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.admin-widget-row {
  display: flex;
  align-items: center;
  gap: 10px;
}

.admin-widget-row > .lbl {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 1.4px;
  text-transform: uppercase;
  color: var(--admin-text-dim, #94a3b8);
  min-width: 64px;
}

.admin-widget-input,
.admin-widget-select,
.admin-widget-textarea {
  flex: 1;
  background: rgba(15, 23, 42, 0.6);
  color: var(--admin-text-strong, #f1f5f9);
  border: 1px solid var(--admin-line, #1f2944);
  border-radius: 4px;
  padding: 6px 10px;
  font-size: 13px;
  font-family: inherit;
}
.admin-widget-input:focus,
.admin-widget-select:focus,
.admin-widget-textarea:focus {
  outline: none;
  border-color: var(--color-primary);
  background: rgba(15, 23, 42, 0.85);
}

.admin-widget-textarea { resize: vertical; min-height: 60px; }

.admin-widget-team {
  display: grid;
  grid-template-columns: 28px 1fr 56px auto auto;
  gap: 8px;
  align-items: center;
}

.admin-widget-team-color {
  width: 28px;
  height: 28px;
  padding: 0;
  border: 1px solid var(--admin-line, #1f2944);
  border-radius: 4px;
  background: transparent;
  cursor: pointer;
}

.admin-widget-team-score {
  font-family: var(--font-mono);
  font-size: 18px;
  font-weight: 700;
  color: var(--color-primary);
  text-align: center;
}

.admin-widget-step {
  background: transparent;
  border: 1px solid var(--admin-line, #1f2944);
  border-radius: 4px;
  width: 28px;
  height: 28px;
  font-family: var(--font-mono);
  font-size: 14px;
  font-weight: 700;
  color: var(--admin-text-strong, #f1f5f9);
  cursor: pointer;
  transition: border-color 0.12s ease, background 0.12s ease;
}
.admin-widget-step:hover {
  border-color: var(--color-primary);
  background: rgba(56, 189, 248, 0.08);
}

/* ═══════════════════════════════════════════════════════════════════
 * Replay annotations (design v4 brief 0518-1, 2026-05-18)
 * Lives inside session-detail page. Maps directly to
 * admin-brief-0518.jsx _AnnMarker + AnnotationListPanel components.
 * ═══════════════════════════════════════════════════════════════════ */

/* Timeline head bar — kicker label + add CTA */
.admin-sd-timeline-head {
  display: flex;
  align-items: center;
  gap: 8px;
}
.admin-sd-timeline-spacer { flex: 1; }
.admin-sd-ann-count {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 1px;
  color: var(--color-text-muted);
}
.admin-sd-ann-add,
.admin-sd-ann-card-add {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.5px;
  padding: 4px 10px;
  border-radius: 4px;
  border: 1px solid var(--hud-cyan-line);
  background: var(--hud-cyan-soft);
  color: var(--color-primary);
  cursor: pointer;
  transition: background var(--motion-fast) var(--ease-out, ease);
}
.admin-sd-ann-add:hover,
.admin-sd-ann-card-add:hover { background: rgba(56, 189, 248, 0.18); }

/* Timeline inner + hover layer */
.admin-sd-timeline-inner {
  position: relative;
}
.admin-sd-ann-hover {
  position: absolute;
  top: -28px;
  transform: translateX(-50%);
  padding: 3px 10px;
  background: var(--hud-bg1);
  border: 1px solid var(--hud-cyan-line);
  border-radius: 4px;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.3px;
  color: var(--color-primary);
  white-space: nowrap;
  pointer-events: none;
  z-index: 6;
  box-shadow: 0 4px 12px rgba(0,0,0,0.4);
}

/* Marker layer overlays bars */
.admin-sd-ann-layer {
  position: absolute;
  inset: 0;
  pointer-events: none;
}
.admin-sd-ann-layer > .admin-sd-ann-marker { pointer-events: auto; }

/* Markers — 4 shapes via class modifier */
.admin-sd-ann-marker {
  position: absolute;
  top: 50%;
  transform: translate(-50%, -50%);
  width: 10px;
  height: 10px;
  padding: 0;
  border: 0;
  cursor: pointer;
  background: var(--ann-color, #94a3b8);
  box-shadow: 0 0 4px color-mix(in srgb, var(--ann-color, #94a3b8) 50%, transparent);
  z-index: 5;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: width var(--motion-fast) var(--ease-out, ease),
              height var(--motion-fast) var(--ease-out, ease);
}
.admin-sd-ann-marker.is-shape-circle { border-radius: 50%; }
.admin-sd-ann-marker.is-shape-square { border-radius: 2px; }
.admin-sd-ann-marker.is-shape-star {
  clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
  border-radius: 0;
}
.admin-sd-ann-marker.is-active {
  width: 14px;
  height: 14px;
  outline: 2px solid #fff;
  outline-offset: 0;
  z-index: 10;
  box-shadow: 0 0 8px color-mix(in srgb, var(--ann-color, #94a3b8) 60%, transparent);
}
.admin-sd-ann-marker-glyph {
  color: #fff;
  font-size: 8px;
  font-weight: 700;
  line-height: 1;
}

/* Marker hover/active tooltip */
.admin-sd-ann-tip {
  position: absolute;
  bottom: calc(100% + 6px);
  left: 50%;
  transform: translateX(-50%);
  padding: 4px 10px;
  border-radius: 4px;
  background: var(--hud-bg1);
  border: 1px solid color-mix(in srgb, var(--ann-color, #94a3b8) 33%, transparent);
  font-family: var(--font-mono);
  font-size: 9px;
  color: var(--color-text-primary);
  white-space: nowrap;
  box-shadow: 0 4px 12px rgba(0,0,0,0.4);
  pointer-events: none;
}

/* Legend strip below timeline */
.admin-sd-ann-legend {
  display: flex;
  gap: 14px;
  margin-top: 10px;
  padding-top: 8px;
  border-top: 1px solid var(--color-border);
}
.admin-sd-ann-legend-item {
  display: inline-flex;
  align-items: center;
  gap: 4px;
}
.admin-sd-ann-legend-dot {
  width: 8px;
  height: 8px;
  display: inline-block;
}
.admin-sd-ann-legend-label {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 0.5px;
  color: var(--color-text-muted);
}

/* Annotation rail card */
.admin-sd-card-head { display: flex; align-items: center; gap: 8px; }
.admin-sd-card-head-spacer { flex: 1; }
.admin-sd-ann-card .admin-sd-ann-list {
  display: flex;
  flex-direction: column;
  gap: 0;
  max-height: 320px;
  overflow-y: auto;
}
.admin-sd-ann-row {
  padding: 8px 10px;
  display: grid;
  grid-template-columns: 50px 92px 1fr 18px;
  gap: 8px;
  align-items: start;
  border-bottom: 1px solid var(--color-border, rgba(255,255,255,0.08));
  cursor: pointer;
  font-size: 11px;
  transition: background var(--motion-fast) var(--ease-out, ease);
}
.admin-sd-ann-row:last-child { border-bottom: 0; }
.admin-sd-ann-row:hover {
  background: var(--hover-tint-weak, rgba(255, 255, 255, 0.03));
}
.admin-sd-ann-row.is-active {
  background: var(--hud-cyan-soft);
}
.admin-sd-ann-ts {
  font-family: var(--font-mono);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.3px;
  margin-top: 1px;
}
.admin-sd-ann-chip {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 0.5px;
  font-weight: 700;
  padding: 2px 8px;
  border-radius: 3px;
  color: var(--ann-color, #94a3b8);
  background: color-mix(in srgb, var(--ann-color, #94a3b8) 12%, transparent);
  border: 1px solid color-mix(in srgb, var(--ann-color, #94a3b8) 33%, transparent);
  align-self: start;
  margin-top: 1px;
  white-space: nowrap;
}
.admin-sd-ann-note {
  font-size: 11px;
  line-height: 1.5;
  color: var(--color-text-primary);
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  word-break: break-word;
}
.admin-sd-ann-del {
  font-size: 12px;
  color: var(--color-text-muted);
  background: transparent;
  border: 0;
  cursor: pointer;
  padding: 0 4px;
}
.admin-sd-ann-del:hover { color: var(--color-danger); }

/* Annotation list empty state */
.admin-sd-ann-empty {
  padding: 24px 14px;
  text-align: center;
}
.admin-sd-ann-empty-icon {
  font-size: 26px;
  opacity: 0.4;
  margin-bottom: 6px;
}
.admin-sd-ann-empty-t {
  font-size: 12px;
  font-weight: 600;
  color: var(--color-text-primary);
}
.admin-sd-ann-empty-s {
  font-size: 10px;
  color: var(--color-text-muted);
  margin-top: 4px;
  line-height: 1.5;
}

/* Add-annotation modal internals (rendered inside HudConfirm body) */
.admin-sd-ann-modal-body {
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.admin-sd-ann-modal-row { display: flex; flex-direction: column; gap: 6px; }
.admin-sd-ann-modal-time {
  padding: 10px 12px;
  border-radius: 4px;
  background: var(--hud-bg2);
  border: 1px solid var(--color-border);
  font-family: var(--font-mono);
  font-size: 14px;
  color: var(--color-primary);
  font-weight: 600;
}
.admin-sd-ann-modal-hint {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 0.3px;
  color: var(--color-text-muted);
}
.admin-sd-ann-modal-labels {
  display: flex;
  gap: 8px;
}
.admin-sd-ann-modal-lbl {
  flex: 1;
  padding: 10px 8px;
  border-radius: 6px;
  text-align: center;
  cursor: pointer;
  background: transparent;
  border: 1.5px solid var(--color-border);
  color: var(--color-text-muted);
  transition: all var(--motion-fast) var(--ease-out, ease);
}
.admin-sd-ann-modal-lbl.is-active {
  border-color: var(--ann-color, #38bdf8);
  background: color-mix(in srgb, var(--ann-color, #38bdf8) 10%, transparent);
  color: var(--ann-color, #38bdf8);
}
.admin-sd-ann-modal-lbl-icon {
  font-size: 16px;
  display: block;
  color: var(--ann-color, #94a3b8);
}
.admin-sd-ann-modal-lbl-text {
  font-family: var(--font-mono);
  font-size: 8px;
  letter-spacing: 0.5px;
  margin-top: 3px;
  display: block;
}
.admin-sd-ann-modal-note {
  width: 100%;
  height: 80px;
  padding: 10px 12px;
  border-radius: 6px;
  background: var(--hud-bg2);
  border: 1px solid var(--color-border);
  color: var(--color-text-primary);
  font-family: var(--font-ui);
  font-size: 12px;
  resize: none;
  outline: none;
  line-height: 1.6;
}
.admin-sd-ann-modal-counter {
  font-family: var(--font-mono);
  font-size: 9px;
  color: var(--color-text-muted);
  text-align: right;
}

/* Mobile bottom-sheet variant — design v4 brief 0518-1 mobile mockup */
@media (max-width: 600px) {
  .admin-hud-modal__panel {
    width: 100% !important;
    max-width: 100% !important;
    border-radius: 16px 16px 0 0 !important;
    position: absolute !important;
    bottom: 0 !important;
    left: 0 !important;
    right: 0 !important;
    margin: 0 !important;
  }
  .admin-sd-ann-row {
    grid-template-columns: 44px 80px 1fr 18px;
    font-size: 10px;
  }
}

/* ═══════════════════════════════════════════════════════════════════
 * Sessions bucket list (design v4 brief 0518-3, 2026-05-18)
 * Replaces the legacy 8-col table with chronological bucket grouping
 * (Option C from the brief). Each bucket has a clickable header that
 * toggles collapse; rows inside use a flex layout with sparkline.
 * ═══════════════════════════════════════════════════════════════════ */
.admin-sessions-buckets {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.admin-sessions-bucket {
  background: var(--admin-panel, var(--hud-bg1));
  border: 1px solid var(--admin-line, var(--color-border));
  border-radius: 6px;
  overflow: hidden;
}
.admin-sessions-bucket-head {
  padding: 10px 16px;
  display: flex;
  align-items: center;
  gap: 10px;
  cursor: pointer;
  border-bottom: 1px solid var(--admin-line, var(--color-border));
  transition: background var(--motion-fast) var(--ease-out, ease);
}
.admin-sessions-bucket.is-collapsed .admin-sessions-bucket-head {
  border-bottom: 0;
}
.admin-sessions-bucket-head:hover {
  background: rgba(56, 189, 248, 0.04);
}
.admin-sessions-bucket-chev {
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--admin-text-dim, var(--color-text-muted));
  width: 12px;
  text-align: center;
}
.admin-sessions-bucket-label {
  font-size: 14px;
  font-weight: 600;
  color: var(--admin-text, var(--color-text-primary));
}
.admin-sessions-bucket-en {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 1px;
  color: var(--admin-text-dim, var(--color-text-muted));
}
.admin-sessions-bucket-date {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.3px;
  color: var(--admin-text-dim, var(--color-text-muted));
}
.admin-sessions-bucket-spacer { flex: 1; }
.admin-sessions-bucket-stat {
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--admin-text-dim, var(--color-text-muted));
}
.admin-sessions-bucket-stat.is-accent { color: var(--color-primary); }
.admin-sessions-bucket-stat.is-lime   { color: var(--hud-lime); }
.admin-sessions-bucket-sep {
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--admin-text-dim, var(--color-text-muted));
  opacity: 0.6;
}

/* Session row inside bucket */
.admin-sessions-bucket-row {
  padding: 12px 16px;
  display: flex;
  align-items: center;
  gap: 14px;
  border-bottom: 1px solid var(--admin-line, var(--color-border, rgba(255,255,255,0.06)));
  cursor: pointer;
  transition: background var(--motion-fast) var(--ease-out, ease);
}
.admin-sessions-bucket-row:last-child { border-bottom: 0; }
.admin-sessions-bucket-row:hover {
  background: var(--hover-tint-weak);
}
.admin-sessions-bucket-row.is-selected {
  background: rgba(56, 189, 248, 0.07);
  box-shadow: inset 2px 0 0 var(--color-primary);
}
.admin-sessions-bucket-dot {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  flex-shrink: 0;
  background: var(--admin-line, var(--color-text-muted));
}
.admin-sessions-bucket-dot.is-live {
  background: var(--hud-lime);
  box-shadow: 0 0 8px rgba(134, 239, 172, 0.6);
  animation: hud-pulse 2s infinite;
}
.admin-sessions-bucket-row-main {
  flex: 1;
  min-width: 0;
}
.admin-sessions-bucket-row-title {
  display: flex;
  align-items: center;
  gap: 8px;
}
.admin-sessions-bucket-row-name {
  font-size: 13px;
  font-weight: 600;
  color: var(--admin-text, var(--color-text-primary));
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.admin-sessions-bucket-row-live {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 1px;
  padding: 1px 8px;
  border-radius: 3px;
  background: rgba(134, 239, 172, 0.10);
  color: var(--hud-lime);
  border: 1px solid rgba(134, 239, 172, 0.45);
}
.admin-sessions-bucket-row-meta {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.3px;
  color: var(--admin-text-dim, var(--color-text-muted));
  margin-top: 2px;
}
.admin-sessions-bucket-row-stats {
  display: flex;
  align-items: center;
  gap: 16px;
}
.admin-sessions-bucket-row-stat {
  text-align: right;
}
.admin-sessions-bucket-row-stat-en {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 0.5px;
  color: var(--admin-text-dim, var(--color-text-muted));
}
.admin-sessions-bucket-row-stat-v {
  font-family: var(--font-mono);
  font-size: 13px;
  font-weight: 600;
}
.admin-sessions-bucket-row-stat-v.is-accent { color: var(--color-primary); }
.admin-sessions-bucket-row-stat-v.is-lime   { color: var(--hud-lime); }
.admin-sessions-bucket-row-spark {
  display: inline-flex;
  align-items: flex-end;
  height: 18px;
  width: 80px;
}
.admin-sessions-detail-btn {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.5px;
  color: var(--color-primary);
  background: transparent;
  border: 0;
  cursor: pointer;
  padding: 4px 8px;
}
.admin-sessions-detail-btn:hover { color: var(--color-primary-hover); }
.admin-sessions-bucket-empty {
  padding: 18px;
  text-align: center;
  font-size: 12px;
  color: var(--admin-text-dim, var(--color-text-muted));
  font-style: italic;
}

/* Tablet/mobile — stats stack vertically, hide sparkline on narrow viewports */
@media (max-width: 768px) {
  .admin-sessions-bucket-row { gap: 10px; padding: 10px 12px; }
  .admin-sessions-bucket-row-stats { gap: 10px; }
  .admin-sessions-bucket-row-spark { display: none; }
  .admin-sessions-bucket-head { flex-wrap: wrap; }
  .admin-sessions-bucket-date { width: 100%; padding-left: 22px; }
}

/* ═══════════════════════════════════════════════════════════════════
 * Time-bound bans (design v4 brief 0518-2, 2026-05-18)
 * Maps to admin-brief-0518.jsx BanDurationPicker + BanExpiresChips.
 * ═══════════════════════════════════════════════════════════════════ */
.admin-modbans-card { padding: 0; overflow: hidden; }
.admin-modbans-header {
  display: grid;
  grid-template-columns: 160px 50px 1fr 180px 80px;
  gap: 12px;
  padding: 10px 16px;
  border-bottom: 1px solid var(--color-border);
  align-items: center;
}
.admin-modbans-list { display: flex; flex-direction: column; }
.admin-modbans-row {
  display: grid;
  grid-template-columns: 160px 50px 1fr 180px 80px;
  gap: 12px;
  padding: 11px 16px;
  align-items: center;
  border-bottom: 1px solid var(--color-border, rgba(255,255,255,0.06));
}
.admin-modbans-row:last-child { border-bottom: 0; }
.admin-modbans-row.is-expired { opacity: 0.55; }
.admin-modbans-target {
  font-family: var(--font-mono);
  font-size: 12px;
  color: var(--color-primary);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.admin-modbans-kind {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.5px;
  color: var(--color-text-muted);
}
.admin-modbans-reason {
  font-size: 12px;
  color: var(--color-text-primary);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.admin-modbans-chip {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.5px;
  padding: 3px 10px;
  border-radius: 999px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  border: 1px solid;
  width: fit-content;
}
.admin-modbans-chip.is-permanent {
  color: var(--hud-crimson);
  border-color: rgba(248, 113, 113, 0.4);
  background: rgba(248, 113, 113, 0.08);
}
.admin-modbans-chip.is-active {
  color: var(--hud-amber);
  border-color: rgba(251, 191, 36, 0.4);
  background: rgba(251, 191, 36, 0.06);
}
.admin-modbans-chip.is-expired {
  color: var(--color-text-muted);
  border-color: rgba(148, 163, 184, 0.25);
  background: rgba(148, 163, 184, 0.05);
}
.admin-modbans-chip-pulse {
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: var(--hud-amber);
  animation: hud-pulse 2s infinite;
}
.admin-modbans-unban {
  padding: 4px 10px;
  border-radius: 4px;
  font-family: var(--font-mono);
  font-size: 10px;
  background: transparent;
  border: 1px solid var(--color-border, rgba(255,255,255,0.18));
  color: var(--color-text-muted);
  cursor: pointer;
  transition: all var(--motion-fast) var(--ease-out, ease);
}
.admin-modbans-unban:not(:disabled):hover {
  border-color: var(--hud-crimson);
  color: var(--hud-crimson);
}
.admin-modbans-unban:disabled { cursor: not-allowed; opacity: 0.5; }
.admin-modbans-empty {
  padding: 24px;
  text-align: center;
  color: var(--color-text-muted);
  font-size: 12px;
}

/* Picker modal */
.admin-modbans-modal-body {
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.admin-modbans-modal-target {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px;
  background: var(--hud-bg2);
  border-radius: 6px;
  border: 1px solid var(--color-border);
}
.admin-modbans-modal-target-icon {
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background: rgba(248, 113, 113, 0.10);
  border: 1px solid rgba(248, 113, 113, 0.3);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 14px;
  color: var(--hud-crimson);
}
.admin-modbans-modal-target-val {
  font-family: var(--font-mono);
  font-size: 13px;
  color: var(--color-primary);
  font-weight: 600;
  margin-top: 2px;
}
.admin-modbans-modal-row { display: flex; flex-direction: column; gap: 6px; }
.admin-modbans-modal-presets {
  display: flex;
  gap: 6px;
}
.admin-modbans-modal-preset {
  flex: 1;
  padding: 10px 8px;
  border-radius: 4px;
  text-align: center;
  background: transparent;
  border: 1.5px solid var(--color-border);
  color: var(--color-text-primary);
  font-family: var(--font-mono);
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
  /* Decision chip — color/border swap is snap (ease-out), but the
     scale-up on selection uses spring for that "I picked it" overshoot.
     2026-05-18 motion language. */
  transition: background var(--motion-fast) var(--ease-out, ease),
              color var(--motion-fast) var(--ease-out, ease),
              border-color var(--motion-fast) var(--ease-out, ease),
              transform var(--motion-normal) var(--ease-spring, ease);
  transform: scale(1);
}
.admin-modbans-modal-preset.is-active {
  border-color: var(--color-primary);
  background: rgba(56, 189, 248, 0.10);
  color: var(--color-primary);
  transform: scale(1.04);
}
.admin-modbans-modal-preset.is-permanent {
  border-color: rgba(248, 113, 113, 0.4);
  color: var(--hud-crimson);
  background: rgba(248, 113, 113, 0.05);
}
.admin-modbans-modal-preset.is-permanent.is-active {
  background: rgba(248, 113, 113, 0.18);
}
.admin-modbans-modal-when {
  font-family: var(--font-mono);
  font-size: 9px;
  color: var(--color-text-muted);
  letter-spacing: 0.3px;
  margin-top: 2px;
}
.admin-modbans-modal-reason {
  padding: 10px 12px;
  border-radius: 4px;
  background: var(--hud-bg2);
  border: 1px solid var(--color-border);
  color: var(--color-text-primary);
  font-family: var(--font-ui);
  font-size: 12px;
  outline: none;
}
.admin-modbans-modal-hint {
  padding: 8px 12px;
  border-radius: 4px;
  background: rgba(251, 191, 36, 0.05);
  border: 1px solid rgba(251, 191, 36, 0.18);
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--hud-amber);
  letter-spacing: 0.3px;
  line-height: 1.5;
}

@media (max-width: 600px) {
  .admin-modbans-header,
  .admin-modbans-row {
    grid-template-columns: 1fr 60px;
    gap: 8px;
    padding: 10px 12px;
  }
  .admin-modbans-header > span:nth-child(3),
  .admin-modbans-header > span:nth-child(4),
  .admin-modbans-row > span:nth-child(3),
  .admin-modbans-row > span:nth-child(4) { grid-column: 1 / -1; }
  .admin-modbans-modal-presets { flex-wrap: wrap; }
  .admin-modbans-modal-preset { flex: 0 0 calc(33% - 4px); }
}

/* ═══════════════════════════════════════════════════════════════════
 * Custom-duration chip + input row (design v4 brief 0518-v2 #2, 2026-05-18)
 * Adds a 6th "自訂" chip to the ban duration picker that expands into an
 * input row with hours/days toggle + live seconds preview.
 * ═══════════════════════════════════════════════════════════════════ */
.admin-modbans-modal-preset.is-custom {
  font-size: 11px;
  color: var(--color-text-muted);
  border-style: dashed;
  border-color: rgba(148, 163, 184, 0.33);
}
.admin-modbans-modal-preset.is-custom.is-active {
  border-style: solid;
  border-color: var(--color-primary);
  background: rgba(56, 189, 248, 0.10);
  color: var(--color-primary);
}

.admin-modbans-modal-custom-row {
  margin-top: 10px;
  padding: 10px 12px;
  border-radius: 6px;
  background: rgba(56, 189, 248, 0.08);
  border: 1px solid rgba(56, 189, 248, 0.40);
  display: flex;
  align-items: center;
  gap: 8px;
  /* Slide-reveal feel — height transitions via hidden attr but the
     opacity gives it a soft entrance. */
  animation: admin-modbans-custom-in var(--motion-normal) var(--ease-out, ease);
}
.admin-modbans-modal-custom-row[hidden] { display: none; }
@keyframes admin-modbans-custom-in {
  from { opacity: 0; transform: translateY(-4px); }
  to   { opacity: 1; transform: translateY(0); }
}
.admin-modbans-modal-custom-label {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.5px;
  color: var(--color-primary);
  flex-shrink: 0;
}
.admin-modbans-modal-custom-input {
  width: 64px;
  padding: 7px 10px;
  border-radius: 4px;
  background: var(--hud-bg2);
  border: 1px solid var(--color-border);
  font-family: var(--font-mono);
  font-size: 14px;
  font-weight: 600;
  color: var(--color-primary);
  text-align: center;
  outline: none;
  -moz-appearance: textfield;
}
.admin-modbans-modal-custom-input::-webkit-outer-spin-button,
.admin-modbans-modal-custom-input::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}
.admin-modbans-modal-custom-input:focus {
  border-color: var(--color-primary);
}
.admin-modbans-modal-custom-units {
  display: flex;
  gap: 4px;
}
.admin-modbans-modal-custom-unit {
  padding: 6px 12px;
  border-radius: 4px;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.5px;
  border: 1px solid var(--color-border);
  background: transparent;
  color: var(--color-text-muted);
  cursor: pointer;
  transition: all var(--motion-fast) var(--ease-out, ease);
}
.admin-modbans-modal-custom-unit.is-active {
  border-color: var(--color-primary);
  color: var(--color-primary);
  background: rgba(56, 189, 248, 0.10);
}
.admin-modbans-modal-custom-spacer { flex: 1; }
.admin-modbans-modal-custom-seconds {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 0.3px;
  color: var(--color-text-muted);
}
/* Cyan "when" hint when custom is selected (distinguish from preset hint) */
.admin-modbans-modal-when.is-custom {
  color: var(--color-primary);
}

/* Mobile: stack input row vertically when narrow */
@media (max-width: 480px) {
  .admin-modbans-modal-custom-row {
    flex-wrap: wrap;
    gap: 6px;
  }
  .admin-modbans-modal-custom-spacer { display: none; }
  .admin-modbans-modal-custom-seconds {
    width: 100%;
    text-align: right;
  }
}

/* ═══════════════════════════════════════════════════════════════════
 * Font subset modal (P1 #5, design v4 2026-05-18)
 * Multi-select preset chip grid + custom unicode-range textarea.
 * Mounted inside HudConfirmModal body.
 * ═══════════════════════════════════════════════════════════════════ */
.admin-font-subset-modal-body {
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.admin-font-subset-target {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 12px;
  background: var(--hud-bg2);
  border: 1px solid var(--color-border);
  border-radius: 6px;
}
.admin-font-subset-target-glyph {
  width: 44px;
  height: 44px;
  border-radius: 8px;
  background: var(--hud-bg1);
  border: 1px solid var(--color-border);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 24px;
  font-weight: 700;
  color: var(--color-text-primary);
}
.admin-font-subset-target-name {
  font-family: var(--font-mono);
  font-size: 14px;
  font-weight: 600;
  color: var(--color-primary);
  margin-top: 2px;
}
.admin-font-subset-section {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.admin-font-subset-chips {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 8px;
}
@media (max-width: 540px) {
  .admin-font-subset-chips { grid-template-columns: repeat(2, 1fr); }
}
.admin-font-subset-chip {
  padding: 10px 12px;
  border-radius: 6px;
  border: 1.5px solid var(--color-border);
  background: transparent;
  cursor: pointer;
  transition: all var(--motion-fast) var(--ease-out, ease);
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.admin-font-subset-chip:hover {
  border-color: var(--color-primary);
}
.admin-font-subset-chip.is-active {
  border-color: var(--color-primary);
  background: rgba(56, 189, 248, 0.10);
}
.admin-font-subset-chip-check {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 16px;
  height: 16px;
  border-radius: 3px;
  border: 1.5px solid var(--color-border, rgba(255, 255, 255, 0.18));
  font-size: 10px;
  color: #000;
  font-weight: 700;
}
.admin-font-subset-chip.is-active .admin-font-subset-chip-check {
  background: var(--color-primary);
  border-color: var(--color-primary);
}
.admin-font-subset-chip-label {
  font-size: 12px;
  font-weight: 600;
  color: var(--color-text-primary);
  display: inline-flex;
  align-items: center;
  gap: 4px;
}
.admin-font-subset-chip.is-active .admin-font-subset-chip-label {
  color: var(--color-primary);
}
.admin-font-subset-chip-range {
  font-family: var(--font-mono);
  font-size: 9px;
  color: var(--color-text-muted);
  letter-spacing: 0.3px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.admin-font-subset-chip-meta {
  font-family: var(--font-mono);
  font-size: 9px;
  color: var(--color-text-muted);
  letter-spacing: 0.3px;
}
.admin-font-subset-custom {
  width: 100%;
  min-height: 56px;
  padding: 8px 12px;
  border-radius: 4px;
  background: var(--hud-bg2);
  border: 1px solid var(--color-border);
  color: var(--color-primary);
  font-family: var(--font-mono);
  font-size: 12px;
  resize: vertical;
  outline: none;
}
.admin-font-subset-custom:focus {
  border-color: var(--color-primary);
}
.admin-font-subset-hint {
  font-family: var(--font-mono);
  font-size: 9px;
  color: var(--color-text-muted);
  letter-spacing: 0.3px;
}
.admin-font-subset-warn {
  padding: 10px 12px;
  border-radius: 4px;
  background: rgba(255, 77, 79, 0.05);
  border: 1px solid rgba(255, 77, 79, 0.18);
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--hud-crimson, #ff4d4f);
  letter-spacing: 0.3px;
  line-height: 1.5;
}
