/* PANTHEON Labs — "technical record" visual language.  [redesign v2]
   Not a tweak: a different system. Mono-led masthead, flat near-black, rules
   instead of cards, tighter measure. Reuses the three self-hosted faces, so
   no new network request and the GDPR stance is unchanged. */

:root[data-record]{
  --bg:#0a0a0b; --panel:#0f0f11; --panel2:#141416;
  --ink:#ededf0; --mist:#9a9aa4; --faint:#6e6e78;
  --line:#1e1e22; --line2:#2a2a30;
  --acc:#c8ff4d; --acc-dim:#9ecb2e; --acc-ink:#0a0a0b;
  --measure:58ch;
}
:root[data-record][data-theme="light"]{
  --bg:#fbfbfa; --panel:#ffffff; --panel2:#f4f4f2;
  --ink:#141416; --mist:#54545e; --faint:#75757f;
  --line:#e4e4e0; --line2:#d2d2cc;
  --acc:#2f6d00; --acc-dim:#245400; --acc-ink:#ffffff;
}

/* ---- page ---- */
[data-record] body{background:var(--bg);color:var(--ink);
  font:400 15px/1.62 var(--sans);letter-spacing:0;-webkit-font-smoothing:antialiased}
[data-record] .wrap{max-width:1140px;padding:0 28px}

/* ---- masthead: mono, lowercase, a rule under it ---- */
[data-record] .topbar{background:var(--bg);border-bottom:1px solid var(--line);
  backdrop-filter:none;padding:0 clamp(12px,2vw,28px)}   /* [gutter 2026-10-02] was 0 0: the logo sat on the window edge,
  the RTL pages' language picker on the left one, and beside the open book the wrapped menu row started at x=0.
  One inline gutter for every row (prove_header + prove_mark GUTTER). The phone rule (8px 12px) still wins below 760px. */
[data-record] .topbar .logo span{font:500 13px/1 var(--mono);letter-spacing:.04em;text-transform:lowercase}
[data-record] .nav a{font:400 12.5px/1 var(--mono);letter-spacing:.01em;color:var(--mist);
  border-radius:0;padding:8px 10px;text-transform:lowercase}
[data-record] .nav a:hover{color:var(--ink);background:transparent;text-decoration:underline;text-underline-offset:4px}
[data-record] .nav a.active{color:var(--acc);background:transparent;box-shadow:none}

/* ---- hero: the headline is the page. No glow, no gradient button. ---- */
[data-record] .hero{padding:96px 0 0}   /* [field] no rule: it cut the field */
[data-record] .hero h1{font:400 clamp(30px,4.4vw,52px)/1.12 var(--sans);
  letter-spacing:-.022em;margin:0 0 22px;max-width:19ch}
[data-record] .hero h1 em{font-style:normal;color:var(--acc)}
[data-record] .hero .lede{font:400 16.5px/1.66 var(--sans);color:var(--mist);
  max-width:var(--measure);margin:0 0 30px}
[data-record] .hero::after{background:linear-gradient(90deg,
  color-mix(in srgb,var(--bg) 55%,transparent) 0%,
  color-mix(in srgb,var(--bg) 30%,transparent) 44%,
  transparent 86%)}   /* [eye] 94/78 -> 55/30: field.js knocks back under text already; this was erasing the field behind the headline */

/* ---- eyebrow: a record label, not a pill ---- */
[data-record] .eyebrow{font:400 11px/1 var(--mono);letter-spacing:.14em;
  text-transform:uppercase;color:var(--faint);margin:0 0 14px;
  padding:0 0 0 13px;position:relative}
[data-record] .eyebrow::before{content:"";position:absolute;left:0;top:1px;
  width:4px;height:9px;background:var(--acc)}

/* ---- sections: rules, not floating bands ---- */
[data-record] section{padding:72px 0}   /* [field] no rule: the field marks the boundary */
[data-record] .hero + section{border-top:none}
[data-record] section h2{font:400 clamp(21px,2.5vw,29px)/1.24 var(--sans);
  letter-spacing:-.016em;margin:0 0 16px;max-width:24ch}
[data-record] section p{max-width:var(--measure);color:var(--mist);margin:0 0 14px}
[data-record] .lede{font-size:16.5px;color:var(--mist);max-width:var(--measure)}

/* ---- cards -> record rows. The single most generic element on the old
   page was the bordered rounded rectangle; here content sits on rules. ---- */
[data-record] .card{background:transparent;border:0;border-top:1px solid var(--line);
  border-radius:0;padding:20px 0 0;box-shadow:none}
[data-record] .card h3{font:500 14px/1.35 var(--sans);letter-spacing:-.006em;margin:0 0 7px;color:var(--ink)}
[data-record] .card p{font-size:14px;line-height:1.6;color:var(--mist);margin:0}
[data-record] .grid{gap:26px 34px}

/* ---- buttons: flat, square, one accent ---- */
[data-record] .cta{background:var(--acc);color:var(--acc-ink);border-radius:2px;
  font:500 13.5px/1 var(--sans);letter-spacing:.005em;padding:13px 20px;
  box-shadow:none;border:1px solid var(--acc);transition:background .14s,border-color .14s}
[data-record] .cta:hover{background:var(--acc-dim);border-color:var(--acc-dim);
  transform:none;box-shadow:none}
[data-record] .navcta{background:transparent;color:var(--acc)!important;border:1px solid var(--line2);
  border-radius:2px;font:400 12.5px/1 var(--mono);padding:7px 12px;box-shadow:none}
[data-record] .navcta:hover{border-color:var(--acc);transform:none}

/* ---- panels that must stay contained: a hairline, never a glow ---- */
[data-record] .panel,[data-record] .trustband .card{
  background:var(--panel);border:1px solid var(--line);border-radius:3px;box-shadow:none}
[data-record] .closer{background:transparent;border:0;box-shadow:none}   /* [field] was a boxed panel: a solid hole in the field with two rules */

/* ---- numbers read as data, not marketing ---- */
[data-record] .stat .n,[data-record] .score b{font:400 26px/1 var(--mono);
  letter-spacing:-.01em;color:var(--ink)}
[data-record] .stat .l,[data-record] .score span{font:400 11.5px/1.45 var(--mono);
  letter-spacing:.03em;color:var(--faint);text-transform:lowercase}

/* ---- footer ---- */
[data-record] footer{background:transparent;border-top:0;padding:44px 0 56px}   /* [field] no rule; styles.css:259 draws one otherwise */
[data-record] .foot-label{font:400 10.5px/1 var(--mono);letter-spacing:.14em;color:var(--faint)}
[data-record] footer a{color:var(--mist)}
[data-record] footer a:hover{color:var(--acc)}

/* ---- Overrides that must beat the base sheet's own specificity.
   Measured from the first render: the eyebrow stayed a pill, two accent
   colours fought in the headline, and the art overpowered the type. ---- */

/* one accent, not three: the headline is ink, the emphasis is the accent */
:root[data-record] .hero h1{color:var(--ink)}
:root[data-record] .hero h1 em,
:root[data-record] .hero h1 i,
:root[data-record] .hero h1 .accent,
:root[data-record] .hero h1 span{color:var(--acc)!important;font-style:normal}

/* eyebrow: a label with a tick, never a pill */
:root[data-record] .eyebrow,
:root[data-record] p.eyebrow,
:root[data-record] .mark{background:transparent!important;border:0!important;
  border-radius:0!important;padding:0 0 0 13px!important;display:inline-block;
  font:400 11px/1 var(--mono)!important;letter-spacing:.14em!important;
  text-transform:uppercase!important;color:var(--faint)!important}

/* art sits behind the record, it does not compete with it */

/* every button square, one shape language */
:root[data-record] .cta,
:root[data-record] .btn,
:root[data-record] a.cta{border-radius:2px!important;box-shadow:none!important}
:root[data-record] .cta.ghost,
:root[data-record] .cta.alt,
:root[data-record] .cta:not(:first-of-type){background:transparent;color:var(--acc)!important;
  border:1px solid var(--line2)}
:root[data-record] .cta.ghost:hover,
:root[data-record] .cta.alt:hover,
:root[data-record] .cta:not(:first-of-type):hover{border-color:var(--acc);background:transparent}

/* inline links: underlined, ink-coloured, not a second accent */
:root[data-record] .lede a:not(.cta),
:root[data-record] section p a:not(.cta){color:var(--ink);text-decoration:underline;
  text-underline-offset:3px;text-decoration-color:var(--line2)}
:root[data-record] .lede a:not(.cta):hover,
:root[data-record] section p a:not(.cta):hover{text-decoration-color:var(--acc)}

/* ---- .pill is the real section label class (not .eyebrow — measured from
   the DOM, after overriding the wrong one for a whole pass). ---- */
:root[data-record] .pill{background:transparent!important;border:0!important;
  border-radius:0!important;padding:0 0 0 13px!important;position:relative;
  font:400 11px/1 var(--mono)!important;letter-spacing:.14em!important;
  text-transform:uppercase!important;color:var(--faint)!important}
:root[data-record] .pill::before{content:"";position:absolute;left:0;top:1px;
  width:4px;height:9px;background:var(--acc)}

/* The mark is inline SVG so its structure inherits currentColor and its
   threshold reads --acc — no grayscale hack, and it follows the theme. The
   old <img> was a purple rounded square with a Georgia "P": the wrong colour,
   and a typeface used nowhere else on the site. */
