/* Homepage only. Shared pieces live in base.css. */

/* ---------- Assembly stage ---------- */
/* Commercial design revision. */
.assembly{position:relative;height:360vh}
.stage{position:sticky;top:0;height:100vh;height:100svh;overflow:hidden;background:var(--stage-bg);color:var(--stage-ink)}
.stage::before{content:"";position:absolute;inset:0;pointer-events:none;background-image:radial-gradient(circle,color-mix(in srgb,var(--stage-ink) 13%,transparent) 1px,transparent 1.4px);background-size:32px 32px;background-position:calc(var(--gutter) - 16px) 0;-webkit-mask-image:radial-gradient(ellipse 60% 70% at 66% 50%,#000 30%,transparent 80%);mask-image:radial-gradient(ellipse 60% 70% at 66% 50%,#000 30%,transparent 80%)}
.js .stage::before{display:none}
.night,.field,.scene{position:absolute;inset:0;width:100%;height:100%}
.night{pointer-events:none;background:#11140f;visibility:hidden}
.copy-block,.layer-labels li{color:var(--stage-ink)}
.stage-bar>*,.phases span{color:var(--stage-muted)}
.field{pointer-events:none}
.scene{overflow:visible}

.stage-copy{position:absolute;left:var(--gutter);top:var(--header-h);bottom:72px;width:min(44vw,780px);display:grid;align-items:center}
.copy-block{grid-area:1/1;will-change:opacity,transform}
.js .copy-block{opacity:0;visibility:hidden}
html:not(.js) .copy-block:not([data-block="hero"]),html:not(.js) .layer-labels{display:none}
html:not(.js) .assembly{height:auto}
.copy-block h1,.copy-block h2{font-family:var(--font-display);font-weight:500;letter-spacing:-.045em;line-height:.98;margin:26px 0 26px}
.copy-block h1{font-size:clamp(42px,4.5vw,76px)}
.copy-block h2{font-size:clamp(36px,3.9vw,62px)}
.copy-block[data-block="layers"],.copy-block[data-block="test"],.copy-block[data-block="whole"]{max-width:540px}
.copy-block h2{text-wrap:balance}
.copy-block h1{text-wrap:pretty}
.copy-block h1 span,.copy-block h2 span{color:var(--stage-muted)}
.copy-block .lede{font-size:17px;line-height:1.65;color:var(--stage-muted);max-width:30em}
.actions{display:flex;align-items:center;flex-wrap:wrap;gap:26px;margin-top:36px}
.meter{margin-top:34px;color:var(--stage-ink);display:flex;gap:8px;align-items:center;white-space:nowrap}
.meter::before{content:"";flex:none;width:7px;height:7px;margin-right:2px;background:var(--filament);border-radius:50%;box-shadow:0 0 0 4px color-mix(in srgb,var(--filament) 22%,transparent)}
.meter-of{color:var(--stage-muted)}
.roll.layer-name-roll{display:none}
.lede.roll{display:grid;overflow:visible}
.lede.roll>span{white-space:normal}
.lede.roll>.in,.lede.roll>.out{animation-duration:.45s}

/* While the test runs, the status reads as live: a ping on the dot and a sweep across the word. */
.meter.is-running::before{animation:ping 1.4s var(--ease-out) infinite}
.meter.is-running .meter-word{background:linear-gradient(100deg,var(--stage-muted) 35%,var(--stage-ink) 50%,var(--stage-muted) 65%) 0 0/300% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:shimmer 1.8s linear infinite}


.js .copy-block[data-block="hero"] > *{animation:rise 1s var(--ease-out) both}
.js .copy-block[data-block="hero"] > :nth-child(2){animation-delay:.08s}
.js .copy-block[data-block="hero"] > :nth-child(3){animation-delay:.16s}
.js .copy-block[data-block="hero"] > :nth-child(4){animation-delay:.24s}

.layer-labels{position:absolute;inset:0;pointer-events:none}
.layer-labels li{position:absolute;left:0;top:0;width:min(320px,23vw);display:grid;grid-template-columns:auto 1fr auto;align-items:baseline;column-gap:12px;opacity:0;will-change:transform,opacity}
/* --em (0–1) is the layer's emphasis, driven continuously by scroll. */
.layer-num{color:color-mix(in srgb,var(--stage-ink) calc(var(--em,0) * 100%),var(--stage-muted))}
.layer-name{font:500 18px/1.2 var(--font-display);letter-spacing:-.02em}
.layer-labels p{position:absolute;top:100%;left:0;right:0;margin-top:8px;font-size:14px;line-height:1.55;color:var(--stage-muted);opacity:var(--em,0);transform:translateY(calc((1 - var(--em,0)) * -6px));filter:blur(calc((1 - var(--em,0)) * 3px))}
.layer-pass{display:inline-flex;align-items:center;gap:6px;color:var(--stage-ink);opacity:0;transform:translateX(-6px);transition:opacity .3s,transform .4s var(--ease-out)}
.layer-pass::before{content:"✓";font-size:12px}
.layer-labels li.is-passed .layer-pass{opacity:1;transform:none}

.stage-bar{position:absolute;left:var(--gutter);right:var(--gutter);bottom:0;height:60px;display:flex;align-items:center;justify-content:space-between;gap:24px;color:var(--stage-muted);border-top:1px solid color-mix(in srgb,var(--stage-ink) 12%,transparent)}
.fig{display:flex;gap:16px}
.phases{display:flex;gap:26px}
.phases span{display:flex;align-items:center;gap:8px;transition:color .3s}
.phases span::before{content:"";width:6px;height:6px;border:1px solid currentColor;transition:background-color .3s}
.phases span.is-current{color:var(--stage-ink)}
.phases span.is-current::before{background:currentColor}


.scene .ripple{fill:none;stroke:var(--stage-ink);stroke-width:1}
.scene .datum{fill:none;stroke:var(--stage-ink);stroke-opacity:.28;stroke-dasharray:4 5;stroke-width:1}
.scene .axis{stroke:var(--stage-ink);stroke-opacity:.6;stroke-width:1;stroke-dasharray:14 4 2 4}
.scene .beam-glow{stroke:var(--filament);stroke-width:10;stroke-linecap:round;opacity:calc(var(--beam, 0) * .22)}
.scene .beam-core{stroke:#ffd3b8;stroke-width:1.8;stroke-linecap:round;opacity:var(--beam, 0)}
.scene .head-glow{fill:var(--filament);opacity:.28}
.scene .head-core{fill:#fff1e6}
.scene .dimension path{fill:none;stroke:var(--stage-ink);stroke-opacity:.45;stroke-width:1}
.scene .dimension text{font-size:10px;letter-spacing:.12em;fill:var(--stage-muted)}
.scene .leader{fill:none;stroke:var(--stage-ink);stroke-width:1}
.scene .leader-dot{fill:var(--stage-bg);stroke:var(--stage-ink);stroke-width:1}


/* ---------- Statement ---------- */
.statement{padding-block:clamp(88px,10vh,160px);padding-inline:var(--gutter);border-bottom:1px solid var(--line)}
.statement-text{font:500 clamp(38px,6.2vw,104px)/1.02 var(--font-display);letter-spacing:-.05em;max-width:15em}
.statement-text strong{font-weight:500}
.statement-text .w{opacity:var(--o,.14);transition:opacity .15s linear}
.statement-text strong .w{color:var(--ink)}

/* ---------- Sections ---------- */
.section{padding-block:clamp(72px,7.2vh,116px);padding-inline:var(--gutter)}
.section-head{display:grid;grid-template-columns:1.4fr 1fr;column-gap:40px;align-items:end;margin-bottom:clamp(40px,4.4vh,68px)}
.section-head .kicker{grid-column:1/-1;margin-bottom:28px;color:var(--muted)}
.section-head h2{font:500 clamp(36px,4.4vw,70px)/1 var(--font-display);letter-spacing:-.045em;text-wrap:balance;max-width:12em}
.section-head p:not(.kicker){max-width:28em;color:var(--muted);font-size:17px;justify-self:end}

.offers{display:grid;grid-template-columns:repeat(4,1fr);border-top:1px solid var(--line-strong)}
.offer{position:relative;display:flex;flex-direction:column;padding:0 28px 34px;border-right:1px solid var(--line)}
.offer:first-child{padding-left:0}
.offer:last-child{border-right:0;padding-right:0}
.glyph{width:100%;height:220px;margin:6px 0 18px;overflow:visible}
.offer h3{font:500 25px/1.1 var(--font-display);letter-spacing:-.03em;margin-bottom:10px}
.offer p{color:var(--muted);font-size:15px;margin-bottom:26px}
.offer-link{margin-top:auto;font-weight:600;font-size:14px;display:inline-flex;gap:8px}
.offer-link span{transition:transform .3s var(--ease-out)}
.offer:hover .offer-link span{transform:translateX(4px)}

.begin{background:var(--paper-deep)}
.rail{position:relative;display:grid;grid-template-columns:repeat(4,1fr);gap:28px;padding-top:clamp(28px,3vh,48px)}
.rail::before{content:"";position:absolute;left:0;right:0;top:0;height:1px;background:var(--ink);transform-origin:left;transform:scaleX(var(--rail,0));transition:transform 1.4s var(--ease-out)}
.rail.is-in{--rail:1}
.rail li{position:relative;padding-right:20px;opacity:0;transform:translateY(14px);transition:opacity .7s,transform .9s var(--ease-out)}
.rail.is-in li{opacity:1;transform:none}
.rail.is-in li:nth-child(2){transition-delay:.12s}
.rail.is-in li:nth-child(3){transition-delay:.24s}
.rail.is-in li:nth-child(4){transition-delay:.36s}
.rail li::before{content:"";position:absolute;left:0;top:-53px;width:11px;height:11px;background:var(--paper-deep);border:1px solid var(--ink)}
.rail li::before{transition:background-color .3s}
.rail li:hover::before{background:var(--ink)}

/* Once the rail has drawn, one current runs along it and touches each step. */
.rail::after{content:"";position:absolute;left:0;top:-3.5px;width:48px;height:8px;border-radius:4px;background:radial-gradient(closest-side,#fff1e6,var(--filament) 45%,transparent);opacity:0;pointer-events:none}
.rail.is-in::after{animation:rail-run 1.8s 1.05s linear both}
.rail.is-in li::before{animation:rail-hit .9s backwards}
.rail.is-in li:nth-child(1)::before{animation-delay:1s}
.rail.is-in li:nth-child(2)::before{animation-delay:1.42s}
.rail.is-in li:nth-child(3)::before{animation-delay:1.86s}
.rail.is-in li:nth-child(4)::before{animation-delay:2.3s}
@keyframes rail-run{0%{left:-24px;opacity:0}6%{opacity:1}90%{opacity:1}100%{left:calc(100% - 24px);opacity:0}}
@keyframes rail-hit{0%,100%{background:var(--paper-deep);border-color:var(--ink)}25%{background:var(--filament);border-color:var(--filament)}}
.rail-num{color:var(--muted)}
.rail h3{font:500 25px/1.12 var(--font-display);letter-spacing:-.03em;margin:18px 0 10px}
.rail p{color:var(--muted);font-size:15px}

.audience-rows{border-top:1px solid var(--line-strong)}
.audience-row{display:grid;grid-template-columns:1.1fr 1fr 40px;align-items:center;gap:32px;padding:34px 0;border-bottom:1px solid var(--line);transition:padding .4s var(--ease-out)}
.audience-row h3{font:500 clamp(26px,2.6vw,40px)/1.1 var(--font-display);letter-spacing:-.035em}
.audience-row p{color:var(--muted)}
.row-arrow{font-size:22px;justify-self:end;transition:transform .4s var(--ease-out)}
.audience-row:hover{padding-left:14px}
.audience-row:hover .row-arrow{transform:translateX(6px)}

/* ---------- Closing ---------- */
.closing{position:relative;display:grid;grid-template-columns:1fr 1fr;align-items:center;min-height:86vh;padding-block:clamp(72px,7.2vh,100px);padding-inline:var(--gutter);background:var(--olive-deep);color:var(--cream);overflow:hidden}
.closing-cube{width:100%;height:min(70vh,640px);overflow:visible}
.closing-copy h2{font:500 clamp(44px,5.6vw,92px)/.98 var(--font-display);letter-spacing:-.05em;margin-bottom:26px}
.closing-copy p{color:#b7bca9;font-size:18px;margin-bottom:38px}


/* ---------- Responsive ---------- */
@media (max-width:1080px){
  .offers{grid-template-columns:repeat(2,1fr)}
  .offer{padding:0 24px 40px 0;border-right:0;border-bottom:1px solid var(--line)}
  .offer:nth-child(2n){padding-left:24px;border-left:1px solid var(--line)}
  .rail{grid-template-columns:repeat(2,1fr);row-gap:56px}
  .rail::before,.rail::after{display:none}
  .rail li{border-top:1px solid var(--ink);padding-top:22px}
  .rail li::before{display:none}
}
@media (max-width:1080px){
  /* Match the stable stage viewport so browser chrome cannot stretch the
     scroll timeline. The phone keeps one paper surface through every phase. */
  .assembly{height:360svh}
  .stage{isolation:isolate;background:var(--paper)}
  .night{display:none}
  .scene .beam-core,.scene .head-core{stroke:var(--filament)}
  .scene .head-core{fill:var(--filament)}
  .meter.is-running .meter-word{background:none;color:var(--stage-ink);animation:none}
  .meter.is-running::before{animation:none}
  .frontier-home .site-header:not(.is-over-dark){background:var(--paper)}
  .stage-copy{top:auto;bottom:64px;width:auto;right:var(--gutter);align-items:end}
  .copy-block h1{font-size:clamp(36px,10.5vw,52px);margin:14px 0}
  .copy-block h2{font-size:clamp(30px,8.6vw,44px);margin:14px 0}
  .copy-block h1 br,.copy-block h2 br{display:none}
  .copy-block .lede{font-size:15px}
  .copy-block[data-block="layers"] .lede{min-height:6.6em}
  .actions{margin-top:20px;gap:18px}
  .meter{margin-top:16px}
  .layer-labels{display:none}
  .stage-bar{height:44px}
  .stage-bar .fig{display:none}
  .phases{gap:16px;width:100%}
  .phases span{font-size:0;gap:0}
  .phases span.is-current{font-size:10px;gap:8px}
  .roll.layer-name-roll{display:inline-grid;margin-left:4px}
}
@media (max-width:760px){
  .section{padding-inline:var(--gutter)}
  .section-head{grid-template-columns:1fr;row-gap:20px;margin-bottom:48px}
  .section-head p{justify-self:start}
  .offers{grid-template-columns:1fr}
  .offer,.offer:nth-child(2n){padding:0 0 32px;border-left:0}
  .glyph{height:200px}
  .rail{grid-template-columns:1fr;row-gap:36px}
  .audience-row{grid-template-columns:1fr 32px;gap:8px 16px;padding:26px 0}
  .audience-row p{grid-row:2}
  .row-arrow{grid-row:1/3;grid-column:2}
  .closing{grid-template-columns:1fr;min-height:0;padding-inline:var(--gutter)}
  .closing-cube{height:300px;order:-1}
}

@media (prefers-reduced-motion:reduce){
  .rail::after{display:none}
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}
}


/* Commercial design revision. */
.rail li a.rail-link{display:block;position:relative;color:inherit;text-decoration:none;padding-right:30px}
.rail li a.rail-link h3{margin-top:18px;min-height:2.24em}  /* keeps the price row aligned when a title wraps to two lines */
.rail li a.rail-link:hover h3{text-decoration:underline;text-underline-offset:3px}
.rail li a.rail-link:focus-visible{outline:2px solid var(--ink);outline-offset:6px}
.rail-price{font:500 13px/1.3 var(--font-mono,monospace);letter-spacing:.06em;text-transform:uppercase;color:var(--ink);margin:0 0 10px}
.rail li a.rail-link .row-arrow{position:absolute;right:0;top:20px;opacity:0;transform:translateX(-4px);transition:opacity .25s,transform .25s}
.rail li a.rail-link:hover .row-arrow,.rail li a.rail-link:focus-visible .row-arrow{opacity:1;transform:none}

/* Commercial design revision. */
.fit-note,.build-terms{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:32px;margin-top:56px;padding-top:26px;border-top:1px solid var(--ink)}
.fit-note p,.build-terms p{margin:8px 0 0;font-size:15px;color:var(--muted)}
.fit-note .kicker,.build-terms .kicker{margin:0}
@media (max-width:760px){.fit-note,.build-terms{grid-template-columns:1fr;row-gap:24px}}

/* Step controls sit above the drawing caption, with native scrolling intact. */
.assembly-controls{position:absolute;right:var(--gutter);bottom:76px;z-index:5;width:250px;padding:10px;background:var(--stage-bg);color:var(--stage-ink);border:1px solid color-mix(in srgb,var(--stage-ink) 24%,transparent);border-radius:4px}
.assembly-step{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:0 2px 7px;font:500 12px/1.4 var(--font-body)}
.assembly-step .mono{font-size:10px;letter-spacing:.02em;white-space:nowrap}
.assembly-buttons{display:grid;grid-template-columns:1fr 1fr;gap:6px}
.assembly-buttons button{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:44px;padding:8px 10px;border:1px solid color-mix(in srgb,var(--stage-ink) 32%,transparent);border-radius:2px;background:transparent;font:600 12px/1.2 var(--font-body);cursor:pointer}
.assembly-buttons button:hover:not(:disabled){background:color-mix(in srgb,var(--stage-ink) 8%,transparent)}
.assembly-buttons button:disabled{opacity:.38;cursor:default}
.assembly :focus-visible{outline-color:var(--stage-ink)}
.frontier-home:not(.assembly-ready) .assembly{height:auto}
.frontier-home:not(.assembly-ready) .copy-block[data-block=hero]{opacity:1;visibility:visible;transform:none}
.frontier-home:not(.assembly-ready) .copy-block:not([data-block=hero]),.frontier-home:not(.assembly-ready) .layer-labels{display:none}
.frontier-home:not(.assembly-ready) .rail li{opacity:1;transform:none}
.frontier-home:not(.assembly-ready) .statement-text .w{opacity:1}
@media(max-width:1080px){
 .assembly-controls{bottom:52px;width:232px;padding:6px}
 .assembly-step{padding-bottom:4px;font-size:11px}
 .assembly-buttons button{min-height:44px}
 .stage-copy{bottom:152px}
}
@media(max-height:680px) and (max-width:760px){
 .copy-block .kicker{font-size:10px}
 .copy-block h1,.copy-block h2{font-size:30px;line-height:1.03;margin:10px 0}
 .copy-block .lede{font-size:14px;line-height:1.5}
 .copy-block .actions{gap:8px 14px;margin-top:14px}
 .copy-block .actions .button{min-height:44px;font-size:13px;padding:0 14px}
 .copy-block .actions .text-link{font-size:12px;min-height:32px}
 .stage-copy{bottom:142px}
}
/* Keep the controls in the caption area, clear of the lowest layer's description. */
@media(min-width:1081px){
 .assembly-controls{bottom:12px}
 .stage-bar{right:calc(var(--gutter) + 276px);height:100px;display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px 24px;align-content:center}
 .stage-bar .fig{white-space:nowrap}
 .stage-bar .phases{justify-content:flex-end;flex-wrap:wrap;gap:10px 18px}
}

/* A rotated phone uses two columns, with the same calm mobile timeline. */
@media(max-width:1080px) and (max-height:600px) and (orientation:landscape){
 .frontier-home{--header-h:56px}
 .stage-copy{top:68px;bottom:90px;width:48%;right:auto;align-items:center}
 .copy-block .kicker{font-size:9px}
 .copy-block h1,.copy-block h2{font-size:26px;line-height:1.04;margin:8px 0}
 .copy-block .lede{font-size:13px;line-height:1.45}
 .copy-block[data-block="layers"] .lede{min-height:5.8em}
 .copy-block .actions{gap:8px 14px;margin-top:12px}
 .copy-block .actions .button{min-height:40px;font-size:13px;padding:0 12px}
 .copy-block .actions .text-link{font-size:12px}
 .meter{margin-top:12px;font-size:10px}
 .assembly-controls{bottom:10px;width:232px}
 .stage-bar{right:calc(var(--gutter) + 256px);height:60px}
}
@media(max-width:1080px) and (max-height:360px) and (orientation:landscape){
 .stage-copy{bottom:12px}
 .stage-bar{display:none}
}
