/* ════════════════════════════════
   ONE-PAGER PAGE
   Dark surface page with orange header + footer.
   Linked from HomePPL menu item.
════════════════════════════════ */

/* keyframes moved to css/animations.css */

/* ══════════════════════════════════════
   LOADING SCREEN
   Fixed overlay — N outline stroked, fills orange from bottom as counter runs.
   Fades out + hides on completion.
══════════════════════════════════════ */
.ls {
  position: fixed;
  inset: 0;
  z-index: 9999;
  background: #19191B;
  background-image:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140' opacity='0.12'%3E%3Cline x1='0' y1='0' x2='8' y2='0' stroke='%23ffffff' stroke-width='1'/%3E%3Cline x1='0' y1='0' x2='0' y2='8' stroke='%23ffffff' stroke-width='1'/%3E%3Cline x1='132' y1='0' x2='140' y2='0' stroke='%23ffffff' stroke-width='1'/%3E%3Cline x1='140' y1='0' x2='140' y2='8' stroke='%23ffffff' stroke-width='1'/%3E%3Cline x1='0' y1='132' x2='0' y2='140' stroke='%23ffffff' stroke-width='1'/%3E%3Cline x1='0' y1='140' x2='8' y2='140' stroke='%23ffffff' stroke-width='1'/%3E%3Cline x1='132' y1='140' x2='140' y2='140' stroke='%23ffffff' stroke-width='1'/%3E%3Cline x1='140' y1='132' x2='140' y2='140' stroke='%23ffffff' stroke-width='1'/%3E%3Ccircle cx='70' cy='70' r='1.5' fill='%23ffffff'/%3E%3Ccircle cx='70' cy='0' r='1.5' fill='%23ffffff'/%3E%3Ccircle cx='0' cy='70' r='1.5' fill='%23ffffff'/%3E%3Ccircle cx='140' cy='70' r='1.5' fill='%23ffffff'/%3E%3Ccircle cx='70' cy='140' r='1.5' fill='%23ffffff'/%3E%3C/svg%3E"),
    repeating-linear-gradient(0deg, rgba(255,255,255,0.025) 0, rgba(255,255,255,0.025) 1px, transparent 1px, transparent 140px),
    repeating-linear-gradient(90deg, rgba(255,255,255,0.025) 0, rgba(255,255,255,0.025) 1px, transparent 1px, transparent 140px);
  background-size: 140px 140px;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: opacity 0.7s ease;
}
.ls--done {
  opacity: 0;
  pointer-events: none;
}

/* Centre column: N + label */
.ls-content {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 24px;
  /* Animate in on load */
  animation: ls-enter 0.8s var(--ease-out-expo) both;
  /* Animate out — driven by parent .ls--done */
  transition: opacity 0.5s ease, translate 0.5s var(--ease-out-expo);
}
.ls--done .ls-content {
  opacity: 0;
  translate: 0 -24px;
}

@keyframes ls-enter {
  from {
    opacity: 0;
    translate: 0 32px;
  }
  to {
    opacity: 1;
    translate: 0 0;
  }
}

/* WebGL canvas — Three.js sets its pixel size; display:block removes inline gap */
.ls-canvas {
  display: block;
}

/* Counter label */
.ls-label {
  font-family: 'Syne', sans-serif;
  font-weight: 800;
  font-size: 16px;
  line-height: 1;
  color: #ff3c00;
  text-align: center;
  width: 100%;
  letter-spacing: 0.02em;
}

/* ── Page shell — full bleed, no frame ── */
.page-onepager {
  --op-bg: #19191B;
  position: absolute;
  inset: 0;
  background: var(--op-bg);
  background-image:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140' opacity='0.12'%3E%3Cline x1='0' y1='0' x2='8' y2='0' stroke='%23ffffff' stroke-width='1'/%3E%3Cline x1='0' y1='0' x2='0' y2='8' stroke='%23ffffff' stroke-width='1'/%3E%3Cline x1='132' y1='0' x2='140' y2='0' stroke='%23ffffff' stroke-width='1'/%3E%3Cline x1='140' y1='0' x2='140' y2='8' stroke='%23ffffff' stroke-width='1'/%3E%3Cline x1='0' y1='132' x2='0' y2='140' stroke='%23ffffff' stroke-width='1'/%3E%3Cline x1='0' y1='140' x2='8' y2='140' stroke='%23ffffff' stroke-width='1'/%3E%3Cline x1='132' y1='140' x2='140' y2='140' stroke='%23ffffff' stroke-width='1'/%3E%3Cline x1='140' y1='132' x2='140' y2='140' stroke='%23ffffff' stroke-width='1'/%3E%3Ccircle cx='70' cy='70' r='1.5' fill='%23ffffff'/%3E%3Ccircle cx='70' cy='0' r='1.5' fill='%23ffffff'/%3E%3Ccircle cx='0' cy='70' r='1.5' fill='%23ffffff'/%3E%3Ccircle cx='140' cy='70' r='1.5' fill='%23ffffff'/%3E%3Ccircle cx='70' cy='140' r='1.5' fill='%23ffffff'/%3E%3C/svg%3E"),
    repeating-linear-gradient(0deg, rgba(255,255,255,0.025) 0, rgba(255,255,255,0.025) 1px, transparent 1px, transparent 140px),
    repeating-linear-gradient(90deg, rgba(255,255,255,0.025) 0, rgba(255,255,255,0.025) 1px, transparent 1px, transparent 140px);
  background-size: 140px 140px;
  overflow-y: auto;
  z-index: 2;
  opacity: 1;
  pointer-events: all;
}

/* Kept for when it's re-used as a navigated-to overlay */
.page-onepager.visible {
  opacity: 1;
  pointer-events: all;
}


/* ════════════════════════════════
   ORANGE HEADER
   Shell/inner split — shell is a plain rectangle with no
   compositor-triggering properties. All orange bg, overflow,
   and animations live in the inner wrapper only.
════════════════════════════════ */

/* Shell — pure structural wrapper, no background, no compositor triggers */
.op-header-shell {
  position: relative;
  margin: 24px;
  /* Chamfer as a true clipped polygon — one continuous path, no overlay seam */
  clip-path: polygon(
    0 31px,
    202px 31px,
    223px 0,
    calc(100% - 38px) 0,
    100% 38px,
    100% calc(100% - 31px),
    calc(100% - 202px) calc(100% - 31px),
    calc(100% - 223px) 100%,
    38px 100%,
    0 calc(100% - 38px)
  );
}

/* Inner — orange fill + all content. Compositor boundary is invisible here (orange on orange) */
.op-header-inner {
  --op-ink: #A62700;
  position: relative;
  overflow: hidden;
  background: var(--color-brand);
  height: calc(100vh - 48px);
  display: grid;
  grid-template-rows: auto auto 1fr auto;
  padding-bottom: 35px;
}

.op-header-name {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(18px, 2.8vh, 36px) var(--pad-page-x) clamp(14px, 2vh, 28px);
  border-bottom: 1px solid #A62700;
  font-family: var(--font-display);
  font-weight: var(--weight-black);
  font-size: clamp(12px, 1.1vw, 18px);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: #19191B;
  white-space: nowrap;
  --anim-delay: 0.05s;
}

/* Sys strips */
.op-sys-strip {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 10px var(--pad-page-x);
  border-bottom: 1px solid #A62700;
  overflow: hidden;
  white-space: nowrap;
  --anim-delay: 0.18s;
}

.op-sys-strip > * {
  font-family: 'Orbitron', monospace;
  font-weight: 800;
  font-size: clamp(7px, 0.62vw, 11px);
  letter-spacing: 0.1em;
  color: #A62700;
}

.op-sys-strip .sys-val { opacity: 0.5; }
.op-sys-strip .sys-sep { opacity: 0.25; padding: 0 clamp(4px, 0.6vw, 10px); }

.op-sys-strip--bottom {
  border-top: 1px solid #A62700;
  border-bottom: none;
  padding-bottom: 0;
  --anim-delay: 0.55s;
}

/* ── Scroll hint — animated chevron pill ── */
.op-scroll-hint {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  display: flex;
  flex-direction: column;
  align-items: center;
  background: #28282A;
  border-radius: 24px;
  padding: 8px;
  z-index: 1;
  pointer-events: none;
}

.op-chevron {
  display: block;
  flex-shrink: 0;
  width: 24px;
  height: 24px;
  margin-bottom: -16px;
  color: rgba(255, 99, 0, 0.2);
}
.op-chevron:last-child { margin-bottom: 0; }

/* Each chevron: drops in top→bottom, then chevron-race loop kicks in after */
.op-chevron:nth-child(1) { animation: chevron-enter 0.4s var(--ease-out-expo) 0.90s both, chevron-race 4.5s ease-in-out 1.90s infinite; }
.op-chevron:nth-child(2) { animation: chevron-enter 0.4s var(--ease-out-expo) 0.97s both, chevron-race 4.5s ease-in-out 2.40s infinite; }
.op-chevron:nth-child(3) { animation: chevron-enter 0.4s var(--ease-out-expo) 1.04s both, chevron-race 4.5s ease-in-out 2.90s infinite; }
.op-chevron:nth-child(4) { animation: chevron-enter 0.4s var(--ease-out-expo) 1.11s both, chevron-race 4.5s ease-in-out 3.40s infinite; }
.op-chevron:nth-child(5) { animation: chevron-enter 0.4s var(--ease-out-expo) 1.18s both, chevron-race 4.5s ease-in-out 3.90s infinite; }
.op-chevron:nth-child(6) { animation: chevron-enter 0.4s var(--ease-out-expo) 1.25s both, chevron-race 4.5s ease-in-out 4.40s infinite; }
.op-chevron:nth-child(7) { animation: chevron-enter 0.4s var(--ease-out-expo) 1.32s both, chevron-race 4.5s ease-in-out 4.90s infinite; }
.op-chevron:nth-child(8) { animation: chevron-enter 0.4s var(--ease-out-expo) 1.39s both, chevron-race 4.5s ease-in-out 5.40s infinite; }
.op-chevron:nth-child(9) { animation: chevron-enter 0.4s var(--ease-out-expo) 1.46s both, chevron-race 4.5s ease-in-out 5.90s infinite; }

/* 50/50 main */
.op-header-main {
  display: flex;
  align-items: stretch;
  min-height: 0;
}