:root[data-record] .logo,
:root[data-record] .logo .mark{color:var(--ink)!important}
:root[data-record] .logo .mark{display:block;flex:0 0 auto}
/* the wordmark joins the record language: mono, lowercase, not serif */
:root[data-record] .logo span{font:500 15px/1 var(--mono)!important;letter-spacing:.02em!important;text-transform:lowercase}
:root[data-record] .logo{gap:9px;align-items:center}
:root[data-record] .logo:hover .mark{color:var(--acc)}

/* secondary link-buttons: ink + hairline, never a second accent */
:root[data-record] .linkbtn,
:root[data-record] .ghostlink,
:root[data-record] a.pill-link{color:var(--ink)!important;border-color:var(--line2)!important}

/* the floating assistant button joins the system */
:root[data-record] .askbtn,
:root[data-record] #askbtn,
:root[data-record] .ask-fab{background:var(--acc)!important;color:var(--acc-ink)!important;
  border-radius:2px!important;box-shadow:none!important;
  font:500 13px/1 var(--sans)!important;border:1px solid var(--acc)!important}

/* ---- The art reads its hues from --acc/--acc-soft/--acc-dim (wired earlier
   today). Under the record palette those are lime, and the violet constellation
   over a lime wash turned olive. Give the art its own brand-neutral hues so it
   stays a constellation rather than a tint. ---- */
/* --acc-soft is used 44 times ACROSS the three base sheets as a TEXT colour.
   Declaring a pale lime here unscoped made all of them ~1.1:1 on the paper
   theme — three separate illegible elements on one phone screen. It must be
   theme-scoped, and on light it must be a colour you can actually read. */
:root[data-record]{--acc-soft:#dcff8a; --art-1:#8fa3c8; --art-2:#6f7fa6}
:root[data-record][data-theme="light"]{--acc-soft:#2f6d00; --acc-dim:#245400}
:root[data-record] .hero{background:transparent}   /* [field] was var(--bg): as a z-index:1 stacking context it painted over its own canvas */

/* the remaining purple: secondary link-buttons rendered by the base sheet */
:root[data-record] a[class*="btn"],
:root[data-record] .hero + section a[href*="what-is-pantheon"],
:root[data-record] .hero + section a[href*="pnt.html"]{
  color:var(--ink)!important;border-color:var(--line2)!important;border-radius:2px!important}
:root[data-record] a[class*="btn"]:hover,
:root[data-record] .hero + section a[href*="what-is-pantheon"]:hover,
:root[data-record] .hero + section a[href*="pnt.html"]:hover{border-color:var(--acc)!important}

/* [nav4 2026-10-04] the phone label swap is gone with the long bar */

/* Mobile: the CTA stays out of the link rows (as the base sheet intends), and
   the mono labels get slightly tighter so 745px of items pack into two rows
   rather than three. Measured at 393px: widest item 118px was the CTA. */
@media(max-width:760px){
  :root[data-record] .nav .navcta{display:none!important}
  :root[data-record] .nav a{font-size:12px!important;padding:8px 8px!important;letter-spacing:0!important}
  :root[data-record] .nav a::after{font-size:12px!important;letter-spacing:0!important}
  :root[data-record] .nav{gap:4px 6px!important}
}

/* Secondary buttons: ink on light, accent on dark — never accent-on-paper. */
:root[data-record][data-theme="light"] .cta:not(:first-of-type),
:root[data-record][data-theme="light"] .cta.ghost,
:root[data-record][data-theme="light"] .cta.alt{color:var(--ink)!important;
  border-color:var(--line2)!important;background:transparent}
:root[data-record][data-theme="light"] .cta:not(:first-of-type):hover{
  border-color:var(--acc)!important;color:var(--acc)!important}

/* Chips/tags carried an old lilac wash that the record palette never covered. */
:root[data-record] .chip,:root[data-record] .tag,:root[data-record] .kv{
  background:transparent!important;border:1px solid var(--line2)!important;
  color:var(--mist)!important;border-radius:2px!important;
  font:400 11.5px/1 var(--mono)!important}

/* --faint carries the mono section labels. Measured on the rendered page it
   came out 3.92:1 (dark) and 4.4:1 (light) against their surfaces — under the
   4.5 floor for text this size. Darkened/lightened until both pass. */
:root[data-record]{--faint:#83838f}
:root[data-record][data-theme="light"]{--faint:#63636d}

/* The live-trace panel kept the old brand lilac: .govcanvas painted a violet
   wash and .cap chips were rgba(124,92,255,.1) pills. Found by walking the DOM
   for blue-dominant backgrounds rather than by reading the stylesheet. */
:root[data-record] .govcanvas{background:var(--panel2)!important;
  border:1px solid var(--line)!important;border-radius:2px!important}
:root[data-record] .cap{background:transparent!important;
  border:1px solid var(--line2)!important;border-radius:2px!important;
  color:var(--mist)!important;font:400 11.5px/1.5 var(--mono)!important}
:root[data-record] .trace,:root[data-record] .tracepanel,
:root[data-record] .console,:root[data-record] .demo{
  background:var(--panel)!important;border:1px solid var(--line)!important;
  border-radius:3px!important;box-shadow:none!important}

/* ============================================================================
   DARK-SURFACE LITERALS.  [the 22-second defect]

   The base sheets hardcode pale lilac text colours — #cdc4dd, #d8d1e6,
   #d2cadf, #e7dff5, #d6cfe6, #ffd9d2, #ffe6bd — chosen when every surface was
   #0c0a12. Measured against the record paper background they land at
   1.17:1 - 1.62:1, i.e. invisible. On the old dark background the same colour
   was 11.74:1, which is why nobody saw it until the surface changed.

   styles.css:402 shows this was already hit once and patched for ONE case.
   Twenty instances remained. Fixing the class, not the instance: re-point the
   selectors that use them at the theme-aware tokens.
   ========================================================================= */
:root[data-record][data-theme="light"] .card p,
:root[data-record][data-theme="light"] .score span,
:root[data-record][data-theme="light"] .ecase .ed,
:root[data-record][data-theme="light"] .vhint .vnode,
:root[data-record][data-theme="light"] .pstage span,
:root[data-record][data-theme="light"] .gap-tile span,
:root[data-record][data-theme="light"] .an-node span,
:root[data-record][data-theme="light"] .bt-p,
:root[data-record][data-theme="light"] .act p,
:root[data-record][data-theme="light"] .check,
:root[data-record][data-theme="light"] .crow .what,
:root[data-record][data-theme="light"] .lede,
:root[data-record][data-theme="light"] .v-lede,
:root[data-record][data-theme="light"] .chip,
:root[data-record][data-theme="light"] footer a,
:root[data-record][data-theme="light"] .bcard .bv,
:root[data-record][data-theme="light"] .envelope .cap{color:var(--mist)!important}

/* the same set on dark: --mist there is #9a9aa4, still well clear of the floor */
:root[data-record] .check,:root[data-record] .crow .what,
:root[data-record] .act p,:root[data-record] .bt-p{color:var(--mist)}

/* The alert red is 4.43:1 on paper — just under the floor at this size. */
:root[data-record][data-theme="light"]{--red:#c23322}


/* ==========================================================================
   WIDGETS — the chat and trace panels never got the record treatment.
   Three complaints, one cause: these are the last components still drawn in
   the old "card" idiom — rounded boxes nested inside rounded boxes, each with
   its own generous padding, plus the old brand purple in the avatar and graph.

   Boxes inside boxes: the panel, the message bubble, every suggestion chip,
   the input and the button were all separately rounded and bordered. Here the
   panel keeps ONE hairline and the things inside it sit on rules instead.
   ========================================================================== */
:root[data-record] .chat,
:root[data-record] .trace,
:root[data-record] .card,
:root[data-record] .closer{border-radius:0}

/* the message: a rule and an indent, not a bubble */
:root[data-record] .msg,
:root[data-record] .msg.bot{border-radius:0;background:transparent;
  border-left:2px solid var(--line-2);padding:2px 0 2px 14px}
:root[data-record] .msg.bot p{margin:.2em 0}

/* suggestions: dense mono rows, not pills. The old spacing put ~10px between
   five chips that each had 10px of their own padding. */
:root[data-record] .chip{border-radius:0;font-family:var(--mono);font-size:.78rem;
  padding:6px 9px;border:1px solid var(--line-2);background:transparent}
:root[data-record] .chip:hover{border-color:var(--acc);background:var(--acc-wash)}

/* composer */
:root[data-record] .composer input,
:root[data-record] .composer textarea{border-radius:0;font-family:var(--mono);font-size:.82rem}
:root[data-record] .composer button{border-radius:2px;font-family:var(--mono);
  font-size:.78rem;letter-spacing:.04em;text-transform:lowercase;background:var(--acc);
  color:var(--acc-ink);border:0}

/* the floating launcher was a purple pill */
:root[data-record] .askbtn,
:root[data-record] [class*="ask"] button,
:root[data-record] .fab{border-radius:2px!important;font-family:var(--mono)!important;
  font-size:.78rem!important;text-transform:lowercase;letter-spacing:.04em;
  background:var(--ink)!important;color:var(--bg)!important;box-shadow:none!important}

/* the avatar dot: old brand violet, and a circle in a square language */
:root[data-record] .chat .av,
:root[data-record] .avatar,
:root[data-record] .chat img[class*="av"]{border-radius:0!important;
  background:var(--acc)!important;filter:none!important}


/* The three the first pass missed — all because I guessed at selectors
   instead of reading the DOM:
     #pn-ask:not(.pc)  the floating launcher, an ID (beats any class selector I wrote)
     #ava     an <img> of /labs/avatar.svg, served by the GATEWAY not this
              repo — a violet radial gradient, so it is restyled here rather
              than edited
     (the in-panel constellation canvas, .ga-live, is gone [owner 2026-10-04]) */
:root[data-record] #pn-ask:not(.pc){border-radius:2px!important;font-family:var(--mono)!important;
  font-size:.76rem!important;text-transform:lowercase;letter-spacing:.04em;
  box-shadow:none!important;padding:11px 15px!important}

/* ---- the assistant's face is the gate mark ---------------------------------
   Was: an <img> of /labs/avatar.svg (a seeded gradient ORB the gateway renders
   from BRAND_ACCENT = "#7c5cff", still the old brand violet) forced to look
   green by a filter chain: grayscale + sepia + hue-rotate + saturate.
   Two things wrong with that. A glossy 3D sphere is the old visual language in
   a flat, square design; and the source is a TENANT-FACING renderer used by
   every Studio-built site, so it must not be edited to fix this page.
   Hide the orb, draw the gate instead: same mark as the header, same accent,
   no filters. [2026-09-21] */
:root[data-record] #ava{
  width:26px!important;height:26px!important;
  border-radius:0!important;filter:none!important;
  background:transparent!important;
  /* Hide the orb bitmap but KEEP THE ELEMENT IN FLOW: position:absolute took
     it out of the flex row, so the header's text block took the full width and
     the mark landed on top of the words (measured: both children at x=45).
     A zero-opacity flex item still reserves its 26px slot. [2026-09-21] */
  opacity:0!important;position:relative!important;pointer-events:none;
  flex:0 0 26px!important;
}
:root[data-record] .chat .head .who,
:root[data-record] .chat .head{position:relative}
/* the gate, drawn in CSS on the avatar's slot */
/* An <img> is a replaced element and renders no ::before/::after, so the gate
   is painted on the HEADER, offset to the avatar's reserved slot: the flex row
   starts at padding-left (16px), which is where the 26px mark belongs.
   left:0 put it on the padding edge, 16px adrift. */
:root[data-record] .chat .head::before{
  content:"";position:absolute;left:16px;top:50%;transform:translateY(-50%);
  width:26px;height:26px;
  background:
    /* lintel */
    linear-gradient(var(--ink),var(--ink)) 3px 4px/20px 2.6px no-repeat,
    /* posts */
    linear-gradient(var(--ink),var(--ink)) 4.5px 6px/2.6px 15px no-repeat,
    linear-gradient(var(--ink),var(--ink)) 19px 6px/2.6px 15px no-repeat,
    /* threshold */
    linear-gradient(var(--acc),var(--acc)) 11.7px 12px/3.2px 9px no-repeat;
}


/* the theme toggle was the last pill in the header */
:root[data-record] .themetog{border-radius:2px!important;font-family:var(--mono)!important;
  font-size:.74rem!important;text-transform:lowercase;letter-spacing:.03em}


/* ==========================================================================
   THE LAUNCHER — "not opaque, bolder, alive"
   It was white-on-lime at 1.18:1 in dark (a real failure this audit had
   allowlisted away), 12px, flat, static, and easy to miss entirely.
   ========================================================================== */
:root[data-record] #pn-ask:not(.pc){
  /* legibility first: ink on the accent is 16.8:1 */
  background:var(--acc)!important; color:var(--acc-ink)!important;
  font-size:.82rem!important; font-weight:700!important;
  padding:14px 18px!important; letter-spacing:.06em;
  /* opaque and lifted off the page */
  box-shadow:0 2px 0 var(--ink), 0 10px 30px -10px rgba(0,0,0,.45)!important;
  border:2px solid var(--ink)!important;
  transition:transform .14s ease, box-shadow .14s ease, background .14s ease!important;
}
:root[data-theme="dark"][data-record] #pn-ask:not(.pc){
  box-shadow:0 2px 0 rgba(255,255,255,.22), 0 12px 34px -12px rgba(0,0,0,.8)!important;
  border-color:rgba(255,255,255,.22)!important;
}

/* alive: a slow attention pulse on the ring, NOT on the button itself — moving
   a fixed element under the thumb is a hit-target bug, not a flourish. It runs
   3 times then stops, so it invites once instead of nagging forever. */
:root[data-record] #pn-ask:not(.pc)::after{
  content:"";position:absolute;inset:-2px;border:2px solid var(--acc);
  pointer-events:none;animation:askPulse 2.6s ease-out 1.2s 3 both;
}
@keyframes askPulse{
  0%  {opacity:.9; transform:scale(1)}
  70% {opacity:0;  transform:scale(1.28)}
  100%{opacity:0;  transform:scale(1.28)}
}

