/* ============================================================
   CaptivaHQ — industry page styles · LIGHT MODE ONLY
   Shared by /skilled-trades and /manufacturing: both pages render the
   same DOM from js/vertical-selector.js (the class names stay
   .trades / .trade-tab / .trade-panel on both, even where the visible
   label is "area" — see the DOM contract note in that file), so there
   is nothing per-page in here.
   Loaded AFTER css/styles.css and leans on it for everything it
   already has (.wrap, .btn, .eyebrow, .reveal, .proof, .faqsec, the
   modules grid, the video frame, the type scale, radii, shadows).
   Only what does not exist yet lives here:
     1. the vertical selector (tabs → 2×3 grid on phones, five slots)
     2. the registration form + sticky phone CTA
     3. the Atlas section layout
     4. THE ATLAS LOOP — every keyframe and timing in ONE marked block
   Tokens only — no hex, no new palette. Mobile first: written at 375px
   and widened from there.
   ============================================================ */

:root{
  /* styles.css ships --c-ai-soft but no --c-ai-line; this is the matching
     hairline, derived from the same seed (not a new colour). If the
     product's globals.css defines one, copy that formula here instead. */
  --c-ai-line: color-mix(in oklch, var(--c-ai) 34%, var(--c-line));
}

/* No anchor offset here on purpose. The Horizon refresh added a site-wide
   `[id]{scroll-margin-top:100px}` (140px under 820px, where the nav wraps) in
   css/styles.css. A page-local 72px used to sit here and silently overrode it,
   landing every in-page anchor underneath the sticky header. */

/* ---------- no hero: the page opens on the selector, whose heading is the h1 ---------- */
.sec-h1{font-size:clamp(32px,4.4vw,54px);font-weight:700}

/* ============================================================
   1. VERTICAL SELECTOR (trades / manufacturing areas)
   ============================================================ */
.trades{container-type:inline-size;container-name:trades;margin-top:26px}

/* -- tab row (desktop / wide) -- */
/* flex-wrap, not overflow: between the phone breakpoint and full desktop
   width six labels can be wider than the container, and an overflowing tab
   row scrolls the whole PAGE sideways. Wrapping costs nothing at widths where
   the row already fits on one line — which is every width /skilled-trades
   renders at — and keeps /manufacturing's longer labels on screen. */
.trade-tabs{
  display:flex;flex-wrap:wrap;gap:4px;
  border-bottom:1px solid var(--c-line-strong);
}
.trade-tab{
  --trade:var(--c-ai);                       /* inline style overrides per trade */
  position:relative;flex:1 1 auto;
  display:inline-flex;align-items:center;justify-content:center;gap:9px;
  min-height:48px;padding:12px 14px;margin-bottom:-1px;
  font-weight:600;font-size:15px;color:var(--c-fg-2);white-space:nowrap;
  border-bottom:3px solid transparent;border-radius:var(--r-2) var(--r-2) 0 0;
  transition:color .2s var(--ease),background-color .2s var(--ease),border-color .2s var(--ease);
}
/* colour dot — never the only signal: the label and the active border carry it */
.trade-tab::before{
  content:"";flex:none;width:9px;height:9px;border-radius:50%;background:var(--trade);
  box-shadow:0 0 0 3px color-mix(in oklch, var(--trade) 18%, transparent);
}
.trade-tab:hover{color:var(--c-fg-0);background:color-mix(in oklch, var(--trade) 8%, transparent)}
.trade-tab[aria-selected="true"]{
  color:color-mix(in oklch, var(--trade) 62%, var(--c-fg-0));
  border-bottom-color:var(--trade);
  background:color-mix(in oklch, var(--trade) 11%, transparent);
}
.trade-tab:focus-visible{outline:2px solid var(--trade);outline-offset:-2px}

/* -- phones: a 2×3 grid of tap targets, not a 62px-per-tab strip.
   Same DOM; the container query on .trades flips the layout. -- */
@container trades (max-width:700px){
  .trade-tabs{display:grid;grid-template-columns:1fr 1fr;gap:8px;border-bottom:none}
  .trade-tab{
    min-height:56px;margin:0;padding:10px 12px;
    justify-content:flex-start;text-align:left;white-space:normal;line-height:1.2;
    background:var(--c-bg-1);border:1px solid var(--c-line-strong);border-radius:var(--r-3);
  }
  .trade-tab[aria-selected="true"]{
    border:2px solid var(--trade);padding:9px 11px;
    background:color-mix(in oklch, var(--trade) 12%, var(--c-bg-0));
  }
}
/* browsers without container queries get the same grid from a media query */
@supports not (container-type:inline-size){
  @media (max-width:700px){
    .trade-tabs{display:grid;grid-template-columns:1fr 1fr;gap:8px;border-bottom:none}
    .trade-tab{
      min-height:56px;margin:0;padding:10px 12px;
      justify-content:flex-start;text-align:left;white-space:normal;line-height:1.2;
      background:var(--c-bg-1);border:1px solid var(--c-line-strong);border-radius:var(--r-3);
    }
    .trade-tab[aria-selected="true"]{
      border:2px solid var(--trade);padding:9px 11px;
      background:color-mix(in oklch, var(--trade) 12%, var(--c-bg-0));
    }
  }
}

/* -- panels -- */
/* min-height baseline so switching never moves the page; js/vertical-selector.js
   refines it to the tallest panel once fonts have landed */
.trade-panels{position:relative;margin-top:22px;min-height:560px}
.trade-panel{--trade:var(--c-ai)}
.trade-head{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 16px}
.trade-kicker{
  font-family:var(--f-mono);font-size:11.5px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;
  color:var(--trade);
}
.trade-head h3{
  font-size:clamp(20px,2.4vw,26px);font-weight:600;letter-spacing:-.02em;line-height:1.25;
  color:var(--c-fg-0);max-width:60ch;text-wrap:pretty;flex:1 1 100%;
}

