@scope (.gl-original-loop) {/**
 * The approved design's stylesheet, ported verbatim from
 * design/bao-laboratory-ai_10.html so the rendering is identical.
 *
 * Two deliberate substitutions:
 *  - `.brand .logo` masked the platform-stack illustration (a 396 KB PNG
 *    embedded twice); it now masks the real BAO wordmark.
 *  - Google Fonts is replaced by self-hosted faces in fonts.css.
 *
 * Edit the design file and re-port rather than diverging here.
 */
/* ============================================================
   BAO LABORATORY — PHYSICAL AI
   Design system: "Porcelain & Instrument"
   Ink machine-bay bands bookend a cleanroom-porcelain body.
   One accent: serum amber, used as instrument light.
   ============================================================ */
:scope {
  --ink: #0c0d10;
  --ink-2: #13151b;
  --ink-3: #1b1e26;
  --porcelain: #f1efea;
  --porcelain-2: #e7e4dc;
  --paper: #faf9f6;
  --steel: #6e747e;
  --steel-2: #9ba0a8;
  --amber: #e8a03c;
  --amber-hi: #f2b961;
  --amber-deep: #8a5d14;
  --t-dark: #16171b;
  --t-dark-2: #4b4f57;
  --t-light: #edeae2;
  --t-light-2: #a9adb4;
  --line-d: rgba(13, 14, 17, 0.16);
  --line-d-soft: rgba(13, 14, 17, 0.09);
  --line-l: rgba(237, 234, 226, 0.17);
  --line-l-soft: rgba(237, 234, 226, 0.09);
  --disp: 'Archivo', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --mono: 'Fragment Mono', 'SFMono-Regular', Menlo, Consolas, monospace;
  --nav-h: 76px;
  --gutter: clamp(20px, 4.5vw, 72px);
  --max: 1520px;
  --ease: cubic-bezier(0.65, 0.05, 0.18, 1);
}
*,
*::before,
*::after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}
html {
  scroll-behavior: smooth;
  -webkit-text-size-adjust: 100%;
}
body {
  font-family: var(--disp);
  font-size: 16.5px;
  line-height: 1.6;
  background: var(--ink);
  color: var(--t-light);
  overflow-x: hidden;
  -webkit-font-smoothing: antialiased;
}
::selection {
  background: var(--amber);
  color: var(--ink);
}
img,
svg {
  display: block;
  max-width: 100%;
}
a {
  color: inherit;
  text-decoration: none;
}
button {
  font: inherit;
  color: inherit;
  background: none;
  border: 0;
  cursor: pointer;
}
:focus {
  outline: none;
}
:focus-visible {
  outline: 2px solid var(--amber);
  outline-offset: 3px;
  border-radius: 2px;
}
.skip-link {
  position: fixed;
  top: -60px;
  left: 16px;
  z-index: 400;
  background: var(--amber);
  color: var(--ink);
  padding: 0.7rem 1.2rem;
  border-radius: 4px;
  font-family: var(--mono);
  font-size: 0.75rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  transition: top 0.25s;
}
.skip-link:focus {
  top: 14px;
}

/* ---------- type utilities ---------- */
.disp {
  font-family: var(--disp);
  font-stretch: 116%;
  font-weight: 590;
  letter-spacing: -0.015em;
  line-height: 1.02;
}
.mono {
  font-family: var(--mono);
  font-weight: 400;
}
.eyebrow {
  display: flex;
  align-items: center;
  gap: 14px;
  font-family: var(--mono);
  font-size: 0.68rem;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--steel);
  white-space: nowrap;
}
.eyebrow::before {
  content: '';
  width: 26px;
  height: 1px;
  background: var(--amber);
  flex: none;
}
.dark .eyebrow {
  color: var(--steel-2);
}
.h-xl {
  font-size: clamp(2.7rem, 6.6vw, 6.4rem);
}
.h-lg {
  font-size: clamp(2.1rem, 4.4vw, 3.9rem);
}
.h-md {
  font-size: clamp(1.4rem, 2.4vw, 2rem);
}
.lede {
  font-size: clamp(1.02rem, 1.35vw, 1.22rem);
  line-height: 1.66;
  font-weight: 420;
  max-width: 56ch;
}
.dark .lede {
  color: var(--t-light-2);
}
.light .lede {
  color: var(--t-dark-2);
}
.line {
  display: block;
  overflow: hidden;
}
.line-in {
  display: block;
  will-change: transform;
}

/* ---------- layout ---------- */
.wrap {
  max-width: var(--max);
  margin: 0 auto;
  padding-left: var(--gutter);
  padding-right: var(--gutter);
}
section {
  position: relative;
  z-index: 2;
}
.light {
  background: var(--porcelain);
  color: var(--t-dark);
}
.dark {
  background: transparent;
  color: var(--t-light);
}
.dark.solid {
  background: var(--ink);
}
.sec-head {
  display: grid;
  gap: 26px;
  margin-bottom: clamp(44px, 6vw, 84px);
}
.sec-head .h-lg {
  max-width: 22ch;
}

/* ---------- grain + fixed stage ---------- */
#stage {
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.9s ease;
}
#stage.on {
  opacity: 1;
}
#stage video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 62% 50%;
  display: block;
  -webkit-mask-image: linear-gradient(90deg, transparent 0, #000 32%);
  mask-image: linear-gradient(90deg, transparent 0, #000 32%);
}
@media (max-width: 980px) {
  #stage video {
    height: 58svh;
    object-fit: contain;
    object-position: 50% 38%;
    opacity: 0.95;
    -webkit-mask-image: linear-gradient(180deg, #000 60%, transparent 98%);
    mask-image: linear-gradient(180deg, #000 60%, transparent 98%);
  }
}
.grain {
  position: fixed;
  inset: -40px;
  z-index: 60;
  pointer-events: none;
  opacity: 0.05;
  mix-blend-mode: overlay;
  background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="180" height="180"><filter id="n"><feTurbulence type="fractalNoise" baseFrequency="0.9" numOctaves="2"/></filter><rect width="100%" height="100%" filter="url(%23n)"/></svg>');
}
.no-webgl #stage {
  display: none;
}
.webgl-fallback {
  display: none;
  position: absolute;
  right: 6vw;
  top: 50%;
  transform: translateY(-50%);
  width: min(44vw, 520px);
  opacity: 0.5;
}
.no-webgl .webgl-fallback {
  display: block;
  animation: spin 40s linear infinite;
}
@keyframes spin {
  to {
    transform: translateY(-50%) rotate(360deg);
  }
}

/* ---------- preloader ---------- */
#boot {
  position: fixed;
  inset: 0;
  z-index: 300;
  background: var(--ink);
  display: none;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  gap: 26px;
}
.js #boot {
  display: flex;
}
#boot .glyph {
  width: 74px;
  height: 74px;
}
#boot .glyph circle {
  stroke-dasharray: 132;
  stroke-dashoffset: 132;
  animation: draw 1.1s var(--ease) forwards;
}
#boot .glyph path {
  opacity: 0;
  animation: tick 0.4s 0.8s forwards;
}
@keyframes draw {
  to {
    stroke-dashoffset: 0;
  }
}
@keyframes tick {
  to {
    opacity: 1;
  }
}
#boot .boot-word {
  font-family: var(--mono);
  font-size: 0.7rem;
  letter-spacing: 0.5em;
  text-transform: uppercase;
  color: var(--steel-2);
  padding-left: 0.5em;
}

/* ---------- nav ---------- */
#nav {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 120;
  height: var(--nav-h);
  transition:
    transform 0.45s var(--ease),
    background 0.4s,
    border-color 0.4s;
  border-bottom: 1px solid transparent;
}
#nav.scrolled {
  background: color-mix(in srgb, var(--ink) 82%, transparent);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  border-color: var(--line-l-soft);
}
#nav.on-light.scrolled {
  background: color-mix(in srgb, var(--porcelain) 84%, transparent);
  border-color: var(--line-d-soft);
}
#nav.hid {
  transform: translateY(-100%);
}
#nav .nav-in {
  max-width: var(--max);
  margin: 0 auto;
  height: 100%;
  padding: 0 var(--gutter);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
}
.brand {
  display: flex;
  align-items: center;
  gap: 13px;
  color: var(--t-light);
  transition: color 0.4s;
}
#nav.on-light .brand {
  color: var(--t-dark);
}
.brand .glyph {
  width: 30px;
  height: 30px;
  flex: none;
  transition: transform 0.8s var(--ease);
}
.brand:hover .glyph {
  transform: rotate(180deg);
}
.brand b {
  font-stretch: 120%;
  font-weight: 660;
  font-size: 1.16rem;
  letter-spacing: 0.02em;
  line-height: 1;
}
.brand .logo {
  display: block;
  height: 30px;
  aspect-ratio: 1.961;
  background: currentColor;
  mask: url('../assets/brand/wordmark.webp') center/contain no-repeat;
}
footer .brand .logo {
  height: 46px;
}
.nav-links {
  display: flex;
  align-items: center;
  gap: clamp(16px, 2.4vw, 34px);
  list-style: none;
}
.nav-links a:not(.btn) {
  font-family: var(--mono);
  font-size: 0.72rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--t-light-2);
  position: relative;
  padding: 6px 0;
  transition: color 0.3s;
}
#nav.on-light .nav-links a:not(.btn) {
  color: var(--t-dark-2);
}
.nav-links a:not(.btn)::after {
  content: '';
  position: absolute;
  left: 0;
  bottom: 0;
  height: 1px;
  width: 100%;
  background: var(--amber);
  transform: scaleX(0);
  transform-origin: right;
  transition: transform 0.4s var(--ease);
}
.nav-links a:not(.btn):hover {
  color: var(--amber);
}
.nav-links a:not(.btn):hover::after {
  transform: scaleX(1);
  transform-origin: left;
}
.ext::after {
  content: '↗';
  margin-left: 0.45em;
  font-family: var(--disp);
}
#progress {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: 2px;
  z-index: 130;
  background: var(--amber);
  transform: scaleX(0);
  transform-origin: left;
}
.burger {
  display: none;
  width: 44px;
  height: 44px;
  position: relative;
  z-index: 220;
}
.burger i {
  position: absolute;
  left: 11px;
  right: 11px;
  height: 1.6px;
  background: currentColor;
  transition: 0.35s var(--ease);
}
.burger i:nth-child(1) {
  top: 17px;
}
.burger i:nth-child(2) {
  top: 26px;
}
.burger.open i:nth-child(1) {
  top: 21.5px;
  transform: rotate(45deg);
}
.burger.open i:nth-child(2) {
  top: 21.5px;
  transform: rotate(-45deg);
}
#nav .burger {
  color: var(--t-light);
}
#nav.on-light .burger {
  color: var(--t-dark);
}
#nav.menu-open .burger {
  color: var(--t-light) !important;
}
#mmenu {
  position: fixed;
  inset: 0;
  z-index: 200;
  background: var(--ink);
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 0 var(--gutter);
  visibility: hidden;
  opacity: 0;
  transition:
    opacity 0.4s,
    visibility 0s 0.4s;
}
#mmenu.open {
  visibility: visible;
  opacity: 1;
  transition: opacity 0.4s;
}
#mmenu a {
  font-stretch: 118%;
  font-weight: 600;
  font-size: clamp(2rem, 9vw, 3.4rem);
  line-height: 1.28;
  color: var(--t-light);
  display: flex;
  align-items: baseline;
  gap: 18px;
  transform: translateY(26px);
  opacity: 0;
  transition:
    transform 0.6s var(--ease),
    opacity 0.6s,
    color 0.3s;
}
#mmenu.open a {
  transform: none;
  opacity: 1;
}
#mmenu a:hover {
  color: var(--amber);
}
#mmenu a small {
  font-family: var(--mono);
  font-size: 0.7rem;
  letter-spacing: 0.2em;
  color: var(--steel);
}
#mmenu .mm-foot {
  margin-top: 9vh;
  display: flex;
  gap: 26px;
  font-family: var(--mono);
  font-size: 0.7rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--steel-2);
}

/* ---------- buttons ---------- */
.btn {
  display: inline-flex;
  align-items: center;
  gap: 0.7rem;
  padding: 1rem 1.7rem;
  border-radius: 999px;
  font-family: var(--mono);
  font-size: 0.72rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  line-height: 1;
  position: relative;
  overflow: hidden;
  transition:
    transform 0.35s var(--ease),
    box-shadow 0.35s,
    color 0.35s,
    border-color 0.35s;
  white-space: nowrap;
}
.btn .arr {
  transition: transform 0.35s var(--ease);
}
.btn:hover .arr {
  transform: translateX(4px);
}
.btn-solid {
  background: var(--amber);
  color: var(--ink);
}
.btn-solid::before {
  content: '';
  position: absolute;
  inset: 0;
  background: var(--t-light);
  transform: translateY(102%);
  transition: transform 0.45s var(--ease);
  border-radius: inherit;
}
.btn-solid:hover::before {
  transform: translateY(0);
}
.btn-solid > * {
  position: relative;
  z-index: 1;
}
.btn-solid:hover {
  box-shadow: 0 14px 34px -12px rgba(232, 160, 60, 0.55);
}
.btn-line {
  border: 1px solid;
  color: inherit;
}
.dark .btn-line,
#nav .btn-line {
  border-color: var(--line-l);
  color: var(--t-light);
}
.light .btn-line {
  border-color: var(--line-d);
  color: var(--t-dark);
}
#nav.on-light .btn-line {
  border-color: var(--line-d);
  color: var(--t-dark);
}
.btn-line:hover {
  border-color: var(--amber);
  color: var(--amber);
}
#nav .btn {
  padding: 0.8rem 1.3rem;
}

/* ---------- hero ---------- */
#hero {
  min-height: 100svh;
  display: flex;
  align-items: center;
  padding-top: calc(var(--nav-h) + 4vh);
  padding-bottom: 12vh;
}
#hero .hero-grid {
  display: grid;
  grid-template-columns: minmax(0, 1.06fr) minmax(0, 0.94fr);
  gap: 40px;
  align-items: center;
  width: 100%;
}
#hero h1 {
  margin: 26px 0 30px;
  max-width: 12ch;
}
.hl {
  color: var(--amber);
}
.hero-ctas {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 16px;
  margin-top: 40px;
}
.hero-shop {
  font-family: var(--mono);
  font-size: 0.72rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--steel-2);
  border-bottom: 1px solid var(--line-l);
  padding-bottom: 4px;
  transition:
    color 0.3s,
    border-color 0.3s;
}
.hero-shop:hover {
  color: var(--amber);
  border-color: var(--amber);
}
.hero-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 52px;
}
.chip {
  font-family: var(--mono);
  font-size: 0.64rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--t-light-2);
  border: 1px solid var(--line-l);
  border-radius: 999px;
  padding: 0.55rem 0.95rem;
  display: inline-flex;
  align-items: center;
  gap: 0.55rem;
}
.chip::before {
  content: '';
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--amber);
  box-shadow: 0 0 8px rgba(232, 160, 60, 0.9);
}
.scroll-cue {
  position: absolute;
  left: var(--gutter);
  bottom: 34px;
  display: flex;
  align-items: center;
  gap: 14px;
  font-family: var(--mono);
  font-size: 0.62rem;
  letter-spacing: 0.26em;
  text-transform: uppercase;
  color: var(--steel);
}
.scroll-cue .tick {
  width: 1px;
  height: 44px;
  background: var(--line-l);
  position: relative;
  overflow: hidden;
}
.scroll-cue .tick::after {
  content: '';
  position: absolute;
  left: 0;
  top: -50%;
  width: 100%;
  height: 50%;
  background: var(--amber);
  animation: fall 2.1s var(--ease) infinite;
}
@keyframes fall {
  0% {
    top: -50%;
  }
  70%,
  100% {
    top: 110%;
  }
}