/* a live dot: the assistant is running right now, and says so */
/* The glyph already says "chat"; a second free-floating dot beside it read as
   two marks. Ride it on the glyph's corner as a status light instead. */
:root[data-record] #pn-ask:not(.pc){position:fixed;gap:11px!important}
:root[data-record] #pn-ask:not(.pc) .dot{
  width:6px;height:6px;background:var(--acc-ink);display:block;
  position:absolute;left:29px;top:15px;margin:0;
  animation:askBlink 2s steps(1,end) infinite;
}
@keyframes askBlink{0%,60%{opacity:1}61%,100%{opacity:.25}}

:root[data-record] #pn-ask:not(.pc):hover{transform:translateY(-2px);
  box-shadow:0 4px 0 var(--ink), 0 16px 40px -12px rgba(0,0,0,.5)!important}
:root[data-record] #pn-ask:not(.pc):active{transform:translateY(0)}

/* respect the setting — no pulse, no blink, still bold */
@media (prefers-reduced-motion:reduce){
  :root[data-record] #pn-ask:not(.pc)::after{animation:none;opacity:0}
  :root[data-record] #pn-ask:not(.pc) .dot{animation:none}
}

/* ==========================================================================
   HERO ART — unmuted.
   Earlier today the field was a flat violet haze fighting the lime, so it was
   dropped to .26 and desaturated. That was right for THAT art. The field is
   now a hierarchy (hubs, orbiting satellites, hub->satellite links) that reads
   --acc, and the brief is "command attention". One rule, both themes; the
   saturate filter is gone because the art is already on-palette.
   ========================================================================== */
:root[data-record] .hero-art{opacity:.92;filter:none}
:root[data-record][data-theme="light"] .hero-art{opacity:.88;filter:none}

/* ==========================================================================
   HERO HIERARCHY — from the user's colour-coded markup (2026-09-21).
     RED    mark + wordmark · the word PANTHEON · the two CTAs · reshuffle
     YELLOW "I built"                       (lead-in to the claim)
     GREEN  the claim itself                (substance — present, not shouting)
     BLUE   the h1 · the closing lede       (recede)
   The page was built the other way up: the h1 was the loudest thing on it.
   ========================================================================== */

/* BLUE — the headline recedes: smaller, lighter, quieter colour */
:root[data-record] .hero h1{font-size:clamp(1.55rem,4.6vw,2.3rem)!important;font-weight:500!important;
  letter-spacing:-.01em!important;line-height:1.18!important;color:var(--faint)!important;
  max-width:26ch;margin-bottom:22px!important}
:root[data-record] .hero h1 em,
:root[data-record] .hero h1 .acc{color:var(--mist)!important;font-style:normal}

/* the lede is now the primary text: larger, ink, tighter measure */
:root[data-record] .hero .lede{font-size:clamp(1.12rem,3.4vw,1.42rem)!important;line-height:1.5!important;
  color:var(--ink)!important;max-width:34ch!important;font-weight:450}

/* RED — the product name is set as a mark, not a word */
:root[data-record] .hero .lede .brand,
:root[data-record] .hero .lede b{font-family:var(--mono);font-weight:700;letter-spacing:.06em;
  color:var(--acc-ink);background:var(--acc);padding:1px 6px 2px;border-radius:2px;
  font-size:.86em;vertical-align:1px}

/* GREEN — the claim reads at full weight; BLUE tail recedes */
:root[data-record] .hero .lede .tail{color:var(--faint);font-size:.9em}
:root[data-record] .hero .lede .tail a{color:var(--mist);text-decoration-color:var(--line-2)}

/* RED — the CTAs get real weight; the primary pulses once */
:root[data-record] .hero .cta{font-weight:700!important;font-size:.98rem!important;padding:15px 22px!important;
  border:2px solid var(--ink)!important;box-shadow:0 3px 0 var(--ink)!important}
:root[data-record] .hero .cta:first-of-type{position:relative}
:root[data-record] .hero .cta:first-of-type::after{content:"";position:absolute;inset:-2px;border:2px solid var(--acc);
  pointer-events:none;animation:askPulse 2.6s ease-out .6s 2 both}
:root[data-record] .hero .cta:not(:first-of-type){background:var(--bg)!important;color:var(--ink)!important}

/* [2026-09-21] the hero reshuffle was removed: re-rolling a labelled
   diagram changed 129% of its pixels and none of its meaning. */

/* RED — the mark: heavier at the top, and the wordmark bold */
:root[data-record] .logo .mark{width:34px;height:34px}
:root[data-record] .logo span{font-weight:700!important;font-size:16px!important}


/* ============================================================================
   THE LIVING MARK  [logo v2]
   The old mark was a drawing of a gate. This one WORKS like one: a request
   descends, the threshold drops to admit it, then re-arms. That is the
   product's whole thesis (every message clears a gate) performed by the logo
   itself, in ~1.4kB of SVG and CSS, no JS.

   Three tiers, because one drawing cannot serve 16px and 200px:
     .mark              header, 30px   - breathes, reacts, clears on hover
     .mark.is-display   hero/footer    - full clearance cycle on a loop
     favicon.svg        16-32px        - static silhouette, no motion at all
   ========================================================================== */