/* Two stacked two-column rows (change round 01 §1). The old single grid — the
   stepper spanning three rows beside docs/roles/atlas with align-items:start —
   left a large void wherever one column outran the other. Now each row is its
   own two-up and the columns STRETCH to equal height (no align-items:start);
   the slack is absorbed inside the shorter slot rather than left under it:
     · the two lists distribute their rows (justify-content:space-between)
     · .docs-count is pushed to the bottom of its box (margin-top:auto)
     · .slot-atlas grows and centres its sentence
   DOM order is also the mobile order: steps → mods → docs → roles → atlas. */
.trade-slots{display:flex;flex-direction:column;gap:14px;margin-top:18px}
.trade-row{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px}
/* row B's right column holds two slots; atlas takes the slack */
.trade-col{display:flex;flex-direction:column;gap:14px;min-width:0}
.trade-col .slot-atlas{flex:1}
@container trades (max-width:700px){
  .trade-row{grid-template-columns:1fr}
}
@supports not (container-type:inline-size){
  @media (max-width:700px){
    .trade-row{grid-template-columns:1fr}
  }
}

.slot{
  display:flex;flex-direction:column;
  background:var(--c-bg-1);border:1px solid var(--c-line);border-radius:var(--r-4);
  padding:18px;box-shadow:var(--sh-card);min-width:0;
}
.slot h4{
  font-family:var(--f-mono);font-size:11.5px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  color:var(--c-fg-3);margin-bottom:12px;flex:none;
}

/* slot 1 — "How a job runs": numbered stepper, each step tagged with its module.
   flex:1 + space-between lets the list breathe into whatever height the row
   settled on; overflow-y is the safety valve the brief asks for, not an
   expected state (the row is auto-height, so content normally sizes it). */
.steps{
  list-style:none;display:flex;flex-direction:column;justify-content:space-between;
  flex:1;min-height:0;overflow-y:auto;
}
.steps li{
  position:relative;
  display:grid;grid-template-columns:28px minmax(0,1fr);grid-template-areas:"n t" "n m";
  column-gap:12px;row-gap:5px;padding:6px 0 14px;
}
.steps li:not(:last-child)::before{
  content:"";position:absolute;left:13px;top:36px;bottom:0;width:2px;
  background:color-mix(in oklch, var(--trade) 38%, var(--c-line));
}
.step-n{
  grid-area:n;width:28px;height:28px;border-radius:50%;display:grid;place-items:center;
  font-family:var(--f-mono);font-size:12px;font-weight:600;color:oklch(0.99 0 0);
  background:var(--trade);box-shadow:0 0 0 4px color-mix(in oklch, var(--trade) 14%, transparent);
  margin-top:1px;
}
.step-t{grid-area:t;font-weight:600;font-size:15.5px;line-height:1.3;color:var(--c-fg-0);padding-top:4px}
.mod-tag{
  --acc:var(--c-ai);
  grid-area:m;justify-self:start;
  display:inline-flex;align-items:center;gap:6px;
  font-family:var(--f-mono);font-size:10.5px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;
  padding:3px 9px 3px 7px;border-radius:999px;line-height:1.3;
  color:color-mix(in oklch, var(--acc) 72%, var(--c-fg-0));
  background:color-mix(in oklch, var(--acc) 12%, transparent);
  border:1px solid color-mix(in oklch, var(--acc) 42%, transparent);
}
.mod-tag::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--acc);flex:none}

/* slot 2 — the paperwork, as wrapping pills (change round 01 §3).
   Same shape as the role chips so the two slots read as one family, but these
   are <li>s, not buttons: no + affordance, no pointer cursor, no focus ring
   and no hover transition — nothing that would suggest they are clickable. */
.docs-stack{
  list-style:none;display:flex;flex-wrap:wrap;align-content:flex-start;gap:8px;
}
.docs-stack li{
  padding:7px 13px;border-radius:999px;font-size:14px;line-height:1.2;
  min-height:38px;display:inline-flex;align-items:center;
  color:var(--c-fg-1);
  background:color-mix(in oklch, var(--trade) 7%, var(--c-bg-0));
  border:1px solid color-mix(in oklch, var(--trade) 45%, var(--c-line));
}
/* margin-top:auto pins the count to the bottom of the box, so a stretched
   docs column absorbs its slack between the pills and the count */
.docs-count{
  margin-top:auto;padding-top:14px;
  font-family:var(--f-mono);font-size:12px;font-weight:600;letter-spacing:.04em;
  color:color-mix(in oklch, var(--trade) 70%, var(--c-fg-1));
}