.op-header-left {
  flex: 0 0 50%;
  width: 50%;
  border-right: 1px solid #A62700;
  display: flex;
  align-items: center;
  padding: clamp(24px, 4vh, 60px) clamp(24px, 4vw, 60px);
  min-height: 0;
  overflow: hidden;
  --anim-delay: 0.32s;
  --anim-dur: var(--dur-slow);
  background-image:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cline x1='0' y1='0' x2='8' y2='0' stroke='%23A62700' stroke-width='1'/%3E%3Cline x1='0' y1='0' x2='0' y2='8' stroke='%23A62700' stroke-width='1'/%3E%3Cline x1='132' y1='0' x2='140' y2='0' stroke='%23A62700' stroke-width='1'/%3E%3Cline x1='140' y1='0' x2='140' y2='8' stroke='%23A62700' stroke-width='1'/%3E%3Cline x1='0' y1='132' x2='0' y2='140' stroke='%23A62700' stroke-width='1'/%3E%3Cline x1='0' y1='140' x2='8' y2='140' stroke='%23A62700' stroke-width='1'/%3E%3Cline x1='132' y1='140' x2='140' y2='140' stroke='%23A62700' stroke-width='1'/%3E%3Cline x1='140' y1='132' x2='140' y2='140' stroke='%23A62700' stroke-width='1'/%3E%3Ccircle cx='70' cy='70' r='1.5' fill='%23A62700'/%3E%3Ccircle cx='70' cy='0' r='1.5' fill='%23A62700'/%3E%3Ccircle cx='0' cy='70' r='1.5' fill='%23A62700'/%3E%3Ccircle cx='140' cy='70' r='1.5' fill='%23A62700'/%3E%3Ccircle cx='70' cy='140' r='1.5' fill='%23A62700'/%3E%3C/svg%3E"),
    repeating-linear-gradient(0deg, rgba(0,0,0,0.07) 0, rgba(0,0,0,0.07) 1px, transparent 1px, transparent 140px),
    repeating-linear-gradient(90deg, rgba(0,0,0,0.07) 0, rgba(0,0,0,0.07) 1px, transparent 1px, transparent 140px);
  background-size: 140px 140px;
}

.op-bio {
  font-family: var(--font-display);
  font-weight: var(--weight-black);
  font-size: clamp(20px, 2.8vw, 46px);
  line-height: 1.15;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  color: #A62700;
  margin: 0;
}

.op-bio .word {
  display: inline-block;
  --anim-delay: calc(0.3s + var(--i) * 0.12s);
}

.op-header-right {
  flex: 0 0 50%;
  width: 50%;
  display: grid;
  grid-template-rows: 1fr 1fr;
  min-height: 0;
  overflow: hidden;
}

.op-header-top-row {
  border-bottom: 1px solid #A62700;
  display: grid;
  grid-template-columns: 1fr 1fr;
}

.op-header-top-left {
  position: relative;
  overflow: hidden;
  border-right: 1px solid #A62700;
  background: var(--color-brand);
  --anim-delay: 0.40s;
}

.op-header-top-right {
  position: relative;
  overflow: hidden;
  background: var(--color-brand);
  --anim-delay: 0.52s;
}

.op-flow-field,
.op-topo-canvas {
  position: absolute;
  inset: 0;
  display: block;
}

.op-wave-canvas {
  position: absolute;
  inset: 0;
  display: block;
}

@keyframes flow-drift {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }
}

.op-header-bottom-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  min-height: 0;
  --anim-delay: 0.65s;
}

.op-qr-col {
  border-right: 1px solid #A62700;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(16px, 3vh, 40px);
  overflow: hidden;
}

.op-qr-col a { display: contents; }

.home-qr-img {
  max-width: 65%;
  max-height: 65%;
  width: auto;
  height: auto;
  object-fit: contain;
  display: block;
  opacity: 0.85;
  position: relative;
  z-index: 1;
  transition: transform 0.5s var(--ease-out-expo), opacity 0.5s var(--ease-out-expo);
}
.op-qr-col:hover .home-qr-img {
  transform: scale(1.03);
  opacity: 1;
}

/* ── QR equalizer bar hover effect ── */
.op-qr-col { position: relative; }

.op-qr-bars {
  position: absolute;
  bottom: 0; left: 0; right: 0;
  height: 55%;
  display: flex;
  align-items: flex-end;
  justify-content: center;
  gap: 5px;
  padding: 0 18%;
  z-index: 0;
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.4s var(--ease-out-expo);
}
.op-qr-col:hover .op-qr-bars { opacity: 1; }

.op-qr-bar {
  display: block;
  width: 5px;
  height: 100%;
  background: rgba(255, 60, 0, 0.35);
  border-radius: 3px 3px 0 0;
  transform: scaleY(0.15);
  transform-origin: bottom;
  animation-name: qr-eq-bounce;
  animation-timing-function: ease-in-out;
  animation-iteration-count: infinite;
  animation-direction: alternate;
  animation-play-state: paused;
}
.op-qr-col:hover .op-qr-bar { animation-play-state: running; }

.op-qr-bar:nth-child(1) { animation-duration: 0.55s; animation-delay: 0.00s; }
.op-qr-bar:nth-child(2) { animation-duration: 0.80s; animation-delay: 0.07s; }
.op-qr-bar:nth-child(3) { animation-duration: 0.62s; animation-delay: 0.13s; }
.op-qr-bar:nth-child(4) { animation-duration: 1.05s; animation-delay: 0.03s; }
.op-qr-bar:nth-child(5) { animation-duration: 0.73s; animation-delay: 0.19s; }
.op-qr-bar:nth-child(6) { animation-duration: 0.50s; animation-delay: 0.09s; }
.op-qr-bar:nth-child(7) { animation-duration: 0.90s; animation-delay: 0.15s; }

@keyframes qr-eq-bounce {
  from { transform: scaleY(0.15); }
  to   { transform: scaleY(1.0); }
}

.op-orb-scene {
  position: absolute;
  inset: 0;
}

.op-orb-col {
  position: relative;
  overflow: hidden;
  --anim-delay: 0.7s;
}

/* ── Beveled corner overlays — replaces clip-path ── */
/* CSS border triangles in the page background colour cut each corner */
/* ── Corner overlays — restore original clip-path geometry without clip-path ──
   TL + BR: wide trapezoid (202px band + 21px diagonal = 223px total)
   TR + BL: simple 38px diagonal cut
   Each span uses ::before / ::after to add the triangle piece beside the rect. */
.op-corner {
  position: absolute;
  pointer-events: none;
  z-index: 2;
}