/* ---------- gap (light ledger) ---------- */
#gap {
  padding: clamp(90px, 13vw, 170px) 0;
}
#gap .cols {
  display: grid;
  grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
  gap: clamp(40px, 6vw, 110px);
  align-items: start;
}
#gap .sticky {
  position: sticky;
  top: calc(var(--nav-h) + 32px);
  display: grid;
  gap: 26px;
}
.ledger {
  border-top: 1px solid var(--line-d);
}
.ledger-row {
  display: grid;
  grid-template-columns: 118px 1fr;
  gap: 20px;
  padding: clamp(22px, 2.6vw, 34px) 0;
  border-bottom: 1px solid var(--line-d);
  transition: background 0.3s;
}
.ledger-row .tag {
  font-family: var(--mono);
  font-size: 0.62rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--amber-deep);
  padding-top: 0.5em;
  transition: color 0.3s;
}
.ledger-row h3 {
  font-stretch: 112%;
  font-weight: 580;
  font-size: clamp(1.15rem, 1.7vw, 1.5rem);
  letter-spacing: -0.01em;
  margin-bottom: 0.45rem;
  transition: transform 0.45s var(--ease);
}
.ledger-row p {
  color: var(--t-dark-2);
  font-size: 0.95rem;
  max-width: 52ch;
}
.ledger-row:hover h3 {
  transform: translateX(8px);
}
.ledger-row:hover .tag {
  color: var(--amber);
}
.gap-turn {
  margin-top: clamp(54px, 7vw, 96px);
  padding-top: 34px;
  border-top: 1px solid var(--line-d);
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 22px;
  align-items: start;
}
.gap-turn .glyph {
  width: 44px;
  height: 44px;
  color: var(--amber-deep);
}
.gap-turn p {
  font-stretch: 110%;
  font-weight: 540;
  font-size: clamp(1.25rem, 2.2vw, 1.9rem);
  line-height: 1.28;
  letter-spacing: -0.01em;
  max-width: 30ch;
}

/* ---------- the loop (pinned machine sequence) ---------- */
#technology {
  color: var(--t-light);
}
.loop-stage {
  position: relative;
  min-height: 100svh;
  display: flex;
  align-items: center;
  padding: calc(var(--nav-h) + 20px) 0 40px;
}
.loop-grid {
  display: grid;
  grid-template-columns: minmax(0, 0.98fr) minmax(0, 1.02fr);
  gap: 40px;
  width: 100%;
  align-items: center;
}
.loop-left {
  position: relative;
  min-height: min(66svh, 620px);
}
.loop-intro,
.loop-phase {
  max-width: 560px;
}
.loop-intro h2 {
  margin: 24px 0 18px;
  max-width: 14ch;
}
.loop-hint {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-top: 34px;
  font-family: var(--mono);
  font-size: 0.64rem;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--steel);
}
.loop-hint::after {
  content: '';
  width: 44px;
  height: 1px;
  background: var(--line-l);
  flex: none;
}
.phase-idx {
  display: flex;
  align-items: baseline;
  gap: 18px;
  margin-bottom: 18px;
}
.phase-idx .n {
  font-family: var(--mono);
  font-size: 0.78rem;
  letter-spacing: 0.2em;
  color: var(--amber);
}
.phase-idx .of {
  font-family: var(--mono);
  font-size: 0.62rem;
  letter-spacing: 0.2em;
  color: var(--steel);
}
.loop-phase h3 {
  font-stretch: 122%;
  font-weight: 640;
  font-size: clamp(2.6rem, 5.4vw, 4.6rem);
  line-height: 0.98;
  letter-spacing: -0.01em;
  text-transform: uppercase;
}
.loop-phase .tagline {
  font-stretch: 108%;
  font-weight: 520;
  font-size: clamp(1.1rem, 1.7vw, 1.45rem);
  color: var(--amber-hi);
  margin: 18px 0 14px;
  letter-spacing: -0.005em;
}
.loop-phase .body {
  color: var(--t-light-2);
  max-width: 46ch;
}
.phase-specs {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 1px;
  background: var(--line-l);
  border: 1px solid var(--line-l);
  margin-top: 30px;
  border-radius: 8px;
  overflow: hidden;
}
.phase-specs .kv {
  background: var(--ink);
  padding: 14px 16px;
  display: grid;
  gap: 6px;
}
.phase-specs .k {
  font-family: var(--mono);
  font-size: 0.58rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--steel);
}
.phase-specs .v {
  font-stretch: 112%;
  font-weight: 600;
  font-size: clamp(0.92rem, 1.25vw, 1.12rem);
  letter-spacing: -0.01em;
}
/* pinned-mode overrides applied by JS */
:where(:scope).js-pin .loop-intro,
:where(:scope).js-pin .loop-phase {
  position: absolute;
  top: 50%;
  left: 0;
  width: 100%;
}
:where(:scope).js-pin .loop-phase {
  opacity: 0;
  visibility: hidden;
}
:scope:not(.js-pin) .loop-left {
  display: grid;
  gap: 64px;
  min-height: 0;
}
:scope:not(.js-pin) .loop-stage {
  padding-bottom: 110px;
}
:scope:not(.js-pin) .loop-hint {
  display: none;
}
/* dial */
.loop-right {
  display: flex;
  justify-content: center;
  pointer-events: none;
}
.dial {
  position: relative;
  width: min(340px, 64vw);
  aspect-ratio: 1;
}
.dial::before {
  content: '';
  position: absolute;
  inset: -9%;
  border-radius: 50%;
  background: radial-gradient(
    circle,
    rgba(12, 13, 16, 0.78) 0%,
    rgba(12, 13, 16, 0.66) 62%,
    rgba(12, 13, 16, 0) 74%
  );
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
}
.dial svg,
.dial-read {
  position: relative;
}
.dial svg {
  width: 100%;
  height: 100%;
  overflow: visible;
}
.dial .track {
  stroke: rgba(237, 234, 226, 0.22);
  fill: none;
  stroke-width: 1.4;
}
.dial .prog {
  stroke: var(--amber);
  fill: none;
  stroke-width: 2.6;
  stroke-linecap: round;
  filter: drop-shadow(0 0 7px rgba(232, 160, 60, 0.7));
}
.dial .tickline {
  stroke: rgba(155, 160, 168, 0.8);
  stroke-width: 1.2;
}
.dial .stn {
  font-family: var(--mono);
  font-size: 10.5px;
  letter-spacing: 0.16em;
  fill: rgba(200, 203, 210, 0.85);
  transition: fill 0.3s;
  paint-order: stroke;
  stroke: rgba(12, 13, 16, 0.85);
  stroke-width: 3px;
}
.dial .stn.act {
  fill: var(--amber);
}
.dial .needle {
  stroke: var(--amber);
  stroke-width: 2;
  stroke-linecap: round;
}
.dial .hub {
  fill: var(--amber);
}
.dial-read {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 8px;
  text-align: center;
}
.dial-read .dr-n {
  font-family: var(--mono);
  font-size: 0.7rem;
  letter-spacing: 0.3em;
  color: var(--t-light-2);
}
.dial-read .dr-name {
  font-stretch: 122%;
  font-weight: 680;
  font-size: clamp(1.3rem, 2.1vw, 1.8rem);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--t-light);
}
.dial-read .dr-sub {
  font-family: var(--mono);
  font-size: 0.58rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--steel-2);
}
.loop-outro {
  text-align: center;
  padding: 0 0 clamp(90px, 12vw, 150px);
}
.loop-outro p {
  font-stretch: 114%;
  font-weight: 560;
  font-size: clamp(1.4rem, 2.6vw, 2.3rem);
  letter-spacing: -0.01em;
  line-height: 1.25;
  max-width: 26ch;
  margin: 0 auto;
}
.loop-outro em {
  font-style: normal;
  color: var(--amber);
}