/* slots 3 + 5 — chips that disclose one paragraph (button + region, not a tooltip) */
.chips{display:flex;flex-wrap:wrap;gap:8px}
.chip{
  --acc:var(--trade);
  display:inline-flex;align-items:center;gap:7px;
  min-height:38px;padding:7px 12px 7px 13px;border-radius:999px;
  font-size:14px;font-weight:600;line-height:1.2;color:var(--c-fg-0);text-align:left;
  background:var(--c-bg-0);border:1px solid color-mix(in oklch, var(--acc) 45%, var(--c-line));
  transition:background-color .2s var(--ease),border-color .2s var(--ease),color .2s var(--ease);
}
.chip::after{
  content:"+";font-family:var(--f-mono);font-size:15px;line-height:1;color:var(--acc);
  transition:transform .2s var(--ease);
}
.chip:hover{background:color-mix(in oklch, var(--acc) 8%, var(--c-bg-0));border-color:var(--acc)}
.chip[aria-expanded="true"]{
  background:color-mix(in oklch, var(--acc) 14%, var(--c-bg-0));border-color:var(--acc);
  color:color-mix(in oklch, var(--acc) 55%, var(--c-fg-0));
}
.chip[aria-expanded="true"]::after{transform:rotate(45deg)}
.chip:focus-visible{outline:2px solid var(--acc);outline-offset:2px}
.chip-core{
  font-family:var(--f-mono);font-size:9.5px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;
  padding:2px 6px;border-radius:999px;
  color:var(--c-ai);background:color-mix(in oklch, var(--c-ai) 12%, transparent);
  border:1px solid color-mix(in oklch, var(--c-ai) 30%, transparent);
}
.chip-detail{
  --acc:var(--trade);
  margin-top:12px;padding:12px 14px;border-radius:var(--r-3);
  background:var(--c-bg-0);border:1px solid var(--c-line);border-left:3px solid var(--acc);
  animation:st-disclose .28s var(--ease-out);
}
.chip-detail p{font-size:14.5px;line-height:1.6;color:var(--c-fg-1);text-wrap:pretty}
.chip-detail strong{color:var(--c-fg-0)}
@keyframes st-disclose{from{opacity:0;transform:translateY(-4px)}}

/* slot 5 — "Modules you'd switch on" as a numbered list (change round 01 §2).
   Same grammar as .steps — numbered circle, name beside it — but the circle
   carries the MODULE's own --chart-* accent, not the trade accent, so colour
   still identifies the module. No connecting rule between the numbers: these
   are a set, not a sequence, and the numbering is only for scanability. */
.mods-list{
  list-style:none;display:flex;flex-direction:column;justify-content:space-between;
  flex:1;min-height:0;overflow-y:auto;
}
.mod-row{
  --acc:var(--trade);
  display:flex;align-items:center;gap:12px;width:100%;
  padding:5px 4px 5px 0;border-radius:var(--r-3);text-align:left;
  transition:background-color .2s var(--ease);
}
.mod-row .step-n{
  background:var(--acc);
  box-shadow:0 0 0 4px color-mix(in oklch, var(--acc) 14%, transparent);
  margin-top:0;flex:none;
}
.mod-row .step-t{padding-top:0;display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap}
.mod-row::after{
  content:"+";margin-left:auto;padding-left:8px;
  font-family:var(--f-mono);font-size:15px;line-height:1;color:var(--acc);
  transition:transform .2s var(--ease);
}
.mod-row:hover{background:color-mix(in oklch, var(--acc) 8%, transparent)}
.mod-row:focus-visible{outline:2px solid var(--acc);outline-offset:2px}
.mod-row[aria-expanded="true"]{background:color-mix(in oklch, var(--acc) 11%, transparent)}
.mod-row[aria-expanded="true"] .step-t{color:color-mix(in oklch, var(--acc) 40%, var(--c-fg-0))}
.mod-row[aria-expanded="true"]::after{transform:rotate(45deg)}
/* the disclosed paragraph sits inside the <li>, under its own row */
.mods-list .chip-detail{margin:6px 0 4px 40px}
@container trades (max-width:700px){
  .mods-list .chip-detail{margin-left:0}
}
@supports not (container-type:inline-size){
  @media (max-width:700px){
    .mods-list .chip-detail{margin-left:0}
  }
}

/* slot 4 — what Atlas does here: one sentence in a brand-tinted panel */
.slot-atlas{background:var(--c-ai-soft);border-color:var(--c-ai-line);justify-content:center}
.slot-atlas h4{color:var(--c-ai);display:flex;align-items:center;gap:8px}
.slot-atlas h4::before{
  content:"";width:10px;height:10px;border-radius:50%;background:var(--g-brand);
  box-shadow:0 0 10px color-mix(in oklch, var(--c-ai) 45%, transparent);
}
.slot-atlas p{font-size:16.5px;font-weight:500;line-height:1.5;color:var(--c-fg-0);text-wrap:pretty}

/* ============================================================
   1b. EVIDENCE — a KPI row of three federal statistics.
   Deliberately NOT a chart: three numbers with their sources is the whole
   content, and a bar or a gauge would only decorate it. All three figures
   take --c-ai — they are three parts of one argument, not three series, so
   hueing them apart would imply categories that do not exist. The comparison
   numbers beside them wear text tokens: one accent per tile, or the prose
   starts competing with the figure. Citations are bottom-aligned links, not
   fine print (see the section comment in the HTML).
   ============================================================ */
/* The stats ride in the REGISTRATION band, not the trade-selector one: same
   --c-bg-1 surface, no hairline between the two sections, so the eye reads
   "here is the case, here is the form" as one block. #register keeps the
   bottom border and owns the end of the band; the seam padding is trimmed on
   both sides so one continuous surface does not read as two stacked ones.
   On that band the tiles invert to --c-bg-0 — the same flip .reg makes. */
#evidence{
  background:var(--c-bg-1);border-top:1px solid var(--c-line);
  padding-bottom:calc(var(--sec-y) * .5);
}
#plans + #register{border-top:0;padding-top:calc(var(--sec-y) * .6)}

.ev{container-type:inline-size;container-name:evidence;margin-top:30px}
.ev-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}

.ev-tile{
  display:flex;flex-direction:column;min-width:0;
  background:var(--c-bg-0);border:1px solid var(--c-line);border-radius:var(--r-4);
  padding:24px 22px;box-shadow:var(--sh-card);
}
/* baseline-aligned so "Fewer than" sits on the figure's baseline and the three
   big numbers still line up across the row */