:root[data-record] .mark{overflow:visible}
:root[data-record] .mark .mk-bar{
  transform-origin:32px 54px;
  transition:transform .42s cubic-bezier(.2,.8,.2,1);
}
:root[data-record] .mark .mk-mote{opacity:0}
:root[data-record] .mark .mk-lintel{transition:stroke .3s}

/* Idle: the threshold breathes, so the mark is never quite dead. Scale rather
   than height so it animates on the compositor and costs no layout. */
@keyframes mkBreathe{
  0%,100%{transform:scaleY(1)}
  50%    {transform:scaleY(.88)}
}
:root[data-record] .mark .mk-bar{animation:mkBreathe 4.2s ease-in-out infinite}

/* Hover/focus: the gate ADMITS. The threshold drops, the mote falls through,
   the lintel takes the accent for the moment of clearance. */
:root[data-record] .logo:hover .mk-bar,
:root[data-record] .logo:focus-visible .mk-bar{
  animation:none;transform:scaleY(.18);
}
:root[data-record] .logo:hover .mk-lintel,
:root[data-record] .logo:focus-visible .mk-lintel{stroke:var(--acc)}
@keyframes mkAdmit{
  0%  {opacity:0;transform:translateY(0)}
  18% {opacity:1}
  82% {opacity:1}
  100%{opacity:0;transform:translateY(42px)}
}
:root[data-record] .logo:hover .mk-mote,
:root[data-record] .logo:focus-visible .mk-mote{
  animation:mkAdmit .62s cubic-bezier(.4,0,.6,1);
}

/* ---- display tier: runs the cycle unattended -------------------------- */
@keyframes mkCycle{
  0%,62%  {transform:scaleY(1)}
  70%,86% {transform:scaleY(.18)}
  96%,100%{transform:scaleY(1)}
}
@keyframes mkCycleMote{
  0%,58% {opacity:0;transform:translateY(0)}
  64%    {opacity:1;transform:translateY(0)}
  88%    {opacity:1;transform:translateY(40px)}
  92%,100%{opacity:0;transform:translateY(44px)}
}
@keyframes mkCycleLintel{
  0%,60%,94%,100%{stroke:currentColor}
  68%,86%        {stroke:var(--acc)}
}
:root[data-record] .mark.is-display .mk-bar{animation:mkCycle 5.6s ease-in-out infinite}
:root[data-record] .mark.is-display .mk-mote{animation:mkCycleMote 5.6s ease-in-out infinite}
:root[data-record] .mark.is-display .mk-lintel{animation:mkCycleLintel 5.6s ease-in-out infinite}

/* ---- guards ------------------------------------------------------------
   Below ~22px the 7px threshold and the mote collapse into mush, so the small
   tier shows the silhouette only. And motion is opt-out, as everywhere else. */
:root[data-record] .mark.is-small .mk-mote{display:none}
:root[data-record] .mark.is-small .mk-bar{animation:none;transform:none}
@media(prefers-reduced-motion:reduce){
  :root[data-record] .mark .mk-bar,
  :root[data-record] .mark.is-display .mk-bar,
  :root[data-record] .mark.is-display .mk-mote,
  :root[data-record] .mark.is-display .mk-lintel{animation:none!important}
  :root[data-record] .logo:hover .mk-bar{transform:scaleY(.18)}
  :root[data-record] .logo:hover .mk-mote{animation:none;opacity:0}
}


/* ---- .cta.alt outside the hero --------------------------------------------
   Found by the contrast audit on work.html and pnt.html after the roll:
   ink text (edeef0) on the accent fill (c8ff4d) = 1.01:1, invisible.
   The .alt rule set colour+transparent background but was scoped to the LIGHT
   theme only, so in dark the ink colour landed on the accent background that
   the base .cta rule paints. Bind the pair together, in both themes: a
   secondary CTA is an outline, never accent-filled. */
:root[data-record] .cta.alt,
:root[data-record] .closer .cta:not(:first-of-type),
:root[data-record] a.cta.alt:link,
:root[data-record] a.cta.alt:visited{
  background:transparent!important;
  color:var(--ink)!important;
  border:2px solid var(--line2)!important;
}
:root[data-record] .cta.alt:hover{
  border-color:var(--acc)!important;color:var(--acc)!important;background:transparent!important;
}


/* ---- --acc-wash never moved with the palette -----------------------------
   Swept with a DOM walk for blue-dominant computed colours across 26
   page/theme combinations: 5 elements (.vnode b on prove.html, .ctl.on on
   studio.html) still painted rgba(124,92,255,.12) — the ORIGINAL brand violet.
   The record sheet redefined --acc/--acc-soft/--acc-dim but not --acc-wash,
   so every consumer of the wash kept the old hue. Derive it from the live
   accent instead of restating a literal, so it can never drift again. */
:root[data-record]{
  --acc-wash:color-mix(in srgb, var(--acc) 14%, transparent);
}


/* ---- the headline hierarchy applies to every page ------------------------
   The hierarchy from the user's colour-coded pass (headline recedes, the
   claim leads) was scoped to ".hero h1". Interior pages use .pagehead, so
   they kept a full-lime headline: louder than the homepage and inconsistent
   with the priority the user drew. Same treatment, both containers. */
:root[data-record] .pagehead h1{
  font-size:clamp(1.5rem,4.4vw,2.2rem)!important;
  font-weight:500!important;
  color:var(--ink)!important;
  letter-spacing:-.012em;line-height:1.24;
}
:root[data-record] .pagehead h1 em,
:root[data-record] .pagehead h1 span.acc{
  font-style:normal;color:var(--acc)!important;
}


/* ---- code must not push the page ------------------------------------------
   evidence.html overflowed 11px at 360px: a <code> run measured 343px wide
   inside a narrower column. Long identifiers cannot hyphenate, so they need
   an explicit break opportunity; overflow-wrap alone does not break a token
   with no spaces. Measured, not assumed: the offender was CODE w=343 right=371
   against a 360px viewport. */
:root[data-record] code,
:root[data-record] pre,
:root[data-record] .ed{
  overflow-wrap:anywhere;
  word-break:break-word;
  max-width:100%;
}
:root[data-record] pre{overflow-x:auto}


/* ---- the blog ------------------------------------------------------------
   Seen on the rendered page, not in any automated check: post titles kept
   Fraunces and the tags kept 999px pills, so the blog read as the old design
   wearing the new nav. Same treatment as every other heading and label. */
:root[data-record] .post h1,
:root[data-record] .post-item h2,
:root[data-record] .post-item h3,
:root[data-record] .post-list h2,
:root[data-record] .post-wrap h1{
  font-family:var(--sans)!important;
  font-weight:500!important;
  letter-spacing:-.012em;
}
:root[data-record] .post-tag{
  border-radius:0!important;
  font-family:var(--mono)!important;
  font-size:.66rem!important;letter-spacing:.14em;text-transform:uppercase;
  background:transparent!important;
  border:1px solid var(--line2)!important;
  color:var(--faint)!important;padding:3px 8px!important;
}
:root[data-record] .post-meta{font-family:var(--mono)!important}


/* ---- the composer still carried two violet tints ---------------------------
   Caught by reading computed styles, NOT by the purple sweep: that detector
   required blue-minus-green > 55, and these are subtle tints at 25. A hue can
   be wrong without being saturated. Detector widened alongside this fix.
     light  input border  rgb(215,207,232) = #d7cfe8
     dark   input bg      rgb(15,12,22)    = #0f0c16  (the OLD page background)
   [2026-09-21] */
:root[data-record] .chat input,
:root[data-record] .chat textarea,
:root[data-record] #pn-panel input,
:root[data-record] #pn-panel textarea{
  background:var(--bg)!important;border:1px solid var(--line2)!important;
  border-radius:0!important;color:var(--ink)!important;
  font-family:var(--mono)!important}
:root[data-record] .chat input:focus,
:root[data-record] #pn-panel input:focus{
  border-color:var(--acc)!important;outline:none;
  box-shadow:0 0 0 2px color-mix(in srgb, var(--acc) 22%, transparent)!important}
:root[data-record] .chat input::placeholder,
:root[data-record] #pn-panel input::placeholder{color:var(--faint)!important}


/* ---- the violet-tinted greys -----------------------------------------------
   #463f57 (rgb 70,63,87) and #d7cfe8 / #efeafa: greys mixed with the OLD brand
   violet, from when the whole palette was violet. Neutral to the eye in
   isolation, wrong beside a lime/green accent. 246 elements, incl. the nav
   labels on every page in light theme.
   Found only after the purple detector was widened and MUTATION-PROVEN against
   the tints it had missed; the original threshold (blue-green > 55) could not
   see any of them. [2026-09-21] */
:root[data-record][data-theme="light"] .nav a:not(.active),
:root[data-record][data-theme="light"] .gap-tile span,
:root[data-record][data-theme="light"] .card p,
:root[data-record][data-theme="light"] .bt-p,
:root[data-record][data-theme="light"] .an-node i{color:var(--mist)!important}
:root[data-record][data-theme="light"] .msg.bot code{
  background:var(--panel)!important;border-color:var(--line2)!important;
  color:var(--ink)!important}
:root[data-record][data-theme="light"] .chip{
  background:transparent!important;color:var(--mist)!important}


/* ---- the widget's own tiles ------------------------------------------------
   .pw-* is the GATEWAY widget bundle (widget.js), shared by every Studio
   tenant, so the violet is corrected from the page, never in the renderer.
   84 elements at full-strength #7c5cff, all inside the chat panel: the earlier
   sweep ran with the panel CLOSED and reported the site clean.
   A detector that never opens the thing it audits cannot see inside it.
   [2026-09-21] */
