/* albinilabs.com design system.
   Identity kept from the old site: tokens, Hanken Grotesk + JetBrains Mono, the pixel A, mono chips, the .hl sky highlight,
   square corners, no shadows, the dashed column frame. Deltas (strategy §5): two registers (paper / ink bands), graded
   photography with grain and field labels, camera-still overlays, a 12-column grid.
   Reference for every class: docs/components.md. Live examples: /styleguide (dev build only).

   Contents
   1 tokens  2 base  3 type  4 layout (bands, grid)  5 nav (four menus, phone sheet)  6 buttons + links  7 chips
   8 media (photo frame, labels, overlays)  9 hero + photo band  10 register  11 cells  12 money + gaps  13 reel + strip
   14 FAQ  15 forms  16 tables  17 panels, shots, callouts  18 footer  19 motion
   20 v2 components: team logo strip, event stream + event grid, sector montage, solutions cards, mock metrics  21 motion for those
   23 announcement bar  24 problem cards (.problem) */

/* 1 · tokens ------------------------------------------------------------------------------------------------------ */
:root{
  --ink:#0B0B0B; --ink-muted:#4A4A4A; --ink-faint:#6B6B6B; --edge:#8A8A8A;
  --hairline:#D6D6D6; --dash:#E2E2E2; --paper:#FFFFFF; --panel:#FAFAFA;
  --sky:#A9D5EC; --panel-sky:#E8F3FA; --sky-edge:#4C8FBA;
  --flag:#C2611F; --flag-tint:#FCEFE5; --ok:#2F7D4F;
  --flag-ink:#A44E14;              /* flag colour for small text (5.7:1 on paper); --flag stays for lines and fills */
  --night:#0B0B0B; --night-dash:#2F2F2F; --night-muted:#A8A8A8;
  --sans:'Hanken Grotesk',system-ui,-apple-system,'Segoe UI',sans-serif;
  --mono:'JetBrains Mono',ui-monospace,'SF Mono',Menlo,monospace;
  --col:1800px; --pad:clamp(16px,3.4vw,64px); --padv:clamp(44px,6vw,88px); --gap:clamp(16px,2vw,28px);
  --nav-h:64px; --bar-h:40px; --chrome-h:calc(65px + var(--bar-h));   /* announcement bar (40) + nav (64) + hairline, used to size the hero; html.no-announce sets --bar-h to 0 */
  --fs-display:44px; --fs-h2:28px; --fs-manifesto:26px; --fs-body:16px;
  color-scheme:light;
}
@media (min-width:700px){:root{--fs-display:56px;--fs-h2:34px;--fs-manifesto:32px;--fs-body:17px}}
@media (min-width:1100px){:root{--fs-display:64px;--fs-h2:42px;--fs-manifesto:40px}}

/* 2 · base -------------------------------------------------------------------------------------------------------- */
*,*::before,*::after{box-sizing:border-box}
html{scroll-behavior:smooth;scroll-padding-top:84px;-webkit-text-size-adjust:100%}
body{margin:0;background:var(--paper);color:var(--ink);font-family:var(--sans);font-size:var(--fs-body);line-height:1.5;-webkit-font-smoothing:antialiased;overflow-x:clip}
html.nav-open{overflow:hidden}
a{color:inherit}
h1,h2,h3,h4{margin:0;text-wrap:balance}
p{margin:0}
ul,ol{margin:0;padding:0}
figure{margin:0}
button{font:inherit}
img,video,svg{max-width:100%}
img,video{display:block}
[hidden]{display:none!important}
:focus-visible{outline:2px solid var(--sky-edge);outline-offset:3px}
.band--ink :focus-visible,.hero :focus-visible,.footer :focus-visible,.announce :focus-visible{outline-color:var(--sky)}
main:focus{outline:none}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.skip{position:absolute;left:-9999px;top:0;z-index:100;background:var(--ink);color:var(--paper);padding:.75rem 1.1rem}
.skip:focus{left:0}
.faint{color:var(--ink-faint)}
.band--ink .faint{color:var(--night-muted)}
.nowrap{white-space:nowrap}

/* 3 · type -------------------------------------------------------------------------------------------------------- */
h1,.display{font-size:var(--fs-display);line-height:1.02;font-weight:800;letter-spacing:-.04em}
h2,.h2{font-size:var(--fs-h2);line-height:1.08;font-weight:800;letter-spacing:-.03em}
h3,.h3{font-size:22px;line-height:1.25;font-weight:700;letter-spacing:-.012em}
.manifesto{font-size:var(--fs-manifesto);line-height:1.25;font-weight:500;letter-spacing:-.01em;max-width:34ch}
.manifesto p + p{margin-top:.9em}
.manifesto .sign{font-weight:800;letter-spacing:-.02em}
.lead{font-size:19px;line-height:1.5;color:var(--ink-muted);max-width:56ch}
.body{color:var(--ink-muted);max-width:60ch}
.h3 + .body,h3 + .body{margin-top:.7rem}
.fine{font-size:15px;color:var(--ink-faint)}
.mono{font-family:var(--mono);font-weight:500;text-transform:uppercase;letter-spacing:.08em;font-size:12px}
.eyebrow{display:inline-flex;align-items:center;gap:10px;font-family:var(--mono);font-weight:500;font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint)}
.eyebrow::before{content:"";width:8px;height:8px;background:var(--sky);border:1px solid var(--ink);flex:none}
.band--ink .eyebrow,.hero .eyebrow{color:var(--night-muted)}
.band--ink .eyebrow::before,.hero .eyebrow::before{border-color:var(--paper)}
.cap{font-family:var(--mono);font-weight:500;font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-faint);line-height:1.5}
.band--ink .cap{color:var(--night-muted)}
/* sky highlight; Hanken reserves ~1em above the baseline but its letters reach ~.7em, so the blue starts at .8em */
.hl{background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Crect width='8' height='8' fill='%23A9D5EC'/%3E%3C/svg%3E") 0 100%/100% calc(100% - .22em) no-repeat;padding:.02em .22em;box-decoration-break:clone;-webkit-box-decoration-break:clone}
.band--ink .hl,.hero .hl{color:var(--ink)}
.email{font-family:var(--mono);font-size:13px;user-select:all;color:inherit;text-decoration:underline;text-underline-offset:3px}
.measure{max-width:60ch}
.center{text-align:center}
.center .lead,.center .body,.center.lead,.center.body{margin-inline:auto}

/* 4 · layout ------------------------------------------------------------------------------------------------------ */
/* A band is full-bleed; .in is the framed column (dashed side rules, so stacked bands read as one continuous frame). */
.band{border-bottom:1px dashed var(--dash)}
.band > .in{max-width:var(--col);margin:0 auto;padding:var(--padv) var(--pad);border-inline:1px dashed var(--dash)}
.band--flush > .in{padding:0}
.band--panel{background:var(--panel)}
.band--sky{background:var(--panel-sky);border-bottom-color:var(--sky)}
.band--sky > .in{border-inline-color:var(--sky)}
.band--ink{background:var(--night);color:var(--paper);border-bottom-color:var(--night-dash)}
.band--ink > .in{border-inline-color:var(--night-dash)}
.band--ink .lead,.band--ink .body{color:var(--night-muted)}
.band--tight > .in{padding-block:clamp(28px,4vw,52px)}

.stack{display:grid;grid-template-columns:minmax(0,1fr);gap:16px;align-content:start}
.stack--lg{gap:clamp(20px,2.4vw,32px)}
.stack--sm{gap:8px}
.mt-s{margin-top:16px}.mt-m{margin-top:clamp(24px,3vw,36px)}.mt-l{margin-top:clamp(36px,5vw,64px)}
.cta-row{display:flex;flex-wrap:wrap;align-items:center;gap:12px}
.facts{display:flex;flex-wrap:wrap;gap:6px 16px;margin-top:4px;color:var(--ink-faint);font-size:11px}
.facts span::before{content:"";display:inline-block;width:7px;height:7px;margin-right:8px;vertical-align:1px;background:var(--sky);border:1px solid currentColor}
.band--ink .facts{color:var(--night-muted)}
.hero .facts{color:var(--paper)}

/* section header: eyebrow, h2, lead. Left-aligned by default, .sec-head--center for centred pages like the old site. */
.sec-head{display:grid;gap:14px;justify-items:start}
.sec-head h2{max-width:22ch}
.sec-head--center{justify-items:center;text-align:center}
.sec-head--center .lead{margin-inline:auto}
.band--flush .sec-head{padding:clamp(40px,5.6vw,76px) var(--pad) clamp(28px,3.6vw,48px)}

/* 12-column grid at >=1100px, 6 at tablet (700-1099), 1 on phones. .sN = span N of 12; .stN = start column. */
.grid{display:grid;grid-template-columns:minmax(0,1fr);column-gap:var(--gap);row-gap:clamp(24px,3vw,40px)}
.grid > *{grid-column:1 / -1}
@media (min-width:700px){
  .grid{grid-template-columns:repeat(6,minmax(0,1fr))}
  .s1,.s2{grid-column:span 1}.s3,.s4{grid-column:span 2}.s5,.s6{grid-column:span 3}
  .s7,.s8{grid-column:span 4}.s9,.s10{grid-column:span 5}.s11,.s12{grid-column:span 6}
}
@media (min-width:1100px){
  .grid{grid-template-columns:repeat(12,minmax(0,1fr))}
  .s1{grid-column:span 1}.s2{grid-column:span 2}.s3{grid-column:span 3}.s4{grid-column:span 4}.s5{grid-column:span 5}.s6{grid-column:span 6}
  .s7{grid-column:span 7}.s8{grid-column:span 8}.s9{grid-column:span 9}.s10{grid-column:span 10}.s11{grid-column:span 11}.s12{grid-column:span 12}
  .st1{grid-column-start:1}.st2{grid-column-start:2}.st3{grid-column-start:3}.st4{grid-column-start:4}.st5{grid-column-start:5}.st6{grid-column-start:6}
  .st7{grid-column-start:7}.st8{grid-column-start:8}.st9{grid-column-start:9}.st10{grid-column-start:10}.st11{grid-column-start:11}.st12{grid-column-start:12}
}
.grid--center{align-items:center}
.grid--end{align-items:end}

/* 5 · nav (header with four menus, phone sheet) ---------------------------------------------------------------------- */
.nav{position:sticky;top:0;z-index:30;background:var(--paper);border-bottom:1px solid var(--dash)}
.nav-in{max-width:var(--col);margin:0 auto;height:var(--nav-h);display:flex;align-items:center;gap:28px;padding-inline:var(--pad)}
.brand{display:inline-flex;align-items:center;gap:10px;font-weight:700;font-size:17px;text-decoration:none;color:inherit;flex:none}
.brand .mark{display:block}
.nav-links{display:none;align-self:stretch;align-items:stretch;gap:clamp(10px,1.4vw,22px);margin-left:clamp(0px,1.4vw,20px);font-size:15px}
.nav-links > a,.nav-top{display:inline-flex;align-items:center;text-decoration:none;color:var(--ink-muted)}
.nav-links > a:hover,.nav-top:hover,.nav-links > a[aria-current],.nav-top[aria-current]{color:var(--ink)}
.nav-links > a[aria-current],.nav-top[aria-current],.sheet a[aria-current]{text-decoration:underline;text-decoration-color:var(--sky-edge);text-decoration-thickness:2px;text-underline-offset:8px}
.nav-end{margin-left:auto;display:flex;align-items:center;gap:12px}
.nav .nav-cta,.nav .nav-ghost{display:none}
.nav-ghost[aria-current]{border-color:var(--sky-edge);background:var(--panel-sky)}
.nav-cta[aria-current]{background:var(--panel-sky);color:var(--ink);border-color:var(--sky-edge)}
.nav-toggle{width:44px;height:44px;display:inline-grid;place-content:center;gap:6px;background:var(--paper);border:1px solid var(--hairline);cursor:pointer;padding:0}
.nav-toggle i{display:block;width:18px;height:2px;background:var(--ink)}
.nav-toggle.is-open i:first-of-type{transform:translateY(4px) rotate(45deg)}
.nav-toggle.is-open i:last-of-type{transform:translateY(-4px) rotate(-45deg)}
@media (min-width:600px){.nav .nav-cta{display:inline-flex}}
@media (min-width:720px){.nav .nav-ghost{display:inline-flex}}   /* the lead-magnet button joins the primary one on tablets and up; on phones it sits in the sheet */
/* the full nav needs ~1100px; below that the sheet takes over (site.js uses the same breakpoint) */
@media (min-width:1120px){
  .nav-links{display:flex}
  .nav-toggle,.sheet{display:none!important}
}
/* Menus: [label link][caret button] and a full-width panel under the header (OpenAI's pattern). site.js owns aria-expanded (hover, click,
   keyboard, Esc). The panel is positioned against .nav, so .nav-menu must stay un-positioned. Without JS the panels stay closed and the
   label is just a link to the overview page. */
.nav-menu{display:flex;align-items:stretch}
.nav-menu-btn{display:grid;place-items:center;align-self:stretch;width:22px;margin:0;padding:0;border:0;background:none;color:var(--ink-muted);cursor:pointer}
.nav-menu-btn:hover,.nav-menu-btn[aria-expanded=true],.nav-menu-btn[aria-current]{color:var(--ink)}
.nav-menu:hover .nav-top{color:var(--ink)}
.nav-caret{display:block;width:6px;height:6px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;transform:translateY(-2px) rotate(45deg);transition:transform .15s}
.nav-menu-btn[aria-expanded=true] .nav-caret{transform:translateY(1px) rotate(-135deg)}
.nav-panel{display:none;position:absolute;left:0;right:0;top:calc(100% - 1px);z-index:31;background:var(--paper);border-top:1px solid var(--dash);border-bottom:1px solid var(--ink)}
.nav-menu-btn[aria-expanded=true] ~ .nav-panel{display:block}
.nav-panel-in{max-width:var(--col);margin:0 auto;padding:clamp(22px,2.4vw,32px) var(--pad) clamp(16px,1.8vw,22px);display:grid;gap:16px}
.nav-cols{display:grid;grid-template-columns:repeat(2,minmax(0,380px));gap:20px clamp(24px,3.6vw,64px);justify-content:start}
.nav-cols:has(> .nav-col:only-child){grid-template-columns:minmax(0,1fr)}   /* one group (Solutions): its items sit side by side */
.nav-cols:has(> .nav-col:only-child) .nav-list{grid-template-columns:repeat(3,minmax(0,340px));gap:2px clamp(16px,2vw,32px)}
.nav-eyebrow{padding:0 0 10px 20px}
.nav-list{list-style:none;display:grid;gap:2px}
.nav-list a{display:grid;gap:3px;padding:11px 20px 12px 17px;border-left:3px solid transparent;color:var(--ink);text-decoration:none}
.nav-list a:hover,.nav-list a:focus-visible{background:var(--panel-sky)}
.nav-list a[aria-current]{border-left-color:var(--sky-edge)}
.nav-list a:focus-visible{outline-offset:-3px}
.nav-it{display:flex;flex-wrap:wrap;align-items:center;gap:4px 10px;font-size:16px;line-height:1.3;font-weight:700;letter-spacing:-.01em}
.nav-tag{padding:2px 6px;border:1px solid var(--hairline);font-family:var(--mono);font-weight:500;font-size:10.5px;line-height:1.3;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint)}
.nav-desc{max-width:42ch;font-size:14px;line-height:1.4;color:var(--ink-muted)}
.nav-panel-foot{margin:0;padding:14px 0 0 20px;border-top:1px dashed var(--dash)}
.nav-all{font-family:var(--mono);font-weight:500;font-size:12px;letter-spacing:.08em;text-transform:uppercase;text-decoration:none;color:var(--ink);border-bottom:1px solid var(--hairline);padding-bottom:2px}
.nav-all:hover,.nav-all:focus-visible{border-color:var(--sky-edge)}
/* mobile sheet: full screen under the header (positioned by site.js, --sheet-top), grouped under eyebrows like the menus */
.sheet{display:none;position:fixed;left:0;right:0;bottom:0;top:var(--sheet-top,64px);z-index:29;background:var(--paper);border-top:1px solid var(--dash);overflow:auto;overscroll-behavior:contain;padding:4px var(--pad) 40px}
.sheet.open{display:block}
.sheet a:not(.btn){display:flex;justify-content:space-between;align-items:baseline;padding:16px 0;border-bottom:1px dashed var(--dash);font-size:26px;font-weight:800;letter-spacing:-.03em;text-decoration:none}
.sheet a:not(.btn)::after{content:"→";font-family:var(--mono);font-weight:500;font-size:16px;color:var(--ink-faint)}
.sheet a[target="_blank"]:not(.btn)::after{content:none}
.sheet a[aria-current]:not(.btn){text-decoration:none;color:var(--ink)}
.sheet a[aria-current]:not(.btn)::after{content:"●";color:var(--sky-edge)}
.sheet-group{padding-bottom:6px;border-bottom:1px solid var(--ink)}
.sheet-eyebrow{padding:22px 0 4px}
.sheet-sub{padding:12px 0 0;color:var(--ink-faint)}
.sheet-group a:not(.btn){font-size:20px;letter-spacing:-.02em;padding:11px 0 11px 18px}
.sheet-group a:last-child:not(.btn){border-bottom:0}
.sheet-cta,.sheet-ghost{display:flex!important;justify-content:center;width:100%;margin-top:12px}
.sheet-ghost{margin-top:24px}
.sheet-ghost[aria-current]{border-color:var(--sky-edge);background:var(--panel-sky)}
.sheet-top{border-top:0}
/* no JS: the four labels sit in a wrapped row under the brand (the overview pages carry the rest); no sheet, no caret buttons */
html:not(.js) .nav-in{flex-wrap:wrap;height:auto;padding-block:12px;gap:8px 20px}
html:not(.js) .nav-links{display:flex;flex-wrap:wrap;align-items:center;gap:6px 18px;margin-left:0;order:3;width:100%}
html:not(.js) .nav-toggle,html:not(.js) .nav-menu-btn,html:not(.js) .nav-panel{display:none}
html:not(.js) .nav .nav-cta,html:not(.js) .nav .nav-ghost{display:inline-flex}