.ev-num{display:flex;flex-wrap:wrap;align-items:baseline;gap:0 9px;margin-bottom:14px}
.ev-qual{font-size:clamp(15px,1.15vw,17px);font-weight:600;letter-spacing:-.01em;color:var(--c-fg-2)}
.ev-fig{
  font-family:var(--f-sans);font-size:clamp(48px,4.2vw,60px);font-weight:600;
  line-height:1;letter-spacing:-.045em;color:var(--c-ai);font-variant-numeric:tabular-nums;
}
.ev-lede{font-size:16px;font-weight:500;line-height:1.45;color:var(--c-fg-1);text-wrap:pretty}
.ev-vs{margin-top:12px;font-size:14.5px;line-height:1.55;color:var(--c-fg-2);text-wrap:pretty}
.ev-vs b{font-weight:600;color:var(--c-fg-0);font-variant-numeric:tabular-nums}

.ev-src{
  display:flex;align-items:flex-start;justify-content:space-between;gap:10px;
  margin-top:auto;padding-top:16px;border-top:1px solid var(--c-line);
  font-size:12.5px;line-height:1.45;color:var(--c-fg-3);text-decoration:none;
  transition:color .2s var(--ease);
}
.ev-src i{font-style:italic}
.ev-src:hover{color:var(--c-ai)}
.ev-src:hover span:first-child{text-decoration:underline;text-underline-offset:2px}
.ev-src:focus-visible{outline:2px solid var(--c-ai);outline-offset:3px;border-radius:var(--r-2)}

.ev-foot{margin-top:18px;font-size:15px;line-height:1.55;color:var(--c-fg-2);max-width:72ch;text-wrap:pretty}
.ev-foot a{font-weight:600;color:var(--c-ai);text-decoration:none;white-space:nowrap}
.ev-foot a:hover{text-decoration:underline;text-underline-offset:2px}

/* one column on phones, at the same 700px breakpoint the trade selector uses */
@container evidence (max-width:700px){
  .ev-grid{grid-template-columns:1fr}
  .ev-tile{padding:20px 18px}
}
@supports not (container-type:inline-size){
  @media (max-width:700px){
    .ev-grid{grid-template-columns:1fr}
    .ev-tile{padding:20px 18px}
  }
}

/* ============================================================
   1c. PRICING — the plans rendered by js/pricing.js (styles in
   css/styles.css, .pr-*). Third block of the registration band
   (evidence → plans → form on one --c-bg-1 surface). The id is #plans,
   not #pricing: css/styles.css paints #pricing as the home page's band.
   ============================================================ */
#plans{
  background:var(--c-bg-1);
  padding-top:calc(var(--sec-y) * .6);padding-bottom:calc(var(--sec-y) * .5);
}
#plans .pr-tier,#plans .pr-panel{background:var(--c-bg-0)}
#plans .pr-allot{background:var(--c-bg-1)}

/* ============================================================
   2. REGISTRATION FORM  (UI only — submit is stubbed, see js/register-form.js)
   ============================================================ */
#register{background:var(--c-bg-1);border-top:1px solid var(--c-line);border-bottom:1px solid var(--c-line)}
.reg-grid{
  display:grid;grid-template-columns:minmax(0,.9fr) minmax(0,1.1fr);
  gap:clamp(24px,4vw,56px);align-items:start;
}
@media (max-width:860px){.reg-grid{grid-template-columns:1fr}}
.reg-copy .lead{max-width:none}
.reg-points{list-style:none;margin-top:18px;display:flex;flex-direction:column;gap:10px}
.reg-points li{position:relative;padding-left:26px;font-size:15px;line-height:1.5;color:var(--c-fg-1)}
.reg-points li::before{content:"✓";position:absolute;left:0;top:0;color:var(--c-pos-text);font-family:var(--f-mono);font-size:14px}

.reg{
  background:var(--c-bg-0);border-radius:var(--r-5);padding:clamp(20px,3vw,30px);
  border:1px solid color-mix(in oklch, var(--c-ai) 30%, var(--c-line-strong));
  box-shadow:var(--sh-lift);
}
.reg-progress{
  font-family:var(--f-mono);font-size:11.5px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  color:var(--c-ai);margin-bottom:14px;
}
.reg-step{border:0;padding:0;margin:0;min-width:0;display:flex;flex-direction:column;gap:16px}
.reg-step>legend{
  font-size:20px;font-weight:700;letter-spacing:-.02em;color:var(--c-fg-0);
  padding:0;margin-bottom:4px;float:left;width:100%;   /* float: legend sits inside the flex flow */
}
.field{display:flex;flex-direction:column;gap:6px;min-width:0}
/* radio groups are nested <fieldset>s — no browser box, same label size as an input label */
fieldset.field{border:0;padding:0;margin:0}
.field>label,.field>.field-legend{font-size:14px;font-weight:600;color:var(--c-fg-0);padding:0;float:left;width:100%}
.field input,.field select{
  width:100%;min-height:48px;padding:11px 14px;font-size:16px;   /* 16px: iOS does not zoom */
  border-radius:var(--r-3);border:1px solid var(--c-line-strong);
  background:var(--c-bg-0);color:var(--c-fg-0);
  appearance:none;-webkit-appearance:none;
  transition:border-color .2s var(--ease),box-shadow .2s var(--ease);
}
.field input::placeholder{color:var(--c-fg-3)}
.select-wrap{position:relative}
.select-wrap select{padding-right:40px}
.select-wrap::after{
  content:"";position:absolute;right:17px;top:50%;width:8px;height:8px;pointer-events:none;
  border-right:2px solid var(--c-fg-2);border-bottom:2px solid var(--c-fg-2);
  transform:translateY(-70%) rotate(45deg);
}
.field input:focus-visible,.field select:focus-visible{
  outline:none;border-color:var(--c-ai);
  box-shadow:0 0 0 3px color-mix(in oklch, var(--c-ai) 25%, transparent);
}
.field.has-error input,.field.has-error select,.field.has-error .seg span{border-color:var(--c-neg)}
.field-hint{font-size:12.5px;line-height:1.45;color:var(--c-fg-3);text-wrap:pretty}
.field-err{font-size:13px;font-weight:600;color:var(--c-neg-text)}
.field-err::before{content:"! ";font-family:var(--f-mono)}