/* ---------- platform ---------- */
#platform {
  padding: clamp(90px, 13vw, 170px) 0;
}
.plat-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(44px, 6vw, 100px);
  align-items: center;
  margin-bottom: clamp(70px, 9vw, 130px);
}
.stack-scene {
  perspective: 1300px;
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 420px;
}
.stack3d {
  position: relative;
  width: min(340px, 72vw);
  aspect-ratio: 1;
  transform-style: preserve-3d;
  transform: rotateX(57deg) rotateZ(-42deg);
}
.plate {
  position: absolute;
  inset: 0;
  border: 1px solid var(--line-d);
  border-radius: 12px;
  background: linear-gradient(135deg, rgba(250, 249, 246, 0.92), rgba(231, 228, 220, 0.88));
  transition:
    transform 0.6s var(--ease),
    border-color 0.4s,
    box-shadow 0.6s,
    background 0.4s;
  box-shadow: 0 2px 0 rgba(13, 14, 17, 0.05);
}
.plate::before {
  content: '';
  position: absolute;
  inset: 14px;
  border-radius: 8px;
  background:
    repeating-linear-gradient(0deg, var(--line-d-soft) 0 1px, transparent 1px 26px),
    repeating-linear-gradient(90deg, var(--line-d-soft) 0 1px, transparent 1px 26px);
  opacity: 0.7;
}
.plate .plabel {
  position: absolute;
  left: 18px;
  bottom: 14px;
  font-family: var(--mono);
  font-size: 0.58rem;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--steel);
}
.plate .pdot {
  position: absolute;
  right: 16px;
  top: 14px;
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--line-d);
  transition:
    background 0.3s,
    box-shadow 0.3s;
}
.plate.p0 {
  transform: translateZ(0);
}
.plate.p1 {
  transform: translateZ(58px);
}
.plate.p2 {
  transform: translateZ(116px);
}
.plate.act {
  border-color: var(--amber);
  background: linear-gradient(135deg, #fdf6e9, #f5e6c8);
}
.plate.act .pdot {
  background: var(--amber);
  box-shadow: 0 0 10px rgba(232, 160, 60, 0.8);
}
.plate.p0.act {
  transform: translateZ(26px);
}
.plate.p1.act {
  transform: translateZ(84px);
}
.plate.p2.act {
  transform: translateZ(142px);
}
#heroRobot {
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  transition: opacity 0.8s ease;
}
#heroRobot.hid {
  opacity: 0;
}
.stage-scrim {
  position: absolute;
  inset: 0;
  opacity: 0;
  pointer-events: none;
  background:
    linear-gradient(
      90deg,
      rgba(12, 13, 16, 0.9) 0%,
      rgba(12, 13, 16, 0.5) 24%,
      rgba(12, 13, 16, 0) 40%,
      rgba(12, 13, 16, 0) 60%,
      rgba(12, 13, 16, 0.42) 78%,
      rgba(12, 13, 16, 0.8) 100%
    ),
    linear-gradient(0deg, rgba(12, 13, 16, 0.55) 0%, rgba(12, 13, 16, 0) 26%);
}
#hud {
  position: absolute;
  left: 50%;
  top: 13%;
  transform: translateX(-50%);
  display: grid;
  gap: 8px;
  justify-items: center;
  text-align: center;
}
.hud-i {
  font-family: var(--mono);
  font-size: 10.5px;
  letter-spacing: 0.14em;
  color: rgba(237, 234, 226, 0.92);
  opacity: 0;
  white-space: nowrap;
  text-shadow: 0 1px 10px rgba(12, 13, 16, 0.9);
}
@media (max-width: 980px) {
  #hud {
    display: none;
  }
}
#heroRobot canvas {
  width: 100%;
  height: 100%;
  display: block;
  opacity: 0;
  transition: opacity 1s ease 0.15s;
}
#heroRobot.is-ready canvas {
  opacity: 1;
}
.hr-load {
  position: absolute;
  right: 30px;
  bottom: 24px;
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.2em;
  color: var(--steel);
}
#heroRobot.is-ready .hr-load {
  display: none;
}
.hr-telemetry {
  position: absolute;
  right: 30px;
  bottom: 24px;
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.08em;
  color: rgba(110, 116, 126, 0.9);
  opacity: 0;
  transition: opacity 0.6s ease 0.6s;
  white-space: pre;
}
#heroRobot.is-ready .hr-telemetry {
  opacity: 1;
}
.hr-stage {
  position: absolute;
  right: 30px;
  bottom: 42px;
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.16em;
  color: var(--amber);
  opacity: 0;
  transition: opacity 0.5s;
}
#heroRobot.is-ready .hr-stage {
  opacity: 0.9;
}
@media (max-width: 560px) {
  .hr-load,
  .hr-telemetry {
    right: 16px;
    bottom: 14px;
    font-size: 9px;
  }
  .hr-stage {
    right: 16px;
    bottom: 30px;
    font-size: 9px;
  }
}
/* scan portrait card */
#scanSymbol {
  position: absolute;
  left: 6vw;
  top: calc(var(--nav-h) + 26px);
  width: 206px;
  z-index: 2;
  pointer-events: none;
  opacity: 0;
  color: var(--t-light);
  will-change: opacity;
}
.ss-kicker {
  display: flex;
  align-items: center;
  gap: 9px;
  margin-bottom: 11px;
  font-family: var(--mono);
  font-size: 9px;
  letter-spacing: 0.22em;
  color: var(--amber);
}
.ss-kicker::before {
  content: '';
  width: 22px;
  height: 1px;
  background: var(--amber);
}
.ss-portrait {
  position: relative;
  width: 100%;
  aspect-ratio: 1;
  background: var(--ink);
  isolation: isolate;
}
.ss-photo {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  display: block;
  object-fit: cover;
  mix-blend-mode: lighten;
  filter: saturate(0.72) brightness(0.86) contrast(1.04);
  -webkit-mask-image: radial-gradient(
    ellipse 76% 84% at 48% 49%,
    #000 44%,
    rgba(0, 0, 0, 0.96) 59%,
    rgba(0, 0, 0, 0.48) 79%,
    transparent 100%
  );
  mask-image: radial-gradient(
    ellipse 76% 84% at 48% 49%,
    #000 44%,
    rgba(0, 0, 0, 0.96) 59%,
    rgba(0, 0, 0, 0.48) 79%,
    transparent 100%
  );
}
.ss-graphic {
  position: absolute;
  inset: 0;
  display: block;
  width: 100%;
  height: 100%;
  overflow: visible;
  z-index: 2;
}
.ss-frame {
  fill: rgba(232, 160, 60, 0.018);
  stroke: rgba(232, 160, 60, 0.5);
  stroke-width: 0.28;
  stroke-dasharray: 1.2 1.8;
}
.ss-layer {
  fill: none;
  stroke: rgba(237, 234, 226, 0.48);
  stroke-width: 0.2;
}
.ss-layer:nth-child(even) {
  stroke: rgba(200, 203, 210, 0.28);
}
.ss-node {
  fill: var(--amber);
}
.ss-node-muted {
  fill: rgba(237, 234, 226, 0.42);
}
.ss-sweep-line {
  stroke: var(--amber);
  stroke-width: 0.42;
}
.ss-sweep-glow {
  fill: url(#ssGlow);
}
.ss-label {
  font-family: var(--mono);
  font-size: 2.55px;
  letter-spacing: 0.12em;
  fill: rgba(200, 203, 210, 0.76);
  paint-order: stroke;
  stroke: rgba(12, 13, 16, 0.9);
  stroke-width: 0.6px;
}
.ss-copy {
  display: grid;
  gap: 5px;
  margin-top: 11px;
}
.ss-title {
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.18em;
  color: var(--t-light);
}
.ss-sub {
  font-family: var(--mono);
  font-size: 8.5px;
  letter-spacing: 0.1em;
  line-height: 1.5;
  color: var(--steel-2);
}
@media (max-width: 900px) {
  #scanSymbol {
    left: 16px;
    top: calc(var(--nav-h) + 14px);
    width: 150px;
  }
  .ss-sub,
  .ss-label {
    display: none;
  }
  .ss-kicker {
    margin-bottom: 7px;
    font-size: 7.5px;
    gap: 6px;
  }
  .ss-kicker::before {
    width: 14px;
  }
  .ss-copy {
    margin-top: 5px;
  }
}
#hero .wrap {
  position: relative;
  z-index: 2;
}
@media (pointer: fine) {
  #hero {
    cursor: none;
  }
  #hero a,
  #hero button {
    cursor: pointer;
  }
}
.kch {
  display: inline-block;
  font-variation-settings: 'wdth' 116;
  will-change: font-variation-settings, transform;
}
#lensCv {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  z-index: 1;
  pointer-events: none;
}
#lensFinding {
  position: absolute;
  z-index: 3;
  pointer-events: none;
  opacity: 0;
  transform: translateY(6px);
  transition:
    opacity 0.3s,
    transform 0.3s;
  max-width: 300px;
}
#lensFinding.on {
  opacity: 1;
  transform: none;
}
#lensFinding .fh {
  font-size: 15px;
  font-weight: 600;
  line-height: 1.4;
  letter-spacing: -0.01em;
  color: var(--t-light);
}
#lensFinding .fh b {
  color: var(--amber);
  font-weight: 600;
}
#lensFinding .ft {
  margin-top: 6px;
  font-family: var(--mono);
  font-size: 9.5px;
  letter-spacing: 0.12em;
  color: var(--steel-2);
}
#lensTray {
  position: absolute;
  right: 6vw;
  bottom: 12vh;
  z-index: 3;
  width: 262px;
  background: rgba(16, 18, 24, 0.82);
  border: 1px solid rgba(237, 234, 226, 0.14);
  border-radius: 14px;
  padding: 15px 17px;
  backdrop-filter: blur(10px);
}
#lensTray .th {
  font-family: var(--mono);
  font-size: 8.5px;
  letter-spacing: 0.2em;
  color: var(--steel-2);
  margin-bottom: 11px;
}
#lensTray .chips {
  display: flex;
  flex-wrap: wrap;
  gap: 7px;
  min-height: 28px;
}
#lensTray .chip {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  border: 1px solid rgba(237, 234, 226, 0.25);
  border-radius: 99px;
  padding: 4px 11px;
  font-size: 12px;
  color: var(--t-light);
  animation: chipIn 0.45s cubic-bezier(0.2, 0.9, 0.3, 1.2);
}
#lensTray .chip i {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--amber);
  box-shadow: 0 0 8px rgba(232, 160, 60, 0.8);
}
@keyframes chipIn {
  from {
    opacity: 0;
    transform: scale(0.6) translateY(6px);
  }
}
#lensTray .tf {
  display: block;
  margin-top: 11px;
  font-family: var(--mono);
  font-size: 9px;
  letter-spacing: 0.14em;
  color: var(--steel);
  text-decoration: none;
  pointer-events: none;
}
#lensTray .tf.done {
  color: var(--amber);
  pointer-events: auto;
  animation: trayPulse 1.6s ease-in-out infinite;
}
@keyframes trayPulse {
  0%,
  100% {
    opacity: 0.75;
  }
  50% {
    opacity: 1;
  }
}
#lensCap {
  position: absolute;
  left: 50%;
  bottom: 15vh;
  transform: translateX(-50%);
  z-index: 3;
  font-family: var(--mono);
  font-size: 10.5px;
  letter-spacing: 0.24em;
  color: var(--t-light);
  opacity: 0;
  transition: opacity 0.5s;
  white-space: nowrap;
  text-shadow: 0 1px 12px rgba(12, 13, 16, 0.9);
}
#lensCap.on {
  opacity: 0.95;
}
#lensCap b {
  color: var(--amber);
  font-weight: 400;
}
.kch {
  display: inline-block;
  transform-origin: 50% 82%;
  will-change: font-variation-settings, transform;
}
@media (max-width: 760px) {
  #lensTray {
    right: 14px;
    left: 14px;
    width: auto;
    bottom: 76px;
  }
  #lensCap {
    display: none;
  }
}
.stack-scene {
  position: relative;
}
.plate .schem {
  position: absolute;
  left: 16px;
  right: 16px;
  top: 16px;
  bottom: 38px;
  width: calc(100% - 32px);
  height: calc(100% - 54px);
  opacity: 0.45;
  transition: opacity 0.45s;
}
.plate.act .schem {
  opacity: 1;
}
#pulseCv {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  z-index: 6;
}
.rack {
  width: min(460px, 88vw);
}
.rack canvas {
  display: block;
  width: 100%;
  aspect-ratio: 0.82;
  height: auto;
  filter: drop-shadow(0 24px 60px rgba(12, 13, 16, 0.28));
}
/* blueprint (technical cutaway) */
.bp {
  width: min(660px, 100%);
  background:
    repeating-linear-gradient(0deg, rgba(12, 13, 16, 0.026) 0 1px, transparent 1px 24px),
    repeating-linear-gradient(90deg, rgba(12, 13, 16, 0.026) 0 1px, transparent 1px 24px),
    var(--paper);
  border: 1px solid var(--line-d);
  border-radius: 14px;
  padding: 18px;
  position: relative;
  overflow: hidden;
  isolation: isolate;
}
.bp::before,
.bp::after {
  content: '';
  position: absolute;
  width: 14px;
  height: 14px;
  border: 1px solid rgba(12, 13, 16, 0.3);
  z-index: 2;
}
.bp::before {
  left: 10px;
  top: 10px;
  border-right: 0;
  border-bottom: 0;
}
.bp::after {
  right: 10px;
  bottom: 10px;
  border-left: 0;
  border-top: 0;
}
.bp svg {
  width: 100%;
  height: auto;
  display: block;
  shape-rendering: geometricPrecision;
}
.bp .s {
  fill: none;
  stroke: #2a2d35;
  stroke-width: 1.2;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.bp .thin {
  stroke-width: 0.75;
}
.bp .dl {
  fill: none;
  stroke: #2a2d35;
  stroke-width: 0.75;
}
.bp .cl {
  stroke-dasharray: 8 4 1.5 4;
  stroke-width: 0.7;
  opacity: 0.5;
}
.bp .hid {
  stroke-dasharray: 4 3;
  opacity: 0.6;
}
.bp .amb {
  stroke: #c9891f;
}
.bp .ambf {
  fill: #e8a03c;
}
.bp .s,
.bp .dl,
.bp .hz {
  vector-effect: non-scaling-stroke;
}
.bp text {
  font-family: var(--mono);
  font-size: 8.8px;
  letter-spacing: 0.075em;
  fill: #343740;
}
.bp .fl {
  opacity: 0;
}
.bp .fl1 {
  fill: rgba(89, 99, 111, 0.11);
}
.bp .fl2 {
  fill: rgba(154, 107, 39, 0.105);
}
.bp .fl3 {
  fill: rgba(232, 160, 60, 0.1);
}
.bp g.g3,
.bp g.g2,
.bp g.g1 {
  opacity: 1;
}
.bp[data-f='2'] g.g2,
.bp[data-f='2'] g.g1 {
  opacity: 0.78;
}
.bp[data-f='1'] g.g3,
.bp[data-f='1'] g.g1 {
  opacity: 0.78;
}
.bp[data-f='0'] g.g3,
.bp[data-f='0'] g.g2 {
  opacity: 0.78;
}
.bp[data-f='2'] g.g3 .s,
.bp[data-f='2'] g.g3 .dl {
  stroke: #b0741b;
}
.bp[data-f='1'] g.g2 .s,
.bp[data-f='1'] g.g2 .dl {
  stroke: #9a6b27;
}
.bp[data-f='0'] g.g1 .s,
.bp[data-f='0'] g.g1 .dl {
  stroke: #59636f;
}
.bp[data-f='2'] g.g3 text {
  fill: #8a5d14;
}
.bp[data-f='1'] g.g2 text {
  fill: #805719;
}
.bp[data-f='0'] g.g1 text {
  fill: #4d5661;
}
.bp[data-f='2'] .fl3,
.bp[data-f='1'] .fl2,
.bp[data-f='0'] .fl1 {
  opacity: 1;
}
.bp .g1 .amb {
  stroke: #59636f;
}
.bp .g1 .ambf {
  fill: #59636f;
}
.bp .g2 .amb {
  stroke: #9a6b27;
}
.bp .g2 .ambf {
  fill: #9a6b27;
}
.bp #l1Fx .cartridge-live {
  fill: rgba(89, 99, 111, 0.16);
  stroke: #59636f;
}
.bp #l1Fx .calibration {
  fill: #4d5661;
}
.bp #l2Fx .signal-packet,
.bp #l2Fx .dose {
  fill: #9a6b27;
}
.bp #l2Fx .batch-response {
  fill: rgba(154, 107, 39, 0.14);
  stroke: #9a6b27;
}
.bp #l2Fx .calibration {
  fill: #805719;
}
.bp .hover-r {
  fill: transparent;
  pointer-events: all;
}
.bp g.ann {
  pointer-events: all;
}
.bp g.ann:hover text {
  fill: #8a5d14;
}
.bp g.ann:hover .dl {
  stroke: #b0741b;
  opacity: 1;
}
.bp .pring {
  fill: none;
  stroke: #c9891f;
  stroke-width: 1;
  opacity: 0;
  transform-box: fill-box;
  transform-origin: center;
}
.bp .motion-fx {
  pointer-events: none;
}
.bp .scan-wash {
  fill: url(#scanFade);
  opacity: 0;
}
.bp .scan-line {
  stroke: #c9891f;
  stroke-width: 1.1;
  opacity: 0;
  filter: url(#softGlow);
}
.bp .sensor-ray {
  stroke: #c9891f;
  stroke-width: 0.7;
  stroke-dasharray: 3 4;
  opacity: 0;
}
.bp .compute-pulse {
  fill: none;
  stroke: #c9891f;
  stroke-width: 1;
  opacity: 0;
  transform-box: fill-box;
  transform-origin: center;
}
.bp .signal-path {
  fill: none;
  stroke: #c9891f;
  stroke-width: 1;
  stroke-dasharray: 4 5;
  opacity: 0;
}
.bp .signal-packet {
  fill: #e8a03c;
  opacity: 0;
  filter: url(#softGlow);
}
.bp .cartridge-live {
  fill: rgba(232, 160, 60, 0.16);
  stroke: #c9891f;
  stroke-width: 0.8;
  opacity: 0;
}
.bp .dose {
  fill: #e8a03c;
  opacity: 0;
  filter: url(#softGlow);
}
.bp .batch-response {
  fill: rgba(232, 160, 60, 0.13);
  stroke: #c9891f;
  stroke-width: 0.7;
  opacity: 0;
}
.bp .calibration {
  font-size: 7.6px;
  fill: #8a5d14;
  opacity: 0;
}
.bp[data-running='true'] #bpLive {
  position: absolute;
  left: 18px;
  bottom: 13px;
  z-index: 3;
  font-family: var(--mono);
  font-size: 8px;
  letter-spacing: 0.13em;
  color: #8a5d14;
  opacity: 0.8;
  pointer-events: none;
}
@media (prefers-reduced-motion: reduce) {
  .bp .s {
    stroke-dasharray: none !important;
    stroke-dashoffset: 0 !important;
  }
  .bp .dl,
  .bp .hz,
  .bp text {
    opacity: 0.88 !important;
  }
  .bp .motion-fx {
    display: none;
  }
}
@media (max-width: 560px) {
  .bp {
    padding: 10px;
    border-radius: 10px;
  }
  .bp text {
    font-size: 9.2px;
    letter-spacing: 0.045em;
  }
  #bpLive {
    left: 12px;
    bottom: 9px;
    font-size: 7px;
  }
  .chips {
    width: 100%;
    display: grid;
    grid-template-columns: repeat(3, 1fr);
  }
  .chips button {
    padding: 7px 4px;
    font-size: 7.5px;
    letter-spacing: 0.08em;
  }
}

.software-accent {
  color: var(--amber-deep);
}
.pillars {
  display: grid;
  gap: 14px;
}
.pillar {
  --layer-color: #59636f;
  --layer-ink: #4d5661;
  --layer-shadow: rgba(89, 99, 111, 0.34);

  position: relative;
  overflow: hidden;
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 18px;
  text-align: left;
  padding: clamp(18px, 2vw, 26px);
  border: 1px solid var(--line-d);
  border-radius: 12px;
  background: var(--paper);
  transition:
    border-color 0.35s,
    transform 0.35s var(--ease),
    box-shadow 0.35s;
  align-items: start;
}
.pillar[data-pillar='1'] {
  --layer-color: #9a6b27;
  --layer-ink: #805719;
  --layer-shadow: rgba(154, 107, 39, 0.34);
}
.pillar[data-pillar='2'] {
  --layer-color: #c9891f;
  --layer-ink: #8a5d14;
  --layer-shadow: rgba(138, 93, 20, 0.42);
}
.pillar::before {
  content: '';
  position: absolute;
  inset: 0 auto 0 0;
  width: 3px;
  background: var(--layer-color);
  opacity: 0.38;
  transition:
    opacity 0.35s,
    width 0.35s var(--ease);
}
.pillar:hover {
  transform: translateX(6px);
}
.pillar[aria-pressed='true'] {
  border-color: var(--layer-color);
  box-shadow: 0 18px 40px -26px var(--layer-shadow);
}
.pillar[aria-pressed='true']::before {
  width: 4px;
  opacity: 1;
}
.pillar .pk {
  font-family: var(--mono);
  font-size: 0.62rem;
  letter-spacing: 0.18em;
  color: var(--layer-ink);
  padding-top: 0.35em;
}
.pillar h3 {
  font-stretch: 112%;
  font-weight: 600;
  font-size: clamp(1.05rem, 1.5vw, 1.3rem);
  margin-bottom: 0.4rem;
  letter-spacing: -0.01em;
}
.pillar p {
  color: var(--t-dark-2);
  font-size: 0.92rem;
}
/* datasheet */
.sheet {
  position: relative;
  border: 1px solid var(--line-d);
  border-radius: 14px;
  background: var(--paper);
  padding: clamp(26px, 3.4vw, 48px);
  margin-bottom: clamp(70px, 9vw, 130px);
}
.sheet .corner {
  position: absolute;
  width: 14px;
  height: 14px;
  border-color: var(--amber);
  border-style: solid;
}
.sheet .c1 {
  top: -1px;
  left: -1px;
  border-width: 2px 0 0 2px;
  border-radius: 14px 0 0 0;
}
.sheet .c2 {
  top: -1px;
  right: -1px;
  border-width: 2px 2px 0 0;
  border-radius: 0 14px 0 0;
}
.sheet .c3 {
  bottom: -1px;
  left: -1px;
  border-width: 0 0 2px 2px;
  border-radius: 0 0 0 14px;
}
.sheet .c4 {
  bottom: -1px;
  right: -1px;
  border-width: 0 2px 2px 0;
  border-radius: 0 0 14px 0;
}
.sheet-top {
  display: flex;
  justify-content: space-between;
  gap: 20px;
  align-items: baseline;
  margin-bottom: 26px;
  flex-wrap: wrap;
}
.sheet-top .doc {
  font-family: var(--mono);
  font-size: 0.62rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--steel);
}
.sheet-rows {
  border-top: 1px solid var(--line-d);
}
.srow {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: baseline;
  gap: 18px;
  padding: clamp(16px, 1.8vw, 22px) 0;
  border-bottom: 1px solid var(--line-d-soft);
  transition:
    background 0.25s,
    padding-left 0.35s var(--ease);
}
.srow:hover {
  padding-left: 12px;
  background: linear-gradient(90deg, rgba(232, 160, 60, 0.07), transparent 60%);
}
.srow .sk {
  font-family: var(--mono);
  font-size: 0.66rem;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--t-dark-2);
}
.srow .sv {
  font-stretch: 116%;
  font-weight: 620;
  font-size: clamp(1.15rem, 2vw, 1.7rem);
  letter-spacing: -0.015em;
  text-align: right;
}
.badge-row {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 26px;
}
.badge {
  font-family: var(--mono);
  font-size: 0.6rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  border: 1px solid var(--line-d);
  border-radius: 999px;
  padding: 0.5rem 0.9rem;
  color: var(--t-dark-2);
}
/* deployment */
.deploy {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 1px;
  background: var(--line-d);
  border: 1px solid var(--line-d);
  border-radius: 14px;
  overflow: hidden;
}
.dep {
  background: var(--porcelain);
  padding: clamp(24px, 3vw, 40px);
  display: grid;
  gap: 16px;
  align-content: start;
  transition: background 0.35s;
}
.dep:hover {
  background: var(--paper);
}
.dep .ic {
  width: 44px;
  height: 44px;
  color: var(--amber-deep);
}
.dep h3 {
  font-stretch: 112%;
  font-weight: 600;
  font-size: 1.15rem;
  letter-spacing: -0.01em;
}
.dep p {
  color: var(--t-dark-2);
  font-size: 0.93rem;
}
.dep .dtag {
  font-family: var(--mono);
  font-size: 0.58rem;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--steel);
}