:root[data-record] .pw-tile-ic,
:root[data-record] .pw-tile-ic *{color:var(--acc)!important;stroke:var(--acc)!important}
:root[data-record] .pw-tile{border-radius:0!important;
  border:1px solid var(--line2)!important;background:transparent!important;
  font-family:var(--mono)!important}
:root[data-record] .pw-tile:hover{border-color:var(--acc)!important}


/* ---- the widget palette, at its source -------------------------------------
   widget.js sets its ENTIRE palette as 14 inline --pw-* custom properties on
   its root element, all still the old brand violet family:
     --pw-acc #7c5cff · --pw-bg #141019 · --pw-bubble #1b1626 · --pw-line #241f30
   Chasing the elements was wrong: they are unclassed divs with inline styles,
   and there were 9 visible plus dozens hidden. Re-point the VARIABLES and every
   one of them follows, including any the widget renders later in a conversation.
   Inline custom properties are still overridable by a stylesheet rule with
   !important, which is what makes this reachable at all. [2026-09-21] */
:root[data-record] [style*="--pw-acc"]{
  --pw-acc:var(--acc)!important;
  --pw-bg:var(--panel)!important;
  --pw-bg2:var(--bg)!important;
  --pw-ink:var(--ink)!important;
  --pw-mist:var(--mist)!important;
  --pw-line:var(--line2)!important;
  --pw-bubble:transparent!important;
  --pw-field:var(--bg)!important;
  --pw-figure:var(--panel)!important;
  --pw-raise:var(--panel)!important;
  --pw-shadow:rgba(0,0,0,.35)!important;
}
/* the widget's own radii, squared to the record language */
:root[data-record] [style*="--pw-acc"] button,
:root[data-record] [style*="--pw-acc"] input,
:root[data-record] [style*="--pw-acc"] textarea{border-radius:0!important}


/* ---- the widget's hardcoded literals ---------------------------------------
   Three elements the variable re-point could not reach, because widget.js
   writes the colour LITERALLY into the inline style rather than through
   --pw-acc: its panel header, its Send button (both rgb(52,39,107)) and the
   rounded field/launcher. Matched on the literal itself via attribute
   selectors; an inline style still loses to !important. [2026-09-21] */
:root[data-record] [style*="rgb(52, 39, 107)"],
:root[data-record] [style*="rgb(52,39,107)"]{
  background:var(--acc)!important;color:var(--acc-ink)!important;
  border-radius:0!important;font-family:var(--mono)!important;
  font-weight:700!important;letter-spacing:.04em}
:root[data-record] [style*="border-radius: 9px"],
:root[data-record] [style*="border-radius:9px"],
:root[data-record] [style*="border-radius: 26px"],
:root[data-record] [style*="border-radius:26px"]{border-radius:0!important}


/* ---- the gateway panel: header weight and the banner -----------------------
   Two defects my own literal-override introduced or left, both only visible by
   OPENING the panel and LOOKING at it:
   (1) the header took the accent as a full-bleed 393x66 lime slab. The record
       language puts the accent on small marks, never a field this size: it
       shouts louder than the page it fronts. Ink ground, accent wordmark.
   (2) the welcome banner is still a violet constellation image: the last piece
       of the old palette anywhere on the site, and the first thing the panel
       shows. [2026-09-21] */
:root[data-record] [style*="rgb(52, 39, 107)"],
:root[data-record] [style*="rgb(52,39,107)"]{
  background:var(--panel)!important;color:var(--ink)!important;
  border-bottom:1px solid var(--line2)!important}
/* the Send button stays a real accent button: it is small, and it is the act */
:root[data-record] [style*="rgb(52, 39, 107)"][style*="cursor: pointer"]{
  background:var(--acc)!important;color:var(--acc-ink)!important;
  border-bottom:0!important}
/* the panel wordmark takes the accent instead of the whole bar */
:root[data-record] [style*="rgb(52, 39, 107)"] > :first-child{color:var(--acc)!important}

/* the welcome banner is a <canvas> (.pw-wel-art) PAINTED IN JS by the widget
   bundle, with a violet FIELD and lighter link lines on top.
   Three attempts here, worth recording because two of them reported success:
     1. img / background-image selectors - matched nothing, canvas has neither;
     2. a hue-rotate filter - turned the dark violet field into an olive SLAB;
     3. brightness(.42) to cut it - made the canvas 100% black, art gone.
   My pixel check then passed a slab: it read the 10th percentile as "the
   field", but the canvas is VIGNETTED, so the dark corners answered for a
   bright centre. A metric aimed at the wrong pixels certifies the wrong thing.
   A filter cannot separate a field from the points drawn on it. So: drop the
   field with blend, and keep only what is brighter than it. [2026-09-21] */
:root[data-record] .pw-wel-art,
:root[data-record] canvas[class*="pw-wel"]{
  background:transparent!important}
/* screen against the panel's own near-black: the violet field goes to nothing,
   the brighter link lines and points survive as light */
:root[data-record] .pw-wel-band,
:root[data-record] .pw-wel-hero{background:var(--bg)!important}
:root[data-record] .pw-wel-band,
:root[data-record] .pw-wel-hero,
:root[data-record] [class*="pw-wel"]{border-radius:0!important}


/* ---- the welcome banner: hidden ---------------------------------------------
   .pw-wel-art is an ANIMATED canvas owned by the gateway widget bundle,
   painting an opaque violet field. Everything CSS has was tried and each
   attempt deployed clean while the banner stayed wrong:
     img / background-image selectors - a canvas has neither;
     hue-rotate                       - field and lines shift together;
     brightness(.42)                  - 100% black;
     mix-blend-mode:screen            - alpha is 255, nothing to blend.
   Then a JS recolour, which also failed three times: normalisation anchored on
   outliers, then on the median (the field IS the median), then on a field value
   I had measured while the script was running, i.e. my own output. Caching the
   source frame did not save it either.
   Ending it here. The band is DECORATION; the panel reads correctly without it,
   and a violet slab or a black box both cost more than blank space. The widget
   is the right place to fix this, not eleven overrides from outside.
   [2026-09-21] */
:root[data-record] .pw-wel-art,
:root[data-record] canvas[class*="pw-wel"]{display:none!important}
:root[data-record] .pw-wel-band,
:root[data-record] .pw-wel-hero{background:transparent!important;
  border-radius:0!important;min-height:0!important;height:auto!important}


/* ---- the slot picker -------------------------------------------------------
   .pw-slot-tab-on painted rgb(107,79,219): old brand violet, inside the widget
   bundle. Every earlier purple sweep missed it because the slot grid only
   exists AFTER a booking request succeeds, and until today that request was
   broken - so the element had never once been on screen to audit.
   A defect can hide behind another defect. [2026-09-21] */
:root[data-record] .pw-slot-tab{border-radius:0!important;
  font-family:var(--mono)!important;border:1px solid var(--line2)!important}
:root[data-record] .pw-slot-tab-on{background:var(--acc)!important;
  color:var(--acc-ink)!important;border-color:var(--acc)!important;
  font-weight:700!important}
:root[data-record] [class*="pw-slot"] button{border-radius:0!important;
  font-family:var(--mono)!important}


/* ---- the gate path needs its own band on a phone ---------------------------
   Measured at 393px: the lede ends at 449px of a 666px hero and the CTAs
   start at 489. Forty pixels. The desktop layout puts the four gates in the
   free right half; a phone has no free half, and the path ran through the
   lede (seen 2026-09-21). So on a phone the hero grows by a fixed art band
   under the CTAs, and genart lays the path in that band. Desktop untouched. */
@media (max-width:560px){
  /* the single source for the phone art band is 60 lines below (one rule,
     not two: these disagreed at 150 vs 196 and the later one won silently) */
}


/* ---- the field: one constellation behind the whole page ----------------
   The per-boundary strips were a divider wearing the hero's clothes: three
   marks in a 104px box with hard edges. Immersive means ONE field the reader
   is inside. A fixed canvas behind every section; sections are transparent so
   it shows through, strongest at the boundaries, knocked back under the copy
   column by field.js so text always wins. The hero keeps its own art on top.
   Canvas, not text: the fonts are subsetted. */
[data-record] canvas.field{position:fixed;inset:0;width:100%;height:100%;
  z-index:0;pointer-events:none;display:block}
[data-record] body{position:relative}
[data-record] .hero,[data-record] section,[data-record] footer{position:relative;z-index:1}
/* [owner 2026-10-01 "the menu bar to follow the user"] the header was in the line above (position:relative), which
   beat styles.css's sticky on every themed page from 2026-09-21: the comment below said sticky while nothing was.
   Sticky is positioned too, so z-index still lifts it over the field. It sits under the tape (tape.css). */
[data-record] .topbar{position:sticky;top:0;z-index:80}
[data-record] section,[data-record] footer,[data-record] .hero{background:transparent}
[data-record] .topbar{background:var(--bg)}          /* the sticky header stays solid */
/* the sections that carried a trim were given extra top padding for it; take it back */
[data-record] section.has-trim{padding-top:72px}
@media(max-width:560px){[data-record] section.has-trim{padding-top:72px}}
@media print{[data-record] canvas.field{display:none}}


/* ---- the hero caption swaps during the arrival demonstration ---------------
   Two spans, one shown. The demo line is on screen only while the one
   scripted turn walks the gates (feedwire.js), so the page states plainly
   that it is a demonstration and never implies traffic it does not have. */