/* segmented radios: label wraps a hidden-but-focusable input and a visible tile */
.seg{display:grid;grid-template-columns:repeat(4,1fr);gap:6px}
.seg label{position:relative;display:block;min-width:0}
.seg input{position:absolute;inset:0;width:100%;height:100%;margin:0;opacity:0;cursor:pointer}
.seg span{
  display:flex;align-items:center;justify-content:center;min-height:46px;padding:8px 6px;
  border:1px solid var(--c-line-strong);border-radius:var(--r-3);
  font-size:14.5px;font-weight:600;line-height:1.2;text-align:center;
  background:var(--c-bg-0);color:var(--c-fg-1);cursor:pointer;
  transition:border-color .2s var(--ease),background-color .2s var(--ease),color .2s var(--ease);
}
.seg input:checked+span{
  border-color:var(--c-ai);color:var(--c-ai);
  background:color-mix(in oklch, var(--c-ai) 12%, var(--c-bg-0));
}
.seg input:focus-visible+span{box-shadow:0 0 0 3px color-mix(in oklch, var(--c-ai) 25%, transparent)}
/* column counts per group size (round 03 §7: segmented buttons, not a
   dropdown, for anything under ~6 options — one tap instead of two taps and
   a scroll wheel) */
.seg.is-2{grid-template-columns:repeat(2,minmax(0,1fr))}
.seg.is-3{grid-template-columns:repeat(3,minmax(0,1fr))}
.seg.is-5{grid-template-columns:repeat(5,minmax(0,1fr))}
.seg.is-list{grid-template-columns:1fr}
.seg.is-list span{justify-content:flex-start;text-align:left;font-weight:500;padding:10px 14px}
@media (max-width:420px){
  .seg:not(.is-list){grid-template-columns:1fr 1fr}
  /* five bands read better 3+2 than 2+2+1 */
  .seg.is-5{grid-template-columns:repeat(3,minmax(0,1fr))}
}

/* "(optional)" rides in the label, so the accessible name says it too.
   Required fields are NOT asterisked — marking the few optional ones is the
   pattern that tests better. */
.field-opt{font-weight:500;color:var(--c-fg-3)}

/* consent: native checkbox, accent-coloured. .field's full-width input rule
   has to be undone here or the box fills the row. The row keeps a 44px
   target even though the box itself is 20px. */
.field-consent .check{display:flex;align-items:flex-start;gap:11px;min-height:44px;padding-top:2px}
.field-consent input[type="checkbox"]{
  flex:none;width:20px;height:20px;min-height:0;margin:2px 0 0;padding:0;
  appearance:auto;-webkit-appearance:auto;accent-color:var(--c-ai);
  border-radius:0;cursor:pointer;
}
.field-consent label{
  font-size:14px;font-weight:500;line-height:1.5;color:var(--c-fg-1);
  float:none;width:auto;cursor:pointer;text-wrap:pretty;
}
.field-consent label a{color:var(--c-ai);text-underline-offset:2px}
.field-consent.has-error input[type="checkbox"]{outline:2px solid var(--c-neg);outline-offset:3px}

/* the reason the submit is disabled — never a silently dead button */
.reg-gate{margin-top:-4px;font-size:12.5px;font-weight:600;color:var(--c-fg-3)}
/* The Turnstile widget renders in an iframe at its own size; this just gives it
   room and keeps it from touching the buttons underneath. */
.reg-turnstile{margin:4px 0 14px}

/* Submit failed, or the challenge was not completed. Same red as a field error,
   but block-level under the button so it cannot be mistaken for one field. */
.reg-error{
  margin-top:10px;padding:10px 12px;
  font-size:13.5px;line-height:1.5;font-weight:600;color:var(--c-neg-text);
  background:color-mix(in oklch, var(--c-neg-text) 8%, transparent);
  border:1px solid color-mix(in oklch, var(--c-neg-text) 28%, transparent);
  border-radius:var(--r-2);text-wrap:pretty;
}
.reg-error a{color:inherit;text-decoration:underline;text-underline-offset:2px}
.reg-actions .btn[disabled]{opacity:.55;cursor:not-allowed;box-shadow:none;transform:none}

/* honeypot: out of sight, out of the tab order, out of the a11y tree */
.hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}

.reg-actions{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-top:4px}
.reg-actions .btn-primary{flex:1 1 auto}
.reg-fine{font-size:12.5px;line-height:1.5;color:var(--c-fg-3);text-wrap:pretty}
.reg-fine a{color:var(--c-ai)}

.reg-done{display:flex;flex-direction:column;align-items:flex-start}
.done-mark{
  width:52px;height:52px;border-radius:50%;display:grid;place-items:center;margin-bottom:14px;
  font-size:22px;color:var(--c-pos-text);
  background:color-mix(in oklch, var(--c-pos) 16%, var(--c-bg-0));border:2px solid var(--c-pos);
}
.reg-done h3{font-size:24px}
.reg-done h3:focus{outline:none}
.reg-done p{margin-top:10px;font-size:15.5px;line-height:1.6;color:var(--c-fg-2);text-wrap:pretty}
.reg-done p strong{color:var(--c-fg-0)}