/* ---------- science ---------- */
#science {
  padding: clamp(90px, 13vw, 170px) 0;
  background: var(--porcelain-2);
}
.sci-grid {
  display: grid;
  grid-template-columns: minmax(0, 0.94fr) minmax(0, 1.06fr);
  gap: clamp(44px, 6vw, 100px);
  align-items: center;
  margin-bottom: clamp(64px, 8vw, 110px);
}
.sci-copy {
  display: grid;
  gap: 22px;
}
.sci-copy .principle {
  font-stretch: 110%;
  font-weight: 550;
  font-size: clamp(1.2rem, 1.9vw, 1.6rem);
  line-height: 1.34;
  letter-spacing: -0.01em;
  border-left: 2px solid var(--amber);
  padding-left: 22px;
  max-width: 34ch;
}
.mol-card {
  position: relative;
  background: var(--ink-2);
  border-radius: 16px;
  padding: 18px;
  border: 1px solid rgba(13, 14, 17, 0.3);
  overflow: hidden;
}
.mol-card canvas {
  width: 100%;
  height: 320px;
  display: block;
  border-radius: 8px;
}
.mol-legend {
  display: flex;
  justify-content: space-between;
  gap: 14px;
  padding: 14px 6px 2px;
  font-family: var(--mono);
  font-size: 0.58rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--steel-2);
  flex-wrap: wrap;
}
.mol-legend b {
  color: var(--amber);
  font-weight: 400;
}
.mol-legend i {
  font-style: normal;
  color: var(--t-light-2);
}
.sci-freedom {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(40px, 6vw, 100px);
  align-items: start;
  padding-top: clamp(50px, 6vw, 80px);
  border-top: 1px solid var(--line-d);
}
.sci-freedom h3 {
  font-stretch: 114%;
  font-weight: 590;
  font-size: clamp(1.5rem, 2.6vw, 2.3rem);
  letter-spacing: -0.015em;
  line-height: 1.12;
  max-width: 18ch;
}
.sci-freedom .fr-copy {
  display: grid;
  gap: 16px;
  color: var(--t-dark-2);
}
.founder-note {
  margin-top: clamp(56px, 7vw, 90px);
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 24px;
  align-items: center;
  background: var(--paper);
  border: 1px solid var(--line-d);
  border-radius: 16px;
  padding: clamp(22px, 3vw, 36px);
}
.founder-note .m-tile {
  width: 78px;
  height: 78px;
  flex: none;
}
.founder-note blockquote {
  font-stretch: 110%;
  font-weight: 540;
  font-size: clamp(1.05rem, 1.7vw, 1.4rem);
  line-height: 1.35;
  letter-spacing: -0.01em;
  max-width: 44ch;
}
.founder-note cite {
  display: block;
  margin-top: 10px;
  font-style: normal;
  font-family: var(--mono);
  font-size: 0.62rem;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--steel);
}
.mol-foot {
  padding: 14px 6px 4px;
  font-size: 0.86rem;
  line-height: 1.6;
  color: var(--steel-2);
  border-top: 1px solid rgba(237, 234, 226, 0.08);
  margin-top: 12px;
}
.stack-scene {
  flex-direction: column;
  gap: 18px;
}
.bp-badges {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  justify-content: center;
}
.fc-intro {
  display: none;
}
.form-card.collapsed .fc-intro {
  display: grid;
  gap: 22px;
  justify-items: start;
}
.fc-intro p {
  color: var(--t-light-2);
  font-size: 0.95rem;
  line-height: 1.6;
  max-width: 46ch;
}
.form-card.collapsed form {
  display: none;
}
.std-row {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 26px;
}

/* ---------- company ---------- */
#company {
  padding: clamp(90px, 13vw, 170px) 0;
}
.stats {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 1px;
  background: var(--line-d);
  border: 1px solid var(--line-d);
  border-radius: 14px;
  overflow: hidden;
  margin-bottom: clamp(64px, 8vw, 110px);
}
.stat {
  background: var(--porcelain);
  padding: clamp(22px, 2.6vw, 34px);
  display: grid;
  gap: 8px;
  align-content: start;
}
.stat .sv {
  font-stretch: 120%;
  font-weight: 640;
  font-size: clamp(1.7rem, 3.4vw, 2.9rem);
  letter-spacing: -0.02em;
  line-height: 1;
  font-variant-numeric: tabular-nums;
}
.stat .sk {
  font-family: var(--mono);
  font-size: 0.6rem;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--t-dark-2);
}
.team-block {
  margin-bottom: clamp(56px, 7vw, 92px);
}
.team-block .tb-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 18px;
  margin-bottom: 26px;
  flex-wrap: wrap;
}
.team-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: clamp(14px, 1.6vw, 22px);
}
.person {
  border: 1px solid var(--line-d);
  border-radius: 14px;
  background: var(--paper);
  padding: clamp(16px, 1.8vw, 22px);
  display: grid;
  gap: 14px;
  transition:
    transform 0.4s var(--ease),
    box-shadow 0.4s,
    border-color 0.35s;
}
.person:hover {
  transform: translateY(-5px);
  border-color: rgba(138, 93, 20, 0.45);
  box-shadow: 0 24px 44px -30px rgba(13, 14, 17, 0.4);
}
.m-tile {
  width: 64px;
  height: 64px;
  border-radius: 12px;
  background: var(--ink-2);
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}
.m-tile::before {
  content: '';
  position: absolute;
  inset: -40%;
  background: repeating-conic-gradient(
    from 0deg,
    rgba(237, 234, 226, 0.07) 0 1deg,
    transparent 1deg 7deg
  );
}
.m-tile b {
  position: relative;
  font-stretch: 122%;
  font-weight: 640;
  font-size: 1.1rem;
  letter-spacing: 0.05em;
  color: var(--amber);
}
.person h3 {
  font-stretch: 110%;
  font-weight: 600;
  font-size: 1.02rem;
  letter-spacing: -0.005em;
}
.person .role {
  font-family: var(--mono);
  font-size: 0.6rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--amber-deep);
  margin-top: 4px;
}
.person p {
  color: var(--t-dark-2);
  font-size: 0.86rem;
  line-height: 1.5;
}
/* timeline */
.tl {
  position: relative;
  border-top: 1px solid var(--line-d);
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: clamp(18px, 2.4vw, 32px);
  padding-top: 34px;
  margin-bottom: clamp(64px, 8vw, 110px);
}
.tl-item {
  position: relative;
  display: grid;
  gap: 10px;
  align-content: start;
}
.tl-item::before {
  content: '';
  position: absolute;
  top: -39px;
  left: 2px;
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: var(--porcelain);
  border: 2px solid var(--amber);
  transition: background 0.3s;
}
.tl-item:hover::before {
  background: var(--amber);
}
.tl-item .yr {
  font-family: var(--mono);
  font-size: 0.72rem;
  letter-spacing: 0.24em;
  color: var(--amber-deep);
}
.tl-item h3 {
  font-stretch: 112%;
  font-weight: 600;
  font-size: 1.1rem;
  letter-spacing: -0.01em;
}
.tl-item p {
  color: var(--t-dark-2);
  font-size: 0.9rem;
}
/* press marquee */
.press {
  border-top: 1px solid var(--line-d);
  border-bottom: 1px solid var(--line-d);
  padding: 24px 0 32px;
  display: grid;
  gap: 30px;
}
.press-head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 20px;
  font-family: var(--mono);
  font-size: 0.6rem;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--steel);
}
.press-index {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 18px 34px;
  flex-wrap: wrap;
}
.press-index li {
  display: flex;
  align-items: baseline;
  gap: 13px;
}
.press-index li i {
  font-style: normal;
  font-family: var(--mono);
  font-size: 0.6rem;
  letter-spacing: 0.14em;
  color: var(--steel);
  transition: color 0.35s;
}
.press-index li i.lit {
  color: var(--amber);
}
.pname {
  font-stretch: 120%;
  font-weight: 650;
  font-size: clamp(1.5rem, 2.9vw, 2.5rem);
  letter-spacing: 0.04em;
  white-space: nowrap;
  color: rgba(23, 24, 28, 0.86);
}
html.js .press.ghost .pname {
  color: rgba(23, 24, 28, 0.08);
  -webkit-text-stroke: 1px rgba(42, 45, 53, 0.5);
}
@media (max-width: 760px) {
  .press-index {
    display: grid;
    grid-template-columns: 1fr 1fr;
  }
}

/* ---------- partner ---------- */
#partner {
  background: var(--ink);
  color: var(--t-light);
  padding: clamp(96px, 13vw, 180px) 0;
  position: relative;
  overflow: hidden;
}
#partner::before {
  content: '';
  position: absolute;
  inset: 0;
  background: radial-gradient(900px 480px at 82% 8%, rgba(232, 160, 60, 0.09), transparent 62%);
  pointer-events: none;
}
.part-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(44px, 6vw, 110px);
  align-items: start;
  position: relative;
}
.tracks {
  display: grid;
  margin-top: 38px;
  border-top: 1px solid var(--line-l);
}
.track {
  display: grid;
  grid-template-columns: auto 1fr auto;
  gap: 20px;
  align-items: center;
  padding: 22px 0;
  border-bottom: 1px solid var(--line-l);
  transition: padding-left 0.35s var(--ease);
}
.track:hover {
  padding-left: 10px;
}
.track .tk {
  font-family: var(--mono);
  font-size: 0.62rem;
  letter-spacing: 0.2em;
  color: var(--amber);
}
.track h3 {
  font-stretch: 112%;
  font-weight: 590;
  font-size: clamp(1.05rem, 1.6vw, 1.35rem);
  letter-spacing: -0.01em;
}
.track p {
  color: var(--t-light-2);
  font-size: 0.9rem;
  margin-top: 4px;
  max-width: 44ch;
}
.track .arr {
  color: var(--steel-2);
  transition:
    transform 0.35s var(--ease),
    color 0.3s;
}
.track:hover .arr {
  transform: translateX(6px);
  color: var(--amber);
}
.form-card {
  background: var(--ink-2);
  border: 1px solid var(--line-l);
  border-radius: 18px;
  padding: clamp(24px, 3vw, 42px);
}
.form-card .fc-head {
  font-family: var(--mono);
  font-size: 0.62rem;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--steel-2);
  display: flex;
  justify-content: space-between;
  gap: 14px;
  margin-bottom: 26px;
}
.chiprow {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-bottom: 26px;
}
.chiprow label {
  cursor: pointer;
}
.chiprow input {
  position: absolute;
  opacity: 0;
  pointer-events: none;
}
.chiprow .c {
  display: inline-block;
  font-family: var(--mono);
  font-size: 0.62rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  border: 1px solid var(--line-l);
  border-radius: 999px;
  padding: 0.62rem 1rem;
  color: var(--t-light-2);
  transition: all 0.3s;
}
.chiprow input:checked + .c {
  background: var(--amber);
  border-color: var(--amber);
  color: var(--ink);
}
.chiprow input:focus-visible + .c {
  outline: 2px solid var(--amber);
  outline-offset: 3px;
}
.field {
  display: grid;
  gap: 8px;
  margin-bottom: 20px;
}
.field label {
  font-family: var(--mono);
  font-size: 0.6rem;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--steel-2);
}
.field input,
.field textarea {
  width: 100%;
  background: transparent;
  border: 0;
  border-bottom: 1px solid var(--line-l);
  color: var(--t-light);
  font-family: var(--disp);
  font-size: 1rem;
  padding: 0.65rem 2px;
  transition: border-color 0.3s;
  border-radius: 0;
}
.field textarea {
  resize: vertical;
  min-height: 110px;
  line-height: 1.55;
}
.field input:focus,
.field textarea:focus {
  outline: none;
  border-color: var(--amber);
}
.field .err {
  font-family: var(--mono);
  font-size: 0.6rem;
  letter-spacing: 0.12em;
  color: #e4795a;
  display: none;
}
.field.bad input,
.field.bad textarea {
  border-color: #e4795a;
}
.field.bad .err {
  display: block;
}
.f2 {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 20px;
}
.form-foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 18px;
  margin-top: 8px;
  flex-wrap: wrap;
}
.form-foot small {
  font-family: var(--mono);
  font-size: 0.58rem;
  letter-spacing: 0.1em;
  color: var(--steel);
  max-width: 30ch;
  line-height: 1.6;
}
.form-foot small a {
  color: var(--steel-2);
  text-decoration: underline;
  text-underline-offset: 3px;
}
.form-ok {
  display: none;
  text-align: center;
  padding: 40px 10px;
  gap: 18px;
}
.form-ok .glyph {
  width: 56px;
  height: 56px;
  margin: 0 auto 18px;
  color: var(--amber);
}
.form-ok h3 {
  font-stretch: 114%;
  font-weight: 600;
  font-size: 1.4rem;
  margin-bottom: 10px;
}
.form-ok p {
  color: var(--t-light-2);
  font-size: 0.95rem;
}
.form-card.sent form {
  display: none;
}
.form-card.sent .form-ok {
  display: block;
}