/* TL — 202×31 rect, with ::after triangle bridging to the 223px mark on the top edge */
.op-corner--tl {
  top: 0; left: 0;
  width: 202px; height: 31px;
  background: var(--op-bg, #19191B);
}
.op-corner--tl::after {
  content: '';
  position: absolute;
  top: 0; left: 100%;        /* sits flush against right edge of the rect */
  width: 0; height: 0;
  border-top:   31px solid var(--op-bg, #19191B);
  border-right: 21px solid transparent;
}

/* TR — simple 38px diagonal */
.op-corner--tr {
  top: 0; right: 0;
  width: 0; height: 0;
  border-top:  38px solid var(--op-bg, #19191B);
  border-left: 38px solid transparent;
}

/* BL — simple 38px diagonal */
.op-corner--bl {
  bottom: 0; left: 0;
  width: 0; height: 0;
  border-bottom: 38px solid var(--op-bg, #19191B);
  border-right:  38px solid transparent;
}

/* BR — 202×31 rect, with ::before triangle bridging leftward to the 223px mark */
.op-corner--br {
  bottom: 0; right: 0;
  width: 202px; height: 31px;
  background: var(--op-bg, #19191B);
}
.op-corner--br::before {
  content: '';
  position: absolute;
  bottom: 0; right: 100%;    /* sits flush against left edge of the rect */
  width: 0; height: 0;
  border-bottom: 31px solid var(--op-bg, #19191B);
  border-left:   21px solid transparent;
}

.op-orb-angle {
  position: absolute;
  bottom: clamp(8px, 1.2vh, 16px);
  left: clamp(10px, 1.2vw, 20px);
  font-family: 'Orbitron', monospace;
  font-weight: 800;
  font-size: clamp(7px, 0.55vw, 10px);
  letter-spacing: 0.12em;
  color: #A62700;
  opacity: 0.5;
  z-index: 3;
  pointer-events: none;
}


/* ════════════════════════════════
   DARK CASE SECTIONS
════════════════════════════════ */
.op-case {
  padding-top: clamp(60px, 8vh, 100px);
  position: relative;
}

/* ── Case study card ── */
.op-ai-grid {
  display: flex;
  flex-direction: column;
  background: var(--color-surface);
  border: 1px solid #525050;
  margin: 0 clamp(24px, 7.6vw, 110px) clamp(48px, 6vh, 80px);
  opacity: 0;
  translate: 0 24px;
  will-change: transform;
  transform-style: preserve-3d;
  transition: opacity 0.6s var(--ease-out-expo) 0.05s,
              translate 0.6s var(--ease-out-expo) 0.05s,
              transform 0.5s var(--ease-out-expo);
}
.op-case.in-view .op-ai-grid {
  opacity: 1;
  translate: 0 0;
}

/* ── Label row (full width) ── */
.op-ai-label-cell {
  padding: 8px clamp(16px, 2vw, 24px);
  border-bottom: 1px solid #525050;
  font-family: var(--font-body);
  font-weight: var(--weight-semibold);
  font-size: clamp(13px, 1.2vw, 16px);
  color: #ffffff;
  display: flex;
  align-items: center;
  gap: 24px;
  overflow: hidden;
}

.op-label-text {
  white-space: nowrap;
  flex-shrink: 0;
}

.op-label-hatch {
  flex: 1;
  align-self: stretch;
  overflow: hidden;
  background-image: repeating-linear-gradient(
    -45deg,
    #525050 0,
    #525050 1px,
    transparent 1px,
    transparent 8px
  );
  clip-path: inset(0 100% 0 0);
  transition: clip-path 0.7s var(--ease-out-expo) 0.6s;
}
.op-case.in-view .op-label-hatch {
  clip-path: inset(0 0% 0 0);
}

/* ── Content row ── */
.op-ai-content-row {
  display: flex;
  gap: 0;
  padding: 0;
}

/* ── Left col ── */
.op-ai-left {
  display: flex;
  flex-direction: column;
  gap: 16px;
  flex: 1;
  min-width: 0;
  padding: 24px;
  border-right: 1px solid #525050;
}

/* Grey decal box around headline */
.op-ai-title-box {
  background: #525050;
  padding: 8px;
  display: block;
  align-self: stretch;
}

.op-ai-headline {
  font-family: var(--font-display);
  font-weight: var(--weight-black);
  font-size: clamp(32px, 4vw, 64px);
  line-height: 1.0;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  color: var(--color-surface);
  margin: 0;
}

/* Metric text — bordered box */
.op-ai-metric {
  font-family: var(--font-body);
  font-weight: var(--weight-regular);
  font-size: clamp(14px, 1.4vw, 20px);
  line-height: 1.55;
  color: rgba(255, 255, 255, 0.85);
  margin: 0;
  padding: 0;
  flex: 1;
}

/* Date strip — thin 18px bar, blocks overflow+clip */
.op-ai-date-strip {
  display: flex;
  align-items: center;
  height: 18px;
  overflow: hidden;
  margin-top: auto;
  gap: 0;
}

.op-ai-date-label {
  font-family: var(--font-body);
  font-size: 12px;
  color: rgba(255, 255, 255, 0.6);
  white-space: nowrap;
  flex-shrink: 0;
  padding: 0 8px;
}

.op-ai-date-blocks {
  display: flex;
  gap: 0;
  flex: 1;
  height: 60px;
}

.op-ai-date-block {
  flex: 1;
  height: 100%;
}
.op-ai-date-block:nth-child(1) { background: #525050; }
.op-ai-date-block:nth-child(2) { background: #3a3a3d; }
.op-ai-date-block:nth-child(3) { background: #1b1b1d; }

/* ── App Store link (GT-3000) ── */
.op-appstore-link {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  color: var(--color-brand);
  font-family: var(--font-body);
  font-size: 16px;
  text-decoration: none;
  flex-shrink: 0;
  padding-right: 8px;
  transition: opacity 0.2s ease;
}
.op-appstore-link:hover { opacity: 0.7; }
.op-appstore-link svg { flex-shrink: 0; }

/* ── Right col (body) ── */
.op-ai-body-cell {
  flex: 1;
  min-width: 0;
  display: flex;
  align-items: flex-start;
  padding: 24px;
}

.op-ai-body {
  font-family: var(--font-body);
  font-weight: var(--weight-regular);
  font-size: clamp(13px, 1.2vw, 16px);
  line-height: 1.65;
  color: rgba(255, 255, 255, 0.75);
  margin: 0;
}

/* .op-case::before grain removed — pseudo-element with position:absolute
   was creating a stacking context that triggered compositor layer boundaries
   (visible as dark bands around the orange header/footer). */

.op-case-label {
  padding: 0 clamp(24px, 7.6vw, 110px) clamp(16px, 2vh, 24px);
  font-family: var(--font-body);
  font-weight: var(--weight-semibold);
  font-size: var(--cs-label);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.45);
}

.op-case-text {
  display: flex;
  align-items: flex-start;
  gap: clamp(24px, 4vw, 60px);
  padding: 0 clamp(24px, 7.6vw, 110px) clamp(48px, 6vh, 80px);
}

.op-headline {
  flex: 0 0 50%;
  font-family: var(--font-display);
  font-weight: var(--weight-black);
  font-size: var(--cs-display);
  line-height: 1.05;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  color: #ffffff;
  margin: 0;
}

/* Mixed case variant — HomePPL headline */
.op-headline--mixed {
  text-transform: none;
  letter-spacing: 0;
}

.op-body {
  flex: 1;
  font-family: var(--font-body);
  font-weight: var(--weight-regular);
  font-size: var(--cs-body);
  line-height: 1.65;
  color: rgba(255, 255, 255, 0.65);
  margin: 0;
  padding-top: 8px;
}


/* ════════════════════════════════
   HORIZONTAL CAROUSELS
   Sticky scroll — same pattern as case-s4
════════════════════════════════ */
.op-carousel-section {
  position: relative;
  overflow: clip;
}

.op-carousel-ai     { height: 350vh; }
.op-carousel-homeppl { height: 650vh; }

.op-carousel-sticky {
  position: sticky;
  top: 0;
  height: 100vh;
  display: flex;
  align-items: center;
  overflow: hidden;
  background: transparent;
}

.op-track {
  display: flex;
  gap: 80px;
  align-items: center;
  will-change: transform;
  padding-left: 0;
}

.op-track--homeppl { gap: 40px; padding-right: 0; }
.op-track--homeppl .op-strip-item,
.op-track--ai .op-strip-item {
  width: clamp(300px, calc(100vw - 120px), 1200px);
  height: auto;
  aspect-ratio: 16 / 9;
}

.op-slide {
  flex-shrink: 0;
  display: flex;
  align-items: center;
}

/* Phone cards — AI Stylist (portrait) */
.op-phone {
  height: clamp(320px, 82vh, 720px);
  width: auto;
  aspect-ratio: 430 / 932;
  border-radius: clamp(16px, 2vw, 36px);
  overflow: hidden;
  background: var(--color-bg-case);
}

.op-phone img,
.op-phone video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.op-phone { position: relative; }

/* Legacy placeholder (Ralen, Snapchat) */
.op-screen--placeholder {
  background: #2a2a2c;
  display: flex;
  align-items: center;
  justify-content: center;
  height: clamp(240px, 50vh, 540px);
  aspect-ratio: 16 / 9;
  border-radius: 8px;
  flex-shrink: 0;
}

.op-screen--placeholder::after {
  content: 'Image coming soon';
  font-family: var(--font-body);
  font-size: 13px;
  color: rgba(255,255,255,0.25);
  letter-spacing: 0.1em;
  text-transform: uppercase;
}

/* ════════════════════════════════
   AI Stylist — horizontal scroll strip
════════════════════════════════ */
.op-strip-section {
  padding-bottom: clamp(60px, 8vh, 120px);
}

.op-strip-track {
  display: flex;
  gap: 12px;
  height: clamp(340px, 52vh, 580px);
  overflow-x: auto;
  overflow-y: hidden;
  scrollbar-width: none;
  cursor: grab;
  padding: 0 clamp(24px, 7.6vw, 110px);
}

.op-strip-track::-webkit-scrollbar { display: none; }
.op-strip-track.is-dragging { cursor: grabbing; }

.op-strip-item {
  flex-shrink: 0;
  height: 100%;
  overflow: hidden;
  position: relative;   /* canvas anchor for noWrap chromaWipe */
}

/* Carousel slides — no border */
.op-track .op-strip-item {
  border: none;
}
.op-track .op-strip-item img,
.op-track .op-strip-item video {
  opacity: 1;
}

.op-strip-item--phone    { aspect-ratio: 430 / 932; }
.op-strip-item--portrait { aspect-ratio: 9 / 16; }
.op-strip-item--landscape { aspect-ratio: 16 / 9; }

.op-strip-item img,
.op-strip-item video {
  width: 100%;
  height: 100%;
  object-fit: contain;
  display: block;
}

.op-strip-item--offwhite { background: #DFDFDF; }
.op-strip-item--padded {
  padding: 24px;
  box-sizing: border-box;
}
.op-strip-item--cover img,
.op-strip-item--cover video { object-fit: cover; }
.op-strip-item--center {
  display: flex;
  align-items: center;
  justify-content: center;
}

/* Portrait phone inset — for video centred inside a landscape strip item */
.op-strip-phone {
  height: 88%;
  aspect-ratio: 430 / 932;
  overflow: hidden;
  border-radius: 12px;
}
.op-strip-phone video {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.op-strip-item--dark {
  background: var(--color-surface);
  border: 1px solid rgba(255,255,255,0.1);
  padding: clamp(14px, 2vw, 28px);
  display: flex;
}
.op-strip-item--dark video {
  margin: auto;
  width: auto;
  height: auto;
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
}


/* Shared backdrop text — used across all carousel sections */
.op-backdrop-text {
  position: absolute;
  left: 0;
  right: 0;
  top: 50%;
  translate: 0 -50%;
  text-align: center;
  font-family: var(--font-display);
  font-weight: var(--weight-black);
  font-size: clamp(18px, 2.6vw, 40px);
  color: #fff;
  white-space: nowrap;
  letter-spacing: -0.02em;
  text-transform: uppercase;
  pointer-events: none;
  z-index: 0;
}

/* AI carousel sticky — transparent, page bg shows through */
.op-carousel-sticky--ai {
  background: transparent;
}

/* HomePPL / Ralen carousel sticky */
.op-carousel-sticky--homeppl {
  background: transparent;
}

.sc-word {
  display: inline-block;
  overflow: hidden;
  vertical-align: bottom;
  white-space: nowrap;
}

.sc-char {
  display: inline-block;
  transform: translateY(110%);
  transition: transform 0.65s var(--ease-out-expo) calc(var(--i) * 0.03s);
}

.op-carousel-section.in-view .sc-char,
.op-case.in-view .sc-char {
  transform: translateY(0%);
}

/* ── Backdrop text words (word stagger) ── */
.op-backdrop-text .word {
  display: inline-block;
  opacity: 0;
  translate: 0 16px;
  transition: opacity 0.85s var(--ease-out-expo) calc(0.3s + var(--i) * 0.12s),
              translate 0.85s var(--ease-out-expo) calc(0.3s + var(--i) * 0.12s);
}
.op-backdrop-text.in-view .word {
  opacity: 1;
  translate: 0 0;
}

/* ── Card headline — word stagger ── */
.op-case .op-ai-headline .word {
  opacity: 0;
  translate: 0 10px;
  transition: opacity 0.5s ease calc(0.2s + var(--i) * 0.025s),
              translate 0.5s var(--ease-out-expo) calc(0.2s + var(--i) * 0.025s);
}
.op-case.in-view .op-ai-headline .word {
  opacity: 1;
  translate: 0 0;
}

/* ── Card body — line stagger ── */
.op-case .op-ai-body .word {
  opacity: 0;
  translate: 0 12px;
  transition: opacity 0.6s var(--ease-out-expo) calc(0.15s + var(--line, 0) * 0.09s),
              translate 0.6s var(--ease-out-expo) calc(0.15s + var(--line, 0) * 0.09s);
}
.op-case.in-view .op-ai-body .word {
  opacity: 1;
  translate: 0 0;
}

.op-track--homeppl {
  position: relative;
  z-index: 1;
}

/* Big backdrop heading */
/* Progress bar — sticky at top of the whole one-pager */
.op-ai-progress {
  position: sticky;
  top: 0;
  left: 0;
  right: 0;
  height: 1px;
  z-index: 100;
  background: rgba(0,0,0,0.08);
}

.op-ai-progress-bar {
  height: 100%;
  width: 0%;
  background: var(--color-brand);
}


/* Track sits above the backdrop text */
.op-track--ai {
  position: relative;
  z-index: 1;
}

/* AI carousel — tighter gap, explicit height for mixed-ratio items */
.op-track--ai { gap: 12px; }
.op-track--ai .op-strip-item { height: clamp(320px, 82vh, 720px); }

/* ── Slide 4: 3 cropped phone screens, grey bg, top-aligned, clipped at bottom ──
   Figma node 3420-26870: align-items flex-start, gap 40px (2.5% of 1600px).
   Node 3420-26440: background #dbdbdb. Phones start at y=101px → margin-top 6.3%.
   Phone 1 (Thumb): 441×819px → aspect-ratio 441/819.
   Phones 2&3 (DateNight, PDP): 441×919px → aspect-ratio 441/919. */
.op-strip-item--cropped-phones {
  background: #dbdbdb;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 2.5%;
  overflow: hidden;
  padding: 5%;
}

/* Both phones — DateNight + PDP (441×919px) */
.op-crop-phone {
  flex: 0 0 20%;
  aspect-ratio: 441 / 919;
  margin-top: 0;
  overflow: hidden;
  outline: 2px solid #dbdbdb;
}

.op-crop-phone video,
.op-crop-phone img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transform: scale(1.015);
}

/* Landscape screenshot — same grey padded container as crop-phone but wider */
.op-crop-screen {
  flex: 0 0 72%;
  aspect-ratio: 1401 / 900;
  overflow: hidden;
  outline: 2px solid #dbdbdb;
}

.op-crop-screen img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* ════════════════════════════════
   LANDSCAPE SLIDE — .op-ls
   Dedicated component for landscape video/image slides.
   Used in: Ralen, HomePPL carousels.
   Kept separate from the phone-crop system so mobile fixes
   don't bleed into ASOS/Snapchat phone layouts.
════════════════════════════════ */

.op-ls {
  width: 100%;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  position: relative;
}

.op-ls img,
.op-ls video {
  width: 100%;
  height: 100%;
  display: block;
}

/* Padded variant — off-white bg, content inset (Ralen videos, H5) */
.op-ls--padded {
  background: #DFDFDF;
  padding: 24px;
  box-sizing: border-box;
}
.op-ls--padded img,
.op-ls--padded video {
  object-fit: contain;
}

/* Cover variant — full bleed (HomePPL H1–H4) */
.op-ls--cover img,
.op-ls--cover video {
  object-fit: cover;
}

/* Mobile: fill full width, no JS parallax shifts */
@media (max-width: 768px) {
  .op-ls {
    width: 100%;
    aspect-ratio: 16 / 9;
  }
  .op-ls img,
  .op-ls video {
    transform: none !important;
  }
}

/* ── Slide 5: 3 full iPhones with bezels, grey bg, vertically centred ──
   Figma node 3420-26873 (3Phones), frame 1600×900px.
   Background: node 3420-26874 grey rect → #dbdbdb.
   Phone positions (absolute): End@153px, Start@601px, Middle@1049px — all top:50px.
   Phone size: 399×800px → width 24.9375% of 1600, aspect-ratio 399/800.
   Gap: 601-153-399 = 49px → 3.0625% of 1600.
   Side margins: 153px → 9.5625%. Top/bottom: 50px → phones exactly vertically centred. */
.op-strip-item--full-phones {
  background: #dbdbdb;       /* node 3420-26874 grey background rect */
  display: flex;
  align-items: center;       /* 50px top+bottom = perfectly centred */
  justify-content: center;   /* 153px side margins = 9.5625% each side */
  gap: 3.0625%;              /* Figma: 49px / 1600px */
}

.op-full-phone {
  flex: 0 0 24.9375%;        /* Figma: 399px / 1600px */
  aspect-ratio: 399 / 800;   /* Figma: 399×800px phone frames */
  overflow: hidden;
}

.op-full-phone video {
  width: 100%;
  height: 100%;
  object-fit: contain;       /* bezels baked into video — don't crop */
  display: block;
}

/* ── Slide 6: single phone centred, grey bg, crops at bottom ──
   Figma node 3426-26889 (YourThumb), frame 1600×900px.
   Background: node 3426-26890 grey rect → #dbdbdb.
   Phone (node 3426-26897): 506×939px, horizontally centred, top 50px.
   Phone overflows frame bottom by 39px — intentionally clipped.
   Width: 506/1600 = 31.625%. Top offset: 50/1600 = 3.125% of frame width. */
.op-strip-item--single-phone {
  background: #dbdbdb;
  display: flex;
  align-items: flex-start;
  justify-content: center;
  overflow: hidden;
}

.op-single-phone {
  flex: 0 0 31.625%;         /* Figma: 506px / 1600px */
  aspect-ratio: 506 / 939;
  margin-top: 3.125%;        /* Figma: top 50px / 1600px frame width */
  overflow: hidden;
}

.op-single-phone video {
  width: 100%;
  height: 100%;
  object-fit: contain;
  display: block;
}

@media (max-width: 768px) {
  .op-strip-track {
    height: clamp(260px, 48vh, 400px);
    gap: 8px;
  }
  .op-track--ai { gap: 8px; }
  .op-track--ai .op-strip-item { height: clamp(280px, 70vh, 600px); }
}


/* ════════════════════════════════
   ORANGE FOOTER
════════════════════════════════ */

/* Shell — plain rectangle, no compositor triggers */
.op-footer-shell {
  position: relative;
  margin: 24px;
}

/* Inner — orange fill + all content */
.op-footer-inner {
  position: relative;
  background: var(--color-brand);
  flex-shrink: 0;
}

/* 2-column main body — matches Figma 703/1406 split */
.op-footer-main {
  display: grid;
  grid-template-columns: 1fr 1fr;
  min-height: clamp(200px, 38vh, 440px);
  border-top: 1px solid #A62700;
  border-bottom: 1px solid #A62700;
}

/* Left — large name, bottom-aligned, 32px left padding */
.op-footer-name-col {
  display: flex;
  align-items: flex-end;
  padding: clamp(24px, 3vw, 32px);
  border-right: 1px solid #A62700;
}

.op-footer-name {
  font-family: var(--font-display);
  font-weight: var(--weight-black);
  font-size: clamp(40px, 6.5vw, 96px);
  line-height: 0.95;
  letter-spacing: -0.01em;
  text-transform: uppercase;
  color: #A62700;
  margin: 0;
}

/* Right — empty decorative top area + buttons at bottom */
.op-footer-right-col {
  display: grid;
  grid-template-rows: 1fr auto;
}

.op-footer-right-top {
  border-bottom: 1px solid #A62700;
  display: grid;
  grid-template-columns: 1fr 1fr;
}

.op-footer-rt-left {
  border-right: 1px solid #A62700;
}

.op-footer-rt-right {
  position: relative;
  overflow: hidden;
  background-image:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cline x1='0' y1='0' x2='8' y2='0' stroke='%23A62700' stroke-width='1'/%3E%3Cline x1='0' y1='0' x2='0' y2='8' stroke='%23A62700' stroke-width='1'/%3E%3Cline x1='132' y1='0' x2='140' y2='0' stroke='%23A62700' stroke-width='1'/%3E%3Cline x1='140' y1='0' x2='140' y2='8' stroke='%23A62700' stroke-width='1'/%3E%3Cline x1='0' y1='132' x2='0' y2='140' stroke='%23A62700' stroke-width='1'/%3E%3Cline x1='0' y1='140' x2='8' y2='140' stroke='%23A62700' stroke-width='1'/%3E%3Cline x1='132' y1='140' x2='140' y2='140' stroke='%23A62700' stroke-width='1'/%3E%3Cline x1='140' y1='132' x2='140' y2='140' stroke='%23A62700' stroke-width='1'/%3E%3Ccircle cx='70' cy='70' r='1.5' fill='%23A62700'/%3E%3Ccircle cx='70' cy='0' r='1.5' fill='%23A62700'/%3E%3Ccircle cx='0' cy='70' r='1.5' fill='%23A62700'/%3E%3Ccircle cx='140' cy='70' r='1.5' fill='%23A62700'/%3E%3Ccircle cx='70' cy='140' r='1.5' fill='%23A62700'/%3E%3C/svg%3E"),
    repeating-linear-gradient(0deg, rgba(0,0,0,0.06) 0, rgba(0,0,0,0.06) 1px, transparent 1px, transparent 140px),
    repeating-linear-gradient(90deg, rgba(0,0,0,0.06) 0, rgba(0,0,0,0.06) 1px, transparent 1px, transparent 140px);
  background-size: 140px 140px;
}

#footerCanvas {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  display: block;
}

/* Buttons — flex row with 16px gap, padded container (Figma: gap 16px) */
.op-footer-links-row {
  display: flex;
  gap: 16px;
  padding: 16px;
}

.op-footer-btn {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  background: #28282A;
  font-family: var(--font-display);
  font-weight: var(--weight-black);
  font-size: 14px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--color-brand);
  text-decoration: none;
  padding: 24px;
  transition: opacity 0.2s ease;
}

.op-footer-btn:hover { opacity: 0.7; }

/* Bottom strip */
.op-footer-strip {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 10px clamp(20px, 3vw, 40px);
  overflow: hidden;
  white-space: nowrap;
}

.op-footer-strip .sys-val,
.op-footer-strip .sys-sep {
  font-family: 'Orbitron', monospace;
  font-weight: 800;
  font-size: clamp(7px, 0.62vw, 11px);
  letter-spacing: 0.1em;
  color: #A62700;
}

.op-footer-strip .sys-val { opacity: 0.5; }
.op-footer-strip .sys-sep { opacity: 0.25; padding: 0 clamp(4px, 0.6vw, 10px); }


/* ════════════════════════════════
   RESPONSIVE
════════════════════════════════ */
@media (max-width: 768px) {
  /* GPU compositing — eliminates subpixel hairline artifact at card edges on mobile Chrome */
  .op-header-inner,
  .op-nf-card { -webkit-backface-visibility: hidden; backface-visibility: hidden; }

  .op-header-inner { height: auto; min-height: calc(100svh - 48px - env(safe-area-inset-top, 0px)); }

  .op-header-main {
    flex: 1;
    min-height: 0;
    flex-direction: column;
    overflow: hidden;
  }

  .op-header-shell {
    margin-top: calc(24px + env(safe-area-inset-top, 0px));
  }

  /* Push name below the TL corner decoration (31px tall) */
  .op-header-name {
    padding-top: 44px;
  }

  .op-header-left {
    flex: 1;
    min-height: 0;
    width: 100%;
    border-right: none;
    border-bottom: 1px solid #A62700;
    align-items: center;
    justify-content: center;
    padding: 24px;
  }

  .op-bio { font-size: clamp(24px, 6.5vw, 32px); line-height: 1.1; }

  .op-header-right {
    flex: 0 0 auto;
    width: 100%;
    grid-template-rows: 1fr;
    height: clamp(160px, 22vh, 200px);  /* taller bottom section */
    min-height: 0;
  }

  .op-header-top-row { display: none; }

  .op-header-bottom-row { grid-template-columns: 1fr 1fr; height: 100%; }

  /* Scroll hint: reposition to sit within the bottom row section */
  .op-scroll-hint {
    top: auto;
    bottom: calc(clamp(100px, 14vh, 120px) + 30px); /* centre of bottom row + sys strip height */
  }

  .op-case-text {
    flex-direction: column;
    gap: clamp(16px, 3vh, 32px);
  }

  .op-headline { flex: none; width: 100%; font-size: var(--text-mobile-headline); }

  .op-case { padding-top: 80px; }       /* 80px between case studies */
  .op-ai-grid { margin-bottom: 24px; }  /* 24px card → carousel gap */
  .op-ai-content-row { flex-direction: column; }
  .op-ai-left { gap: 12px; padding: 16px; border-right: none; border-bottom: 1px solid #525050; }
  .op-ai-body-cell { padding: 16px; }
  .op-ai-headline { font-size: clamp(22px, 7.5vw, 32px); }
  .op-ai-metric { font-size: 14px; flex: none; }
  .op-ai-body { font-size: 14px; }

  /* ── Carousel → stacked vertical layout on mobile ── */

  /* Clear fixed bottom nav on last card */
  .op-strip-section { padding-bottom: 120px; }

  /* Remove tall scroll height */
  .op-carousel-ai,
  .op-carousel-homeppl { height: auto !important; }

  /* Un-sticky, let content flow normally */
  .op-carousel-sticky {
    position: static;
    height: auto;
    overflow: visible;
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 24px;
    padding: 0 clamp(24px, 7.6vw, 110px);
  }

  /* Remove clip so nothing gets cut */
  .op-carousel-section { overflow: visible; }

  /* Backdrop text: normal block flow, sits above the image stack */
  .op-backdrop-text {
    position: static;
    translate: none;
    top: auto;
    left: 0;
    right: 0;
    width: 100%;
    padding: 0;
    text-align: left;
    font-size: 32px;
    line-height: 1.05;
    white-space: normal;
  }

  /* Track: column, no JS transform, centered items */
  .op-track {
    flex-direction: column;
    align-items: center;
    gap: 16px;
    transform: none !important;
    will-change: auto;
  }

  /* Slides fill full width, no inherited height */
  .op-slide { width: 100%; height: auto; }

  /* Strip items: full width, height from aspect-ratio */
  .op-track--homeppl .op-strip-item,
  .op-track--ai .op-strip-item {
    width: 100%;
    height: auto;
  }
  .op-phone { height: clamp(280px, 70vh, 600px); }
  .op-screen { height: clamp(160px, 30vh, 300px); }

  .op-footer-main { grid-template-columns: 1fr; min-height: auto; }
  .op-footer-name-col { border-right: none; border-bottom: 1px solid #A62700; }
  .op-footer-name { font-size: 40px; }
  .op-footer-right-top { display: none; }
  .op-footer-links-row { gap: 8px; padding: 12px; }
  .op-footer-btn { padding: 16px 0; font-size: 13px; }
}


/* ════════════════════════════════
   WAVE RIBBON
════════════════════════════════ */

.op-ribbon-section {
  height: 300vh;
  position: relative;
}

.op-ribbon-sticky {
  position: sticky;
  top: 0;
  height: 100vh;
  overflow: hidden;
  display: flex;
  align-items: flex-start;
  justify-content: center;
  padding-top: clamp(60px, 12vh, 140px);
}

.op-ribbon-canvas {
  position: absolute;
  inset: 0;
  display: block;
}

/* Tagline text */
.op-ribbon-text {
  position: relative;
  z-index: 1;
  font-family: var(--font-display);
  font-weight: var(--weight-black);
  font-size: clamp(22px, 3.2vw, 52px);
  line-height: 1.15;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  text-align: center;
  color: var(--color-brand);
  max-width: clamp(300px, 70vw, 960px);
  margin: 0;
}

/* Character clip — hides overflow so char slides up from below */
.op-ribbon-char-clip {
  display: inline-block;
  overflow: hidden;
  vertical-align: bottom;
  line-height: inherit;
}

.op-ribbon-char {
  display: inline-block;
  transform: translateY(110%);
  transition: transform 0.55s var(--ease-out-expo);
}

.op-ribbon-char-clip.revealed .op-ribbon-char {
  transform: translateY(0%);
}


/* ════════════════════════════════
   TAGLINE SECTION
════════════════════════════════ */

.op-tagline-section {
  background: var(--color-brand);
  padding: clamp(80px, 14vh, 180px) clamp(32px, 8vw, 120px);
}

.op-tagline-inner {
  max-width: 1200px;
  margin: 0 auto;
}

.op-tagline-row {
  font-family: var(--font-display);
  font-weight: var(--weight-black);
  font-size: clamp(36px, 6.5vw, 96px);
  line-height: 1.05;
  letter-spacing: -0.01em;
  text-transform: uppercase;
  color: #C4C4C4;
  margin: 0;
  padding: clamp(20px, 3.5vh, 52px) 0;
}

.op-tagline-rule {
  width: 100%;
  height: 1px;
  background: rgba(0, 0, 0, 0.15);
}


/* ════════════════════════════════
   NEW FOOTER
════════════════════════════════ */

/* ── Footer: sits above Snapchat content, slides in on scroll ── */
.op-nf {
  position: relative;
  z-index: 20;
  margin-top: -80px;
  translate: 0 60px;
  transition: translate 0.8s var(--ease-out-expo);
}
.op-nf.in-view {
  translate: 0 0;
}

/* ── Footer child entrance animations ── */
.op-nf-ticker,
.op-nf-wave-area,
.op-nf-btn-row,
.op-nf-coord-strip {
  opacity: 0;
  translate: 0 16px;
  transition: opacity 0.75s var(--ease-out-expo), translate 0.75s var(--ease-out-expo);
}
/* Headline row: translate only — opacity handled by word stagger below */
.op-nf-headline-row {
  translate: 0 16px;
  transition: translate 0.75s var(--ease-out-expo);
}
.op-nf.in-view .op-nf-ticker        { opacity: 1; translate: 0 0; transition-delay: 0.1s; }
.op-nf.in-view .op-nf-wave-area     { opacity: 1; translate: 0 0; transition-delay: 0.25s; }
.op-nf.in-view .op-nf-headline-row  {             translate: 0 0; transition-delay: 0.4s; }
.op-nf.in-view .op-nf-btn-row       { opacity: 1; translate: 0 0; transition-delay: 0.55s; }
.op-nf.in-view .op-nf-coord-strip   { opacity: 1; translate: 0 0; transition-delay: 0.7s; }

/* ── GET IN TOUCH word drift (scroll reveal) ── */
.op-nf-headline .word {
  display: inline-block;
  opacity: 0;
  translate: 0 16px;
  transition: opacity 0.85s var(--ease-out-expo) calc(0.4s + var(--i) * 0.15s),
              translate 0.85s var(--ease-out-expo) calc(0.4s + var(--i) * 0.15s);
}
.op-nf.in-view .op-nf-headline .word {
  opacity: 1;
  translate: 0 0;
}

/* ── HomePPL fades OUT (opacity 1→0) as the footer slides over it ── */
#opCaseHomePPL {
  transition: opacity 0.9s ease;
}
#opCaseHomePPL.footer-active {
  opacity: 0;
}

/* ── Top ticker strip ── */
.op-nf-ticker {
  overflow: hidden;
  padding: 8px 0;
  margin: 0 24px;
}
.op-nf-ticker-track {
  display: flex;
  width: max-content;
  animation: flow-drift 35s linear infinite;
}
.op-nf-ticker-track span {
  font-family: var(--font-display);
  font-weight: var(--weight-black);
  font-size: 12px;
  line-height: 24px;
  color: #C4C4C4;
  text-transform: uppercase;
  white-space: nowrap;
}

/* ── Orange card ── */
.op-nf-card {
  background: var(--color-brand);
  position: relative;
  display: flex;
  flex-direction: column;
  margin: 0 24px 24px;
  padding: clamp(40px, 6vh, 90px) 0 40px;
  /* Chamfer as a true clipped polygon — one continuous path, no overlay seam */
  clip-path: polygon(
    0 31px,
    202px 31px,
    223px 0,
    calc(100% - 38px) 0,
    100% 38px,
    100% calc(100% - 31px),
    calc(100% - 202px) calc(100% - 31px),
    calc(100% - 223px) 100%,
    38px 100%,
    0 calc(100% - 38px)
  );
}

/* ── Wave rectangle — two-panel row ── */
.op-nf-wave-area {
  display: flex;
  height: clamp(120px, 22vh, 261px);
  flex-shrink: 0;
  gap: 24px;
  padding: 0 32px;
  align-items: stretch;
}

/* Left panel — bevelled TL/TR/BL + trapezoid step BR, 1px #A62700 border */
.op-nf-wave-left {
  position: relative;
  flex: 1;
  min-width: 0;
  /* Border colour fills the outer polygon shape */
  background: #A62700;
  clip-path: polygon(
    0 0,
    100% 0,
    100% 100%,
    22px 100%,
    0 calc(100% - 22px)
  );
}

/* Orange fill — 1px inset, preserving BL bevel */
.op-nf-wave-left::before {
  content: '';
  position: absolute;
  inset: 0;
  background: var(--color-brand);
  clip-path: polygon(
    1px 1px,
    calc(100% - 1px) 1px,
    calc(100% - 1px) calc(100% - 1px),
    23px calc(100% - 1px),
    1px calc(100% - 23px)
  );
  z-index: 0;
}

/* Inset container — replaces canvas, same z-index:1 sits above ::before orange fill */
.op-nf-inset {
  position: absolute;
  inset: 0;
  z-index: 1;
  display: flex;
  align-items: center;
  padding: 0 40px;
  gap: 10px;
}

/* Decal — empty bordered rectangle, Figma: 136×101px */
.op-nf-decal {
  flex-shrink: 0;
  width: 136px;
  height: 101px;
  background: #ffffff;
}
@keyframes decal-wipe {
  from { clip-path: inset(0 100% 0 0); }
  to   { clip-path: inset(0 0% 0 0); }
}
.op-nf.in-view .op-nf-decal {
  animation: decal-wipe 0.55s var(--ease-out-expo) 0.5s both;
}

/* Gradient blocks — fills space between decal and barcode */
.op-nf-blocks {
  flex: 1;
  display: flex;
  height: 101px;
  overflow: hidden;
  min-width: 0;
}
.op-nf-block    { flex: 1; }
.op-nf-block--1 { background: #a62700; }
.op-nf-block--2 { background: #8b2100; }
.op-nf-block--3 { background: #6e1a00; }

/* Barcode — fixed width, Figma: 2 groups of bars clipped at 101px */
.op-nf-bars {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  height: 101px;
  overflow: hidden;
  gap: 1px;
}
.op-nf-bar-group        { display: flex; align-items: center; }
.op-nf-bar-group--wide  { gap: 6px; }
.op-nf-bar-group--tight { gap: 3px; }
.op-nf-bar {
  flex-shrink: 0;
  height: 181px;
  background: #6e1a00;
}

/* Right panel — back to top button */
.op-nf-btt {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 8px;
  width: clamp(160px, 18vw, 250px);
  flex-shrink: 0;
  border: 1px solid #A62700;
  background: transparent;
  cursor: pointer;
  padding: 16px 8px;
  position: relative;
  overflow: hidden;
  transition: background 0.25s ease;
}
.op-nf-btt:hover {
  background: rgba(166, 39, 0, 0.08);
}

/* Arrow SVG wrapper */
.op-nf-btt-arrow {
  display: block;
  width: clamp(48px, 7vw, 96px);
  height: clamp(48px, 7vw, 96px);
  transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1);
}
.op-nf-btt-arrow svg {
  width: 100%;
  height: 100%;
  display: block;
}

/* On hover: arrow launches up then a ghost copy fades in from bottom */
.op-nf-btt:hover .op-nf-btt-arrow {
  transform: translateY(-6px);
}

/* Label — removed from design, hidden as safety fallback */
.op-nf-btt-label {
  display: none;
}
.op-nf-btt-label-UNUSED {
  font-family: var(--font-display);
  font-weight: var(--weight-black);
  font-size: 10px;
  letter-spacing: 0.12em;
  color: #A62700;
  text-transform: uppercase;
  transition: opacity 0.25s ease;
}
.op-nf-btt:hover .op-nf-btt-label {
  opacity: 0.7;
}

/* ── GET IN TOUCH ── */
.op-nf-headline-row {
  flex: 1;
  padding: clamp(24px, 4vh, 40px) clamp(16px, 2vw, 32px);
  display: flex;
  align-items: center;
  justify-content: center;
  position: relative;
  overflow: hidden;
}
.op-nf-headline {
  font-family: var(--font-display);
  font-weight: var(--weight-black);
  font-size: clamp(40px, 7vw, 100px);
  line-height: 1;
  color: #f4f4f4;
  text-transform: uppercase;
  white-space: nowrap;
  margin: 0;
}

/* ── Spaceship — desktop accent, layered above heading ── */
.op-nf-spaceship {
  position: absolute;
  left: clamp(16px, 4vw, 60px);
  top: 50%;
  transform: translateY(-50%);
  width: clamp(100px, 16vw, 220px);
  height: auto;
  opacity: 1;
  mix-blend-mode: multiply;
  z-index: 1;               /* above the heading — blend now interacts with letter shapes */
  animation: ship-hover 6s ease-in-out infinite;
  pointer-events: none;
  user-select: none;
}

/* ── CTA buttons ── */
.op-nf-btn-row {
  display: flex;
  gap: 16px;
  padding: clamp(16px, 2.5vh, 24px) clamp(16px, 2vw, 32px);
  align-items: stretch;
}
.op-nf-btn {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid #A62700;
  padding: clamp(16px, 2.5vh, 24px) 8px;
  font-family: var(--font-display);
  font-weight: var(--weight-black);
  font-size: 16px;
  color: #a62700;
  text-decoration: none;
  text-transform: uppercase;
  background: transparent;
  transition: background 0.2s ease, color 0.2s ease;
}
.op-nf-btn:hover {
  background: rgba(166, 39, 0, 0.1);
  color: #28282a;
}

/* ── Copyright — sits in the bottom-right chamfer gap outside the card ── */
.op-nf-copyright {
  position: absolute;
  bottom: 12px;
  right: 16px;
  font-family: var(--font-body);
  font-size: 12px;
  font-weight: 400;
  color: #6b6b6b;
  letter-spacing: 0.04em;
  pointer-events: none;
}

/* ── Footer credit ── */
.op-nf-credit {
  font-family: var(--font-body);
  font-size: 11px;
  font-weight: 500;
  color: #a62700;
  opacity: 0.6;
  text-align: center;
  padding: 12px clamp(20px, 3vw, 40px);
  letter-spacing: 0.06em;
}

/* ── Bottom coordinate ticker ── */
.op-nf-coord-strip {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 48px;
  border-top: 1px solid #A62700;
  overflow: hidden;
  white-space: nowrap;
  padding: 0 clamp(20px, 3vw, 40px);
}
.op-nf-coord-strip .sys-val,
.op-nf-coord-strip .sys-sep {
  font-family: 'Orbitron', monospace;
  font-weight: 800;
  font-size: clamp(7px, 0.62vw, 11px);
  letter-spacing: 0.1em;
  color: #A62700;
}
.op-nf-coord-strip .sys-val { opacity: 0.5; }
.op-nf-coord-strip .sys-sep { opacity: 0.25; padding: 0 clamp(4px, 0.6vw, 10px); }

@media (max-width: 768px) {

  /* Wave area: stack inset + BTT vertically, inset from card edges to match btn-row */
  .op-nf-wave-area {
    flex-direction: column;
    height: auto;
    padding: 0 16px;
    gap: 8px;
  }

  /* Barcode inset: full-width 132px bordered box, centring flex container */
  .op-nf-wave-left {
    display: flex;
    align-items: center;
    justify-content: center;
    position: relative;
    width: 100%;
    height: 132px;
    border: 1px solid #a62700;
    clip-path: none;
    overflow: hidden;
    flex-shrink: 0;
  }
  .op-nf-wave-left::before { display: none; }

  /* Inset: relative so z-index still works, inset:auto removes the desktop stretch */
  .op-nf-inset {
    position: relative;
    inset: auto;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 0 12px;
    gap: 4px;
    width: 100%;
    height: auto;
  }

  /* Decal: Figma mobile size */
  .op-nf-decal {
    flex-shrink: 0;
    width: 51px;
    height: 58px;
  }

  /* Blocks: fixed width (3 × 50px), 58px tall */
  .op-nf-blocks { flex: none; width: 150px; height: 58px; }
  .op-nf-block  { flex: 1; }

  /* Bars: fixed height, clip at 58px */
  .op-nf-bars { height: 58px; flex-shrink: 0; overflow: hidden; }
  .op-nf-bar  { height: 80px; }
  .op-nf-bar-group--wide  { gap: 2px; }
  .op-nf-bar-group--tight { gap: 1px; }

  /* BTT arrow: larger to match Figma (100px) */
  .op-nf-btt-arrow { width: 96px; height: 96px; }

  /* Override inline bar widths to Figma mobile spec */
  .op-nf-bar-group--wide  .op-nf-bar:nth-child(1) { width: 10px !important; }
  .op-nf-bar-group--wide  .op-nf-bar:nth-child(2) { width: 1px  !important; }
  .op-nf-bar-group--wide  .op-nf-bar:nth-child(3) { width: 7px  !important; }
  .op-nf-bar-group--wide  .op-nf-bar:nth-child(4) { width: 1px  !important; }
  .op-nf-bar-group--wide  .op-nf-bar:nth-child(5) { width: 2px  !important; }
  .op-nf-bar-group--wide  .op-nf-bar:nth-child(6) { width: 7px  !important; }
  .op-nf-bar-group--wide  .op-nf-bar:nth-child(7) { width: 1px  !important; }
  .op-nf-bar-group--wide  .op-nf-bar:nth-child(8) { width: 3px  !important; }
  .op-nf-bar-group--wide  .op-nf-bar:nth-child(9) { display: none; }

  .op-nf-bar-group--tight .op-nf-bar:nth-child(1) { width: 9px  !important; }
  .op-nf-bar-group--tight .op-nf-bar:nth-child(2) { width: 1px  !important; }
  .op-nf-bar-group--tight .op-nf-bar:nth-child(3) { width: 7px  !important; }
  .op-nf-bar-group--tight .op-nf-bar:nth-child(4) { width: 1px  !important; }
  .op-nf-bar-group--tight .op-nf-bar:nth-child(5) { width: 7px  !important; }
  .op-nf-bar-group--tight .op-nf-bar:nth-child(6) { width: 3px  !important; }
  .op-nf-bar-group--tight .op-nf-bar:nth-child(7) { display: none; }
  .op-nf-bar-group--tight .op-nf-bar:nth-child(8) { display: none; }
  .op-nf-bar-group--tight .op-nf-bar:nth-child(9) { display: none; }

  /* BTT button: full width, bordered box */
  .op-nf-btt {
    width: 100%;
    border: 1px solid #a62700;
    min-height: 100px;
  }

  /* Spaceship: hidden on mobile */
  .op-nf-spaceship {
    display: none;
  }

  /* Headline row: re-centre now spaceship is gone */
  .op-nf-headline-row {
    justify-content: center;
    overflow: visible;
  }

  /* Headline: 24px (matches Figma), centred */
  .op-nf-headline {
    white-space: normal;
    text-align: center;
    font-size: 24px;
  }

  /* Buttons: stack vertically, 67px height, 8px gap */
  .op-nf-btn-row {
    flex-direction: column;
    gap: 8px;
    padding-bottom: 80px;
  }
  .op-nf-btn {
    white-space: nowrap;
    justify-content: center;
    height: 67px;
    flex: none;
  }

  /* Coord strip: readable font size */
  .op-nf-coord-strip .sys-val,
  .op-nf-coord-strip .sys-sep {
    font-size: 11px;
  }
}

/* Mobile nav hidden on desktop */
.op-mobile-nav { display: none; }

/* ── Bottom pill nav ── */
.op-bottom-nav {
  position: fixed;
  bottom: 24px;
  left: 50%;
  transform: translateX(-50%);
  display: flex;
  gap: 8px;
  z-index: 100;
  pointer-events: none;
  transition: opacity 0.5s ease;
}
.op-bottom-nav.nav-hidden {
  opacity: 0;
  pointer-events: none;
}

.op-bottom-nav-item {
  pointer-events: all;
  position: relative;
  z-index: 0;
  font-family: var(--font-display);
  font-weight: var(--weight-black);
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  text-decoration: none;
  color: rgba(0,0,0,0.35);
  background: transparent;
  border: none;
  padding: 10px 16px;
  white-space: nowrap;
  cursor: pointer;
  opacity: 0;
  transition: color 0.2s ease;
}

.op-bottom-nav.is-visible .op-bottom-nav-item {
  animation: nav-btn-in 0.65s var(--ease-out-expo) calc(var(--i, 0) * 0.1s) both;
}

/* Border layer — slightly darker than fill, defines bevel edge */
.op-bottom-nav-item::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: -1;
  background: #7A1D00;
  clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px);
  transition: background 0.2s ease;
}

/* Fill layer — dark orange default */
.op-bottom-nav-item::after {
  content: '';
  position: absolute;
  inset: 1px;
  z-index: -1;
  background: #A62700;
  clip-path: polygon(9px 0, 100% 0, 100% calc(100% - 9px), calc(100% - 9px) 100%, 0 100%, 0 9px);
  transition: background 0.2s ease;
}

.op-bottom-nav-item:hover::before,
.op-bottom-nav-item:hover::before {
  background: #C83200;
}

.op-bottom-nav-item:hover::after,
.op-bottom-nav-item.active::after {
  background: #FF3C00;
}

.op-bottom-nav-item:hover,
.op-bottom-nav-item.active {
  color: #28282a;
}

/* Bracket expand */
.op-nav-brk--l,
.op-nav-brk--r {
  display: inline-block;
  transition: transform 0.18s var(--ease-out-expo);
}

.op-bottom-nav-item:hover .op-nav-brk--l,
.op-nf-btn:hover .op-nav-brk--l { transform: translateX(-3px); }

.op-bottom-nav-item:hover .op-nav-brk--r,
.op-nf-btn:hover .op-nav-brk--r { transform: translateX(3px); }

@media (max-width: 768px) {
  /* Hide desktop 4-button row */
  .op-bottom-nav { display: none !important; }

  /* Mobile nav container — fixed bottom centre */
  .op-mobile-nav {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 8px;
    position: fixed;
    bottom: 24px;
    left: 50%;
    transform: translateX(-50%);
    min-width: 200px;
    z-index: 100;
    pointer-events: none;
  }

  /* MENU trigger button — same bevel design as desktop nav */
  .op-mobile-menu-btn {
    pointer-events: all;
    position: relative;
    z-index: 0;
    font-family: var(--font-display);
    font-weight: var(--weight-black);
    font-size: 11px;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: rgba(0,0,0,0.35);
    background: transparent;
    border: none;
    padding: 10px 28px;
    white-space: nowrap;
    cursor: pointer;
    opacity: 0;
    transition: color 0.2s ease;
  }
  .op-mobile-menu-btn::before {
    content: ''; position: absolute; inset: 0; z-index: -1;
    background: #7A1D00;
    clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px);
    transition: background 0.2s ease;
  }
  .op-mobile-menu-btn::after {
    content: ''; position: absolute; inset: 1px; z-index: -1;
    background: #A62700;
    clip-path: polygon(9px 0, 100% 0, 100% calc(100% - 9px), calc(100% - 9px) 100%, 0 100%, 0 9px);
    transition: background 0.2s ease;
  }
  .op-mobile-nav.is-visible .op-mobile-menu-btn {
    animation: nav-btn-in 0.65s var(--ease-out-expo) 0s both;
  }

  /* Stack container — starts collapsed */
  .op-mobile-menu-stack {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 8px;
    pointer-events: none;
  }

  /* Each stacked item — hidden by default */
  .op-mobile-menu-item {
    pointer-events: none;
    position: relative;
    z-index: 0;
    font-family: var(--font-display);
    font-weight: var(--weight-black);
    font-size: 11px;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    text-decoration: none;
    text-align: center;
    color: rgba(0,0,0,0.35);
    background: transparent;
    border: none;
    padding: 10px 20px;
    white-space: nowrap;
    cursor: pointer;
    opacity: 0;
    translate: 0 12px;
    transition:
      opacity   0.3s var(--ease-out-expo) calc(var(--i, 0) * 0.06s),
      translate 0.3s var(--ease-out-expo) calc(var(--i, 0) * 0.06s),
      color     0.2s ease;
  }
  .op-mobile-menu-item::before {
    content: ''; position: absolute; inset: 0; z-index: -1;
    background: #7A1D00;
    clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px);
    transition: background 0.2s ease;
  }
  .op-mobile-menu-item::after {
    content: ''; position: absolute; inset: 1px; z-index: -1;
    background: #A62700;
    clip-path: polygon(9px 0, 100% 0, 100% calc(100% - 9px), calc(100% - 9px) 100%, 0 100%, 0 9px);
    transition: background 0.2s ease;
  }

  /* Active state */
  .op-mobile-menu-item.active::after { background: #FF3C00; }
  .op-mobile-menu-item.active { color: #A62700; }

  /* is-open: reveal the stack */
  .op-mobile-nav.is-open .op-mobile-menu-stack { pointer-events: all; }
  .op-mobile-nav.is-open .op-mobile-menu-item {
    opacity: 1;
    translate: 0 0;
    pointer-events: all;
  }

  /* Bracket expand — same as desktop */
  .op-mobile-menu-btn:hover .op-nav-brk--l,
  .op-mobile-menu-item:hover .op-nav-brk--l { transform: translateX(-3px); }
  .op-mobile-menu-btn:hover .op-nav-brk--r,
  .op-mobile-menu-item:hover .op-nav-brk--r { transform: translateX(3px); }
}


/* ══════════════════════════════════════
   DO NOT PRESS — easter egg
   Fixed bottom-right. Hidden until 50% scroll.
   Click → glitch corruption → auto-reset 2.5s.
══════════════════════════════════════ */

/* Per-element glitch — applied by JS to individual elements */
@keyframes dnp-el-glitch {
  0%   { translate: 0 0;      filter: none; }
  20%  { translate: -5px 0;   filter: hue-rotate(180deg) saturate(4); }
  40%  { translate:  4px 1px; filter: invert(0.8) contrast(2); }
  60%  { translate: -3px -1px; filter: hue-rotate(270deg) saturate(2); }
  80%  { translate:  5px 0;   filter: saturate(0) brightness(2); }
  100% { translate: 0 0;      filter: none; }
}

.dnp-el-glitch {
  animation: dnp-el-glitch 0.15s steps(1) 3 !important;
}

/* Media (img + video) tear glitch */
@keyframes dnp-media-glitch {
  0%,100% { clip-path: none;               transform: translate(0, 0);    filter: none; }
  10%     { clip-path: inset(0 0 72% 0);   transform: translate(-12px, 0); }
  11%     { clip-path: inset(28% 0 40% 0); transform: translate(10px, 0);  filter: hue-rotate(90deg) saturate(3); }
  20%     { clip-path: none;               transform: translate(0, 0);    filter: none; }
  35%     { clip-path: inset(55% 0 8% 0);  transform: translate(14px, 0); }
  36%     { clip-path: inset(78% 0 0% 0);  transform: translate(-8px, 0);  filter: invert(0.7); }
  45%     { clip-path: none;               transform: translate(0, 0);    filter: none; }
  60%     { clip-path: inset(18% 0 55% 0); transform: translate(-14px, 0); filter: saturate(5) hue-rotate(180deg); }
  61%     { clip-path: inset(68% 0 5% 0);  transform: translate(10px, 0); }
  70%     { clip-path: none;               transform: translate(0, 0);    filter: none; }
  85%     { clip-path: inset(42% 0 28% 0); transform: translate(8px, 0);  filter: hue-rotate(270deg) contrast(2); }
  86%     { clip-path: inset(0% 0 60% 0);  transform: translate(-10px, 0); }
  95%     { clip-path: none;               transform: translate(0, 0);    filter: none; }
}

img.dnp-media-glitch,
video.dnp-media-glitch {
  animation: dnp-media-glitch 0.4s steps(1) 1 !important;
}

/* Horizontal tear lines */
@keyframes dnp-tear-flash {
  0%   { opacity: 0.9; transform: translateX(0); }
  50%  { transform: translateX(var(--shift, 12px)); }
  100% { opacity: 0; }
}

.dnp-tear {
  position: fixed;
  left: 0;
  right: 0;
  pointer-events: none;
  z-index: 99996;
  background: rgba(255, 60, 0, 0.12);
  mix-blend-mode: difference;
  animation: dnp-tear-flash 0.25s ease forwards;
}

/* Error popup chips */
@keyframes dnp-popup {
  0%   { opacity: 0; translate: 0 -6px; }
  15%  { opacity: 1; translate: 0 0; }
  75%  { opacity: 1; }
  100% { opacity: 0; }
}


#doNotPress {
  display: none !important; /* hidden — triggered via skull in grid nav */
  position: fixed;
  bottom: 24px;
  right: 32px;
  z-index: 9000;

  font-family: 'Orbitron', monospace;
  font-size: 10px;
  font-weight: 800;
  letter-spacing: 0.18em;
  color: #FF3C00;

  background: transparent;
  border: 1px solid #FF3C00;
  padding: 10px 16px;
  border-radius: 0;

  opacity: 0;
  pointer-events: none;
  translate: 0 12px;
  transition:
    opacity   0.5s var(--ease-out-expo),
    translate 0.5s var(--ease-out-expo);

  cursor: default;
  animation: dnp-pulse 2.4s ease-in-out infinite;
  animation-play-state: paused;
}

@keyframes dnp-pulse {
  0%, 100% { box-shadow: 0 0 0px rgba(255, 60, 0, 0); }
  50%       { box-shadow: 0 0 12px rgba(255, 60, 0, 0.55), 0 0 24px rgba(255, 60, 0, 0.2); }
}

#doNotPress.dnp--visible {
  opacity: 1;
  pointer-events: auto;
  translate: 0 0;
  animation-play-state: running;
}

/* Scanline overlay */
#dnpOverlay {
  position: fixed;
  inset: 0;
  z-index: 99997;
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.08s;
  background: repeating-linear-gradient(
    0deg,
    transparent,
    transparent 3px,
    rgba(0, 0, 0, 0.25) 3px,
    rgba(0, 0, 0, 0.25) 4px
  );
}

#dnpOverlay.dnp--active { opacity: 1; }

/* No full-page filter — element-level glitches handle corruption */

/* ── CRT turn-off: page squishes to a horizontal line then vanishes ── */
#pageOnePager.dnp--crt-off {
  animation: dnp-crt-off 0.45s ease-in forwards;
  transform-origin: center center;
}

@keyframes dnp-crt-off {
  0%   { transform: scaleY(1);      filter: none;                       opacity: 1; }
  40%  { transform: scaleY(0.015);  filter: brightness(4) saturate(0);  opacity: 1; }
  65%  { transform: scaleY(0.015);  filter: brightness(1) saturate(0);  opacity: 1; }
  100% { transform: scaleY(0);      filter: brightness(0);              opacity: 0; }
}

/* ── CRT turn-on: page expands back from a line ── */
#pageOnePager.dnp--crt-on {
  animation: dnp-crt-on 0.4s var(--ease-out-expo) both;
  transform-origin: center center;
}

@keyframes dnp-crt-on {
  0%   { transform: scaleY(0);     filter: brightness(4) saturate(0); opacity: 1; }
  35%  { transform: scaleY(0.015); filter: brightness(2) saturate(0); }
  100% { transform: scaleY(1);     filter: none; }
}

/* ── Crash screen — centred popup ── */
#dnpCrashScreen {
  position: fixed;
  inset: 0;
  z-index: 99999;
  /* Scanlines baked into background — classic CRT texture */
  background:
    repeating-linear-gradient(
      0deg,
      transparent,
      transparent 2px,
      rgba(0, 0, 0, 0.22) 2px,
      rgba(0, 0, 0, 0.22) 3px
    ),
    rgba(29, 7, 0, 0.97);
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0;
  pointer-events: none;
  transition: none; /* backdrop is instant — popup handles its own animation */
}

/* Vignette — darkens edges, focuses eye on the card */
#dnpCrashScreen::before {
  content: '';
  position: absolute;
  inset: 0;
  background: radial-gradient(
    ellipse 70% 70% at center,
    transparent 30%,
    rgba(0, 0, 0, 0.55) 100%
  );
  pointer-events: none;
  z-index: 0;
}