/* -- sticky bottom CTA: phones only, thumb zone, safe-area aware.
   js/industry-page.js adds .show once the hero has scrolled out. -- */
.sticky-cta{
  position:fixed;left:0;right:0;bottom:0;z-index:150;display:none;
  padding:10px 16px calc(10px + env(safe-area-inset-bottom));
  background:color-mix(in oklch, var(--c-bg-0) 92%, transparent);
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  border-top:1px solid var(--c-line-strong);
  box-shadow:0 -10px 30px -18px oklch(0.25 0.04 262 / .3);
  transform:translateY(110%);transition:transform .35s var(--ease-out);
}
.sticky-cta .btn{width:100%}
.sticky-cta.show{transform:none}
@media (max-width:700px){
  .sticky-cta{display:block}
  footer{padding-bottom:calc(34px + 74px + env(safe-area-inset-bottom))}   /* room under the bar */
}
/* the consent banner owns the bottom edge until a choice is made */
body:has(.consent) .sticky-cta{display:none}
@media (prefers-reduced-motion:reduce){.sticky-cta{transition:none}}

/* ============================================================
   3. ATLAS SECTION — one heading, one paragraph, the loop beside it
   ============================================================ */
#atlas{background:var(--c-bg-1);border-top:1px solid var(--c-line);border-bottom:1px solid var(--c-line)}
.atlas-grid{
  display:grid;grid-template-columns:minmax(0,.95fr) minmax(0,1.05fr);
  gap:clamp(28px,5vw,64px);align-items:center;
}
.atlas-copy .lead{max-width:none}
/* what Atlas actually does — two columns while the copy column is wide enough,
   one below that. Same accent dot as .tier-list, so the two lists on the page
   read as one device. */
.atlas-can{
  list-style:none;margin-top:20px;
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 20px;
  font-size:15px;line-height:1.45;color:var(--c-fg-1);
}
.atlas-can li{display:flex;gap:10px;text-wrap:pretty}
.atlas-can li::before{
  content:"";flex:none;width:6px;height:6px;margin-top:8px;border-radius:50%;background:var(--c-ai);
}
.atlas-note{
  margin-top:18px;padding-left:13px;border-left:2px solid var(--c-ai-line);
  font-size:14px;line-height:1.5;color:var(--c-fg-2);
}
@media (max-width:1000px){.atlas-can{grid-template-columns:1fr}}
/* phones: copy first, then the loop — it must never push the paragraph down */
@media (max-width:860px){.atlas-grid{grid-template-columns:1fr;gap:24px}}

/* ============================================================
   4. THE ATLAS LOOP — pure CSS, no library, no script.
   ------------------------------------------------------------
   EVERY keyframe and EVERY timing for the animation lives between
   these two banners. Copy and spacing edits elsewhere cannot break it.

   Three beats on one clock (--atlas-loop-dur, 10s):
     beat 1  the ask      0% –  40%   user orb speaks, the request bubble
     beat 2  the work    40% –  70%   orbs leave; a ticket composes itself
     beat 3  the answer  70% – 100%   orbs return; Atlas answers with the
                                      ticket confirmed + the estimate
   The beat durations below are the source of truth for the split; the
   keyframe percentages encode the same 40/30/30 and must be retuned
   together if the beats change. State at 100% == state at 0% (orbs
   present, both idle, nothing else on stage), so the loop is seamless.

   Base styles (no animation) = the composed BEAT-3 still: that is what
   prefers-reduced-motion shows. Nothing that belongs to that still is
   parked at opacity 0.
   ============================================================ */
.al-wrap{container-type:inline-size}
.al-stage{
  --atlas-beat-1:4s;
  --atlas-beat-2:3s;
  --atlas-beat-3:3s;
  --atlas-loop-dur:calc(var(--atlas-beat-1) + var(--atlas-beat-2) + var(--atlas-beat-3));
  --atlas-pulse:1.4s;                 /* speaking-ring period for the active orb */
  --al-ease:var(--ease);

  position:relative;overflow:hidden;
  font-size:13px;                     /* fallback for browsers without cqi */
  font-size:clamp(12.5px,3.9cqi,16px);
  aspect-ratio:4/5;                   /* phones: room for the beat-3 answer above the caption */
  border-radius:var(--r-5);
  background:
    radial-gradient(80% 60% at 100% 0%, color-mix(in oklch, var(--c-ai) 9%, transparent), transparent 70%),
    radial-gradient(60% 50% at 0% 100%, color-mix(in oklch, var(--c-ai-3) 8%, transparent), transparent 70%),
    var(--c-bg-0);
  border:1px solid color-mix(in oklch, var(--c-ai) 24%, var(--c-line-strong));
  box-shadow:var(--sh-lift);
}
@container (min-width:520px){.al-stage{aspect-ratio:5/4}}
.al-stage *{box-sizing:border-box}

