/* ============================================================
   404HZ app — one product, one colourway: GRAY.
   field #bdbdc3 + ink #2921cc (v33). the ramp is
           ink-alpha — white alphas fail AA on the gray field,
           measured: i2 .92 = 4.68:1, i3 .90 = 4.56:1 (v33:42–43).
   Shared tokens + Origin @font-face live in
           ../design-system/tokens.css (imported first, below).
   type  : Origin Display 900 wordmark · Origin Text for panels,
           rows, labels and controls.
   layout: landing = one giant mark + scan rail. tool = search
           bar across the top, section nav on the left,
           one panel per screen. a fixed
           player band runs the bottom of every screen.
   texture: the square lattice canvas behind the landing hero.
           Tool panel grounds are
           PLATES: one rect per region, cut from the lattice by
           a 1px hairline edge — the lattice never ends ragged.
   motion : landing logo hover-rotate / 500ms / settle ease,
           dead under reduced motion. scan rail width ease.
           nothing loops.
   forbid : gradients · glow/blur/shadow · cards/pills · extra
            hues · solid CTA · admin tables · marketing grid.
   ============================================================ */
@import url("../design-system/tokens.css");
@import url("../design-system/wordmark.css");

:root{
  /* the round-mark ink map (page SVG filter, GRAY) */
  --zero-map:url("#zero-map-gray");
}
*{box-sizing:border-box}
[hidden]{display:none!important}
html{-webkit-text-size-adjust:100%;scroll-padding-top:calc(var(--stick-total,0px) + 12px)}
body{
  margin:0;min-height:100svh;background:var(--field);color:var(--i1);
  font-family:var(--text);font-size:.95rem;line-height:1.5;
  display:flex;flex-direction:column;position:relative;
  caret-color:var(--ink);
  padding-top:env(safe-area-inset-top,0px);
  padding-bottom:calc(var(--player-h) + env(safe-area-inset-bottom,0px));
}
/* near-native taps: kill the 300ms delay + grey flash, keep gestures crisp */
html{-webkit-tap-highlight-color:transparent}
a,button,input,select,textarea{touch-action:manipulation}
::selection{background:var(--sel-bg);color:var(--sel-fg)}
#grid{position:fixed;inset:0;z-index:0;display:block;pointer-events:none}
html.tool-active #grid{display:none}
header,main,.player{position:relative;z-index:1}
header.top{z-index:6}
.player{position:fixed}
a{color:inherit}
:focus-visible{outline:2px solid var(--focus);outline-offset:2px}

/* Tool panels retain solid plate grounds; the landing hero stays open to the grid. */
.plate{background:var(--field);outline:1px solid var(--edge);outline-offset:0}

/* ---- slim mono top bar: wordmark · scan bar · entry + theme ---- */
.top{
  display:flex;align-items:center;justify-content:space-between;gap:clamp(10px,1.4vw,20px);
  padding:clamp(10px,1.6vh,16px) var(--pad);
  font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);text-transform:uppercase;
  letter-spacing:.2em;color:var(--i2);
}
.top-content{display:contents}
.right{display:inline-flex;align-items:center;gap:10px;flex:none}
.right .item{display:inline-flex;align-items:center;gap:10px;white-space:nowrap}
.right .sep{font-style:normal;color:var(--i3)}
.right .item.first .sep{display:none}
.right a{text-decoration-color:var(--line);text-underline-offset:4px}
.right a:hover{color:var(--ink)}
/* the scan bar lives IN the top bar: one primary input, reachable from
   every screen of the tool. the landing keeps its own big bar as hero. */
.top .searchrow{
  flex:1 1 auto;min-width:0;max-width:min(72vw,880px);margin:0 auto;padding:0;
  text-transform:none;letter-spacing:normal;background:transparent;outline:none;
}
.top .searchrow .err{margin-top:6px;text-transform:none;letter-spacing:.02em}
.top form.scan{width:100%}
.top form.scan input{padding:13px 16px}
.top form.scan button[type="submit"]{padding:13px 18px}

main{flex:1;display:flex;flex-direction:column;min-height:0}
.view{flex:1}

/* ---- landing ---- */
#view-home{
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:clamp(22px,4.6vh,52px);
  padding:clamp(20px,5vh,54px) var(--pad) clamp(24px,6vh,60px);text-align:center;
}
.stage{display:flex;align-items:center;justify-content:center;width:100%}
h1.mark{
  margin:0;
  font-size:clamp(3.5rem,14vw,11rem);line-height:.82;
  justify-content:center;
  color:var(--ink);user-select:none;-webkit-user-select:none;
  padding:.07em .14em;
}
/* the one landing touch: the round logo in the 0 tilts a little
   on hover and settles back. reduced motion keeps it perfectly still. */
.mark .brand-zero{
  transform:translateY(.01em);transform-origin:50% 50%;
  transition:transform .5s var(--ease);
  filter:var(--zero-map);
}
.mark:hover .brand-zero{transform:translateY(.01em) rotate(12deg)}

/* one plate for the whole copy column — tagline, scan bar */
.copy{display:flex;flex-direction:column;align-items:center;gap:clamp(12px,2.2vh,18px);
  width:min(100%,660px);padding:24px 22px}
.tagline{margin:0;font-family:var(--text);font-weight:500;line-height:1.4;letter-spacing:normal;

/* landing: one quiet text link out of the front door */
.stage-links{margin:0;text-align:center}
.stage-links a{font-family:var(--mono);font-size:clamp(11.5px,.85vw,12px);letter-spacing:.09em;
  text-transform:uppercase;color:var(--i2);text-decoration:underline;
  text-decoration-color:var(--line);text-underline-offset:5px;padding:10px 4px;
  display:inline-block;min-height:44px;line-height:24px}
.stage-links a:hover,.stage-links a:focus-visible{color:var(--ink);text-decoration-color:var(--ink)}
  font-size:clamp(1rem,1.85vw,1.28rem);color:var(--i1);text-wrap:balance}
form.scan{display:flex;width:100%;border-bottom:1px solid var(--line);border-radius:0}
form.scan input{flex:1;min-width:0;border:0;background:transparent;color:var(--ink);
  padding:17px 18px;font-family:var(--text);font-size:1rem;letter-spacing:normal}
form.scan input::placeholder{color:var(--i2)}
form.scan input:focus-visible{outline:2px solid var(--focus);outline-offset:-3px}
form.scan button[type="submit"]{border:0;border-left:1px solid var(--line);border-radius:0;background:transparent;
  color:var(--i1);padding:17px 24px;font-family:var(--text);font-weight:600;font-size:.78rem;
  text-transform:uppercase;letter-spacing:.16em;cursor:pointer;white-space:nowrap;
  transition:background-color .16s linear,color .16s linear}
form.scan button[type="submit"]:hover,form.scan button[type="submit"]:focus-visible{background:var(--ink);color:var(--field)}
form.scan button[type="submit"]:focus-visible{outline:2px solid var(--focus);outline-offset:-3px}
.err{margin:0;font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);letter-spacing:.02em;
  color:var(--ink);text-wrap:balance}
.err::before{content:"! ";font-weight:700}

/* ---- tool: nav on the left, one panel per screen ---- */
#tool{flex:1;display:flex;flex-direction:column;min-height:0}
.searchrow .err{margin-top:8px}

.tool-body{flex:1;display:flex;min-height:0;align-items:stretch;gap:clamp(14px,2vw,26px);
  padding-right:var(--pad)}
nav.tnav{
  width:calc(196px + var(--pad));flex:none;display:flex;flex-direction:column;gap:2px;
  padding:clamp(18px,3vh,30px) 0 0 calc(var(--pad) - 2px);
}
nav.tnav a{
  display:block;padding:10px var(--pad) 10px 14px;text-decoration:none;color:var(--i2);
  font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);text-transform:uppercase;
  letter-spacing:.18em;border-left:2px solid transparent;
  transition:color .16s linear,border-color .16s linear;
}
nav.tnav a:hover{color:var(--ink)}
nav.tnav a[aria-current="page"]{color:var(--ink);border-left-color:var(--ink)}

.tmain{flex:1;min-width:0;display:flex;flex-direction:column}
.panel{flex:1;display:flex;padding:0}
.wrap{width:100%;max-width:var(--max);margin:0 auto;display:flex;flex-direction:column;
  gap:clamp(12px,2.1vh,20px);padding:28px 24px;
  /* the panel is its own size container: row density reacts to the real
     content width (rail open, narrow shell), not to the viewport. */
  container-type:inline-size;container-name:panel}
.back{margin:0;font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);letter-spacing:.04em;color:var(--i3)}
.back a{text-decoration-color:var(--line);text-underline-offset:4px}
.back a:hover{color:var(--ink)}
h1.scr{
  margin:0;font-family:var(--text);font-weight:700;font-style:normal;
  font-size:clamp(1.5rem,3vw,2.1rem);line-height:1.02;letter-spacing:-.01em;
  color:var(--i1);max-width:24ch;
}
/* one-line empty states — never model-spec paragraphs */
.empty{margin:0;font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);letter-spacing:.03em;
  color:var(--i2);max-width:70ch}
/* live search field: quiet box under the screen title */
.srch{width:100%;max-width:420px}
.srch input{width:100%;border:1px solid var(--line);border-radius:0;background:transparent;
  color:var(--ink);padding:11px 14px;font-family:var(--mono);
  font-size:clamp(13px,.95vw,14px);letter-spacing:.03em}
.srch input::placeholder{color:var(--i2)}
.srch input:focus-visible{outline:2px solid var(--focus);outline-offset:-3px}
.facts{margin:0;display:flex;flex-wrap:wrap;gap:4px clamp(14px,2.4vw,26px);
  font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);letter-spacing:.04em;color:var(--i2)}
.facts b{font-weight:400;color:var(--i3)}
.facts a{overflow-wrap:anywhere;text-decoration-color:var(--line);text-underline-offset:4px}
.facts a:hover{color:var(--ink)}
.stage-line{margin:0;font-family:var(--mono);font-size:clamp(11.5px,.84vw,12.5px);
  text-transform:uppercase;letter-spacing:.18em;color:var(--i1)}
.rail{height:3px;background:var(--track)}
.rail span{display:block;height:100%;width:100%;background:var(--tick);
  transform:scaleX(0);transform-origin:0 50%;transition:transform .28s var(--ease)}
.tally{margin:0;font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);letter-spacing:.04em;
  color:var(--i2);font-variant-numeric:tabular-nums}
/* scanning loader — the round mark as a record on a turntable: flat,
   two-tone, an orbit tick counter-rotating. spins only while scanning,
   pauses on hover, dead under reduced motion. */
.scanner{display:flex;align-items:center;gap:clamp(16px,3vw,36px);
  margin:clamp(10px,2.4vh,26px) 0 clamp(6px,1.6vh,14px)}
.scanner-disc{position:relative;flex:none;display:grid;place-items:center;
  width:clamp(88px,12vw,126px);height:clamp(88px,12vw,126px)}
.scanner-logo{width:80%;height:80%;object-fit:contain;filter:var(--zero-map);transform-origin:50% 50%}
.scanner-orbit{position:absolute;inset:0;border:1px solid var(--line2);border-radius:50%}
.scanner-orbit::before{content:"";position:absolute;left:50%;top:-1px;width:1px;height:9px;
  background:var(--ink);transform:translateX(-50%)}
.scanner.live .scanner-logo{animation:scan-spin 2.4s linear infinite}
.scanner.live .scanner-orbit{animation:scan-spin 3.6s linear infinite reverse}
.scanner.live:hover .scanner-logo,.scanner.live:hover .scanner-orbit{animation-play-state:paused}
@keyframes scan-spin{to{transform:rotate(360deg)}}
.scanner-read{flex:1;min-width:0;display:flex;flex-direction:column;gap:8px}
.scanner-pct{margin:0;font-family:var(--display);font-weight:900;line-height:1;
  font-size:clamp(2rem,5vw,3.4rem);letter-spacing:-.03em;color:var(--ink);font-variant-numeric:tabular-nums}
@media(prefers-reduced-motion:reduce){.scanner.live .scanner-logo,.scanner.live .scanner-orbit{animation:none}}
.outcome{margin:0;font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);letter-spacing:.03em;
  color:var(--i2);max-width:70ch}

section.block{display:flex;flex-direction:column;gap:clamp(6px,1.2vh,12px);
  margin-top:clamp(6px,1.6vh,18px);border-top:1px solid var(--line2);padding-top:20px}
section.sub{display:flex;flex-direction:column;gap:clamp(6px,1.2vh,12px);
  margin-top:clamp(6px,1.6vh,18px)}
h2{margin:0;font-family:var(--text);font-weight:600;font-size:.72rem;
  text-transform:uppercase;letter-spacing:.2em;color:var(--i3)}

/* ---- sleeve: real artwork when the row is a record, flat
   catalogue placeholder when it is not. a sleeve with artwork is a
   BUTTON — tap it for the full-bleed artwork view. ---- */
.slv{
  width:var(--slv);height:var(--slv);flex:none;display:block;position:relative;
  background:var(--fill);border:0;border-radius:0;padding:0;margin:0;
  appearance:none;-webkit-appearance:none;cursor:pointer;color:inherit;
}
.slv img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.slv i{
  position:absolute;right:4px;bottom:3px;font-style:normal;
  font-family:var(--mono);font-size:9px;line-height:1;letter-spacing:.05em;
  color:var(--i2);white-space:nowrap;
}
.slv.has-art i{display:none}
/* session sleeves carry a longer cat number ("404-01"): keep it inside the square */
.slv.sset i{right:3px;bottom:2px;font-size:8px;letter-spacing:.02em;
  max-width:calc(100% - 6px);overflow:hidden}

/* ---- set index row: sleeve · name · source · when · count · state ---- */
ol.rows{list-style:none;margin:0;padding:0}
ol.rows li{border-bottom:1px solid var(--line2)}
ol.rows li:first-child{border-top:1px solid var(--line2)}
a.srow{
  display:grid;grid-template-columns:var(--slv) minmax(0,1.5fr) minmax(0,1.2fr) 7.8em 4.6em 6.4em;
  gap:6px clamp(12px,1.8vw,22px);align-items:center;
  padding:12px 0;text-decoration:none;color:inherit;
}
a.srow.sessionrow{grid-template-columns:var(--slv) minmax(0,1.5fr) minmax(0,1.2fr) 7.8em 4.6em}
a.srow:hover .sname,a.srow:focus-visible .sname{color:var(--ink)}
.sname{font-family:var(--text);font-weight:600;font-size:clamp(14px,1.25vw,16px);color:var(--i1);
  overflow-wrap:anywhere}