/* Screen flicker — irregular dim/pulse, like a dying monitor */
#dnpCrashScreen::after {
  content: '';
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 0;
  opacity: 0;
  animation: dnp-bg-flicker 5s steps(1) infinite;
}

@keyframes dnp-bg-flicker {
  0%, 88%, 100% { opacity: 0; background: transparent; }
  90%  { opacity: 1; background: rgba(0, 0, 0, 0.12); }
  92%  { opacity: 0; }
  94%  { opacity: 1; background: rgba(255, 60, 0, 0.03); }
  96%  { opacity: 0; }
}

#dnpCrashScreen.dnp--visible {
  opacity: 1;
  pointer-events: all;
}

#dnpCrashScreen.dnp--fadeout {
  opacity: 0;
  transition: opacity 0.15s ease;
}

/* Full-screen slow scan sweep — phosphor refresh line */
.dnp-bg-sweep {
  position: absolute;
  left: 0;
  right: 0;
  height: 120px;
  background: linear-gradient(
    to bottom,
    transparent,
    rgba(255, 60, 0, 0.04) 50%,
    transparent
  );
  animation: dnp-bg-scan 6s linear infinite;
  pointer-events: none;
  z-index: 0;
  top: -120px;
}

@keyframes dnp-bg-scan {
  from { top: -120px; }
  to   { top: 100%; }
}