/* [belt] both captions share ONE grid cell, so the box is always the height
   of the longer one and the swap never moves the layout: the demo caption
   was one line shorter, the box shrank 21px, and the belt placed against it
   was overlapped when the live caption returned. Swap by visibility only. */
[data-record] .hero-cap{display:grid}
[data-record] .hero-cap>.cap-live,[data-record] .hero-cap>.cap-demo{grid-area:1/1}
[data-record] .hero-cap .cap-demo{visibility:hidden}
[data-record] .hero-cap[data-demo] .cap-live{visibility:hidden}
[data-record] .hero-cap[data-demo] .cap-demo{visibility:visible;color:var(--acc)}
[data-record] .hero-cap b{color:var(--ink);font-weight:600}

/* ---- phone hero: caption is a legend UNDER the gates ---------------------
   In flow it sat on the `turn` and `tool` systems. It is copy ABOUT the art,
   so it reads as a legend below it. The band grows to hold it. */
@media (max-width:560px){
  /* The band holds the four-gate route AND the caption, above a launcher
     fixed at 791..840. Measured: route needs ~150px, caption 42px, and
     both must finish before 791. [2026-09-21] */
  /* 330, not 252: measured band was 31px (caption foot 582, launcher bound
     613) for a diagram needing ~120. The floor clamp then shoved the
     labels under the launcher. Height is the fix, not another clamp. */
  :root[data-record] .hero{padding-bottom:28px!important}   /* [slot] the band is a real element now, not padding */
  /* ABOVE the route, not below it. The launcher is fixed to the viewport
     and the caption is in the hero's flow, so every band-height change
     walked a below-the-route caption back into it (four times). Anchored
     to the copy block instead: it introduces the diagram. [2026-09-21] */
  :root[data-record] .hero .hero-cap{position:static;margin-top:18px;padding:0}   /* containing block is .wrap, so top:100% = the band's top; 138px puts it at the band's foot */
}
[data-record] .hero-cap{font-size:.8rem;margin-top:12px}   /* was inline on the <p>; inline beat the phone legend rule */


/* ---- .morelinks: the last 999px pills, and transparent over the field -----
   styles.css:53 styles these as fully-rounded pills with no background. The
   record language is square, and with the page-wide field behind them the
   link text was crossed by constellation links (measured on paper, where the
   field is strongest against the copy). Square, and backed by the page. */
:root[data-record] .morelinks a{border-radius:2px!important;
  background:var(--bg);border-color:var(--line2);
  font-family:var(--mono);font-size:.78rem;letter-spacing:.01em}
:root[data-record] .morelinks a:hover{border-color:var(--acc);color:var(--acc)}


/* ---- hero legend vs the fixed launcher -------------------------------------
   #pn-ask:not(.pc) is fixed bottom-right and measured 208..381 on a 393px phone. The
   legend sits at the hero's foot and its second line ran underneath it, so
   half the sentence was unreadable. Keep the legend clear of that column.
   Phone only: on desktop the launcher is far below the hero's foot. */



/* ---- the launcher owns the bottom of the viewport, the gates own the hero --
   #pn-ask:not(.pc) is position:fixed, so hero height can never open space above it:
   measured six times, the band stayed pinned at the 70px floor and the gate
   labels rendered behind the button. Raise the launcher on phones instead.
   Still bottom-right and reachable; 104px up clears the label line. */
@media (max-width:560px){
  /* left at the viewport foot: raising it only moved the obstacle up into the
     diagram (532 gate pixels hidden vs 282). The gates avoid it instead. */
  :root[data-record] #pn-ask:not(.pc){bottom:20px}
}


/* ---- the assistant panels are not slabs -----------------------------------
   The field runs behind the whole page; these five filled boxes cut it out
   (measured 337x489, 337x595, and three inner bars). Nothing else in the
   record language carries a fill. Take the backgrounds away; the 1px outline
   and the mono labels are what make a panel a panel. [2026-09-21] */
:root[data-record] .chat,
:root[data-record] .trace{background:transparent!important}

/* the header and composer bars: separated by a rule, not a fill */
:root[data-record] .chat .head,
:root[data-record] .chat .composer{background:transparent!important}
:root[data-record] .chat .head{border-bottom:1px solid var(--line)}
:root[data-record] .chat .composer{border-top:1px solid var(--line)}

/* the governance graph sits on the field, not on a panel of its own */
:root[data-record] .govcanvas{background:transparent!important;
  border:1px solid var(--line)}

/* the receipt placeholder: an outline, no fill */
:root[data-record] .verdict.hint{background:transparent!important;
  border:1px solid var(--line);border-radius:2px}

/* [belt] the gates are an instrument, not wallpaper: the hero canvas sits
   ABOVE the ::after scrim (z 1), below the copy (z 2). The canvas is
   transparent and the solver keeps the belt clear of the text, so the scrim
   was only fading the instrument -- to ~40% on paper, washed out. */
:root[data-record] .hero-art{z-index:1;opacity:1}
:root[data-record] .hero::after{z-index:0}

/* [slot] The gate diagram's band is a real element in the hero's flow, right
   under its legend. It was solved from the VIEWPORT and the fixed launcher,
   which on a real iPhone (Safari ~660px, resizing as the toolbar collapses)
   put the belt on the CTA buttons and re-placed it on every scroll. A slot
   in flow moves with the copy and nothing else. Desktop draws its own row. */
[data-record] .belt-slot{display:none}
@media (max-width:560px){
  [data-record] .belt-slot{display:block;height:96px;margin-top:8px}
}

/* [paper] light theme: styles.css:417 `:root[data-theme="light"] .hero::after`
   (0,3,1) out-specifies the record scrim (0,2,1) and paints the OLD violet
   paper rgba(246,244,251) in a vertical ramp, which read as a pale box behind
   the gate row. Same token-derived scrim as dark, at matching specificity. */
:root[data-record][data-theme="light"] .hero::after{background:linear-gradient(90deg,
  color-mix(in srgb,var(--bg) 55%,transparent) 0%,
  color-mix(in srgb,var(--bg) 30%,transparent) 44%,
  transparent 86%)}

/* [tuck] the launcher yields to the gate row while they overlap (assistant.js) */
#pn-ask:not(.pc).pn-ask-tucked{opacity:0;visibility:hidden;pointer-events:none;transform:translateY(10px);
  transition:opacity .2s ease,transform .2s ease,visibility 0s linear .2s}
