/* ============================================================================
 * fcc.cc/music — SHELL + LAYOUT stylesheet ("Halo")
 *
 * Ported from the prototype's base.css (shell, components, responsive) with
 * the [data-dir="halo"] overrides folded in (Halo is the only shipping
 * direction). Colors/radii/timing come from tokens.css custom properties;
 * this file is structure + the Halo-specific treatments.
 *
 * Scope: the app shell wears `.app` (on #app-root). Tokens hang off
 * [data-app="music"] on <html>, so the cascade resolves everywhere inside.
 *
 * P0 ships the empty shell + a generic `.view` placeholder. Per-screen styles
 * (hero, explore table, item page, settings, etc.) arrive with their views in
 * later phases.
 * ========================================================================= */

*, *::before, *::after { box-sizing: border-box; }

/* Self-hosted display faces for the fallback cover variants (lib/cover.js).
 * CSP is font-src 'self', so these must live on-origin (fonts/LICENSES.txt). */
@font-face {
  font-family: 'Special Elite';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('fonts/special-elite-400-latin.woff2') format('woff2');
}
@font-face {
  font-family: 'Archivo Black';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('fonts/archivo-black-400-latin.woff2') format('woff2');
}

/* Zero the UA body margin (8px in most browsers) so #app-root reaches the
 * viewport edges — without this the app sits inset 8px and the mobile shell
 * leaves a gap on every side + a phantom horizontal-scroll seam. The shared
 * fcc chrome (topbar/site-rail) is position:fixed/normal-flow and unaffected. */
html, body { margin: 0; padding: 0; }
html { color-scheme: dark; }

/* ── App root reset ──────────────────────────────────────────────────── */
.app {
  font-family: var(--font-body);
  color: var(--text);
  background: var(--bg);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  /* Fill the viewport below the shared sitewide topbar. The topbar is a
   * normal-flow element above #app-root; the app takes the rest. */
  min-height: 100vh;
  min-height: 100dvh;
  display: flex;
  flex-direction: column;
  position: relative;
  /* Container queries drive the responsive breakpoints (≈1000/860/540px). */
  container-type: inline-size;
  container-name: app;
}
.app button { font-family: inherit; }
.app a { color: inherit; text-decoration: none; }
.app h1, .app h2, .app h3, .app h4 { margin: 0; font-weight: 600; }
.app p { margin: 0; }
.app ::selection { background: var(--accent-soft); }
.app ::-webkit-scrollbar { width: 11px; height: 11px; }
.app ::-webkit-scrollbar-thumb {
  background: var(--border-2); border-radius: 20px;
  border: 3px solid transparent; background-clip: content-box;
}
.app ::-webkit-scrollbar-thumb:hover { background: var(--text-faint); background-clip: content-box; }

/* The shared loader placeholder is replaced by the shell on boot; hide it. */
.app > [data-fcc-loader]:only-child { margin: auto; }

/* ── App body / rail / main scaffold ─────────────────────────────────── */
.app-body { flex: 1; display: flex; min-height: 0; }

/* Sidebar rail (Halo: faint translucent panel with blur). */
.rail {
  width: var(--rail-w); flex: none;
  background: rgba(255, 255, 255, .015);
  backdrop-filter: blur(6px);
  border-right: 1px solid var(--border);
  display: flex; flex-direction: column;
  padding: 22px 14px 14px; overflow-y: auto;
}
[data-app="music"][data-theme="light"] .rail,
[data-app="music"][data-mode="light"] .rail,
:root.fcc-v2-light[data-app="music"] .rail { background: rgba(255, 255, 255, .4); }

.rail-brand { display: flex; align-items: center; gap: 11px; padding: 4px 10px 22px; }
.rail-mark {
  width: 34px; height: 34px; border-radius: 10px; flex: none;
  background: linear-gradient(140deg, var(--accent), var(--accent-2));
  display: grid; place-items: center;
  box-shadow: 0 4px 16px var(--accent-soft);
}
.rail-mark svg { width: 19px; height: 19px; color: var(--on-accent); }
.rail-word { display: flex; flex-direction: column; line-height: 1.05; }
.rail-word b {
  font-size: 16px; letter-spacing: .04em; font-weight: 700;
  text-transform: uppercase;
}
.rail-word span {
  font-size: 10px; letter-spacing: .15em; text-transform: uppercase;
  color: var(--text-dim); font-weight: 600; margin-top: 3px;
}

.rail-group { margin-top: 16px; }
.rail-group-label {
  font-size: 10px; letter-spacing: .16em; text-transform: uppercase;
  color: var(--text-faint); font-weight: 700; padding: 6px 12px;
}
.rail-item {
  display: flex; align-items: center; gap: 12px;
  padding: 9px 12px; border-radius: var(--r-sm);
  color: var(--text-dim); cursor: pointer;
  transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
  position: relative;
}
.rail-item svg { width: 18px; height: 18px; flex: none; opacity: .85; }
.rail-item-tx { display: flex; flex-direction: column; line-height: 1.1; min-width: 0; }
.rail-item-tx b { font-size: 13.5px; font-weight: 550; letter-spacing: -.005em; white-space: nowrap; }
.rail-item-tx span { font-size: 10.5px; color: var(--text-faint); margin-top: 2px; }
.rail-item:hover { background: var(--surface); color: var(--text); }
/* Halo active treatment: violet wash + accent edge bar. */
.rail-item[data-on="1"] {
  background: linear-gradient(90deg, var(--accent-soft), transparent);
  color: var(--text);
}
.rail-item[data-on="1"]::before {
  content: ""; position: absolute; left: -14px; top: 50%;
  transform: translateY(-50%);
  width: 3px; height: 22px; border-radius: 0 3px 3px 0; background: var(--accent);
}
.rail-item[data-on="1"] svg { opacity: 1; color: var(--accent); }
.rail-spacer { flex: 1; min-height: 18px; }
.rail-foot { padding: 14px 12px 4px; border-top: 1px solid var(--border); margin-top: 10px; }
.rail-foot-label { font-size: 10px; letter-spacing: .14em; text-transform: uppercase; color: var(--text-faint); font-weight: 700; }
.rail-foot-tx { font-size: 11px; color: var(--text-faint); margin-top: 7px; line-height: 1.5; }

/* Main column. */
.main { flex: 1; display: flex; flex-direction: column; min-width: 0; min-height: 0; background: var(--bg); position: relative; }

/* Soft Halo wash behind the content. */
.main::before {
  content: ""; position: absolute; inset: 0; pointer-events: none; z-index: 0;
  background: radial-gradient(900px 420px at 88% -8%, var(--accent-soft), transparent 65%);
}
.toolbar, .scroll { position: relative; z-index: 1; }

/* Sticky toolbar. */
.toolbar {
  display: flex; align-items: center; gap: 14px; padding: 16px 26px;
  border-bottom: 1px solid var(--border);
  position: sticky; top: 0; z-index: 20;
  background: color-mix(in srgb, var(--bg) 82%, transparent);
  backdrop-filter: blur(16px);
}
.crumb {
  display: flex; align-items: center; gap: 8px; font-size: 11px;
  letter-spacing: .12em; text-transform: uppercase; color: var(--text-faint);
  font-weight: 700; white-space: nowrap;
}
.crumb b { color: var(--text); }
.crumb-sep { opacity: .5; }
.search { flex: 1; max-width: 540px; margin: 0 auto; position: relative; display: flex; align-items: center; }
.search svg { position: absolute; left: 14px; width: 17px; height: 17px; color: var(--text-faint); pointer-events: none; }
.search input {
  width: 100%; padding: 11px 16px 11px 40px; border-radius: 999px;
  border: 1px solid var(--border); background: var(--surface); color: var(--text);
  font-size: 13.5px; outline: none;
  transition: border-color var(--t) var(--ease), box-shadow var(--t) var(--ease), background var(--t) var(--ease);
}
.search input::placeholder { color: var(--text-faint); }
.search input:focus { border-color: var(--accent); box-shadow: 0 0 0 4px var(--accent-soft); background: var(--surface-2); }
.tool-actions { display: flex; align-items: center; gap: 8px; }

/* Scroll area + content wrapper. */
.scroll { flex: 1; min-height: 0; overflow-y: auto; overflow-x: hidden; }
.view-mount { display: block; }
.wrap, .view {
  max-width: var(--content-max); margin: 0 auto;
  padding: 30px 30px 130px; /* 130px clears the 84px player bar */
}

/* ── Buttons ─────────────────────────────────────────────────────────── */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  padding: 10px 16px; border-radius: 999px; border: 1px solid var(--border-2);
  background: var(--surface); color: var(--text); font-size: 13px; font-weight: 600;
  cursor: pointer; transition: background var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease), transform var(--t-fast) var(--ease), filter var(--t-fast) var(--ease);
  white-space: nowrap; letter-spacing: -.005em;
}
.btn svg { width: 16px; height: 16px; }
.btn:hover { background: var(--surface-2); border-color: var(--text-faint); transform: translateY(-1px); }
.btn:active { transform: translateY(0); }
.btn--primary {
  background: linear-gradient(135deg, var(--accent), var(--accent-2));
  color: var(--on-accent); border: 0;
  box-shadow: 0 6px 20px var(--accent-soft); font-weight: 650;
}
.btn--primary:hover { filter: brightness(1.06); box-shadow: 0 10px 28px var(--accent-soft); }
.btn--ghost { background: transparent; border-color: var(--border); }
.btn--sm { padding: 7px 12px; font-size: 12px; }
.icon-btn {
  display: grid; place-items: center; width: 38px; height: 38px; border-radius: 11px;
  cursor: pointer; color: var(--text-dim); background: transparent;
  border: 1px solid transparent; transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.icon-btn svg { width: 18px; height: 18px; }
.icon-btn:hover { background: var(--surface-2); color: var(--text); }
/* Saved state: unmistakable. Tint the button with accent-soft + accent color
   so a saved bookmark reads as an obvious filled chip (the JS also flips the
   SVG fill to currentColor). Works for the icon save button on cards + player
   and the pill-style Save button on the hero/item page. */
.icon-btn[data-on="1"] {
  color: var(--accent);
  background: var(--accent-soft);
}
.icon-btn[data-on="1"] svg { color: var(--accent); }
.btn[data-on="1"] {
  border-color: var(--accent);
  color: var(--accent);
  background: var(--accent-soft);
}
.btn[data-on="1"] svg { color: var(--accent); }

/* ── Pills / badges (source-quality, spelled out per Decisions C4) ────── */
.pill {
  display: inline-flex; align-items: center; gap: 7px; padding: 8px 14px; border-radius: 999px;
  background: var(--surface); border: 1px solid var(--border); color: var(--text-dim);
  font-size: 12.5px; font-weight: 550; cursor: pointer;
  transition: background var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
  white-space: nowrap;
}
.pill:hover { color: var(--text); border-color: var(--text-faint); background: var(--surface-2); }
.pill[data-on="1"] { background: var(--accent-soft); border-color: transparent; color: var(--accent); }
.badge {
  display: inline-flex; align-items: center; gap: 5px; font-family: var(--font-mono);
  font-size: 10px; font-weight: 600; letter-spacing: .08em; padding: 3px 7px; border-radius: 5px;
  background: var(--surface-3); color: var(--text-dim); text-transform: uppercase;
}
.badge--sbd { color: var(--badge-sbd); background: color-mix(in srgb, var(--badge-sbd) 16%, transparent); }
.badge--aud { color: var(--badge-aud); background: color-mix(in srgb, var(--badge-aud) 16%, transparent); }
.badge--fm  { color: var(--badge-fm);  background: rgba(143, 177, 232, .16); }
.badge--accent { color: var(--accent); background: var(--accent-soft); }

/* ── Section headers (display = Space Grotesk @ Halo weight) ──────────── */
.sec { margin-top: var(--density-sec); }
.sec:first-child { margin-top: 0; }
.sec-head { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; margin-bottom: 18px; }
.sec-title { font-family: var(--font-display-2); font-size: 25px; letter-spacing: -.02em; font-weight: 600; line-height: 1.1; }
.sec-sub { font-size: 13px; color: var(--text-dim); margin-top: 4px; }

/* ── Grids ───────────────────────────────────────────────────────────── */
.grid { display: grid; gap: var(--density-gap); }
.grid > * { min-width: 0; }
.grid--4 { grid-template-columns: repeat(4, 1fr); }
.grid--3 { grid-template-columns: repeat(3, 1fr); }
.grid--2 { grid-template-columns: repeat(2, 1fr); }

/* ── Cover art (emitted by lib/cover.js) ─────────────────────────────── */
.cover {
  position: relative; border-radius: var(--r); overflow: hidden; aspect-ratio: 1 / 1;
  background: var(--surface-2); box-shadow: var(--shadow);
  transition: transform var(--t) var(--ease), box-shadow var(--t) var(--ease);
}
.cover-art { position: absolute; inset: 0; }
.cover-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; transition: opacity var(--t-slow) var(--ease); }
.cover-rings {
  position: absolute; inset: 0; opacity: .18; mix-blend-mode: soft-light;
  background: repeating-radial-gradient(circle at 30% 28%, transparent 0 6px, rgba(255, 255, 255, .5) 6px 7px);
}
.cover-grain {
  position: absolute; inset: 0; opacity: .5; mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}