/* Hazard stripe bars — trapezoid shapes (wider at outer edge) */
.dnp-hazard-stripe {
  flex-shrink: 0;
  height: 24px;
  background: repeating-linear-gradient(
    45deg,
    #cc0000,
    #cc0000 12px,
    #5a0000 12px,
    #5a0000 24px
  );
}

.dnp-hazard-top {
  clip-path: polygon(0 0, 100% 0, calc(100% - 20px) 100%, 20px 100%);
}

.dnp-hazard-bottom {
  clip-path: polygon(20px 0, calc(100% - 20px) 0, 100% 100%, 0 100%);
}

/* Inner body */
.dnp-crash-body {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  font-family: var(--font-body);
  padding: 40px 32px;
  position: relative;
  background: #1a0000;
}

/* Frame wrapper — z-index: 1 keeps card above backdrop pseudo-element layers */
.dnp-crash-frame {
  position: relative;
  z-index: 1;
  animation: dnp-popup-enter 0.4s var(--ease-out-expo) both;
}

/* Card tear — very occasional glitch during reboot */
#dnpCrashScreen.dnp--rebooting .dnp-crash-frame {
  animation: dnp-media-glitch 3.5s steps(1) infinite;
}

/* CRT turn-on entrance */
@keyframes dnp-popup-enter {
  0%   { transform: scaleY(0.03); filter: brightness(5) saturate(0) drop-shadow(0 0 0 transparent); opacity: 1; }
  55%  { transform: scaleY(1.03); }
  100% { transform: scaleY(1); }
}

