/* Takeoff Radar - third Furton property. Structural DNA shared with furton.ai v2
   (dark navy, Inter + JetBrains Mono, tile/card/pill system); accent is radar
   green. Chart color roles are validated ordinal ramps - see build_site.py
   header for the validator runs; do not eyeball-edit the --ord-* values. */

:root{
  --bg:#070b14; --panel:rgba(255,255,255,.035); --panel2:rgba(255,255,255,.06);
  --line:rgba(255,255,255,.08); --text:#e7ebf4; --muted:#8b93a7; --dim:#7d879e;
  --acc:#34c17a; --acc2:#8ff0b6;
  /* accent-as-TEXT token (UI-skills pass 2026-07-15): small accent-colored
     text must hit 4.5:1; the fill accent (--acc) doesn't in light mode.
     Use --acc-ink for text/links, --acc for fills/borders/marks. */
  --acc-ink:#34c17a;
  --up:#2fd08c; --down:#ff5d73; --warn:#ffb84d;
  --surface:#0d1320;               /* effective chart surface (panel over bg) */
  /* ordinal ramp, 6 steps (amount buckets) - validated dark 2026-07-09 */
  --ord6-1:#b9eed0; --ord6-2:#8adfb1; --ord6-3:#57cd8e;
  --ord6-4:#2eb471; --ord6-5:#1e9159; --ord6-6:#147044;
  /* ordinal ramp, 5 steps (stage bands) - validated dark */
  --ord5-1:#a8e7c4; --ord5-2:#6cd69e; --ord5-3:#34c17a;
  --ord5-4:#23a063; --ord5-5:#147e4c;
  /* sequential endpoints for heatmap interpolation (one hue, light→dark on
     dark mode reads dark→bright: anchor flips, more = brighter) */
  --seq-lo:#12351f; --seq-hi:#7ce7ad;
  --series:#34c17a;                /* single-series mark color */
  --gray-series:#4d5870;           /* de-emphasis series (D/A, context) */
  --neutral:#6b7688;               /* indefinite / indeterminate / unknown */
  --grid:rgba(255,255,255,.06); --axis:rgba(255,255,255,.16);
  --tip-bg:rgba(10,14,26,.97); --tip-line:rgba(255,255,255,.12);
  --mono:'JetBrains Mono',Consolas,monospace;
  /* display face = Inter, same as furton.ai v2 / Furton Coverage - one family
     across the Furton properties (per Nick, 2026-07-12; Bricolage retired) */
  --display:Inter,system-ui,sans-serif;
  --eo:cubic-bezier(.23,1,.32,1);
  --maxw:1240px;
}
.light{
  --bg:#f7f9fb; --panel:#ffffff; --panel2:#fdfefd;
  /* --dim darkened #6d7688 -> #646e80 (4.33:1 -> 4.87:1, AA for small text);
     --acc-ink #0f6b3e = 5.9:1 for small accent text (fill --acc is 4.04:1) */
  --line:rgba(13,22,36,.10); --text:#17202e; --muted:#5b6474; --dim:#646e80;
  --acc:#1a8c53; --acc2:#2eb977; --acc-ink:#0f6b3e;
  --up:#0e9a5e; --down:#d63a54; --warn:#b97a12;
  --surface:#f4f7f5;
  /* validated light 2026-07-09 */
  --ord6-1:#2eb977; --ord6-2:#23a365; --ord6-3:#1a8c53;
  --ord6-4:#127543; --ord6-5:#0c5e34; --ord6-6:#074726;
  --ord5-1:#2eb977; --ord5-2:#219a5f; --ord5-3:#187e4d;
  --ord5-4:#10633b; --ord5-5:#0a4a2b;
  --seq-lo:#ddf3e6; --seq-hi:#0c5e34;
  --series:#1a8c53; --gray-series:#b6bdcc; --neutral:#9aa3b5;
  --grid:rgba(13,22,36,.07); --axis:rgba(13,22,36,.20);
  --tip-bg:rgba(23,32,46,.97); --tip-line:rgba(255,255,255,.14);
}

*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth;color-scheme:dark}
html.light{color-scheme:light}
h1,h2,h3,h4{text-wrap:balance}
p{text-wrap:pretty}
:focus-visible{outline:2px solid var(--acc2);outline-offset:2px}
.light :focus-visible{outline-color:#0a6b3e}
@media (prefers-reduced-motion: reduce){ html{scroll-behavior:auto} *{animation:none!important;transition:none!important} }
body{
  background:var(--bg); color:var(--text);
  font:15px/1.6 Inter,system-ui,-apple-system,'Segoe UI',sans-serif;
  -webkit-font-smoothing:antialiased; overflow-x:hidden;
}
body::before{
  content:""; position:fixed; inset:0; z-index:-1; pointer-events:none;
  /* ambient page tint only - the top-left logo halo was removed per Nick
     2026-07-15 (no glow around the mark) */
  background:
    radial-gradient(680px 420px at 88% -12%, rgba(143,240,182,.07), transparent 60%),
    radial-gradient(1000px 640px at 50% 118%, rgba(52,193,122,.05), transparent 60%);
}
.light body::before{
  background:
    radial-gradient(680px 420px at 88% -12%, rgba(46,185,119,.05), transparent 60%);
}
a{color:inherit;text-decoration:none}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 clamp(20px,4.5vw,56px)}
.pos{color:var(--up)} .neg{color:var(--down)}

/* ───────── nav ───────── */
nav{position:fixed;top:0;left:0;right:0;z-index:50;backdrop-filter:blur(14px);background:rgba(7,11,20,.72);border-bottom:1px solid var(--line)}
.light nav{background:rgba(247,249,251,.82)}
.nav-inner{max-width:var(--maxw);margin:0 auto;padding:13px clamp(20px,4.5vw,56px);display:flex;align-items:center;gap:12px}
.mark{width:34px;height:34px;border-radius:10px;flex:none;background:linear-gradient(135deg,var(--acc),var(--acc2));display:grid;place-items:center}
/* one home link wraps mark + wordmark: bigger target, no dead gap between */
a.brand-lockup{display:inline-flex;align-items:center;gap:12px}
.mark svg{width:20px;height:20px}
.nav-brand{font-weight:800;font-size:15px;letter-spacing:-.01em;white-space:nowrap}
.nav-brand span{color:var(--acc2)}
.light .nav-brand span{color:var(--acc)}
.nav-links{margin-left:auto;display:flex;gap:22px;font-size:11.5px;font-weight:600;letter-spacing:.11em;text-transform:uppercase}
.nav-links a{color:var(--muted);transition:color .15s;padding:4px 2px}
.nav-links a:hover{color:var(--text)}
.nav-links a.active{color:var(--acc-ink)}
/* the "My radar" tab (Nick 2026-07-19): lock glyph + data-tip popover while
   .locked; billing.js drops the class for an active Pro/Max account */
.nav-lock{margin-left:3px;vertical-align:-2px}
.nav-menu .sheet a .nav-lock{margin-left:5px}
.nav-myradar:not(.locked) .nav-lock{display:none}