#pn-ask:not(.pc){transition:transform .18s ease,box-shadow .18s ease,opacity .2s ease,visibility 0s}
@media (prefers-reduced-motion:reduce){#pn-ask:not(.pc),#pn-ask:not(.pc).pn-ask-tucked{transition:none}}

/* ==== DISPLAY MOMENTS ======================================================
   Eight sections in a row were eyebrow + 24px headline + grey paragraph +
   boxes. Scale contrast is what gives a long page rhythm: a few things set
   LARGE, full width, as the object on that screen. Only claims the page can
   back: the line is the product's thesis, the figure is the audit result.
   [2026-09-23] */

/* the display line: one sentence, set as an object */
[data-record] section.display{padding:88px 0 80px}
[data-record] .display-line{margin:0;font:600 clamp(40px,9.6vw,104px)/.98 var(--sans);
  letter-spacing:-.035em;color:var(--ink);text-wrap:balance}
[data-record] .display-line span{display:block}
[data-record] .display-line .k{color:var(--acc)}
[data-record] .display-sub{margin:22px 0 0;font:400 12px/1.5 var(--mono);
  letter-spacing:.12em;text-transform:uppercase;color:var(--faint)}

/* the figure: one number the whole section rests on */
[data-record] .figure{display:grid;grid-template-columns:auto 1fr;align-items:end;
  gap:8px 28px;margin:44px 0 8px}
[data-record] .fig-n{font:500 clamp(140px,34vw,300px)/.78 var(--mono);
  letter-spacing:-.06em;color:var(--acc);font-variant-numeric:tabular-nums}
[data-record] .fig-l{font:400 15px/1.5 var(--sans);color:var(--mist);max-width:34ch;padding-bottom:10px}
@media (max-width:560px){
  [data-record] .figure{grid-template-columns:1fr;gap:14px}
  [data-record] .fig-l{padding-bottom:0}
}

/* the ledger: supporting numbers as a record, not tiles */
[data-record] .ledger{margin:28px 0 0;display:grid;gap:0}
[data-record] .ledger>div{display:grid;grid-template-columns:7.5ch 1fr;gap:18px;align-items:baseline;
  padding:12px 0;border-top:1px solid var(--line)}
[data-record] .ledger dt{font:500 20px/1 var(--mono);color:var(--ink);letter-spacing:-.01em;
  font-variant-numeric:tabular-nums}
[data-record] .ledger dd{margin:0;font:400 12px/1.5 var(--mono);color:var(--faint);letter-spacing:.02em}

/* square ticks: the checklist carried the last ROUND marks on the page */
[data-record] .check>svg{display:none}
[data-record] .check{position:relative;padding-inline-start:30px}
[data-record] .check::before{content:"";position:absolute;inset-inline-start:0;top:.28em;width:14px;height:14px;
  border:1.5px solid var(--acc);border-radius:1px}
[data-record] .check::after{content:"";position:absolute;inset-inline-start:4px;top:calc(.28em + 2px);width:4px;height:7px;
  border:solid var(--acc);border-width:0 1.8px 1.8px 0;transform:rotate(40deg)}

/* [divider] styles.css:45 draws a 1px gradient rule at the top of EVERY
   section via ::before, with the old violet rgba(124,92,255,.32) at its
   centre. The border rules were removed on request; this one survived because
   it is a pseudo-element, not a border. Sections are separated by space and
   the field, not by lines. */
[data-record] section::before{display:none}
/* --glow still carried the old violet in its shadow (styles.css:371) */
:root[data-record]{--glow:0 0 0 1px var(--acc-wash), 0 14px 40px -16px color-mix(in srgb,var(--acc) 32%,transparent)}

/* [trace] the trace-row dot: styles.css:174 draws it round, and :437 pins the
   light theme to lilac #c9c0e0 (old palette). Square, and from tokens. */
:root[data-record] .row .dot{border-radius:1px;background:var(--line2);box-shadow:none}
:root[data-record][data-theme="light"] .row .dot{background:var(--line2)}
:root[data-record] .row.ok .dot{background:var(--acc);box-shadow:none}
:root[data-record] .row.pending .dot{background:var(--acc);box-shadow:none}
:root[data-record] .row.amber .dot,:root[data-record] .row.red .dot{box-shadow:none}

/* [one green] the trace-row 'ok' dot and every --ok use on record pages was a
   teal-mint (#52c993 / #1a9f6b), a third green beside the accent. Pass = accent. */
:root[data-record]{--ok:var(--acc)}

/* [one green] a parent at .88 opacity lightens every accent mark inside it:
   on paper the hero art must be fully opaque or its ink reads as a paler green. */
:root[data-record][data-theme="light"] .hero-art{opacity:1}

/* [one green] ask pantheon on paper:
   - the attention ring (::after) is the accent FADING OUT, so every frame of it
     is a paler green frame around the button: on paper, no ring.
   - the chat glyph was hardcoded #fff (styles.css:536) and pulsed to 55%
     opacity, blending it into the green it sits on. It takes the button's own
     ink colour, solid, like the label beside it. */
:root[data-record][data-theme="light"] #pn-ask:not(.pc)::after{display:none}
:root[data-record] #pn-ask:not(.pc) .pn-ask-ic{color:var(--acc-ink)}
:root[data-record][data-theme="light"] #pn-ask:not(.pc) .pn-ask-ic{animation:none;opacity:1}

/* [one green] two more places the accent was diluted into a second green:
   - .hero::after is a paper veil (55%..30% paper). The page-wide gear field
     sits BEHIND it, so every gear under the hero read as a pale green.
     On paper the veil goes: the gears are erased behind the hero's own words
     already, so nothing needs veiling.
   - .act::before (redesign.css:12) was a 2px bar fading the accent to
     transparent: a gradient of greens. Solid accent. */
:root[data-record][data-theme="light"] .hero::after{background:none!important}
:root[data-record][data-theme="light"] .act::before{background:var(--acc)!important}

/* [one green] the remaining standing dilutions of the accent on paper, found
   by walking every element and pseudo for an accent paint at alpha < 1:
     .act::before        opacity .8 on top of the bar (redesign.css:13)
     .hp-eyebrow::before accent fading to transparent (redesign.css:7)
     .livedot / .pill::before / #send  pulse animations dipping the accent
   Solid accent, no fades, no pulses -- on paper only. */
:root[data-record][data-theme="light"] .act::before{opacity:1!important}
:root[data-record][data-theme="light"] .hp-eyebrow::before{background:var(--acc)!important}
:root[data-record][data-theme="light"] .livedot,
:root[data-record][data-theme="light"] .pill::before,
:root[data-record][data-theme="light"] #send{animation:none!important;opacity:1!important;box-shadow:none!important}



/* [one green] interior pages on paper (measured, light theme):
   /prove .vnode.b      bg = accent at 14%        -> a pale green chip
   /audit p.held        bg = --ok-wash (teal 12%) -> a pale teal band
   ask pantheon .dot    white at .25 blink over the green button -> pale green
   a.cta::after         the attention ring fading out (same as #pn-ask:not(.pc))
   Solid ink or a neutral surface instead; the accent stays full strength. */
:root[data-record][data-theme="light"] .vnode.b{
  background:var(--panel)!important;box-shadow:inset 0 0 0 1px var(--acc)!important;color:var(--ink)!important}
:root[data-record][data-theme="light"] p.held{
  background:var(--panel)!important;border-color:var(--line)!important;
  box-shadow:inset 3px 0 0 var(--acc)!important}
:root[data-record][data-theme="light"] #pn-ask:not(.pc) .dot{animation:none!important;opacity:1!important}
:root[data-record][data-theme="light"] .cta::after{animation:none!important;opacity:0!important}
:root[data-record][data-theme="light"]{--ok-wash:var(--panel)}

/* [one green] /audit timeline: each .crow dot wore a 4px --acc-wash halo, a
   pale green ring on paper, and was round. Solid square, no halo, both themes. */
:root[data-record] .crow::before{border-radius:1px!important;box-shadow:none!important;background:var(--acc)!important}

/* ==== i18n ==================================================================
   Language picker in the nav, the machine-translation note, and RTL. The
   picker is a native <select>: keyboard, screen-reader and phone pickers for
   free, and no custom menu to get wrong. */
[data-record] .langpick{display:flex;align-items:center;margin-left:10px}
[data-record] .langpick select{font:400 12px/1 var(--mono);letter-spacing:.02em;
  color:var(--ink);background:var(--bg);border:1px solid var(--line2);border-radius:2px;
  padding:6px 26px 6px 8px;max-width:9.5em;cursor:pointer;
  appearance:none;-webkit-appearance:none;
  background-image:linear-gradient(45deg,transparent 50%,var(--ink) 50%),linear-gradient(135deg,var(--ink) 50%,transparent 50%);
  background-position:calc(100% - 13px) 50%,calc(100% - 8px) 50%;background-size:5px 5px;background-repeat:no-repeat}
[data-record] .langpick select:focus-visible{outline:2px solid var(--acc);outline-offset:2px}
/* [Facebook 2026-10-05, Mikey] a select's open list is drawn by the OS: say which scheme the page is in, and give the
   options their own ink and paper, or a dark-mode phone draws white options on the light page's white. */
:root{color-scheme:dark}:root[data-theme="light"]{color-scheme:light}
[data-record] .langpick select option{color:var(--ink);background-color:var(--bg)}
[data-record] .mt-note{font:400 12px/1.5 var(--mono);color:var(--mist);
  padding:8px var(--gutter,20px);border-bottom:1px solid var(--line);background:var(--bg);position:relative;z-index:2}
[data-record] .mt-note a{color:var(--ink);text-decoration:underline;text-underline-offset:2px}
@media (max-width:560px){[data-record] .langpick{margin-left:6px}[data-record] .langpick select{max-width:7.5em;font-size:11px}}

/* RTL: flow mirrors via dir=rtl on <html>; fix the few things that were
   positioned with physical left/right. Canvas art stays LTR (a route reads
   turn -> verdict in the diagram's own logic, like a circuit diagram). */
[dir="rtl"] [data-record] body, :root[dir="rtl"] body{text-align:right}
:root[dir="rtl"] canvas, :root[dir="rtl"] .hero-art, :root[dir="rtl"] .govcanvas{direction:ltr}
:root[dir="rtl"] code, :root[dir="rtl"] pre, :root[dir="rtl"] .mono{direction:ltr;unicode-bidi:isolate}
:root[dir="rtl"][data-record] #pn-ask:not(.pc){right:auto!important;left:18px}
:root[dir="rtl"] .langpick{margin-left:0;margin-right:10px}

/* [i18n] the nav is lowercased by CSS; that is an English type choice. Scripts
   with no case, or where lowercasing changes meaning (German nouns, Turkish
   dotted/dotless i), keep the translator's casing. */
:root[data-record]:not([lang="en"]) .nav a{text-transform:none}


/* [rtl] ask pantheon: the status dot rides the chat glyph's corner at
   left:29px. Mirrored, the glyph is on the RIGHT, so the dot landed on the
   label ("pa.ntheon"). Mirror the dot with the glyph. */
:root[dir="rtl"][data-record] #pn-ask:not(.pc) .dot{left:auto!important;right:29px!important}
:root[data-record]:not([lang="en"]) #pn-ask:not(.pc){text-transform:none}

/* [i18n] .verify links are nowrap so short English phrases don't break
   mid-link. Translations run 30-60% longer (Ukrainian "see what it builds for
   real businesses" is 435px on a 384px phone): let them wrap. English
   unchanged. */
:root:not([lang="en"]) .verify a{white-space:normal}

/* [motif] site theme picker: the language picker's exact form, one rule for both */
[data-record] .motifpick{display:flex;align-items:center;margin-left:10px}
[data-record] .motifpick select{font:400 12px/1 var(--mono);letter-spacing:.02em;
  color:var(--ink);background:var(--bg);border:1px solid var(--line2);border-radius:2px;
  padding:6px 26px 6px 8px;max-width:9.5em;cursor:pointer;
  appearance:none;-webkit-appearance:none;
  background-image:linear-gradient(45deg,transparent 50%,var(--ink) 50%),linear-gradient(135deg,var(--ink) 50%,transparent 50%);
  background-position:calc(100% - 13px) 50%,calc(100% - 8px) 50%;background-size:5px 5px;background-repeat:no-repeat}
[data-record] .motifpick select:focus-visible{outline:2px solid var(--acc);outline-offset:2px}
@media (max-width:560px){[data-record] .motifpick{margin-left:6px}[data-record] .motifpick select{max-width:7.5em;font-size:11px}}
:root[dir="rtl"] .motifpick{margin-left:0;margin-right:10px}

/* [owner 2026-10-05] the sky's card, tip, full-screen and exit controls are gone with the legend */

/* [controls-row] Phone header row 3 (theme, light/dark, language) read as ragged: the two selects
   were 25px tall beside a 36px toggle, the first sat 6px in from the links above, and the theme name
   was cut to 'Constel' by a 7.5em cap. One height, one left edge, whole names. [2026-09-24] */
@media (max-width:760px){
  [data-record] .nav .motifpick,[data-record] .nav .langpick{margin-left:0;align-self:flex-start}
  [data-record] .nav .motifpick select,[data-record] .nav .langpick select{height:36px;max-width:12em;font-size:.78rem;padding-top:0;padding-bottom:0}
  [data-record] .nav .themetog{margin:0}
}

/* [colophon] footer links become 8px-padded blocks on phones (tap targets); inside the colophon's
   running sentence that made the line holding the GitHub link 16px taller than its neighbours, so
   the paragraph read as three uneven lines. Inline padding keeps the tap area, not the line. */
@media (max-width:640px){
  [data-record] footer .foot-colophon a{display:inline;padding:10px 2px;margin:-10px 0}
}

/* [fold] Phone first screen. The header scrolls away, but on the first screen it is 158px of 660,
   and the opening section then added 60-96px of empty band before its title: the homepage's two
   buttons ended at 695px, below a 660px screen, so a first visit showed no action at all.
   The first section only, phones only; section rhythm further down and desktop unchanged. [2026-09-24] */
@media (max-width:640px){
  [data-record] .hero{padding-top:36px}
  [data-record] .pagehead{padding-top:32px}
  [data-record] header.topbar ~ section.v-sec:first-of-type,
  [data-record] header.topbar ~ main > section.v-sec:first-child{padding-top:40px}
}

/* [rhythm] Phone section rhythm: 72px top + 72px bottom made the gap between one section's last
   line and the next one's first 127-239px (median 157) on a 660px screen, a quarter of every
   scroll empty. Phones only; the field still marks the boundary. Desktop unchanged. [2026-09-24] */
@media (max-width:640px){
  [data-record] section:not(.hero):not(.post){padding-top:52px;padding-bottom:52px}
  [data-record] section.display{padding-top:64px;padding-bottom:60px}
  [data-record] header.topbar ~ section.v-sec:first-of-type,
  [data-record] header.topbar ~ main > section.v-sec:first-child{padding-top:40px}
}

/* [navtog] phone menu: one row (logo + Menu) closed; open, the same nav drops below as a
   full-width sheet, links in a two-column grid, then the theme / light-dark / language row.
   Square, mono, 1px rule, like the rest of the record. Desktop: button hidden, nav as before. */
[data-record] .navtog{display:none}
@media (max-width:760px){
  /* z-index: the homepage header sat at z 1, level with the hero (z 1, later in the page), so the
     hero's title painted over the open menu and took its taps */
  [data-record] header.topbar{flex-wrap:nowrap;align-items:center;justify-content:space-between;padding:8px 12px;min-height:60px;position:sticky;z-index:80}   /* sticky: it follows the reader [2026-10-01] */
  [data-record] .navtog{display:inline-flex;align-items:center;gap:9px;min-height:44px;min-width:44px;padding:0 12px;
    font:400 .78rem/1 var(--mono);letter-spacing:.03em;text-transform:lowercase;color:var(--ink);
    background:var(--bg);border:1px solid var(--line2);border-radius:2px;cursor:pointer}
  [data-record] .navtog:focus-visible{outline:2px solid var(--acc);outline-offset:2px}
  [data-record] .navtog-i{position:relative;width:14px;height:10px;display:inline-block}
  [data-record] .navtog-i::before,[data-record] .navtog-i::after{content:"";position:absolute;left:0;right:0;height:1.5px;background:currentColor;transition:transform .18s ease,top .18s ease}
  [data-record] .navtog-i::before{top:1px}
  [data-record] .navtog-i::after{top:7px}
  [data-record] header.nav-open .navtog-i::before{top:4px;transform:rotate(45deg)}
  [data-record] header.nav-open .navtog-i::after{top:4px;transform:rotate(-45deg)}
  [data-record] header.topbar > .nav{display:none}
  [data-record] header.nav-open > .nav{display:grid;grid-template-columns:1fr 1fr;gap:6px;
    position:absolute;left:0;right:0;top:100%;margin:0;width:auto;padding:12px 12px 14px;
    background:var(--bg);border-bottom:1px solid var(--line);z-index:70;max-height:calc(100vh - 70px);overflow-y:auto}
  [data-record] header.nav-open > .nav a{display:flex!important;align-items:center;min-height:44px;padding:0 12px;
    font-size:.82rem!important;border:1px solid var(--line);border-radius:2px}
  [data-record] header.nav-open > .nav a[href="/"],[data-record] header.nav-open > .nav a[href="index.html"],
  [data-record] header.nav-open > .nav a[href="/index.html"]{display:flex!important}
  [data-record] header.nav-open > .nav a::after{font-size:.82rem!important}
  [data-record] header.nav-open > .nav .navcta{display:flex!important;grid-column:1 / -1;justify-content:center;
    background:var(--acc-wash);border-color:var(--line2)}
  [data-record] header.nav-open > .nav .motifpick,[data-record] header.nav-open > .nav .themetog,
  [data-record] header.nav-open > .nav .langpick{margin:4px 0 0}
  [data-record] header.nav-open > .nav .motifpick select,[data-record] header.nav-open > .nav .langpick select{width:100%;max-width:none;height:44px}
  [data-record] header.nav-open > .nav .themetog{height:44px;min-height:44px;justify-content:center}
  [data-record] header.nav-open > .nav .langpick{grid-column:1 / -1}
}

/* ── review 2026-09-25: skip link, defect story, audit facts, demo scope notes ─────────────── */
.skiplink{position:absolute;left:8px;top:-60px;z-index:300;padding:10px 14px;background:var(--acc);color:var(--bg);
  font:600 14px/1 var(--sans);text-decoration:none}
.skiplink:focus,.skiplink:focus-visible{top:8px;outline:2px solid var(--ink);outline-offset:2px}
main:focus{outline:none}
[data-record] .role-line{font-size:15px;margin-top:10px}
[data-record] .role-line b{color:var(--ink)}
[data-record] .defect-story{border-left:2px solid var(--acc);padding:4px 0 4px 16px;margin:22px 0 26px;max-width:var(--measure)}
[data-record] .defect-story h3{margin:0 0 8px}
[data-record] .defect-story p{margin:0 0 8px;color:var(--mist)}
[data-record] .defect-story b{color:var(--ink)}
[data-record] .auditfacts{display:grid;grid-template-columns:1fr;gap:10px;margin:18px 0 12px;max-width:var(--measure)}
[data-record] .auditfacts div{display:grid;grid-template-columns:8.5rem 1fr;gap:12px;border-top:1px solid var(--line);padding-top:10px}
[data-record] .auditfacts dt{font-weight:600;color:var(--ink)}
[data-record] .auditfacts dd{margin:0;color:var(--mist)}
@media (max-width:560px){[data-record] .auditfacts div{grid-template-columns:1fr;gap:2px}}
[data-record] .scopenote{font-size:14px;line-height:1.55;color:var(--mist);border-left:2px solid var(--line2);
  padding-left:12px;margin:14px 0 0;max-width:var(--measure)}
[data-record] .scopenote b{color:var(--ink)}
.ecase .escope{font-size:.8rem;color:var(--mist);margin-top:6px}
.ecase .ercpt{font:.72rem/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--faint);margin-top:6px;overflow-wrap:anywhere}