.ssrc{font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);color:var(--i2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.swhen,.sdur,.scount,.sstate{font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);
  letter-spacing:.06em;color:var(--i3);white-space:nowrap;font-variant-numeric:tabular-nums;
  text-align:right}
.scount{color:var(--i2)}
/* playlist row: sleeve · name · date · track count */
a.srow.plrow{grid-template-columns:var(--slv) minmax(0,1.5fr) 7.8em 5.6em}

/* ---- track row: stamp · sleeve · artist/title/cat · buy · flag/play ---- */
ol.tracks{list-style:none;margin:0;padding:0}
ol.tracks li{
  display:grid;grid-template-columns:auto var(--slv) minmax(0,1fr) auto auto;
  gap:2px clamp(8px,1.2vw,20px);align-items:center;
  padding:11px 0;border-bottom:1px solid var(--line2);transition:background-color .16s linear;
  cursor:default;
}
ol.tracks li:first-child{border-top:1px solid var(--line2)}
ol.tracks li.sel{background:var(--row-sel)}
button.t{background:none;border:0;padding:0;margin:0;text-align:left;cursor:pointer;
  font-family:var(--mono);font-size:clamp(11.5px,.82vw,12.5px);letter-spacing:.06em;
  color:var(--i2);font-variant-numeric:tabular-nums;transition:color .16s linear}
button.t:hover,button.t:focus-visible,li.sel button.t{color:var(--ink)}
.who{display:flex;flex-wrap:wrap;align-items:baseline;gap:1px 10px;min-width:0}
.ar{font-family:var(--text);font-weight:400;font-size:.95rem;color:var(--i2)}
.ar a{text-decoration-color:var(--line);text-underline-offset:3px}
.ar a:hover{color:var(--ink)}
.ti{font-family:var(--text);font-weight:500;font-size:1rem;
  letter-spacing:-.005em;color:var(--i1)}
li.open .ti,li.open .ar{font-weight:500;color:var(--i3)}
/* title-as-button (row expand) keeps the .ti type */
button.ti{background:none;border:0;border-radius:0;padding:0;margin:0;text-align:left;
  cursor:pointer}
button.ti:hover,button.ti:focus-visible{color:var(--ink)}
/* quiet text-link action (re-scan, stop scan): never a peer of the primary */
button.tlink{background:none;border:0;border-radius:0;padding:0;margin:0;cursor:pointer;
  font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);letter-spacing:.06em;
  text-transform:uppercase;color:var(--i3);text-decoration:underline;
  text-decoration-color:var(--line);text-underline-offset:4px;
  transition:color .16s linear}
button.tlink:hover,button.tlink:focus-visible{color:var(--ink)}
.cat{flex-basis:100%;font-family:var(--mono);font-size:clamp(11px,.78vw,11.5px);letter-spacing:.08em;
  color:var(--i3);white-space:nowrap;font-variant-numeric:tabular-nums}
.sel-detail{margin:0;font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);
  letter-spacing:.03em;color:var(--i2);max-width:80ch;display:flex;flex-wrap:wrap;
  align-items:center;gap:8px 12px}
.sel-detail a{text-decoration-color:var(--line);text-underline-offset:4px}
.sel-detail a:hover{color:var(--ink)}

/* Inline store searches. */
.buy{display:flex;align-items:center;gap:4px;flex-wrap:wrap;justify-content:flex-end}
.store-link{width:44px;height:44px;display:inline-flex;align-items:center;justify-content:center;color:var(--ink);text-decoration:none}
.store-link svg{width:18px;height:18px;display:block}
.store-link:hover{background:var(--hot)}
.rowact{display:flex;align-items:center;gap:8px;position:relative}
button.list{background:transparent;border:1px solid var(--line2);border-radius:0;
  padding:7px 10px;cursor:pointer;
  font-family:var(--mono);font-size:11.5px;letter-spacing:.12em;text-transform:uppercase;
  color:var(--i1);white-space:nowrap;
  transition:background-color .16s linear,color .16s linear,border-color .16s linear}
button.list:hover,button.list:focus-visible{
  background:var(--soft);color:var(--ink);border-color:var(--line)}
button.list.on{color:var(--ink);border-color:var(--hot-strong)}

.history-wrap{max-width:none}
.history-filters{display:flex;flex-wrap:wrap;gap:8px;margin:12px 0}
.history-chip{min-height:36px;padding:8px 13px;border:1px solid var(--line);border-radius:999px;
  background:transparent;color:var(--ink);font:12px var(--mono);letter-spacing:.08em;cursor:pointer}
.history-chip.active{background:var(--ink);color:var(--field)}
.history-session-label{display:flex;align-items:center;gap:12px;margin:16px 0 24px;
  color:var(--i2);font:12px var(--mono);text-transform:uppercase;letter-spacing:.08em}
.history-session-label select{min-height:44px;max-width:100%;padding:8px 12px;border:1px solid var(--line);
  border-radius:0;background:var(--field);color:var(--ink);font:16px var(--text)}
.history-rows{list-style:none;margin:0;padding:0}
.history-row{display:flex;align-items:center;gap:16px;min-height:64px;padding:12px 0;
  border-top:1px solid var(--line);color:var(--ink);text-decoration:none}
.history-row .slv{width:40px;height:40px;min-width:40px;--slv:40px;overflow:hidden}
.history-copy{display:flex;flex-direction:column;gap:5px;min-width:0}
.history-copy strong{font:600 clamp(15px,1.3vw,19px) var(--text);overflow-wrap:anywhere}
.history-meta{font:11px var(--mono);letter-spacing:.08em;color:var(--i2);text-transform:uppercase}
.history-row:hover strong,.history-row:focus-visible strong{text-decoration:underline;text-underline-offset:3px}

/* ---- faceted filter (history) -------------------------------------------
   shadcn's faceted filter — trigger → searchable checkbox list with counts
   → clear — cut to Flat Signal: hairline trigger, square box, mono counts,
   solid field panel, no shadow, radius 0. ---------------------------------- */
.facet-bar{position:relative;display:flex;flex-wrap:wrap;gap:8px;margin:12px 0 20px}
.facet{position:relative}
.facet-btn{display:inline-flex;align-items:center;gap:8px;min-height:38px;padding:7px 12px;
  background:transparent;border:1px solid var(--line);border-radius:0;color:var(--i2);cursor:pointer;
  font:700 11px var(--mono);letter-spacing:.08em;text-transform:uppercase}
.facet-btn:hover,.facet-btn:focus-visible{border-color:var(--ink);color:var(--ink)}
.facet.on .facet-btn{border-color:var(--ink);color:var(--ink)}
.facet-btn .ico{width:14px;height:14px}
.facet-sep{width:1px;height:14px;background:var(--line);display:inline-block}
.facet:not(.on) .facet-sep,.facet:not(.on) .facet-marks{display:none}
.facet-marks{display:inline-flex;align-items:center;gap:6px}
.facet-badge{display:inline-grid;place-items:center;min-width:17px;height:17px;padding:0 4px;
  background:var(--ink);color:var(--field);font:700 10px var(--mono);line-height:1}
.facet-tag{font:600 11px var(--text);letter-spacing:.02em;text-transform:none;color:var(--ink)}
.facet-pop{position:absolute;z-index:40;top:calc(100% + 4px);left:0;width:min(260px,80vw);
  background:var(--field);border:1px solid var(--ink)}
.facet-field{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid var(--line2)}
.facet-field .ico{width:14px;height:14px;color:var(--i3);flex:none}
.facet-search{flex:1;min-width:0;background:transparent;border:0;color:var(--ink);font:400 14px var(--text);padding:0}
.facet-search::placeholder{color:var(--i3)}
.facet-search:focus{outline:0}
.facet-list{max-height:min(300px,50vh);overflow:auto;overscroll-behavior:contain}
.facet-opt{display:flex;align-items:center;gap:10px;width:100%;min-height:40px;padding:9px 12px;
  background:transparent;border:0;border-bottom:1px solid var(--line2);color:var(--i1);cursor:pointer;
  font:500 13.5px var(--text);text-align:left}
.facet-opt:last-child{border-bottom:0}
.facet-opt:hover,.facet-opt:focus-visible{background:var(--soft);color:var(--ink)}
.facet-box{display:grid;place-items:center;width:16px;height:16px;flex:none;border:1px solid var(--line);color:transparent}
.facet-box .ico{width:11px;height:11px}
.facet-opt.on .facet-box{background:var(--ink);border-color:var(--ink);color:var(--field)}
.facet-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.facet-count{font:700 11px var(--mono);color:var(--i3);font-variant-numeric:tabular-nums}
.facet-opt.on .facet-count{color:var(--i1)}
.facet-none{padding:14px 12px;font:11px var(--mono);letter-spacing:.08em;color:var(--i3);text-transform:uppercase}
.facet-clear{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;min-height:40px;
  background:transparent;border:0;border-top:1px solid var(--ink);color:var(--i2);cursor:pointer;
  font:700 11px var(--mono);letter-spacing:.08em;text-transform:uppercase}
.facet-clear .ico{width:13px;height:13px}
.facet-clear:hover,.facet-clear:focus-visible{background:var(--soft);color:var(--ink)}
@media(max-width:760px){
  .facet{position:static}
  .facet-pop{left:0;right:0;width:auto}
  .facet-btn{min-height:44px}
}

/* Playlist dropdown anchored to its row action. */
.picker{position:absolute;top:100%;right:0;z-index:20;width:min(280px,calc(100vw - 32px));max-height:320px;overflow-y:auto;background:var(--field);border:1px solid var(--ink);display:flex;flex-direction:column;padding:4px}
.pk-item{min-height:44px;width:100%;background:transparent;border:0;border-bottom:1px solid var(--line2);color:var(--ink);text-align:left;padding:10px;font:500 .95rem var(--text);cursor:pointer}
.pk-item:hover,.pk-item:focus-visible{background:var(--soft)}
.pk-new{display:flex;min-width:0}
.pk-name{flex:1;min-width:0;background:transparent;border:0;color:var(--ink);font:400 1rem var(--text);padding:10px}
.pk-add{min-height:44px;background:transparent;border:0;border-left:1px solid var(--line);color:var(--ink);font:600 .78rem var(--text);padding:10px;cursor:pointer}
/* ---- library row: sleeve · artist - title · meta · buy · flag/play ---- */
ol.tracks li.lib{
  grid-template-columns:var(--slv) minmax(0,1fr) auto auto;
}
.meta{flex-basis:100%;display:flex;align-items:baseline;gap:2px 14px}
.found{font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);letter-spacing:.06em;
  color:var(--i3);white-space:nowrap;font-variant-numeric:tabular-nums}
ol.tracks li.lib .cat{flex-basis:auto}

/* ---- artist index row (kept for filtered library headers) ---- */
.filterline{margin:0;font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);
  letter-spacing:.04em;color:var(--i2);display:flex;align-items:center;flex-wrap:wrap;gap:4px 16px}
.filterline b{font-weight:400;color:var(--ink)}
.filterline a{text-decoration-color:var(--line);text-underline-offset:4px}
.filterline a:hover{color:var(--ink)}

/* ---- actions confirm after the act, never before ---- */
.actions{display:flex;flex-wrap:wrap;align-items:center;gap:clamp(10px,1.6vw,18px);
  margin-top:clamp(4px,1vh,10px)}
button.act,a.act{display:inline-flex;align-items:center;gap:12px;background:transparent;
  border:1px solid var(--line);padding:14px 22px;text-decoration:none;cursor:pointer;
  font-family:var(--text);font-weight:600;font-size:.78rem;text-transform:uppercase;
  letter-spacing:.16em;color:var(--i1);transition:background-color .16s linear,color .16s linear}
button.act:hover,a.act:hover,button.act:focus-visible,a.act:focus-visible{
  background:var(--soft);color:var(--ink)}
button.act:disabled{opacity:.45;cursor:not-allowed}
button.act:disabled:hover{background:transparent;color:var(--i1)}
button.act.primary{color:var(--ink);border-color:var(--hot-strong)}
.confirm{margin:0;font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);letter-spacing:.04em;
  color:var(--i2)}
.fallback{margin:0;display:flex;flex-direction:column;gap:8px;flex-basis:100%}
textarea.copybox{width:100%;max-width:640px;min-height:120px;background:var(--soft);
  border:1px solid var(--line);color:var(--ink);padding:12px 14px;resize:vertical;
  font-family:var(--mono);font-size:12px;line-height:1.5}

/* ---- the player: a persistent band on every screen. it plays
   bundled demo loops and says so — never pretends to be the
   record. it must not cover content: body pads for --player-h. */
.player{
  left:0;right:0;bottom:0;
  height:calc(var(--player-h) + env(safe-area-inset-bottom,0px));
  padding-bottom:env(safe-area-inset-bottom,0px);
  display:flex;align-items:center;gap:clamp(10px,1.6vw,20px);
  padding-left:clamp(12px,2.4vw,28px);padding-right:clamp(12px,2.4vw,28px);
  z-index:7;
}
.pl-art{width:48px;height:48px;--slv:48px}
.np{min-width:0;flex:1;display:flex;flex-direction:column;gap:1px}
.np-title{margin:0;font-family:var(--text);font-weight:600;font-size:clamp(13.5px,1.1vw,15.5px);
  color:var(--i1);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.np-sub{margin:0;font-family:var(--mono);font-size:11px;letter-spacing:.04em;
  color:var(--i2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.np-sub .sub-s,.np-sub .sub-xs{display:none}
.tr{display:flex;align-items:center;gap:8px;flex:none}
.tr button{background:transparent;border:1px solid var(--line);border-radius:0;cursor:pointer;
  min-width:44px;padding:9px 12px;
  font-family:var(--mono);font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--i1);transition:background-color .16s linear,color .16s linear}
.tr button:hover:not(:disabled),.tr button:focus-visible{background:var(--hot);color:var(--ink)}
.tr button:disabled{opacity:.4;cursor:not-allowed}
/* waveform seek: canvas bars, played ink / unplayed dim.
   drag/click to seek; role=slider; static under reduced motion
   (repaint only on timeupdate/seek — no rAF loop ever). */
#pl-seek{flex:1.2;min-width:70px;max-width:280px;height:36px;display:block;
  cursor:pointer;touch-action:none;align-self:center}
#pl-seek:focus-visible{outline:2px solid var(--focus);outline-offset:2px}
.np-time{margin:0;flex:none;font-family:var(--mono);font-size:11.5px;color:var(--i2);
  font-variant-numeric:tabular-nums;white-space:nowrap}
#pl-audio{display:none}

.sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0}
.noscript{margin:0;padding:14px var(--pad);
  font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);color:var(--i2)}