/* ---------- footer ---------- */
footer {
  background: var(--ink);
  color: var(--t-light);
  position: relative;
  z-index: 2;
  border-top: 1px solid var(--line-l-soft);
}
.shop-bridge {
  margin: 0 auto;
  max-width: var(--max);
  padding: clamp(64px, 8vw, 110px) var(--gutter) 0;
}
.shop-card {
  position: relative;
  border: 1px solid var(--line-l);
  border-radius: 20px;
  padding: clamp(30px, 4.5vw, 64px);
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 30px;
  align-items: center;
  overflow: hidden;
  background: linear-gradient(120deg, var(--ink-2), var(--ink) 70%);
}
.shop-card::before {
  content: '';
  position: absolute;
  right: -90px;
  top: -90px;
  width: 300px;
  height: 300px;
  border-radius: 50%;
  border: 1px dashed rgba(232, 160, 60, 0.35);
  animation: spin2 34s linear infinite;
}
@keyframes spin2 {
  to {
    transform: rotate(360deg);
  }
}
.shop-card h2 {
  font-stretch: 116%;
  font-weight: 610;
  font-size: clamp(1.6rem, 3.2vw, 2.7rem);
  letter-spacing: -0.015em;
  line-height: 1.1;
  max-width: 20ch;
  margin: 14px 0 12px;
}
.shop-card p {
  color: var(--t-light-2);
  max-width: 52ch;
}
.foot-cta {
  max-width: var(--max);
  margin: 0 auto;
  padding: clamp(60px, 8vw, 110px) var(--gutter) clamp(40px, 5vw, 70px);
}
.fc-eyebrow {
  font-family: var(--mono);
  font-size: 0.62rem;
  letter-spacing: 0.3em;
  text-transform: uppercase;
  color: var(--steel);
  margin-bottom: 18px;
}
.fc-link {
  display: inline-flex;
  align-items: center;
  gap: 0.35em;
  text-decoration: none;
  line-height: 1.02;
}
.fcg {
  font-stretch: 122%;
  font-weight: 720;
  font-size: clamp(2.4rem, 7vw, 5.4rem);
  letter-spacing: -0.015em;
  color: rgba(237, 234, 226, 0.92);
  white-space: nowrap;
}
html.js .fc-link.ghost .fcg {
  color: rgba(237, 234, 226, 0.05);
  -webkit-text-stroke: 1px rgba(237, 234, 226, 0.4);
}
.fc-arr {
  font-size: clamp(2rem, 5.4vw, 4.2rem);
  color: var(--amber);
  transform: translateX(0);
  transition: transform 0.45s var(--ease);
}
.fc-link:hover .fc-arr {
  transform: translateX(0.25em);
}
.tblock {
  max-width: var(--max);
  margin: 0 auto clamp(36px, 5vw, 60px);
  width: calc(100% - 2 * var(--gutter));
  border: 1px solid var(--line-l);
}
.tb-spec {
  display: flex;
  justify-content: space-between;
  gap: 18px;
  flex-wrap: wrap;
  padding: 12px 22px;
  border-bottom: 1px solid var(--line-l);
  font-family: var(--mono);
  font-size: 0.58rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--steel);
}
.tb-cells {
  display: grid;
  grid-template-columns: minmax(0, 1.5fr) repeat(3, minmax(0, 0.8fr));
}
.tb-cell {
  padding: 26px 22px 30px;
}
.tb-cell + .tb-cell {
  border-left: 1px solid var(--line-l-soft);
}
.tb-cell h4 {
  font-family: var(--mono);
  font-size: 0.6rem;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--steel);
  margin-bottom: 18px;
  font-weight: 400;
}
.tb-cell ul {
  list-style: none;
  display: grid;
  gap: 12px;
  margin: 0;
  padding: 0;
}
.tb-cell ul a {
  color: var(--t-light-2);
  font-size: 0.92rem;
  transition:
    color 0.3s,
    padding-left 0.3s;
}
.tb-cell ul a:hover {
  color: var(--amber);
  padding-left: 6px;
}
.tb-brand .brand {
  color: var(--porcelain);
  display: inline-block;
}
.tb-brand .logo {
  width: 132px;
}
.tb-brand p {
  color: var(--steel-2);
  font-size: 0.9rem;
  max-width: 30ch;
  margin-top: 18px;
}
.foot-loop {
  font-family: var(--mono);
  font-size: 0.6rem;
  letter-spacing: 0.2em;
  color: var(--steel);
  margin-top: 22px;
}
.foot-loop i {
  font-style: normal;
  color: var(--amber);
  padding: 0 2px;
}
.foot-bottom {
  max-width: var(--max);
  margin: 0 auto;
  padding: 22px var(--gutter) 30px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 16px;
  flex-wrap: wrap;
  font-family: var(--mono);
  font-size: 0.6rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--steel);
  border-top: 1px solid var(--line-l-soft);
}
.fb-links {
  display: inline-flex;
  align-items: center;
  gap: 14px;
}
.fb-links i {
  font-style: normal;
  opacity: 0.5;
}
.foot-bottom a {
  color: var(--steel);
  transition: color 0.3s;
}
.foot-bottom a:hover {
  color: var(--amber);
}
.foot-mega {
  max-width: var(--max);
  margin: 0 auto;
  padding: clamp(20px, 4vw, 44px) var(--gutter) 26px;
  user-select: none;
}
.mega-svg {
  display: block;
  width: 100%;
  height: auto;
}
.mega-svg text {
  font-family: var(--disp);
  font-weight: 700;
  font-stretch: 125%;
  font-size: 118px;
  letter-spacing: 0.01em;
}
.mg-ghost {
  fill: none;
  stroke: rgba(237, 234, 226, 0.2);
  stroke-width: 1.1;
  vector-effect: non-scaling-stroke;
}
.mg-fill {
  fill: rgba(237, 234, 226, 0.36);
  stroke: none;
}

/* ---------- reveal defaults (JS enhances) ---------- */
[data-reveal] {
  will-change: transform, opacity;
}

/* ---------- responsive ---------- */
@media (max-width: 1100px) {
  .tb-cells {
    grid-template-columns: 1fr 1fr;
  }
  .tb-cell:nth-child(3) {
    border-left: 0;
  }
  .tb-cell {
    border-top: 1px solid var(--line-l-soft);
  }
  .tb-cell:nth-child(-n + 2) {
    border-top: 0;
  }
  .team-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  .stats {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  .tl {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    row-gap: 44px;
  }
}
@media (max-width: 980px) {
  .nav-links {
    display: none;
  }
  .burger {
    display: block;
  }
  #hero .hero-grid,
  .loop-grid,
  .plat-grid,
  .sci-grid,
  .sci-freedom,
  .part-grid,
  #gap .cols {
    grid-template-columns: 1fr;
  }
  #gap .sticky {
    position: static;
  }
  #hero {
    padding-bottom: 16vh;
  }
  #hero .hero-grid {
    align-content: start;
    gap: 0;
  }
  .loop-right {
    order: -1;
    margin-bottom: 10px;
  }
  .dial {
    width: min(220px, 58vw);
  }
  .loop-left {
    min-height: min(60svh, 560px);
  }
  .stack-scene {
    min-height: 340px;
  }
  .deploy {
    grid-template-columns: 1fr;
  }
  .shop-card {
    grid-template-columns: 1fr;
  }
  .fcg {
    white-space: normal;
  }
  .f2 {
    grid-template-columns: 1fr;
  }
  .phase-specs {
    grid-template-columns: 1fr;
    border-radius: 10px;
  }
  .ledger-row {
    grid-template-columns: 1fr;
    gap: 6px;
  }
  .founder-note {
    grid-template-columns: 1fr;
  }
}
@media (max-width: 980px) {
  :where(:scope).js-pin .dial {
    width: min(176px, 46vw);
  }
  :where(:scope).js-pin .loop-left {
    min-height: min(58svh, 540px);
  }
  :where(:scope).js-pin .loop-stage {
    padding-top: calc(var(--nav-h) + 8px);
  }
  :where(:scope).js-pin .loop-right {
    margin-bottom: 0;
  }
  :where(:scope).js-pin .phase-specs {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
  :where(:scope).js-pin .phase-specs .kv {
    padding: 10px 9px;
  }
  :where(:scope).js-pin .phase-specs .v {
    font-size: 0.82rem;
  }
  :where(:scope).js-pin .loop-phase h3 {
    font-size: clamp(2rem, 9vw, 2.6rem);
  }
  :where(:scope).js-pin .loop-phase .tagline {
    font-size: 1.05rem;
    margin: 12px 0 10px;
  }
  :where(:scope).js-pin .loop-phase .body {
    font-size: 0.92rem;
  }
  :where(:scope).js-pin .loop-intro h2 {
    font-size: clamp(1.7rem, 7vw, 2.4rem);
  }
}
@media (max-width: 560px) {
  :scope {
    --nav-h: 64px;
  }
  .stats {
    grid-template-columns: 1fr;
  }
  .tl {
    grid-template-columns: 1fr;
  }
  .team-grid {
    grid-template-columns: 1fr;
  }
  .tb-cells {
    grid-template-columns: 1fr;
  }
  .tb-cell + .tb-cell {
    border-left: 0;
  }
  .scroll-cue {
    display: none;
  }
  .loop-phase h3 {
    font-size: clamp(2.2rem, 11vw, 2.8rem);
  }
}
/* ---------- reduced motion ---------- */
@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
  #stage {
    transition: none;
  }
}

/* JS-era helpers */
section,
footer {
  scroll-margin-top: calc(var(--nav-h) - 10px);
}
#technology {
  scroll-margin-top: 0;
}
body.menu-lock {
  overflow: hidden;
}

/**
 * Corrections to measured defects in the ported design.
 *
 * design.css is a verbatim copy of the approved design and must stay that way
 * so it can be re-ported when the design file changes. Everything in THIS file
 * is a correction to a defect in that copy, kept separate so it is obvious
 * what deviates and trivially removable if the design team disagrees.
 *
 * Nothing here changes an intended visual decision. Each rule is a bug fix
 * with the measurement that motivated it. That promise is the whole point of
 * the file, so work that is not a bug fix does not belong here: post-design
 * feature work lives in instruments.css, which is loaded after this one.
 */

/* ------------------------------------------------------------------
   1. Horizontal overflow on every phone width.

   `.eyebrow` is pinned to `white-space: nowrap`, so the 40-character
   Technology eyebrow has a min-content width wider than a phone. That widens
   its grid track, the document, and every section: the document measured a
   constant 527px against a 390–412px viewport. Visible damage — the burger
   sat off-screen and could not be tapped, and section backgrounds stopped
   short of the text sitting on them.

   These lines wrap instead. On wide screens they fit on one line anyway, so
   nothing changes there.
   ------------------------------------------------------------------ */
.eyebrow {
  white-space: normal;
  text-wrap: balance;
}

@media (max-width: 760px) {
  /* A grid track's automatic minimum is its content's min-content width, so
     `nowrap` press names refuse to shrink. Both rules are needed: min-width
     releases the track, wrapping releases the text. */
  .press-index li {
    min-width: 0;
  }

  .pname {
    white-space: normal;
    overflow-wrap: anywhere;
  }
}

/* A fixed overlay escapes body's overflow-x, so oversized content inside it
   widens the whole document even while the menu is closed and invisible. */
#mmenu {
  overflow: hidden auto;
}

#mmenu a {
  flex-wrap: wrap;
  max-width: 100%;
}

@media (max-width: 420px) {
  #mmenu a {
    font-size: clamp(1.7rem, 8vw, 3.4rem);
  }
}
/* ------------------------------------------------------------------
   2. Contrast below WCAG AA.

   --steel (#6E747E) fails on BOTH grounds for the small mono labels it is used
   for: 4.12:1 on --ink and 4.10:1 on --porcelain, against AA's 4.5:1. No single
   grey clears 4.5:1 on both an almost-black and an almost-white ground, so the
   token is redefined per ground and inherits to every use.

   Measured replacements: #868C95 gives 5.74:1 on ink, #5A5F68 gives 5.59:1 on
   porcelain. Both stay a tonal step away from --steel-2, so the hierarchy the
   design draws between the two greys survives.
   ------------------------------------------------------------------ */
:scope {
  --steel: #868c95;
}

.light {
  --steel: #5a5f68;
}

/* #E4795A on ink is 3.8:1 — the one colour that has to be readable when a
   form goes wrong. */
.field .err {
  color: #f0937a;
}

.field.bad input,
.field.bad textarea {
  border-color: #f0937a;
}
/* ------------------------------------------------------------------
   3. Keyboard and assistive-technology support.

   The honeypot is added by the enhancement script; it must be imperceptible
   without being `display: none`, which bots skip.
   ------------------------------------------------------------------ */
.hp-field {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

/* The footer's column headings were <h4> directly after an <h2>, skipping a
   level. They are now <h3>; this keeps their original appearance. */
.tb-cell h3 {
  font-family: var(--mono);
  font-size: 0.6rem;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--steel);
  margin-bottom: 18px;
  font-weight: 400;
}
/* ------------------------------------------------------------------
   4. Headline amplifier typography.

   The reference splits the h1 into per-character spans styled
   `display: inline-block`. Inline-blocks suppress kerning, render word
   spaces ambiguously, and are legal line-break points — so the headline
   rendered "Althatma / kes things." at rest, with a break inside "makes".

   `display: inline` restores native shaping: kerning applies, spaces are
   real spaces, and breaks can only happen at them. `font-variation-settings`
   (the amplifier's actual effect) works on inline boxes; only the 7% scale
   pop is lost, since transforms don't apply to inline — an accepted trade.
   Pairs with [patch:headline-split-on-intent] in design-motion.js.
   ------------------------------------------------------------------ */
.kch {
  display: inline;
}
/* ------------------------------------------------------------------
   6. Mobile hero — the formula tray buried the chips.

   The reference absolute-positions the tray full-width at bottom: 76px on
   small screens, directly over the chips row ("<5 MIN PER BATCH" was
   completely hidden behind it). The hero already grows with its content, so
   reserving real vertical space for the tray and dropping it into that
   reserve keeps every element visible. The scroll cue would now sit inside
   the tray's band (it only rendered between 560–760px anyway), and the tray
   itself invites the same gesture — so it is retired on those widths.
   ------------------------------------------------------------------ */