/* ── desktop nav (review 2026-09-25): 5 primary links; the rest grouped after a divider, quieter ── */
@media (min-width:761px){
  [data-record] .nav a.nav2{font-size:11px;color:var(--faint);padding:8px 7px}
  [data-record] .nav a.nav2:hover{color:var(--ink)}
  [data-record] .nav a.nav2-first{margin-left:10px;padding-left:14px;border-left:1px solid var(--line2);border-radius:0}
  [data-record] .nav a.nav2.active{color:var(--acc)}
}
[data-record] .hero-cap .cap-eg{grid-area:2/1;margin-top:6px;color:var(--mist)}

/* [lift] the launcher rises above what it would cover instead of vanishing (owner, 2026-09-26: /cy/hire had no launcher on arrival). --pn-lift is set by assistant.js. `translate` is separate from the hover transform. */
#pn-ask:not(.pc){translate:0 var(--pn-lift,0px);transition:translate .18s ease,transform .18s ease,box-shadow .18s ease,opacity .2s ease,visibility 0s}
@media (prefers-reduced-motion:reduce){#pn-ask:not(.pc){transition:none}}

/* [fold 2026-10-04] short desktop screens (1280x720): the two hero buttons ended 47px under the fold after the
   58-word intro. Tighter top padding and lede gaps only when the window is short and wide; phones and 1366x768
   upward are untouched (prove_fold measures 1366x768, 1536x864, 1440x900 and 1280x720). */
@media (min-width:1000px) and (max-height:760px){
  :root[data-record] .hero{padding-top:56px}
  :root[data-record] .hero .lede{margin-bottom:22px}
}

/* [Point 2026-10-04] the element a footnote points at: a square accent outline that fades. Set by the widget ("here")
   or by assistant.js on arrival via /#point=<key>. Flat and square: the house notation; it ENCODES "this one". */
.pw-point-lit{outline:2px solid var(--acc);outline-offset:6px;animation:pw-point 2.6s ease forwards}
@keyframes pw-point{0%,45%{outline-color:var(--acc)}100%{outline-color:transparent}}
@media (prefers-reduced-motion:reduce){.pw-point-lit{animation:none}}