/* 6 · buttons + links --------------------------------------------------------------------------------------------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:10px;height:44px;padding:0 24px;background:var(--ink);color:var(--paper);border:1px solid var(--ink);border-radius:0;font-family:var(--mono);font-weight:500;font-size:12.5px;letter-spacing:.08em;text-transform:uppercase;text-decoration:none;cursor:pointer;white-space:nowrap}
.btn:hover{background:#262626}
.btn--ghost,.btn.ghost{background:var(--paper);color:var(--ink);border-color:var(--edge)}
.btn--ghost:hover,.btn.ghost:hover{background:var(--paper);border-color:var(--ink)}
.btn--paper{background:var(--paper);color:var(--ink);border-color:var(--paper)}   /* primary on a dark photo or ink band */
.btn--paper:hover{background:var(--sky);border-color:var(--sky)}
.btn--ghost-dark{background:transparent;color:var(--paper);border-color:var(--night-muted)}
.btn--ghost-dark:hover{background:transparent;border-color:var(--paper)}
.btn--sm,.btn.sm{height:32px;padding:0 12px;font-size:11px}
.btn[disabled]{opacity:.55;cursor:default}
@media (pointer:coarse){.btn{min-height:44px}}

/* 7 · chips ------------------------------------------------------------------------------------------------------- */
.chip{display:inline-block;font-family:var(--mono);font-weight:500;font-size:11px;letter-spacing:.08em;text-transform:uppercase;line-height:1.3;border:1px solid var(--hairline);border-radius:2px;padding:4px 8px;background:var(--paper);color:var(--ink);white-space:nowrap}
.chips{display:flex;flex-wrap:wrap;gap:8px}
.chip--ink{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.chip--sky{background:var(--panel-sky);border-color:var(--sky-edge)}
.chip--flag{background:var(--flag-tint);border-color:var(--flag);color:var(--flag-ink)}
/* product status chips (the register): Available / Waitlist / Underneath / Program, plus the green "Demo open" */
.chip--available{border-color:var(--ok);color:var(--ok)}
.chip--available::before{content:"";display:inline-block;width:6px;height:6px;background:var(--ok);margin-right:7px;vertical-align:1px}
.chip--waitlist{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.chip--underneath{border-style:dashed;border-color:var(--edge);color:var(--ink-muted)}
.chip--program{background:var(--sky);border-color:var(--sky-edge)}
.chip--ok{background:#EAF4EE;border-color:var(--ok);color:var(--ok)}
.band--ink .chip,.hero .chip{background:transparent;color:var(--paper);border-color:var(--night-dash)}
.hero .chip{background:rgba(11,11,11,.55);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}   /* readable on any photo */
.band--ink .chip--ok,.hero .chip--ok{color:#7FD3A0;border-color:#4C9D70}
.band--ink .chip--sky,.hero .chip--sky{color:var(--sky);border-color:var(--sky-edge)}
.band--ink .chip--waitlist,.hero .chip--waitlist{background:var(--paper);color:var(--ink);border-color:var(--paper)}
.band--ink .chip--program,.hero .chip--program{background:var(--sky);color:var(--ink);border-color:var(--sky)}
.band--ink .chip--available,.hero .chip--available{color:#7FD3A0;border-color:#4C9D70}
.band--ink .chip--available::before,.hero .chip--available::before{background:#7FD3A0}
.band--ink .chip--underneath,.hero .chip--underneath{color:var(--night-muted);border-color:var(--edge)}

/* 8 · media: photo frame, field labels, overlays ------------------------------------------------------------------------ */
/* No CSS colour filter: the grade (docs/footage-style.md) is baked into every file. A plain .media carries only faint grain.
   Brackets and mono labels belong to Illustration frames (.media--ill); text-bearing frames (hero, solution card) add a scrim in section 9 / 20d. */
.media{position:relative;display:block;margin:0;overflow:hidden;isolation:isolate;background:var(--night);aspect-ratio:var(--ar,16/9)}
.media--45{--ar:4/5}.media--43{--ar:4/3}.media--32{--ar:3/2}.media--11{--ar:1/1}.media--169{--ar:16/9}.media--219{--ar:21/9}
.media > img,.media > video,.media > picture,.media > picture img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.media > video{z-index:1}
/* grain: tiled noise at alpha .06 (baseFrequency 1.4) */
.media::before{content:"";position:absolute;inset:0;z-index:2;pointer-events:none;
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='128' height='128'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.4' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 .5 0 0 0 0 .5 0 0 0 0 .5 0 0 0 .06 0'/%3E%3C/filter%3E%3Crect width='128' height='128' filter='url(%23n)'/%3E%3C/svg%3E") 0 0/128px 128px}
/* Illustration frames only: two sky corner brackets (top-left, bottom-right) drawn with gradients */
.media--ill::after{content:"";position:absolute;inset:8px;z-index:3;pointer-events:none;
  background:
    linear-gradient(var(--sky),var(--sky)) 0 0/16px 2px no-repeat,
    linear-gradient(var(--sky),var(--sky)) 0 0/2px 16px no-repeat,
    linear-gradient(var(--sky),var(--sky)) 100% 100%/16px 2px no-repeat,
    linear-gradient(var(--sky),var(--sky)) 100% 100%/2px 16px no-repeat}
/* field labels: mono, on a solid chip so contrast never depends on the photo. 16px insets. */
.lbl{position:absolute;z-index:4;max-width:calc(100% - 32px);padding:3px 7px;background:var(--ink);color:var(--paper);font-family:var(--mono);font-weight:500;font-size:11px;line-height:1.4;letter-spacing:.08em;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lbl--paper{background:var(--paper);color:var(--ink)}
.lbl--sky{background:var(--sky);color:var(--ink)}
.lbl.tl{top:16px;left:16px}.lbl.tr{top:16px;right:16px}.lbl.bl{bottom:16px;left:16px}.lbl.br{bottom:16px;right:16px}
/* camera-still overlay idiom: 1px sky zone boxes, a mono tag on the top edge and a count; one --flag box for the problem.
   Position with style="--x:12%;--y:30%;--w:30%;--h:40%". Always add <span class="lbl lbl--sky tr">Illustration</span>. */
.ov{position:absolute;z-index:3;left:var(--x,10%);top:var(--y,10%);width:var(--w,20%);height:var(--h,20%);border:1px solid var(--sky)}
.ov .tg{position:absolute;left:-1px;bottom:100%;max-width:min(260px,60vw);padding:2px 6px;background:var(--sky);color:var(--ink);font-family:var(--mono);font-weight:500;font-size:10px;line-height:1.4;letter-spacing:.06em;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ov .ct{position:absolute;right:4px;bottom:3px;white-space:nowrap;font-family:var(--mono);font-weight:500;font-size:10px;letter-spacing:.06em;color:var(--paper);background:rgba(11,11,11,.8);padding:1px 5px}
.ov--flag{border-color:var(--flag);border-width:2px}
.ov--flag .tg{background:var(--flag-ink);color:var(--paper);left:-2px}
/* Illustration frames whose size follows the viewport (a hero): the boxes live in a layer that keeps the photo's own 16:9 frame (like object-fit: cover,
   photo centred), so a box stays on its door or trailer at any hero size. <figure class="media media--ill"> … <div class="cam-layer" aria-hidden="true"> .ov … </div> */
.media--ill.media--layer{container-type:size}
.media--ill .cam-layer{position:absolute;z-index:3;left:50%;top:50%;width:max(100cqw,177.78cqh);aspect-ratio:16/9;transform:translate(-50%,-50%);pointer-events:none}
.media--ill .cam-layer .ov{pointer-events:none}
@keyframes ov-draw{from{clip-path:inset(-30px 100% -30px -2px)}to{clip-path:inset(-30px -280px -30px -2px)}}   /* the right edge stays open so a tag wider than its box is not cut */
/* overlays are visible by default (no JS, print, snapshots, reduced motion); site.js adds .will-draw only to blocks that start below the fold */
html.js [data-reveal].will-draw .ov{clip-path:inset(-30px 100% -30px -2px)}
html.js [data-reveal].is-in .ov{animation:ov-draw .8s var(--d,0s) ease-out both}
/* dev-only placeholder frame for the styleguide (no photo) */
.media--ph{background:repeating-linear-gradient(135deg,#171717 0 12px,#1d1d1d 12px 24px)}
/* video with a poster <img class="poster"> before it: reduced motion shows the poster only */
@media (prefers-reduced-motion:reduce){.media > .poster + video,.media > picture + video{display:none}}
.media-cap{margin-top:10px}

/* 9 · hero (full-bleed video or photo, text over the scrim) --------------------------------------------------------- */
.hero{position:relative;isolation:isolate;display:flex;align-items:flex-end;min-height:max(520px,min(calc(100svh - var(--chrome-h)),760px));background:var(--night);color:var(--paper);overflow:hidden}
.hero > .media{position:absolute;inset:0;z-index:-1;aspect-ratio:auto}
/* .hero--full: the hero IS the first screen: the whole viewport below the sticky nav (100vh fallback, then 100svh so a phone's collapsing toolbar does not cut it), no 760px cap; still grows if the text is taller (a short landscape phone). Home only. */
.hero--full{min-height:calc(100vh - var(--chrome-h));min-height:calc(100svh - var(--chrome-h))}
/* Wide screens: the film is 16:9, so a hero much wider than tall crops its top and bottom (2560x760 showed 53% of the frame height). From 1100px the hero is the viewport below the nav, never
   taller than its own 16:9 (56.25vw) and, on the inner pages, no longer capped at 760px: 1440x900 crops 2%, 1920x1080 and 2560x1440 about 10% / 8% (the nav takes the rest). Phones and tablets keep the full-height hero and their 9:16 cut. */
@media (min-width:1100px){
  .hero{min-height:max(520px,min(calc(100vh - var(--chrome-h)),max(760px,56.25vw)));min-height:max(520px,min(calc(100svh - var(--chrome-h)),max(760px,56.25vw)))}
  .hero--full{min-height:min(calc(100vh - var(--chrome-h)),max(520px,56.25vw));min-height:min(calc(100svh - var(--chrome-h)),max(520px,56.25vw))}
}
/* scrim for frames that carry text (hero, closing photo band): about 25% over the whole frame plus a gradient from the bottom third up to 60%, where the headline sits.
   Under 700px the text block fills most of the frame, so the gradient rises higher and the flat layer is a little deeper (about 38%). Plain stills carry no scrim. */
.hero > .media::before,.band--photo > .media::before{background:
    linear-gradient(to top,rgba(11,11,11,.6),rgba(11,11,11,0) 38%),
    linear-gradient(to right,rgba(11,11,11,.74),rgba(11,11,11,.5) 50%,rgba(11,11,11,0) 88%),
    linear-gradient(rgba(11,11,11,.25),rgba(11,11,11,.25)),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='128' height='128'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.4' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 .5 0 0 0 0 .5 0 0 0 0 .5 0 0 0 .06 0'/%3E%3C/filter%3E%3Crect width='128' height='128' filter='url(%23n)'/%3E%3C/svg%3E");
  background-size:auto,auto,auto,128px 128px}
@media (max-width:699px){
  .hero > .media::before,.band--photo > .media::before{background:
    linear-gradient(to top,rgba(11,11,11,.68),rgba(11,11,11,0) 80%),
    linear-gradient(to right,rgba(11,11,11,.5),rgba(11,11,11,.25) 70%,rgba(11,11,11,.1)),
    linear-gradient(rgba(11,11,11,.38),rgba(11,11,11,.38)),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='128' height='128'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.4' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 .5 0 0 0 0 .5 0 0 0 0 .5 0 0 0 .06 0'/%3E%3C/filter%3E%3Crect width='128' height='128' filter='url(%23n)'/%3E%3C/svg%3E");
  background-size:auto,auto,auto,128px 128px}
}
.hero-in{position:relative;width:100%;max-width:var(--col);margin:0 auto;padding:clamp(96px,12vw,150px) var(--pad) clamp(60px,7vw,84px);display:grid;gap:clamp(16px,2vw,24px);justify-items:start}
.hero h1,.hero .display{max-width:16ch}
.hero .lead{color:rgba(255,255,255,.9);max-width:54ch}
.hero--ink{background:var(--night)}
/* photographic band (closing band): a full-bleed .media behind an ink band, white text over the same scrim as the hero */
.band--photo{position:relative;isolation:isolate;display:flex;align-items:flex-end;min-height:520px;overflow:hidden}
.band--photo > .media{position:absolute;inset:0;z-index:-1;aspect-ratio:auto}
.band--photo > .in{position:relative;width:100%}
.band--photo .fine,.band--photo .cta-small{color:rgba(255,255,255,.88)}
.band--photo .mono a,.band--photo .email{color:var(--paper)}
.band--photo > .media img,.band--photo > .media video{width:100%;height:100%;object-fit:cover}
/* photo band, tall (v5): a full-bleed picture or film with an optional h2 (.photo-h, it IS the section headline) and a one-line mono caption (.photo-cap).
   <section class="band band--ink band--photo band--photo--tall" aria-labelledby="x-h"><figure class="media">…</figure><div class="in photo-in"><h2 id="x-h" class="photo-h">…</h2><p class="photo-cap">…</p></div></section>
   .band--photo--caption: a caption-only band (no h2) keeps the flat 25% scrim and drops the bottom gradient. A photo band with a .media and no .photo-in is a check warning. */
.band--photo--tall{min-height:clamp(440px,62vh,760px)}
.photo-in{display:grid;gap:12px;justify-items:start;padding-block:clamp(40px,6vw,72px)}
.photo-h{max-width:18ch;margin:0;font-size:clamp(32px,4.6vw,58px);line-height:1.02;font-weight:800;letter-spacing:-.04em;color:var(--paper)}
.photo-cap{margin:0;font-family:var(--mono);font-weight:500;font-size:13px;line-height:1.5;letter-spacing:.06em;text-transform:uppercase;color:rgba(255,255,255,.88)}
.photo-cap::before{content:"";display:inline-block;width:7px;height:7px;margin-right:8px;vertical-align:1px;background:var(--sky);border:1px solid currentColor}
.band--photo--caption > .media::before{background:
    linear-gradient(rgba(11,11,11,.25),rgba(11,11,11,.25)),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='128' height='128'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.4' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 .5 0 0 0 0 .5 0 0 0 0 .5 0 0 0 .06 0'/%3E%3C/filter%3E%3Crect width='128' height='128' filter='url(%23n)'/%3E%3C/svg%3E");
  background-size:auto,128px 128px}
@media (max-width:699px){
  .band--photo--tall{min-height:60svh}
  .band--photo--caption > .media::before{background:
    linear-gradient(rgba(11,11,11,.38),rgba(11,11,11,.38)),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='128' height='128'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.4' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 .5 0 0 0 0 .5 0 0 0 0 .5 0 0 0 .06 0'/%3E%3C/filter%3E%3Crect width='128' height='128' filter='url(%23n)'/%3E%3C/svg%3E");
    background-size:auto,128px 128px}
}
/* text-only page head for product pages (paper) */
.pagehead{display:grid;gap:clamp(16px,2vw,24px);justify-items:start}
.pagehead h1,.pagehead .display{max-width:18ch}

/* 10 · register: numbered hairline rows; stacked with the photo above on phones, image-led rows (.register--led) on desktop -------- */
.register{list-style:none;border-top:1px solid var(--ink)}
.reg-row{border-bottom:1px dashed var(--dash)}
.reg-link{position:relative;display:grid;grid-template-columns:40px minmax(0,1fr) auto;grid-template-areas:"photo photo photo" "n name arrow" ". chip chip" ". line line";column-gap:14px;row-gap:10px;align-items:start;padding:20px 0 24px;text-decoration:none;color:inherit}
.reg-n{grid-area:n;font-family:var(--mono);font-weight:500;font-size:12px;letter-spacing:.08em;color:var(--ink-faint);padding-top:.5em}
.reg-name{grid-area:name;font-size:clamp(24px,2.6vw,32px);line-height:1.1;font-weight:800;letter-spacing:-.03em}
.reg-chip{grid-area:chip;justify-self:start}
.reg-line{grid-area:line;color:var(--ink-muted);max-width:52ch}
.reg-arrow{grid-area:arrow;font-family:var(--mono);font-size:20px;line-height:1;padding-top:.3em;transition:transform .2s}
.reg-photo{grid-area:photo;width:100%;max-width:480px;--ar:16/9;margin-bottom:6px}
.reg-link:hover .reg-name,.reg-link:focus-visible .reg-name{text-decoration:underline;text-decoration-thickness:2px;text-decoration-color:var(--sky-edge);text-underline-offset:6px}
.reg-link:hover .reg-arrow{transform:translateX(4px)}
@media (min-width:700px) and (max-width:1099px){
  .reg-photo{grid-column:2 / -1}
}
/* image-led register (home): the photo is always visible. Phone and tablet keep the stacked layout above. */
.register--led .reg-text{display:contents}
.register--led .reg-cta{display:none}
.register--led .reg-photo{max-width:none;margin-bottom:0}
.register--led figure.reg-photo{border:1px solid var(--ink);background:var(--paper)}
.register--led figure.reg-photo img{width:100%;height:auto}
.register--led figure.reg-photo figcaption{padding:8px 12px;border-top:1px solid var(--ink)}
@media (min-width:1100px){
  .register--led .reg-link{grid-template-columns:48px minmax(0,4fr) minmax(0,7fr) 32px;grid-template-areas:"n text photo arrow";column-gap:clamp(24px,3vw,44px);row-gap:0;padding:36px 0;align-items:center}
  .register--led .reg-n{align-self:start;padding-top:.7em}
  .register--led .reg-text{display:grid;grid-area:text;gap:14px;justify-items:start;align-content:center}
  .register--led .reg-text > *{grid-area:auto}
  .register--led .reg-name{font-size:32px}
  .register--led .reg-cta{display:inline-block;margin-top:6px}
  .register--led .reg-photo{grid-area:photo;--ar:16/10}
  .register--led .reg-arrow{align-self:center;padding-top:0;justify-self:end}
  .register--led .reg-link:hover .reg-cta,.register--led .reg-link:focus-visible .reg-cta{border-color:currentColor}
}
.band--ink .register{border-top-color:var(--paper)}
.band--ink .reg-row{border-bottom-color:var(--night-dash)}
.band--ink .reg-line{color:var(--night-muted)}

/* 11 · cells: hairline grid of 2 / 3 / 4 / 5 columns that collapses (no cards) ------------------------------------------ */
.cells{--n:3;display:grid;grid-template-columns:repeat(var(--n),minmax(0,1fr));overflow:hidden}
.cells > *{margin:-1px 0 0 -1px;border-top:1px dashed var(--dash);border-left:1px dashed var(--dash)}   /* the first row / column border falls outside and is clipped */
.c2{--n:2}.c3{--n:3}.c4{--n:4}.c5{--n:5}
@media (max-width:1100px){.c5{--n:2}}
@media (max-width:1000px){.c4{--n:2}}
@media (max-width:820px){.c3{--n:2}}
@media (max-width:600px){.c2,.c3,.c4,.c5{--n:1}}
.cell{padding:clamp(22px,2.8vw,38px) clamp(18px,2.4vw,34px)}
.cell .h3{margin-bottom:.6rem}
.cell .body{max-width:none}
.step{display:block;font-family:var(--mono);font-weight:500;font-size:.78rem;letter-spacing:.08em;color:var(--ink-faint);margin-bottom:1.1rem}
.band--ink .cells > *{border-color:var(--night-dash)}
.band--ink .step{color:var(--night-muted)}
.link-row{display:flex;flex-wrap:wrap;gap:12px 28px}
.cell-fig{margin-top:1.4rem;border:1px solid var(--hairline);background:var(--paper)}
.cell-fig .media{border:0}

/* 12 · money cards (with count-up) + the Receive→Load gap strip --------------------------------------------------------- */
.money{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));margin-top:36px;border-top:1px solid var(--ink)}
.m{padding:24px 20px 6px;border-left:1px dashed var(--dash);display:grid;gap:8px;align-content:start}
.m:first-child{border-left:0;padding-left:0}
.m .k{font-family:var(--mono);font-weight:500;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint)}
.m b{font-size:clamp(32px,3.4vw,46px);font-weight:800;letter-spacing:-.03em;line-height:1;font-variant-numeric:tabular-nums}
.m p{font-size:15.5px;color:var(--ink-muted)}
.m a{font-family:var(--mono);font-weight:500;font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-faint)}
.m .links{display:flex;flex-wrap:wrap;gap:4px 14px}
@media (max-width:900px){.money{grid-template-columns:repeat(2,minmax(0,1fr))}.m:nth-child(3){border-left:0;padding-left:0}.m:nth-child(n+3){margin-top:12px}}
@media (max-width:520px){.money{grid-template-columns:1fr}.m,.m:nth-child(n){border-left:0;padding-left:0;margin-top:0;border-top:1px dashed var(--dash)}.m:first-child{border-top:0}}
.band--ink .money{border-top-color:var(--paper)}
.band--ink .m{border-left-color:var(--night-dash)}
.band--ink .m p,.band--ink .m .k,.band--ink .m a{color:var(--night-muted)}

/* gap strip, static: five scanned steps, four unscanned gaps between them */
.gaps{position:relative;height:78px;margin-top:40px}
.gline{position:absolute;left:0;right:0;top:36px;height:2px;background:var(--hairline)}
.gseg{position:absolute;top:36px;left:calc(var(--x) - 8%);width:16%;height:2px;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='2'%3E%3Crect width='6' height='2' fill='%23C2611F'/%3E%3C/svg%3E") 0 0/10px 2px repeat-x}
.glab{position:absolute;left:var(--x);top:4px;transform:translateX(-50%);font-weight:700;font-size:15px;color:var(--flag-ink);white-space:nowrap}
.gnode{position:absolute;left:var(--x);top:29px;transform:translateX(-50%);display:grid;justify-items:center;gap:10px}
.gnode i{width:16px;height:16px;background:var(--sky);border:1.5px solid var(--ink)}
.gnode em{font-style:normal;font-family:var(--mono);font-weight:500;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-muted);white-space:nowrap}
.gnode.first{transform:none;justify-items:start}
.gnode.last{transform:translateX(-100%);justify-items:end}
.glegend{display:flex;flex-wrap:wrap;gap:6px 20px;margin-top:10px;font-size:10.5px;color:var(--ink-faint)}
.glegend span{display:inline-flex;align-items:center;gap:8px}
.glegend .sq{width:10px;height:10px;background:var(--sky);border:1px solid var(--ink)}
.glegend .dl{width:18px;height:2px;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='2'%3E%3Crect width='5' height='2' fill='%23C2611F'/%3E%3C/svg%3E") 0 0/8px 2px repeat-x}
.glegend + .money{margin-top:24px}
@media (max-width:640px){.glab{font-size:12.5px}.gnode em{font-size:9.5px;letter-spacing:.04em}}

/* 13 · field reel (3 video tiles) and photo strip ------------------------------------------------------------------------ */
.reel,.strip{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--gap)}
@media (min-width:700px){.reel,.strip{grid-template-columns:repeat(3,minmax(0,1fr))}}
.reel.reel--sheet{grid-template-columns:repeat(2,minmax(0,1fr))}
@media (min-width:900px){.reel.reel--sheet{grid-template-columns:repeat(4,minmax(0,1fr))}}
.reel .media{--ar:4/3}
/* gapless contact sheet (home "Where we work"): four 4:3 tiles, hairlines between them, 2x2 on phones and tablets, 4 across from 900px */
.reel.reel--sheet{grid-template-columns:repeat(2,minmax(0,1fr));gap:0}
.reel--sheet .media{outline:1px solid var(--night-dash);outline-offset:0}
@media (min-width:900px){.reel.reel--sheet{grid-template-columns:repeat(4,minmax(0,1fr))}}
@media (max-width:699px){.reel--sheet .lbl{font-size:10px;padding:2px 5px;letter-spacing:.06em}.reel--sheet .lbl.tl{top:8px;left:8px}.reel--sheet .lbl.br{bottom:8px;right:8px}.reel--sheet .media::after{inset:4px}}
.strip .media{--ar:4/3}

/* 14 · FAQ (details / summary) ----------------------------------------------------------------------------------------- */
.faq{border-top:1px solid var(--ink)}
.faq details{border-bottom:1px dashed var(--dash)}
.faq summary{list-style:none;cursor:pointer;display:flex;justify-content:space-between;align-items:baseline;gap:20px;padding:20px 0;font-size:19px;font-weight:700;letter-spacing:-.01em;line-height:1.3}
.faq summary::-webkit-details-marker{display:none}
.faq summary::after{content:"+";font-family:var(--mono);font-weight:500;font-size:20px;line-height:1;color:var(--ink-faint);flex:none}
.faq details[open] summary::after{content:"−"}
.faq summary:hover{background:var(--panel)}
.faq details > :not(summary){padding-bottom:22px;color:var(--ink-muted);max-width:62ch}
.band--ink .faq{border-top-color:var(--paper)}
.band--ink .faq details{border-bottom-color:var(--night-dash)}
.band--ink .faq summary:hover{background:#151515}
.band--ink .faq details > :not(summary){color:var(--night-muted)}

/* 15 · forms ------------------------------------------------------------------------------------------------------------- */
.form{display:grid;gap:16px;max-width:560px}
.field{display:grid;gap:6px;font-size:14.5px;color:var(--ink-muted)}
/* required marker: lives only here. Joined to the last word of the label with a no-break space in the markup, so it never wraps onto its own line */
.field .lab .req{color:var(--flag-ink);display:inline;white-space:nowrap}
.field .lab{display:block}
.field input,.field textarea,.field select{width:100%;border:1px solid var(--hairline);border-radius:0;padding:11px 12px;font:inherit;font-size:16px;color:var(--ink);background:var(--paper);appearance:none}
.field select{background-image:linear-gradient(45deg,transparent 50%,var(--ink) 50%),linear-gradient(135deg,var(--ink) 50%,transparent 50%);background-position:calc(100% - 18px) 55%,calc(100% - 13px) 55%;background-size:5px 5px;background-repeat:no-repeat;padding-right:36px}
.field textarea{min-height:110px;resize:vertical}
.field input:focus,.field textarea:focus,.field select:focus{outline:2px solid var(--sky-edge);outline-offset:0;border-color:var(--ink)}
.field .hint{font-size:13px;color:var(--ink-faint)}
/* chips as radios: <fieldset class="choice"><legend>…</legend><label class="choice-chip"><input type="radio">…</label></fieldset> */
.choice{border:0;margin:0;padding:0;min-width:0;display:flex;flex-wrap:wrap;gap:8px}
.choice legend{flex:0 0 100%;padding:0;margin-bottom:8px;font-size:14.5px;color:var(--ink-muted)}
.choice-chip{position:relative;display:inline-block;cursor:pointer}
.choice-chip input{position:absolute;opacity:0;inset:0;width:100%;height:100%;margin:0;cursor:pointer}
.choice-chip span{display:inline-flex;align-items:center;min-height:40px;padding:0 14px;border:1px solid var(--hairline);background:var(--paper);font-family:var(--mono);font-weight:500;font-size:12px;letter-spacing:.08em;text-transform:uppercase;white-space:nowrap}
.choice-chip:hover span{border-color:var(--ink)}
.choice-chip input:checked + span{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.choice-chip input:focus-visible + span{outline:2px solid var(--sky-edge);outline-offset:3px}
.hp{position:absolute;left:-9999px;width:1px;height:1px;opacity:0;overflow:hidden}   /* honeypot: bots fill it, people never see it */
.form-status{font-size:15px}
.form-status:empty{margin-top:-16px}
.form-status.is-ok{border:1px solid var(--sky-edge);background:var(--panel-sky);padding:12px 14px}
.form-status.is-err{border:1px solid var(--flag);background:var(--flag-tint);padding:12px 14px}
.form-status.is-busy{color:var(--ink-faint)}
.form-status a{color:inherit}
.band--ink .field{color:var(--night-muted)}
.band--ink .field input,.band--ink .field textarea,.band--ink .field select{background:#151515;color:var(--paper);border-color:var(--night-dash)}
.band--ink .choice-chip span{background:transparent;color:var(--paper);border-color:var(--night-dash)}
.band--ink .choice-chip input:checked + span{background:var(--paper);color:var(--ink);border-color:var(--paper)}

/* 16 · tables ------------------------------------------------------------------------------------------------------------ */
.table-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
.tbl{width:100%;border-collapse:collapse;font-size:15px;text-align:left}
.tbl th,.tbl td{text-align:left;vertical-align:top;padding:12px 16px 12px 0;border-bottom:1px dashed var(--dash)}
.tbl thead th{font-family:var(--mono);font-weight:500;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint);border-bottom:1px solid var(--ink);white-space:nowrap}
.tbl tbody th{font-weight:700}
.tbl--mono td,.tbl--mono tbody th{font-family:var(--mono);font-weight:500;font-size:12.5px;letter-spacing:.02em}
.tbl tr.is-flag td,.tbl tr.is-flag th{color:var(--flag-ink)}
.band--ink .tbl th,.band--ink .tbl td{border-bottom-color:var(--night-dash)}
.band--ink .tbl thead th{color:var(--night-muted);border-bottom-color:var(--paper)}
.band--ink .tbl tr.is-flag td{color:#F0A777}
/* stacked table (phones): each row becomes a small block, so no decisive column is cut off. Needs data-k="Column name" on each td. */
@media (max-width:700px){
  .tbl--stack{min-width:0!important}
  .tbl--stack thead{display:none}
  .tbl--stack tbody,.tbl--stack tr{display:block}
  .tbl--stack tr{display:grid;gap:4px;padding:14px 0;border-bottom:1px dashed var(--dash)}
  .tbl--stack th,.tbl--stack td{display:block;padding:0;border:0;white-space:normal}
  .tbl--stack th[scope=row]{font-weight:700}
  .tbl--stack td[data-k]::before{content:attr(data-k) ": ";font-family:var(--mono);font-size:11px;font-weight:500;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint)}
  .band--ink .tbl--stack tr{border-bottom-color:var(--night-dash)}
  .band--ink .tbl--stack td[data-k]::before{color:var(--night-muted)}
}
/* horizontally scrolling tables: site.js adds .is-scrollable (and a "Scroll" hint) only when the table really overflows and is not yet at its end, so a cut-off column is not mistaken for the end */
.table-scroll.is-scrollable:not(.at-end){-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 40px),transparent);mask-image:linear-gradient(90deg,#000 calc(100% - 40px),transparent)}
.table-scroll-hint{margin:8px 0 0}

/* 17 · panels, framed shots, callouts ---------------------------------------------------------------------------------------- */
.panel{background:var(--panel-sky);border:1px solid var(--sky-edge);padding:clamp(20px,3vw,36px)}
.shot{margin:0;border:1px solid var(--ink);background:var(--paper)}
.shot img{width:100%;height:auto}
.shot figcaption{padding:10px 12px;border-top:1px solid var(--ink)}
.callout{border:1px solid var(--hairline);border-left:3px solid var(--sky-edge);background:var(--panel);padding:14px 16px;font-size:15px;color:var(--ink-muted);max-width:62ch}
.callout--flag{border-left-color:var(--flag);background:var(--flag-tint)}

/* 18 · footer ------------------------------------------------------------------------------------------------------------------ */
.footer{background:var(--night);color:var(--paper)}
.foot{max-width:var(--col);margin:0 auto;padding:clamp(36px,5vw,56px) var(--pad) 28px;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:32px 24px}
.foot-brand{grid-column:1 / -1}
.foot-brand p{color:var(--night-muted);font-size:14.5px;max-width:34ch;margin-top:12px}
.foot-h{margin:0 0 12px;font-family:var(--mono);font-weight:500;font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--night-muted)}
.foot ul{list-style:none;display:grid;gap:8px;font-size:14.5px}
.foot a{text-decoration:none;color:var(--paper)}
.foot a:hover{text-decoration:underline;text-decoration-color:var(--sky);text-underline-offset:4px}
.foot .email{text-decoration:underline;text-underline-offset:3px;font-size:13px}
.foot-bot{max-width:var(--col);margin:0 auto;padding:16px var(--pad) 28px;border-top:1px solid var(--night-dash);display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;font-size:13px;color:var(--night-muted)}
/* three columns after the brand (Product, Solutions, and a group with no heading: Contact, Careers, Peak Residency): 2 up on phones (the bare group spans both), 3 up on tablets with the brand on its own row, all four across from 1000px */
.foot-bare{grid-column:1 / -1}
.foot-bare ul{display:flex;flex-wrap:wrap;gap:8px 22px}
/* NVIDIA Inception badge (docs/nvidia-inception.md): the official artwork, unchanged, 56px high (founder 2026-10-12: bigger); clear space on every side */
.foot-nv{display:block;width:auto;height:56px;margin-top:20px}
.foot-legal{flex:0 1 78ch;margin:0;max-width:78ch;font-size:12px;line-height:1.55;color:var(--night-muted)}
@media (min-width:700px){.foot{grid-template-columns:repeat(3,minmax(0,1fr))}.foot-bare{grid-column:auto;margin-top:24px}.foot-bare ul{display:grid}}
@media (min-width:1000px){.foot{grid-template-columns:minmax(0,1.6fr) repeat(3,minmax(0,1fr));gap:32px 28px}.foot-brand{grid-column:auto}}

/* 19 · motion ------------------------------------------------------------------------------------------------------------------- */
.nt,.nt *,.nt *::before{transition:none!important}
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation:none!important;transition:none!important}
  html.js [data-reveal].will-draw .ov{clip-path:none}
}

/* 20 · v2 components ------------------------------------------------------------------------------------------------ */

/* 20a · team experience strip ({{> team-logos}}). Static and wrapped by default; site.js turns it into a marquee (not under reduced motion) */
.team > .in{position:relative;padding-block:clamp(26px,3.4vw,42px)}
.team-in{display:grid;gap:18px;justify-items:center;text-align:center}
.team-h{margin:0;max-width:60ch;color:var(--ink-muted)}
.marquee{width:100%;overflow:hidden}
.track{display:flex;width:max-content;max-width:100%;margin-inline:auto}
.marks{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:22px clamp(28px,4vw,52px)}
.marks li{display:flex;align-items:center;flex:none;color:var(--ink);opacity:.62;transition:opacity .2s}
.marks li:hover{opacity:1}
.marks svg{display:block;height:calc(var(--h,26px)*.9);width:auto;max-width:none;fill:currentColor}
.team-line{max-width:56ch;font-size:15.5px;color:var(--ink-muted)}
/* phone, static fallback (no JS, or reduced motion): all eight marks sit in a centred, wrapped grid (3 / 3 / 2 at 390px: a 4 x 2 grid would shrink the marks below legibility) */
@media (max-width:699px){
  .marks{gap:18px 28px;justify-content:center}
  .marks svg{height:calc(var(--h,26px)*.72)}
}
/* tablet, static fallback: cap the row width so the eight marks wrap 5 + 3 instead of leaving one mark alone */
@media (min-width:700px) and (max-width:1199px){.marks{max-width:780px;margin-inline:auto}}
.marquee.on{-webkit-mask-image:linear-gradient(90deg,transparent,#000 48px,#000 calc(100% - 48px),transparent);mask-image:linear-gradient(90deg,transparent,#000 48px,#000 calc(100% - 48px),transparent)}
.marquee.on .track{max-width:none;margin-inline:0;animation:marquee var(--dur,40s) linear infinite}
.marquee.on .marks{flex-wrap:nowrap;justify-content:flex-start;gap:clamp(48px,6vw,84px);padding-right:clamp(48px,6vw,84px);max-width:none;margin-inline:0}
.marquee.on .marks li{flex:none}
.marquee.on:hover .track,.marquee.is-paused .track,.team:focus-within .marquee.on .track{animation-play-state:paused}
@keyframes marquee{to{transform:translateX(var(--shift,-50%))}}
.band--ink.team .marks li{color:var(--paper);opacity:.72}
.band--ink.team .marks li:hover{opacity:1}
.band--ink.team .team-h,.band--ink.team .team-line{color:var(--night-muted)}

/* 20a-hero · {{> team-logos hero}}: directly under the hero. Large marks, the same weight as a customer row, with the fixed honest line above ("Built by operators from").
   It slides like every other strip (founder, 2026-10-12: same motion as the Peak Residency logo band); the static layout below (8 across from 1120px, 4 + 4 on tablets,
   3 / 3 / 2 centred on phones) is the fallback without JS and under prefers-reduced-motion, and the .on rules at the end of this block turn it into the slide. */
.team--hero > .in{padding-block:clamp(34px,4.4vw,64px)}
.team--hero .team-in{gap:clamp(22px,2.6vw,38px)}
.team--hero .team-h{color:var(--ink);font-size:12px;letter-spacing:.1em}
.team--hero .marquee{overflow:visible}
.team--hero .track{width:100%;max-width:none;margin:0}
.team--hero .marks{width:100%;max-width:none;display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:clamp(22px,3vw,34px) 0}
.team--hero .marks li{flex:0 0 33.333%;justify-content:center;opacity:.86}
.team--hero .marks li:hover{opacity:1}
.team--hero .marks svg{height:calc(var(--h,26px)*.86);max-width:86%}
@media (min-width:700px){
  .team--hero .marks li{flex-basis:25%}
  .team--hero .marks svg{height:calc(var(--h,26px)*1.05)}
}
@media (min-width:1120px){
  .team--hero .marks{flex-wrap:nowrap;justify-content:space-between}
  .team--hero .marks li{flex:none}
  .team--hero .marks svg{height:calc(var(--h,26px)*.9);max-width:none}
}
@media (min-width:1300px){.team--hero .marks svg{height:calc(var(--h,26px)*1.05)}}
@media (min-width:1500px){.team--hero .marks svg{height:calc(var(--h,26px)*1.2)}}
@media (min-width:1700px){.team--hero .marks svg{height:calc(var(--h,26px)*1.3)}}
.band--ink.team--hero .team-h{color:var(--paper)}
.team--hero .marquee.on{overflow:hidden}
.team--hero .marquee.on .track{width:max-content;max-width:none}
.team--hero .marquee.on .marks{width:auto;flex-wrap:nowrap;justify-content:flex-start;gap:clamp(48px,6vw,84px);padding-right:clamp(48px,6vw,84px)}
.team--hero .marquee.on .marks li{flex:none;justify-content:flex-start}
.team--hero .marquee.on .marks svg{max-width:none}

/* 20a-nv · NVIDIA Inception (the home page has its own lockup inside the hero, .hero-nv below). The badge is NVIDIA's artwork, unchanged: only its size is set here
   (500 x 216, 44px high on a phone, 48px from 700px = 111px wide, never larger than the Albini Labs logo lockup), with clear space around it. It never sits inside the team strip. */
.nv > .in{padding-block:clamp(26px,3.4vw,40px)}
.nv-in{display:grid;gap:14px;justify-items:center;text-align:center}
.nv-badge{display:block;width:auto;height:44px;margin:6px}
@media (min-width:700px){.nv-badge{height:48px}}
.nv--sentence .nv-in{grid-auto-flow:column;justify-content:center;align-items:center;gap:clamp(16px,2.4vw,28px);text-align:left}
/* hero lockup (founder decision 2026-10-13): its own line directly under the Join the waitlist button, aligned with the hero text; badge 48px phone / 56px desktop (the NV_MAX_PX cap) */
.hero-nv{display:flex;align-items:center;gap:16px;margin-top:4px}
.hero-nv-l{font-family:var(--mono);font-weight:500;font-size:14px;letter-spacing:.14em;text-transform:uppercase;color:#fff;text-shadow:0 1px 12px rgba(0,0,0,.7),0 0 2px rgba(0,0,0,.4)}
@media (min-width:700px){.hero-nv-l{font-size:15px}}
.hero-nv .nv-badge{height:48px;margin:0}   /* the badge carries its own white tile, so it reads over the film */
@media (min-width:700px){.hero-nv .nv-badge{height:56px}}
/* trust band under the hero ({{> team-logos hero nvidia}}): NVIDIA block | divider | team block. Phones: stacked, NVIDIA first. */
.team--nv .team-in{grid-template-columns:1fr;align-items:center}
.team--nv .team-main{display:grid;gap:inherit;justify-items:center;width:100%;min-width:0}
.team-nv{display:flex;flex-direction:column;align-items:center;gap:12px;text-align:center;padding-bottom:clamp(18px,3vw,26px);border-bottom:1px solid var(--edge,rgba(11,11,11,.18))}
.team-nv .nv-badge{height:48px;margin:0}
.team-nv-t{margin:0;font-family:var(--mono);font-weight:500;font-size:13px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink);max-width:22ch}
@media (min-width:900px){
  .team--nv .team-in{grid-template-columns:auto minmax(0,1fr);column-gap:clamp(28px,3.6vw,56px);text-align:left}
  .team-nv{flex-direction:row;text-align:left;gap:18px;padding:0 clamp(28px,3.6vw,56px) 0 0;border-bottom:0;border-right:1px solid var(--edge,rgba(11,11,11,.18));align-self:stretch}
  .team-nv .nv-badge{height:56px}
}
.nv-line{margin:0;font-size:clamp(16px,1.6vw,19px);line-height:1.4;color:var(--ink)}
@media (max-width:699px){.nv--sentence .nv-in{grid-auto-flow:row;justify-items:center;text-align:center}}

/* 20b · event stream overlay: mono lines "HH:MM:SS · EVENT · PLACE" on an Illustration frame (.media--ill), each with a status dot (ok / flag).
   Chips are 70% ink with a blurred backdrop, four lines at most, and appear 2 s apart. Visible by default (no JS, print, snapshots, reduced motion).
   A stream in a hero plays from page load (CSS); one below the fold waits until it scrolls in (site.js adds .will-play, then .is-in).
   Always add <span class="lbl lbl--sky tr">Illustration</span>. A stream sits on a still, never on a video. */
.evstream{position:absolute;z-index:4;left:16px;bottom:16px;max-width:calc(100% - 32px);list-style:none;margin:0;padding:0;display:grid;gap:4px;justify-items:start}
.evstream--right{left:auto;right:16px;justify-items:end}
.evstream--top{bottom:auto;top:52px}
.ev{display:inline-flex;align-items:center;gap:9px;max-width:100%;padding:4px 9px 4px 8px;background:rgba(11,11,11,.7);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);color:var(--paper);border-left:2px solid #7FD3A0;font-family:var(--mono);font-weight:500;font-size:11px;line-height:1.4;letter-spacing:.06em;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ev::before{content:"";flex:none;width:7px;height:7px;background:#7FD3A0}
.ev--flag{border-left-color:var(--flag)}
.ev--flag::before{background:var(--flag)}
.ev:nth-child(2){--i:1}.ev:nth-child(3){--i:2}.ev:nth-child(4){--i:3}
@keyframes ev-in{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
html.js .hero .evstream .ev{animation:ev-in .5s calc(.8s + var(--i,0)*2s) ease-out both}
html.js .evstream.will-play .ev{opacity:0}
html.js .evstream.will-play.is-in .ev{animation:ev-in .5s calc(.3s + var(--i,0)*2s) ease-out both}
@media (max-width:699px){
  .evstream{left:8px;bottom:8px;max-width:calc(100% - 16px)}
  .evstream--right{left:auto;right:8px}
  .evstream--top{bottom:auto;top:44px}
  .ev{font-size:10px;gap:7px;padding:3px 7px 3px 6px;letter-spacing:.04em}
}

/* event-type grid: hairline cells, mono event code, plain-language name, one line. <div class="evgrid"> of <div class="evc">; .evgrid--3 for three columns */
.evgrid{--n:4;display:grid;grid-template-columns:repeat(var(--n),minmax(0,1fr));overflow:hidden}
.evgrid--3{--n:3}
.evgrid > *{margin:-1px 0 0 -1px;border-top:1px dashed var(--dash);border-left:1px dashed var(--dash)}
@media (max-width:1000px){.evgrid,.evgrid--3{--n:2}}
@media (max-width:600px){.evgrid,.evgrid--3{--n:1}}
.evc{padding:clamp(20px,2.4vw,32px) clamp(18px,2.2vw,28px);display:grid;gap:8px;align-content:start}
.evc-code{display:flex;align-items:center;gap:9px;font-family:var(--mono);font-weight:500;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint);overflow-wrap:anywhere}
.evc-code::before{content:"";flex:none;width:7px;height:7px;background:var(--sky);border:1px solid var(--ink)}
.evc--flag .evc-code::before{background:var(--flag);border-color:var(--flag)}
.evc-name{font-size:19px;line-height:1.25;font-weight:700;letter-spacing:-.012em}
.evc-line{color:var(--ink-muted);font-size:15.5px;line-height:1.45}
.band--ink .evgrid > *{border-color:var(--night-dash)}
.band--ink .evc-code,.band--ink .evc-line{color:var(--night-muted)}
.band--ink .evc-code::before{border-color:var(--paper)}

/* 20c · sector montage: 8 video cells, 4x2 desktop, 2x4 tablet and phone. Videos play only in view (site.js); the poster otherwise.
   <div class="sectors"><figure class="sector"><div class="media">…</div><figcaption class="sector-body"><span class="sector-k">Factory</span><p class="sector-line">…</p></figcaption></figure>… */
.sectors{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));overflow:hidden}
.sectors > *{margin:-1px 0 0 -1px;border-top:1px dashed var(--dash);border-left:1px dashed var(--dash)}
@media (max-width:1099px){.sectors{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:699px){
  .sectors{grid-template-columns:repeat(2,minmax(0,1fr))}
  .sector-body{padding:12px 12px 18px}
  .sector-line{font-size:14px}
  .sector-k{font-size:11px}
}
.sector{display:grid;align-content:start;grid-template-rows:auto 1fr}
.sector > .media{--ar:4/3}
.sector-body{display:grid;gap:8px;align-content:start;padding:16px clamp(16px,1.8vw,22px) 24px}
.sector-k{display:flex;align-items:center;gap:9px;font-family:var(--mono);font-weight:500;font-size:12px;letter-spacing:.08em;text-transform:uppercase}
.sector-k::before{content:"";flex:none;width:8px;height:8px;background:var(--sky);border:1px solid var(--ink)}
.sector-line{color:var(--ink-muted);font-size:15.5px;line-height:1.4;max-width:34ch}
.band--ink .sectors > *{border-color:var(--night-dash)}
.band--ink .sector-line{color:var(--night-muted)}
.band--ink .sector-k::before{border-color:var(--paper)}

/* 20d · solutions cards: two big footage cards, side by side (stacked on phones). <a class="solcard"> holds a .media and a .solcard-body */
.solcards{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--gap)}
@media (max-width:699px){.solcards{grid-template-columns:minmax(0,1fr)}}
.solcard{position:relative;isolation:isolate;display:flex;align-items:flex-end;min-height:clamp(380px,40vw,560px);overflow:hidden;background:var(--night);color:var(--paper);text-decoration:none}
.solcard > .media{position:absolute;inset:0;z-index:-1;aspect-ratio:auto}
.solcard > .media::before{background:
    linear-gradient(to top,rgba(11,11,11,.6),rgba(11,11,11,0) 55%),
    linear-gradient(rgba(11,11,11,.25),rgba(11,11,11,.25)),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='128' height='128'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.4' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 .5 0 0 0 0 .5 0 0 0 0 .5 0 0 0 .06 0'/%3E%3C/filter%3E%3Crect width='128' height='128' filter='url(%23n)'/%3E%3C/svg%3E");
  background-size:auto,auto,128px 128px}
.solcard--text > .media::before{background:
    linear-gradient(to top,rgba(11,11,11,.72),rgba(11,11,11,.1) 92%),
    linear-gradient(rgba(11,11,11,.25),rgba(11,11,11,.25)),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='128' height='128'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.4' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 .5 0 0 0 0 .5 0 0 0 0 .5 0 0 0 .06 0'/%3E%3C/filter%3E%3Crect width='128' height='128' filter='url(%23n)'/%3E%3C/svg%3E");
  background-size:auto,auto,128px 128px}   /* the long belief line needs the whole card under it */
.solcard-body{position:relative;display:grid;gap:10px;justify-items:start;width:100%;padding:clamp(20px,2.6vw,36px)}
.solcard-title{display:block;font-size:clamp(30px,3.4vw,46px);line-height:1.04;font-weight:800;letter-spacing:-.035em}
.solcard-line{display:block;max-width:38ch;color:rgba(255,255,255,.92);font-size:17px;line-height:1.4}
.solcard-go{display:inline-block;margin-top:6px;padding-bottom:2px;border-bottom:1px solid var(--night-muted);font-family:var(--mono);font-weight:500;font-size:12px;letter-spacing:.08em;text-transform:uppercase;transition:border-color .2s,transform .2s}
.solcard:hover .solcard-go,.solcard:focus-visible .solcard-go{border-color:var(--sky);transform:translateX(4px)}
.solcard:hover .solcard-title,.solcard:focus-visible .solcard-title{text-decoration:underline;text-decoration-thickness:2px;text-decoration-color:var(--sky);text-underline-offset:6px}
.solcard:focus-visible{outline:2px solid var(--sky);outline-offset:-4px}

/* 20e · mock metrics: a clearly labelled example list in mono, for a sector with no demo (manufacturing). Never real figures.
   <div class="mockmetrics"><p class="mockmetrics-tag">Mock metrics · example only</p><dl class="mm-list"><div class="mm"><dt>…</dt><dd data-s="flag">…</dd></div></dl></div> */
.mockmetrics{max-width:560px;border:1px dashed var(--edge);background:var(--panel)}
.mockmetrics-tag{display:flex;align-items:center;gap:10px;padding:9px 14px;border-bottom:1px dashed var(--edge);background:var(--flag-tint);color:var(--flag-ink);font-family:var(--mono);font-weight:500;font-size:11px;letter-spacing:.08em;text-transform:uppercase}
.mockmetrics-tag::before{content:"";flex:none;width:8px;height:8px;border:1.5px solid var(--flag)}
.mm-list{margin:0}
.mm{display:flex;justify-content:space-between;align-items:baseline;gap:16px;padding:11px 14px;border-bottom:1px dashed var(--dash);font-family:var(--mono);font-weight:500;font-size:12.5px;letter-spacing:.03em;text-transform:uppercase}
.mm:last-child{border-bottom:0}
.mm dt{color:var(--ink-muted);min-width:0}
.mm dd{display:inline-flex;align-items:center;gap:8px;margin:0;flex:none;color:var(--ink);text-align:right}
.mm dd::before{content:"";flex:none;width:7px;height:7px;background:var(--ok)}
.mm dd[data-s=flag]{color:var(--flag-ink)}
.mm dd[data-s=flag]::before{background:var(--flag)}
.mm dd[data-s=none]::before{display:none}
.band--ink .mockmetrics{background:#111;border-color:var(--night-muted)}
.band--ink .mockmetrics-tag{background:#2a1a0e;color:#F0A777;border-bottom-color:var(--night-muted)}
.band--ink .mm{border-bottom-color:var(--night-dash)}
.band--ink .mm dt{color:var(--night-muted)}
.band--ink .mm dd{color:var(--paper)}
.band--ink .mm dd[data-s=flag]{color:#F0A777}
@media (max-width:480px){.mm{flex-direction:column;gap:4px}.mm dd{text-align:left}}

/* 20f · shared "act" components for the two Solutions pages (promoted from the warehousing page; the old .wh-* names still work).
   Moments: <div class="moments"><div class="moment"><div class="moment-k"><span class="chip">Example 1</span><span class="mono">10:40 · line.stopped</span></div><h3 class="h3">…</h3><p class="body">… <b>action</b></p></div>…</div>
   Needs (on an ink band): <div class="needs"><div class="need"><span class="step">01</span><div><h3 class="h3">…</h3><p class="body">…</p></div></div>…</div> */
.moments,.wh-moments{display:grid;align-content:start;border-top:1px solid var(--ink)}
.moment,.wh-moment{display:grid;gap:10px;padding:clamp(18px,2.4vw,28px) 0;border-bottom:1px dashed var(--dash)}
.moment:last-child,.wh-moment:last-child{border-bottom:0}
.moment-k,.wh-moment-k{display:flex;flex-wrap:wrap;align-items:center;gap:12px}
.moment-k .mono,.wh-moment-k .mono{color:var(--ink-faint)}
.moment .h3,.wh-moment .h3{margin:0;max-width:30ch;font-size:clamp(20px,2vw,24px);line-height:1.2}
.moment .body,.wh-moment .body{margin:0;max-width:52ch}
.moment .body b,.wh-moment .body b{color:var(--ink);font-weight:700}
.needs,.wh-needs{display:grid;border-top:1px solid var(--paper)}
.need,.wh-need{display:grid;grid-template-columns:44px minmax(0,1fr);gap:12px;padding:clamp(14px,1.8vw,20px) 0;border-bottom:1px dashed var(--night-dash)}
.need:last-child,.wh-need:last-child{border-bottom:0}
.need .h3,.wh-need .h3{margin:0 0 6px}
.need .body,.wh-need .body{margin:0;max-width:50ch;color:var(--night-muted)}

/* 20g · the Illustration tag is never hidden. A page may move it on phones; it may not remove it (hard rule: overlays are tagged Illustration).
   The !important beats any page rule that still says display:none. */
.lbl--sky{display:block!important}

/* 21 · motion for the v2 components: reduced motion shows everything, static */
@media (prefers-reduced-motion:reduce){
  html.js .evstream.will-play .ev{opacity:1;transform:none}
  .marquee.on{-webkit-mask-image:none;mask-image:none}
}

/* 22 · v3 structure components (docs/strategy-v3-ia.md; snippets in docs/components.md §23–§28) -------------------------------- */

/* 22a · category tag: mono, one of Product · Free tool · Program · Solutions · Technology · Research. Used by featured and latest cards. */
.ctag{display:inline-flex;align-items:center;gap:9px;font-family:var(--mono);font-weight:500;font-size:11px;line-height:1.4;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint)}
.ctag::before{content:"";flex:none;width:7px;height:7px;background:var(--sky);border:1px solid var(--ink)}
.band--ink .ctag,.hero .ctag{color:var(--night-muted)}
.band--ink .ctag::before,.hero .ctag::before{border-color:var(--paper)}

/* 22b · section bar: a section header with an outline .btn at the right (OpenAI's pattern). The button drops under the heading on phones.
   <div class="sec-bar"><div class="sec-bar-main"><span class="eyebrow">…</span><h2>…</h2></div><a class="btn btn--ghost" href="…">See all</a></div> */
.sec-bar{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:14px 28px}
.sec-bar-main{display:grid;gap:12px;justify-items:start;min-width:0}
.sec-bar h2{max-width:24ch}

/* 22c · featured card row: large media cards, text under the media. 4 across from 1100px, 2 across on tablets, 1 on phones.
   <ul class="featured"><li><a class="fcard" href="…"><span class="media">…</span><span class="fcard-body"><span class="ctag">Product</span><span class="fcard-title">…</span><span class="fcard-line">…</span></span></a></li>… */
.featured{list-style:none;display:grid;grid-template-columns:minmax(0,1fr);gap:clamp(28px,3.4vw,40px) var(--gap)}
@media (min-width:700px){.featured{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (min-width:1100px){.featured{grid-template-columns:repeat(4,minmax(0,1fr))}}
.featured > li{display:grid}
.fcard{display:grid;grid-template-rows:auto 1fr;gap:16px;color:inherit;text-decoration:none}
.fcard > .media{--ar:16/10}
@media (min-width:700px){.fcard > .media{--ar:4/5}}
.fcard-body{display:grid;gap:9px;align-content:start;justify-items:start}
.fcard-title{display:block;font-size:clamp(21px,1.9vw,25px);line-height:1.12;font-weight:800;letter-spacing:-.03em;text-wrap:balance}
.fcard-line{display:block;color:var(--ink-muted);font-size:15.5px;line-height:1.4;max-width:36ch}
.fcard:hover .fcard-title,.fcard:focus-visible .fcard-title{text-decoration:underline;text-decoration-thickness:2px;text-decoration-color:var(--sky-edge);text-underline-offset:5px}
.fcard:focus-visible{outline-offset:6px}
.band--ink .fcard-line{color:var(--night-muted)}
.band--ink .fcard:hover .fcard-title,.band--ink .fcard:focus-visible .fcard-title{text-decoration-color:var(--sky)}

/* 22d · latest grid ("Latest from the lab"): compact tagged cards in a hairline grid, no dates unless one is true. 4 across from 1100px, 2 on tablets, 1 on phones.
   <ul class="latest"><li><a class="lcard" href="…"><span class="ctag">Free tool</span><span class="lcard-title">…</span></a></li>…
   An outside link adds class lcard--ext (↗ instead of →). A true date: <time class="lcard-date" datetime="2026-08-04">2026-08-04</time> after the title. An image: <span class="media lcard-media">…</span> first. */
.latest{list-style:none;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));overflow:hidden}
.latest > li{margin:-1px 0 0 -1px;border-top:1px dashed var(--dash);border-left:1px dashed var(--dash);display:grid}
@media (max-width:1099px){.latest{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:699px){.latest{grid-template-columns:minmax(0,1fr)}}
.lcard{display:flex;flex-direction:column;align-items:flex-start;gap:12px;padding:clamp(18px,2vw,26px);min-height:150px;color:inherit;text-decoration:none}
@media (max-width:699px){.lcard{min-height:0}}
.lcard-media{align-self:stretch;--ar:16/10;margin-bottom:4px}
.lcard-title{display:block;font-size:19px;line-height:1.25;font-weight:700;letter-spacing:-.015em;text-wrap:balance}
.lcard-date{font-family:var(--mono);font-weight:500;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint)}
.lcard::after{content:"→";margin-top:auto;padding-top:6px;font-family:var(--mono);font-size:16px;line-height:1;color:var(--ink-faint);transition:transform .2s,color .2s}
.lcard--ext::after{content:"↗"}
.lcard:hover::after,.lcard:focus-visible::after{transform:translateX(4px);color:var(--ink)}
.lcard:hover .lcard-title,.lcard:focus-visible .lcard-title{text-decoration:underline;text-decoration-thickness:2px;text-decoration-color:var(--sky-edge);text-underline-offset:5px}
.lcard:focus-visible{outline-offset:-4px}
.band--ink .latest > li{border-color:var(--night-dash)}
.band--ink .lcard-date,.band--ink .lcard::after{color:var(--night-muted)}
.band--ink .lcard:hover::after,.band--ink .lcard:focus-visible::after{color:var(--paper)}

/* 22e · industry cards for /solutions and the home Solutions row: .solcards in a bento. The first card (.solcard--lg) is large (2 of 3 columns, both rows)
   from 1000px; the other two stack beside it. Full width and stacked on phones. A card without a page is a <div class="solcard"> (no link, no .solcard-go);
   .solcard--text lets its line run longer (the "Other industries" belief).
   <div class="solcards solcards--ind"><a class="solcard solcard--lg" href="/solutions/warehousing">…</a><a class="solcard" …>…</a><div class="solcard solcard--text" id="other">…</div></div> */
.solcards--ind{grid-template-columns:minmax(0,1fr)}
.solcards--ind .solcard{min-height:clamp(300px,34vw,380px)}
.solcards--ind .solcard--lg{min-height:clamp(380px,60vw,460px)}
@media (min-width:1000px){
  .solcards--ind{grid-template-columns:repeat(3,minmax(0,1fr))}
  .solcards--ind .solcard{min-height:300px}
  .solcards--ind .solcard--lg{grid-column:span 2;grid-row:span 2;min-height:640px}
}
.solcard--text .solcard-line{max-width:46ch;font-size:16px}
div.solcard{cursor:default}

/* 22f · use-case cards: a hairline grid of linked cards (mono industry kicker, title, one line, mono link). Each goes to an anchor on an industry page.
   3 across by default; .ucards--4 / .ucards--5 from 1100px. 2 across on tablets, 1 on phones.
   <ul class="ucards ucards--5"><li><a class="ucard" href="/solutions/warehousing#events"><span class="ucard-k">Warehousing</span><h3 class="ucard-title">Dock and yard</h3><p class="ucard-line">…</p><span class="ucard-go">Warehousing →</span></a></li>… */
.ucards{--n:3;list-style:none;display:grid;grid-template-columns:repeat(var(--n),minmax(0,1fr));overflow:hidden}
.ucards--4{--n:4}.ucards--5{--n:5}
.ucards > li{margin:-1px 0 0 -1px;border-top:1px dashed var(--dash);border-left:1px dashed var(--dash);display:grid}
@media (max-width:1099px){.ucards,.ucards--4,.ucards--5{--n:2}}
@media (max-width:699px){.ucards,.ucards--4,.ucards--5{--n:1}}
.ucard{display:grid;grid-template-rows:auto auto 1fr auto;align-content:start;gap:10px;padding:clamp(20px,2.4vw,30px) clamp(18px,2vw,26px);color:inherit;text-decoration:none}
.ucard-k{display:flex;align-items:center;gap:9px;font-family:var(--mono);font-weight:500;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint)}
.ucard-k::before{content:"";flex:none;width:7px;height:7px;background:var(--sky);border:1px solid var(--ink)}
.ucard-title{font-size:21px;line-height:1.2;font-weight:800;letter-spacing:-.025em}
.ucard-line{color:var(--ink-muted);font-size:15.5px;line-height:1.45;max-width:34ch}
.ucard-go{justify-self:start;margin-top:8px;padding-bottom:2px;border-bottom:1px solid var(--hairline);font-family:var(--mono);font-weight:500;font-size:12px;letter-spacing:.08em;text-transform:uppercase;transition:border-color .2s,transform .2s}
.ucard:hover .ucard-go,.ucard:focus-visible .ucard-go{border-color:var(--sky-edge);transform:translateX(4px)}
.ucard:hover .ucard-title,.ucard:focus-visible .ucard-title{text-decoration:underline;text-decoration-thickness:2px;text-decoration-color:var(--sky-edge);text-underline-offset:5px}
.ucard:focus-visible{outline-offset:-4px}
.band--ink .ucards > li{border-color:var(--night-dash)}
.band--ink .ucard-k,.band--ink .ucard-line{color:var(--night-muted)}
.band--ink .ucard-k::before{border-color:var(--paper)}
.band--ink .ucard-go{border-color:var(--night-dash)}
.band--ink .ucard:hover .ucard-go,.band--ink .ucard:focus-visible .ucard-go{border-color:var(--sky)}

/* 22g · closing CTA band (OpenAI's "Get started"): a big line, the waitlist and demo buttons, one small line under them. Put it last, before the footer.
   <section class="band band--ink cta-band" aria-labelledby="cta-h"><div class="in cta-in"><h2 id="cta-h">…</h2><div class="cta-row">…</div><p class="cta-small">…</p></div></section> */
.cta-band > .cta-in{display:grid;gap:clamp(18px,2.2vw,28px);justify-items:start;padding-block:clamp(56px,7vw,104px)}
.cta-band h2{font-size:clamp(32px,4.6vw,58px);line-height:1.02;font-weight:800;letter-spacing:-.04em;max-width:22ch}
.cta-small{max-width:56ch;font-size:15px;line-height:1.5;color:var(--ink-faint)}
.band--ink .cta-small{color:var(--night-muted)}
.cta-small a{color:inherit;text-decoration:underline;text-underline-offset:3px}
.band--ink .cta-small a{color:var(--paper)}
.cta-small a:hover{text-decoration-color:var(--sky-edge)}
/* standalone calls to action are always .btn: primary (ink, or --paper on dark) for the main action, --ghost (--ghost-dark on ink) for the others. Phones: full width where they stack. */
.link-row .btn,.cta-row .btn{flex:none}
.nf-links .body{margin:0 0 10px}
.nf-links .btn{white-space:normal;text-align:center}
@media (max-width:559px){
  .sol-links .btn,.cta-band .cta-row .btn,.nf-links .btn,.sec-bar > .btn{width:100%}
  .cta-band .cta-row{width:100%}
}

/* 22h · motion for the v3 components: the arrow and underline nudges are off under reduced motion */
@media (prefers-reduced-motion:reduce){
  .lcard::after,.ucard-go{transition:none}
}

/* 23 · announcement bar (Peak Residency, founder decision 7). <aside class="announce"> before the header, in partials/nav.html; pages never touch it.
   Visible without JS. site.js unhides .announce-close, stores a dismissal in localStorage (al.announce) and hides the bar from 1 Jan 2027;
   head.html applies the same two tests before first paint as html.no-announce, which also zeroes --bar-h so the full-screen hero stays exactly one screen. */
.announce{position:relative;height:var(--bar-h);display:flex;align-items:center;background:var(--ink);color:var(--paper);border-bottom:1px solid var(--night-dash)}
.announce-link{flex:1;min-width:0;height:100%;display:flex;align-items:center;justify-content:center;gap:6px 14px;padding:0 52px;color:inherit;text-decoration:none;font-size:14.5px;line-height:1.2;white-space:nowrap;overflow:hidden}
.announce-tag{font-family:var(--mono);font-weight:500;font-size:11px;letter-spacing:.08em;text-transform:uppercase;background:var(--sky);color:var(--ink);padding:3px 8px;white-space:nowrap}
.announce-msg{overflow:hidden;text-overflow:ellipsis}
.announce-msg b{font-weight:700}
.announce-msg span{color:#C9CDD0}
.announce-cta{font-family:var(--mono);font-weight:500;font-size:11.5px;letter-spacing:.08em;text-transform:uppercase;border-bottom:1px solid var(--night-muted);padding-bottom:1px}
.announce-link:hover .announce-cta,.announce-link:focus-visible .announce-cta{border-color:var(--sky);color:var(--sky)}
.announce-link:focus-visible{outline-offset:-4px}
.announce-close{position:absolute;right:max(6px,calc(var(--pad) - 14px));top:50%;transform:translateY(-50%);width:32px;height:32px;display:grid;place-items:center;padding:0;border:0;background:none;color:var(--night-muted);font-size:22px;line-height:1;cursor:pointer}
.announce-close:hover,.announce-close:focus-visible{color:var(--paper)}
@media (pointer:coarse){.announce-close{width:40px;height:40px}}
html.no-announce{--bar-h:0px}
html.no-announce .announce{display:none}
@media (max-width:900px){.announce-msg span{display:none}}
@media (max-width:420px){.announce-link{font-size:13px;gap:8px;padding:0 44px 0 12px;justify-content:flex-start}}

/* 24 · problem cards (.problem): three cards in a row, each an industry label, a big number, a seen / unseen bar (or its 100-cell grid variant, 24b) and a one-line caption. No footnotes on the card:
   there is no sources page. The bar has two segments: the small one (what systems see) is muted, the big one (what they do not) is
   the brand flag colour. Set the seen share on the bar: style="--seen:10%". Stacks on phones. */
.problem{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));margin-top:clamp(28px,4vw,52px);border-top:1px solid var(--ink)}
.pcard{display:grid;align-content:start;gap:clamp(14px,1.6vw,22px);padding:clamp(20px,2.4vw,32px) clamp(16px,2.4vw,40px) clamp(8px,1vw,16px) 0}
.pcard + .pcard{padding-left:clamp(16px,2.4vw,40px);border-left:1px dashed var(--dash)}
.pcard-k{font-family:var(--mono);font-weight:500;font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-faint)}
.pcard-n{margin:0}
.pcard-n b{display:block;font-size:clamp(76px,10vw,168px);line-height:.88;font-weight:800;letter-spacing:-.055em;font-variant-numeric:tabular-nums}
.pmeter{display:grid;gap:8px}
.pbar{display:flex;height:14px;background:var(--flag)}
.pbar-seen{display:block;flex:none;width:var(--seen,10%);background:var(--edge)}
.pbar-unseen{display:block;flex:1;background:var(--flag)}
.pbar-lab{display:flex;justify-content:space-between;gap:12px;margin:0;font-family:var(--mono);font-weight:500;font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-faint)}
.pbar-lab span:last-child{color:var(--flag-ink)}
.pcard-c{font-size:clamp(17px,1.35vw,20px);line-height:1.35;color:var(--ink);max-width:26ch}
.band--ink .problem{border-top-color:var(--paper)}
.band--ink .pcard + .pcard{border-left-color:var(--night-dash)}
.band--ink .pcard-k,.band--ink .pbar-lab{color:var(--night-muted)}
.band--ink .pbar-seen{background:#6E6E6E}
.band--ink .pbar-lab span:last-child{color:#E8935A}
.band--ink .pcard-c{color:var(--paper)}
/* 24b · .pbar--grid: the "100 units" version of the seen / unseen bar (docs/problem-visual.md). 100 <i> cells, 20 x 5, the first N are .pbar-seen (solid ink: a record),
   the rest .pbar-unseen (flag: no record). The default 14px .pbar stays for any page that uses it. One reveal: with [data-reveal] on .problem, site.js adds .will-draw below
   the fold (unseen cells start flag-tint) and .is-in in view (they fill row by row, 110 ms a row, 0.45 s each). Static-complete without JS, in print, under reduced motion. */
.pbar--grid{display:grid;grid-template-columns:repeat(20,minmax(0,1fr));gap:2px;height:auto;background:none}
.pbar--grid > i{display:block;flex:none;width:auto;aspect-ratio:1;min-height:0}
.pbar--grid .pbar-seen{background:var(--ink)}
.pbar--grid .pbar-unseen{background:var(--flag)}
.pbar--grid + .pbar-lab{flex-wrap:wrap;row-gap:4px}
.band--ink .pbar--grid .pbar-seen{background:var(--paper)}
.band--ink .pbar--grid .pbar-unseen{background:#C96A2A}
html.js .problem.will-draw .pbar--grid .pbar-unseen{background:var(--flag-tint)}
html.js .problem.is-in .pbar--grid .pbar-unseen{background:var(--flag);transition:background .45s ease calc(var(--row,0) * 110ms)}
html.js .band--ink .problem.will-draw .pbar--grid .pbar-unseen{background:#3A2416}
html.js .band--ink .problem.is-in .pbar--grid .pbar-unseen{background:#C96A2A}
.pbar--grid > i:nth-child(n+21){--row:1}
.pbar--grid > i:nth-child(n+41){--row:2}
.pbar--grid > i:nth-child(n+61){--row:3}
.pbar--grid > i:nth-child(n+81){--row:4}
@media (max-width:899px){
  .problem{grid-template-columns:minmax(0,1fr)}
  .pcard,.pcard + .pcard{padding:24px 0 20px;border-left:0}
  .pcard + .pcard{border-top:1px dashed var(--dash)}
  .band--ink .pcard + .pcard{border-top-color:var(--night-dash)}
  .pcard-n b{font-size:clamp(84px,24vw,128px)}
}

/* 30 · Groundtruth overlay (.gt[data-tracks], built by site.js section 10): boxes and soft people ellipses on a canvas over a video, plus a tag, a count chip,
   one event line and the privacy badge. All elements are created by JS from the tracks JSON; with no JSON nothing of this exists. Never inside .media--ill. */
.gt-layer{position:absolute;inset:0;z-index:5;pointer-events:none;overflow:hidden}
.gt-cv{position:absolute;display:block;pointer-events:none}
.gt-lb{position:absolute;left:0;top:0;display:none;padding:1px 6px;font-family:var(--mono);font-weight:500;font-size:11px;line-height:1.5;letter-spacing:.04em;white-space:nowrap;color:var(--ink);background:rgba(232,243,250,.74);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);will-change:transform}
/* in a hero or photo band the frame sits under its own text: the box labels there are dark glass (like the tag and chip) so white text that crosses a label stays readable */
.hero .gt-lb,.band--photo .gt-lb{color:var(--sky);background:rgba(11,11,11,.62)}
.gt-ui{container-type:inline-size;position:absolute;inset:0;z-index:5;display:flex;flex-direction:column;justify-content:space-between;gap:8px;padding:12px;pointer-events:none}
.gt-ui{transition:opacity .35s ease,visibility 0s}
.gt-ui.gt-off{opacity:0;visibility:hidden;transition:opacity .35s ease,visibility 0s .35s}   /* outside every segment of a multi-cut loop: no tag, no chip, no badge (the founder decision: chrome only where something is drawn) */
@media (prefers-reduced-motion:reduce){.gt-ui,.gt-ui.gt-off{transition:none}}
.gt-ui--lift{z-index:1}   /* the frame sits behind its own text (hero, photo band): the chrome lives in the parent, above the text, click-through except the badge */
.gt-top,.gt-bot{display:flex;justify-content:space-between;align-items:flex-start;gap:8px}
.gt-bot{align-items:flex-end}
.gt-ui--hero .gt-bot{justify-content:flex-end}
.gt-tl{display:flex;flex-direction:column;align-items:flex-start;gap:6px;min-width:0;flex:1 1 auto}
.gt-tag,.gt-chip,.gt-ev{display:inline-block;max-width:100%;padding:3px 8px;font-family:var(--mono);font-weight:500;font-size:11px;line-height:1.45;letter-spacing:.04em;color:var(--paper);background:rgba(11,11,11,.62);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}
.gt-chip[hidden]{display:none}
.gt-tag::before,.gt-ev::before{content:"";display:inline-block;width:6px;height:6px;margin-right:7px;vertical-align:1px;background:var(--sky)}
.gt-chip{color:var(--paper)}
.gt-chip{transition:color .5s ease,background-color .5s ease}
.gt-chip.is-up{color:var(--paper);background:rgba(169,213,236,.28);transition:none}
.gt-ev{max-width:min(60%,420px);text-align:right;opacity:0;transition:opacity .3s ease}
.gt-ev.is-on{opacity:1}
.gt-short{display:none}
/* sized by the frame, not the viewport: a narrow frame (a phone, or a card in a row) gets the short badge, stacked top lines and 10px type */
@container (max-width:599px){
  .gt-top{flex-direction:column;align-items:flex-start}
  .gt-ev{max-width:100%;text-align:left}
  .gt-full{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}   /* the link keeps its full accessible name */
  .gt-short{display:inline}
  .gt-tag,.gt-chip,.gt-ev{font-size:10px;padding:2px 6px}
}
@container (max-width:419px){.gt-ev{display:none}}
@container (min-width:600px){.gt-ev,.gt-tag{white-space:nowrap}}
@container (max-width:599px){.gt-chips{display:none}.gt-lb{font-size:10px;padding:0 4px}}
@container (min-width:1200px){.how-fig .gt-lb,.how-fig .gt-chip,.how-fig .gt-ev,.how-fig .gt-tag{font-size:13px;padding:2px 8px}}
@media (prefers-reduced-motion:reduce){.gt-ev{transition:none}}
.gt-chips{display:flex;flex-direction:column;align-items:flex-start;gap:4px}
.gt-ticker{display:flex;flex-direction:column;align-items:flex-end;gap:4px;max-width:min(60%,420px);flex:0 0 auto}
.gt-ticker .gt-ev{max-width:100%;opacity:0;transform:translateY(-4px);transition:opacity .3s ease,transform .3s ease}
.gt-ticker .gt-ev.is-on{opacity:1;transform:none}
.gt-ticker .gt-ev.is-on + .gt-ev{opacity:.85}   /* older lines sit back */
.gt-ticker .gt-ev.is-on + .gt-ev + .gt-ev{opacity:.7}
@container (max-width:599px){.gt-ticker{max-width:100%;align-items:flex-start}}
@container (max-width:419px){.gt-ticker{display:none}}
@media (prefers-reduced-motion:reduce){.gt-ticker .gt-ev{transition:none}}
/* Groundtruth metrics card (home How it works): a floating glass card over the film in the product's KPI style (white 78% + blur, 14px radius, soft shadow, Inter/system type); big number, label, status pill. Numbers come from the tracks JSON counts. */
.gt-card{--c-ink:#1E2A39;--c-mut:#7A8797;--c-line:#E6EBF1;box-sizing:border-box;width:min(100%,252px);padding:12px 14px 10px;border-radius:14px;background:rgba(255,255,255,.78);-webkit-backdrop-filter:blur(14px) saturate(1.2);backdrop-filter:blur(14px) saturate(1.2);box-shadow:0 1px 2px rgba(16,24,40,.06),0 8px 24px rgba(16,24,40,.14);color:var(--c-ink);font-family:Inter,system-ui,-apple-system,"Segoe UI",sans-serif;font-weight:500;letter-spacing:0;text-align:left}
.gt-card[hidden]{display:none}
.gt-card-hd{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}
.gt-card-t{font-size:13px;font-weight:600;line-height:1.3}
.gt-pill{display:inline-flex;align-items:center;gap:5px;padding:2px 8px;border-radius:999px;font-size:11px;font-weight:600;line-height:1.5;white-space:nowrap}
.gt-pill::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}
.gt-pill--good{background:#E6F6EE;color:#137A4E}
.gt-pill--warn{background:#FEF3E2;color:#9A5B00}
.gt-pill--bad{background:#FDECEC;color:#B4232A}
.gt-card-g{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px}
.gt-kpi{display:flex;flex-direction:column;gap:1px;padding:4px 6px;margin:0 -6px;border-radius:8px;transition:background-color .5s ease}
.gt-kpi-v{font-size:28px;font-weight:600;line-height:1.1;font-variant-numeric:proportional-nums}
.gt-kpi-l{font-size:12px;color:var(--c-mut);line-height:1.3}
.gt-kpi.is-up{background:#EAF2FE;transition:none}
.gt-card-p{margin-top:8px;padding-top:7px;border-top:1px solid var(--c-line);font-size:12px;color:#4A5869;line-height:1.35}
.gt-card-pl{font-weight:600}
@container (max-width:599px){
  .gt-card{width:auto;padding:6px 8px;border-radius:10px}
  .gt-card-t,.gt-card-p,.gt-kpi:not(.is-ph){display:none}
  .gt-card-hd{margin:0 0 3px;justify-content:flex-start}
  .gt-card-g{grid-template-columns:repeat(2,auto);gap:12px}
  .gt-kpi{margin:0;padding:0}
  .gt-kpi-v{font-size:18px}
  .gt-kpi-l{font-size:10px}
  .gt-pill{font-size:10px;padding:0 6px}
}
@media (prefers-reduced-motion:reduce){.gt-kpi{transition:none}}
@media print{.gt-layer,.gt-ui{display:none}}
/* 30b · Groundtruth overlay on a STILL (.gts, generated by scripts/groundtruth/still-svg.mjs from scripts/groundtruth/stills/<stem>.detections.json; docs/components.md section 30).
   Static: no JS. The boxes live in a .cam-layer (the photo's own 16:9 frame, like object-fit: cover) so they stay on what the detector boxed at any frame size. Boxes are the detector's,
   the metrics list counts exactly those boxes, the tag and the privacy badge are the .gt-* ones. Only inside a .media--ill.media--layer figure. */
.gts-svg{position:absolute;inset:0;width:100%;height:100%;display:block;overflow:visible}
.gts-box{fill:none;stroke:rgba(169,213,236,.8);stroke-width:1;vector-effect:non-scaling-stroke}
.gts-tick{fill:none;stroke:var(--sky);stroke-width:2;vector-effect:non-scaling-stroke}
.gts-lb{position:absolute;display:block;padding:1px 6px;font-family:var(--mono);font-weight:500;font-size:11px;line-height:1.5;letter-spacing:.04em;white-space:nowrap;color:var(--sky);background:rgba(11,11,11,.62);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);transform:translateY(calc(-100% - 2px))}
.gts-lb--in{transform:translate(-50%,calc(-100% - 6px))}
.gts-tag,.gts-badge,.gts-metrics li{padding:3px 8px;font-size:11px;line-height:1.45;letter-spacing:.04em;color:var(--paper);background:rgba(11,11,11,.62);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}
.gts-tag{position:absolute;z-index:4;top:16px;left:16px;max-width:calc(100% - 32px)}
.gts-tag::before{content:"";display:inline-block;width:6px;height:6px;margin-right:7px;vertical-align:1px;background:var(--sky)}
.gts-metrics{position:absolute;z-index:4;left:16px;bottom:16px;margin:0;padding:0;list-style:none;display:grid;gap:4px;justify-items:start}
.gts-metrics li{display:inline-flex;align-items:baseline;gap:8px;color:var(--sky)}
.gts-metrics b{font-weight:500;color:var(--paper);min-width:1.2ch;text-align:right;font-variant-numeric:tabular-nums}
.gts-metrics li:nth-child(n){margin:0}
.gts-badge{position:absolute;z-index:4;right:16px;bottom:16px;max-width:calc(100% - 32px);text-align:right;text-decoration:none;pointer-events:auto}
.gts-badge:hover{text-decoration:underline;text-underline-offset:3px}
.gts-badge:focus-visible{outline:2px solid var(--sky);outline-offset:2px}
.gts-short{display:none}
@media (max-width:999px){
  .gts-full{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
  .gts-short{display:inline}
}
@media (max-width:699px){
  .gts-tag,.gts-badge,.gts-metrics li,.gts-lb{font-size:10px}
  .gts-tag,.gts-badge,.gts-metrics li{padding:2px 6px}
  .gts-tag{top:8px;left:8px;max-width:calc(100% - 16px)}
  .gts-metrics{left:8px;bottom:8px;gap:3px}
  .gts-badge{right:8px;bottom:8px}
}
@media print{.gts,.gts-metrics,.gts-tag,.gts-badge{display:none}}


/* Page-to-page transition (Chromium, Safari 18+): the announcement bar and header stay put, the page below crossfades. Other browsers navigate as before. */
@media (prefers-reduced-motion:no-preference){
  @view-transition{navigation:auto}
  .announce{view-transition-name:announce}
  .nav{view-transition-name:nav}
  ::view-transition-old(root),::view-transition-new(root){animation-duration:.18s}
}

/* stage nav: prev / next round outline buttons, a progress ring round "next" (see site.js, any [data-stage] element) */
.stage-nav{position:relative;display:none;align-items:center;justify-content:flex-end;gap:12px;grid-column:1/-1}
.is-tabs .stage-nav{display:flex}
@media (min-width:900px){.stage-nav{grid-column:2}}
.stage-live{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.stage-btn{position:relative;display:grid;place-items:center;width:40px;height:40px;padding:0;border:1px solid var(--ink);border-radius:50%;background:var(--paper);color:var(--ink);cursor:pointer;transition:background .15s}
.stage-btn:hover{background:var(--panel)}
.stage-btn:focus-visible{outline:2px solid var(--sky-edge);outline-offset:3px}
.stage-btn .stage-ring{position:absolute;left:50%;top:50%;margin:-25px 0 0 -25px;width:50px;height:50px;max-width:none;max-height:none;transform:rotate(-90deg);pointer-events:none;overflow:visible}
.stage-ring circle{fill:none;stroke-width:1.5}
.stage-ring-track{stroke:var(--hairline)}
.stage-ring-bar{stroke:var(--ink)}
.stage-nav.is-static .stage-ring{display:none}