.cover-spine { position: absolute; left: 0; top: 0; bottom: 0; width: 5px; background: rgba(0, 0, 0, .25); }
.cover-glyph { position: absolute; right: 12px; bottom: 11px; width: 26px; height: 26px; color: rgba(255, 255, 255, .78); opacity: .9; }
.cover-dur {
  position: absolute; right: 11px; top: 11px; z-index: 2; font-family: var(--font-mono); font-size: 10px;
  padding: 3px 6px; border-radius: 5px; background: rgba(0, 0, 0, .42); color: rgba(255, 255, 255, .92); backdrop-filter: blur(4px);
}

/* Attribution credit for Wikimedia Commons artist portraits (cover.js
 * applyArtistArt). Required by CC-BY/CC-BY-SA: visible on large containers
 * (item hero, big rail cards); small thumbs keep the full credit in title=
 * and on the item page. */
.cover-credit {
  position: absolute; left: 0; right: 0; bottom: 0; z-index: 2;
  font-family: var(--font-mono); font-size: 9.5px; letter-spacing: .02em;
  padding: 14px 10px 6px; color: rgba(255, 255, 255, .82); text-decoration: none;
  background: linear-gradient(0deg, rgba(0, 0, 0, .58), transparent);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.cover-credit:hover { color: #fff; text-decoration: underline; }
@container (max-width: 199px) { .cover-credit { display: none; } }

/* ── Fallback cover variants (cv-*) ──────────────────────────────────────
 * Three deterministic designs for tapes with no real artwork, keyed to the
 * identifier hash in lib/cover.js: tape label (J-card), crisp waveform,
 * letterpress poster. Sized with container-query units so the same card
 * works from the 56px player thumb to the ~300px hero; below 120px the
 * typography collapses to a monogram (label/poster) or bars only (wave). */
.cover-art { container-type: inline-size; }
.cv { position: absolute; inset: 0; display: flex; flex-direction: column; }

.cv-label { background: #e9e1cd; color: #2c2620; font-family: 'Special Elite', var(--font-mono); padding: 7.5% 8.5% 7.5% calc(8.5% + 6px); }
.cvl-spine { position: absolute; left: 0; top: 0; bottom: 0; width: 7px; }
.cvl-top { display: flex; align-items: center; gap: .6em; font-size: clamp(9px, 6.4cqw, 12px); letter-spacing: .04em; }
.cvl-badge { border: 1.5px solid #a23b2e; color: #a23b2e; padding: 0 .35em; transform: rotate(-3deg); }
.cvl-artist { font-size: clamp(12px, 10cqw, 21px); line-height: 1.12; margin: 7% 0 5%; text-transform: uppercase; overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
.cvl-line { font-size: clamp(9px, 6.8cqw, 13px); min-height: 1.2em; border-bottom: 1px solid rgba(0, 0, 0, .18); padding: 2% 0 1%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cvl-foot { margin-top: auto; display: flex; justify-content: space-between; gap: 6px; font-size: clamp(9px, 6cqw, 11px); color: #6b6155; white-space: nowrap; overflow: hidden; }

.cv-wave { background: #0b0b0e; color: #e8dfca; padding: 8%; }
.cvw-band { position: absolute; left: 0; right: 0; top: 29%; height: 42%; }
.cvw-band svg { width: 100%; height: 100%; display: block; }
.cvw-artist { font-size: clamp(10px, 7cqw, 13px); letter-spacing: .14em; text-transform: uppercase; color: rgba(255, 255, 255, .93); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.has-dur .cvw-artist { max-width: calc(100% - 58px); }
.cvw-sub { position: absolute; left: 8%; bottom: 7.5%; font-family: var(--font-mono); font-size: clamp(9px, 6.4cqw, 12px); letter-spacing: .08em; color: rgba(232, 223, 202, .75); }
.cvw-badge { position: absolute; right: 8%; bottom: 7%; font-family: var(--font-mono); font-size: clamp(9px, 6cqw, 11px); border: 1px solid rgba(232, 223, 202, .5); padding: 1px 5px; }

.cv-poster { padding: 9%; }
.cvp-artist { font-family: 'Archivo Black', var(--font-sans); font-weight: 400; line-height: .98; text-transform: uppercase; overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow-wrap: anywhere; }
.cvp-rule { height: 2px; background: currentColor; opacity: .85; margin: 6.5% 0 5.5%; width: 24%; flex: none; }
.cvp-ven { font-size: clamp(9px, 6.6cqw, 13px); letter-spacing: .09em; text-transform: uppercase; opacity: .92; line-height: 1.45; overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; }
.cvp-date { margin-top: auto; font-family: var(--font-mono); font-size: clamp(9px, 6.4cqw, 12px); letter-spacing: .12em; opacity: .85; }

.cv-mono { display: none; position: absolute; inset: 0; align-items: center; justify-content: center; font-size: 38cqw; letter-spacing: .02em; }
@container (max-width: 119px) {
  .cvl-top, .cvl-artist, .cvl-line, .cvl-foot, .cvw-artist, .cvw-sub, .cvw-badge,
  .cvp-artist, .cvp-rule, .cvp-ven, .cvp-date { display: none; }
  .cv-mono { display: flex; }
}

/* ── Persistent player bar (desktop) ─────────────────────────────────── */
.player {
  position: sticky; bottom: 0; z-index: 40; height: 84px;
  display: grid; grid-template-columns: minmax(220px, 1fr) auto minmax(220px, 1fr);
  align-items: center; gap: 20px; padding: 0 22px;
  border-top: 1px solid var(--border);
  background: color-mix(in srgb, var(--bg-2) 78%, transparent);
  backdrop-filter: blur(22px);
  transform: translateY(110%); transition: transform var(--t-slow) var(--ease);
}
.player[data-show="1"] { transform: translateY(0); }
.player-now { display: flex; align-items: center; gap: 13px; min-width: 0; cursor: pointer; }
.player-cover { width: 56px; height: 56px; border-radius: 10px; flex: none; overflow: hidden; position: relative; box-shadow: var(--shadow); }
.player-tx { min-width: 0; }
.player-tx b { display: block; font-size: 13.5px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.player-tx span { display: block; font-size: 11.5px; color: var(--text-dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.player-mid { display: flex; flex-direction: column; align-items: center; gap: 7px; width: min(520px, 42vw); }
.player-ctrls { display: flex; align-items: center; gap: 6px; }
.player-ctrls .icon-btn:hover { color: var(--accent); }
.play-fab {
  width: 44px; height: 44px; border-radius: 999px; border: 0; cursor: pointer;
  background: linear-gradient(135deg, var(--accent), var(--accent-2)); color: var(--on-accent);
  display: grid; place-items: center; transition: transform var(--t-fast) var(--ease), filter var(--t-fast) var(--ease);
}
.play-fab:hover { transform: scale(1.06); }
/* pointer-events:none keeps the BUTTON the click target — the svg gets swapped
 * on play/pause, and a mousedown on a node that's replaced before mouseup
 * never produces a click. */
.play-fab svg { width: 20px; height: 20px; pointer-events: none; }
.player-prog { display: flex; align-items: center; gap: 10px; width: 100%; }
.player-time { font-family: var(--font-mono); font-size: 10.5px; color: var(--text-faint); min-width: 34px; }
.player-time:last-child { text-align: right; }
.player-right { display: flex; align-items: center; justify-content: flex-end; gap: 8px; }
.vol { display: flex; align-items: center; gap: 8px; width: 120px; }
.vol .seek { height: 4px; }
.vol svg { color: var(--text-faint); flex: none; }

/* Seek bar. */
.seek { flex: 1; height: 5px; border-radius: 999px; background: var(--surface-3); position: relative; cursor: pointer; }
.seek-fill { position: absolute; left: 0; top: 0; bottom: 0; border-radius: 999px; background: linear-gradient(90deg, var(--accent), var(--accent-2)); width: 0; }
.seek-knob {
  position: absolute; top: 50%; left: 0; width: 13px; height: 13px; border-radius: 999px; background: #fff;
  transform: translate(-50%, -50%); box-shadow: 0 2px 6px rgba(0, 0, 0, .4); opacity: 0; transition: opacity var(--t-fast);
}
.seek:hover .seek-knob, .seek:focus-visible .seek-knob { opacity: 1; }

/* ── Generic / router error view ─────────────────────────────────────── */
.view-kicker {
  font-family: var(--font-mono); font-size: 11px; letter-spacing: .14em;
  text-transform: uppercase; color: var(--accent); margin-bottom: 10px;
}
.view-title { font-family: var(--font-display); font-size: clamp(30px, 4vw, 46px); line-height: 1.04; letter-spacing: -.02em; font-weight: 700; }
.view-lede { font-size: 15px; color: var(--text-dim); max-width: 560px; margin-top: 14px; line-height: 1.6; }

/* ── Mobile shell (≤860px; container query swaps it in) ──────────────── */
/* The mobile top bar, floating mini-player, and bottom tab bar are all part of
 * the shell DOM. They're hidden on desktop here and revealed at the mobile
 * breakpoint in the responsive section below. Styling lives here (so it's not
 * duplicated per breakpoint); display toggles live in the @container blocks. */
.m-top, .m-mini, .m-tabs { display: none; }

/* Mobile top bar: wordmark · spacer · search · theme (screens/11-mobile-home). */
.m-top {
  align-items: center; gap: 6px;
  padding: max(12px, env(safe-area-inset-top, 0px)) 14px 12px;
  border-bottom: 1px solid var(--border);
  background: color-mix(in srgb, var(--bg) 86%, transparent);
  backdrop-filter: blur(14px);
  position: sticky; top: 0; z-index: 20;
}
.m-top-brand { display: flex; align-items: center; gap: 10px; min-width: 0; }
.m-top-brand .rail-mark { width: 30px; height: 30px; border-radius: 9px; }
.m-top-brand .rail-mark svg { width: 16px; height: 16px; }
.m-top-brand .rail-word b { font-size: 14px; }
.m-top-spacer { flex: 1; }

/* Mobile nav sheet — the full section list (desktop-rail parity on mobile).
 * Toggled by JS (data-show), NOT by a breakpoint: it's only ever opened from
 * the mobile-only m-top "Sections" button. Body-appended (escapes the .app
 * container containing-block) like the Now-Playing overlay. */
.m-nav-sheet { position: fixed; inset: 0; z-index: 90; display: none; }
.m-nav-sheet[data-show="1"] { display: block; }
.m-nav-backdrop { position: absolute; inset: 0; background: rgba(0, 0, 0, .5); -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px); }
.m-nav-panel {
  position: absolute; left: 0; right: 0; bottom: 0;
  max-height: 84vh; max-height: 84dvh; overflow-y: auto;
  background: var(--surface-2); color: var(--text);
  border-top: 1px solid var(--border-2);
  border-top-left-radius: 20px; border-top-right-radius: 20px;
  padding: 10px 14px max(20px, env(safe-area-inset-bottom, 0px));
  box-shadow: 0 -22px 60px rgba(0, 0, 0, .5);
}
.m-nav-head { display: flex; align-items: center; justify-content: space-between; padding: 6px 4px 10px; }
.m-nav-head b { font-family: var(--font-display); font-size: 19px; letter-spacing: -.01em; }
.m-nav-group { padding: 4px 0; }
.m-nav-group + .m-nav-group { border-top: 1px solid var(--border); margin-top: 4px; padding-top: 8px; }
.m-nav-group-label { font-family: var(--font-mono); font-size: 10px; letter-spacing: .12em; text-transform: uppercase; color: var(--text-faint); padding: 6px 8px 4px; }
.m-nav-item { display: flex; align-items: center; gap: 13px; min-height: 48px; padding: 8px 10px; border-radius: 12px; color: var(--text); text-decoration: none; }
.m-nav-item svg { color: var(--text-dim); flex: none; }
.m-nav-item:active { background: var(--surface); }
.m-nav-item[data-on="1"] { background: var(--accent-soft); }
.m-nav-item[data-on="1"], .m-nav-item[data-on="1"] svg { color: var(--accent); }
.m-nav-item-tx b { display: block; font-weight: 600; font-size: 15px; line-height: 1.2; }
.m-nav-item-tx span { display: block; font-size: 12px; color: var(--text-dim); margin-top: 1px; }
.m-nav-item[data-on="1"] .m-nav-item-tx span { color: var(--accent); }
.m-nav-panel .icon-btn:focus-visible,
.m-nav-item:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }

/* Floating mini-player: cover · title · thumb-up · play/pause · close · line.
 * Fixed above the tab bar; reveals only when a tape is active (data-show). */
.m-mini {
  position: fixed; left: 10px; right: 10px;
  bottom: calc(64px + env(safe-area-inset-bottom, 0px)); z-index: 41;
  align-items: center; gap: 10px; padding: 8px 10px;
  border-radius: 16px;
  background: color-mix(in srgb, var(--surface-2) 94%, transparent);
  backdrop-filter: blur(18px);
  border: 1px solid var(--border-2);
  box-shadow: 0 14px 40px rgba(0, 0, 0, .4);
  transform: translateY(140%); opacity: 0;
  transition: transform var(--t-slow) var(--ease), opacity var(--t) var(--ease);
}
.m-mini[data-show="1"] { transform: translateY(0); opacity: 1; }
.m-mini-now { display: flex; align-items: center; gap: 11px; min-width: 0; flex: 1;
  border: 0; background: transparent; color: inherit; cursor: pointer; text-align: left; padding: 0; font: inherit; }
.m-mini-cover { width: 44px; height: 44px; border-radius: 10px; flex: none; overflow: hidden; position: relative; box-shadow: var(--shadow); background: var(--surface-3); }
.m-mini-tx { min-width: 0; display: flex; flex-direction: column; line-height: 1.2; }
.m-mini-tx b { display: block; font-size: 13px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.m-mini-tx span { display: block; font-size: 11px; color: var(--text-dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.m-mini-ctrls { display: flex; align-items: center; gap: 2px; flex: none; }
.m-mini-play { width: 38px; height: 38px; flex: none; }
.m-mini-play svg { width: 18px; height: 18px; }
.m-mini-close { width: 34px; height: 34px; }
/* Thin progress line along the bottom edge. */
.m-mini-bar { position: absolute; left: 12px; right: 12px; bottom: 4px; height: 2.5px; border-radius: 999px; background: var(--surface-3); overflow: hidden; }
.m-mini-fill { height: 100%; background: linear-gradient(90deg, var(--accent), var(--accent-2)); border-radius: 999px; }
/* Mini vote: thumb-up only (drop the down arrow + tighten) per the design. */
.vote--mini button[aria-label="Thumbs down"] { display: none; }
.vote--mini .vote-score { min-width: 20px; font-size: 11px; }
.vote--mini button { width: 32px; height: 32px; }

/* ════════════════════════════════════════════════════════════════════════
 * P1 COMPONENT STYLES — Home / Explore / Item / player.
 * Ported from the prototype's base.css component blocks (TapeCard, Vote, rows,
 * hero, now-playing, provenance, filter dropdowns, the comber rails) with the
 * Halo treatments folded in. Halo radii/colors come from tokens.css.
 * ════════════════════════════════════════════════════════════════════════ */

/* ── Section header extras + tabs ────────────────────────────────────── */
.sec-link { font-size: 12.5px; color: var(--text-dim); font-weight: 600; cursor: pointer; display: inline-flex; align-items: center; gap: 5px; border: 0; background: transparent; }
.sec-link:hover { color: var(--accent); }
.sec-link svg { width: 15px; height: 15px; }
.sec-title--xl { font-size: 34px; }
.tabs { display: inline-flex; gap: 4px; padding: 4px; background: var(--surface); border: 1px solid var(--border); border-radius: 12px; }
.tab { padding: 7px 14px; border-radius: 9px; font-size: 12.5px; font-weight: 600; color: var(--text-dim); cursor: pointer; border: 0; background: transparent; transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease); display: inline-flex; align-items: center; gap: 6px; }
.tab svg { width: 15px; height: 15px; }
.tab:hover { color: var(--text); }
.tab[data-on="1"] { background: var(--surface-3); color: var(--text); }

.kicker { font-family: var(--font-mono); font-size: 11px; letter-spacing: .14em; text-transform: uppercase; color: var(--text-faint); margin-bottom: 18px; }
.empty { padding: 60px 20px; text-align: center; color: var(--text-faint); font-size: 14px; grid-column: 1 / -1; }
.fade-in { animation: fadeIn var(--t-slow) var(--ease); }
@keyframes fadeIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }

/* ── Vote cluster ────────────────────────────────────────────────────── */
.vote { display: inline-flex; align-items: center; gap: 2px; }
.vote button { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 8px; border: 0; background: transparent; color: var(--text-faint); cursor: pointer; transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease); }
.vote button svg { width: 16px; height: 16px; }
.vote button:hover { color: var(--accent); background: var(--surface-2); }
.vote button[data-on="1"] { color: var(--accent); }
.vote-score { font-family: var(--font-mono); font-size: 12px; font-weight: 600; min-width: 30px; text-align: center; }
.vote--v { flex-direction: column; gap: 0; }

.guided-pill { display: inline-flex; align-items: center; font-family: var(--font-mono); font-size: 9px; font-weight: 700; letter-spacing: .08em; padding: 2px 5px; border-radius: 4px; background: var(--accent-soft); color: var(--accent); margin-right: 7px; vertical-align: middle; }

/* ── Tape card ───────────────────────────────────────────────────────── */
.cover-badge { position: absolute; left: 11px; top: 11px; }
.cover-play { position: absolute; inset: 0; display: grid; place-items: center; opacity: 0; transition: opacity var(--t) var(--ease); background: linear-gradient(0deg, rgba(0,0,0,.4), rgba(0,0,0,.05)); cursor: pointer; }
.cover-play span { width: 52px; height: 52px; border-radius: 999px; background: var(--accent); color: var(--on-accent); display: grid; place-items: center; box-shadow: 0 10px 30px rgba(0,0,0,.4); transform: translateY(6px) scale(.92); transition: transform var(--t) var(--ease); }
.cover-play span svg { width: 22px; height: 22px; margin-left: 2px; }

.tape { cursor: pointer; display: flex; flex-direction: column; gap: 11px; }
.tape:hover .cover { transform: translateY(-4px); box-shadow: var(--shadow-lg), 0 0 40px var(--accent-soft); }
.tape:hover .cover-play { opacity: 1; }
.tape:hover .cover-play span { transform: translateY(0) scale(1); }
.tape:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; border-radius: var(--r); }
.tape-cap { display: flex; flex-direction: column; gap: 3px; padding: 0 2px; }
.tape-artist { font-size: 14px; font-weight: 600; letter-spacing: -.01em; line-height: 1.2; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 1; line-clamp: 1; -webkit-box-orient: vertical; }
.tape-venue { font-size: 12px; color: var(--text-dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-height: 1em; }
.tape-meta { display: flex; align-items: center; gap: 8px; font-family: var(--font-mono); font-size: 10.5px; color: var(--text-faint); margin-top: 2px; }
.tape-loves { margin-left: auto; display: inline-flex; align-items: center; gap: 4px; color: var(--text-dim); }
/* Matched-song annotation on Explore results (song-title search). */
.tape-song { font-size: 12px; font-weight: 500; color: var(--accent); line-height: 1.2; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.row-tx .row-song { color: var(--accent); }
.tape-loves svg { color: var(--accent); opacity: .85; }
/* Genre label — plain in .tape-venue/.tape-meta; a clickable chip when it maps
   to an Explore bucket. Inherits the surrounding type; reset button chrome. */
.tape-genre { font: inherit; color: inherit; }
button.tape-genre--link {
  border: 0; background: none; padding: 0; margin: 0; font: inherit; cursor: pointer;
  color: inherit; text-align: left; transition: color var(--t-fast) var(--ease);
}
button.tape-genre--link:hover,
button.tape-genre--link:focus-visible { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }

/* Card / cover skeletons (loading state). */
.cover--skel, .tape--skel .cover { background: linear-gradient(100deg, var(--surface) 30%, var(--surface-2) 50%, var(--surface) 70%); background-size: 200% 100%; animation: shimmer 1.3s linear infinite; }
.tape--skel { pointer-events: none; }
.row--skel { height: 62px; border-radius: 12px; background: linear-gradient(100deg, var(--surface) 30%, var(--surface-2) 50%, var(--surface) 70%); background-size: 200% 100%; animation: shimmer 1.3s linear infinite; margin-bottom: 6px; }
@keyframes shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }

/* ── Horizontal scroll rail (the comber) ─────────────────────────────── */
.rail-x { display: flex; gap: 16px; overflow-x: auto; padding: 4px 30px 14px; margin: 0 -30px; scroll-snap-type: x mandatory; }
.rail-x::-webkit-scrollbar { height: 0; }
.rail-x > * { scroll-snap-align: start; flex: none; }
.comber-cell { width: 190px; }
.comber-row { margin-top: 20px; }
.comber-row-head { display: flex; align-items: baseline; gap: 12px; margin-bottom: 12px; }
.comber-row-title { font-size: 15px; font-weight: 600; letter-spacing: -.01em; color: var(--text); }
.comber-row-tag { font-family: var(--font-mono); font-size: 10.5px; letter-spacing: .06em; text-transform: uppercase; color: var(--accent); }
/* Clickable rail title → Explore filtered by that genre. Reset button chrome;
   reveal a "→" affordance on hover/focus. */
button.comber-row-title--link {
  border: 0; background: none; padding: 0; margin: 0; font: inherit; cursor: pointer;
  letter-spacing: -.01em; display: inline-flex; align-items: baseline; gap: 4px;
  transition: color var(--t-fast) var(--ease);
}
button.comber-row-title--link:hover,
button.comber-row-title--link:focus-visible { color: var(--accent); }
.comber-row-more { font-family: var(--font-mono); font-size: 12px; opacity: 0; transform: translateX(-3px);
  transition: opacity var(--t-fast) var(--ease), transform var(--t-fast) var(--ease); }
button.comber-row-title--link:hover .comber-row-more,
button.comber-row-title--link:focus-visible .comber-row-more { opacity: 1; transform: none; }

/* ── Hero (Riker's Pick) ─────────────────────────────────────────────── */
.hero { display: grid; grid-template-columns: 300px 1fr; gap: 36px; align-items: center; padding: 40px; border-radius: var(--r-xl); position: relative; overflow: visible; background: var(--surface); border: 1px solid var(--border); box-shadow: var(--shadow); }
.hero-amb { position: absolute; inset: -40px; z-index: 0; opacity: .85; filter: blur(8px); border-radius: var(--r-xl); pointer-events: none; }
/* Exclude the absolute ambient layer: a bare `.hero > *` (0,1,1) outranks
   `.hero-amb` (0,1,0) and forced it back to position:relative, so it stayed an
   in-flow grid item, took column 1 (300px), and shoved the cover into the 1fr
   track — at wide viewports the cover ballooned (722px) and the info column was
   crushed. :not(.hero-amb) keeps the glow out of grid flow. */
.hero > *:not(.hero-amb) { position: relative; z-index: 1; }
.hero-cover { aspect-ratio: 1; border-radius: var(--r-lg); overflow: hidden; position: relative; box-shadow: 0 30px 80px rgba(0,0,0,.5), 0 0 50px var(--accent-soft); }
.hero-info { display: flex; flex-direction: column; gap: 14px; min-width: 0; }
.hero-kick { font-family: var(--font-mono); font-size: 11px; letter-spacing: .14em; text-transform: uppercase; color: var(--accent); display: flex; align-items: center; gap: 10px; white-space: nowrap; }
.hero-kick::after { content: ""; flex: 1; height: 1px; background: var(--border); }
.hero-title { font-family: var(--font-display); font-size: clamp(28px, 3.6vw, 46px); line-height: 1.02; letter-spacing: -.03em; font-weight: 700; }
.hero-sub { font-size: 14px; color: var(--text-dim); }
.hero-blurb { font-size: 14.5px; line-height: 1.6; color: var(--text-dim); max-width: 520px; }
.hero-actions { display: flex; align-items: center; gap: 10px; margin-top: 6px; flex-wrap: wrap; }
.hero--loading { min-height: 320px; }
.hero-skel { position: absolute; inset: 0; border-radius: var(--r-xl); background: linear-gradient(100deg, var(--surface) 30%, var(--surface-2) 50%, var(--surface) 70%); background-size: 200% 100%; animation: shimmer 1.3s linear infinite; }
.btn[data-on="1"] svg { color: var(--accent); }

/* ── List rows / table (Explore list + leaderboards) ─────────────────── */
.rows { display: flex; flex-direction: column; }
.row { display: grid; grid-template-columns: 28px 1fr 160px 70px 40px; align-items: center; gap: 14px; padding: 10px 12px; border-radius: 12px; cursor: pointer; transition: background var(--t-fast) var(--ease); }
.row:hover { background: var(--surface); }
.row-idx { font-family: var(--font-mono); font-size: 12px; color: var(--text-faint); text-align: center; }
.row:hover .row-idx { color: var(--accent); }
.row-main { display: flex; align-items: center; gap: 13px; min-width: 0; }
.row-thumb { width: 42px; height: 42px; border-radius: 8px; flex: none; overflow: hidden; position: relative; box-shadow: var(--shadow); }
.row-tx { min-width: 0; }
.row-tx b { display: block; font-size: 13.5px; font-weight: 600; letter-spacing: -.005em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.row-tx span { display: block; font-size: 11.5px; color: var(--text-dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.row-venue { font-size: 12px; color: var(--text-dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.row-num { font-family: var(--font-mono); font-size: 12px; color: var(--text-dim); text-align: right; }
.rows-head { display: grid; grid-template-columns: 28px 1fr 160px 70px 40px; gap: 14px; padding: 8px 12px; font-size: 10px; letter-spacing: .12em; text-transform: uppercase; color: var(--text-faint); font-weight: 700; border-bottom: 1px solid var(--border); margin-bottom: 6px; }

/* Explore list adds a "Loved" column: #, Tape, Venue, Loved, Length, play. */
.row--explore, .rows-head--explore { grid-template-columns: 28px 1fr 150px 110px 72px 40px; }
.rows-head--explore span:nth-child(4), .rows-head--explore span:nth-child(5) { text-align: left; }
.rows-head--explore span:nth-child(5) { text-align: right; }
.row--explore .row-dur { text-align: right; }
.row-loved { display: inline-flex; justify-content: flex-start; }

.sec-head--explore { margin-bottom: 20px; }
.fdrop-row { display: flex; gap: 14px; flex-wrap: wrap; align-items: center; margin-bottom: 24px; }
.explore-more { margin-top: 26px; display: flex; justify-content: center; }

/* ── Filter dropdowns ────────────────────────────────────────────────── */
.fdrop { display: inline-flex; align-items: center; gap: 9px; }
.fdrop-label { font-family: var(--font-mono); font-size: 10px; letter-spacing: .12em; text-transform: uppercase; color: var(--text-faint); font-weight: 700; }
.fdrop-sel { position: relative; display: inline-flex; align-items: center; }
.fdrop-sel select { appearance: none; -webkit-appearance: none; -moz-appearance: none; padding: 9px 34px 9px 15px; border-radius: 999px; border: 1px solid var(--border-2); background: var(--surface); color: var(--text); font-family: var(--font-body); font-size: 13px; font-weight: 600; cursor: pointer; transition: background var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease); max-width: 220px; }
.fdrop-sel select:hover { border-color: var(--text-faint); background: var(--surface-2); }
.fdrop-sel svg { position: absolute; right: 13px; pointer-events: none; color: var(--text-dim); }

/* ── Item / tape detail page ─────────────────────────────────────────── */
.scroll-fade { animation: fadeIn var(--t-slow) var(--ease); }
.item-hero-band { position: relative; }
.item-hero-amb { position: absolute; inset: 0; height: 420px; z-index: 0; opacity: .9; }
.item-hero-wrap { position: relative; z-index: 1; padding-bottom: 12px; }
.item-back { cursor: pointer; }
.item-back:hover { color: var(--accent); }
.item-head { display: grid; grid-template-columns: 300px 1fr; gap: 36px; align-items: flex-end; }
.item-cover { box-shadow: var(--shadow-lg), 0 0 50px var(--accent-soft); }
.item-sub-title { font-size: 16px; }
.item-body-wrap { padding-top: 12px; }
.item-body { display: grid; grid-template-columns: 1fr 300px; gap: 44px; align-items: start; }
.item-col-title { font-size: 20px; margin-bottom: 10px; }
.item-track { grid-template-columns: 28px 1fr auto auto; }
.item-track[data-on="1"] { background: var(--accent-soft); }
/* Setlist row actions: Share + Play, right-aligned in the last cell. */
.row-actions { display: flex; align-items: center; gap: 2px; justify-content: flex-end; }
/* A per-track Share link (…?t=<n>) lands on the row → a brief accent-ring
   pulse. Only the ring animates (not the background) so it never fights the
   [data-on] now-playing tint. */
.item-track--focus { animation: trackFocus 2.2s var(--ease); }
@keyframes trackFocus {
  0%, 70% { box-shadow: inset 0 0 0 2px var(--accent); }
  100%    { box-shadow: inset 0 0 0 0 transparent; }
}
/* Deep-link "press Play" nudge (2026-06-09): a tape opened from a shared /
   external link intentionally doesn't autoplay, so the primary play control
   pulses a gentle accent halo for ~3 beats to show where to start. Outer glow
   only (never touches layout) and self-clears — no animation-fill-mode, and
   item.js also strips the class once playback begins. */
.mus-play-hint { animation: musPlayHint 1.1s var(--ease) 0s 3; }
@keyframes musPlayHint {
  0%   { box-shadow: 0 0 0 0 color-mix(in srgb, var(--accent) 55%, transparent); }
  70%  { box-shadow: 0 0 0 7px color-mix(in srgb, var(--accent) 0%, transparent); }
  100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--accent) 0%, transparent); }
}
@media (prefers-reduced-motion: reduce) {
  .mus-play-hint { animation: none; box-shadow: 0 0 0 3px var(--accent-soft); }
}
.item-notes { font-size: 14px; line-height: 1.7; color: var(--text-dim); font-family: var(--font-display); }
.item-meta-list { margin-top: 20px; display: flex; flex-direction: column; gap: 10px; }
.item-meta-row { display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--border); padding-bottom: 8px; gap: 14px; }
.item-meta-k { font-size: 11px; letter-spacing: .1em; text-transform: uppercase; color: var(--text-faint); font-weight: 700; }
.item-meta-v { font-family: var(--font-mono); font-size: 12.5px; color: var(--text); text-align: right; word-break: break-word; }
.item-meta-v--accent { color: var(--accent); }
.item-related { margin-top: 44px; }

/* ── Provenance disclosure (collapsed) ───────────────────────────────── */
.prov { margin-top: 22px; border: 1px solid var(--border); border-radius: var(--r); overflow: hidden; }
.prov-toggle { display: flex; align-items: center; gap: 9px; width: 100%; padding: 12px 14px; border: 0; cursor: pointer; background: var(--surface); color: var(--text-dim); font-family: var(--font-body); font-size: 12.5px; font-weight: 600; transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease); }
.prov-toggle:hover { color: var(--text); background: var(--surface-2); }
.prov-toggle svg:first-child { color: var(--accent); }
.prov--open .prov-toggle { border-bottom: 1px solid var(--border); }
.prov-body { padding: 6px 14px 14px; animation: fadeIn var(--t) var(--ease); }
.prov-body[hidden] { display: none; }
.prov-row { display: flex; justify-content: space-between; gap: 14px; align-items: baseline; padding: 8px 0; border-bottom: 1px solid var(--border); }
.prov-k { font-size: 10px; letter-spacing: .1em; text-transform: uppercase; color: var(--text-faint); font-weight: 700; flex: none; }
.prov-v { font-family: var(--font-mono); font-size: 11.5px; color: var(--text); text-align: right; word-break: break-word; }
.prov-link { display: inline-flex; align-items: center; gap: 6px; margin-top: 12px; font-size: 12.5px; font-weight: 600; color: var(--accent); }
.prov-link:hover { text-decoration: underline; }
.prov-note { margin-top: 10px; font-size: 11px; line-height: 1.5; color: var(--text-faint); }

/* ── Player: now block save + guided pill spacing ────────────────────── */
.player-now .icon-btn { flex: none; }

/* ── Expanded Now-Playing overlay ────────────────────────────────────── */
.now { position: fixed; inset: 0; z-index: 200; background: var(--bg); display: flex; flex-direction: column; opacity: 0; pointer-events: none; transition: opacity var(--t-slow) var(--ease); }
.now[data-show="1"] { opacity: 1; pointer-events: auto; }
.now-amb { position: absolute; inset: 0; z-index: 0; opacity: .95; pointer-events: none; }
.now-bar { position: relative; z-index: 2; display: flex; align-items: center; justify-content: space-between; padding: 18px 24px; }
.now-bar .crumb b { color: var(--text); }
.now-inner { position: relative; z-index: 1; flex: 1; display: grid; grid-template-columns: 1fr 1fr; gap: 50px; align-items: center; max-width: 1100px; margin: 0 auto; width: 100%; padding: 40px 50px; }
.now-big-cover { width: min(420px, 38vh); aspect-ratio: 1; border-radius: var(--r-lg); overflow: hidden; position: relative; box-shadow: 0 40px 120px rgba(0,0,0,.6), 0 0 90px var(--accent-soft); justify-self: center; }
.now-info { display: flex; flex-direction: column; gap: 16px; max-width: 460px; min-width: 0; }
.now-kick { font-family: var(--font-mono); font-size: 11px; letter-spacing: .14em; text-transform: uppercase; color: var(--accent); }
.now-title { font-family: var(--font-display); font-size: clamp(30px, 4.5vw, 50px); line-height: 1.04; letter-spacing: -.03em; font-weight: 700; }
.now-sub { font-size: 15px; color: var(--text-dim); }
.now-prog { display: flex; align-items: center; gap: 12px; }
.now-tracks { margin-top: 6px; display: flex; flex-direction: column; gap: 2px; max-height: 200px; overflow-y: auto; }
.now-track { display: grid; grid-template-columns: 22px 1fr auto; gap: 12px; align-items: center; padding: 8px 10px; border-radius: 9px; cursor: pointer; font-size: 13px; }
.now-track:hover { background: var(--surface); }
.now-track[data-on="1"] { background: var(--accent-soft); color: var(--accent); }
.now-track .t-idx { font-family: var(--font-mono); font-size: 11px; color: var(--text-faint); text-align: center; }
.now-track .t-len { font-family: var(--font-mono); font-size: 11px; color: var(--text-faint); }

/* The expanded Now-Playing overlay is appended to <body> (so the .app
 * container-query containing-block can't clip it). That ALSO means the
 * `@container app` responsive rules below never reach it — its mobile layout
 * must come from a viewport @media query. Without this the overlay stays a
 * 2-column grid at phone width, dropping the info column off-screen. Mirrors
 * the container rules at the same 860/540 breakpoints. */
@media (max-width: 860px) {
  .now-inner {
    grid-template-columns: 1fr; gap: 22px;
    padding: 16px 22px 40px; align-content: start; overflow-y: auto;
  }
  .now-big-cover { width: min(240px, 46vw); }
  .now-info { max-width: none; }
  .now-tracks { max-height: 34vh; }
  .now-bar { padding: max(14px, env(safe-area-inset-top, 0px)) 18px 14px; }
}
@media (max-width: 540px) {
  .now-title { font-size: 28px; }
  .now-big-cover { width: min(200px, 42vw); }
}

/* ══════════════════════════════════════════════════════════════════════
 * P2 SURFACES — Riker's Picks · Most Played · Saved · Settings · Artists ·
 * Guided. Ported from the prototype's base.css component blocks with the Halo
 * tokens folded in; new markup classes match views/{picks,most-played,saved,
 * settings,artists,guided}.js. Base classes (wrap/sec/sec-head/sec-title/tabs/
 * grid/rows/empty/pill/btn) are reused from above — not redefined here.
 * ══════════════════════════════════════════════════════════════════════ */

/* ── Riker's Picks — week shelf + selected edition ───────────────────── */
.picks-head { max-width: 640px; margin-bottom: 28px; }
.picks-title { font-size: clamp(34px, 5vw, 44px); line-height: 1.05; }
.picks-intro { margin-top: 14px; font-size: 16px; max-width: 600px; }

.week-shelf { display: flex; gap: 16px; overflow-x: auto; padding: 4px 30px 18px; margin: 0 -30px 8px; scroll-snap-type: x mandatory; }
.week-shelf::-webkit-scrollbar { height: 0; }
.week-card { flex: none; width: 184px; scroll-snap-align: start; display: flex; flex-direction: column; gap: 11px; padding: 0; border: 0; background: transparent; cursor: pointer; text-align: left; }
.week-cover { position: relative; aspect-ratio: 1; border-radius: var(--r); overflow: hidden; display: grid; grid-template-columns: 1fr 1fr; box-shadow: var(--shadow); transition: transform var(--t) var(--ease), box-shadow var(--t) var(--ease); background: var(--surface-2); }
.week-card[data-on="1"] .week-cover { box-shadow: var(--shadow-lg), 0 0 0 2px var(--accent), 0 0 40px var(--accent-soft); }
.week-card:hover .week-cover { transform: translateY(-3px); }
.week-card:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; border-radius: var(--r); }
.week-cover-q { position: relative; overflow: hidden; }
.week-cover--empty { display: grid; place-items: center; background: var(--surface-2); color: var(--text-faint); border: 1px dashed var(--border-2); }
.week-cover--empty svg { width: 22px; height: 22px; }
.week-card-tx b { display: block; font-family: var(--font-mono); font-size: 10px; letter-spacing: .08em; text-transform: uppercase; color: var(--accent); }
.week-card[data-on="0"] .week-card-tx b { color: var(--text-faint); }
.week-card-tx span { display: block; font-size: 13px; font-weight: 600; line-height: 1.25; margin-top: 4px; color: var(--text);
  overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; line-clamp: 2; -webkit-box-orient: vertical; }
.week-card--ghost { cursor: default; opacity: .7; }
.week-card--ghost .week-card-tx span { color: var(--text-dim); font-weight: 500; }

.picks-edition { margin-top: 8px; }
.picks-edition-rule { display: flex; align-items: baseline; gap: 14px; border-top: 2px solid var(--text); padding-top: 14px; margin-bottom: 20px; }
.picks-edition-date { font-family: var(--font-mono); font-size: 11px; letter-spacing: .1em; text-transform: uppercase; color: var(--accent); }
.picks-edition-curator { font-size: 11px; color: var(--text-faint); text-transform: uppercase; letter-spacing: .1em; }
.picks-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 40px; align-items: start; }
.picks-row > * { min-width: 0; }
.picks-edition-title { font-family: var(--font-display); font-size: 30px; line-height: 1.1; letter-spacing: -.01em; margin-bottom: 12px; }
.picks-play { margin-top: 18px; }
.picks-play:disabled { opacity: .5; cursor: default; }

/* ── Most Played — track leaderboard ─────────────────────────────────── */
.mp-list { display: flex; flex-direction: column; gap: 2px; }
.mp-row { display: grid; grid-template-columns: 26px 44px 1fr 130px 72px 38px; align-items: center; gap: 14px; padding: 9px 12px; border-radius: 12px; cursor: pointer; transition: background var(--t-fast) var(--ease); }
.mp-row:hover { background: var(--surface); }
.mp-row[data-on="1"] { background: var(--accent-soft); }
.mp-row:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.mp-idx { font-family: var(--font-mono); font-size: 12px; color: var(--text-faint); text-align: center; }
.mp-row[data-on="1"] .mp-idx { color: var(--accent); }
.mp-thumb { width: 44px; height: 44px; border-radius: 8px; overflow: hidden; position: relative; box-shadow: var(--shadow); }
.mp-meta { min-width: 0; }
.mp-meta b { display: block; font-size: 13.5px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mp-meta span { display: block; font-size: 11.5px; color: var(--text-dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mp-bar { height: 6px; border-radius: 999px; background: var(--surface-3); overflow: hidden; }
.mp-bar-fill { height: 100%; background: linear-gradient(90deg, var(--accent), var(--accent-2)); border-radius: 999px; }
.mp-plays { font-family: var(--font-mono); font-size: 11px; color: var(--text-dim); text-align: right; }
.mp-play { flex: none; }
.mp-row--skel { pointer-events: none; }
.mp-row--skel .mp-thumb, .mp-row--skel .mp-meta b, .mp-row--skel .mp-meta span { background: var(--surface-2); border-radius: 6px; color: transparent; }
.sec-head--mp, .sec-head--saved, .sec-head--settings, .sec-head--artists { margin-bottom: 18px; }

/* ── Saved — Queue / Playlists / Saved ───────────────────────────────── */
.saved-panel { margin-top: 4px; }
.saved-empty-link { display: inline-flex; }
.queue-rows .queue-row { grid-template-columns: 28px 44px 1fr auto 38px; }
.queue-row[data-on="1"] { background: var(--accent-soft); }
.queue-row[data-on="1"] .row-idx { color: var(--accent); }
.queue-thumb { width: 40px; height: 40px; border-radius: 8px; overflow: hidden; position: relative; box-shadow: var(--shadow); }

.playlist-grid { gap: 22px; }
.playlist-card { cursor: pointer; }
.playlist-cover { position: relative; aspect-ratio: 4 / 3; border-radius: var(--r); overflow: hidden; display: grid; grid-template-columns: 1fr 1fr; box-shadow: var(--shadow); background: var(--surface-2); transition: transform var(--t) var(--ease), box-shadow var(--t) var(--ease); }
.playlist-card:hover .playlist-cover { transform: translateY(-3px); box-shadow: var(--shadow-lg), 0 0 40px var(--accent-soft); }
.playlist-card:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; border-radius: var(--r); }
.playlist-cover-q { position: relative; overflow: hidden; }
.playlist-cover-cap { position: absolute; inset: 0; display: flex; align-items: flex-end; padding: 14px; background: linear-gradient(0deg, rgba(0,0,0,.55), transparent 60%); }
.playlist-name { font-family: var(--font-display); font-size: 19px; color: #fff; line-height: 1.1; }
.playlist-sub { font-size: 11px; color: rgba(255,255,255,.72); margin-top: 3px; }

/* ── Settings — jump-nav + sections ──────────────────────────────────── */
.set-code, .set-acct-note code { font-family: var(--font-mono); font-size: 11px; color: var(--accent); }
.set-shell { display: grid; grid-template-columns: 188px 1fr; gap: 44px; align-items: start; }
.set-nav { position: sticky; top: 8px; display: flex; flex-direction: column; gap: 2px; }
.set-nav-item { padding: 8px 12px; border-radius: var(--r-sm); font-size: 13px; font-weight: 600; color: var(--text-dim); cursor: pointer; text-decoration: none; }
.set-nav-item:hover { background: var(--surface); color: var(--text); }
.set-content { min-width: 0; }
.set-group { margin-top: 30px; scroll-margin-top: 90px; }
.set-group:first-child { margin-top: 0; }
.set-group-head { margin-bottom: 12px; }
.set-group-title { font-family: var(--font-display); font-size: 20px; font-weight: 600; }
.set-group-sub { font-size: 12.5px; color: var(--text-dim); margin-top: 2px; }
.set-card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--r); padding: 4px 18px; }
.set-row { display: flex; align-items: center; justify-content: space-between; gap: 20px; padding: 15px 0; border-bottom: 1px solid var(--border); }
.set-row:last-child { border-bottom: 0; }
.set-row-tx { min-width: 0; }
.set-row-label { font-size: 14px; font-weight: 600; }
.set-row-hint { font-size: 12px; color: var(--text-dim); margin-top: 3px; text-wrap: pretty; }
.set-row-ctrl { flex: none; }
.acct-card { display: flex; align-items: center; gap: 16px; padding: 16px 4px; flex-wrap: wrap; }
.acct-ava { width: 48px; height: 48px; border-radius: 999px; flex: none; display: grid; place-items: center; background: var(--surface-2); border: 1px solid var(--border-2); color: var(--text-dim); }
.acct-meta { flex: 1; min-width: 160px; }
.acct-name { font-size: 15px; font-weight: 650; }
.acct-sub { font-size: 12.5px; color: var(--text-dim); margin-top: 2px; }
.set-acct-note { font-family: var(--font-mono); font-size: 11px; color: var(--text-faint); padding: 12px 2px 4px; }
.set-acct-note code { color: var(--text-dim); }
.set-placeholder { padding: 18px 0; color: var(--text-faint); font-size: 13px; display: flex; align-items: center; gap: 10px; }
.set-footer { margin-top: 26px; font-family: var(--font-mono); font-size: 11px; color: var(--text-faint); line-height: 1.8; }
.set-sel { padding: 8px 12px; border-radius: var(--r-sm); border: 1px solid var(--border-2); background: var(--surface); color: var(--text); font-family: var(--font-mono); font-size: 12px; cursor: pointer; }
.set-sel:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.set-seg { /* inherits .tabs */ }
.set-switch { width: 46px; height: 26px; border-radius: 999px; border: 0; cursor: pointer; position: relative; background: var(--surface-3); transition: background var(--t) var(--ease); flex: none; }
.set-switch[data-on="1"] { background: var(--accent); }
.set-switch-knob { position: absolute; top: 3px; left: 3px; width: 20px; height: 20px; border-radius: 999px; background: #fff; transition: left var(--t) var(--ease); box-shadow: 0 2px 4px rgba(0,0,0,.3); }
.set-switch[data-on="1"] .set-switch-knob { left: 23px; }
.set-accent { display: flex; align-items: center; gap: 10px; }
.set-accent-swatch { width: 32px; height: 32px; border-radius: 8px; background: linear-gradient(135deg, var(--accent), var(--accent-2)); border: 1px solid var(--border-2); }
.set-accent code { font-family: var(--font-mono); font-size: 11px; color: var(--text-dim); }

/* ── Artists — A–Z directory ─────────────────────────────────────────── */
.artists-jump { display: flex; gap: 4px; flex-wrap: wrap; margin: 14px 0 26px; }
.artists-jump-pill { padding: 6px 10px; }
.artists-jump-pill--off { opacity: .35; cursor: default; }
.artists-letter { margin-top: 28px; }
.artists-letter:first-child { margin-top: 8px; }
.artists-letter-title { font-size: 24px; }
.artists-grid { gap: 12px; }
.artist-row { display: flex; align-items: center; gap: 14px; padding: 10px; border-radius: var(--r); background: var(--surface); border: 1px solid var(--border); cursor: pointer; transition: border-color var(--t-fast) var(--ease), transform var(--t-fast) var(--ease); }
.artist-row:hover { border-color: var(--text-faint); transform: translateY(-2px); }
.artist-row:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.artist-thumb { width: 52px; height: 52px; border-radius: 10px; overflow: hidden; position: relative; flex: none; box-shadow: var(--shadow); }
.artist-tx { min-width: 0; flex: 1; }
.artist-name { font-weight: 600; font-size: 14.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.artist-sub { font-size: 12px; color: var(--text-dim); margin-top: 1px; }
.artist-row > svg { width: 18px; height: 18px; color: var(--text-faint); flex: none; }

/* ── Guided — radio destination ──────────────────────────────────────── */
.guided-root { position: relative; min-height: 100%; }
.guided-root--active { display: block; }
.g-backdrop { position: absolute; inset: -10%; z-index: 0; overflow: hidden; opacity: .32; filter: blur(46px) saturate(1.25); pointer-events: none; }
.g-content { position: relative; z-index: 1; max-width: var(--content-max); margin: 0 auto; padding: 26px 30px 140px; }
.g-modebar { display: flex; align-items: center; gap: 14px; margin-bottom: 26px; }
.g-modebar-label { font-family: var(--font-mono); font-size: 10px; letter-spacing: .16em; color: var(--text-faint); font-weight: 700; }
.g-modebar-group { display: inline-flex; gap: 6px; padding: 5px; background: var(--surface); border: 1px solid var(--border); border-radius: 14px; }
.g-mode-btn { display: flex; flex-direction: column; align-items: flex-start; gap: 1px; border: 0; background: transparent; cursor: pointer; padding: 7px 14px; border-radius: 9px; color: var(--text-dim); transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease); }
.g-mode-btn:hover { color: var(--text); }
.g-mode-btn[data-on="1"] { background: linear-gradient(135deg, var(--accent), var(--accent-2)); color: var(--on-accent); }
.g-mode-l { font-size: 13px; font-weight: 650; }
.g-mode-h { font-size: 10px; opacity: .8; }
.g-grid { display: grid; grid-template-columns: 1fr 1.4fr 1fr; gap: 30px; align-items: start; }
.g-stage { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 9px; }
.guided-col-kick { margin: 0; }
.g-stage-art { width: min(340px, 66%); aspect-ratio: 1; border-radius: var(--r-lg); overflow: hidden; position: relative; box-shadow: var(--shadow-lg), 0 0 70px var(--accent-soft); margin: 6px 0; }
.g-stage-title { font-family: var(--font-display); font-size: clamp(26px, 3vw, 40px); line-height: 1.05; letter-spacing: -.02em; }
.g-stage-by { font-size: 16px; font-weight: 600; cursor: pointer; }
.g-stage-by:hover { color: var(--accent); }
.g-stage-src { font-size: 12px; color: var(--text-dim); cursor: pointer; font-family: var(--font-mono); }
.g-stage-src:hover { color: var(--accent); }
.g-side { display: flex; flex-direction: column; gap: 6px; }
.g-side-empty { font-size: 12px; color: var(--text-faint); font-style: italic; padding: 8px 4px; }
.g-row { display: flex; align-items: center; gap: 11px; padding: 7px; border-radius: 10px; cursor: pointer; transition: background var(--t-fast) var(--ease); }
.g-row:hover { background: var(--surface); }
.g-row:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.g-row-thumb { width: 40px; height: 40px; border-radius: 7px; overflow: hidden; position: relative; flex: none; box-shadow: var(--shadow); }
.g-row-meta { min-width: 0; }
.g-row-title { font-size: 12.5px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.g-row-by { font-size: 11px; color: var(--text-dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.g-empty { padding: 24px 0; }
.guided-empty-title { font-size: clamp(30px, 4vw, 40px); line-height: 1.05; }
.guided-empty-lede { max-width: 480px; margin-top: 12px; }
.guided-start { margin-top: 20px; }

/* ── Keyboard focus ring (a11y) ──────────────────────────────────────────
 * Bespoke component rings (.tape/.week-card/.mp-row/…) are above; this is the
 * shared fallback for the generic controls (buttons, icon-buttons, pills, tabs,
 * the mobile top-bar + tab-bar + mini-player buttons, selects, seek handles) so
 * every keyboard-reachable element shows a consistent violet ring instead of
 * the inconsistent UA default. Mouse clicks don't trigger :focus-visible, so
 * this never shows on pointer interaction. */
.app .btn:focus-visible,
.app .icon-btn:focus-visible,
.app .pill:focus-visible,
.app .tab:focus-visible,
.app .play-fab:focus-visible,
.app .sec-link:focus-visible,
.app .m-tab:focus-visible,
.app .m-top-brand:focus-visible,
.app .rail-item:focus-visible,
.app .rail-brand:focus-visible,
.app .m-mini-now:focus-visible,
.app .fdrop-sel select:focus-visible,
.app .vote button:focus-visible,
.app .prov-toggle:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
  border-radius: var(--r-sm);
}
.app .seek:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }

/* ── Reduced motion: disable keyframe animations entirely ────────────── */
/* `.now` is appended to <body> (outside .app), so it must be named explicitly
 * here or its 0.36s open/close fade survives the reduced-motion preference. */
@media (prefers-reduced-motion: reduce) {
  .app *, .app *::before, .app *::after,
  .now, .now *, .now *::before, .now *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

/* ── Responsive (container queries on .app) ──────────────────────────── */
@container app (max-width: 1000px) {
  .grid--4 { grid-template-columns: repeat(3, 1fr); }
  .item-body { grid-template-columns: 1fr 260px; gap: 32px; }
}
@container app (max-width: 860px) {
  /* Swap the desktop chrome for the mobile shell: hide the rail + the desktop
   * toolbar + the desktop player bar; reveal the mobile top bar, the floating
   * mini-player, and the bottom tab bar. */
  .rail { display: none; }
  .toolbar { display: none; }
  .player { display: none; }
  .m-top { display: flex; }
  /* ≥44px touch targets for the mobile header buttons (search/sections/theme). */
  .m-top .icon-btn { width: 44px; height: 44px; }
  .m-mini { display: flex; }
  .m-tabs {
    display: flex;
    position: sticky; bottom: 0; z-index: 31;
    padding: 8px 6px max(18px, env(safe-area-inset-bottom, 0px));
    background: color-mix(in srgb, var(--bg-2) 92%, transparent);
    backdrop-filter: blur(20px); border-top: 1px solid var(--border);
  }
  .m-tab {
    flex: 1; display: flex; flex-direction: column; align-items: center; gap: 4px;
    border: 0; background: transparent; color: var(--text-faint); cursor: pointer;
    padding: 6px 4px; transition: color var(--t-fast); min-height: 44px;
    text-decoration: none;
  }
  .m-tab svg { width: 21px; height: 21px; }
  .m-tab span { font-size: 10px; font-weight: 600; letter-spacing: .01em; }
  .m-tab[data-on="1"] { color: var(--accent); }

  .grid--4, .grid--3 { grid-template-columns: repeat(2, 1fr); }
  /* Bottom padding clears the tab bar (~64px) PLUS the floating mini-player
   * (~60px) when a tape is active — a single generous value avoids coupling a
   * JS "is-playing" flag into layout; the cost on an idle page is just scroll. */
  .wrap, .view { padding: 18px 16px 150px; }

  /* Comber rails bleed to the 16px content gutter (not the desktop 30px), so
   * the first card lines up with the section headers instead of clipping. */
  .rail-x { padding-left: 16px; padding-right: 16px; margin: 0 -16px; }

  /* Stack the two-column surfaces. */
  .hero { grid-template-columns: 1fr; gap: 24px; padding: 26px; }
  .hero-cover { max-width: 320px; }
  .item-head { grid-template-columns: 1fr; align-items: start; }
  .item-cover { max-width: 300px; }
  .item-body { grid-template-columns: 1fr; gap: 28px; }
  .item-hero-amb { height: 320px; }
  .now-inner { grid-template-columns: 1fr; gap: 26px; padding: 24px 28px 30px; align-content: start; }
  .now-big-cover { width: min(280px, 55vw); }
  .now-tracks { max-height: 38vh; }

  /* P2: collapse the two-/three-column surfaces. */
  .week-shelf { padding: 4px 16px 18px; margin: 0 -16px 8px; }
  .picks-row { grid-template-columns: 1fr; gap: 28px; }
  .set-shell { grid-template-columns: 1fr; gap: 0; }
  .set-nav { display: none; }
  .g-content { padding: 18px 16px 200px; }
  .g-grid { grid-template-columns: 1fr; gap: 22px; }
  .g-stage { order: -1; }
  .mp-row { grid-template-columns: 24px 40px 1fr auto 34px; }
  .mp-bar { display: none; }
}
@container app (max-width: 540px) {
  /* Explore list at phone width: idx · tape · loved · play (drop venue+length). */
  .row--explore, .rows-head--explore { grid-template-columns: 24px 1fr auto 34px; }
  .row--explore .row-venue, .row--explore .row-dur,
  .rows-head--explore span:nth-child(3), .rows-head--explore span:nth-child(5) { display: none; }
  .hero-title { font-size: 30px; }
  .now-title { font-size: 30px; }
  .item-body { gap: 22px; }
  .grid--4, .grid--3, .grid--2 { grid-template-columns: repeat(2, 1fr); gap: 14px; }
  .sec-title { font-size: 22px; }
  .view-title { font-size: 30px; }

  /* P2 at phone width. (.grid--2/--3/--4 already collapse to 2-up above.) */
  .artists-grid { grid-template-columns: 1fr; }
  .week-card { width: 150px; }
  .queue-rows .queue-row { grid-template-columns: 26px 40px 1fr auto 34px; }
  .picks-edition-rule { flex-wrap: wrap; gap: 6px; }
}

/* ── Share toast (copy / share confirmation) ─────────────────────────────────
   Transient, screen-reader-announced confirmation that the share/copy fired.
   Sits above the persistent player (z 40) AND the Now-Playing overlay (z 200). */
.mus-toast {
  position: fixed; left: 50%; bottom: calc(96px + env(safe-area-inset-bottom, 0px));
  z-index: 300; max-width: min(92vw, 440px);
  display: inline-flex; align-items: center; gap: 8px;
  padding: 11px 16px; border-radius: 12px; white-space: nowrap;
  background: var(--surface-2); color: var(--text);
  border: 1px solid var(--border-2); box-shadow: var(--shadow-lg);
  font-size: 13px; font-weight: 600; line-height: 1.3;
  opacity: 0; pointer-events: none;
  transform: translateX(-50%) translateY(10px);
  transition: opacity .2s var(--ease), transform .2s var(--ease);
}
.mus-toast svg { width: 16px; height: 16px; color: var(--accent); flex: none; }
.mus-toast[data-show="1"] { opacity: 1; transform: translateX(-50%) translateY(0); }
/* Clear the mobile mini-player + tab bar at phone width. */
@media (max-width: 860px) {
  .mus-toast { bottom: calc(140px + env(safe-area-inset-bottom, 0px)); }
}

/* ── Admin · Riker's Picks tagger (#/admin, views/admin.js) ──────────── */
.adm-h { font-size: 15px; font-weight: 650; margin: 0 0 12px; }
.adm-search {
  width: 100%; max-width: 540px; padding: 11px 16px; border-radius: 999px;
  border: 1px solid var(--border); background: var(--surface); color: var(--text);
  font-size: 13.5px; outline: none; margin-bottom: 14px;
  transition: border-color var(--t) var(--ease), box-shadow var(--t) var(--ease), background var(--t) var(--ease);
}
.adm-search::placeholder { color: var(--text-faint); }
.adm-search:focus { border-color: var(--accent); box-shadow: 0 0 0 4px var(--accent-soft); background: var(--surface-2); }
.adm-list { display: flex; flex-direction: column; }
.adm-list .empty { padding: 28px 12px; }
.adm-row { display: flex; align-items: center; gap: 14px; padding: 11px 0; border-bottom: 1px solid var(--border); }
.adm-row:last-child { border-bottom: 0; }
.adm-cover { width: 44px; height: 44px; flex: none; border-radius: 8px; overflow: hidden; position: relative; background: var(--surface-2); }
.adm-tx { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.adm-title { font-size: 14px; font-weight: 600; color: var(--text); text-decoration: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.adm-title:hover { color: var(--accent); }
.adm-sub { font-size: 12px; color: var(--text-dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.adm-chip {
  flex: none; font-size: 11.5px; padding: 4px 10px; border-radius: 999px;
  border: 1px solid var(--border-2); color: var(--text-dim); background: var(--surface-2);
  max-width: 340px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.adm-chip--pub { color: var(--accent); border-color: var(--accent); background: var(--accent-soft); }
.adm-act { flex: none; }
/* Disabled admin actions ("Tagged ✓", "Tagging…") must not read as clickable:
 * the shared .btn:hover lift still fires on :disabled elements, so kill
 * pointer response wholesale here (scoped — the global .btn is untouched). */
.adm-act:disabled { opacity: .55; cursor: default; pointer-events: none; transform: none; }
@media (max-width: 640px) {
  .adm-chip { display: none; }
}

/* ══ Featured Artist page (#/artists/<key>) — the v2 "liner-notes cut" ══
 * Port of docs/music-artist-page/handoff/Featured Artist Page v2.dc.html.
 * Layout-only classes (.ap-*), existing tokens throughout; --font-type =
 * Special Elite (self-hosted via the @font-face above for J-card covers). */

.ap { container-type: inline-size; container-name: ap; }
.ap-type { font-family: var(--font-type); }

/* Breadcrumb (in-page) */
.ap-crumb { display: flex; align-items: center; gap: 8px; margin-bottom: 20px; }
.ap-crumb b { color: var(--text); }
.ap-crumb-sep { opacity: .5; }
.ap-crumb-link { cursor: pointer; }
.ap-crumb-link:hover { color: var(--accent); }

/* Loading skeletons (§6 — reserve heights, no layout jump) */
.ap-skel { border-radius: var(--r); background: linear-gradient(100deg, var(--surface) 30%, var(--surface-2) 50%, var(--surface) 70%); background-size: 200% 100%; animation: shimmer 1.3s linear infinite; }
.ap-skel--hero { height: 380px; border-radius: var(--r-xl); }
.ap-skel--band { height: 190px; margin-top: 44px; }

/* ── Hero — editorial masthead ── */
.ap-hero { position: relative; border-radius: var(--r-xl); border: 1px solid var(--border); background: var(--surface); box-shadow: var(--shadow); overflow: hidden; }
.ap-hero-amb { position: absolute; inset: 0; pointer-events: none; background: radial-gradient(720px 340px at 10% 0%, var(--accent-soft), transparent 62%), radial-gradient(600px 320px at 95% 110%, rgba(127, 209, 166, .06), transparent 60%); }
.ap-hero-amb::after { content: ''; position: absolute; inset: 0; opacity: .35; mix-blend-mode: overlay; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E"); }
.ap-hero-grid { position: relative; display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(300px, 480px); grid-template-areas: 'head art' 'body art'; column-gap: 44px; padding: 44px 44px 38px; align-items: center; }
.ap-hero-head { grid-area: head; min-width: 0; align-self: end; }
.ap-hero-body { grid-area: body; min-width: 0; align-self: start; }
.ap-hero-art { grid-area: art; }
.ap-kickrow { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.ap-stamp { font-family: var(--font-type); font-size: 12.5px; letter-spacing: .08em; text-transform: uppercase; color: var(--accent); border: 1.5px solid var(--accent); padding: 3px 12px 2px; transform: rotate(-2deg); border-radius: 2px; display: inline-block; }
.ap-reel { font-size: 12px; color: var(--text-faint); letter-spacing: .04em; }
.ap-genre { font-family: var(--font-mono); font-size: 10px; font-weight: 600; letter-spacing: .1em; color: var(--accent); background: var(--accent-soft); border: 0; border-radius: 999px; padding: 4px 10px; cursor: pointer; }
.ap-genre:hover { filter: brightness(1.15); }
.ap-name { font-family: var(--font-display); font-size: clamp(40px, 7.4cqw, 96px); line-height: .96; letter-spacing: -.035em; font-weight: 800; margin: 22px 0 0; overflow-wrap: anywhere; }
.ap-est { font-size: 14px; color: var(--text-dim); margin-top: 16px; letter-spacing: .02em; }
.ap-tagline { font-size: 17px; color: var(--text-dim); line-height: 1.55; max-width: 560px; margin-top: 14px; text-wrap: pretty; }
.ap-actions { display: flex; align-items: center; gap: 10px; margin-top: 26px; flex-wrap: wrap; }
.ap-play-note { font-family: var(--font-mono); font-size: 10.5px; color: var(--text-faint); letter-spacing: .02em; margin-top: 12px; }

/* Portrait / procedural cover */
.ap-portrait-tilt { position: relative; transform: rotate(1.2deg); }
.ap-portrait { position: relative; aspect-ratio: 16/10; border-radius: 16px; overflow: hidden; box-shadow: 0 30px 80px rgba(0, 0, 0, .45), 0 0 50px var(--accent-soft); border: 1px solid var(--border-2); }
.ap-portrait-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; opacity: 0; transition: opacity .5s ease; }
.ap-portrait-rings { position: absolute; inset: 0; opacity: .18; mix-blend-mode: soft-light; background: repeating-radial-gradient(circle at 30% 28%, transparent 0 6px, rgba(255, 255, 255, .5) 6px 7px); }
.ap-portrait-mono { position: absolute; inset: 0; display: grid; place-items: center; font-family: var(--font-display); font-size: clamp(80px, 30cqw, 150px); font-weight: 800; color: rgba(255, 255, 255, .9); letter-spacing: -.04em; }
.ap-portrait-glyph { position: absolute; right: 14px; bottom: 12px; color: rgba(255, 255, 255, .75); }
.ap-credit { position: absolute; left: 0; right: 0; bottom: 0; z-index: 2; display: flex; justify-content: space-between; align-items: flex-end; gap: 10px; padding: 26px 14px 9px; background: linear-gradient(0deg, rgba(0, 0, 0, .62), transparent); font-family: var(--font-mono); font-size: 9.5px; letter-spacing: .02em; color: rgba(255, 255, 255, .85); white-space: nowrap; }
.ap-credit-tx { overflow: hidden; text-overflow: ellipsis; }
.ap-credit-src { color: rgba(255, 255, 255, .85); text-decoration: underline; text-underline-offset: 2px; }
.ap-stamp--print { position: absolute; right: 18px; top: -13px; font-size: 11px; letter-spacing: .06em; padding: 2px 9px 1px; transform: rotate(4deg); z-index: 3; }
.ap-stamp--red { color: #a23b2e; border-color: #a23b2e; background: rgba(233, 225, 205, .92); }
.ap-stamp--none { color: var(--text-faint); border-color: var(--border-2); background: var(--surface-2); }

/* Tape-counter stats band */
.ap-stats { position: relative; display: flex; align-items: stretch; border-top: 1px dashed var(--border-2); margin: 0 44px; padding: 16px 0 22px; }
.ap-stat { flex: 1; display: flex; flex-direction: column; gap: 3px; align-items: flex-start; border-left: 1px dashed var(--border); padding-left: 22px; min-width: 0; }
.ap-stat-v { font-family: var(--font-mono); font-size: 26px; font-weight: 600; letter-spacing: .06em; }
.ap-stat--ok { color: var(--ok); }
.ap-stat-k { font-size: 11px; letter-spacing: .08em; text-transform: uppercase; color: var(--text-faint); }

/* ── Section rules (Side A / Side B) ── */
.ap-rule { display: flex; align-items: center; gap: 14px; margin-top: 52px; }
.ap-rule-stamp { font-size: 13px; letter-spacing: .14em; text-transform: uppercase; color: var(--accent); }
.ap-rule-kick { font-family: var(--font-mono); font-size: 10px; letter-spacing: .12em; text-transform: uppercase; color: var(--text-faint); white-space: nowrap; }
.ap-rule-line { flex: 1; height: 1px; background: var(--border); }
.ap-seeall { font-size: 12.5px; color: var(--text-dim); font-weight: 600; background: none; border: 0; cursor: pointer; padding: 0; white-space: nowrap; }
.ap-seeall:hover { color: var(--accent); }

/* ── Side A — the story ── */
.ap-story { display: grid; grid-template-columns: 1fr 360px; gap: 56px; align-items: start; margin-top: 24px; }
.ap-sec-title { font-family: var(--font-display-2); font-size: 25px; letter-spacing: -.02em; font-weight: 600; line-height: 1.1; margin: 0; }
.ap-sec-sub { font-size: 13px; color: var(--text-dim); margin-top: 4px; }
.ap-bio { min-width: 0; }
.ap-bio-flow { display: flex; flex-direction: column; gap: 16px; font-size: 16px; line-height: 1.8; color: var(--text-dim); max-width: 620px; margin-top: 18px; text-wrap: pretty; }
.ap-bio-flow p { margin: 0; }
.ap-dropcap { float: left; font-family: var(--font-display); font-size: 58px; line-height: .8; font-weight: 800; color: var(--text); padding: 6px 10px 0 0; }
.ap-pullquote { font-family: var(--font-display); font-size: 27px; line-height: 1.3; letter-spacing: -.015em; font-weight: 650; color: var(--text); padding: 10px 0; max-width: 560px; }
.ap-pq-mark { color: var(--accent); }
.ap-readmore { display: none; align-items: center; gap: 6px; margin-top: 10px; font-size: 12.5px; font-weight: 600; color: var(--accent); background: none; border: 0; cursor: pointer; padding: 0; }
.ap-byline { font-size: 13px; color: var(--text-faint); margin-top: 20px; }
.ap-bio-src { font-family: var(--font-mono); font-size: 10px; color: var(--text-faint); margin-top: 8px; }
.ap-bio-src a { color: var(--text-dim); }
.ap-rail { display: flex; flex-direction: column; gap: 18px; min-width: 0; }
.ap-card { background: var(--surface); border: 1px solid var(--border); border-radius: 18px; padding: 18px 20px; }
.ap-card-kick { font-size: 11px; letter-spacing: .12em; text-transform: uppercase; color: var(--text-faint); margin-bottom: 10px; display: flex; align-items: center; gap: 8px; }
.ap-card-kick--accent { color: var(--accent); }
.ap-links-rows { display: flex; flex-direction: column; }
.ap-link-row { display: flex; align-items: center; gap: 10px; padding: 10px 2px; border-bottom: 1px solid var(--border); color: var(--text); text-decoration: none; font-size: 14px; font-weight: 600; }
.ap-link-row:hover { color: var(--accent); text-decoration: none; }
.ap-link-row svg { color: var(--text-faint); flex: none; }
.ap-link-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ap-link-domain { font-family: var(--font-mono); font-size: 10.5px; color: var(--text-faint); white-space: nowrap; }
.ap-outbound-note { font-family: var(--font-mono); font-size: 9.5px; color: var(--text-faint); margin-top: 10px; }
.ap-charity { border-color: var(--border-2); background: linear-gradient(135deg, var(--accent-soft), transparent 70%), var(--surface); }
.ap-charity-name { font-size: 16px; font-weight: 650; margin-top: 9px; }
.ap-charity-blurb { font-size: 13px; line-height: 1.6; color: var(--text-dim); margin-top: 6px; text-wrap: pretty; }
.ap-charity-visit { margin-top: 12px; font-size: 12.5px; text-decoration: none; }

/* ── Essential tapes — J-cards ── */
.ap-ess { margin-top: 52px; }
.ap-ess-head { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; margin-bottom: 20px; }
.ap-ess-by { font-size: 12px; letter-spacing: .06em; text-transform: uppercase; color: var(--text-faint); white-space: nowrap; }
.ap-ess-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 26px; }
.ap-jcard-wrap { display: flex; flex-direction: column; gap: 12px; cursor: pointer; min-width: 0; }
.ap-tilt-a { transform: rotate(-.7deg); }
.ap-tilt-b { transform: rotate(.5deg); }
.ap-tilt-c { transform: rotate(-.4deg); }
.ap-jcard { position: relative; aspect-ratio: 4/3; border-radius: 10px; overflow: hidden; box-shadow: var(--shadow); background: #e9e1cd; color: #2c2620; font-family: var(--font-type); display: flex; flex-direction: column; padding: 8% 8% 7% calc(8% + 9px); }
.ap-jcard-spine { position: absolute; left: 0; top: 0; bottom: 0; width: 9px; }
.ap-jcard-top { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 11px; letter-spacing: .06em; }
.ap-jcard-badge { border: 1.5px solid #a23b2e; color: #a23b2e; padding: 0 6px; transform: rotate(-3deg); letter-spacing: .04em; }
.ap-jcard-artist { font-size: 23px; line-height: 1.1; text-transform: uppercase; margin-top: 7%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ap-jcard-line { font-size: 13px; border-bottom: 1px solid rgba(0, 0, 0, .18); padding: 4% 0 1.5%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-height: 1.4em; }
.ap-jcard-foot { margin-top: auto; display: flex; justify-content: space-between; gap: 6px; font-size: 11px; color: #6b6155; white-space: nowrap; }
.ap-jcard-note { font-size: 13.5px; line-height: 1.6; color: var(--text-dim); padding: 0 4px; text-wrap: pretty; }
.ap-jcard-wrap:hover .ap-jcard { box-shadow: var(--shadow-lg); }

/* ── Side B — era histogram ── */
.ap-hist { margin-top: 24px; background: var(--surface); border: 1px solid var(--border); border-radius: 18px; padding: 26px 28px 20px; }
.ap-hist-bars { display: flex; align-items: flex-end; gap: 10px; height: 120px; }
.ap-hist-col { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 7px; height: 100%; justify-content: flex-end; cursor: pointer; background: none; border: 0; padding: 0; min-width: 0; }
.ap-hist-count { font-family: var(--font-mono); font-size: 10px; color: var(--text-faint); }
.ap-hist-bar { width: 100%; border-radius: 6px 6px 3px 3px; background: linear-gradient(180deg, var(--accent), var(--accent-2)); opacity: .75; }
.ap-hist-col:hover .ap-hist-bar { opacity: 1; }
.ap-hist-year { font-family: var(--font-mono); font-size: 10px; color: var(--text-dim); }
.ap-eras { display: flex; gap: 10px; margin-top: 16px; }
.ap-era { position: relative; border-top: 2px solid var(--border-2); padding-top: 8px; min-width: 0; }
.ap-era::before, .ap-era::after { content: ''; position: absolute; top: -2px; width: 2px; height: 7px; background: var(--border-2); }
.ap-era::before { left: 0; }
.ap-era::after { right: 0; }
.ap-era-label { display: block; font-size: 12px; color: var(--text-dim); text-align: center; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ap-era-gap { border-top: 2px solid transparent; }
.ap-eras-caption { display: none; font-size: 11px; color: var(--text-faint); margin-top: 10px; text-align: center; }

/* ── Catalog lists ── */
.ap-lists { display: grid; grid-template-columns: 1fr 1fr; gap: 44px; margin-top: 44px; align-items: start; }
.ap-lists--single { grid-template-columns: 1fr; }
.ap-list { min-width: 0; }
.ap-list-head { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; margin-bottom: 14px; }
.ap-sec-title--list { font-size: 20px; }
.ap-list-kick { font-size: 11px; letter-spacing: .06em; text-transform: uppercase; color: var(--text-faint); white-space: nowrap; }
.ap-rows { display: flex; flex-direction: column; gap: 2px; }
.ap-row { display: grid; grid-template-columns: 24px 44px 1fr auto; align-items: center; gap: 13px; padding: 9px 12px; border-radius: 12px; cursor: pointer; }
.ap-row--track { grid-template-columns: 24px 1fr minmax(70px, 110px) auto; }
.ap-row:hover { background: var(--surface-2); }
.ap-row-idx { font-family: var(--font-mono); font-size: 12px; color: var(--text-faint); text-align: center; }
.ap-row-thumb { position: relative; width: 44px; height: 44px; border-radius: 8px; overflow: hidden; box-shadow: var(--shadow); display: block; }
.ap-row-tx { min-width: 0; display: block; }
.ap-row-tx b { display: block; font-size: 13.5px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ap-row-sub { display: block; font-size: 11.5px; color: var(--text-dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-top: 1px; }
.ap-row-badge { font-family: var(--font-mono); font-size: 9.5px; font-weight: 600; letter-spacing: .08em; color: var(--warn); margin-left: 8px; }
.ap-row-badge--sbd { color: var(--ok); }
.ap-row-end { font-family: var(--font-mono); font-size: 11.5px; color: var(--text-dim); text-align: right; white-space: nowrap; }
.ap-row-play { display: grid; place-items: center; width: 34px; height: 34px; border-radius: 999px; border: 1px solid var(--border-2); background: none; color: var(--text-dim); cursor: pointer; }
.ap-row-play:hover { color: var(--accent); border-color: var(--accent); }
.ap-playbar { height: 6px; border-radius: 999px; background: var(--surface-3); overflow: hidden; display: block; }
.ap-playbar-fill { display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg, var(--accent), var(--accent-2)); }
.ap-tracks-note { font-size: 11.5px; color: var(--text-faint); margin-top: 12px; padding-left: 2px; }

/* ── The rooms (setlist style) ── */
.ap-rooms { display: flex; flex-direction: column; }
.ap-room { display: flex; align-items: baseline; gap: 12px; padding: 9px 2px; cursor: pointer; min-width: 0; }
.ap-room:hover .ap-room-name { color: var(--accent); }
.ap-room-idx { font-family: var(--font-mono); font-size: 11px; color: var(--text-faint); min-width: 20px; }
.ap-room-name { font-size: 14.5px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ap-room-place { font-size: 11.5px; color: var(--text-faint); white-space: nowrap; }
.ap-room-leader { flex: 1; border-bottom: 1px dotted var(--border-2); transform: translateY(-4px); min-width: 20px; }
.ap-room-count { font-family: var(--font-mono); font-size: 12px; color: var(--text-dim); white-space: nowrap; }

/* ── Responsive — keyed on the page's own content width (.ap container),
 * so the layout also adapts when a drawer squeezes the content area ── */
@container ap (max-width: 920px) {
  .ap-hero-grid { grid-template-columns: 1fr; grid-template-areas: 'head' 'art' 'body'; row-gap: 16px; padding: 30px 26px 26px; }
  .ap-hero-art { max-width: 560px; }
  .ap-story { grid-template-columns: 1fr; gap: 34px; }
  .ap-lists { grid-template-columns: 1fr; gap: 36px; }
  .ap-stats { margin: 0 26px; }
}
@container ap (max-width: 640px) {
  .ap-hero-grid { padding: 22px 16px 18px; }
  .ap-name { margin-top: 12px; }
  .ap-est { margin-top: 10px; font-size: 12px; }
  .ap-tagline { font-size: 14.5px; margin-top: 0; }
  .ap-stats { margin: 0 16px; padding: 12px 0; border-bottom: 1px dashed var(--border-2); }
  .ap-stat { padding-left: 12px; }
  .ap-stat-v { font-size: 17px; }
  .ap-stat-k { font-size: 9px; letter-spacing: .06em; }
  .ap-actions { flex-direction: column; align-items: stretch; margin-top: 16px; gap: 9px; }
  .ap-actions .btn { width: 100%; }
  .ap-play-note { text-align: center; }
  .ap-rule { margin-top: 36px; }
  .ap-ess { margin-top: 34px; }
  /* Essentials: horizontal snap rail bleeding to the gutter (§5) */
  .ap-ess-grid { display: flex; gap: 14px; overflow-x: auto; padding: 6px 16px 12px; margin: 0 -16px; scroll-snap-type: x mandatory; }
  .ap-ess-grid > .ap-jcard-wrap { flex: none; width: 250px; scroll-snap-align: start; }
  /* Bio truncates behind Read more (§5) */
  .ap-bio-flow > *:nth-child(n+3) { display: none; }
  .ap-bio-flow--open > *:nth-child(n+3) { display: block; }
  .ap-bio-flow--open ~ .ap-readmore { display: none; }
  .ap-readmore { display: inline-flex; }
  /* Histogram compacts: no counts above bars, caption replaces the era row */
  .ap-hist { padding: 16px 14px 12px; }
  .ap-hist-bars { height: 80px; gap: 5px; }
  .ap-hist-count { display: none; }
  .ap-hist-year { font-size: 8px; }
  .ap-eras { display: none; }
  .ap-eras-caption { display: block; }
  .ap-lists { margin-top: 30px; gap: 30px; }
  .ap-room-place { display: none; }
}
@container ap (max-width: 420px) {
  .ap-skel--hero { height: 500px; }
  .ap-portrait-tilt { transform: rotate(.8deg); }
  .ap-stamp--print { display: none; }
}

/* Artist-link touch-ups (item hero + explore rows) + A–Z featured stamp */
.artist-link { cursor: pointer; }
.artist-link:hover { color: var(--accent); text-decoration: underline; text-underline-offset: 4px; text-decoration-thickness: 1.5px; }
.artist-link--hero:hover { text-underline-offset: 6px; }
.artist-name-row { display: flex; align-items: center; gap: 8px; min-width: 0; }
.artist-featured { font-size: 9.5px; letter-spacing: .06em; padding: 1px 7px; border-width: 1px; flex: none; }

/* Admin · artist editorial */
.adm-json { width: 100%; margin-top: 10px; font-family: var(--font-mono); font-size: 12px; line-height: 1.5; color: var(--text); background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 12px 14px; resize: vertical; }
.adm-ed-row { display: flex; align-items: center; gap: 10px; margin-top: 10px; flex-wrap: wrap; }
.adm-ed-row .adm-search { flex: 1; min-width: 200px; }
.adm-ed-status { font-size: 12.5px; color: var(--text-dim); }
.adm-ed-entries { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 10px; }