/* CRT turn-off exit */
.dnp-crash-frame.dnp--closing {
  animation: dnp-popup-exit 0.38s ease-in forwards !important;
}

@keyframes dnp-popup-exit {
  0%   { transform: scaleY(1);     filter: brightness(1)  drop-shadow(0 0 20px rgba(200,0,0,0.7)); }
  45%  { transform: scaleY(0.015); filter: brightness(4)  saturate(0) drop-shadow(0 0 40px rgba(255,200,200,0.8)); }
  70%  { transform: scaleY(0.015); filter: brightness(1)  saturate(0); }
  100% { transform: scaleY(0);     filter: brightness(0); opacity: 0; }
}

/* Popup — clean rectangle with 1px orange stroke */
.dnp-crash-popup {
  position: relative;
  display: flex;
  flex-direction: column;
  width: min(440px, 90vw);
  border: 1px solid #ff3c00;
  overflow: hidden;
}

/* Right-edge diagonal stripe — hidden for now */
.dnp-crash-side-stripe {
  display: none;
}

/* Scanline sweep — removed */
.dnp-crash-scanline {
  display: none;
}

/* Inner body */
.dnp-crash-body {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 16px;
  padding: 48px 32px 40px;
  position: relative;
  background: #1d0700;
}

/* ATTENTION row */
.dnp-crash-attention {
  display: flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 12px;
  letter-spacing: 0.18em;
  color: #ff3c00;
  text-transform: uppercase;
}
.dnp-attn-line {
  display: block;
  width: 26px;
  height: 1px;
  background: #ff3c00;
  flex-shrink: 0;
}