@media (max-width: 760px) {
  #hero {
    padding-bottom: 250px;
  }

  #lensTray {
    bottom: 18px;
  }

  .scroll-cue {
    display: none;
  }
}
/* ------------------------------------------------------------------
   7. Ghost type contrast.

   The press names and the footer CTA rest at rgba alpha .08/.05 — measured
   1.17:1 and 1.09:1, effectively invisible without their outline stroke,
   which contrast tooling cannot evaluate. Both are large text, so AA asks
   3:1. Resting fills rise to computed-passing values (3.09:1+); the
   pointer-proximity swell to full strength is unchanged, and the JS that
   drives it per-frame is patched to the same floor ([patch:ghost-contrast]).
   The outline stroke stays for crispness.
   ------------------------------------------------------------------ */
html.js .press.ghost .pname {
  color: rgb(23 24 28 / 52%);
}

html.js .fc-link.ghost .fcg {
  color: rgb(237 234 226 / 42%);
}
/* ------------------------------------------------------------------
   8. Manufacturing-cell fallback poster.

   The reference styles a `.no-webgl` state but never sets the class and
   ships no fallback element — a failed WebGL context meant an empty stage
   and a stranded "INITIALIZING CELL" label. main.ts now detects context
   failure, and this poster (17 KB, captured from the real scene at its
   settled loop pose) stands in behind the loop text. It appears ONLY under
   .no-webgl: with WebGL running, the hero deliberately shows no robot until
   the loop begins, and a permanent background would contradict that.
   ------------------------------------------------------------------ */
/* `cell-poster` is a deliberate substitution rather than a capability
   failure: reduced-motion, Save-Data and low-memory visitors are shown the
   same still of the machine instead of paying a ~1s main-thread stall to
   render it at rest. It shares this fallback with the genuine no-WebGL case;
   only the reason differs. See main.ts. */
:scope.cell-poster #heroRobot,
:scope.no-webgl #heroRobot {
  background: url('/poster/robot-poster.webp') 62% 50% / cover no-repeat;
}

:scope.cell-poster .hr-load,
:scope.no-webgl .hr-load {
  display: none;
}
/* ------------------------------------------------------------------
   9. Press wall logos (staging only — see PROVENANCE.md).

   When a logo replaces its wordmark, the row's typographic sizing no longer
   applies: heights are set per logo in press-logos.ts, because the four have
   different cap-height-to-box ratios and equal box heights read as unequal
   type. The proximity fill that animates the wordmarks has nothing to grab on
   an SVG, so the logo gets the equivalent treatment via opacity instead.
   ------------------------------------------------------------------ */
/* Visually hidden but exposed to assistive technology. The reference had no
   such utility; the press swap needs one to keep the wordmark as the
   accessible name once the logo replaces it visually. */
.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* No opacity of its own: the design's proximity tick writes an rgba `color`
   on .pname every frame, and the logo inherits it through `currentColor` —
   so the fill-on-approach interaction carries over to the artwork intact. */
.pname-logo {
  display: inline-flex;
  align-items: center;
}

/* Resting state before the proximity tick has run (out of view, no pointer
   yet, or reduced motion). Logo artwork has thinner strokes than the wordmark
   type it replaces, so it needs a higher floor than the text does to read as
   equally present — matched to the JS floor in [patch:ghost-contrast]. */
html.js .press.ghost .pname-logo {
  color: rgb(23 24 28 / 74%);
}

.pname-logo svg {
  height: var(--logo-h, 30px);
  width: auto;
  display: block;
}

@media (max-width: 760px) {
  .pname-logo svg {
    height: calc(var(--logo-h, 30px) * 0.8);
  }
}

/* ============================================================================
   §13  Footer CTA overflows the document below ~350px
   ============================================================================
   `.fc-link` is `display: inline-flex` and `.fcg` is a flex item, so it
   inherits `min-width: auto` and refuses to shrink below its content width —
   `white-space` already computes to `normal`, but the text still cannot wrap.
   Meanwhile `font-size: clamp(2.4rem, 7vw, 5.4rem)` stops responding below
   ~343px, where the 7vw term falls under the 2.4rem floor, so the type holds at
   38.4px while the viewport keeps narrowing.

   Measured at 320px: the CTA is 325px wide at x=20, taking the document to
   345px against a 320px viewport — a 25px horizontal scroll. It overflows at
   320px and 340px, and is clear from 360px up.

   This is the same defect class as §1: a `nowrap`-style constraint widening the
   whole document. It only surfaced now because the old partner CTA label is two
   characters longer than the "Partner with BAO" it replaced, which means the
   reference was one short word away from the same bug.

   Releasing the flex minimum lets the label wrap to two lines when it must, and
   changes nothing at any width where it already fits.

   The container itself deliberately does NOT get `flex-wrap: wrap`: that let
   the arrow break onto a third line on its own, stranded under the text. Only
   `.fcg` wraps, so the arrow stays beside the label and `align-items: center`
   keeps it centred against the two lines. */
.fc-link {
  max-width: 100%;
}

.fcg {
  min-width: 0;
}

/* ============================================================================
   §14  Reveal elements should not hold compositor layers for the page's life
   ============================================================================
   design.css sets `will-change: transform, opacity` on every `[data-reveal]`
   element — 31 of them on the homepage. `will-change` is a promise the browser
   keeps: each one is promoted to its own compositor layer immediately and holds
   that memory until the declaration goes away, which here is never.

   The property exists to be applied just before an animation and removed after,
   and GSAP already does exactly that for the tweens it runs. A permanent
   blanket declaration is the documented misuse, and on a page that also runs a
   WebGL scene the memory is not free.

   Not a design change: nothing about how the reveals look or move is affected. */
[data-reveal] {
  will-change: auto;
}

/* Same misuse on the split headline: design.css declares `will-change:
   font-variation-settings, transform` on every character span — one pinned
   compositor layer per letter, ~40 on this headline, held for the page's
   life. The variation-settings writes are style/layout work that a compositor
   layer cannot help with anyway. */
.kch {
  will-change: auto;
}

/* ============================================================================
   §15  Loop phases must stay readable to assistive technology
   ============================================================================
   The reference animates the four phase articles with GSAP's `autoAlpha`,
   which is opacity plus `visibility`. `visibility: hidden` removes an element
   from the accessibility tree, so a screen reader found at most one of the
   four — and the four carry the product's central claims. They are animated
   with plain `opacity` now (see [patch:phases-stay-in-the-tree]).

   The phases are stacked in one grid cell, so a faded-out one would otherwise
   intercept clicks and text selection meant for the visible one. `visibility`
   used to do that job as a side effect; this does it deliberately, without
   taking the content out of the tree. */
.loop-phase[data-phase-hidden] {
  pointer-events: none;
}

/* ============================================================================
   §16  Focus and control boundaries below the contrast minimum
   ============================================================================
   Measured against the actual token values:

   - The single `:focus-visible` outline is --amber (#E8A03C). On --ink that is
     8.81:1, but on the porcelain sections (#F1EFEA) it is 1.92:1 against a 3:1
     minimum for non-text — so on the platform pillars and the nav over light
     sections, the focus ring was effectively invisible. WCAG 2.2 SC 1.4.11.

   - Form inputs and radio chips draw their only boundary with --line-l
     composited on ink: #323334, which is 1.53:1. The native radio is hidden,
     so the chip border is the only thing marking an option as an option.

   - Amber hover on light grounds is 1.92:1 as text (needs 4.5:1).

   --amber-deep (#8A5D14) measures 5.00:1 on porcelain and is already in the
   palette, so the light-ground states use it rather than introducing a colour.
   The dark-ground states are untouched: they already pass comfortably. */
:focus-visible {
  outline-color: var(--amber);
}

.light :focus-visible,
#nav.on-light :focus-visible {
  outline-color: #8a5d14;
  /* A second ring in the opposite tone keeps the indicator visible over the
     mixed grounds inside a section (cards, images, the press wall). */
  box-shadow: 0 0 0 4px rgb(255 255 255 / 72%);
}

.field input,
.field textarea {
  border-bottom-color: rgb(237 234 226 / 42%);
}

/* The native radio is `position: absolute; opacity: 0`, so `.c` is the only
   thing that marks an option as an option. */
.chiprow .c {
  border-color: rgb(237 234 226 / 42%);
}

.light .nav-links a:not(.btn):hover,
#nav.on-light .nav-links a:not(.btn):hover {
  color: #8a5d14;
}

.press-index li i.lit {
  color: #8a5d14;
}

/* ------------------------------------------------------------------
   The loop's closing line sat underneath the WebGL stage.

   `#heroRobot` is `position: fixed; z-index: 0`. A positioned element paints
   above in-flow content regardless of document order, so every unpositioned
   block in the loop section rendered beneath the cell. The pinned columns were
   already handled — `:where(:scope).js-pin .loop-left` and `.loop-right` both take
   `z-index: 3` — but `.loop-outro`, which sits outside `.loop-grid`, was
   missed: the cobot's arm crossed the sentence mid-word.

   Same treatment as the left column: lift it over the stage, and carry a soft
   ground so the line stays readable whatever the cell is doing behind it.
   ------------------------------------------------------------------ */
.loop-outro {
  position: relative;
  z-index: 3;
}

/* The ground bleeds vertically but never horizontally: an earlier version put
   this on the <p> with a -64px horizontal inset, which at 320-412px pushed the
   document wider than the viewport — the whole page then scrolled sideways and
   the nav burger went off-screen with it. Nothing here may exceed the wrap's
   content box. */
.loop-outro::before {
  content: '';
  position: absolute;
  z-index: -1;
  inset: -44px 0 auto;
  height: 260px;
  background: radial-gradient(
    ellipse 42% 58% at 50% 42%,
    rgb(12 13 16 / 92%) 0%,
    rgb(12 13 16 / 80%) 45%,
    rgb(12 13 16 / 0%) 78%
  );
  pointer-events: none;
}

/* The lens reading's fallback ground. design-motion.js adds `.shielded` only
   when no placement around the lens clears both the tray and the copy column —
   which happens when the lens is deep inside the headline, exactly where the
   tray invites you to move it. White analysis text over white display type is
   unreadable; this gives it something to sit on without moving it. */
#lensFinding.shielded {
  padding: 9px 12px;
  margin: -9px -12px;
  border-radius: 10px;
  background: rgb(12 13 16 / 82%);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
}

/* ------------------------------------------------------------------
   The footer's utility row could not wrap, so a fifth item broke phones.

   `.foot-bottom` wraps, but the `.fb-links` group inside it is an
   `inline-flex` row with no wrapping of its own: the clock, the separators and
   every link are locked onto one line. The design shipped four items, which
   just fit. Adding "Investor portal" (2026-08-23) made five, and the group
   measured 394px against a 320px viewport — 74px of horizontal overflow on the
   whole document, which also pushes the nav burger off-screen.

   Measured before/after at 320px: overflow 74px → 0px. The separators are
   hidden once the row wraps, because a leading "·" on a new line reads as a
   bullet rather than a divider.
   ------------------------------------------------------------------ */
.fb-links {
  flex-wrap: wrap;
  justify-content: flex-end;
  row-gap: 8px;
}

@media (max-width: 560px) {
  .foot-bottom {
    justify-content: flex-start;
  }

  .fb-links {
    justify-content: flex-start;
    gap: 12px;
  }

  .fb-links i {
    display: none;
  }
}

/**
 * Post-design feature work.
 *
 * Split out of fixes.css, whose header promises that every rule is a
 * correction to a measured defect and that removing the file restores the
 * design's intent. That promise had quietly stopped being true: roughly half
 * the file had become new design — the loop section rebuilt as an instrument
 * rail, a headline retuned for new copy, a scan instrument that does not exist
 * in the design at all, a replaced preloader, and an added motion control.
 *
 * These are not removable: enhancements.ts relocates the scan card into the
 * rail this file creates, and the motion control it styles is what satisfies
 * WCAG 2.2.2. Keeping them under a header that invited deletion was the
 * problem — a maintainer deciding what was safe to discard before a re-port
 * had no way to tell a bug fix from a feature.
 *
 * Loaded after fixes.css, so ordering is unchanged from when both lived in one
 * file.
 */

/* ------------------------------------------------------------------
   Hero lens — guided, inclusive scan demo.

   The lens remains attached to the headline, but the formula tray now makes
   the signal-to-ingredient relationship explicit and provides the same scan
   path to keyboard and touch visitors. The underlying design styles remain
   in design.css; these are post-design controls and states.
   ------------------------------------------------------------------ */
#lensTray {
  width: 292px;
  /* The hero hides the native cursor because the lens is the pointer — but
     the lens fades out over the tray (it is interface, not skin), which used
     to leave visitors with no pointer at all over the card body. */
  cursor: auto;
}

#lensTray .lens-recent {
  min-height: 2.8em;
  margin-bottom: 10px;
  font-family: var(--mono);
  font-size: 9px;
  line-height: 1.4;
  letter-spacing: 0.12em;
  color: var(--amber);
}

#lensTray .chips:empty {
  min-height: 0;
}

#lensTray .chip::before {
  display: none;
}

#lensTray .lens-scan {
  width: 100%;
  margin-top: 12px;
  border: 1px solid rgb(237 234 226 / 28%);
  border-radius: 999px;
  padding: 8px 12px;
  background: rgb(237 234 226 / 5%);
  color: var(--t-light);
  font-family: var(--mono);
  font-size: 9px;
  line-height: 1.2;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  cursor: pointer;
  transition:
    border-color 180ms ease,
    background 180ms ease,
    color 180ms ease;
}

#lensTray .lens-scan:hover,
#lensTray .lens-scan:focus-visible {
  border-color: var(--amber);
  background: rgb(232 160 60 / 10%);
  color: var(--amber);
}

#lensTray .lens-scan:focus-visible {
  outline: 2px solid var(--amber);
  outline-offset: 3px;
}

#lensTray .lens-scan:disabled {
  cursor: default;
  opacity: 0.58;
}

#lensTray .tf {
  color: var(--steel-2);
  pointer-events: auto;
}

#lensTray .tf.ready,
#lensTray .tf:hover,
#lensTray .tf:focus-visible {
  color: var(--amber);
}

#lensTray .lens-note {
  margin-top: 8px;
  font-family: var(--mono);
  font-size: 8px;
  line-height: 1.4;
  letter-spacing: 0.08em;
  color: var(--steel);
}

/* ------------------------------------------------------------------
   The single-column layout starts at 980px, but every tray accommodation
   used to stop at 760px. In the 761–980px band three things collided at
   once: the tray sat on the hero chips, the centre caption struck through
   the tray's text, and two contradictory instructions were visible
   together. All the accommodations now share the layout's own boundary.
   ------------------------------------------------------------------ */
@media (max-width: 980px) {
  /* Reserves the bottom band the docked tray and the motion toggle occupy,
     so neither sits on the chips row. */
  #hero {
    padding-bottom: 340px;
  }

  #lensTray {
    right: 14px;
    bottom: 64px;
    left: auto;
    width: min(340px, calc(100vw - 28px));
  }

  .scroll-cue {
    display: none;
  }
}

@media (max-width: 560px) {
  #lensTray {
    left: 14px;
    width: auto;
  }
}