/* ───────── data-tip popover (ported from furton.ai per Nick 2026-07-19:
   hover wording renders as the styled bubble, never the native OS title).
   position:fixed anchored by radar.js placeTip; [data-flip] puts the bubble
   BELOW the trigger when there's no headroom - the fixed nav's case. ───────── */
[data-tip]::before{
  content:"";position:fixed;left:var(--tipcx,-9999px);top:var(--tipct,-9999px);transform:translateX(-50%);
  border:5px solid transparent;border-top-color:rgba(10,14,26,.96);
  opacity:0;transition:opacity .16s var(--eo);pointer-events:none;z-index:61}
[data-tip]::after{
  content:attr(data-tip);position:fixed;left:var(--tipx,-9999px);bottom:var(--tipb,auto);top:auto;
  transform:translateX(-50%) translateY(4px);
  width:max-content;max-width:min(250px,calc(100vw - 32px));white-space:normal;
  background:rgba(10,14,26,.96);color:#c6ccdb;border:1px solid rgba(255,255,255,.12);
  font:400 12px/1.6 Inter,sans-serif;letter-spacing:0;text-transform:none;text-align:left;
  padding:9px 12px;border-radius:9px;box-shadow:0 10px 28px -14px rgba(0,0,0,.55);
  opacity:0;transition:opacity .16s var(--eo),transform .16s var(--eo);pointer-events:none;z-index:62}
[data-tip][data-flip]::before{border-top-color:transparent;border-bottom-color:rgba(10,14,26,.96)}
[data-tip][data-flip]::after{bottom:auto;top:var(--tipt,-9999px);transform:translateX(-50%) translateY(-4px)}
[data-tip]:hover::before,[data-tip]:focus::before{opacity:1}
[data-tip]:hover::after,[data-tip]:focus::after{opacity:1;transform:translateX(-50%) translateY(0)}
@media(max-width:960px){.nav-links{display:none}}
.theme-btn{margin-left:14px;width:38px;height:38px;border:1px solid var(--line);border-radius:10px;background:transparent;color:var(--muted);cursor:pointer;display:grid;place-items:center;transition:color .15s,border-color .15s}
.theme-btn:hover{color:var(--text);border-color:var(--acc2)}
@media(max-width:960px){.theme-btn{margin-left:auto}}
/* The three-bar menu shows on EVERY viewport (Nick 2026-07-19): desktop gets
   the secondary pages only (.s-main entries hide there; the tab bar carries
   the mains); mobile keeps the full list since the tab bar is hidden. */
.nav-menu{display:block;margin-left:10px;position:relative}
.sheet-sep{height:1px;background:var(--line);margin:6px 4px}
@media(min-width:961px){.nav-menu .sheet .s-main{display:none}}
.nav-menu summary{list-style:none;cursor:pointer;width:38px;height:38px;border:1px solid var(--line);border-radius:10px;display:grid;place-items:center;color:var(--text)}
.nav-menu summary::-webkit-details-marker{display:none}
.nav-menu[open] summary{border-color:var(--acc2)}
.nav-menu .sheet{position:absolute;top:calc(100% + 8px);right:0;min-width:210px;background:var(--bg);border:1px solid var(--line);border-radius:14px;padding:8px;display:flex;flex-direction:column;box-shadow:0 22px 54px -22px rgba(0,0,0,.6);z-index:60}
.nav-menu .sheet a{padding:11px 14px;border-radius:9px;color:var(--muted);font-size:13px;font-weight:600}
.nav-menu .sheet a:hover,.nav-menu .sheet a.active{background:var(--panel2);color:var(--text)}

/* ───────── page scaffolding ───────── */
main{padding:110px 0 40px}
.page-head{margin-bottom:30px}
.eyebrow{display:inline-flex;align-items:center;gap:10px;font-family:var(--mono);font-size:11px;letter-spacing:.22em;text-transform:uppercase;color:var(--acc-ink);margin-bottom:14px}
.eyebrow::before{content:"";width:30px;height:1px;background:linear-gradient(90deg,var(--acc),var(--acc2))}
.page-head h1{font-family:var(--display);font-weight:800;font-size:clamp(26px,3.6vw,44px);letter-spacing:-.03em;line-height:1.1}
.page-head h1 em{font-style:normal;color:var(--acc2)}
.light .page-head h1 em{color:var(--acc)}
.page-lead{margin-top:14px;font-size:15.5px;color:var(--muted);max-width:72ch;line-height:1.7}
/* body-copy intro paragraphs (account): capped measure - full-width 15px prose
   is unreadable at desktop widths, every other prose block is capped too */
.intro{max-width:78ch;line-height:1.7;margin-bottom:28px}
.asof{font-family:var(--mono);font-size:11.5px;color:var(--dim);letter-spacing:.04em;margin-top:10px}
section{margin-bottom:40px}
.sec-h{display:flex;align-items:baseline;gap:12px;margin-bottom:16px;flex-wrap:wrap}
.sec-h h2{font-weight:700;font-size:19px;letter-spacing:-.02em}
.sec-h .sub{font-size:12.5px;color:var(--dim)}

/* ───────── stats / panels (FLAT system, no boxed cards - Nick 2026-07-15:
   card UI is retired everywhere; structure comes from hairline rules +
   whitespace, never from bordered/filled boxes) ───────── */
.tiles{display:grid;grid-template-columns:repeat(4,1fr);gap:12px 28px}
.tiles.three{grid-template-columns:repeat(3,1fr)}
.tiles.five{grid-template-columns:repeat(5,1fr)}
@media(max-width:1000px){.tiles,.tiles.three,.tiles.five{grid-template-columns:repeat(2,1fr)}}
@media(max-width:420px){.tiles,.tiles.three,.tiles.five{grid-template-columns:1fr}}
.tile{border-top:1px solid var(--line);padding:14px 2px 0;min-width:0}
.tile .k{font-size:10.5px;color:var(--muted);text-transform:uppercase;letter-spacing:.08em;margin-bottom:6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tile .v{font-size:22px;font-weight:700;letter-spacing:-.02em;white-space:nowrap}
.tile .d{font-size:11.5px;margin-top:3px;font-family:var(--mono)}
.tile .d .vs{color:var(--dim);font-family:Inter,sans-serif}
.card{border-top:1px solid var(--line);padding:16px 0 0;min-width:0}
.card h3{font-size:12.5px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.08em;margin-bottom:4px}
.card .sub{font-size:12.5px;color:var(--muted);margin-bottom:12px;line-height:1.6}
.grid2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}
.grid2 .span2{grid-column:1/-1}
@media(max-width:900px){.grid2{grid-template-columns:minmax(0,1fr)}}
/* My radar's denser card grid (Nick 2026-07-19: the 2-col grid left too much
   blank space): 3-up on wide screens, stepping down to 2 then 1. */
