/* ════════════════════════════════════════════════════════════════════
   SIGNAL — YouTube channel intelligence
   Dark "control-room" theme. Palette inherited from the project's existing
   ruby/cyan dashboard; extended with atmosphere (glows, grid, grain).
   ════════════════════════════════════════════════════════════════════ */

:root {
  --ruby:#ff3b5c; --ruby2:#cc2f4a;
  --cyan:#06b6d4; --emerald:#10b981; --amber:#f59e0b;
  --violet:#8b5cf6; --gold:#fbbf24; --red:#ef4444;
  --bg:#06080d; --bg2:#0c0f18;
  --card:#111520; --card2:#161b28;
  --border:#1e2535; --border2:#252d42;
  /* Text tokens kept bright/near-white for readability (faint hierarchy only). */
  --text:#f5f8fb; --text2:#dde5ee; --text3:#c2ccda;
  --font:'Outfit',system-ui,sans-serif;
  --mono:'JetBrains Mono',ui-monospace,monospace;
  --r:16px;
}

* { box-sizing:border-box; margin:0; padding:0; }
/* The [hidden] attribute must always win, even over our flex layouts below —
   otherwise an "invisible" overlay (loading/error) still intercepts clicks. */
[hidden] { display:none !important; }
html { scroll-behavior:smooth; }
body {
  font-family:var(--font);
  background:var(--bg);
  color:var(--text);
  min-height:100vh;
  line-height:1.5;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}
a { color:inherit; }
.mono { font-family:var(--mono); }
button { font-family:inherit; cursor:pointer; border:none; background:none; color:inherit; }
img { display:block; }