/* ---- artwork lightbox: full-bleed. the sleeve big, the record's
   artist / title / cat no under it, and its three store links right
   there. esc, backdrop and the close control all dismiss it. ---- */
.lightbox{
  position:fixed;inset:0;z-index:30;background:var(--field);
  display:flex;align-items:center;justify-content:center;
  padding:clamp(14px,3vw,44px);overscroll-behavior:contain;overflow:auto;
}
.lb-frame{
  position:relative;width:auto;max-width:min(100%,840px);
  display:flex;flex-direction:column;align-items:center;
  gap:clamp(14px,2.4vh,26px);padding:clamp(18px,3vw,36px);
  text-align:center;
}
.lb-close{
  position:absolute;top:0;right:0;min-width:44px;min-height:44px;
  background:transparent;border:1px solid var(--line);border-radius:0;
  color:var(--i1);font-size:22px;line-height:1;cursor:pointer;
  transition:background-color .16s linear,color .16s linear}
.lb-close:hover,.lb-close:focus-visible{background:var(--hot);color:var(--ink)}
.lb-art{
  width:min(74vw,56vh,520px);height:min(74vw,56vh,520px);
  --slv:min(74vw,56vh,520px);
}
.lb-meta{display:flex;flex-direction:column;align-items:center;gap:8px;max-width:60ch}
.lb-who{margin:0;font-family:var(--text);font-weight:600;
  font-size:clamp(17px,2.3vw,26px);line-height:1.2;color:var(--ink);text-wrap:balance}
.lb-cat{margin:0;font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);
  letter-spacing:.12em;color:var(--i2);text-transform:uppercase}
.lb-buy .buy{justify-content:center}
.lb-buy:empty{display:none}

@media (max-width:860px){
  :root{--player-h:70px}
  ol.tracks li.lib{grid-template-columns:var(--slv) minmax(0,1fr) auto auto}
  .np-sub .sub-l{display:none}
  .np-sub .sub-s{display:inline}
  #pl-seek{max-width:140px;height:32px}
  .tr button{min-width:34px;padding:8px 9px}
  .np-title{font-size:14px}
}
@media (max-width:760px){
  /* sticky chrome: the whole top bar (wordmark row + scan bar) pins as
     one plate, then the tabs. heights exposed as --top-h by
     measureSticky(); the scan bar is inside the top bar now. */
  header.top{position:sticky;top:env(safe-area-inset-top,0px);z-index:6;
    flex-wrap:wrap;padding:10px var(--pad) 0;gap:0}
  header.top .right{order:2;margin-left:auto}
  .top .searchrow{order:3;flex:1 0 100%;max-width:none;margin:0;padding:8px 0 10px;
    border-top:1px solid var(--line2)}
  nav.tnav{position:sticky;top:calc(env(safe-area-inset-top,0px) + var(--top-h,48px) + var(--search-h,0px));z-index:4}
  .tool-body{flex-direction:column;gap:0;padding-right:0}
  nav.tnav{width:auto;flex-direction:row;padding:0;
    overflow-x:auto}
  nav.tnav a{padding:14px var(--pad);border-left:0;border-bottom:2px solid transparent;white-space:nowrap}
  nav.tnav a[aria-current="page"]{border-left-color:transparent;border-bottom-color:var(--ink)}
  .panel{padding:0}
  .wrap{max-width:none;padding:24px 16px}

  /* one panel transition, dead under reduced-motion (global kill) */
  .panel.enter{animation:panel-in .16s var(--ease) both}

  /* ≥44px hit boxes everywhere a thumb can land */
  .right .item{min-height:44px}
  .back a,.facts a,.ar a{display:inline-block;padding:14px 6px;margin:-14px -6px;min-width:44px}
  .filterline a{display:inline-flex;align-items:center;justify-content:center;
    min-width:44px;min-height:44px;padding:0 8px}
  button.t,button.ti{display:inline-flex;align-items:center;min-width:44px;min-height:44px}
  button.list,button.play,.pk-item,.pk-add,.lb-close,.history-chip,.facet-btn,.facet-opt,.facet-clear{
    min-height:44px;padding:12px 14px}
  button.slv{min-width:44px;min-height:44px}
  button.act{min-height:44px}
  button.tlink{min-height:44px;min-width:44px;display:inline-flex;align-items:center;
    padding:14px 10px}
  .tr button{min-width:44px;min-height:44px;padding:0 10px;display:inline-flex;
    align-items:center;justify-content:center}
  #pl-seek{height:44px;touch-action:none}
  .srch input{min-height:44px;padding:14px 16px}
  /* iOS focus zoom: text inputs at ≥16px */
  form.scan input,.srch input,.pk-name{font-size:16px}
  .searchrow form.scan input,.searchrow form.scan button[type="submit"]{padding:14px 16px}

  #panel-tracklist .wrap{padding-bottom:64px}
}
@keyframes panel-in{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
@media (max-width:700px){
  a.srow,a.srow.sessionrow{grid-template-columns:var(--slv) minmax(0,1fr) auto;row-gap:3px}
  .slv.sset{grid-column:1;grid-row:1/4}
  .sname{grid-column:2;grid-row:1}
  .ssrc{grid-column:2/-1;grid-row:2}
  .swhen{grid-column:2;grid-row:3;text-align:left}
  .scount{grid-column:3;grid-row:3;justify-self:end}
  /* every track-row child placed explicitly — auto-placement was
     floating the stamp into the name cell (audit #19) */
  ol.tracks li{
    grid-template-columns:auto var(--slv) minmax(0,1fr) auto;row-gap:5px}
  ol.tracks li button.t{grid-column:1;grid-row:1;justify-self:start}
  ol.tracks li .slv{grid-column:2;grid-row:1/3;align-self:start}
  ol.tracks li .who{grid-column:3;grid-row:1;min-width:0}
  ol.tracks li .rowact{grid-column:4;grid-row:1;justify-self:end;align-self:start}
  ol.tracks li .buy{grid-column:3/5;grid-row:2;justify-content:flex-start}
  ol.tracks li .rowdetail{grid-column:1/-1}
  ol.tracks li.lib{grid-template-columns:var(--slv) minmax(0,1fr) auto}
  ol.tracks li.lib .slv{grid-column:1;grid-row:1/3;align-self:start}
  ol.tracks li.lib .who{grid-column:2;grid-row:1}
  ol.tracks li.lib .rowact{grid-column:3;grid-row:1}
  ol.tracks li.lib .buy{grid-column:2/4;grid-row:2;justify-content:flex-start}
  .ti,.ar{overflow-wrap:anywhere}
  /* playlist row: sleeve spans both rows, name on top, date + count under */
  a.srow.plrow{grid-template-columns:var(--slv) minmax(0,1fr) auto}
  a.srow.plrow .slv{grid-column:1;grid-row:1/3}
  a.srow.plrow .sname{grid-column:2;grid-row:1}
  a.srow.plrow .swhen{grid-column:2;grid-row:2;text-align:left}
  a.srow.plrow .scount{grid-column:3;grid-row:1/3;justify-self:end;align-self:center}
}
@media (max-width:640px){
  :root{--player-h:104px;--slv:44px}
  .tagline{max-width:34ch}
  form.scan input{padding:15px 14px}
  form.scan button[type="submit"]{padding:15px 16px;letter-spacing:.1em}
  .player{display:grid;grid-template-columns:32px minmax(0,1fr) auto;
    grid-template-rows:44px 44px;gap:4px 8px;padding:8px max(8px,env(safe-area-inset-right,0px))
    env(safe-area-inset-bottom,0px) max(8px,env(safe-area-inset-left,0px))}
  .pl-art{grid-column:1;grid-row:1;width:32px;height:32px;align-self:center}
  .np{grid-column:2;grid-row:1}
  .tr{grid-column:3;grid-row:1}
  #pl-seek{grid-column:1/3;grid-row:2;width:100%;min-width:0;max-width:none;height:44px}
  .np-time{grid-column:3;grid-row:2;align-self:center;justify-self:end}
  .tr{gap:4px}
  .np-title{font-size:12px;letter-spacing:-.01em}
  .np-sub{font-size:11px}
  .np-sub .sub-s{display:none}
  .np-sub .sub-xs{display:inline}
  .np-time{font-size:11px}
}
@media (max-width:640px){
  .top .right{gap:2px;min-width:0}
  .top .right .item{gap:3px;letter-spacing:.04em}
}
@media (max-width:480px){
  /* stacked scan form: full-width field, 48px submit */
  form.scan{flex-direction:column}
  form.scan input{padding:15px 14px;min-height:48px}
  form.scan button[type="submit"]{border-left:0;border-top:1px solid var(--line);
    min-height:48px;padding:15px 16px}
  /* the top-bar scan bar stays one row — the wordmark row is above it */
  .top form.scan{flex-direction:row}
  .top form.scan input{min-height:48px;padding:14px 10px}
  .top form.scan button[type="submit"]{border-top:0;border-left:1px solid var(--line);
    min-width:116px;padding:14px 8px;letter-spacing:.04em}

  /* phone rows: artwork + title first, both actions calmly aligned below. */
  ol.tracks li,ol.tracks li.lib{
    grid-template-columns:44px minmax(0,1fr);gap:8px 12px;padding:14px 0}
  ol.tracks li .slv,ol.tracks li.lib .slv{grid-column:1;grid-row:1;align-self:start}
  ol.tracks li .who,ol.tracks li.lib .who{grid-column:2;grid-row:1;align-self:center}
  ol.tracks li button.t{grid-column:1;grid-row:2;justify-self:start}
  ol.tracks li .buy,ol.tracks li.lib .buy{
    grid-column:2;grid-row:2;justify-self:start;justify-content:flex-start}
  ol.tracks li .rowact,ol.tracks li.lib .rowact{
    grid-column:2;grid-row:3;justify-self:start;align-self:center}
  .pk-name{min-width:0}

  /* A full phone-width frame keeps the sleeve large and the close clear. */
  .lightbox{align-items:flex-start;padding:max(12px,env(safe-area-inset-top,0px))
    max(12px,env(safe-area-inset-right,0px))
    max(12px,env(safe-area-inset-bottom,0px))
    max(12px,env(safe-area-inset-left,0px))}
  .lb-frame{width:100%;max-width:420px;margin:0 auto;padding:56px 16px 18px;gap:14px}
  .lb-close{top:6px;right:6px}
  .lb-art{width:min(calc(100vw - 56px),calc(100svh - 310px));
    height:min(calc(100vw - 56px),calc(100svh - 310px));
    --slv:min(calc(100vw - 56px),calc(100svh - 310px))}
  .lb-buy .buy{gap:8px;justify-content:center}

  #panel-tracklist .wrap{padding-bottom:24px}
}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation:none!important;transition:none!important}
  .mark .brand-zero,.mark:hover .brand-zero{transform:translateY(.01em)}
}

html:not(.tool-active) header.top{display:contents}
html:not(.tool-active) .top-content{display:contents}
html:not(.tool-active) header.top .top-brand,html:not(.tool-active) header.top .searchrow,html:not(.tool-active) header.top .right>*{display:none!important}
html.tool-active header.top{background:var(--field);outline:1px solid var(--edge)}
#view-home .mark,#view-home .copy{background:transparent;outline:0}
#view-home .copy{padding:0}
#view-home form.scan{border:0;border-bottom:1px solid var(--ink)}
nav.tnav .nav-home{font-family:var(--display);font-weight:900;font-size:1.1rem;letter-spacing:-.02em;text-transform:none;color:var(--ink);margin-bottom:16px;border:0}
@media(max-width:760px){nav.tnav .nav-home{margin-bottom:0;flex:none}}