/* Warning triangle (SVG outlined) + ! */
.dnp-crash-triangle {
  position: relative;
  width: clamp(140px, 20vw, 200px);
  display: flex;
  align-items: center;
  justify-content: center;
}
.dnp-crash-triangle svg {
  width: 100%;
  height: auto;
  display: block;
}
.dnp-crash-bang {
  position: absolute;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(60px, 9vw, 110px);
  color: #ff3c00;
  line-height: 1;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -42%);
  pointer-events: none;
}

/* CRITICAL ERROR */
.dnp-crash-title {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(20px, 4vw, 28px);
  letter-spacing: 0.06em;
  color: #ff3c00;
  text-transform: uppercase;
  text-align: center;
  margin: 0;
}

/* Reboot section */
.dnp-reboot {
  opacity: 0;
  transition: opacity 0.4s ease;
  text-align: center;
  width: 420px;
  max-width: 100%;
  margin: 0 auto;
}

.dnp-reboot.dnp--visible { opacity: 1; }

.dnp-reboot-label {
  font-family: var(--font-display);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.14em;
  color: #ff3c00;
  text-transform: uppercase;
  margin-bottom: 10px;
}

.dnp-reboot-track {
  height: 12px;
  width: 100%;
  border: 1px solid #ff3c00;
  padding: 2px;
  box-sizing: border-box;
  margin-bottom: 6px;
}