/* ── Atmospheric background ───────────────────────────────────────── */
.bg-field { position:fixed; inset:0; z-index:-1; overflow:hidden; background:
  radial-gradient(120% 80% at 50% -10%, #0b1019 0%, var(--bg) 55%); }
.glow { position:absolute; border-radius:50%; filter:blur(120px); opacity:.5; }
.glow-ruby { width:50vw; height:50vw; top:-15vw; left:-10vw;
  background:radial-gradient(circle, rgba(255,59,92,.35), transparent 70%); animation:drift1 28s ease-in-out infinite; }
.glow-cyan { width:45vw; height:45vw; bottom:-12vw; right:-8vw;
  background:radial-gradient(circle, rgba(6,182,212,.30), transparent 70%); animation:drift2 32s ease-in-out infinite; }
@keyframes drift1 { 50% { transform:translate(8vw,6vh) scale(1.1); } }
@keyframes drift2 { 50% { transform:translate(-6vw,-5vh) scale(1.12); } }
.grid-lines { position:absolute; inset:0; opacity:.5;
  background-image:linear-gradient(rgba(148,163,184,.04) 1px,transparent 1px),
                   linear-gradient(90deg,rgba(148,163,184,.04) 1px,transparent 1px);
  background-size:64px 64px;
  mask-image:radial-gradient(120% 100% at 50% 0%, #000 30%, transparent 80%); }
.grain { position:absolute; inset:0; opacity:.035; mix-blend-mode:overlay;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E"); }

/* ════════════════════ LANDING ════════════════════ */
.landing { min-height:100vh; display:flex; flex-direction:column; align-items:center;
  justify-content:center; padding:48px 24px; text-align:center; }
.landing-inner { width:100%; max-width:760px; animation:rise .8s cubic-bezier(.2,.8,.2,1) both; }
@keyframes rise { from { opacity:0; transform:translateY(24px); } }

.brandmark { display:inline-flex; align-items:center; gap:10px; margin-bottom:40px;
  font-weight:700; letter-spacing:.18em; font-size:.8rem; }
.brandmark-text { color:var(--text); }
.brandmark-sub { color:var(--text2); letter-spacing:.1em; font-weight:500; }
/* DataBear Labs brand wordmark (swap for an <img class="brand-logo"> when a real logo is added) */
.brand-bear { font-weight:800; background:linear-gradient(100deg,var(--ruby),var(--cyan));
  -webkit-background-clip:text; background-clip:text; color:transparent; }
.brand-logo { height:20px; width:auto; vertical-align:middle; }
.brand-logo-lg { height:26px; }
.foot-brand { margin-top:10px; color:var(--text3); font-size:.82rem; letter-spacing:0; }
.foot-brand a { color:var(--cyan); text-decoration:none; }
.foot-brand a:hover { text-decoration:underline; }
.foot-copy { margin-top:6px; color:var(--text3); font-size:.72rem; letter-spacing:.02em; }
.pulse-dot { width:9px; height:9px; border-radius:50%; background:var(--ruby);
  box-shadow:0 0 0 0 rgba(255,59,92,.6); animation:pulse 2s infinite; }
@keyframes pulse { 70% { box-shadow:0 0 0 12px rgba(255,59,92,0); } 100% { box-shadow:0 0 0 0 rgba(255,59,92,0); } }

.hero-title { font-size:clamp(2.6rem,7vw,4.6rem); font-weight:800; line-height:1.02;
  letter-spacing:-.03em; margin-bottom:22px; }
.hero-title em { font-style:normal; background:linear-gradient(100deg,var(--ruby),var(--cyan));
  -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent; }
.hero-lede { color:#cbd5e1; font-size:clamp(1.12rem,2.4vw,1.34rem); line-height:1.62;
  max-width:600px; margin:0 auto 40px; font-weight:400; }
.hero-lede .mono { color:var(--cyan); font-weight:500; }

.search { width:100%; }
.search-pill { display:flex; align-items:center; gap:12px; padding:8px 8px 8px 20px;
  background:rgba(17,21,32,.85); border:1.5px solid var(--border2); border-radius:999px;
  backdrop-filter:blur(12px); transition:border-color .25s, box-shadow .25s; }
.search-pill:focus-within { border-color:var(--ruby);
  box-shadow:0 0 0 4px rgba(255,59,92,.12), 0 12px 40px rgba(255,59,92,.15); }
.search-icon { color:var(--text3); flex-shrink:0; }
.search-pill:focus-within .search-icon { color:var(--ruby); }
#search-input { flex:1; background:none; border:none; outline:none; color:var(--text);
  font-size:1.1rem; font-family:var(--font); min-width:0; }
#search-input::placeholder { color:var(--text3); }
.search-go { display:inline-flex; align-items:center; gap:8px; padding:13px 24px;
  background:linear-gradient(100deg,var(--ruby),var(--ruby2)); color:#fff; font-weight:700;
  border-radius:999px; font-size:1rem; white-space:nowrap; transition:transform .15s, box-shadow .2s; }
.search-go:hover { transform:translateY(-1px); box-shadow:0 8px 24px rgba(255,59,92,.4); }
.search-go:active { transform:translateY(0); }
.go-arrow { transition:transform .2s; }
.search-go:hover .go-arrow { transform:translateX(3px); }

.examples { display:flex; align-items:center; justify-content:center; gap:10px; margin-top:20px; flex-wrap:wrap; }
.ex-label { color:var(--text3); font-size:.8rem; text-transform:uppercase; letter-spacing:.15em; }
.chip { padding:7px 16px; border-radius:999px; background:rgba(255,255,255,.04);
  border:1px solid var(--border); color:var(--text2); font-size:.9rem; font-family:var(--mono);
  transition:all .2s; }
.chip:hover { border-color:var(--cyan); color:var(--cyan); background:rgba(6,182,212,.08); }

.landing-msg { margin-top:22px; min-height:24px; color:var(--amber); font-size:.95rem; }
.landing-msg.error { color:var(--red); }

.chooser { margin:32px auto 0; width:100%; text-align:left; animation:rise .4s both; }
.chooser-head { font-size:clamp(.78rem,2.6vw,.85rem); text-transform:uppercase; letter-spacing:.12em;
  color:var(--text2); margin-bottom:14px; text-align:center; }
/* minmax(0,1fr): without it the grid track defaults to min-width:auto and a long
   unbreakable string in a card (e.g. a channel URL in the description) blows the
   column wider than the viewport — which shifts/clips the whole centered page on
   mobile. minmax(0,...) lets the track shrink so cards stay within the column. */
.chooser-list { display:grid; gap:10px; grid-template-columns:minmax(0,1fr); }
.cand { display:flex; align-items:center; gap:16px; padding:14px 16px; text-align:left; min-width:0;
  background:var(--card); border:1px solid var(--border); border-radius:14px; transition:all .18s; width:100%; }
.cand:hover { border-color:var(--ruby); background:var(--card2); transform:translateX(3px); }
.cand img { width:52px; height:52px; border-radius:50%; flex-shrink:0; object-fit:cover; background:var(--bg2); }
.cand-body { flex:1; min-width:0; }
.cand-title { font-weight:700; font-size:1.05rem; }
.cand-handle { color:var(--cyan); font-family:var(--mono); font-size:.82rem; }
.cand-desc { color:var(--text3); font-size:.82rem; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; margin-top:2px; overflow-wrap:anywhere; }
.cand-stats { text-align:right; flex-shrink:0; font-family:var(--mono); }
.cand-stats b { display:block; color:var(--text); font-size:1.05rem; }
.cand-stats span { color:var(--text3); font-size:.72rem; }

.landing-foot { margin-top:auto; padding-top:48px; color:#64748b; font-size:.82rem; }

/* ════════════════════ LOADING ════════════════════ */
.loading { position:fixed; inset:0; display:flex; align-items:center; justify-content:center; z-index:50; }
.loading-card { text-align:center; animation:rise .4s both; width:min(420px,90vw); }
.loading-avatar { width:84px; height:84px; border-radius:50%; margin:0 auto 18px;
  background:var(--card2); background-size:cover; background-position:center;
  border:2px solid var(--border2); box-shadow:0 0 30px rgba(6,182,212,.25); }
.loading-name { font-weight:700; font-size:1.3rem; margin-bottom:20px; }
.scan { width:100%; height:3px; background:var(--border); border-radius:2px; overflow:hidden; margin-bottom:18px; }
.scan span { display:block; height:100%; width:40%;
  background:linear-gradient(90deg,transparent,var(--cyan),transparent); animation:scan 1.1s ease-in-out infinite; }
@keyframes scan { 0% { transform:translateX(-100%); } 100% { transform:translateX(350%); } }
.loading-steps { color:var(--text2); font-family:var(--mono); font-size:.85rem; min-height:22px; }

/* ════════════════════ DASHBOARD SHELL ════════════════════ */
.app { max-width:1180px; margin:0 auto; padding:0 24px 80px; animation:rise .5s both; }
.topbar { position:sticky; top:0; z-index:30; display:flex; align-items:center; gap:20px;
  padding:18px 0; background:linear-gradient(var(--bg),rgba(6,8,13,.6)); backdrop-filter:blur(10px); flex-wrap:wrap; }
.topbar-brand { display:inline-flex; align-items:center; gap:8px; background:none; border:none; cursor:pointer;
  font-weight:800; font-size:.98rem; letter-spacing:.03em; padding:0 18px 0 0; border-right:1px solid var(--border2); }
.topbar-brand:hover .brand-bear { filter:brightness(1.15); }
.back-btn { color:var(--text3); font-family:var(--mono); font-size:.82rem; transition:color .2s; }
.back-btn:hover { color:var(--ruby); }
.topbar-channel { display:flex; align-items:center; gap:14px; flex:1; min-width:200px; }
.ch-avatar { width:54px; height:54px; border-radius:50%; border:2px solid var(--border2); object-fit:cover; background:var(--card2); }
.ch-name { font-weight:800; font-size:1.35rem; letter-spacing:-.01em; }
.ch-handle { color:var(--cyan); font-size:.82rem; }
.topbar-stats { display:flex; gap:26px; }
.topbar-stats .st { text-align:right; }
.topbar-stats .st b { display:block; font-family:var(--mono); font-size:1.15rem; font-weight:700; }
.topbar-stats .st span { color:var(--text3); font-size:.7rem; text-transform:uppercase; letter-spacing:.1em; }

.tabs { display:flex; gap:4px; position:sticky; top:90px; z-index:29; padding:6px;
  background:var(--bg2); border:1px solid var(--border); border-radius:14px; margin-bottom:8px;
  overflow-x:auto; }
.tab { padding:10px 22px; border-radius:9px; color:var(--text2); font-weight:600; font-size:.95rem;
  white-space:nowrap; transition:all .18s; }
.tab:hover { color:var(--text); }
.tab.active { background:linear-gradient(100deg,var(--ruby),var(--ruby2)); color:#fff;
  box-shadow:0 4px 14px rgba(255,59,92,.3); }

.scope-strip { color:var(--text3); font-size:.8rem; font-family:var(--mono); padding:10px 4px 18px; }
.scope-strip b { color:var(--text2); }
/* Report-window date range — highlighted so the user sees the period at a glance. */
.scope-period { font-family:var(--mono); font-weight:700; color:var(--cyan);
  background:rgba(6,182,212,.12); border:1px solid rgba(6,182,212,.32);
  padding:2px 9px; border-radius:7px; letter-spacing:.02em; white-space:nowrap; }
.scope-period::before { content:"📅 "; }

.pages { display:block; }
.page { display:none; animation:fade .35s both; }
.page.active { display:block; }
@keyframes fade { from { opacity:0; transform:translateY(8px); } }

/* ── shared building blocks ── */
.card { background:linear-gradient(160deg,var(--card),var(--card2)); border:1px solid var(--border);
  border-radius:var(--r); padding:24px; }
.section-title { font-size:.78rem; text-transform:uppercase; letter-spacing:.16em; color:var(--text3);
  margin-bottom:16px; display:flex; align-items:center; gap:10px; }
.section-title::before { content:""; width:18px; height:2px; background:var(--ruby); border-radius:2px; }
.grid { display:grid; gap:18px; }
.g2 { grid-template-columns:repeat(2,1fr); }
.g3 { grid-template-columns:repeat(3,1fr); }
.g4 { grid-template-columns:repeat(4,1fr); }
.empty { color:var(--text3); font-style:italic; padding:18px; text-align:center; font-size:.9rem; }
.tag { display:inline-block; padding:3px 9px; border-radius:6px; font-size:.7rem; font-weight:700;
  letter-spacing:.03em; text-transform:uppercase; }

/* Overview hero / health gauge */
.hero { display:grid; grid-template-columns:260px 1fr; gap:28px; align-items:center;
  border:1.5px solid rgba(6,182,212,.3); box-shadow:0 0 40px rgba(6,182,212,.1); margin-bottom:18px; }
.gauge-wrap { text-align:center; }
.gauge { position:relative; width:200px; height:200px; margin:0 auto; }
/* The gauge SVG is emitted with inline width/height="200" (gaugeSVG in app.js).
   Force it to fill .gauge so it follows the container's responsive shrink instead
   of overflowing it on mobile. Desktop is unchanged: 200px container -> 200px SVG. */
.gauge svg { display:block; width:100%; height:100%; }
.gauge-num { position:absolute; inset:0; display:flex; flex-direction:column; align-items:center; justify-content:center; }
.gauge-num b { font-family:var(--mono); font-size:3rem; font-weight:700; line-height:1; }
.gauge-num span { color:var(--text3); font-size:.72rem; text-transform:uppercase; letter-spacing:.14em; margin-top:4px; }
.verdict { display:inline-block; margin-top:14px; padding:6px 16px; border-radius:999px; font-weight:700;
  font-size:.85rem; text-transform:capitalize; }
.verdict.growing { background:rgba(16,185,129,.14); color:var(--emerald); }
.verdict.stable { background:rgba(245,158,11,.14); color:var(--amber); }
.verdict.needs { background:rgba(239,68,68,.14); color:var(--red); }
/* Explains the subscriber-scaled Health targets (why the bars aren't round numbers, and that big
   channels get a higher reach bar + lower engagement bar). */
.scale-note { margin-top:14px; padding:12px 14px; border-radius:10px; background:rgba(6,182,212,.07);
  border:1px solid rgba(6,182,212,.22); color:var(--text2); font-size:.82rem; line-height:1.55; }
.scale-note b { color:var(--text); font-weight:600; }
/* "How to reach 100" — actionable levers for each under-max health component. Emerald
   (growth) accent to distinguish it from the cyan scale-note above it. */
.health-suggest { margin-top:14px; padding:13px 15px; border-radius:10px; background:rgba(16,185,129,.07);
  border:1px solid rgba(16,185,129,.22); color:var(--text2); font-size:.82rem; line-height:1.55; }
.hs-title { font-weight:700; color:var(--text); font-size:.88rem; margin-bottom:10px; }
.hs-list { list-style:none; display:grid; gap:11px; }
.hs-list li { border-left:2px solid rgba(16,185,129,.4); padding-left:11px; }
.hs-list b { color:var(--text); font-weight:600; }
/* label + aim share a row that wraps: on desktop they sit side by side; on a phone the
   aim drops to its own line instead of overflowing (the old nowrap span was the mess). */
.hs-head { display:flex; flex-wrap:wrap; align-items:baseline; gap:2px 10px; }
.hs-aim { font-family:var(--mono); color:var(--emerald); font-size:.74rem; }
.hs-now { color:var(--text3); }
.hs-tip { color:var(--text3); margin-top:4px; font-size:.8rem; }
.hs-foot { margin-top:11px; padding-top:9px; border-top:1px solid rgba(16,185,129,.18); color:var(--text3); font-size:.74rem; }
.health-suggest.hs-max { color:var(--text2); font-weight:500; }
/* Hidden-likes caveat — shown on every like-based metric area, but only when this channel hides its
   like count (so the deflated engagement / 0% like rate isn't read as real). Amber = caveat. */
.likes-note { margin-top:14px; padding:10px 14px; border-radius:10px; background:rgba(245,158,11,.08);
  border:1px solid rgba(245,158,11,.24); color:var(--text2); font-size:.8rem; line-height:1.5; }
.likes-note b { color:var(--text); font-weight:600; }
/* Benchmark anchor under the gauge: reframes "X / 100" as a benchmark, not a grade. */
.health-anchor { margin:12px auto 0; max-width:300px; color:var(--text3); font-size:.74rem; line-height:1.5; }
.health-anchor b { color:var(--text2); font-family:var(--mono); }
.health-parts { display:grid; gap:14px; }
.hpart-head { display:flex; justify-content:space-between; align-items:baseline; margin-bottom:6px; }
.hpart-head b { font-weight:600; font-size:.95rem; }
.hpart-head .pts { font-family:var(--mono); color:var(--text2); font-size:.85rem; }
.hpart-bar { height:8px; background:var(--bg2); border-radius:4px; overflow:hidden; }
.hpart-bar i { display:block; height:100%; border-radius:4px; background:linear-gradient(90deg,var(--cyan),var(--ruby)); }
.hpart-meta { color:var(--text3); font-size:.78rem; margin-top:5px; }

/* KPI tiles */
.kpi { padding:20px; }
.kpi .label { color:var(--text3); font-size:.72rem; text-transform:uppercase; letter-spacing:.12em; }
.kpi .val { font-family:var(--mono); font-size:1.9rem; font-weight:700; margin-top:6px; }
.kpi .val.ruby { color:var(--ruby); } .kpi .val.cyan { color:var(--cyan); }
.kpi .val.emerald { color:var(--emerald); } .kpi .val.amber { color:var(--amber); }
.kpi .sub { color:var(--text3); font-size:.78rem; margin-top:4px; }

/* What's working strip */
.ww { display:flex; gap:14px; align-items:flex-start; }
.ww .ww-ico { font-size:1.4rem; }
.ww b { display:block; font-size:1.05rem; }
.ww span { color:var(--text2); font-size:.85rem; }
.ww em { font-style:normal; color:var(--cyan); font-family:var(--mono); }
/* Most-viewed video card in the What's Working strip (thumbnail instead of an icon). */
.ww-video { text-decoration:none; color:inherit; transition:border-color .18s, transform .15s; }
.ww-video:hover { border-color:var(--cyan); transform:translateY(-1px); }
.ww-vthumb { width:88px; height:50px; border-radius:7px; object-fit:cover; flex-shrink:0; background:var(--bg2); }
.ww-vtitle { font-size:.95rem; line-height:1.22; display:-webkit-box; -webkit-line-clamp:2;
  -webkit-box-orient:vertical; overflow:hidden; }

/* Health explanation caption */
.health-explain { margin-top:16px; padding-top:14px; border-top:1px solid var(--border);
  color:var(--text2); font-size:.82rem; line-height:1.55; }
.health-explain b { color:var(--text); font-weight:600; }

/* KPI period-over-period delta */
.kpi-delta { display:inline-flex; align-items:baseline; gap:5px; margin-top:6px;
  font-family:var(--mono); font-size:.82rem; font-weight:700; }
.kpi-delta span { color:var(--text3); font-weight:400; font-family:var(--font); font-size:.74rem; }
.kpi-delta.up { color:var(--emerald); }
.kpi-delta.down { color:var(--red); }
.kpi-delta.neutral { color:var(--text3); }
.kpi .sub { margin-top:5px; }
.delta-note { color:var(--text3); font-size:.78rem; line-height:1.5; margin-top:12px; }
.delta-note b { color:var(--text2); }

/* Monthly momentum line chart */
.section-title.bright { color:#fff; }
.st-note { color:#fff; text-transform:none; letter-spacing:0; font-size:.74rem; font-weight:400; }
.lc-scroll { width:100%; }
.linechart { width:100%; height:auto; display:block; margin-top:6px; }
.lc-line { fill:none; stroke:url(#lcline); stroke-width:2.5; stroke-linejoin:round; stroke-linecap:round; }
.lc-area { fill:url(#lcfill); }
.lc-dot { fill:var(--ruby); stroke:var(--bg); stroke-width:2; pointer-events:none; }
.lc-dot.prov { fill:var(--bg2); stroke:var(--text3); }
.lc-line, .lc-area { pointer-events:none; }
.lc-grid { stroke:var(--border); stroke-width:1; }
.lc-ylbl { fill:var(--text3); font-size:13px; font-family:var(--mono); }
.lc-xlbl { fill:var(--text2); font-size:13px; font-family:var(--mono); }
.lc-vlbl { fill:var(--cyan); font-size:15px; font-weight:700; font-family:var(--mono); }
.lc-band { fill:transparent; cursor:crosshair; }
.lc-guide { stroke:var(--cyan); stroke-width:1.5; stroke-dasharray:4 5; opacity:.55; pointer-events:none; }
.lc-active { fill:var(--cyan); stroke:var(--bg); stroke-width:2.5; pointer-events:none;
  filter:drop-shadow(0 0 6px rgba(6,182,212,.8)); }

/* Momentum hover tooltip (follows cursor; informational, so pointer-events off) */
.lc-tip { position:fixed; z-index:200; width:300px; pointer-events:none;
  background:rgba(12,15,24,.97); border:1px solid var(--border2); border-radius:13px;
  padding:14px; box-shadow:0 16px 44px rgba(0,0,0,.6); backdrop-filter:blur(10px); }
.lc-tip-head { font-weight:700; font-size:.98rem; display:flex; align-items:center; gap:8px; }
.lc-tip-prov { font-weight:500; font-size:.64rem; text-transform:uppercase; letter-spacing:.06em;
  color:var(--text3); border:1px solid var(--border2); border-radius:5px; padding:1px 6px; }
.lc-tip-vpd { font-family:var(--mono); font-size:1.55rem; font-weight:700; color:var(--cyan); margin-top:6px; line-height:1; }
.lc-tip-vpd span { font-family:var(--font); font-size:.72rem; font-weight:400; color:var(--text3); }
.lc-tip-sub { color:var(--text3); font-size:.78rem; margin-top:3px; }
.lc-tip-vlabel { color:var(--ruby); font-size:.62rem; text-transform:uppercase; letter-spacing:.1em;
  font-weight:700; margin-top:13px; padding-top:11px; border-top:1px solid var(--border); }
.lc-tip-video { display:flex; gap:9px; align-items:center; margin-top:9px; text-decoration:none; color:inherit; }
.lc-tip-rank { font-family:var(--mono); font-weight:700; font-size:.8rem; color:var(--text3); width:14px; flex-shrink:0; }
.lc-tip-video img { width:74px; height:42px; border-radius:5px; object-fit:cover; flex-shrink:0; background:var(--bg2); }
.lc-tip-vbody { min-width:0; }
.lc-tip-vtitle { font-size:.8rem; line-height:1.25; display:-webkit-box; -webkit-line-clamp:2;
  -webkit-box-orient:vertical; overflow:hidden; }
.lc-tip-vviews { font-family:var(--mono); font-size:.72rem; color:var(--text2); margin-top:2px; }
.lc-tip-vviews .lc-tip-vtot { opacity:.6; }

/* horizontal ranking bars (duration, hooks, day/hour) */
.rank-row { display:grid; grid-template-columns:140px 1fr auto; gap:14px; align-items:center; padding:9px 0; }
.rank-row .rl { font-size:.9rem; color:var(--text2); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.rank-track { height:26px; background:var(--bg2); border-radius:7px; overflow:hidden; }
.rank-fill { height:100%; border-radius:7px; display:flex; align-items:center; padding-left:10px;
  font-family:var(--mono); font-size:.78rem; color:#04121a; font-weight:700; min-width:fit-content; }
.rank-row .rv { font-family:var(--mono); font-size:.85rem; color:var(--text2); white-space:nowrap; }

/* Day-of-week column (vertical bar) chart (Timing page) */
.colchart { display:flex; align-items:flex-end; gap:10px; padding-top:10px; }
.colchart .col { flex:1; min-width:0; display:flex; flex-direction:column; align-items:center; gap:7px; }
.col-val { font-family:var(--mono); font-size:.74rem; font-weight:700; color:var(--text2); white-space:nowrap; min-height:1em; }
.col-bar-wrap { width:100%; height:160px; display:flex; align-items:flex-end; justify-content:center; }
.col-bar { width:72%; max-width:48px; min-height:3px; border-radius:6px 6px 0 0; transition:height .3s cubic-bezier(.2,.8,.2,1); }
.col-lbl { font-family:var(--mono); font-size:.75rem; color:var(--text3); }

/* Heatmap */
.heat { display:grid; grid-template-columns:auto repeat(12,1fr); gap:4px; }
.heat-cell { aspect-ratio:1.5/1; border-radius:5px; background:var(--bg2); position:relative; cursor:default; transition:transform .12s;
  display:flex; align-items:center; justify-content:center; font-family:var(--mono); font-size:.62rem; color:rgba(255,255,255,.82); }
.heat-cell:hover { transform:scale(1.12); z-index:2; box-shadow:0 4px 14px rgba(0,0,0,.5); }
.heat-cell.peak { outline:2px solid var(--gold); outline-offset:-2px;
  box-shadow:0 0 0 2px var(--gold), 0 0 12px rgba(251,191,36,.55); font-weight:700; color:#fff; }
.heat-cell[data-tip]:hover::after { content:attr(data-tip); position:absolute; bottom:120%; left:50%;
  transform:translateX(-50%); background:#000; color:#fff; padding:5px 9px; border-radius:6px;
  font-size:.7rem; font-family:var(--mono); white-space:nowrap; z-index:5; border:1px solid var(--border2); }
.heat-corner, .heat-daylbl, .heat-hrlbl { color:var(--text3); font-size:.68rem; font-family:var(--mono);
  display:flex; align-items:center; justify-content:center; }
.heat-daylbl { justify-content:flex-end; padding-right:8px; }
/* Heatmap legend — explains the gold best-slot marker + the cyan->ruby colour scale */
.heat-legend { display:flex; flex-wrap:wrap; gap:9px 22px; margin-top:16px; padding-top:14px;
  border-top:1px solid var(--border); font-size:.76rem; color:var(--text3); }
.heat-legend-item { display:inline-flex; align-items:center; gap:8px; }
.heat-legend-item b { color:var(--text2); }
.heat-key-peak { width:18px; height:13px; border-radius:3px; background:var(--bg2); flex-shrink:0;
  outline:2px solid var(--gold); outline-offset:-2px; box-shadow:0 0 6px rgba(251,191,36,.5); }
.heat-key-scale { width:84px; height:11px; border-radius:3px; flex-shrink:0;
  background:linear-gradient(90deg, rgb(6,182,212), rgb(255,59,92)); }

/* best-slot hero */
.slot-hero { display:flex; align-items:center; gap:24px; }
.slot-big { font-family:var(--mono); }
.slot-big b { font-size:2.4rem; display:block; color:var(--cyan); }
.slot-big span { color:var(--text3); font-size:.8rem; }

/* ── Timing page: metric def, slicer, hero, top-slots ── */
.metric-def { display:flex; gap:14px; align-items:flex-start; }
.metric-def .md-icon { font-size:1.3rem; line-height:1.4; flex-shrink:0; }
.metric-def .md-label { font-size:.62rem; text-transform:uppercase; letter-spacing:.16em; color:var(--ruby); font-weight:700; margin-bottom:4px; }
.metric-def b { color:var(--text); }

.slicer { margin-top:18px; }
.slicer-row { display:flex; gap:16px; align-items:flex-end; flex-wrap:wrap; }
.slicer-field { display:flex; flex-direction:column; gap:4px; }
.slicer-field label { font-size:.62rem; font-weight:700; text-transform:uppercase; letter-spacing:.1em; color:var(--text3); }
.slicer-field input[type=date] { background:var(--bg2); border:1px solid var(--border2); color:var(--text);
  padding:7px 10px; border-radius:8px; font-size:.78rem; font-family:var(--mono); outline:none; color-scheme:dark; }
.slicer-field input[type=date]:focus { border-color:var(--ruby); }
.slicer-presets { display:flex; gap:6px; flex-wrap:wrap; margin-left:auto; }
.slicer-presets button { background:var(--bg2); border:1px solid var(--border2); color:var(--text2);
  padding:7px 13px; border-radius:8px; font-size:.72rem; font-weight:700; cursor:pointer; transition:all .15s; }
.slicer-presets button:hover { border-color:var(--ruby); }
.slicer-presets button.active { background:linear-gradient(100deg,var(--ruby),var(--ruby2)); border-color:var(--ruby); color:#fff; }
.slicer-note { color:var(--text3); font-size:.78rem; line-height:1.5; margin-top:12px; }
.slicer-note b { color:var(--text2); }

.tm-badge { font-family:var(--mono); font-size:.6rem; letter-spacing:.08em; color:var(--ruby);
  border:1px solid var(--border2); border-radius:5px; padding:2px 7px; margin-left:8px; }
.tm-badge.muted { color:var(--text3); }
.tm-hero { display:flex; align-items:stretch; gap:22px; }
.tm-hero-body { flex:1 1 auto; min-width:0; align-self:center; }
.tm-hero-clock { font-size:3.4rem; line-height:1; align-self:center; }
.tm-hero-slot { font-family:var(--mono); font-size:2rem; font-weight:900; color:var(--ruby); }
.tm-hero-line { color:var(--text2); font-size:.92rem; margin-top:6px; }
.tm-hero-line b { color:var(--cyan); font-family:var(--mono); }
.tm-hero-verdict { color:var(--text3); font-size:.82rem; margin-top:8px; }
/* Proof cards — actual videos that won in the best slot, fills the hero's empty side. */
/* A self-contained right-hand PANEL: stretches to the hero's full height (so it
   always matches the box by construction, not by pixel-tweaking) with its cards
   vertically centered, separated by a divider. */
.tm-proof { margin-left:auto; max-width:360px; align-self:stretch; display:flex; flex-direction:column;
  gap:11px; justify-content:center; padding-left:22px; border-left:1px solid var(--border); }
.tm-proof-label { font-size:.64rem; text-transform:uppercase; letter-spacing:.1em; color:var(--gold); font-weight:700; }
.tm-proof-vid { display:flex; gap:12px; align-items:center; text-decoration:none; color:inherit;
  background:var(--bg2); border:1px solid var(--border); border-radius:11px; padding:9px; transition:border-color .15s, transform .15s; }
.tm-proof-vid:hover { border-color:var(--cyan); transform:translateY(-1px); }
.tm-proof-vid img { width:124px; height:70px; border-radius:7px; object-fit:cover; flex-shrink:0; background:var(--card2); }
.tm-proof-meta { min-width:0; }
.tm-proof-title { font-size:.86rem; line-height:1.25; color:var(--text);
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
.tm-proof-vpd { font-family:var(--mono); font-size:.8rem; color:var(--cyan); font-weight:700; margin-top:5px; }

.heat-layout { display:flex; gap:22px; align-items:flex-start; flex-wrap:wrap; }
.top-slots { flex:0 0 210px; }
.top-slots-title { font-size:.7rem; text-transform:uppercase; letter-spacing:.1em; color:var(--text3); font-weight:700; margin-bottom:10px; }
.top-slot-row { display:flex; align-items:center; gap:10px; padding:8px 0; border-bottom:1px solid var(--border); }
.top-slot-row:last-child { border-bottom:none; }
.top-slot-rank { width:20px; height:20px; flex-shrink:0; border-radius:6px; background:var(--bg2); color:var(--text2);
  font-family:var(--mono); font-size:.72rem; font-weight:700; display:flex; align-items:center; justify-content:center; }
.top-slot-row:first-child .top-slot-rank { background:linear-gradient(100deg,var(--ruby),var(--ruby2)); color:#fff; }
.top-slot-time { font-family:var(--mono); font-size:.82rem; color:var(--text); flex:1; }
.top-slot-vpd { font-family:var(--mono); font-size:.85rem; color:var(--cyan); font-weight:700; white-space:nowrap; }
.top-slot-vpd span { color:var(--text3); font-weight:400; font-size:.62rem; }
.top-slots-empty { color:var(--text3); font-size:.78rem; font-style:italic; padding:12px 0; }
.tm-note { color:var(--text3); font-size:.8rem; margin-top:14px; padding-top:12px; border-top:1px solid var(--border); }
.tm-note b { color:var(--cyan); }

/* combos */
.combo { padding:16px; border-radius:12px; background:var(--card2); border:1px solid var(--border); }
.combo-keys { font-size:.92rem; margin-bottom:10px; }
.combo-keys b { color:var(--text); }
.combo-stats { display:flex; gap:16px; font-family:var(--mono); font-size:.82rem; color:var(--text2); }
.combo-legend { display:grid; gap:9px; margin:2px 0 18px; padding:14px 16px; border:1px solid var(--border); border-radius:10px; }
.combo-legend .cl-row { display:flex; align-items:center; gap:12px; font-size:.82rem; }
.combo-legend .tag { flex-shrink:0; min-width:120px; text-align:center; }
.combo-legend .cl-desc { color:var(--text3); }
.combo-legend .cl-note { color:var(--text3); font-size:.76rem; font-style:italic; margin-top:3px; }
.v-viral { background:rgba(255,59,92,.16); color:var(--ruby); }
.v-hit { background:rgba(16,185,129,.16); color:var(--emerald); }
.v-gem { background:rgba(6,182,212,.16); color:var(--cyan); }
.v-rising { background:rgba(245,158,11,.16); color:var(--amber); }
.v-under { background:rgba(239,68,68,.14); color:var(--red); }

/* gems */
.gem { padding:16px; border-radius:12px; background:var(--card2); border:1px solid var(--border);
  display:flex; gap:14px; }
.gem img { width:120px; height:68px; border-radius:8px; object-fit:cover; flex-shrink:0; background:var(--bg2); }
.gem-body { min-width:0; flex:1; }
.gem-title { font-size:.92rem; font-weight:600; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
.gem-mult { display:flex; gap:14px; margin-top:8px; font-family:var(--mono); font-size:.78rem; }
.gem-mult .up { color:var(--emerald); } .gem-mult .down { color:var(--amber); }

/* audience */
.donut-wrap { display:flex; align-items:center; gap:24px; }
.sent-legend { display:grid; gap:10px; }
.sent-legend .row { display:flex; align-items:center; gap:10px; font-size:.9rem; }
.sent-legend .dot { width:11px; height:11px; border-radius:50%; }
.sent-note { color:var(--text3); font-size:.78rem; line-height:1.5; margin-top:16px; padding-top:14px; border-top:1px solid var(--border); }
.sent-note b { color:var(--text2); font-weight:600; }
.fan-summary { color:var(--text3); font-size:.82rem; margin-bottom:14px; }
.fan-summary b { color:var(--text2); font-family:var(--mono); }
.fan-grid { display:grid; grid-template-columns:repeat(2,1fr); gap:12px; }
.fan-card { background:var(--bg2); border:1px solid var(--border); border-radius:10px; padding:12px 14px; }
.fan-head { display:flex; align-items:center; gap:9px; }
.fan-rank { font-family:var(--mono); color:var(--text3); min-width:20px; }
.fan-name { flex:1; font-weight:600; font-size:.92rem; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.fan-tag { font-size:.66rem; color:var(--emerald); background:rgba(16,185,129,.12); border:1px solid rgba(16,185,129,.3);
  padding:2px 7px; border-radius:999px; white-space:nowrap; }
.fan-bar { height:5px; background:rgba(255,255,255,.06); border-radius:3px; overflow:hidden; margin:9px 0; }
.fan-bar i { display:block; height:100%; border-radius:3px; background:linear-gradient(90deg,var(--cyan),var(--ruby)); }
.fan-stats { display:flex; flex-wrap:wrap; gap:4px 14px; font-size:.76rem; color:var(--text3); }
.fan-stats b { color:var(--text2); font-family:var(--mono); }
.fan-quote { margin-top:9px; padding-top:9px; border-top:1px solid var(--border); font-size:.82rem; color:var(--text2);
  line-height:1.45; display:flex; gap:8px; justify-content:space-between; }
.fan-quote-likes { font-family:var(--mono); font-size:.72rem; color:var(--ruby); white-space:nowrap; }
@media (max-width:640px){ .fan-grid { grid-template-columns:1fr; } }
.q-item { padding:10px 0; border-bottom:1px solid var(--border); font-size:.92rem; }
.q-item:last-child { border:none; }
.q-item .qc { font-family:var(--mono); color:var(--cyan); font-size:.75rem; }
/* Common phrases — two columns to keep the card compact; phrase in the wide cell, count
   in .rv. A .rank-row modifier (NOT the stock 140px-label .rank-row, which clips the phrase). */
.phrase-grid { display:grid; grid-template-columns:1fr 1fr; gap:0 22px; }
.rank-row.phrase { grid-template-columns:1fr auto; gap:10px; padding:6px 0; }
.rank-row.phrase .phrase-text { font-size:.9rem; color:var(--text); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.sub-title { margin-top:16px; margin-bottom:2px; font-size:.78rem; color:var(--text3); text-transform:uppercase; letter-spacing:.06em; }
.section-title + .sub-title { margin-top:6px; }
/* Top reactions — emoji chip strip */
.emoji-strip { display:flex; flex-wrap:wrap; gap:10px; padding:8px 0 2px; }
.emoji-chip { display:inline-flex; align-items:center; gap:7px; padding:6px 11px; background:var(--card2); border:1px solid var(--border); border-radius:999px; }
.ec-glyph { font-size:1.25rem; line-height:1; }
.ec-count { font-family:var(--mono); font-size:.78rem; color:var(--text2); }
.qt { padding:14px; border-radius:12px; background:var(--card2); border:1px solid var(--border); }
.qt .qt-text { font-size:.9rem; }
.qt .qt-meta { display:flex; justify-content:space-between; margin-top:8px; color:var(--text3); font-size:.76rem; font-family:var(--mono); }
.qt .qt-meta .likes { color:var(--ruby); }

/* videos table */
.vt-controls { display:flex; gap:10px; margin-bottom:14px; flex-wrap:wrap; align-items:center; }
.vt-controls input, .vt-controls select { background:var(--card); border:1px solid var(--border); color:var(--text);
  padding:9px 14px; border-radius:10px; font-family:var(--font); font-size:.9rem; outline:none; }
.vt-controls input:focus, .vt-controls select:focus { border-color:var(--cyan); }
.vt-controls input { flex:1; min-width:180px; }
/* Velocity legend — explains the per-video views/day tiers above the table. */
.vt-legend { display:flex; flex-wrap:wrap; align-items:center; gap:8px 14px; margin-bottom:14px;
  color:var(--text3); font-size:.8rem; }
.vt-legend-lead { color:var(--text2); }
.vt-legend-lead b { color:var(--text); }
.vt-legend-item { display:inline-flex; align-items:center; gap:6px; font-family:var(--mono); }
.vtable { width:100%; border-collapse:collapse; font-size:.88rem; }
.vtable th { text-align:right; padding:11px 12px; color:var(--text3); font-size:.7rem; text-transform:uppercase;
  letter-spacing:.08em; border-bottom:1px solid var(--border2); cursor:pointer; white-space:nowrap; user-select:none; }
.vtable th.l, .vtable td.l { text-align:left; }
.vtable th:hover { color:var(--cyan); }
.vtable th.sorted::after { content:" ▾"; color:var(--ruby); }
.vtable th.sorted.asc::after { content:" ▴"; }
.vtable td { padding:11px 12px; text-align:right; border-bottom:1px solid var(--border); font-family:var(--mono); color:var(--text2); white-space:nowrap; }
.vtable tr:hover td { background:rgba(255,255,255,.02); }
.vt-title { color:var(--text); font-family:var(--font); max-width:340px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.vt-title a:hover { color:var(--cyan); }
.gem-flag { color:var(--cyan); }
.vel { padding:2px 8px; border-radius:6px; font-size:.72rem; font-family:var(--font); font-weight:600; }
.vel-Top { background:rgba(255,59,92,.16); color:var(--ruby); }
.vel-Above { background:rgba(16,185,129,.16); color:var(--emerald); }
.vel-Average { background:rgba(6,182,212,.16); color:var(--cyan); }
.vel-Below { background:rgba(245,158,11,.14); color:var(--amber); }
.vel-Low { background:rgba(71,85,105,.2); color:var(--text3); }

.app-foot { text-align:center; color:var(--text3); font-size:.78rem; margin-top:40px; padding-top:24px; border-top:1px solid var(--border); }

/* ════════════════════ ERROR ════════════════════ */
.error-screen { position:fixed; inset:0; display:flex; align-items:center; justify-content:center; padding:24px; z-index:60; }
.error-card { text-align:center; max-width:440px; }
.error-icon { width:64px; height:64px; border-radius:50%; margin:0 auto 20px; display:flex; align-items:center;
  justify-content:center; font-size:2rem; font-weight:800; background:rgba(239,68,68,.12); color:var(--red);
  border:1.5px solid rgba(239,68,68,.3); }
.error-title { font-size:1.5rem; font-weight:800; margin-bottom:10px; }
.error-msg { color:var(--text2); margin-bottom:24px; }
#error-back { display:inline-flex; }

/* Quota-limit popup (fires on any 429/quotaExceeded API error) */
.modal-overlay { position:fixed; inset:0; z-index:100; display:flex; align-items:center; justify-content:center;
  padding:24px; background:rgba(6,8,13,.72); backdrop-filter:blur(6px); animation:modalFade .2s ease; }
.modal-overlay[hidden] { display:none; }
.modal-card { max-width:440px; text-align:center; background:linear-gradient(160deg,var(--card),var(--card2));
  border:1px solid var(--border2); border-radius:18px; padding:34px 30px; box-shadow:0 24px 70px rgba(0,0,0,.6);
  animation:modalPop .24s cubic-bezier(.2,.8,.2,1); }
.modal-icon { width:64px; height:64px; border-radius:50%; margin:0 auto 18px; display:flex; align-items:center;
  justify-content:center; font-size:2rem; background:rgba(245,158,11,.12); border:1.5px solid rgba(245,158,11,.32); }
.modal-title { font-size:1.45rem; font-weight:800; margin-bottom:10px; }
.modal-msg { color:var(--text2); line-height:1.55; margin-bottom:24px; font-size:.95rem; }
#quota-close { display:inline-flex; }
@keyframes modalFade { from { opacity:0; } to { opacity:1; } }
@keyframes modalPop { from { opacity:0; transform:translateY(10px) scale(.97); } to { opacity:1; transform:none; } }

/* ── "How it's calculated" methodology modal ── */
.method-btn { color:var(--cyan); font-family:var(--mono); font-size:.78rem; border:1px solid var(--border2);
  border-radius:8px; padding:5px 11px; transition:all .18s; white-space:nowrap; }
.method-btn:hover { border-color:var(--cyan); background:rgba(6,182,212,.08); }
.method-card { max-width:640px; width:100%; text-align:left; position:relative;
  max-height:85vh; overflow-y:auto; padding:30px 30px 26px; }
.method-close { position:absolute; top:14px; right:14px; font-size:1.6rem; line-height:1; color:var(--text3);
  width:34px; height:34px; border-radius:8px; display:flex; align-items:center; justify-content:center; transition:all .15s; }
.method-close:hover { color:var(--text); background:rgba(255,255,255,.06); }
.method-title { font-size:1.4rem; font-weight:800; margin-bottom:8px; padding-right:34px; }
.method-intro { color:var(--text2); font-size:.86rem; line-height:1.55; margin-bottom:20px;
  padding-bottom:18px; border-bottom:1px solid var(--border); }
.method-intro b { color:var(--text); }
.method-sec { margin-bottom:22px; }
.method-sec:last-child { margin-bottom:0; }
.method-sec-head { font-size:.74rem; text-transform:uppercase; letter-spacing:.14em; color:var(--ruby);
  font-weight:700; margin-bottom:12px; display:flex; align-items:baseline; gap:8px; flex-wrap:wrap; }
.method-sec-sub { color:var(--text3); text-transform:none; letter-spacing:0; font-weight:400; font-size:.78rem; }
.method-sec-sub b { color:var(--text2); }
.method-row { margin-bottom:14px; }
.method-row:last-child { margin-bottom:0; }
.method-row > b { font-size:.92rem; color:var(--text); margin-right:10px; }
.method-formula { display:inline-block; font-family:var(--mono); font-size:.8rem; color:var(--cyan);
  background:rgba(6,182,212,.1); border:1px solid rgba(6,182,212,.25); border-radius:6px; padding:2px 9px; }
.method-note { color:var(--text3); font-size:.8rem; line-height:1.5; margin-top:6px; }
.method-note b { color:var(--text2); }
.method-note i { color:var(--text2); font-style:italic; }
.method-tiers { display:flex; flex-wrap:wrap; gap:8px 14px; margin-bottom:10px; }
.method-tier { display:inline-flex; align-items:center; gap:7px; font-family:var(--mono); font-size:.8rem; color:var(--text2); }

/* ── responsive ──
   Body has overflow-x:hidden (line 33) which CLIPS horizontal overflow rather
   than fixing it — so every surface that can exceed a phone's width (the 12-col
   heatmap, the videos table) gets its OWN overflow-x:auto + min-width below.
   Don't rely on the body clip; it silently cuts content off. */
@media (max-width:820px){
  .hero { grid-template-columns:1fr; }
  .g4 { grid-template-columns:repeat(2,1fr); }
  .g3 { grid-template-columns:1fr; }
  .topbar-stats { width:100%; justify-content:space-between; gap:12px; }
  .topbar-stats .st { text-align:left; }
}
@media (max-width:640px){
  /* tighter gutters reclaim usable width on phones */
  .app { padding:0 14px 64px; }
  .card { padding:18px; }
  .kpi { padding:16px; }
  /* The topbar wraps to 2-3 rows on a phone, so its height is dynamic — keeping
     the tabs sticky at a fixed 90px offset would misalign/overlap. Drop sticky
     on mobile; the tab bar still scrolls horizontally in place. */
  .topbar { position:static; gap:12px 16px; padding:14px 0; }
  .tabs { position:static; top:auto; }
  .topbar-brand { padding-right:12px; }
  /* ── mobile display type scale ──────────────────────────────────────
     Desktop sizes are tuned for a wide hero; on a phone the same numbers
     dominate the viewport. Step the whole display tier down ~25-35% so it
     stays emphatic without shouting. Keep it as ONE scale (don't sprinkle
     ad-hoc sizes) so headings/metrics stay visually proportional. */
  .hero-title { font-size:2.1rem; line-height:1.06; letter-spacing:-.02em; }
  .ch-name { font-size:1.15rem; }
  .gauge { width:164px; height:164px; }
  .gauge-num b { font-size:2.2rem; }
  .kpi .val { font-size:1.55rem; }
  .slot-big b { font-size:1.8rem; }
  .tm-hero-slot { font-size:1.5rem; }
  .tm-hero-clock { font-size:2.4rem; }
  /* wide single-row heroes stack instead of overflowing */
  .tm-hero, .slot-hero, .donut-wrap, .metric-def { flex-wrap:wrap; }
  /* proof panel drops below the slot text full width — divider moves to the top */
  .tm-proof { margin-left:0; max-width:none; width:100%; padding-left:0; padding-top:16px;
    border-left:none; border-top:1px solid var(--border); }
  /* heatmap: 12 hour columns can't fit a phone — give it its own horizontal
     scroll with a readable min-width instead of letting the body clip it. */
  #tm-heat { overflow-x:auto; -webkit-overflow-scrolling:touch; }
  #tm-heat .heat { min-width:520px; }
  /* Monthly momentum chart: at phone width the 12 month bands collapse to ~28px
     each and are near-impossible to tap. Give the chart its own horizontal scroll
     with a readable min-width so each month gets room to hover/tap. */
  .lc-scroll { overflow-x:auto; -webkit-overflow-scrolling:touch; }
  .lc-scroll .linechart { min-width:640px; }
  .heat-layout { gap:16px; }
  .top-slots { flex:1 1 100%; }
  /* momentum tooltip must fit a narrow viewport */
  .lc-tip { width:min(300px,92vw); }
  /* methodology modal: tighter padding + taller sheet on small screens */
  .method-card { padding:24px 18px 20px; max-height:90vh; }
  .method-title { font-size:1.25rem; }
  /* comfortable >=44px tap targets for touch controls */
  .tab { padding:12px 18px; }
  .chip { padding:10px 16px; }
  .slicer-presets button { padding:10px 14px; }
  .slicer-field input[type=date] { padding:10px 12px; }
  .search-go { padding:14px 22px; }
}
@media (max-width:560px){
  .g2, .g4 { grid-template-columns:1fr; }
  .search-pill { flex-wrap:wrap; border-radius:20px; }
  .search-go { width:100%; justify-content:center; }
  /* candidate chooser: tighten so the subscriber count doesn't strand at the
     far-right edge of a phone-width card — shrink avatar, let the title/desc
     wrap, and keep the stat snug against the body */
  .cand { gap:12px; padding:12px 14px; }
  .cand img { width:44px; height:44px; }
  .cand-title { font-size:.98rem; }
  .cand-desc { white-space:normal; display:-webkit-box; -webkit-line-clamp:2;
    -webkit-box-orient:vertical; }
  .cand-stats b { font-size:.95rem; }
  .rank-row { grid-template-columns:84px 1fr auto; gap:10px; }
  .daycmp-row { grid-template-columns:44px 1fr auto; gap:8px; }
  .phrase-grid { grid-template-columns:1fr; }
}
@media (max-width:400px){
  /* bottom step of the mobile display scale — one more notch down */
  .hero-title { font-size:1.85rem; }
  .hero-lede { font-size:1rem; }
  .ch-name { font-size:1.05rem; }
  .topbar-stats { gap:8px; }
  .topbar-stats .st b { font-size:1rem; }
  .gauge { width:148px; height:148px; }
  .gauge-num b { font-size:2rem; }
  .kpi .val { font-size:1.45rem; }
  .slot-big b { font-size:1.6rem; }
  .tm-hero-slot { font-size:1.35rem; }
  .tm-hero-clock { font-size:2.1rem; }
  /* stack the gem cards so the thumbnail isn't squeezed */
  .gem { flex-direction:column; }
  .gem img { width:100%; height:auto; aspect-ratio:16/9; }
}