/* Product finish: one measured column and a clear control hierarchy. */
:root{--max:920px;--player-h:88px;--rail:clamp(300px,23vw,340px)}
html{scrollbar-color:var(--line) var(--field)}
.top-brand{display:none;font:900 1.65rem/.9 var(--display);letter-spacing:-.035em;text-decoration:none;color:var(--ink);white-space:nowrap;align-items:center;gap:0}
.top-brand .zero{display:block;width:auto;height:.74em;margin:0 .01em;filter:var(--zero-map);transition:transform .24s var(--ease)}
.top-brand:hover .zero,.top-brand:focus-visible .zero{transform:rotate(12deg)}
html.tool-active .top-brand{display:inline-flex}
html:not(.tool-active) .top-brand{display:none}
html.tool-active .top{border-bottom:1px solid var(--line2);outline:0}
html.tool-active .top .searchrow{margin:0 auto;max-width:680px}
nav.tnav .nav-home{display:none}
.tool-body{display:grid;grid-template-columns:220px minmax(0,1fr);gap:0;padding-right:0}
nav.tnav{width:220px;border-right:1px solid var(--line2);padding:28px 12px 28px var(--pad);gap:4px}
nav.tnav a{padding:12px 14px;letter-spacing:.09em;font-weight:600}
nav.tnav a[aria-current="page"]{background:var(--soft)}
.tmain{width:100%;min-width:0}
.wrap,.history-wrap{width:min(100%,calc(var(--max) + 2 * var(--pad)));max-width:none;margin-inline:auto;padding:36px var(--pad) 64px;outline:0}
.page-heading{display:flex;align-items:end;justify-content:space-between;gap:16px;flex-wrap:wrap}
.page-heading h1{margin:0}
.quick-session-form{display:flex;align-items:end;gap:10px;flex-wrap:wrap;padding:16px;border:1px solid var(--line);width:100%}
.quick-session-form label{width:100%;font:11px var(--mono);letter-spacing:.12em}
.quick-session-form input{flex:1;min-width:180px;min-height:46px;background:transparent;border:1px solid var(--line);color:var(--ink);font:400 16px var(--text);padding:10px 12px}
.quick-session-form .act{min-height:46px}
#view-home{gap:clamp(22px,3.2vh,36px)}
h1.mark{font-size:clamp(4rem,24vw,23rem);padding:.05em 0;max-width:100%}
#view-home .copy{width:min(100%,760px);gap:clamp(16px,2.4vh,24px)}
form.scan,#view-home form.scan{border:2px solid var(--ink)}
#view-home form.scan{background:var(--field)}
form.scan button[type="submit"]{background:var(--ink);color:var(--field);border-left:1px solid var(--ink);font-weight:700}
form.scan button[type="submit"]:hover,form.scan button[type="submit"]:focus-visible{background:transparent;color:var(--ink)}
.top form.scan{border-width:1px}
.top form.scan button[type="submit"]{border-left:1px solid var(--ink)}
.srch{max-width:none}
.srch input{border-color:var(--line)}
.store-link{border:1px solid var(--line2);width:36px;height:36px;transition:background-color .16s linear,border-color .16s linear}
.store-link:hover,.store-link:focus-visible{border-color:var(--ink)}
.store-link svg{width:19px;height:19px}
.buy{gap:6px}
button.list{min-height:36px;letter-spacing:.045em;font-weight:600;padding:7px 10px}
button.list.on{background:var(--soft)}
button.act.primary{background:var(--ink);color:var(--field);border-color:var(--ink)}
button.act.primary:hover,button.act.primary:focus-visible{background:transparent;color:var(--ink)}
.player{border-top:1px solid var(--ink);outline:0;background:var(--field);gap:20px}
.pl-art{width:52px;height:52px;--slv:52px;flex:none;border:1px solid var(--line)}
.np{flex:0 1 290px}
.np-title{font-size:14px;color:var(--ink)}
.tr{gap:6px}
.tr button{width:42px;height:42px;min-width:42px;display:inline-flex;align-items:center;justify-content:center;padding:0;border:1px solid var(--line);color:var(--ink)}
.tr button svg{width:18px;height:18px;fill:currentColor}
.tr #pl-play{width:48px;height:48px;min-width:48px;background:var(--ink);color:var(--field);border-color:var(--ink)}
.tr #pl-play:hover:not(:disabled),.tr #pl-play:focus-visible{background:transparent;color:var(--ink)}
.tr button:disabled{opacity:.4}
#pl-seek{max-width:none;min-width:100px;flex:1}
.np-time{min-width:78px;text-align:right}
@media(max-width:900px){.tool-body{grid-template-columns:172px minmax(0,1fr)}html.tool-active header.top{grid-template-columns:172px minmax(0,1fr)}nav.tnav{width:172px;padding-left:12px}.top-brand{font-size:1.35rem}}
@media(max-width:760px){:root{--player-h:108px}.tool-body{display:flex;flex-direction:column}nav.tnav{width:100%;padding:0 var(--pad);border-right:0;border-bottom:1px solid var(--line2)}nav.tnav a{padding:13px 12px}.wrap,.history-wrap{width:100%;padding:26px var(--pad) 52px}header.top{padding:9px var(--pad) 0}.top .searchrow{margin:0;max-width:none}.player{gap:8px}}
@media(max-width:640px){:root{--player-h:112px}.player{grid-template-columns:40px minmax(0,1fr) auto;grid-template-rows:48px 40px;gap:4px 10px;padding:8px 12px env(safe-area-inset-bottom,0px)}.pl-art{width:40px;height:40px}.np{min-width:0}.tr button{width:38px;height:38px;min-width:38px}.tr #pl-play{width:44px;height:44px;min-width:44px}.np-time{min-width:78px}#pl-seek{height:40px}.top-brand{font-size:1.3rem}}
@media(max-width:480px){h1.mark{font-size:18.2vw}.top-brand{font-size:1.2rem}#view-home .copy{padding:0}.tagline{font-size:1.08rem}.store-link{width:44px;height:44px}form.scan button[type="submit"]{background:var(--ink);color:var(--field);border-top:1px solid var(--ink)}.top form.scan button[type="submit"]{border-top:0}}

/* Icon system and set feature */
.ico{display:inline-block;width:18px;height:18px;flex:none;background:currentColor;-webkit-mask:var(--icon) center/contain no-repeat;mask:var(--icon) center/contain no-repeat}
nav.tnav a{display:flex;align-items:center;gap:12px}
nav.tnav .ico{width:17px;height:17px}
nav.tnav .nav-lens{display:none}
.rowact button{display:inline-flex;align-items:center;gap:7px}
.rowact .ico{width:15px;height:15px}
.store-link .ico{width:20px;height:20px}
.tr button .ico{width:20px;height:20px}
.profile-wrap{position:relative;flex:none}
.profile-trigger{width:42px;height:42px;display:grid;place-items:center;padding:0;background:transparent;border:1px solid var(--line);color:var(--ink);cursor:pointer}
.profile-trigger:hover,.profile-trigger[aria-expanded="true"]{background:var(--ink);color:var(--field)}
.profile-menu{position:absolute;top:calc(100% + 10px);right:0;width:268px;padding:8px;background:var(--field);border:1px solid var(--ink);z-index:30;box-shadow:none;text-transform:none;letter-spacing:normal}
.profile-head{display:flex;align-items:center;gap:12px;padding:12px;border-bottom:1px solid var(--line);font-family:var(--text)}
.profile-head strong,.profile-head small{display:block}.profile-head strong{font-size:15px;color:var(--ink)}.profile-head small{font-size:12px;color:var(--i2)}
.profile-avatar{width:40px;height:40px;display:grid;place-items:center;border:1px solid var(--ink);color:var(--ink)}
.profile-link{width:100%;min-height:44px;display:flex;align-items:center;gap:12px;padding:10px 12px;background:transparent;border:0;color:var(--ink);font:600 14px var(--text);text-decoration:none;cursor:pointer;text-align:left}
.profile-link:hover{background:var(--soft)}.profile-link .ico{width:17px;height:17px}
.profile-menu p{margin:4px 12px 10px;padding-top:10px;border-top:1px solid var(--line);font:11px/1.5 var(--mono);color:var(--i2)}
.set-hero{display:grid;grid-template-columns:clamp(150px,19vw,232px) minmax(0,1fr);gap:clamp(22px,3vw,42px);padding:clamp(20px,2.5vw,32px);border:1px solid var(--line);min-height:280px;align-items:stretch;background:var(--soft);overflow:hidden}
.set-cover{aspect-ratio:1;min-height:0;align-self:center;border:1px solid var(--line);overflow:hidden;background:var(--fill)}
.set-cover img{display:block;width:100%;height:100%;object-fit:cover}
.set-hero-main{display:flex;flex-direction:column;min-width:0;justify-content:space-between;gap:12px}
.set-hero-top{display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin:0 0 10px;font:11px var(--mono);letter-spacing:.13em;color:var(--i2);text-transform:uppercase}
.set-hero-top:empty,.set-hero-top[hidden]{display:none}
.set-hero-duration{font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--i3)}
#set-meta{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.set-meta-src{white-space:nowrap}
.set-hero h1.scr{margin:0;font-size:clamp(2rem,4vw,3.8rem);line-height:1.02;letter-spacing:-.035em;max-width:18ch;text-wrap:balance}
.set-source{margin:0;color:var(--i2);font:13px var(--mono);overflow-wrap:anywhere}
.set-wave{height:70px;position:relative;display:flex;align-items:center;min-width:0}
.wave-bars{height:100%;width:100%;display:flex;align-items:center;gap:2px;overflow:hidden}
.wave-bars span{flex:1;min-width:1px;background:var(--i2);opacity:.65;transition:opacity .18s ease}
.set-wave:hover .wave-bars span{opacity:.85}
.wave-marker{position:absolute;top:50%;width:12px;height:12px;transform:translate(-50%,-50%);border:2px solid var(--field);border-radius:50%;background:var(--ink);cursor:pointer;z-index:1;padding:0;transition:transform .18s var(--ease)}
.wave-marker:hover,.wave-marker:focus-visible{transform:translate(-50%,-50%) scale(1.45)}
.set-wave-foot{display:flex;justify-content:space-between;font:11px var(--mono);letter-spacing:.08em;color:var(--i2)}
#panel-tracklist .facts{padding-bottom:16px;border-bottom:1px solid var(--line2)}
#panel-tracklist .actions{margin-top:0}
@keyframes signal-pulse{50%{opacity:.35;transform:scale(.7)}}
@media(max-width:760px){.set-hero{grid-template-columns:120px minmax(0,1fr);gap:18px;min-height:0}.set-hero h1.scr{font-size:clamp(1.75rem,5vw,2.7rem)}.profile-trigger{width:36px;height:36px}}
@media(max-width:520px){.set-hero{grid-template-columns:82px minmax(0,1fr);padding:16px;gap:10px}.set-cover{align-self:start}.set-hero-main{gap:6px}.set-hero h1.scr{font-size:clamp(1.5rem,7vw,2rem)}.set-wave{grid-column:1/-1;height:44px}.wave-bars{gap:1px}.set-hero-top{font-size:9px;letter-spacing:.04em}.set-source{font-size:11px}.set-hero-duration{white-space:nowrap}.set-wave-foot{font-size:10px}.profile-menu{right:-42px;width:min(268px,calc(100vw - 24px))}}
@media(prefers-reduced-motion:reduce){.wave-bars span,.wave-marker{transition:none}}

.icon-sprite{position:absolute;width:0;height:0;overflow:hidden;pointer-events:none}
svg.ico{display:inline-block;width:18px;height:18px;flex:none;background:none;-webkit-mask:none;mask:none;overflow:visible}

/* Set rows are compact covers with a deliberate reading order. */
ol.rows li{border:0;margin-bottom:10px}
ol.rows li:first-child{border-top:0}
a.srow.setrow{grid-template-columns:68px minmax(0,1.5fr) minmax(0,1fr) 7em 7em 7em;gap:8px 18px;min-height:92px;border:1px solid var(--line2);padding:12px 16px;transition:background-color .18s ease,border-color .18s ease}
a.srow.setrow:hover,a.srow.setrow:focus-visible{background:var(--soft);border-color:var(--ink)}
a.srow.setrow .slv{width:68px;height:68px;--slv:68px}
a.srow.setrow .sname{font-size:17px;color:var(--ink);letter-spacing:-.02em}
a.srow.setrow .sstate{padding:6px 8px;border:1px solid var(--line);text-align:center;text-transform:uppercase}
.actions .ico{width:16px;height:16px}
@media(max-width:900px){a.srow.setrow{grid-template-columns:58px minmax(0,1fr) auto;gap:4px 14px}a.srow.setrow .slv{width:58px;height:58px;--slv:58px;grid-row:1/4;grid-column:1}a.srow.setrow .sname{grid-column:2;grid-row:1}a.srow.setrow .ssrc{grid-column:2/-1;grid-row:2}a.srow.setrow .swhen{grid-column:2;grid-row:3;text-align:left}a.srow.setrow .scount{grid-column:3;grid-row:3}a.srow.setrow .sstate{grid-column:3;grid-row:1;text-align:center}}
@media(max-width:480px){a.srow.setrow{grid-template-columns:54px minmax(0,1fr) auto;padding:10px;gap:3px 10px}a.srow.setrow .slv{width:54px;height:54px;--slv:54px}a.srow.setrow .sname{font-size:15px}a.srow.setrow .sstate{font-size:9px;padding:4px}}

a.srow.sessionrow,a.srow.plrow{border:1px solid var(--line2);padding:12px 16px;min-height:80px;transition:background-color .18s ease,border-color .18s ease}
a.srow.sessionrow:hover,a.srow.plrow:hover,a.srow.sessionrow:focus-visible,a.srow.plrow:focus-visible{background:var(--soft);border-color:var(--ink)}
@media(max-width:480px){a.srow.sessionrow,a.srow.plrow{padding:10px;min-height:72px}}

/* A session is a dated workspace. Keep its index visibly distinct from set sleeves. */
#ses-block{padding-top:0}
#ses-rows{border-top:0}
#ses-rows li{margin:0;border:0;border-bottom:1px solid var(--line2)}
#ses-rows a.srow.sessionrow{display:grid;grid-template-columns:72px minmax(0,1fr) auto 28px;gap:clamp(12px,2vw,24px);align-items:center;min-height:110px;padding:14px 8px 14px 0;border:0;background:transparent}
#ses-rows a.srow.sessionrow:hover,#ses-rows a.srow.sessionrow:focus-visible{background:var(--soft)}
.session-stamp{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;width:72px;height:72px;padding:8px 10px;border:1px solid var(--line);font-variant-numeric:tabular-nums}
.session-month{font:700 10px/1 var(--mono);text-transform:uppercase;letter-spacing:.12em;color:var(--i2)}
.session-day{font:700 34px/1 var(--text);letter-spacing:-.04em;color:var(--ink)}
.session-body{display:flex;flex-direction:column;min-width:0;gap:5px}
#ses-rows .sname{display:block;min-width:0;color:var(--ink);font:700 clamp(18px,2vw,24px)/1.1 var(--text);letter-spacing:-.025em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.session-note{font:11px/1.4 var(--mono);color:var(--i2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.session-meta{display:grid;grid-template-columns:auto auto;column-gap:6px;align-items:baseline;justify-items:start;min-width:85px}
.session-count{font:900 30px/1 var(--display);font-variant-numeric:tabular-nums;color:var(--ink)}
.session-unit{font:700 10px var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--i2)}
.session-current{grid-column:1/-1;margin-top:7px;padding:3px 5px;border:1px solid var(--line);font:700 9px/1 var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--ink)}
.session-arrow{justify-self:end;font:24px/1 var(--text);color:var(--i2);transition:transform .16s ease,color .16s ease}
#ses-rows a.srow.sessionrow:hover .session-arrow,#ses-rows a.srow.sessionrow:focus-visible .session-arrow{transform:translate(2px,-2px);color:var(--ink)}
@media(max-width:520px){#ses-rows a.srow.sessionrow{grid-template-columns:56px minmax(0,1fr) 40px 16px;gap:9px;min-height:88px;padding:10px 0}.session-stamp{width:56px;height:56px;padding:6px 7px}.session-month{font-size:9px}.session-day{font-size:27px}#ses-rows .sname{font-size:17px}.session-note{font-size:10px}.session-meta{min-width:0;grid-template-columns:1fr;gap:0}.session-count{font-size:23px}.session-unit{font-size:9px}.session-current{font-size:8px;letter-spacing:0;padding:2px 3px;margin-top:3px}.session-arrow{font-size:19px}}

/* Final legibility pass. */
.profile-menu p{font-size:12px}
@media(max-width:520px){.set-hero-top{font-size:11px;gap:8px}.set-hero-top .set-meta-src{display:none}.set-wave-foot{font-size:11px}.set-source{font-size:12px}}

/* Home has nothing to play yet; use its full viewport for the scan. */
html:not(.player-active) body{padding-bottom:0}
html:not(.player-active) .player{display:none}
.skip-link{position:fixed;z-index:60;top:8px;left:8px;padding:10px 14px;background:var(--ink);color:var(--field);font:700 14px var(--text);transform:translateY(-150%)}
.skip-link:focus-visible{transform:none;outline:2px solid var(--field);outline-offset:2px}

.empty-panel{border:1px solid var(--line);padding:clamp(24px,4vw,42px);max-width:580px;min-height:230px;display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:14px}
.empty-panel h2{font:700 clamp(22px,2.5vw,30px)/1.1 var(--display);text-transform:none;letter-spacing:-.025em;color:var(--ink)}
.empty-panel .empty{margin:0;color:var(--i2);font:400 15px/1.5 var(--text);letter-spacing:normal}
.empty-panel .act{margin-top:8px}
@media(max-width:520px){.empty-panel{min-height:210px;padding:24px}}

.empty{font-size:14px;line-height:1.5}

/* Text scale: labels remain compact without becoming hairline text. */
h2{font-size:13px}
.top,.back,.facts,.stage-line,.tally,.filterline,.swhen,.sdur,.scount,.sstate,button.t,button.tlink,.cat{font-size:max(12px, .85vw)}
.set-hero-top,.set-wave-foot{font-size:12px}
@media(max-width:520px){.set-hero-top,.set-wave-foot{font-size:11px}}

/* Session is the scanning context; top chrome only contains the scan and profile. */
.nav-count{margin-left:auto;min-width:20px;text-align:center;font:700 11px var(--mono);color:var(--ink);border:1px solid var(--line);padding:2px 5px}
@media(max-width:760px){.nav-count{display:none}}


nav.tnav a.active-session{display:flex;flex-direction:column;align-items:flex-start;gap:4px;margin-top:auto;padding:18px 14px;border-top:1px solid var(--line2);border-left:0;width:calc(100% + 12px);max-width:none;min-width:0;margin-right:-12px;color:var(--ink);text-transform:none;letter-spacing:normal}
.active-session span,.mobile-session span{font:11px var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--i2)}
.active-session strong,.mobile-session strong{font:700 14px/1.2 var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
.mobile-session{display:none}
@media(max-width:760px){nav.tnav a.active-session{display:none}.mobile-session:not([hidden]){display:flex;align-items:center;gap:8px;min-height:36px;padding:6px var(--pad);border-bottom:1px solid var(--line2);background:var(--field);text-decoration:none;color:var(--ink)}.mobile-session strong{font-size:12px}.mobile-session span{font-size:11px;flex:none}}

/* Compact set card: one title, one timeline, and the actions where they belong. */
.set-hero{grid-template-columns:clamp(190px,21vw,240px) minmax(0,1fr);gap:clamp(16px,2.4vw,28px);padding:clamp(16px,2vw,24px);min-height:0;align-items:stretch;background:var(--soft);border-color:var(--line2)}
.set-cover{align-self:stretch;width:100%;height:100%;aspect-ratio:auto}
.set-hero-main{display:flex;flex-direction:column;min-width:0;align-self:stretch}
.set-heading{min-width:0;padding:2px 0 16px}
.set-hero h1.scr{font-size:clamp(1.9rem,3.2vw,2.9rem);margin:0 0 5px;max-width:none;overflow-wrap:anywhere}
.set-source{font-size:12px;line-height:1.45}
.set-wave{height:54px;margin-top:auto}
.set-wave-foot{font-variant-numeric:tabular-nums;font-size:11px;line-height:1}
#panel-tracklist .set-hero .actions{position:static;display:flex;align-items:center;gap:7px;flex-wrap:wrap;overflow:visible;margin:12px 0 0;padding:12px 0 0;border-top:1px solid var(--line2);background:transparent;outline:0;max-height:none;z-index:auto}
#panel-tracklist .set-hero .actions .act{min-height:36px;padding:8px 11px;font-size:10px;letter-spacing:.07em}
#panel-tracklist .set-hero .actions .tlink{margin-left:auto;min-height:36px;padding:7px 8px}
#panel-tracklist .facts{padding:6px 0 0;margin-bottom:0}
@media(max-width:900px) and (min-width:521px){.set-hero{grid-template-columns:clamp(150px,23vw,200px) minmax(0,1fr)}}
@media(max-width:520px){
  .set-hero{grid-template-columns:clamp(108px,31vw,132px) minmax(0,1fr);gap:0 11px;padding:12px}
  .set-hero-main{display:contents}
  .set-heading{grid-column:2;grid-row:1;min-width:0;padding:0;align-self:start}
  .set-cover{grid-column:1;grid-row:1/3;align-self:stretch;height:100%}
  .set-hero h1.scr{font-size:clamp(1.35rem,6.4vw,1.9rem);margin:0 0 3px}
  .set-source{font-size:11px}
  .set-wave{grid-column:1/-1;grid-row:3;height:46px;margin-top:16px}
  .set-wave-foot{grid-column:1/-1;grid-row:4}
  #panel-tracklist .set-hero .actions{grid-column:2;grid-row:2;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:5px;margin-top:10px;padding-top:10px;align-self:end}
  #panel-tracklist .set-hero .actions .act{min-width:0;justify-content:center;gap:5px;min-height:32px;padding:6px 4px;font-size:0}
  #panel-tracklist .set-hero .actions .act[data-short]::after{content:attr(data-short);font:700 10px var(--mono);letter-spacing:.04em;text-transform:uppercase}
  #panel-tracklist .set-hero .actions .tlink{grid-column:1/-1;margin-left:0;min-height:28px;padding:4px 0;font-size:10px}
}
@media(prefers-reduced-motion:reduce){.top-brand .zero{transition:none}.top-brand:hover .zero,.top-brand:focus-visible .zero{transform:none}}

/* Product chrome shares one control size and a deliberate three-column rhythm. */
html.tool-active header.top{display:grid;grid-template-columns:220px minmax(0,1fr) auto;align-items:center;column-gap:0;min-height:76px;padding:12px 0;border-bottom:1px solid var(--line2);outline:0}
html.tool-active .top-brand{grid-column:1;font-size:2rem;line-height:1;justify-self:start;padding-left:var(--pad);letter-spacing:-.04em}
html.tool-active .top-content{grid-column:2;display:grid;grid-template-columns:minmax(0,1fr);align-items:center;width:min(100%,calc(var(--max) + 2 * var(--pad)));margin-inline:auto;padding:0 var(--pad)}
html.tool-active .top .searchrow{grid-column:1;grid-row:1;width:100%;max-width:none;margin:0}
html.tool-active .top form.scan{height:46px;border:1px solid var(--ink);transition:outline-color .16s linear,background-color .16s linear}
html.tool-active .top form.scan:focus-within{outline:2px solid var(--ink);outline-offset:3px}
html.tool-active .top form.scan input{min-width:0;min-height:44px;padding:0 16px;font:500 15px var(--text);letter-spacing:0;outline:0;text-overflow:ellipsis}
html.tool-active .top form.scan input:focus-visible{outline:0}
html.tool-active .top form.scan button[type="submit"]{min-width:156px;min-height:44px;padding:0 18px;border-left:1px solid var(--ink);font:700 11px var(--mono);letter-spacing:.1em}
html.tool-active .top .right{grid-column:3;grid-row:1;justify-self:end;gap:7px;margin:0;padding-right:var(--pad)}
html.tool-active .top .profile-trigger{height:44px;min-height:44px;border:1px solid var(--line2);color:var(--ink);transition:background-color .16s linear,color .16s linear,border-color .16s linear}
html.tool-active .top .profile-trigger{width:44px}
html.tool-active .top .profile-trigger:hover,html.tool-active .top .profile-trigger[aria-expanded="true"]{background:var(--ink);color:var(--field);border-color:var(--ink)}
html.tool-active .top .profile-trigger:focus-visible{outline:2px solid var(--ink);outline-offset:3px}
@media(max-width:1080px){
  html.tool-active .top-content{column-gap:18px}
  html.tool-active .top-brand{font-size:1.7rem}
  html.tool-active .top form.scan button[type="submit"]{min-width:136px}
}
@media(max-width:760px){
  html.tool-active header.top{grid-template-columns:minmax(0,1fr) auto;grid-template-rows:44px 46px;gap:12px 8px;min-height:0;padding:10px var(--pad) 12px}
  html.tool-active .top-content{display:contents}
  html.tool-active .top-brand{grid-column:1;grid-row:1;font-size:1.65rem;padding-left:0}
  html.tool-active .top .right{grid-column:2;grid-row:1;gap:6px;padding-right:0}
  html.tool-active .top .searchrow{grid-column:1/-1;grid-row:2;flex:none;padding:0;border:0}
  html.tool-active .top form.scan{height:46px}
  html.tool-active .top form.scan input{font-size:16px;padding:0 13px}
  html.tool-active .top form.scan button[type="submit"]{min-width:132px;padding:0 12px;font-size:11px;letter-spacing:.04em}
}
@media(max-width:380px){html.tool-active .top form.scan button[type="submit"]{min-width:116px;padding:0 8px;font-size:10px}html.tool-active .top-brand{font-size:1.5rem}}

/* The landing keeps its whole action in one phone-sized composition. */
html:not(.tool-active) body{padding-bottom:env(safe-area-inset-bottom,0px)}
@media(max-width:600px){
  #view-home{min-height:100svh;justify-content:center;gap:clamp(20px,3.4vh,32px);padding:76px 20px 46px}
  #view-home h1.mark{font-size:clamp(4.5rem,27vw,9rem);line-height:.88}
  #view-home .copy{width:100%;max-width:440px;gap:clamp(14px,2.2vh,18px);padding:0}
  #view-home .tagline{font-size:clamp(16px,4.4vw,20px);line-height:1.18;max-width:23ch}
  #view-home form.scan{display:grid;grid-template-columns:minmax(0,1fr) auto;border:1px solid var(--ink)}
  #view-home form.scan input{min-height:58px;width:100%;padding:12px 14px;font-size:16px;text-align:left}
  #view-home form.scan button[type="submit"]{min-height:58px;border:0;border-left:1px solid var(--ink);padding:10px 12px;font-size:11px;letter-spacing:.04em}
}

/* The active session stays in view while the work area scrolls. */
@media(min-width:761px){
  html.tool-active header.top{position:sticky;top:0;z-index:10}
  html.tool-active nav.tnav{position:sticky;top:76px;align-self:start;height:calc(100svh - 76px - var(--player-h));overflow-y:auto}
  html.tool-active:not(.player-active) nav.tnav{height:calc(100svh - 76px)}
}

/* Unidentified rows carry the brand mark instead of unrelated imagery. */
.slv.no-match{display:grid;place-items:center;overflow:hidden;background:var(--soft);border:1px solid var(--line2)}
.slv.no-match img{position:static;width:62%;height:62%;object-fit:contain;filter:var(--zero-map)}
#list-block{display:flex;flex-direction:column;gap:clamp(6px,1.2vh,12px);border-top:0;padding-top:0;margin-top:8px}
#panel-tracklist .facts{border-bottom:0}

/* Every actionable surface acknowledges hover and keyboard focus. */
@media(hover:hover){
  ol.tracks li:hover:not(.sel){background:var(--row-sel)}
  .history-chip:hover:not(.active),.history-chip:focus-visible:not(.active){background:var(--soft);border-color:var(--ink)}
  .pk-add:hover,.pk-add:focus-visible,.profile-link:hover,.profile-link:focus-visible{background:var(--soft)}
  button.slv:hover,button.slv:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
  .active-session:hover,.active-session:focus-visible,.mobile-session:hover,.mobile-session:focus-visible{background:var(--soft);color:var(--ink)}
  .history-row:hover,.history-row:focus-visible{background:var(--soft)}
  .pk-reveal:hover,.pk-reveal:focus-visible{background:var(--soft)}
  .rowact button:hover,.rowact button:focus-visible{border-color:var(--ink)}
  .srch input:hover:not(:focus),.quick-session-form input:hover:not(:focus){border-color:var(--ink)}
}
.sel-detail button.play{min-height:36px;padding:7px 12px;border:1px solid var(--line2);background:transparent;color:var(--ink);font:700 11px var(--mono);text-transform:uppercase;letter-spacing:.08em;cursor:pointer;transition:background-color .16s linear,border-color .16s linear}
.sel-detail button.play:hover,.sel-detail button.play:focus-visible{background:var(--soft);border-color:var(--ink)}
.empty-panel h2{font-family:var(--text);font-weight:700;letter-spacing:-.02em}

/* Native-style phone shell: a persistent context strip and three bottom tabs. */
@media(max-width:760px){
  :root{--mobile-nav-h:64px}
  html.tool-active body{padding-bottom:calc(var(--mobile-nav-h) + env(safe-area-inset-bottom,0px))}
  html.tool-active.player-active body{padding-bottom:calc(var(--mobile-nav-h) + var(--player-h) + 2 * env(safe-area-inset-bottom,0px))}
  html.tool-active .player{bottom:calc(var(--mobile-nav-h) + env(safe-area-inset-bottom,0px));z-index:8}
  html.tool-active nav.tnav{position:fixed;top:auto;bottom:0;left:0;right:0;z-index:10;width:100%;height:calc(var(--mobile-nav-h) + env(safe-area-inset-bottom,0px));display:grid;grid-template-columns:repeat(5,minmax(0,1fr));align-items:stretch;gap:0;overflow:visible;padding:0 6px env(safe-area-inset-bottom,0px);background:var(--field);border:0;border-top:1px solid var(--line2);box-shadow:none}
  html.tool-active nav.tnav a:not(.active-session){min-width:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;padding:5px 2px;border:0;border-top:2px solid transparent;font:700 10px/1.1 var(--mono);letter-spacing:.02em;text-align:center;white-space:normal;color:var(--i2)}
  html.tool-active nav.tnav a.nav-home:not(.active-session){display:none}
  html.tool-active nav.tnav a:not(.active-session) .ico{width:20px;height:20px}
  html.tool-active nav.tnav a:not(.active-session) .nav-text{display:none}
  html.tool-active nav.tnav a:not(.active-session)::after{content:attr(data-mobile-label);font:700 10px/1 var(--mono);letter-spacing:.02em;text-transform:uppercase;white-space:nowrap}
  html.tool-active nav.tnav a[aria-current="page"]{border-top-color:var(--ink);background:var(--soft);color:var(--ink)}
  html.tool-active nav.tnav a:not(.active-session):hover,html.tool-active nav.tnav a:not(.active-session):focus-visible{background:var(--soft);color:var(--ink)}
  html.tool-active nav.tnav .nav-count{display:none}
  html.tool-active nav.tnav .nav-lens{min-width:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;padding:5px 2px;border:0;border-top:2px solid transparent;background:transparent;cursor:pointer;font:700 10px/1.1 var(--mono);letter-spacing:.02em;text-align:center;white-space:normal;color:var(--i2)}
  html.tool-active nav.tnav .nav-lens .ico{width:20px;height:20px}
  html.tool-active nav.tnav .nav-lens .nav-text{display:none}
  html.tool-active nav.tnav .nav-lens::after{content:attr(data-mobile-label);font:700 10px/1 var(--mono);letter-spacing:.02em;text-transform:uppercase;white-space:nowrap}
  html.tool-active nav.tnav .nav-lens:hover,html.tool-active nav.tnav .nav-lens:focus-visible{background:var(--soft);color:var(--ink)}
  html.tool-active .mobile-session:not([hidden]){position:fixed;top:calc(env(safe-area-inset-top,0px) + var(--top-h,112px));left:0;right:0;z-index:9;min-height:44px;display:flex;gap:8px;align-items:center;padding:8px var(--pad);border-bottom:1px solid var(--line2);background:var(--field);text-decoration:none;color:var(--ink)}
  html.tool-active .mobile-session strong{font:700 13px/1.2 var(--text);min-width:0}
  html.tool-active .mobile-session::after{content:"›";margin-left:auto;font:400 23px/1 var(--text)}
  html.tool-active .tmain{order:1}
  html.tool-active.has-active-session .tmain{padding-top:44px}
  html.tool-active .wrap,html.tool-active .history-wrap{padding-bottom:32px}
}

/* Touch gets the same visual acknowledgement as pointer hover while pressed. */
@media(hover:none){
  .mark:is(:active,.touch-pressed) .brand-zero{transform:translateY(.01em) rotate(12deg)}
  form.scan button[type="submit"]:is(:active,.touch-pressed),button.act.primary:is(:active,.touch-pressed),.tr #pl-play:is(:active,.touch-pressed):not(:disabled){background:transparent;color:var(--ink)}
  button.act:is(:active,.touch-pressed):not(:disabled),a.act:is(:active,.touch-pressed),.profile-link:is(:active,.touch-pressed),.pk-add:is(:active,.touch-pressed),.pk-reveal:is(:active,.touch-pressed),.history-row:is(:active,.touch-pressed),.active-session:is(:active,.touch-pressed),.mobile-session:is(:active,.touch-pressed){background:var(--soft);color:var(--ink)}
  nav.tnav a:is(:active,.touch-pressed):not(.active-session),a.srow.setrow:is(:active,.touch-pressed),a.srow.plrow:is(:active,.touch-pressed),#ses-rows a.srow.sessionrow:is(:active,.touch-pressed),ol.tracks li:is(:active,.touch-pressed):not(.sel){background:var(--soft);color:var(--ink)}
  a.srow.setrow:is(:active,.touch-pressed),a.srow.plrow:is(:active,.touch-pressed){border-color:var(--ink)}
  #ses-rows a.srow.sessionrow:is(:active,.touch-pressed) .session-arrow{transform:translate(2px,-2px);color:var(--ink)}
  button.list:is(:active,.touch-pressed),.history-chip:is(:active,.touch-pressed):not(.active),.sel-detail button.play:is(:active,.touch-pressed){background:var(--soft);color:var(--ink);border-color:var(--ink)}
  .rowact button:is(:active,.touch-pressed){background:var(--hot);color:var(--ink);border-color:var(--ink)}
  button.slv:is(:active,.touch-pressed){outline:2px solid var(--ink);outline-offset:2px}
  .store-link:is(:active,.touch-pressed),.tr button:is(:active,.touch-pressed):not(:disabled),.lb-close:is(:active,.touch-pressed){background:var(--hot);color:var(--ink);border-color:var(--ink)}
  .wave-marker:is(:active,.touch-pressed){transform:translate(-50%,-50%) scale(1.45)}
  .set-wave:is(:active,.touch-pressed) .wave-bars span{opacity:.85}
  html.tool-active .top .profile-trigger:is(:active,.touch-pressed){background:var(--ink);color:var(--field);border-color:var(--ink)}
}
@media(hover:none) and (prefers-reduced-motion:reduce){.mark:is(:active,.touch-pressed) .brand-zero{transform:translateY(.01em)}}
@media(max-width:480px){
  :root{--slv:50px}
  html.tool-active .wrap,html.tool-active .history-wrap{padding:20px 16px 32px}
  html.tool-active .page-heading{align-items:center}
  html.tool-active .page-heading h1{font-size:clamp(1.7rem,8vw,2.2rem)}
  html.tool-active .page-heading .act{min-height:42px;padding:9px 11px;font-size:10px;letter-spacing:.06em}
  #panel-session .page-heading{flex-wrap:nowrap;align-items:flex-start}
  #panel-session .page-heading h1{min-width:0;font-size:clamp(1.5rem,7vw,2rem);overflow-wrap:anywhere}
  #panel-session .page-heading .act{flex:none}
  ol.tracks li,ol.tracks li.lib{grid-template-columns:clamp(68px,19vw,78px) minmax(0,1fr) auto;grid-template-rows:auto;gap:10px;min-height:90px;padding:10px 0;align-items:center}
  ol.tracks li .slv,ol.tracks li.lib .slv{grid-column:1;grid-row:1;width:100%;height:100%;min-height:68px;align-self:stretch}
  ol.tracks li .who,ol.tracks li.lib .who{grid-column:2;grid-row:1;display:flex;flex-direction:column;align-items:flex-start;min-width:0;align-self:center}
  ol.tracks li .ar,ol.tracks li .cat{display:none}
  ol.tracks li .ti{font-size:14px;line-height:1.25;font-weight:600;overflow-wrap:anywhere}
  ol.tracks li button.t,ol.tracks li .buy,ol.tracks li.lib .buy{display:none}
  ol.tracks li .rowact,ol.tracks li.lib .rowact{grid-column:3;grid-row:1;display:flex;justify-self:end;align-self:center}
  ol.tracks li .rowact button{width:44px;min-width:44px;height:44px;min-height:44px;justify-content:center;padding:0;font-size:0}
  ol.tracks li .rowact button .ico{width:16px;height:16px}
  ol.tracks li.lib .rowact{grid-row:1}
  ol.tracks li .rowdetail{grid-column:1/-1;grid-row:2}
  .history-chip{border-radius:0}
  .quick-session-form{padding:12px}
  .quick-session-form input,.quick-session-form .act{width:100%;flex-basis:100%}
}

/* History on phones reads like a compact log, with filters in single-line rails. */
@media(max-width:760px){
  #panel-history .wrap{gap:12px}
  #panel-history .srch{max-width:none}
  #panel-history .srch input{width:100%;min-height:48px;padding:10px 13px;font-size:16px}
  #panel-history .history-filters{flex-wrap:nowrap;gap:7px;margin:0;padding:1px 0 5px;overflow-x:auto;overscroll-behavior-x:contain;scrollbar-width:none}
  #panel-history .history-filters::-webkit-scrollbar{display:none}
  #panel-history .history-chip{flex:none;min-height:38px;padding:7px 12px;border-radius:0;font:700 11px var(--mono);letter-spacing:.06em;white-space:nowrap}
  #panel-history .history-session-label{margin:0;gap:10px;min-height:44px;font:700 11px var(--mono);letter-spacing:.08em}
  #panel-history .history-session-label select{flex:1;min-width:0;min-height:42px;padding:7px 10px;font-size:14px}
  #panel-history .history-rows{margin-top:4px}
  #panel-history .history-row{display:grid;grid-template-columns:50px minmax(0,1fr) 20px;gap:10px;min-height:70px;padding:11px 0}
  #panel-history .history-row::before{content:attr(data-type);display:grid;place-items:center;align-self:center;width:50px;height:38px;border:1px solid var(--line2);font:700 10px var(--mono);letter-spacing:.05em}
  #panel-history .history-row::after{content:"↗";justify-self:end;align-self:center;font:20px/1 var(--text);color:var(--i2)}
  #panel-history .history-row .slv{display:none}
  #panel-history .history-copy{gap:3px}
  #panel-history .history-copy strong{font-size:15px;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  #panel-history .history-meta{font-size:10px;letter-spacing:.03em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  #panel-history .history-meta-kind{display:none}
}

/* ============================================================
   Discover — the archive's front door.
   A ruled readout of sets over the local demo archive: flat
   field, hairline rows, mono labels, radius 0, no cards, no
   lattice (tool-active hides #grid). Every paint is theme-aware
   through the shared tokens, so all three colourways hold.
   ============================================================ */
#panel-discover .disc-wrap{gap:clamp(16px,2.6vh,26px)}
.disc-head{display:flex;flex-direction:column;gap:10px}
.disc-lede{margin:0;max-width:62ch;color:var(--i2);
  font-size:clamp(.95rem,1.1vw,1.05rem);text-wrap:pretty}
.disc-statline{margin:0;display:flex;flex-wrap:wrap;gap:4px 20px;font-family:var(--mono);
  font-size:max(12px,.85vw);text-transform:uppercase;letter-spacing:.18em;color:var(--i3)}
.disc-statline b{font-weight:400;color:var(--ink)}

/* archive search uses the shared .srch input, same as history — no button */

/* ruled filter row: genre chips + author */
.disc-filters{display:flex;flex-wrap:wrap;align-items:center;gap:10px 12px;
  border:1px solid var(--line2);padding:12px 14px}
.disc-flabel{font-family:var(--mono);font-size:max(12px,.85vw);text-transform:uppercase;
  letter-spacing:.18em;color:var(--i3);margin-right:4px}
.disc-chips{display:flex;flex-wrap:wrap;gap:8px}
.disc-chip{border:1px solid var(--line);background:transparent;color:var(--i2);cursor:pointer;
  padding:8px 12px;font-family:var(--mono);font-size:max(12px,.85vw);text-transform:uppercase;
  letter-spacing:.14em;border-radius:0;
  transition:background-color .16s linear,color .16s linear,border-color .16s linear}
.disc-chip:hover,.disc-chip:focus-visible{color:var(--ink);border-color:var(--ink)}
.disc-chip[aria-pressed="true"]{background:var(--ink);color:var(--field);border-color:var(--ink)}
.disc-author{display:inline-flex;align-items:center;gap:8px;margin-left:auto;
  border:1px solid var(--line);padding:0 10px}
.disc-author span{font-family:var(--mono);font-size:max(12px,.85vw);text-transform:uppercase;
  letter-spacing:.14em;color:var(--i3)}
.disc-author input{border:0;background:transparent;color:var(--ink);padding:9px 0;
  font-family:var(--mono);font-size:max(12px,.85vw);letter-spacing:.06em;width:13ch}
.disc-author input::placeholder{color:var(--i3)}
.disc-author input:focus-visible{outline:2px solid var(--focus);outline-offset:0}

/* block head: mono label + action / count */
#panel-discover .block-head{display:flex;align-items:baseline;justify-content:space-between;
  gap:16px;border-bottom:1px solid var(--line);padding-bottom:10px;margin-bottom:6px}