.dnp-reboot-bar {
  height: 100%;
  width: 0%;
  background: #ff3c00;
  transition: width 0.08s linear;
}

.dnp-reboot-pct {
  font-family: var(--font-display);
  font-size: 10px;
  color: #ff3c00;
  letter-spacing: 0.1em;
  margin-bottom: 16px;
}

.dnp-boot-log { height: 116px; overflow: hidden; text-align: left; }

.dnp-boot-line {
  font-family: var(--font-body);
  font-size: 11px;
  color: #cc4400;
  line-height: 1.9;
  opacity: 0;
  animation: dnp-line-in 0.25s ease forwards;
}

.dnp-boot-line:last-child { color: #ff3c00; }

@keyframes dnp-line-in {
  from { opacity: 0; translate: 0 5px; }
  to   { opacity: 1; translate: 0 0; }
}

/* Error popups — hazard style */
.dnp-error-popup {
  position: fixed;
  font-family: var(--font-body);
  pointer-events: none;
  z-index: 99998;
  animation: dnp-popup 0.7s ease forwards;
  background: #1d0700;
  border: 2px solid #ff3c00;
  overflow: hidden;
  min-width: 180px;
  box-shadow: 0 0 16px rgba(255, 60, 0, 0.4), inset 0 0 12px rgba(255, 60, 0, 0.1);
}

.dnp-popup-attn {
  display: block;
  background: repeating-linear-gradient(
    45deg,
    #ff3c00,
    #ff3c00 6px,
    #a62700 6px,
    #a62700 12px
  );
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 0.2em;
  color: #1d0700;
  padding: 3px 10px;
  text-align: center;
}

.dnp-popup-code {
  display: block;
  font-size: 16px;
  font-weight: 700;
  letter-spacing: 0.04em;
  color: #ff3c00;
  padding: 8px 14px 10px;
  text-align: center;
}

@media (hover: none) {
  #doNotPress { display: none; }
}



/* ═══════════════════════════════════════════════════════════════
   EXPERIMENTAL GRID NAV — hides old pill + mobile navs
   ═══════════════════════════════════════════════════════════════ */

/* hidden: experimental grid nav active */
.op-bottom-nav,
.op-mobile-nav { display: none !important; }

/* Wrapper — fixed, bottom-centred */
.op-gn {
  position: fixed;
  bottom: 24px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 200;
  display: flex;
  flex-direction: column;
  align-items: center;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.4s ease;
  perspective: 600px;
}
.op-gn.is-visible { opacity: 1; pointer-events: all; }

/* Trigger button */
.op-gn-trigger {
  width: 72px;
  height: 72px;
  background: var(--color-brand);
  border: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
/* Icon crossfade: grid ↔ X */
.op-gn-icon-grid,
.op-gn-icon-x {
  position: absolute;
  color: #28282A;
  transition: opacity 0.2s ease, transform 0.25s var(--ease-out-expo);
}
.op-gn-icon-x { opacity: 0; transform: rotate(-45deg) scale(0.7); }
.op-gn.is-open .op-gn-icon-grid { opacity: 0; transform: rotate(45deg) scale(0.7); }
.op-gn.is-open .op-gn-icon-x    { opacity: 1; transform: rotate(0deg)  scale(1);   }

/* Grid container */
.op-gn-grid {
  display: grid;
  grid-template-columns: repeat(3, 72px);
  grid-template-rows: 72px 72px;
  gap: 1px;
  background: transparent;
  margin-bottom: 1px;
  pointer-events: none;
  overflow: visible;
}
.op-gn.is-open .op-gn-grid {
  pointer-events: all;
}

/* Individual cells — closed state */
.op-gn-cell {
  background: var(--color-brand);
  border: none;
  cursor: pointer;
  font-family: 'Orbitron', monospace;
  font-size: 24px;
  font-weight: 800;
  color: #28282A;
  display: flex;
  align-items: center;
  justify-content: center;
  position: relative;
  overflow: hidden;
  /* bottom row: hinge at top edge, fold back into box */
  transform-origin: center top;
  transform: rotateX(-90deg);
  opacity: 0;
  transition: transform 0.12s ease-in,
              opacity   0.08s ease-in,
              background 0.15s ease;
}
/* top row: hinge at bottom edge, fold back into box from above */
.op-gn-top {
  transform-origin: center bottom;
  transform: rotateX(90deg);
}

/* Diagonal hatch on hover */
.op-gn-cell::before {
  content: '';
  position: absolute;
  inset: 0;
  background-image: repeating-linear-gradient(
    -45deg,
    transparent 0px, transparent 5px,
    rgba(40,40,42,0.15) 5px, rgba(40,40,42,0.15) 6px
  );
  opacity: 0;
  transition: opacity 0.2s ease;
  pointer-events: none;
}
.op-gn-cell:hover::before { opacity: 1; }
.op-gn-cell:hover,
.op-gn-cell.active { background: #28282A; color: #FF3C00; }

/* Open state — flap out, staggered */
.op-gn.is-open .op-gn-cell {
  transform: rotateX(0deg);
  opacity: 1;
  transition:
    transform    0.5s  cubic-bezier(0.22, 1, 0.36, 1) calc(var(--gn-i) * 65ms),
    opacity      0.25s ease                            calc(var(--gn-i) * 65ms),
    background   0.15s ease;
}


/* Skull pulse when open */
@keyframes gn-skull-glow {
  0%, 100% { filter: brightness(1); }
  50%      { filter: brightness(1.25); }
}
.op-gn.is-open .op-gn-skull {
  animation: gn-skull-glow 2s ease-in-out 0.7s infinite;
}