.grid3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}
@media(max-width:1100px){.grid3{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:700px){.grid3{grid-template-columns:minmax(0,1fr)}}
.note{margin-top:12px;font-size:12.5px;color:var(--dim);max-width:78ch;line-height:1.65}
/* in-copy links must read as links (base a{} inherits color): accent ink +
   dotted underline at rest, the .prose a convention - color alone fails on
   touch (no hover) and for color-blind readers (WCAG 1.4.1) */
.note a,.card .sub a{color:var(--acc-ink);border-bottom:1px dotted}
.note a:hover,.card .sub a:hover{border-bottom-style:solid}
/* margin-to-margin footnotes (Nick 2026-07-17): the feed's note spans the
   full content width, as does the footer disclaimer below */
.note.wide{max-width:none}

/* ───────── tables ───────── */
.twrap{overflow-x:auto}
table{width:100%;border-collapse:collapse;font-size:13px}
th{color:var(--muted);font-weight:600;font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;text-align:right;padding:8px 10px;border-bottom:1px solid var(--line);white-space:nowrap}
th:first-child,td:first-child{text-align:left}
/* th.tl: header follows its column's alignment - a right-aligned header over
   left-aligned cells reads as a misaligned column (Nick 2026-07-15) */
th.tl{text-align:left}
td{padding:8px 10px;border-bottom:1px solid var(--grid);text-align:right;font-family:var(--mono);font-size:12.5px;font-variant-numeric:tabular-nums}
td:first-child{font-family:Inter,sans-serif;font-weight:600}
td.tl{text-align:left;font-family:Inter,sans-serif;font-weight:400}
td .cty{color:var(--dim);font-size:11.5px;font-family:Inter,sans-serif}
tr:hover td{background:rgba(255,255,255,.02)}
.light tr:hover td{background:rgba(13,22,36,.03)}
/* marketing-table row links (radar.js wires tr[data-href]; the global
   :focus-visible rule supplies the keyboard outline) */
tr[data-href]{cursor:pointer}
td .desc{display:block;font-family:Inter,sans-serif;font-size:12px;color:var(--muted);font-weight:400;margin-top:2px;line-height:1.5;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:56ch}
.prov{font-family:var(--mono);font-size:10px;letter-spacing:.06em;text-transform:uppercase;border-radius:99px;padding:1px 7px;border:1px solid var(--line);color:var(--dim);white-space:nowrap}
.prov.verified,.prov.fresh{color:var(--acc2);border-color:rgba(52,193,122,.5)}
.light .prov.verified,.light .prov.fresh{color:var(--acc)}
/* quiet provenance (2026-07-15): verified = a small check beside the label,
   inferred = the bare label, unlabeled = muted "label pending" / "unknown" /
   "n/a" (via-SPV rows, never labeled by design; 2026-07-19) - no pills.
   The pill class above stays for the via-SPV / NEW / lead marks only. */
.vmark{color:var(--acc-ink);font-weight:700;cursor:help}
.lbl-pending{color:var(--dim);font-size:12px;font-style:italic;cursor:help}
.prov.lead{background:var(--acc);border-color:var(--acc);color:#08130c;font-weight:700;margin-left:4px}
.light .prov.lead{background:#0f6b3d;border-color:#0f6b3d;color:#fff}
/* consistent placement v2 (Nick 2026-07-17): the pill is ABSOLUTELY pinned
   to the issuer cell's right edge, vertically centered - the same spot on
   every row, a clean rail down the table (the old float trailed wrapped
   names at varying heights). td.has-lead reserves the space so the pill
   never overlaps a long name. */
#feedtbl td.has-lead{position:relative;padding-right:122px}
#feedtbl .prov.lead{position:absolute;right:8px;top:50%;transform:translateY(-50%);margin-left:0}
a.ext{border-bottom:1px dotted var(--dim)}
a.sitelink{font-family:var(--mono);font-size:10.5px;letter-spacing:.04em;color:var(--acc-ink);white-space:nowrap;margin-left:4px}
a.sitelink:hover{text-decoration:underline}
a.ext:hover{color:var(--acc2);border-color:var(--acc2)}
.light a.ext:hover{color:var(--acc)}

.showmore{margin:14px auto 0;display:block;padding:10px 26px;border-radius:99px;border:1px solid var(--line);background:transparent;color:var(--muted);font:600 13px Inter,sans-serif;cursor:pointer}
.showmore:hover{color:var(--text);border-color:var(--acc2)}
.showmore:active{transform:translateY(1px)}
.showmore[hidden]{display:none}

/* ───────── the feed (P4) ───────── */
.feed-bar{display:flex;flex-direction:column;gap:10px;margin:0 0 16px}
.feed-filters{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.feed-filters input[type=search],.feed-filters select,.feed-filters .ms>summary,.date-f{
  background:var(--panel);border:1px solid var(--line);border-radius:10px;color:var(--text);
  font:400 13px Inter,sans-serif;height:38px;padding:0 13px;display:inline-flex;align-items:center}
.light .feed-filters input[type=search],.light .feed-filters select,.light .feed-filters .ms>summary,.light .date-f{background:#fff}
.feed-filters input[type=search]{min-width:190px;flex:1 1 190px;max-width:320px}
.feed-filters select{appearance:none;-webkit-appearance:none;padding-right:32px;cursor:pointer;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%238b93a7' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 12px center}
.feed-filters input:focus,.feed-filters select:focus,.feed-filters .ms>summary:focus-visible,.date-f input:focus{outline:2px solid var(--acc2);outline-offset:1px}
.date-f{gap:7px;color:var(--dim);font-family:var(--mono);font-size:10.5px;text-transform:uppercase;letter-spacing:.05em}
.date-f input[type=date]{background:transparent;border:0;color:var(--text);font:400 12px var(--mono);padding:0;cursor:pointer;min-width:118px}
/* multi-select territory picker */
.ms{position:relative}
.ms>summary{list-style:none;gap:10px;cursor:pointer;white-space:nowrap;user-select:none;justify-content:space-between;min-width:132px}
.ms>summary::-webkit-details-marker{display:none}
.ms .ms-lab{max-width:150px;overflow:hidden;text-overflow:ellipsis}
.ms .ms-caret{color:var(--dim);font-size:10px}
.ms[open]>summary{border-color:var(--acc2)}
.ms-panel{position:absolute;z-index:45;top:calc(100% + 6px);left:0;width:252px;max-width:82vw;background:var(--panel2);border:1px solid var(--line);border-radius:12px;padding:10px;box-shadow:0 18px 44px -20px rgba(0,0,0,.6)}
.light .ms-panel{background:#fff}
.ms-search{width:100%;background:var(--panel);border:1px solid var(--line);border-radius:8px;color:var(--text);font:400 12.5px Inter,sans-serif;padding:7px 10px;margin-bottom:8px}
.light .ms-search{background:#fbfdfc}
.ms-actions{display:flex;gap:8px;margin-bottom:8px}
.ms-actions button{flex:1;background:transparent;border:1px solid var(--line);border-radius:8px;color:var(--muted);font:600 10.5px var(--mono);letter-spacing:.05em;text-transform:uppercase;padding:6px;cursor:pointer}
.ms-actions button:hover{color:var(--text);border-color:var(--acc2)}
.ms-list{max-height:244px;overflow-y:auto;display:flex;flex-direction:column;gap:1px}
.ms-opt{display:flex;align-items:center;gap:9px;padding:6px 8px;border-radius:7px;cursor:pointer;font-size:13px;color:var(--text)}
.ms-opt:hover{background:rgba(255,255,255,.05)}
.light .ms-opt:hover{background:rgba(13,22,36,.04)}
.ms-opt input{accent-color:var(--acc);width:15px;height:15px;flex:none;cursor:pointer}
.linkbtn{background:transparent;border:0;color:var(--dim);font:600 12px Inter,sans-serif;cursor:pointer;padding:8px 4px;text-decoration:underline;text-underline-offset:3px}
.linkbtn:hover{color:var(--acc-ink)}
.linkbtn[hidden]{display:none}
.feed-meta{min-height:15px}
.feed-meta .count{font-family:var(--mono);font-size:11.5px;color:var(--dim)}
.feed-card table[hidden]{display:none}
.feed-status{padding:30px 20px;text-align:center;color:var(--dim);font-family:var(--mono);font-size:12.5px;line-height:1.6}
.feed-status[hidden]{display:none}
.feed-foot{display:flex;flex-direction:column;align-items:center;gap:8px;margin-top:8px}
.showmore.ghost{color:var(--dim);font-weight:500}
.feed-fresh{font-family:var(--mono);font-size:11px;color:var(--dim);letter-spacing:.02em;margin:0 0 12px}
/* no side-stripe (UI-skills ban): the hint reads as a plain sentence with an
   accent-colored action inside it */
/* The whole-feed hint was retired 2026-07-19 (Nick): the empty-filter state
   speaks for itself. The key now folds behind a Key button (.feed-key). */
.feed-key{margin:0 0 14px}
.feed-key summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;gap:6px;
  font:600 12px Inter,sans-serif;color:var(--dim);border:1px solid var(--line);border-radius:99px;padding:4px 12px;user-select:none}
.feed-key summary::-webkit-details-marker{display:none}
.feed-key summary::after{content:"▸";font-size:9px;transition:transform .15s}
.feed-key[open] summary::after{transform:rotate(90deg)}
.feed-key summary:hover{color:var(--acc-ink);border-color:var(--acc-ink)}
.feed-key[open] summary{margin-bottom:8px}
/* point-of-use key v2 (Nick 2026-07-17): a scannable graphic of the feed's
   real chips + one short gloss each, margin to margin, replacing the prose
   paragraph. Chips reuse the table's own classes (.prov.lead, .vmark,
   .lbl-pending) so the key looks exactly like the rows it explains. */
.feed-legend{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:7px 26px;margin:0 0 14px;padding:12px 16px;border:1px solid var(--line);border-radius:12px}
.feed-legend .lg{display:flex;align-items:baseline;gap:9px;font-size:11.5px;color:var(--dim);line-height:1.5}
.feed-legend .lg-term{flex:none;font:600 10px var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--text);border:1px solid var(--line);border-radius:99px;padding:1px 8px;white-space:nowrap}
.feed-legend .lg-cr{color:var(--acc2);border-color:rgba(52,193,122,.5)}
.light .feed-legend .lg-cr{color:var(--acc)}
.feed-legend .prov.lead,.feed-legend .lbl-pending{flex:none}
.feed-legend .lg-def{min-width:0}
/* ───────── the digest archive's weekly-bars chart ─────────
   (Nick 2026-07-19, replacing the decorative CSS radar.) 12 REAL digest-week
   counts baked at build time by build_site.week_chart: --h is each week's
   height as a FRACTION of the tallest (this file owns every pixel), and
   --s1..--s4 are that week's OWN Mon-Thu running totals as a fraction of its
   close. Friday needs no variable - it is always the full bar.

   THE TIMETABLE - one set of numbers, used two ways, so nothing can drift:
     --wk-cyc  full cycle          --wk-t1  when Monday's step LANDS
     --wk-step one weekday apart   (Tue/Wed/Thu/Fri land at t1 + step*1..4)
   The bar's staircase (@keyframes wknow) expresses the same schedule as
   percentages of the cycle: 11/17/23/29/35%. The dots, the counter and the
   plane never repeat those percentages - they share ONE keyframe each and
   are phased by animation-delay off --wk-t1/--wk-step. Change the timetable
   in the two places at the top of .wkc and wknow's percentages; nothing else
   encodes timing.

   Static styles are the FINISHED chart (full bars, lit dots, the closing
   count), so the global reduced-motion kill at the top of this file leaves a
   complete, readable chart rather than an empty box. Hides on narrow screens
   like the radar it replaces. */
.digest-flex{display:flex;gap:30px;align-items:flex-start}
.digest-flex .digest-list{flex:1;min-width:0}
.wkc{flex:0 0 auto;width:220px;margin-top:6px;
  --wk-cyc:7s; --wk-t1:.77s; --wk-step:.42s;   /* the timetable (see above) */
  --wk-plot:132px}                             /* tallest bar; plot is +18 for the count */
.wkc-plot{display:flex;align-items:flex-end;gap:5px;height:150px;padding:0 2px;
  border-bottom:1px solid var(--line)}
.wkc-c{position:relative;flex:1;height:100%;display:flex;flex-direction:column;justify-content:flex-end}
/* history bars: >=3:1 against the page in both themes (WCAG 1.4.11 - these
   carry data, unlike the decorative radar they replace). Computed, not
   eyeballed: .55 over #070b14 = 3.22:1, .70 over #f7f9fb = 3.31:1. */
.wkc-bar{display:block;height:calc(var(--h) * var(--wk-plot));min-height:2px;
  background:rgba(52,193,122,.55);border-radius:2px 2px 0 0;transform-origin:bottom;
  animation:wkgrow .45s var(--eo) backwards;animation-delay:calc(var(--i) * 45ms)}
.light .wkc-bar{background:rgba(15,107,62,.70)}
.wkc-c.now .wkc-bar{background:var(--acc);
  animation:wknow var(--wk-cyc) var(--eo) infinite}
/* hover: replay the week you are pointing at, from its own --s1..--s4.
   :not(.now) is load-bearing. The live column's bar, counter, dots and plane
   share ONE 7s clock; swapping just the bar onto a 1.15s replay would leave
   the counter running on the old clock, printing Tuesday's total beside a
   full-height bar. The live week is already replaying itself, so hovering it
   correctly does nothing.
   Pointer-only by design: the columns are NOT focusable (they sit inside
   role="img", where focusable descendants are an accessibility trap), so
   the full 12-week series travels in the plot's aria-label instead. */
/* wkgrow is REPEATED here on purpose. Naming only wkreplay would drop wkgrow
   out of the animation list, and restoring it on pointer-out starts it as a
   BRAND-NEW animation: its `backwards` fill then paints from{scaleY(0)} for
   the whole stagger delay, so the bar blanks for up to 450ms and re-grows.
   Sweeping the pointer across the chart left a trailing wave of bars blinking
   out. Keeping wkgrow at index 0 (same name, same delay) means the finished
   entrance animation is matched and left alone, and only wkreplay is added. */
.wkc-c:not(.now):hover .wkc-bar{
  animation:wkgrow .45s var(--eo) backwards, wkreplay 1.15s var(--eo);
  animation-delay:calc(var(--i) * 45ms), 0s}
/* the running count on the live bar: five REAL stops (Mon..Fri totals),
   stacked; each fades in as its step lands. Static = the closing number
   only, so a no-animation render still reads correctly. */
.wkc-n{position:absolute;bottom:calc(var(--h) * var(--wk-plot) + 5px);right:-2px;
  height:12px;font:600 10px var(--mono);color:var(--acc-ink);letter-spacing:.02em}
.wkc-n i{position:absolute;right:0;bottom:0;font-style:normal;white-space:nowrap;opacity:0}
.wkc-n i:last-child{opacity:1}
.wkc-n i:nth-child(1){animation:wktick var(--wk-cyc) linear infinite;animation-delay:var(--wk-t1)}
.wkc-n i:nth-child(2){animation:wktick var(--wk-cyc) linear infinite;animation-delay:calc(var(--wk-t1) + var(--wk-step))}
.wkc-n i:nth-child(3){animation:wktick var(--wk-cyc) linear infinite;animation-delay:calc(var(--wk-t1) + var(--wk-step) * 2)}
.wkc-n i:nth-child(4){animation:wktick var(--wk-cyc) linear infinite;animation-delay:calc(var(--wk-t1) + var(--wk-step) * 3)}
/* `backwards` matters: the closing number's static opacity is 1 (so a
   no-animation render still shows the week's real total), which would
   otherwise spoil the count during the build-up before its delay elapses. */
.wkc-n i:nth-child(5){animation:wkclose var(--wk-cyc) linear infinite backwards;
  animation-delay:calc(var(--wk-t1) + var(--wk-step) * 4)}
/* the history bar's own count, on hover. The delay is not decoration: the
   number is that week's CLOSING total, so showing it while the replay is
   still climbing pairs a full-week figure with a part-week bar. It lands as
   the bar tops out (replay is 1.15s), and leaves immediately on exit. */
.wkc-hv{position:absolute;bottom:calc(var(--h) * var(--wk-plot) + 5px);right:-2px;
  font:600 10px var(--mono);color:var(--acc-ink);letter-spacing:.02em;
  opacity:0;transition:opacity .15s;pointer-events:none;white-space:nowrap}
.wkc-c:hover .wkc-hv{opacity:1;transition:opacity .2s .95s}
/* Mon-Fri: one dot per weekday, one keyframe, phased by the timetable */
.wkc-days{position:absolute;bottom:-9px;left:0;right:0;display:flex;gap:1px;justify-content:center}
.wkc-days i{width:2px;height:2px;border-radius:50%;background:var(--dim);opacity:.85}
.wkc-days i:nth-child(5){background:var(--acc)}
.wkc-days i:nth-child(1){animation:wkdot var(--wk-cyc) linear infinite;animation-delay:var(--wk-t1)}
.wkc-days i:nth-child(2){animation:wkdot var(--wk-cyc) linear infinite;animation-delay:calc(var(--wk-t1) + var(--wk-step))}
.wkc-days i:nth-child(3){animation:wkdot var(--wk-cyc) linear infinite;animation-delay:calc(var(--wk-t1) + var(--wk-step) * 2)}
.wkc-days i:nth-child(4){animation:wkdot var(--wk-cyc) linear infinite;animation-delay:calc(var(--wk-t1) + var(--wk-step) * 3)}
.wkc-days i:nth-child(5){animation:wkfri var(--wk-cyc) linear infinite;animation-delay:calc(var(--wk-t1) + var(--wk-step) * 4)}
/* Friday: the digest takes off toward the archive list to its left. Motion
   only - it never renders in a static/reduced-motion pass. A CSS triangle,
   so it survives forced-colors (border colors are honored, backgrounds are
   not). */
.wkc-plane{position:absolute;bottom:calc(var(--h) * var(--wk-plot));left:50%;
  width:0;height:0;border:4px solid transparent;border-left-color:var(--acc2);
  opacity:0;pointer-events:none;
  animation:wkfly var(--wk-cyc) var(--eo) infinite;
  animation-delay:calc(var(--wk-t1) + var(--wk-step) * 4)}
.light .wkc-plane{border-left-color:var(--acc)}
.wkc-cap{margin-top:16px;font-size:11.5px;line-height:1.5;color:var(--dim);text-align:center}
@keyframes wkgrow{from{transform:scaleY(0)}}
/* the live bar's week: a quiet weekend, then an eased staircase up its own
   running totals (Mon 11% .. Fri 35% of the cycle), the Friday completion
   flash, a slow breathe, then reset. */
@keyframes wknow{
  0%,4%{transform:scaleY(0);opacity:1}
  11%{transform:scaleY(var(--s1))}
  17%{transform:scaleY(var(--s2))}
  23%{transform:scaleY(var(--s3))}
  29%{transform:scaleY(var(--s4))}
  35%{transform:scaleY(1);background:var(--acc)}
  39%{background:var(--acc2)}
  46%{background:var(--acc)}
  60%{opacity:.78} 76%{opacity:1} 90%{opacity:.85}
  97%{opacity:1;transform:scaleY(1)}
  100%{opacity:0;transform:scaleY(1)}
}
/* hover replay: the same staircase, once, on whichever week is pointed at */
@keyframes wkreplay{
  0%{transform:scaleY(0)}
  22%{transform:scaleY(var(--s1))} 40%{transform:scaleY(var(--s2))}
  58%{transform:scaleY(var(--s3))} 76%{transform:scaleY(var(--s4))}
  100%{transform:scaleY(1)}
}
/* Phased by delay, so these carry no schedule of their own, but they are
   read on a DELAYED timeline: their percentages are relative to their own
   start, not the bar's. Two consequences, both load-bearing:
     · a step's number must clear in exactly one weekday (6% of the cycle),
       or the count reads a day behind the bar it labels;
     · everything must wind down by 62%, because the last-delayed element
       (Friday, +2.45s) hits 62% exactly as the bar resets at 7s. A larger
       number leaves last week's dot lit over next week's Monday. */
@keyframes wkdot{0%{opacity:.1}3%{opacity:.85}58%{opacity:.85}62%,100%{opacity:.1}}
@keyframes wkfri{0%{opacity:.15;transform:scale(1)}3%{opacity:1;transform:scale(2.2)}
  9%{transform:scale(1)}58%{opacity:1}62%,100%{opacity:.15}}
/* the counter reads as digits SWAPPING, not fading: each number is opaque
   the instant its step lands and cuts out as the next takes over, so there
   is no dark gap between weekdays (a fade-in here flickers on every step). */
@keyframes wktick{0%,5.9%{opacity:1}6%,100%{opacity:0}}
/* the 0% frame MUST be transparent: `backwards` fill paints it through the
   whole delay, so a 0% of opacity:1 would show the week's closing total for
   the entire build-up. The jump at 0.01% (~0.7ms) keeps the swap instant. */
@keyframes wkclose{0%{opacity:0}0.01%,58%{opacity:1}62%,100%{opacity:0}}
/* The plane clears the count label BEFORE it fades in: the number sits 5-17px
   above the bar top, exactly in the launch path, and a plane drawn over its
   own week's total reads as a collision. It rises ~21px while still
   transparent (the eased curve makes that the fastest part of the arc, so it
   still reads as a launch off the bar), then appears and flies on. */
@keyframes wkfly{
  0%{opacity:0;transform:translate(0,0) rotate(-30deg) scale(.7)}
  2.5%{opacity:0;transform:translate(-3px,-21px) rotate(-26deg) scale(1)}
  3.5%{opacity:1}
  12%{transform:translate(-26px,-36px) rotate(-16deg)}
  20%{opacity:0;transform:translate(-54px,-46px) rotate(-8deg)}
  100%{opacity:0;transform:translate(-54px,-46px) rotate(-8deg)}
}
/* forced colors strip background-color: keep the bars as outlined shapes so
   the chart still reads (the radar this replaced drew rings with borders). */
@media(forced-colors:active){
  .wkc-bar{border:1px solid CanvasText;background:Highlight}
  .wkc-days i{border:1px solid CanvasText}
}
@media(max-width:760px){.wkc{display:none}}
/* the per-row one-click watch (billing-ON builds only) */
.wth{width:34px}
.wtd{text-align:center}
.rowwatch{width:24px;height:24px;border-radius:99px;border:1px solid var(--line);background:transparent;
  color:var(--dim);font:600 14px/1 Inter,sans-serif;cursor:pointer;padding:0}
.rowwatch:hover{color:var(--acc-ink);border-color:var(--acc-ink)}
.rowwatch:disabled{opacity:.55;cursor:default}
a.findlink{color:var(--dim)}
a.findlink:hover{color:var(--acc-ink)}

/* ───────── P14: the Call-ready / All discoveries view toggle ─────────
   A segmented control of two native buttons (keyboard for free); the pressed
   segment reads as the active view. Conspicuous by position (first control
   in the bar) and weight, not by shouting. */
.feed-views{display:inline-flex;align-self:flex-start;border:1px solid var(--line);border-radius:10px;overflow:hidden}
.feed-views button{background:transparent;border:0;color:var(--muted);font:600 12.5px Inter,sans-serif;padding:9px 16px;cursor:pointer;white-space:nowrap}
.feed-views button + button{border-left:1px solid var(--line)}
.feed-views button:hover{color:var(--text)}
.feed-views button:focus-visible{outline:2px solid var(--acc2);outline-offset:-2px}
.feed-views button[aria-pressed="true"]{background:var(--acc);color:#08130c;cursor:default}
.light .feed-views button[aria-pressed="true"]{background:#0f6b3d;color:#fff}
/* the published non-ready reason - the same quiet pill family as via-SPV */
.prov.why{font-style:normal}

/* P14: grouped-row source-filings list in the detail panel */
.dsrc{display:flex;flex-direction:column;gap:4px}
.dsrc-row{font-size:13px;color:var(--text)}
.dsrc-row .dperson{font-weight:600}

/* ───────── feed row detail panel (feed-detail.js, 2026-07-15) ─────────
   "The filing, decoded" - flat: a left accent rule + whitespace, no box. */
#feedtbl tbody tr.frow{cursor:pointer}
tr.drow td{padding:0;font-family:Inter,sans-serif;text-align:left}
tr.drow:hover td{background:transparent}
.light tr.drow:hover td{background:transparent}
/* flat detail region: a quiet background tint (the hover-tint family), no
   side stripe (UI-skills ban). Opacity-only entrance, killed by the global
   prefers-reduced-motion rule. */
.drow-inner{background:rgba(255,255,255,.025);margin:4px 0 10px;padding:14px 16px;display:flex;flex-direction:column;gap:10px;animation:drowin .18s cubic-bezier(.16,1,.3,1)}
.light .drow-inner{background:rgba(13,22,36,.028)}
@keyframes drowin{from{opacity:0}to{opacity:1}}
.ddesc{font-size:13.5px;color:var(--text);line-height:1.65;max-width:78ch}
.dfacts{display:flex;flex-wrap:wrap;gap:6px 22px}
.dfact{white-space:nowrap}
.dk{font-family:var(--mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--dim)}
.dv{font-size:13px;color:var(--text);font-variant-numeric:tabular-nums}
.dv[title]{cursor:help}
.dnote{font-size:12.5px;color:var(--muted);line-height:1.6;max-width:78ch}
.dexec .dperson{font-size:13px;color:var(--text)}
.dexec .dentity{color:var(--muted)}  /* P11: entity promoters read as context, never as a person to call */
.dlinks{display:flex;flex-wrap:wrap;gap:6px 20px}
a.dlink{font-size:13px;font-weight:600;color:var(--acc-ink)}
a.dlink:hover{text-decoration:underline}
a.dlink-sm{font-weight:500;font-size:12px}
.dacc{font-family:var(--mono);font-size:10px;letter-spacing:.08em;color:var(--dim)}
/* P16: panel watch/hide controls - button-shaped dlinks, one visual family */
button.dwatch{background:transparent;border:0;padding:0;font:600 13px Inter,sans-serif;color:var(--acc-ink);cursor:pointer}
button.dwatch:hover{text-decoration:underline}
.dacts{margin-top:2px}
/* a hidden row revealed by "Show N hidden" reads muted, not gone */
tr.rhide>td{opacity:.5}

/* ───────── prose (digests / methodology) ───────── */
.prose{max-width:860px;font-size:15px;line-height:1.75;color:var(--text)}
.prose h1{font-size:clamp(24px,3vw,36px);font-weight:800;letter-spacing:-.03em;margin:0 0 18px;line-height:1.15}
.prose h2{font-size:21px;font-weight:700;letter-spacing:-.02em;margin:34px 0 12px}
.prose h3{font-size:16.5px;font-weight:700;margin:26px 0 10px}
.prose p{margin:0 0 14px;color:var(--text)}
.prose p em,.prose li em{color:var(--muted)}
.prose ul,.prose ol{margin:0 0 14px 22px}
.prose li{margin-bottom:6px}
.prose blockquote{border-left:1px solid var(--line);padding:4px 0 4px 18px;margin:0 0 14px;color:var(--muted)}
.prose hr{border:none;border-top:1px solid var(--line);margin:28px 0}
.prose code{font-family:var(--mono);font-size:.88em;background:var(--panel2);border:1px solid var(--line);border-radius:5px;padding:1px 5px}
.prose a{color:var(--acc-ink);border-bottom:1px dotted}
.prose table{margin:0 0 18px}
.prose .twrap{margin-bottom:18px}
.prose pre{font-family:var(--mono);font-size:12.5px;line-height:1.6;background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:14px 16px;overflow-x:auto;margin:0 0 16px}
.prose pre code{background:none;border:none;padding:0;font-size:inherit}
/* copy-to-clipboard on every code block (Nick 2026-07-19; radar.js injects) */
pre{position:relative}
.copybtn{position:absolute;top:8px;right:8px;border:1px solid var(--line);background:var(--bg);
  color:var(--dim);font:600 10px Inter,sans-serif;letter-spacing:.06em;text-transform:uppercase;
  border-radius:7px;padding:4px 9px;cursor:pointer;opacity:.85}
.copybtn:hover{color:var(--acc-ink);border-color:var(--acc-ink);opacity:1}
.copybtn.ok{color:var(--acc-ink);border-color:var(--acc-ink);opacity:1}
.digest-list{display:flex;flex-direction:column;gap:10px;max-width:760px}
.digest-item{display:flex;align-items:center;gap:16px;border-bottom:1px solid var(--line);padding:16px 4px;transition:background .15s}
.digest-item:first-child{border-top:1px solid var(--line)}
.digest-item:hover{background:rgba(255,255,255,.03)}
.light .digest-item:hover{background:rgba(13,22,36,.03)}
.digest-item .dt{font-family:var(--mono);font-size:12px;color:var(--acc-ink);white-space:nowrap}
.digest-item .ttl{font-weight:600;font-size:14.5px}
.digest-item .arr{margin-left:auto;color:var(--dim)}
.empty{padding:44px 20px;text-align:center;color:var(--dim);font-family:var(--mono);font-size:12.5px}

/* ───────── landing / marketing (P3) ─────────
   Product shell components: hero, live-proof table, how-it-works steps,
   plan columns, digest signup. Same tokens as the app pages - one FLAT
   system (rules + whitespace, no boxed cards). */
/* hero rebalance (Nick 2026-07-15): text column grows, radar shrinks, and
   the viewport-height stretch is gone - the section is as tall as its
   content, no manufactured whitespace. */
.hero-grid{display:grid;grid-template-columns:minmax(0,1.03fr) minmax(0,.97fr);gap:clamp(24px,4vw,56px);align-items:center;padding:14px 0 8px}
@media(max-width:1020px){.hero-grid{grid-template-columns:1fr}}
.radar-wrap{min-width:0}
/* no clip: the sweep is a FULL circle sized to fit inside the frame (Nick
   2026-07-15: never cut the sweep, place + size it to fit instead - the
   fit-to-nearest-edge radius lives in build_site.radar_map). */
.radar-frame{position:relative}
.radar-frame svg{display:block;width:100%;height:auto}
.us-land{fill:var(--panel2);stroke:var(--line);stroke-width:1;vector-effect:non-scaling-stroke}
.light .us-land{fill:#eef3ef;stroke:rgba(13,22,36,.16)}
/* dot base state + beam trail colors (keyframes read the vars per theme) */
:root{--dotbase:.6;--beam:rgba(143,240,182,.20);--beam0:rgba(143,240,182,0)}
.light{--dotbase:.5;--beam:rgba(26,140,83,.15);--beam0:rgba(26,140,83,0)}
.us-dots circle{fill:var(--acc);opacity:var(--dotbase);animation:dotping 9s linear infinite}
/* beam pass: fast light-up, then a long graceful decay back to base */
@keyframes dotping{
  0%{opacity:var(--dotbase);fill:var(--acc);r:2.2px}
  0.9%{opacity:1;fill:var(--acc2);r:3.9px}
  3.5%{opacity:.95;fill:var(--acc2);r:3.3px}
  10%{opacity:.8;r:2.7px}
  24%{opacity:var(--dotbase);fill:var(--acc);r:2.2px}
  100%{opacity:var(--dotbase);fill:var(--acc);r:2.2px}
}
.beam-hub{fill:var(--acc2)}
.light .beam-hub{fill:var(--acc)}
/* per-state hit targets: the map is also the territory entry point */
.us-hit{fill:transparent;pointer-events:all;cursor:pointer}
.us-hits a:hover .us-hit,.us-hits a:focus-visible .us-hit{fill:rgba(52,193,122,.10);stroke:var(--acc2);stroke-width:1.5}
.light .us-hits a:hover .us-hit,.light .us-hits a:focus-visible .us-hit{stroke:var(--acc)}
/* the sweep: a circular radar scope - bright leading ray, smooth conic
   trail, no rim/rings. left/top/width are set inline per build. */
.radar-sweep{position:absolute;aspect-ratio:1;border-radius:50%;pointer-events:none;
  background:conic-gradient(from 0deg,transparent 0deg 16deg,var(--beam0) 16deg,var(--beam) 89.5deg,transparent 90deg 360deg);
  animation:radarspin 9s linear infinite}
.radar-sweep::after{content:"";position:absolute;left:50%;top:calc(50% - 1px);width:50%;height:2px;
  background:linear-gradient(90deg,var(--acc2) 0%,var(--acc2) 45%,transparent 96%);opacity:.75;border-radius:2px}
.light .radar-sweep::after{background:linear-gradient(90deg,var(--acc) 0%,var(--acc) 45%,transparent 96%)}
@keyframes radarspin{from{transform:translate(-50%,-50%) rotate(0deg)}to{transform:translate(-50%,-50%) rotate(360deg)}}
/* caption lives INSIDE the scope's empty bottom band (Nick 2026-07-15) */
.radar-cap{position:absolute;left:50%;bottom:3.5%;transform:translateX(-50%);width:min(88%,420px);font-size:11.5px;line-height:1.5;color:var(--dim);text-align:center;pointer-events:none}
@media (prefers-reduced-motion: reduce){.radar-sweep{display:none}}
.hero{padding:26px 0 8px;max-width:880px}
/* hero type sized for the 1.03fr text column (~3 lines at desktop; the
   UI-skills 2-3 line discipline still holds) */
.hero h1{font-family:var(--display);font-weight:800;font-size:clamp(33px,4.5vw,54px);letter-spacing:-.035em;line-height:1.06;text-wrap:balance}
.hero h1 em{font-style:normal;color:var(--acc)}
.hero .sub{margin-top:18px;font-size:clamp(15.5px,1.6vw,18px);color:var(--muted);line-height:1.65;max-width:58ch}
.hero .sub b{color:var(--text);font-weight:600}
.cta-row{display:flex;gap:12px;margin-top:26px;flex-wrap:wrap;align-items:center}
.btn{display:inline-flex;align-items:center;gap:8px;border-radius:12px;padding:12px 22px;font:600 14.5px Inter,sans-serif;cursor:pointer;border:1px solid var(--line);transition:transform .15s var(--eo),border-color .15s,background .15s}
.btn:hover{transform:translateY(-1px)}
.btn:active{transform:translateY(1px)}
.btn.primary{background:var(--acc);border-color:var(--acc);color:#fff}
.btn.primary:hover{background:var(--acc2);border-color:var(--acc2)}
.light .btn.primary:hover{background:#147040;border-color:#147040}
.btn.ghost{background:transparent;color:var(--text)}
.btn.ghost:hover{border-color:var(--acc)}
/* proof section header matches the shared .sec-h pattern (Nick 2026-07-15:
   the old LIVE-pill-only header sat out of line with neighboring sections) */
.proof-card{margin-top:34px}
.sec-h .live{display:inline-flex;align-items:center;gap:7px;font-family:var(--mono);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--acc-ink)}
.sec-h .live::before{content:"";width:7px;height:7px;border-radius:99px;background:var(--acc);box-shadow:0 0 0 3px rgba(52,193,122,.18);animation:pulse 2.2s infinite}
@keyframes pulse{0%,100%{box-shadow:0 0 0 3px rgba(52,193,122,.18)}50%{box-shadow:0 0 0 6px rgba(52,193,122,.06)}}
.sec-h .more{margin-left:auto;font-size:12.5px;font-weight:600;color:var(--acc-ink)}
.sec-h .more:hover{text-decoration:underline}
.proof-card table{font-size:13.5px}
.proof-card td,.proof-card th{padding:10px 14px}
.proof-card td:first-child{padding-left:2px}
.proof-card th:first-child{padding-left:2px}
.steps{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
.steps.four{grid-template-columns:repeat(4,1fr)}
/* .two: the airy variant (Nick 2026-07-15: the 4-across workflow read too
   dense). Two wide columns, generous gaps, roomier steps. */
.steps.two{grid-template-columns:repeat(2,1fr);gap:36px clamp(40px,6vw,88px);max-width:980px}
.steps.two .step{padding-top:22px}
.steps.two .step p{font-size:14px;max-width:44ch}
@media(max-width:1000px){.steps.four{grid-template-columns:repeat(2,1fr)}}
@media(max-width:900px){.steps{grid-template-columns:1fr}.steps.two{grid-template-columns:1fr;gap:28px}}
@media(max-width:560px){.steps.four{grid-template-columns:1fr}}
.step{border-top:1px solid var(--line);padding:18px 2px 0}
.step .n{font-family:var(--mono);font-size:11px;color:var(--acc-ink);letter-spacing:.14em;margin-bottom:10px}
.step h3{font-family:var(--display);font-size:17px;font-weight:700;letter-spacing:-.02em;margin-bottom:8px}
.step p{font-size:13.5px;color:var(--muted);line-height:1.65}
.plans{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;align-items:stretch}
@media(max-width:900px){.plans{grid-template-columns:1fr}}
/* plan CARDS (Nick 2026-07-15): pricing plans are the ONE surface allowed
   card treatment. Border only, no drop shadow (ghost-card ban); 14px radius. */
.plan{border:1px solid var(--line);border-radius:14px;background:var(--panel);padding:24px 22px;display:flex;flex-direction:column;min-width:0}
.light .plan{background:#fff}
.plan.feat{border-color:var(--acc);position:relative}
.plan.feat::before{content:"MOST POPULAR";position:absolute;top:-9px;left:18px;font-family:var(--mono);font-size:9px;letter-spacing:.14em;background:var(--acc);color:#fff;border-radius:99px;padding:2px 10px}
.plan h3{font-family:var(--display);font-size:18px;font-weight:700;letter-spacing:-.02em;margin-bottom:2px}
.plan .price{font-family:var(--display);font-size:34px;font-weight:800;letter-spacing:-.02em;margin:10px 0 2px}
.plan .price span{font-family:Inter,sans-serif;font-size:13px;font-weight:500;color:var(--dim);letter-spacing:0}
.plan .for{font-size:12.5px;color:var(--dim);margin-bottom:16px}
.plan ul{list-style:none;display:flex;flex-direction:column;gap:9px;font-size:13.5px;color:var(--muted);margin-bottom:20px}
.plan li{padding-left:22px;position:relative;line-height:1.5}
.plan li::before{content:"✓";position:absolute;left:0;color:var(--acc);font-weight:700}
.plan li.no{color:var(--dim)}
.plan li.no::before{content:"×";color:var(--dim)}
.plan .btn{margin-top:auto;justify-content:center}
.signup{border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:30px 2px;display:flex;gap:22px;align-items:center;justify-content:space-between;flex-wrap:wrap}
.signup h3{font-family:var(--display);font-size:20px;font-weight:700;letter-spacing:-.02em}
.signup p{font-size:13.5px;color:var(--muted);margin-top:4px;max-width:46ch}
.signup form{display:flex;gap:10px;flex-wrap:wrap}
.signup input[type=email]{background:var(--bg);border:1px solid var(--line);border-radius:12px;color:var(--text);font:400 14px Inter,sans-serif;padding:12px 16px;min-width:min(260px,100%)}
.signup input[type=email]:focus{outline:2px solid var(--acc2);outline-offset:1px}
.signup-msg{flex-basis:100%;font-size:13px;color:var(--muted);min-height:1em;margin:0}
.feed-meta{display:flex;align-items:center;gap:12px;flex-wrap:wrap}

/* ───────── "one row, opened" specimen (landing, P13) ─────────
   A real feed row rendered the way the detail panel decodes it - the same
   document-excerpt shape as the mail specimen (rules, not a card); reuses
   the .dfacts/.dk/.dv/.ddesc/.dlinks detail-panel classes. */
.openx{border-top:2px solid var(--line);border-bottom:1px solid var(--line);padding:16px 2px 14px;max-width:860px;display:flex;flex-direction:column;gap:10px}
.open-name{font-weight:700;font-size:16px;letter-spacing:-.01em}

/* ───────── alert email specimen (pricing, 2026-07-15) ─────────
   A document excerpt, not a card: rules above and below, mono metadata. */
.mailx{border-top:2px solid var(--line);border-bottom:1px solid var(--line);padding:16px 2px 14px;max-width:860px}
.mail-meta{font-family:var(--mono);font-size:10px;letter-spacing:.12em;color:var(--dim);margin-bottom:8px}
.mail-subj{font-weight:700;font-size:16px;letter-spacing:-.01em;margin-bottom:6px}
.mailx table{font-size:13px}
.mail-foot{margin-top:10px;font-size:12.5px;color:var(--muted);line-height:1.6}

/* ───────── footer ───────── */
footer{border-top:1px solid var(--line);padding:30px 0 40px;margin-top:30px}
.foot-disc{font-size:12px;color:var(--dim);line-height:1.7}
.foot-disc a{color:var(--muted);border-bottom:1px dotted}
.foot-disc a:hover{color:var(--acc2)}
.light .foot-disc a:hover{color:var(--acc)}
.foot-meta{margin-top:14px;font-family:var(--mono);font-size:11px;color:var(--dim);display:flex;gap:18px;flex-wrap:wrap}
.foot-meta a:hover{color:var(--text)}

/* touch targets: 44px minimum on coarse pointers (UI-skills a11y) */
@media(pointer:coarse){
  #feedtbl td{padding:12px 10px}
  .feed-filters input[type=search],.feed-filters select,.feed-filters .ms>summary,.date-f{height:44px}
  .feed-views button{min-height:44px}
}