/* ------------------------------------------------------------------
   5. Loop section — instrument rail.

   Two defects, one cause. The dial's frosted backdrop disc sits directly on
   the robot, so the section that exists to show the machine reduced it to a
   background texture; and the SCAN portrait was pinned at `top: nav + 26px`
   where it collided with the vertically-centred phase text below ~1060px of
   viewport height (measured 1440x900: caption bottom 391px vs headline top
   376px — identical in the reference, which was evidently tuned on a taller
   display).

   Both are fixed by giving the right-hand column a job: it becomes an
   instrument rail. The dial shrinks to a 200px corner gauge, top-aligned so
   it never shifts, and the portrait docks beneath it — where it reads as the
   machine's own readout instead of debris in a corner. The 3D cell keeps the
   centre of the stage for the whole loop.

   The card is relocated into the rail by enhancements.ts at every breakpoint;
   it ships inside the fixed #heroRobot layer, which no stylesheet can position
   relative to the pinned grid. `.loop-right #scanSymbol` is therefore the
   structural signal that the move happened, independent of motion state.
   ------------------------------------------------------------------ */
@media (min-width: 981px) {
  :scope {
    --rail-w: 300px;
    --rail-dial: 200px;
  }

  /* Anchor the rail to the content column, not the full-bleed stage, so it
     tracks the copy's gutter on ultra-wide screens. */
  :where(:scope).js-pin .loop-grid {
    position: relative;
  }

  :where(:scope).js-pin .loop-right {
    position: absolute;
    top: 0;
    right: 0;
    left: auto;
    width: var(--rail-w);
    display: grid;
    justify-items: center;
    align-content: start;
    gap: 34px;
    margin: 0;
    z-index: 3;
  }

  /* The phase narrative now owns the left side. The old floating HUD repeated
     fragments of that story in 10px type and made the intentionally open lane
     look unfinished; the phase instruments already carry the live values. */
  #hud {
    display: none;
  }

  :where(:scope).js-pin .loop-right > .dial {
    grid-column: 1;
    grid-row: 1;
  }

  /* SCAN and COMPUTE are two states of one instrument bay, not two cards.
     Explicitly sharing the cell prevents the rail from growing when the
     terminal is injected after the portrait. */
  :where(:scope).js-pin .loop-right > #scanSymbol,
  :where(:scope).js-pin .loop-right > #computeTerminal {
    grid-column: 1;
    grid-row: 2;
    align-self: start;
  }

  :where(:scope).js-pin .dial {
    width: var(--rail-dial);
  }

  /* The backdrop can be far smaller and softer now that the gauge is off the
     machine — it only has to separate the readout from the page ground. */
  :where(:scope).js-pin .dial::before {
    inset: -6%;
    background: radial-gradient(
      circle,
      rgb(12 13 16 / 72%) 0%,
      rgb(12 13 16 / 52%) 58%,
      rgb(12 13 16 / 0%) 74%
    );
    backdrop-filter: blur(8px);
  }

  :where(:scope).js-pin .dial-read {
    gap: 5px;
  }

  :where(:scope).js-pin .dial-read .dr-n {
    font-size: 0.58rem;
    letter-spacing: 0.24em;
  }

  :where(:scope).js-pin .dial-read .dr-name {
    font-size: 1.16rem;
  }

  :where(:scope).js-pin .dial-read .dr-sub {
    font-size: 0.5rem;
  }

  :where(:scope).js-pin .dial .stn {
    font-size: 9px;
  }

  /* Docked: flow under the gauge. Keyed off the relocation rather than the
     pin state, so the stacked no-motion fallback renders sensibly too. */
  .loop-right #scanSymbol {
    position: static;
    inset: auto;
    width: 100%;
    display: grid;
    justify-items: center;
    text-align: center;
  }

  .loop-right #scanSymbol .ss-portrait {
    width: 176px;
  }

  .loop-right #scanSymbol .ss-kicker {
    justify-content: center;
  }

  .loop-right #scanSymbol .ss-copy {
    justify-items: center;
  }

  /* The giant phase heading beside it already says "SCAN". */
  .loop-right #scanSymbol .ss-sub {
    display: none;
  }

  /* ----------------------------------------------------------------
     The left phase panel was present in the DOM but still inherited the
     reference's `visibility:hidden`, even after the motion patch switched
     from autoAlpha to opacity. That left only the tiny floating HUD visible.

     The repaired panel is deliberately lean: one strong phase heading, one
     sentence of context and an open three-value ledger. A dissolving backdrop
     protects its contrast without turning it into another floating card.
     ---------------------------------------------------------------- */
  :where(:scope).js-pin .loop-grid {
    grid-template-columns: minmax(360px, 440px) minmax(0, 1fr);
  }

  :where(:scope).js-pin .loop-left {
    width: min(440px, calc(100vw - var(--rail-w) - 2 * var(--gutter) - 80px));
    min-height: min(68svh, 560px);
    isolation: isolate;
    z-index: 3;
  }

  :where(:scope).js-pin .loop-left::before {
    position: absolute;
    z-index: -1;
    inset: -52px -44px -52px calc(-1 * var(--gutter));
    background: linear-gradient(
      90deg,
      rgb(12 13 16 / 100%) 0%,
      rgb(12 13 16 / 96%) 54%,
      rgb(12 13 16 / 58%) 74%,
      rgb(12 13 16 / 0%) 96%
    );
    content: '';
    pointer-events: none;
  }

  :where(:scope).js-pin .loop-intro,
  :where(:scope).js-pin .loop-phase {
    width: 100%;
    max-width: 420px;
  }

  /* Opacity remains motion-owned; visibility must stay available so a phase
     cannot disappear permanently at the edge of a scrub window. */
  :where(:scope).js-pin .loop-phase {
    visibility: visible;
    padding: 4px 0 5px 24px;
    border-left: 1px solid rgb(237 234 226 / 19%);
  }

  :where(:scope).js-pin .loop-phase::before {
    position: absolute;
    top: 5px;
    left: -2px;
    width: 3px;
    height: 54px;
    background: var(--amber);
    box-shadow: 0 0 18px rgb(232 160 60 / 28%);
    content: '';
  }

  :where(:scope).js-pin .phase-idx {
    gap: 14px;
    margin-bottom: 13px;
  }

  :where(:scope).js-pin .phase-idx .n {
    font-size: 0.75rem;
  }

  :where(:scope).js-pin .phase-idx .of {
    font-size: 0.61rem;
  }

  :where(:scope).js-pin .loop-phase h3 {
    font-size: clamp(3.35rem, 4.65vw, 4.6rem);
    line-height: 0.9;
  }

  :where(:scope).js-pin .loop-phase .tagline {
    margin: 16px 0 10px;
    font-size: clamp(1.18rem, 1.45vw, 1.38rem);
    line-height: 1.25;
  }

  :where(:scope).js-pin .loop-phase .body {
    max-width: 41ch;
    color: rgb(200 203 210 / 88%);
    font-size: clamp(0.98rem, 1.02vw, 1.06rem);
    line-height: 1.55;
  }

  :where(:scope).js-pin .phase-specs {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 0;
    margin-top: 22px;
    overflow: visible;
    border: 0;
    border-top: 1px solid rgb(237 234 226 / 18%);
    border-bottom: 1px solid rgb(237 234 226 / 12%);
    border-radius: 0;
    background: transparent;
  }

  :where(:scope).js-pin .phase-specs .kv {
    gap: 5px;
    min-width: 0;
    padding: 12px 11px 13px 0;
    background: transparent;
  }

  :where(:scope).js-pin .phase-specs .kv + .kv {
    padding-left: 13px;
    border-left: 1px solid rgb(237 234 226 / 12%);
  }

  :where(:scope).js-pin .phase-specs .k {
    font-size: 0.59rem;
    letter-spacing: 0.15em;
  }

  :where(:scope).js-pin .phase-specs .v {
    overflow: hidden;
    font-size: clamp(0.98rem, 1.12vw, 1.12rem);
    text-overflow: ellipsis;
    white-space: nowrap;
  }
}

/* A short desktop viewport has roughly 510px below navigation. Tighten only
   the vertical rhythm; type stays readable and the content remains complete. */
@media (min-width: 981px) and (max-height: 720px) {
  :where(:scope).js-pin .loop-left {
    min-height: min(64svh, 460px);
  }

  :where(:scope).js-pin .loop-left::before {
    inset-block: -34px;
  }

  :where(:scope).js-pin .loop-phase h3 {
    font-size: clamp(3rem, 4.2vw, 4rem);
  }

  :where(:scope).js-pin .loop-phase .tagline {
    margin: 12px 0 8px;
  }

  :where(:scope).js-pin .loop-phase .body {
    font-size: 0.96rem;
    line-height: 1.46;
  }

  :where(:scope).js-pin .phase-specs {
    margin-top: 17px;
  }

  :where(:scope).js-pin .phase-specs .kv {
    padding-block: 9px 10px;
  }
}

/* The scan instrument remains in the rail below the desktop breakpoint too.
   Tablet and phone use a stable two-instrument row: the dial keeps loop
   context on the left while the full face scans on the right. Reserving both
   cells even while the portrait is transparent prevents layout movement as
   SCAN enters and exits. */
@media (max-width: 980px) {
  .loop-grid {
    grid-template-columns: minmax(0, 1fr);
  }

  .loop-left,
  .loop-intro,
  .loop-phase {
    min-width: 0;
    width: 100%;
    max-width: 100%;
  }

  .loop-right {
    width: min(520px, calc(100vw - 2 * var(--gutter)));
    display: grid;
    grid-template-columns: minmax(132px, 176px) minmax(124px, 152px);
    justify-content: center;
    justify-self: center;
    align-items: center;
    gap: clamp(12px, 4vw, 28px);
    margin-bottom: 8px;
    z-index: 3;
  }

  .loop-right .dial {
    width: min(176px, 46vw);
    grid-column: 1;
    grid-row: 1;
  }

  .loop-right #scanSymbol,
  .loop-right #computeTerminal {
    grid-column: 2;
    grid-row: 1;
    align-self: center;
  }

  .loop-right #scanSymbol {
    position: static;
    inset: auto;
    width: min(152px, 39vw);
    display: grid;
    justify-items: center;
    text-align: center;
  }

  .loop-right #scanSymbol .ss-portrait {
    width: 100%;
  }

  .loop-right #scanSymbol .ss-kicker {
    justify-content: center;
  }

  .loop-right #scanSymbol .ss-copy {
    justify-items: center;
  }

  .loop-right #scanSymbol .ss-sub {
    display: none;
  }
}

@media (max-width: 560px) {
  .loop-right {
    width: calc(100vw - 2 * var(--gutter));
    grid-template-columns: minmax(118px, 136px) minmax(116px, 132px);
    gap: clamp(8px, 3vw, 14px);
  }

  .loop-right .dial {
    width: min(136px, 42vw);
  }

  .loop-right #scanSymbol {
    width: min(132px, 41vw);
  }

  .loop-right #scanSymbol .ss-title {
    font-size: 7.5px;
    letter-spacing: 0.12em;
  }
}

@media (max-width: 360px) {
  /* The phase heading already identifies SCAN; removing the repeated title at
     the narrowest width keeps the two instruments centered without clipping. */
  .loop-right #scanSymbol .ss-copy {
    display: none;
  }

  .loop-intro .eyebrow {
    white-space: normal;
  }
}
/* ------------------------------------------------------------------
   10. Headline retuning for the .ai copy.

   Two headlines now follow the live baolaboratory.ai wording (client
   decision, 2026-08-12). Both are far longer than the design's originals
   and cannot inherit their type sizes:

     hero  "AI that makes things."       21 chars -> 53
     loop  "One loop. Four moves. …"      41 chars -> 46

   The hero is the harder one. Measured natural wrapping: inside the design's
   673px copy column the headline breaks as
   "Industrializing / Personalized / Skincare with / Physical AI" at every
   size down to 58px, splitting "Skincare with" across lines; it only resolves
   to three clean lines at 54px — which is SMALLER than the section headings
   (h-lg, 62px) and would invert the type hierarchy.

   The lever is width, not size. The hero's right grid column is empty — the
   design leaves it for a robot that renders on a separate full-viewport
   canvas — so widening the copy column costs nothing visually. At a ~840px
   measure the headline sets as "Industrializing / Personalized Skincare /
   with Physical AI" at full hero scale, each line a coherent unit, with the
   amber landing on the closing phrase.
   ------------------------------------------------------------------ */
@media (min-width: 981px) {
  #hero .hero-grid {
    grid-template-columns: minmax(0, 1.32fr) minmax(0, 0.68fr);
  }
}

/*
 * The measure does the work, and it is scale-invariant. Measured at six type
 * sizes, "Personalized Skincare" occupies 17.3ch and "Industrializing
 * Personalized" 21.0ch — the same ch window at every size, because both scale
 * with the font. Any measure inside that window forces the intended break;
 * 19ch sits in the middle with margin on both sides.
 */
#hero h1 {
  max-width: 19ch;
  font-size: clamp(1.75rem, 4.6vw, 4.1rem);
}

/* Below ~360px the viewport, not the measure, is the binding constraint:
   280px of column cannot hold "Personalized Skincare" at the 28px floor, so
   the floor itself comes down. Verified at 320px, the narrowest phone still
   in meaningful use. */
@media (max-width: 360px) {
  #hero h1 {
    font-size: 1.4rem;
  }
}

/* The loop heading gains only five characters but crosses a wrap boundary at
   its 14ch measure; widening it keeps the original three-line set. */
.loop-intro h2 {
  max-width: 17ch;
}
/* ------------------------------------------------------------------
   11. Full-face SCAN instrument.

   The source profile and its postage-stamp cheek ellipse have been replaced
   by a centered frontal portrait and a complete facial-zone map. The imaging
   plane travels forehead to chin; region contours and measurement points
   resolve only after the plane reaches them, then a restrained lock confirms
   capture before COMPUTE. Motion ownership lives in enhancements.ts rather
   than the WebGL scene, so the scan survives a robot fallback.

   `vector-effect: non-scaling-stroke` keeps the instrument crisp at the
   desktop card's 176px and the phone card's 116–132px.
   ------------------------------------------------------------------ */
.ss-portrait {
  overflow: hidden;
  border: 1px solid rgb(232 160 60 / 16%);
  background:
    linear-gradient(rgb(232 160 60 / 4%) 1px, transparent 1px),
    linear-gradient(90deg, rgb(232 160 60 / 4%) 1px, transparent 1px), var(--ink);
  background-size: 12.5% 12.5%;
}

.ss-photo {
  object-fit: contain;
  object-position: 50% 50%;
  mix-blend-mode: normal;
  filter: saturate(0.76) brightness(0.94) contrast(1.08);
  -webkit-mask-image: none;
  mask-image: none;
}

.ss-graphic .ss-face-outline,
.ss-graphic .ss-axis,
.ss-graphic .ss-region path,
.ss-graphic .ss-measure path,
.ss-graphic .ss-scan-line,
.ss-graphic .ss-lock path {
  vector-effect: non-scaling-stroke;
}

.ss-graphic .ss-face-outline {
  fill: rgb(232 160 60 / 1.5%);
  stroke: rgb(232 160 60 / 72%);
  stroke-width: 1.1;
  stroke-dasharray: 3.5 3;
}

.ss-graphic .ss-axis {
  stroke: rgb(200 203 210 / 25%);
  stroke-width: 0.8;
  stroke-dasharray: 2 4;
}

.ss-graphic .ss-region {
  opacity: 0;
  transition: opacity 120ms linear;
}