#panel-discover h2{font-family:var(--mono);font-weight:400;font-size:max(12px,.85vw);
  text-transform:uppercase;letter-spacing:.2em;color:var(--i3)}
.disc-more{font-family:var(--mono);font-size:max(12px,.85vw);letter-spacing:.08em;color:var(--i2);
  text-decoration:none;background:none;border:0;cursor:pointer;padding:0;
  transition:color .16s linear}
.disc-more:hover,.disc-more:focus-visible{color:var(--ink)}
.disc-count{font-family:var(--mono);font-size:max(12px,.85vw);letter-spacing:.18em;
  text-transform:uppercase;color:var(--i2);white-space:nowrap}
.disc-count b{color:var(--ink);font-weight:400}

/* featured — one ruled row per set: cover · name · artist · genre / length */
ol.disc-feat{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}
ol.disc-feat li{flex:none;width:auto}
ol.disc-feat li + li{border-top:1px solid var(--line2)}
ol.disc-feat a{display:grid;grid-template-columns:clamp(54px,7vw,76px) minmax(0,1fr) auto;
  gap:5px clamp(12px,1.6vw,18px);align-items:center;padding:clamp(10px,1.5vh,14px) 0;
  text-decoration:none;color:inherit;transition:background-color .16s linear}
ol.disc-feat a:hover{background:var(--soft)}
.disc-cv{grid-column:1;grid-row:1/3;aspect-ratio:1/1;width:100%;position:relative;
  overflow:hidden;background-color:var(--fill);
  outline:1px solid var(--line2);
  display:grid;place-items:end start;padding:6px;
  transition:outline-color .16s linear}