/* -- orbs: user (green, --c-pos) and Atlas (blue, --c-ai), labels always visible -- */
.al-orbs{
  position:absolute;top:1.3em;left:1.5em;right:1.5em;
  display:flex;justify-content:space-between;
  animation:al-orbs var(--atlas-loop-dur) var(--al-ease) infinite both;
}
.al-orb{position:relative;display:flex;flex-direction:column;align-items:center;gap:.5em;width:6em}
.al-orb.is-user{color:var(--c-pos)}
.al-orb.is-atlas{color:var(--c-ai)}
.al-core{
  position:relative;width:2.7em;height:2.7em;border-radius:50%;
  display:flex;align-items:center;justify-content:center;gap:.14em;
  border:2px solid currentColor;
}
.is-user .al-core{background:color-mix(in oklch, var(--c-pos) 16%, var(--c-bg-0))}
.is-atlas .al-core{background:color-mix(in oklch, var(--c-ai) 14%, var(--c-bg-0))}
.al-core i{width:.36em;height:.36em;border-radius:50%;background:currentColor}
.is-user .al-core i{background:var(--c-pos-text)}
.al-label{font-family:var(--f-mono);font-size:.72em;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--c-fg-3)}
/* the speaking indicator — glow + two pulse rings — is gated per orb so
   only the active speaker ever animates; the idle orb stays present, quiet */
.al-active{position:absolute;inset:0;pointer-events:none}
.al-glow{position:absolute;inset:-.35em;border-radius:50%;box-shadow:0 0 1.3em color-mix(in oklch, currentColor 55%, transparent)}
.al-ring{
  position:absolute;inset:-2px;border-radius:50%;border:2px solid currentColor;
  transform:scale(1.35);opacity:.35;                 /* still-frame pose */
  animation:al-pulse var(--atlas-pulse) ease-out infinite both;
}
.al-ring+.al-ring{transform:scale(1.7);opacity:.18;animation-delay:calc(var(--atlas-pulse) / -2)}
.is-user .al-active{opacity:0;animation:al-gate-user var(--atlas-loop-dur) var(--al-ease) infinite both}
.is-atlas .al-active{opacity:1;animation:al-gate-atlas var(--atlas-loop-dur) var(--al-ease) infinite both}

/* -- speech bubbles -- */
.al-bubble{
  position:relative;padding:.8em 1em;border-radius:.9em;
  background:var(--c-bg-2);border:1px solid var(--c-line-strong);
}
.al-bubble p{font-size:.95em;line-height:1.4;color:var(--c-fg-0);margin:0;text-wrap:pretty}
.al-bubble p b{font-weight:600}
.al-bubble::before{content:"";position:absolute;top:-.55em;width:1em;height:1em;transform:rotate(45deg);background:inherit;border:inherit;border-right:none;border-bottom:none}
.al-bubble.is-user{
  position:absolute;top:6.6em;left:1.5em;width:min(78%,24em);
  border-color:color-mix(in oklch, var(--c-pos) 55%, var(--c-line-strong));
  border-top-left-radius:.3em;
  opacity:0;                                          /* not part of the beat-3 still */
  animation:al-ask var(--atlas-loop-dur) var(--al-ease) infinite both;
}
.al-bubble.is-user::before{left:1.9em}
.al-bubble.is-atlas{
  width:min(84%,27em);
  border-color:color-mix(in oklch, var(--c-ai) 55%, var(--c-line-strong));
  background:color-mix(in oklch, var(--c-ai) 7%, var(--c-bg-0));
  border-top-right-radius:.3em;
}
.al-bubble.is-atlas::before{right:1.9em}

/* -- record cards (ticket in the Customer Service accent, estimate in Invoicing) -- */
.al-card{
  --acc:var(--c-ai);
  padding:.8em 1em .9em;border-radius:.8em;
  background:var(--c-bg-0);
  border:1px solid color-mix(in oklch, var(--acc) 45%, var(--c-line));
  box-shadow:var(--sh-card),0 0 0 3px color-mix(in oklch, var(--acc) 7%, transparent);
}
.al-card-h{
  display:flex;align-items:center;gap:.5em;margin:0 0 .6em;
  font-family:var(--f-mono);font-size:.68em;font-weight:600;letter-spacing:.1em;text-transform:uppercase;
  color:color-mix(in oklch, var(--acc) 75%, var(--c-fg-0));
}
.al-card-h i{width:.9em;height:.9em;border-radius:50%;background:var(--acc);flex:none}
.al-field,.al-line{
  display:flex;align-items:baseline;justify-content:space-between;gap:1em;
  padding:.38em 0;border-top:1px solid var(--c-line);
}
.al-field span,.al-line span{font-family:var(--f-mono);font-size:.7em;letter-spacing:.06em;color:var(--c-fg-3);text-transform:uppercase;flex:none}
.al-field b,.al-line b{font-size:.9em;font-weight:600;color:var(--c-fg-0);text-align:right;text-wrap:balance}
.al-line span{font-family:var(--f-sans);font-size:.88em;letter-spacing:0;text-transform:none;color:var(--c-fg-1);flex:1 1 auto}
.al-line b{font-variant-numeric:tabular-nums}
.al-line.al-total{border-top:2px solid color-mix(in oklch, var(--acc) 50%, var(--c-line))}
.al-line.al-total span{font-weight:600;color:var(--c-fg-0)}
.al-line.al-total b{color:color-mix(in oklch, var(--acc) 70%, var(--c-fg-0));font-size:1em}
.al-foot{margin:.5em 0 0;font-family:var(--f-mono);font-size:.66em;letter-spacing:.06em;color:var(--c-fg-3)}
.al-status{
  font-family:var(--f-mono);font-size:.66em;font-weight:600;letter-spacing:.08em;text-transform:uppercase;font-style:normal;
  padding:.15em .6em;border-radius:999px;color:var(--c-pos-text);
  background:color-mix(in oklch, var(--c-pos) 14%, transparent);border:1px solid color-mix(in oklch, var(--c-pos) 45%, transparent);
}
.al-ref{position:relative;display:inline-grid}
.al-ref>span{grid-area:1/1;font-family:var(--f-mono);font-variant-numeric:tabular-nums}
.al-ref-pending{color:var(--c-fg-3);opacity:0;animation:al-ref-pending var(--atlas-loop-dur) steps(1,end) infinite both}
.al-ref-final{opacity:1;animation:al-ref-final var(--atlas-loop-dur) var(--al-ease) infinite both}