.ss-graphic .ss-region path {
  stroke: rgb(237 234 226 / 74%);
  stroke-width: 0.95;
  stroke-dasharray: 1;
  stroke-dashoffset: var(--trace, 1);
}

.ss-graphic .ss-measure {
  opacity: 0;
  transition: opacity 100ms linear;
}

.ss-graphic .ss-measure circle {
  fill: var(--amber-hi);
  stroke: rgb(12 13 16 / 92%);
  stroke-width: 0.65;
  filter: drop-shadow(0 0 3px rgb(232 160 60 / 100%));
}

.ss-graphic .ss-measure path {
  stroke: rgb(232 160 60 / 88%);
  stroke-width: 1;
  stroke-dasharray: 1;
  stroke-dashoffset: var(--trace, 1);
}

.ss-graphic .ss-scan-band {
  opacity: 0.92;
  mix-blend-mode: screen;
}

.ss-graphic .ss-scan-line {
  stroke: var(--amber-hi);
  stroke-width: 2.4;
  filter: drop-shadow(0 0 4px rgb(232 160 60 / 100%)) drop-shadow(0 0 11px rgb(232 160 60 / 72%));
}

.ss-graphic .ss-scan-head {
  fill: var(--amber-hi);
  filter: drop-shadow(0 0 4px rgb(244 184 95 / 100%));
}

.ss-graphic .ss-lock {
  opacity: 0;
  transition: opacity 120ms linear;
}

.ss-graphic .ss-lock path {
  stroke: var(--amber-hi);
  stroke-width: 1.25;
  filter: drop-shadow(0 0 4px rgb(232 160 60 / 72%));
}

.ss-graphic .ss-lock text {
  font-family: var(--mono);
  font-size: 3.15px;
  letter-spacing: 0.16em;
  fill: var(--amber-hi);
}

.ss-graphic .ss-label {
  font-size: 3.15px;
  fill: rgb(232 160 60 / 92%);
  letter-spacing: 0.07em;
  transform: none;
}

#scanSymbol.is-locked .ss-portrait {
  border-color: rgb(232 160 60 / 48%);
  box-shadow: inset 0 0 24px rgb(232 160 60 / 7%);
}

/* ------------------------------------------------------------------
   11b. COMPUTE terminal.

   A short, deterministic formulation trace replaces the face instrument in
   the rail during COMPUTE. The shell borrows macOS Terminal's recognisable
   traffic lights, but the content is the product pipeline rather than visual
   filler: profile normalisation, active-library ranking, the stability
   guardrail, formula lock and robot handoff. enhancements.ts reveals it over
   2.6 seconds, using the scan instrument's existing frame rather than adding
   another permanent animation loop.
   ------------------------------------------------------------------ */
#computeTerminal {
  display: none;
}

:where(:scope).js-pin #computeTerminal {
  width: min(300px, calc(100vw - 2 * var(--gutter)));
  display: block;
  visibility: hidden;
  overflow: hidden;
  border: 1px solid rgb(237 234 226 / 18%);
  border-radius: 9px;
  background: rgb(8 9 12 / 94%);
  box-shadow:
    0 22px 56px rgb(0 0 0 / 34%),
    inset 0 0 0 1px rgb(255 255 255 / 2%);
  transform-origin: 50% 0;
  opacity: 0;
  pointer-events: none;
  will-change: opacity, transform;
}

:where(:scope).js-pin #computeTerminal.is-open {
  visibility: visible;
}

.ct-chrome {
  min-height: 28px;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: 9px;
  padding: 0 10px;
  border-bottom: 1px solid rgb(237 234 226 / 11%);
  background: linear-gradient(180deg, rgb(42 44 49 / 96%), rgb(27 29 34 / 96%));
  color: rgb(200 203 210 / 70%);
  font-family: var(--mono);
  font-size: 0.48rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

.ct-lights {
  display: flex;
  gap: 5px;
}

.ct-lights i {
  width: 7px;
  height: 7px;
  display: block;
  border-radius: 50%;
  background: #ff5f57;
  box-shadow: inset 0 0 0 0.5px rgb(0 0 0 / 32%);
}

.ct-lights i:nth-child(2) {
  background: #febc2e;
}

.ct-lights i:nth-child(3) {
  background: #28c840;
}

.ct-title {
  overflow: hidden;
  text-align: center;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.ct-state {
  color: var(--amber-hi);
  text-align: right;
  white-space: nowrap;
}

.compute-terminal[data-compute-state='ready'] .ct-state {
  color: #82d799;
}

.ct-body {
  min-height: 181px;
  display: grid;
  align-content: start;
  padding: 12px 13px 14px;
  color: rgb(218 220 216 / 88%);
  font-family: var(--mono);
  font-size: clamp(0.5rem, 0.58vw, 0.58rem);
  line-height: 1.55;
  text-align: left;
}

.ct-line {
  width: 100%;
  min-height: 1.55em;
  overflow: hidden;
  opacity: 0;
  white-space: nowrap;
}

.ct-command {
  color: rgb(237 234 226 / 96%);
}

.ct-prompt,
.ct-section {
  color: var(--amber-hi);
}

.ct-ok,
.ct-ready {
  color: #82d799;
}

.ct-section {
  margin-top: 3px;
  letter-spacing: 0.12em;
}

.ct-cursor {
  display: inline-block;
  margin-left: 2px;
  color: var(--amber-hi);
  visibility: hidden;
}

.compute-terminal.is-open[data-compute-state='ready'] .ct-cursor {
  visibility: visible;
  animation: compute-cursor 720ms steps(1, end) infinite;
}

@keyframes compute-cursor {
  50% {
    opacity: 0;
  }
}

@media (max-width: 980px) {
  :where(:scope).js-pin #computeTerminal {
    width: min(152px, 39vw);
    border-radius: 7px;
  }

  .ct-chrome {
    min-height: 23px;
    gap: 6px;
    padding: 0 7px;
    font-size: 0.38rem;
  }

  .ct-lights {
    gap: 3px;
  }

  .ct-lights i {
    width: 5px;
    height: 5px;
  }

  .ct-state {
    display: none;
  }

  .ct-body {
    min-height: 128px;
    padding: 8px 7px 9px;
    font-size: clamp(0.36rem, 1.65vw, 0.43rem);
    line-height: 1.45;
  }

  .ct-line {
    min-height: 1.45em;
  }

  .ct-section {
    margin-top: 2px;
  }
}

@media (max-width: 560px) {
  /* Match the portrait's phone width exactly so both states remain centred in
     the same 132px instrument cell instead of the terminal hanging 10px out. */
  :where(:scope).js-pin #computeTerminal {
    width: min(132px, 41vw);
  }
}

@media (prefers-reduced-motion: reduce) {
  #scanPlane {
    opacity: 0;
  }
}

/* ============================================================================
   §12  Preloader — reticle replaced with the dosing cell
   ============================================================================
   The reference boot mark is a ring with four radial ticks, which reads as a
   gunsight rather than as anything BAO does. Replaced with a minimal line
   rendering of the machine the whole page is about: an articulated arm doses
   three sub-microlitre drops into a batch vessel, and the vessel keeps them.

   The markup uses `.boot-rig` rather than `.glyph`, so design.css's
   `#boot .glyph circle|path` draw/tick rules simply find no elements. Nothing
   is overridden and nothing in design.css changes.

   Timing is pinned to the boot contract in design-motion.js: the screen holds
   for a minimum of 1050ms and then fades over 700ms. The sequence completes at
   ~960ms so the vessel is already full before the fade starts, and on a slow
   load it holds full until the 2600ms cap. */

#boot .boot-rig {
  width: 128px;
  height: 108px;
  overflow: visible;
}

#boot .br-rig {
  fill: none;
  stroke: rgb(237 234 226 / 66%);
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}

#boot .br-vessel {
  fill: none;
  stroke: rgb(237 234 226 / 32%);
  stroke-width: 1.8;
  stroke-linecap: round;
}

#boot .br-joint {
  fill: var(--ink);
  stroke: rgb(237 234 226 / 66%);
  stroke-width: 2;
}

/* Clipped to the vessel interior so the fill meets the rounded base instead of
   floating above it as a square block. */
#boot .br-liquid {
  fill: var(--amber);
  opacity: 0.92;
  transform-box: fill-box;
  transform-origin: 50% 100%;
  animation: br-fill 1s steps(1) forwards;
}

/* Monotonic: every step is higher than the last, and `forwards` holds the
   final level. The vessel never returns to empty. */
@keyframes br-fill {
  0% {
    transform: scaleY(0.05);
  }

  60% {
    transform: scaleY(0.3);
  }

  78% {
    transform: scaleY(0.58);
  }

  96% {
    transform: scaleY(0.86);
  }

  100% {
    transform: scaleY(0.86);
  }
}

/* Pivots on the shoulder. An SVG element's transform-origin resolves against
   its `transform-box`, not against viewBox user units, so a literal `88px 66px`
   lands nowhere near the joint. The group is authored so its object bounding
   box — lines and elbow only, stroke excluded — ends exactly at the shoulder
   (x 40..88, y 26.6..66), which makes `100% 100%` that joint precisely. The
   shoulder circle is deliberately kept outside the group: including it would
   push the box past the pivot, and being centred on the pivot it cannot rotate
   visibly anyway. */
#boot .br-arm {
  transform-box: fill-box;
  transform-origin: 100% 100%;
  animation: br-settle 0.24s var(--ease) forwards;
}

@keyframes br-settle {
  from {
    transform: rotate(-9deg);
  }

  to {
    transform: rotate(0deg);
  }
}

/* The doses sit outside `.br-arm` so they fall vertically rather than
   inheriting its rotation. Each carries its own --fall because the surface it
   has to land on is higher than the one before it — a shared distance would
   send the third drop straight through the liquid.

   `transform-box: fill-box` is load-bearing, not decoration. Without it the
   drop scales about the viewBox corner, so the flatten-on-impact keyframe
   translates it up and to the right instead of squashing it in place — it
   leaves the nozzle and lands on the elbow joint. */
#boot .br-drop {
  fill: var(--amber);
  opacity: 0;
  filter: drop-shadow(0 0 4px rgb(232 160 60 / 90%));
  transform-box: fill-box;
  transform-origin: 50% 50%;
  animation: br-dose 0.34s cubic-bezier(0.42, 0, 0.7, 0.45) forwards;
}

/* Keyed by explicit class, never :nth-of-type. These are <circle> elements
   sharing a parent with the shoulder joint, so a positional selector counts
   that joint too and silently shifts every dose by one slot — which leaves the
   last drop with no --fall, an invalid transform, and no delay. */
#boot .br-drop-1 {
  --fall: 23px;

  animation-delay: 0.26s;
}

#boot .br-drop-2 {
  --fall: 18px;

  animation-delay: 0.44s;
}

#boot .br-drop-3 {
  --fall: 13px;

  animation-delay: 0.62s;
}

@keyframes br-dose {
  0% {
    transform: translateY(0) scale(0.25);
    opacity: 0;
  }

  20% {
    transform: translateY(0) scale(1);
    opacity: 1;
  }

  72% {
    transform: translateY(calc(var(--fall) * 0.8)) scale(1);
    opacity: 1;
  }

  88% {
    transform: translateY(calc(var(--fall) * 0.96)) scale(1.45, 0.5);
    opacity: 0.75;
  }

  100% {
    transform: translateY(var(--fall)) scale(1.8, 0.12);
    opacity: 0;
  }
}

/* 0.17s is not a taste call: the fill steps every 180ms, and a ring that
   outlives its own step gets buried by the next dose's liquid, reading as a
   blemish inside the vessel rather than a splash on its surface. */
#boot .br-ripple {
  fill: none;
  stroke: var(--amber-hi);
  stroke-width: 1.3;
  opacity: 0;
  transform-box: fill-box;
  transform-origin: 50% 50%;
  animation: br-ripple 0.17s ease-out forwards;
}

#boot .br-ripple-1 {
  animation-delay: 0.6s;
}

#boot .br-ripple-2 {
  animation-delay: 0.78s;
}

#boot .br-ripple-3 {
  animation-delay: 0.96s;
}

@keyframes br-ripple {
  from {
    opacity: 0.9;
    transform: scaleX(0.25);
  }

  to {
    opacity: 0;
    transform: scaleX(1.4);
  }
}

/* Reduced motion gets the end state directly: arm at rest, vessel already
   full. (design-motion.js also drops the boot immediately in this mode, so
   this mainly guards the frame before that runs.) */
@media (prefers-reduced-motion: reduce) {
  #boot .br-arm,
  #boot .br-drop,
  #boot .br-liquid,
  #boot .br-ripple {
    animation: none;
  }

  #boot .br-liquid {
    transform: scaleY(0.86);
  }

  #boot .br-drop,
  #boot .br-ripple {
    opacity: 0;
  }
}

/* Failsafe: the boot screen must not be able to hide the site permanently.
   ---------------------------------------------------------------------------
   `#boot` is opaque, fixed and full-viewport, and the only thing that removes
   it is design-motion.js. The inline head script adds `.js` before first paint
   — which is what makes the overlay visible — so if that module fails to load,
   throws, or is blocked by a CSP or an extension, the overlay stays up and the
   visitor sees a blank screen forever, with no CSS or <noscript> escape.

   A CSS animation is the escape hatch precisely because it needs no
   JavaScript. It runs entirely as a delay and then holds the end state, so it
   is inert during a normal boot (which finishes by ~3.3s at the very latest:
   the 2600ms hard cap plus the 700ms fade) and only ever fires when the
   removal never came. Animation declarations outrank inline styles, so it
   still wins if a half-finished GSAP tween left inline values behind. */
@keyframes bootFailsafe {
  to {
    visibility: hidden;
    opacity: 0;
  }
}

.js #boot {
  animation: bootFailsafe 1ms linear 6s forwards;
}

/* Platform pillars: the layer name and description are phrasing content now
   (see PlatformSection.astro), so the design's `.pillar h3` / `.pillar p`
   rules no longer match. Same declarations, addressed by class — plus the
   block display that <h3> and <p> were providing for free. */
.pillar .pillar-title {
  display: block;
  font-stretch: 112%;
  font-weight: 600;
  font-size: clamp(1.05rem, 1.5vw, 1.3rem);
  margin-bottom: 0.4rem;
  letter-spacing: -0.01em;
}

.pillar .pillar-copy {
  display: block;
  color: var(--t-dark-2);
  font-size: 0.92rem;
}

/* ==================================================================
   Live inquiry submission (enhancements.ts · wireInquirySubmission)

   The confirmation panel carries two mutually exclusive blocks. Success is
   the default; `.failed` on the card swaps to the failure block. The switch
   lives on the card, not the panel, because design.css already keys the
   form/panel exchange off `.form-card.sent` and this extends that state
   machine rather than inventing a second one.
   ================================================================== */
.form-ok .ok-fail {
  display: none;
}

.form-card.sent.failed .ok-sent {
  display: none;
}

.form-card.sent.failed .ok-fail {
  display: block;
}

/* The Turnstile widget mounts here on first engagement with the form. Sized
   only when occupied so the empty slot never shifts the layout. */
.ts-slot:not(:empty) {
  margin: 14px 0 2px;
}

/* The submit button while the request is in flight. Disabled carries the
   semantics; this only needs to look like it. */
#contactForm button[type='submit'].busy {
  opacity: 0.55;
}
}