.disc-cv img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.disc-cv.has-art i{display:none}
.disc-cv i{font-style:normal;font-family:var(--mono);font-size:8px;letter-spacing:.02em;
  color:var(--i2);max-width:100%;overflow:hidden;white-space:nowrap}
.disc-ft{grid-column:2;grid-row:1;font-family:var(--text);font-weight:600;
  font-size:clamp(15px,1.25vw,17px);color:var(--i1);line-height:1.25;overflow-wrap:anywhere;
  min-width:0}
.disc-fa{grid-column:2;grid-row:2;font-family:var(--mono);font-size:max(12px,.85vw);
  color:var(--i2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.disc-fm{grid-column:3;grid-row:1/3;align-self:center;justify-self:end;text-align:right;
  font-family:var(--mono);font-size:max(12px,.85vw);letter-spacing:.04em;color:var(--i3);
  white-space:nowrap;font-variant-numeric:tabular-nums}
ol.disc-feat a:hover .disc-ft{color:var(--ink)}
ol.disc-feat a:hover .disc-cv{outline-color:var(--ink)}

/* ruled readout: rank · sleeve · name/source · genre · duration · tracks · arrow */
ol.disc-read{list-style:none;margin:0;padding:0}
ol.disc-read li a{display:grid;align-items:center;gap:4px clamp(12px,1.8vw,22px);
  padding:clamp(11px,1.7vh,15px) 0;border-bottom:1px solid var(--line2);text-decoration:none;
  color:inherit;transition:background-color .16s linear}
ol.disc-read li a:hover{background:var(--soft)}
.disc-rk{font-family:var(--mono);font-size:max(12px,.85vw);color:var(--i3);
  font-variant-numeric:tabular-nums;width:2.4em;flex:none}
.disc-sleeve{width:46px;height:46px;flex:none;position:relative;overflow:hidden;
  display:grid;place-items:end start;padding:5px;
  background:var(--fill);outline:1px solid var(--line2)}
.disc-sleeve img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.disc-sleeve.has-art i{display:none}
.disc-sleeve i{font-style:normal;font-family:var(--mono);font-size:8px;letter-spacing:.02em;
  color:var(--i2);white-space:nowrap;max-width:100%;overflow:hidden}
.disc-meta{display:flex;flex-direction:column;gap:3px;min-width:0}
.disc-nm{font-family:var(--text);font-weight:600;font-size:clamp(14px,1.2vw,16px);color:var(--i1);
  overflow-wrap:anywhere;min-width:0}
.disc-sub{font-family:var(--mono);font-size:max(12px,.85vw);color:var(--i2);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.disc-mt{font-family:var(--mono);font-size:max(12px,.85vw);letter-spacing:.04em;color:var(--i3);
  white-space:nowrap;text-align:right;font-variant-numeric:tabular-nums}
.disc-mt.ink{color:var(--i2)}
.disc-arrow{font-family:var(--mono);color:var(--i3);text-align:right}
ol.disc-read li a:hover .disc-nm,ol.disc-read li a:hover .disc-arrow{color:var(--ink)}
ol.disc-sets li a{grid-template-columns:2.4em 46px minmax(0,1.7fr) auto auto auto auto}
ol.disc-pockets li a{grid-template-columns:2.4em minmax(0,1.3fr) minmax(0,2fr) auto}
.disc-pkname{font-family:var(--display);font-weight:800;font-size:clamp(15px,1.5vw,19px);
  line-height:1.1;letter-spacing:-.01em;color:var(--ink);min-width:0;overflow-wrap:anywhere}
.disc-pknote{font-family:var(--text);font-size:clamp(.86rem,1vw,.95rem);color:var(--i2);
  min-width:0;overflow-wrap:anywhere}

/* pager */
.disc-pager{display:flex;align-items:center;justify-content:space-between;gap:16px;
  border-top:1px solid var(--line);padding-top:14px;margin-top:2px;font-family:var(--mono);
  font-size:max(12px,.85vw);text-transform:uppercase;letter-spacing:.14em;color:var(--i3)}
.disc-pager button,.disc-pager span{display:inline-flex;align-items:center;gap:8px;
  border:1px solid var(--line);background:transparent;padding:10px 14px;color:var(--i2);
  font:inherit;letter-spacing:inherit;text-transform:inherit;cursor:pointer}
.disc-pager span{cursor:default}
.disc-pager button:hover:not(:disabled),.disc-pager button:focus-visible{color:var(--ink);border-color:var(--ink)}
.disc-pager button:disabled{opacity:.4;cursor:default}
.disc-pager .disc-now b{color:var(--ink);font-weight:400}

.disc-hint,.disc-empty-msg{margin:0;font-family:var(--mono);font-size:max(12px,.85vw);
  letter-spacing:.03em;color:var(--i2);max-width:70ch}
.disc-empty-msg{display:flex;flex-wrap:wrap;align-items:center;gap:10px}

@media(max-width:760px){
  .disc-filters{padding:10px 12px}
  .disc-author{margin-left:0;width:100%}
  .disc-author input{flex:1;width:auto}
  ol.disc-sets li a{grid-template-columns:auto 46px minmax(0,1fr) auto;gap:4px 10px}
  ol.disc-sets .disc-rk{grid-column:1;grid-row:1;align-self:start}
  ol.disc-sets .disc-sleeve{grid-column:2;grid-row:1/3}
  ol.disc-sets .disc-meta{grid-column:3;grid-row:1}
  ol.disc-sets .disc-arrow{grid-column:4;grid-row:1}
  ol.disc-sets .disc-genre{grid-column:3/5;grid-row:2;text-align:left}
  ol.disc-sets .disc-cnt{grid-column:3;grid-row:3;text-align:left}
  ol.disc-sets .disc-dur{display:none}
  ol.disc-pockets li a{grid-template-columns:2.4em minmax(0,1fr);gap:4px 12px}
  ol.disc-pockets .disc-pkname{grid-column:2;grid-row:1}
  ol.disc-pockets .disc-pknote{grid-column:2;grid-row:2}
  .disc-pager{flex-wrap:wrap}
}
@media(prefers-reduced-motion:reduce){
  #panel-discover *{animation:none!important;transition:none!important}
}

/* ---- track page: one record, big, and every set it appears in ---- */
.track-hero{display:grid;grid-template-columns:clamp(190px,24vw,300px) minmax(0,1fr);
  gap:clamp(20px,3vw,40px);align-items:start;padding:20px 24px;
  border:1px solid var(--line);background:var(--soft)}
.track-art{aspect-ratio:1;border:1px solid var(--line);overflow:hidden;background:var(--fill);
  display:grid;place-items:center}
.track-art img{width:100%;height:100%;object-fit:cover;display:block}
.track-art .zero{width:62%;height:62%;object-fit:contain;filter:var(--zero-map)}
.track-main{display:flex;flex-direction:column;gap:clamp(8px,1.4vh,14px);min-width:0}
.track-kicker{margin:0;font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);
  text-transform:uppercase;letter-spacing:.24em;color:var(--i3)}
.track-artist{margin:0;font-family:var(--display);font-weight:700;overflow-wrap:anywhere;
  font-size:clamp(1.05rem,2.2vw,1.7rem);letter-spacing:-.02em;color:var(--i2)}
.track-name{margin:0;font-family:var(--display);font-weight:900;overflow-wrap:anywhere;
  font-size:clamp(2.2rem,6.4vw,4.4rem);line-height:.96;letter-spacing:-.04em;text-wrap:balance}
.track-hero .actions{margin-top:clamp(6px,1.2vh,14px)}
.track-count{margin:0;font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);
  text-transform:uppercase;letter-spacing:.06em;color:var(--i3)}
ol.occ{list-style:none;margin:0;padding:0}
ol.occ li a{display:grid;grid-template-columns:2.4em 46px minmax(0,1fr) auto auto;
  align-items:center;gap:4px clamp(12px,1.8vw,22px);padding:12px 0;
  border-bottom:1px solid var(--line2);text-decoration:none;color:inherit;min-height:56px}
ol.occ li:first-child a{border-top:1px solid var(--line2)}
ol.occ li a:hover,ol.occ li a:focus-visible{background:var(--soft)}
ol.occ li a:hover .disc-nm,ol.occ li a:hover .disc-arrow{color:var(--ink)}
.occ-time{font-family:var(--mono);font-size:clamp(11.5px,.82vw,12px);letter-spacing:.06em;
  color:var(--i1);font-variant-numeric:tabular-nums;white-space:nowrap;text-align:right}
a.ar,a.ti{text-decoration:none}
a.ar:hover,a.ti:hover,a.ar:focus-visible,a.ti:focus-visible{
  color:var(--ink);text-decoration:underline;text-decoration-color:var(--line);text-underline-offset:3px}
@media(max-width:640px){
  .track-hero{grid-template-columns:minmax(0,1fr);gap:18px;padding:16px}
  .track-art{width:clamp(140px,42vw,220px)}
  .track-name{font-size:clamp(1.9rem,9vw,2.6rem)}
}
@media(max-width:560px){
  ol.occ li a{grid-template-columns:auto minmax(0,1fr) auto;gap:2px 12px}
  ol.occ .disc-sleeve{display:none}
  ol.occ .disc-rk{grid-column:1;grid-row:1/3;align-self:start}
  ol.occ .disc-meta{grid-column:2;grid-row:1}
  ol.occ .occ-time{grid-column:2;grid-row:2;text-align:left}
  ol.occ .disc-arrow{grid-column:3;grid-row:1/3;align-self:center}
}

/* Dig: identity, listening and collecting are separate actions. */
.heart-icon{display:inline-block;width:19px;height:19px;background:currentColor;mask:url("icons/heart.svg") center/contain no-repeat;-webkit-mask:url("icons/heart.svg") center/contain no-repeat;flex:none}
.like-button{display:inline-flex;align-items:center;justify-content:center;width:36px;min-width:36px;height:36px;padding:0;border:1px solid var(--line);background:transparent;color:var(--ink);cursor:pointer;border-radius:0}
.like-button[aria-pressed="true"]{background:var(--ink);color:var(--field);border-color:var(--ink)}
.like-button:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
.set-like-row{position:relative}.set-like-row>a{padding-right:60px}.set-like-row>.like-button{position:absolute;right:12px;top:50%;transform:translateY(-50%)}
.missing-liked-set{display:flex;gap:16px;align-items:center;padding:16px;border-bottom:1px solid var(--line2)}.missing-liked-set .empty{flex:1}
/* Details surface: one component, two presentations.
   Below 1280 it is a sheet fixed over the CONTENT COLUMN only - the top bar,
   the sidebar and the player stay put and stay usable, so nothing behind it
   reflows. At >=1280 it is the reserved third column of the tool shell. */
.track-inspector{position:fixed;top:76px;left:220px;right:0;bottom:calc(var(--player-h) + 16px);
  overflow:auto;padding:24px clamp(16px,3vw,36px) 48px;background:var(--field);
  border-left:1px solid var(--ink);z-index:5;container-type:inline-size}
@media(max-width:900px){.track-inspector{left:172px}}
/* ---- The tool shell at >=1280: sidebar · content · reserved details rail.
   The third column belongs to the grid whether or not details are open, so
   opening details reflows nothing. The top bar shares the same three columns
   (brand/sidebar, search/content, profile/rail) and both the search row and
   the panel wraps use one 24px gutter inside the content column, so the
   search bar tracks the layout instead of floating over it. */
@media(min-width:1280px){
  html.tool-active .tool-body{grid-template-columns:220px minmax(0,1fr) var(--rail)}
  html.tool-active header.top{grid-template-columns:220px minmax(0,1fr) var(--rail)}
  html.tool-active .top-content{width:min(100% - 48px,calc(var(--max) + 48px));padding:0 24px}
  html.tool-active .top .right{padding-right:24px}
  .tmain .wrap{width:min(100% - 48px,calc(var(--max) + 48px));padding-inline:24px}
  .track-inspector{position:sticky;top:76px;left:auto;right:auto;bottom:auto;width:auto;
    height:calc(100svh - 76px - var(--player-h));grid-column:3;align-self:start;
    z-index:1;border-left:1px solid var(--line2);padding:24px}
  html.tool-active:not(.player-active) .track-inspector{height:calc(100svh - 76px)}
}

.track-inspector[hidden]{display:none}
.inspector-inner{display:flex;flex-direction:column;max-width:940px}
.inspector-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:24px}
.inspector-head h2{margin:0}
/* close sits at the end of the head row; the × is decorative, the label is
   the accessible name, so the button stays a comfortable 44px target */