/* beat 2 — the ticket composing itself */
.al-ticket{
  position:absolute;top:1.6em;left:1.5em;right:1.5em;max-width:28em;margin-inline:auto;
  opacity:0;                                          /* not part of the beat-3 still */
  animation:al-ticket var(--atlas-loop-dur) var(--al-ease) infinite both;
}
.al-ticket .al-field{
  opacity:1;
  animation:al-land var(--atlas-loop-dur) var(--al-ease) infinite both;
  animation-delay:calc(var(--atlas-loop-dur) * .04 * var(--n,0));   /* stagger: fields land one by one */
}

/* beat 3 — Atlas answers: bubble + the estimate beneath it */
.al-answer{
  position:absolute;top:6.6em;left:1.5em;right:1.5em;
  display:flex;flex-direction:column;align-items:flex-end;gap:.7em;
  opacity:1;                                          /* the beat-3 still */
  animation:al-answer var(--atlas-loop-dur) var(--al-ease) infinite both;
}
.al-invoice{width:min(100%,27em)}
.al-invoice .al-line,.al-invoice .al-foot{
  opacity:1;
  animation:al-line var(--atlas-loop-dur) var(--al-ease) infinite both;
  animation-delay:calc(var(--atlas-loop-dur) * .03 * var(--n,0));
}

/* beat captions, bottom-left — one visible at a time */
.al-beats{position:absolute;left:1.5em;right:1.5em;bottom:1em;height:1.3em}
.al-beat{
  position:absolute;left:0;top:0;margin:0;
  font-family:var(--f-mono);font-size:.68em;font-weight:600;letter-spacing:.16em;text-transform:uppercase;
  color:var(--c-fg-3);opacity:0;
}
.al-beat b{color:var(--c-ai);font-weight:600}
.al-beat:nth-child(1){animation:al-cap-1 var(--atlas-loop-dur) var(--al-ease) infinite both}
.al-beat:nth-child(2){animation:al-cap-2 var(--atlas-loop-dur) var(--al-ease) infinite both}
.al-beat:nth-child(3){opacity:1;animation:al-cap-3 var(--atlas-loop-dur) var(--al-ease) infinite both}

/* -- the clock: every keyframe, in beat order -- */
/* orbs: present for the ask, gone for the work, back for the answer */
@keyframes al-orbs{
  0%,38%{opacity:1;transform:none}
  42%,68%{opacity:0;transform:translateY(-.6em)}
  72%,100%{opacity:1;transform:none}
}
/* who is speaking (gates the glow + rings) — user 0–36%, Atlas 75–96%;
   the user gate is already on again at 99.5% so 100% == 0% */
@keyframes al-gate-user{
  0%,36%{opacity:1}
  39%,96%{opacity:0}
  99.5%,100%{opacity:1}
}
@keyframes al-gate-atlas{
  0%,72%{opacity:0}
  75%,96%{opacity:1}
  99%,100%{opacity:0}
}
@keyframes al-pulse{
  from{transform:scale(1);opacity:.75}
  to{transform:scale(1.95);opacity:0}
}
/* beat 1 — the request bubble: quick reveal, long hold so the line can be read */
@keyframes al-ask{
  0%,4%{opacity:0;transform:translateY(.5em) scale(.97)}
  8%,36%{opacity:1;transform:none}
  40%,100%{opacity:0;transform:translateY(-.3em)}
}
/* beat 2 — the ticket card, then its fields landing one by one (see --n) */
@keyframes al-ticket{
  0%,43%{opacity:0;transform:translateY(.8em)}
  47%,66%{opacity:1;transform:none}
  70%,100%{opacity:0;transform:translateY(-.5em)}
}
@keyframes al-land{
  0%,48%{opacity:0;transform:translateX(-.5em)}
  51%,69%{opacity:1;transform:none}
  70%,100%{opacity:0;transform:none}
}
@keyframes al-ref-pending{
  0%,47%{opacity:0}
  48%,61%{opacity:1}
  62%,100%{opacity:0}
}
@keyframes al-ref-final{
  0%,61%{opacity:0;transform:scale(.85)}
  64%,69%{opacity:1;transform:none}
  70%,100%{opacity:0;transform:none}
}
/* beat 3 — the answer: bubble + estimate, held, then cleared before the wrap */
@keyframes al-answer{
  0%,73%{opacity:0;transform:translateY(.6em)}
  77%,96%{opacity:1;transform:none}
  99.5%,100%{opacity:0;transform:translateY(.6em)}
}
@keyframes al-line{
  0%,78%{opacity:0;transform:translateX(.4em)}
  81%,100%{opacity:1;transform:none}
}
/* captions */
@keyframes al-cap-1{
  0%,38%{opacity:1}
  41%,96%{opacity:0}
  99.5%,100%{opacity:1}
}
@keyframes al-cap-2{
  0%,40%{opacity:0}
  43%,68%{opacity:1}
  71%,100%{opacity:0}
}
@keyframes al-cap-3{
  0%,70%{opacity:0}
  73%,95%{opacity:1}
  98%,100%{opacity:0}
}

/* reduced motion: stop the clock outright (the global .001s rule would
   strobe an infinite loop) and show the composed beat-3 still — Atlas
   answering, the estimate on the table. Nothing that reads is at 0. */
@media (prefers-reduced-motion:reduce){
  .al-stage *{animation:none!important}
}
/* ============================================================
   END OF THE ATLAS LOOP BLOCK
   ============================================================ */