button.inspector-close{gap:8px;padding:8px 12px;font-size:11px;letter-spacing:.07em;
  text-transform:uppercase;white-space:nowrap}
button.inspector-close .xmark{font:400 20px/1 "Origin Text",sans-serif;margin-top:-2px}
.inspector-id{display:flex;flex-direction:column}
.inspector-who{min-width:0}
.inspector-inner>h2{margin:26px 0 2px}
.inspector-inner>.facts{margin-top:0}
@container (min-width:520px){
  .inspector-id{display:grid;grid-template-columns:minmax(140px,240px) minmax(0,1fr);gap:24px;align-items:start}
}
.inspector-art{display:block;width:100%;max-width:240px;height:auto;aspect-ratio:1;object-fit:cover;margin-bottom:20px;border:1px solid var(--line)}
.inspector-idle{display:flex;flex-direction:column}
.inspector-idle-art{width:100%;max-width:240px;aspect-ratio:1;border:1px solid var(--line);background:var(--fill);display:grid;place-items:center;margin-bottom:20px}
.inspector-idle-mark{width:88px;height:88px;opacity:.3;filter:grayscale(1)}
.inspector-artist{font-size:16px;margin:0 0 5px}.inspector-title{font:700 28px/1.05 "Origin Text",sans-serif;margin:0 0 18px;overflow-wrap:anywhere}.track-inspector .facts{display:flex;gap:12px;flex-wrap:wrap}/* every control on the details surface is a 44px target at any width */.track-inspector .like-button{width:44px;min-width:44px;height:44px}.track-inspector .store-link{width:44px;height:44px}.track-inspector .standalone-playlist>.list{min-height:44px}.track-inspector .act{min-height:44px}.track-inspector .actions{display:flex;gap:8px;flex-wrap:wrap;margin:20px 0 14px}.track-inspector .buy{justify-content:flex-start}.track-inspector .occ a{grid-template-columns:24px minmax(0,1fr) auto;gap:8px}.track-inspector .occ .disc-slv,.track-inspector .occ .disc-arrow{display:none}.track-inspector .occ .disc-nm{font-size:14px}.track-inspector .occ .disc-meta{min-width:0}
@media(max-width:760px){html.tool-active nav.tnav .nav-lens{display:none}.like-button{width:44px;min-width:44px;height:44px}#panel-tracklist .set-hero .actions .like-button{font-size:initial;min-height:44px}ol.tracks li .rowact{gap:4px}nav.tnav .heart-icon{width:20px;height:20px}.player .tr{gap:4px}.player .tr .like-button{width:36px;min-width:36px;height:42px}#panel-liked .lede{font-size:16px}.missing-liked-set{flex-wrap:wrap}.missing-liked-set .empty{flex-basis:70%}}

.liked-tabs{display:flex;gap:8px;margin:12px 0 28px}.liked-tabs [aria-current="page"]{background:var(--ink);color:var(--field);border-color:var(--ink)}
.standalone-playlist{position:relative}.standalone-playlist>.list{display:inline-flex;align-items:center;gap:6px;min-height:36px;border:1px solid var(--line);padding:7px 10px;background:transparent;color:var(--ink);font:12px var(--mono)}.standalone-playlist .ico{width:16px;height:16px}.standalone-playlist .picker{position:relative;min-width:220px;max-width:100%;margin-top:8px}.standalone-playlist .picker button{white-space:normal}
.history-like-row{position:relative}.history-like-row .history-row{padding-right:64px}.history-like-row>.like-button{position:absolute;right:12px;top:50%;transform:translateY(-50%)}
@media(max-width:760px){.standalone-playlist>.list{min-height:44px}.liked-tabs .act{min-height:44px}.history-like-row .history-row{padding-right:58px}}
.track-inspector .occ .disc-sleeve{display:none}
@media(max-width:760px){.player .tr .like-button{width:44px;min-width:44px;height:44px}}
/* A sleeve keeps its square at every available column width. */
.set-cover{height:auto;aspect-ratio:1;align-self:start}
.set-cover img{aspect-ratio:1;height:auto;object-fit:cover}
@media(max-width:520px){.set-cover{grid-row:1;align-self:start}ol.tracks li .ar{display:block;font-size:14px;line-height:1.25;color:var(--i2)}ol.tracks li .who{gap:3px}#panel-tracklist .set-hero .actions{grid-column:1/-1;grid-row:2;display:flex;flex-wrap:wrap;align-items:center;margin-top:12px}#panel-tracklist .set-hero .actions .act{min-height:44px;padding:8px 12px}#panel-tracklist .set-hero .actions .tlink{margin-left:auto;min-height:44px;padding:10px 0}.set-wave{grid-row:3}.set-wave-foot{grid-row:4}.set-hero{gap:0 11px}.player .tr{gap:3px}.player .tr #pl-prev{display:none}}
@media(max-width:520px){.player .tr #pl-prev{display:inline-flex;position:absolute;left:12px;bottom:8px;width:44px;min-width:44px;height:44px}.player .tr #pl-next{width:44px;min-width:44px;height:44px}.player #pl-seek{margin-left:54px;width:calc(100% - 54px)}.back a{overflow-wrap:anywhere}}
html.tool-active:not(.player-active) .track-inspector{bottom:0}
/* the sheet scrolls: keep Close reachable while it does */
@media(max-width:1279px){
  .track-inspector .inspector-head{position:sticky;top:-24px;z-index:3;background:var(--field);
    padding:10px 0 12px;margin-bottom:14px;border-bottom:1px solid var(--line2)}
}
/* phone/tablet sheet: sit under the search bar and above the tab bar + player */
@media(max-width:760px){
  .track-inspector{left:0;top:calc(env(safe-area-inset-top,0px) + var(--top-h,112px));
    border-left:0;border-top:1px solid var(--line2);
    bottom:calc(var(--mobile-nav-h,0px) + env(safe-area-inset-bottom,0px))}
  html.tool-active.player-active .track-inspector{bottom:calc(var(--mobile-nav-h,0px) + var(--player-h) + 2 * env(safe-area-inset-bottom,0px))}
  html.tool-active:not(.player-active) .track-inspector{bottom:calc(var(--mobile-nav-h,0px) + env(safe-area-inset-bottom,0px))}
  .inspector-title{font-size:clamp(26px,8vw,34px)}
}
/* the same markup scaled up when the surface is wide enough for a hero row */
@container (min-width:520px){
  .inspector-art{margin-bottom:0}
  .inspector-title{font-size:clamp(30px,3.2vw,44px);margin-bottom:0}
  .track-inspector .actions{margin-top:24px}
  .inspector-head{margin-bottom:28px}
}
/* Phone player: identity above, contiguous transport and seek below. */
@media(max-width:640px){
  .player{grid-template-columns:44px 44px 44px minmax(0,1fr) 78px;grid-template-rows:44px 44px;gap:4px;padding:8px 12px env(safe-area-inset-bottom,0px)}
  .player .pl-art{grid-column:1;grid-row:1;width:40px;height:40px;align-self:center}
  .player .np{grid-column:2/5;grid-row:1;min-width:0;align-self:center}
  .player .tr{display:contents}
  .player .tr #pl-prev,.player .tr #pl-play,.player .tr #pl-next,.player .tr .like-button{position:static;display:inline-flex;width:44px;min-width:44px;height:44px;align-self:center;margin:0}
  .player .tr #pl-prev{grid-column:1;grid-row:2}
  .player .tr #pl-play{grid-column:2;grid-row:2}
  .player .tr #pl-next{grid-column:3;grid-row:2}
  .player .tr .like-button{grid-column:5;grid-row:1;justify-self:end}
  .player #pl-seek{grid-column:4;grid-row:2;min-width:0;max-width:none;width:100%;height:44px;margin:0;align-self:center}
  .player .np-time{grid-column:5;grid-row:2;width:78px;min-width:0;align-self:center;font-size:11px;text-align:right;margin:0}
}

/* ============================================================
   Tracklist rows: Spotify-grade anatomy + resizable right rail
   (plan: docs/plans/spotify-rows). Cells placed explicitly so the
   row never floats children; the wall of per-row controls folds
   behind hover. No new colours — every mark is ink or ink-alpha.
   ============================================================ */

/* 6 columns: idx · sleeve · who · store chips · actions · menu */
ol.tracks li{
  position:relative;
  grid-template-columns:auto var(--slv) minmax(0,1fr) auto auto auto;
}

/* ---- the index cell: timestamp ⇄ play ⇄ equalizer. one cell,
   three states, so the left anchor never shifts. ---- */
.idx{position:relative;display:grid;place-items:center;min-width:48px;justify-self:start}
.idx-stamp{grid-area:1/1;font-family:var(--mono);font-size:clamp(11.5px,.82vw,12.5px);
  letter-spacing:.06em;color:var(--i2);font-variant-numeric:tabular-nums}
.row-play{grid-area:1/1;display:inline-flex;align-items:center;justify-content:center;
  width:40px;height:40px;background:none;border:0;padding:0;color:var(--ink);
  opacity:0;cursor:pointer}
.row-play .ico{width:18px;height:18px}
.eq-bars{grid-area:1/1;display:flex;align-items:flex-end;gap:2px;height:16px;opacity:0}
.eq-bars i{width:3px;height:100%;background:var(--ink)}
.eq-bars.is-live i{animation:eqbar .55s ease-in-out infinite alternate}
.eq-bars.is-live i:nth-child(2){animation-delay:.18s}
.eq-bars.is-live i:nth-child(3){animation-delay:.32s}
.eq-bars.is-live i:nth-child(4){animation-delay:.08s}
@keyframes eqbar{from{height:30%}to{height:100%}}

/* hover promotes play and hides the stamp; the playing row locks the
   equalizer in, swapping to the pause glyph only under the pointer. */
@media(hover:hover){
  ol.tracks li:not(.is-playing):hover .idx-stamp,
  ol.tracks li:not(.is-playing):focus-within .idx-stamp{opacity:0}
  ol.tracks li:not(.is-playing):hover .row-play,
  ol.tracks li:not(.is-playing):focus-within .row-play{opacity:1}
}
ol.tracks li.is-playing .idx-stamp{opacity:0}
ol.tracks li.is-playing .eq-bars{opacity:1}
@media(hover:hover){
  ol.tracks li.is-playing:hover .eq-bars,
  ol.tracks li.is-playing:focus-within .eq-bars{opacity:0}
  ol.tracks li.is-playing:hover .row-play,
  ol.tracks li.is-playing:focus-within .row-play{opacity:1}
}
/* touch has no hover: the play glyph is always the leftmost mark */
@media(hover:none){
  ol.tracks li .idx-stamp{opacity:0}
  ol.tracks li .row-play{opacity:1;width:44px;height:44px}
  ol.tracks li.is-playing .row-play{opacity:0}
  ol.tracks li.is-playing .eq-bars{opacity:1}
}

/* ---- the ··· overflow menu, anchored to the row ---- */
button.more{display:inline-flex;align-items:center;justify-content:center;
  width:36px;height:36px;background:none;border:0;padding:0;color:var(--i2);
  cursor:pointer;justify-self:end}
button.more .ico{width:18px;height:18px}
@media(hover:hover){
  button.more:hover,button.more:focus-visible{color:var(--ink);background:var(--hot)}
}
.row-menu{position:absolute;top:calc(100% + 4px);right:0;z-index:40;min-width:204px;
  background:var(--field);border:1px solid var(--ink);padding:4px 0}
.row-menu-item{display:flex;align-items:center;gap:10px;width:100%;text-align:left;
  background:none;border:0;padding:11px 14px;font-family:var(--text);font-size:.9rem;
  color:var(--i1);cursor:pointer}
.row-menu-item .ico{width:16px;height:16px;color:var(--i3)}
@media(hover:hover){
  .row-menu-item:hover,.row-menu-item:focus-visible{background:var(--hot);color:var(--ink)}
}

/* ---- the wall folds away: store chips, actions and the menu are
   revealed on hover / focus-within, always on under touch. ---- */
ol.tracks li .rowact,ol.tracks li .buy,ol.tracks li button.more{
  opacity:0;pointer-events:none}
ol.tracks li:hover .rowact,ol.tracks li:focus-within .rowact,
ol.tracks li:hover .buy,ol.tracks li:focus-within .buy,
ol.tracks li:hover button.more,ol.tracks li:focus-within button.more,
ol.tracks li button.more[aria-expanded="true"]{opacity:1;pointer-events:auto}
@media(hover:none){
  ol.tracks li .rowact,ol.tracks li .buy,ol.tracks li button.more{
    opacity:1;pointer-events:auto}
}

/* ---- reduced motion: the equalizer is the only loop; kill it ---- */
@media(prefers-reduced-motion:reduce){
  .eq-bars.is-live i{animation:none}
}

/* ---- resizable right rail. the grip only exists at >=1280, where
   the tool shell reserves the third column. ---- */
.rail-grip{display:none}
@media(min-width:1280px){
  .rail-grip{display:block;grid-column:3;grid-row:1;align-self:stretch;
    width:8px;justify-self:start;margin-left:-4px;position:relative;z-index:6;
    cursor:col-resize;touch-action:none}
  /* the inspector shares row 1 with the grip (the grip floats over its
     left hairline); without this it auto-places to row 2, a full viewport
     below the fold. */
  .track-inspector{grid-row:1}
  .grip-glyph{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
    width:4px;height:26px;border-left:1px solid var(--i3);border-right:1px solid var(--i3);
    opacity:0}
  .rail-grip:hover .grip-glyph,.rail-grip:focus-visible .grip-glyph,
  .rail-grip.is-dragging .grip-glyph{opacity:1;border-color:var(--ink)}
  html.rail-resizing{user-select:none}
  html.rail-resizing .tool-body{cursor:col-resize}
}

/* ---- <=700: the two-row row — controls fold under the name ---- */
@media(max-width:700px){
  ol.tracks li{grid-template-columns:auto var(--slv) minmax(0,1fr) auto auto;row-gap:5px}
  ol.tracks li .idx{grid-column:1;grid-row:1;justify-self:start}
  ol.tracks li .slv{grid-column:2;grid-row:1/3;align-self:start}
  ol.tracks li .who{grid-column:3;grid-row:1;min-width:0}
  ol.tracks li .rowact{grid-column:4;grid-row:1;justify-self:end;align-self:start}
  ol.tracks li .more{grid-column:5;grid-row:1;justify-self:end;align-self:start}
  ol.tracks li .buy{grid-column:3/6;grid-row:2;justify-content:flex-start}
  ol.tracks li .rowdetail{grid-column:1/-1}
}

/* ---- <=480: phone — sleeve · name, then the play cell + menu under ---- */
@media(max-width:480px){
  ol.tracks li{grid-template-columns:auto minmax(0,1fr) auto;
    grid-template-rows:auto auto;gap:8px 12px;min-height:84px;padding:10px 0;
    align-items:center}
  ol.tracks li .slv,ol.tracks li.lib .slv{grid-column:1;grid-row:1;width:var(--slv);
    height:var(--slv);aspect-ratio:1;min-height:0;align-self:start}
  ol.tracks li .idx{grid-column:1;grid-row:2;justify-self:start;min-width:0}
  ol.tracks li .who,ol.tracks li.lib .who{grid-column:2;grid-row:1;display:flex;
    flex-direction:column;align-items:flex-start;min-width:0;align-self:center;gap:2px}
  ol.tracks li .ar{display:block;font-size:13px;line-height:1.25;color:var(--i2)}
  ol.tracks li .cat{display:none}
  ol.tracks li .ti{font-size:14px;line-height:1.25;font-weight:600;overflow-wrap:anywhere}
  ol.tracks li .buy{display:none}
  ol.tracks li .rowact,ol.tracks li.lib .rowact{grid-column:3;grid-row:1;display:flex;
    justify-self:end;align-self:center}
  ol.tracks li .rowact button{width:44px;min-width:44px;height:44px;min-height:44px;
    justify-content:center;padding:0;font-size:0}
  ol.tracks li .rowact button .ico{width:16px;height:16px}
  ol.tracks li .more{grid-column:3;grid-row:2;justify-self:end;align-self:center;
    width:44px;height:44px}
  ol.tracks li .rowdetail{grid-column:1/-1;grid-row:3}
}
/* the row cannot afford the store chips once the name column drops below
   ~260px: the same links live on the track details surface, so the facts
   keep their width instead of wrapping into four lines. */
@container panel (max-width:743px){
  ol.tracks li .buy,ol.tracks li.lib .buy{display:none}
}
@media(max-width:1079px){
  ol.tracks li .buy,ol.tracks li.lib .buy{display:none}
}
/* touch: every row control keeps a 44px target */
@media(hover:none){
  ol.tracks li .rowact button{min-width:44px;min-height:44px}
  button.more{width:44px;height:44px}
  .facet-btn{min-height:44px}
  .store-link{width:44px;height:44px}
}
