/* ===========================================================
   OUTPAINT — studio-grade restyle
   A24 × IMAX: true black, film grain, letterbox, gold accent
   Bodoni Moda (display) + Archivo (UI)
   =========================================================== */

:root{
  color-scheme:dark;           /* opt out of browser auto-dark/night-mode re-tint (e.g. Brave darkening the cream button to brown). The CSS prop is honored where the <meta color-scheme> alone isn't. */
  --accent:#ece7dd;            /* warm white — mono accent */
  --accent-soft:rgba(236,231,221,.16);

  --ink:#070707;               /* theatre black */
  --ink-1:#0d0c0b;             /* lifted panel */
  --ink-2:#15130f;             /* card */
  --line:rgba(236,231,221,.14);
  --line-2:rgba(236,231,221,.08);
  --gen-field:transparent; --lift-top:rgba(236,231,221,.18);  /* lit-window: dim disabled; warm edge-light kept */

  --cream:#ece7dd;             /* warm white text */
  --cream-soft:rgba(236,231,221,.60);
  --cream-faint:rgba(236,231,221,.38);
  --cream-readable:rgba(236,231,221,.55); /* 5.26:1 — AA-passing muted text */

  --r-s:2px; --r-m:3px; --r-l:5px; --r-xl:8px;
  --shadow:0 40px 90px -50px rgba(0,0,0,.95);
  --maxw:1240px;
  --pad:clamp(20px,5vw,64px);
  --ease:cubic-bezier(.4,.12,.2,1);
  --font-d:'Archivo', system-ui, sans-serif;
  --font-b:'Archivo', system-ui, sans-serif;
  --grain:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/></filter><rect width='100%25' height='100%25' filter='url(%23n)' opacity='0.6'/></svg>");
}

*{box-sizing:border-box;}
/* pure #000 on html + body so iOS's safe-area "mirror" paints the notch band in solid black
   matching the nav. Keep --ink (#070707) as the brand token for sections that explicitly use it. */
/* Horizontal-overflow guard lives on HTML, never on body. On iOS Safari,
   overflow-x:clip/hidden on <body> turns it into a clip/containing context,
   which un-pins position:fixed children (.nav, body::before) from the visual
   viewport — after you scroll, the notch band exposes the hero gradient and
   stays wrong until you scroll back to top. The working true3d.com keeps body
   free of overflow for exactly this reason. */
html{scroll-behavior:smooth; background:#000; overflow-x:hidden; overflow-x:clip;}
body{
  margin:0; background:#000; color:var(--cream);
  min-height:100vh; min-height:100dvh;
  font-family:var(--font-b); font-size:17px; line-height:1.62;
  -webkit-font-smoothing:antialiased;
  /* position:relative makes the grain below span the whole document as an
     absolute layer. relative is safe for the fixed nav — unlike transform/
     overflow it does NOT clip fixed children out of the safe-area inset. */
  position:relative;
}
/* Global film grain — position:absolute (NOT fixed) so it scrolls with the page
   instead of being a full-viewport layer iOS must recomposite every frame. A fixed
   full-screen overlay starves the compositor during fast momentum scroll and makes
   the fixed notch cover drop frames (content flashes through the notch). Scrolling
   grain is visually identical at opacity .05. */
body::after{content:''; position:absolute; inset:0; z-index:200; pointer-events:none; opacity:.05; background-image:var(--grain); background-size:160px;}
h1,h2,h3,h4{font-family:var(--font-d); font-weight:600; line-height:1.04; margin:0; letter-spacing:-.022em;}
p{margin:0;}
a{color:inherit; text-decoration:none;}
a:focus-visible,button:focus-visible,.btn:focus-visible,.switch button:focus-visible,.modal .x:focus-visible{outline:2px solid var(--accent); outline-offset:3px; border-radius:var(--r-s);}
.skip{position:absolute; left:-9999px;}
.skip:focus{left:16px; top:16px; z-index:300; background:var(--cream); color:#0a0a0a; padding:10px 16px; border-radius:var(--r-s); font-size:12px; font-weight:600; letter-spacing:.12em; text-transform:uppercase;}
img{display:block; max-width:100%;}
::selection{background:var(--accent); color:#0a0a0a;}

/* .wrap pads horizontally by --pad on small screens, but extends with the landscape notch
   inset so content never tucks behind the camera island on a sideways iPhone. */
.wrap{max-width:var(--maxw); margin:0 auto;
  padding-left:max(var(--pad), env(safe-area-inset-left, 0px));
  padding-right:max(var(--pad), env(safe-area-inset-right, 0px));}
.label,.eyebrow{font-family:var(--font-b); font-size:13px; letter-spacing:.22em; text-transform:uppercase; font-weight:600; display:inline-flex; align-items:center;}
.label{color:var(--accent); gap:12px;}
.label::before{content:''; width:30px; height:1px; background:var(--accent); display:inline-block;}
.eyebrow{color:rgba(236,231,221,.72);}
.muted{color:var(--cream-soft);}
.section{padding-block:clamp(80px,12vw,156px); position:relative;}
.center{text-align:center;}

/* ---------------- buttons ---------------- */
.btn{
  font-family:var(--font-b); font-weight:600; font-size:12.5px; letter-spacing:.18em; text-transform:uppercase; cursor:pointer;
  display:inline-flex; align-items:center; gap:12px; white-space:nowrap;
  padding:16px 26px; border-radius:var(--r-s); border:1px solid transparent; line-height:1;
  transition:background .25s var(--ease), color .25s, border-color .25s, opacity .25s;
}
.btn .ar{transition:transform .3s var(--ease);}
.btn:hover .ar{transform:translateX(5px);}
.btn-primary{background:var(--cream); color:#0a0a0a;}
.btn-primary:hover{background:#fff;}
.btn-ghost{background:transparent; border-color:var(--line); color:var(--cream);}
.btn-ghost:hover{border-color:var(--cream-soft); background:rgba(236,231,221,.04);}
.btn-dark{background:transparent; border-color:var(--line); color:var(--cream);}
.btn-dark:hover{border-color:var(--accent); color:var(--accent);}
.btn-lg{padding:19px 34px; font-size:13px;}

/* ---------------- nav ---------------- */
/* iOS notch — body bg + nav bg are both #000 so they can't seam; body::before paints
   the notch band at the highest z-index as a guaranteed fallback cover.
   CRITICAL: NO transform / will-change / backface-visibility on these fixed elements,
   and NO overflow:clip on any ancestor (body). On iOS WebKit either of those clips a
   position:fixed element to the layout viewport — EXCLUDING the safe-area inset — so the
   bar stops covering the notch band once you scroll and page content shows through.
   The horizontal-overflow guard therefore lives on <html>, and these stay transform-free. */
/* --navp = scroll progress 0→1, set per-frame by nav.js. The bar + logo + wordmark
   interpolate linearly off it (no transition) so they shrink *with* the scroll, not on a snap.
   size = big - shrink*navp. Keep the clamp on ONE side only: nesting clamp() on both ends of the
   interpolation evaluates to 0 in Chromium. shrink is a plain px delta; clamp keeps the big end
   shrinking on narrow screens. */
.nav{position:fixed; inset:0 0 auto; z-index:60; padding-top:env(safe-area-inset-top, 0px);
  --navp:0;
  /* big = top state, shrink = px removed at full scroll → compact = big-shrink. Bumped big AND shrink
     together so only the *top* state grew; the scrolled/compact size is unchanged. */
  --nav-h-big:clamp(116px,10.5vw,156px); --nav-h-shrink:66px;
  --logo-big:clamp(32px,3.7vw,42px);     --logo-shrink:16px;
  --brand-big:clamp(27px,3vw,35px);      --brand-shrink:13px;
  /* opaque black up top (covers the iOS notch); the bottom edge feathers to transparent only while
     expanded. The 84px fade length matches the carousel's 11%-of-760px edge mask so the two read as
     one treatment; the feather's alpha climbs with --navp, so the edge is solid once compact. */
  background:linear-gradient(180deg, #000 0%, #000 calc(100% - 84px), rgba(0,0,0,var(--navp)) 100%);}
.nav .wrap{display:flex; align-items:center; justify-content:space-between; width:100%;
  height:calc(var(--nav-h-big) - var(--nav-h-shrink) * var(--navp));}
body::before{content:''; position:fixed; top:0; left:0; right:0; height:env(safe-area-inset-top, 0px); background:#000; z-index:9999; pointer-events:none;}
.brand{display:flex; align-items:center; gap:14px; font-family:var(--font-d); font-weight:800; letter-spacing:-.04em; text-transform:none; color:var(--cream);
  font-size:calc(var(--brand-big) - var(--brand-shrink) * var(--navp));}
.brand .logo{flex:none; color:var(--cream);
  width:calc(var(--logo-big) - var(--logo-shrink) * var(--navp));
  height:calc(var(--logo-big) - var(--logo-shrink) * var(--navp));}
.nav-links{display:flex; align-items:center; gap:22px; font-size:12px; letter-spacing:.16em; text-transform:uppercase; font-weight:500;}
.nav-links a.lnk{color:var(--cream-soft); transition:color .2s;}
.nav-links a.lnk:hover{color:var(--cream);}
.nav-links .btn{padding:13px 20px; font-size:11px; letter-spacing:.14em;}
/* hamburger button — three hairline bars that fold into an X when open. Desktop shows the two
   inline buttons instead; the burger only appears on phone (see the 640px block). */
.nav .wrap{position:relative;}
.nav-burger{display:none; flex-direction:column; justify-content:center; gap:5px; width:30px; height:30px; padding:0; background:none; border:0; cursor:pointer; -webkit-tap-highlight-color:transparent;}
.nav-burger span{display:block; width:22px; height:1.5px; margin:0 auto; background:var(--cream); transition:transform .3s var(--ease), opacity .2s var(--ease);}
/* Open: the nav rides above the overlay so brand + button stay put, and the three
   bars fold into an X in place (same button = same location, no jump). */
body.nav-open .nav{z-index:80;}
body.nav-open .nav-burger span:nth-child(1){transform:translateY(6.5px) rotate(45deg);}
body.nav-open .nav-burger span:nth-child(2){opacity:0;}
body.nav-open .nav-burger span:nth-child(3){transform:translateY(-6.5px) rotate(-45deg);}
/* full-screen menu overlay (replaces the old dropdown). Fades in over the page with
   its own tight logo + X header; links stacked large, sentence-case, hairline-divided. */
.nav-menu{position:fixed; inset:0; z-index:70; display:flex; flex-direction:column; overflow-y:auto;
  padding:0 0 44px;  /* top set by JS to clear the bar; left/right come from the inner .wrap */
  background:radial-gradient(100% 78% at 82% 0%, rgba(201,168,106,.05), transparent 55%), linear-gradient(180deg, #0c0b0a 0%, var(--ink) 60%);
  visibility:hidden; opacity:0; transition:opacity .28s var(--ease), visibility .28s;}
.nav-menu.is-open{visibility:visible; opacity:1;}
.nav-menu>.wrap{width:100%;}  /* flex item: force fill to --maxw so its padded left edge matches the bar's logo (else auto margins shrink-to-fit + center) */
.nav-menu-links{display:flex; flex-direction:column; width:100%; max-width:680px; margin-top:clamp(34px,7vh,76px);}
.nav-menu-lnk{display:flex; align-items:center; justify-content:space-between; gap:24px; padding:clamp(16px,2.3vh,24px) 2px;
  border-top:1px solid var(--line-2); font-family:var(--font-d); font-weight:600; font-size:clamp(28px,4.4vw,38px);
  letter-spacing:-.015em; color:var(--cream); transition:padding-left .25s var(--ease);}
.nav-menu-lnk:last-child{border-bottom:1px solid var(--line-2);}
.nav-menu-lnk .ar{font-size:.46em; color:var(--cream-faint); transition:transform .25s var(--ease), color .15s;}
.nav-menu-lnk:hover{padding-left:12px;}
.nav-menu-lnk:hover .ar{transform:translateX(8px); color:var(--cream-soft);}
body.nav-open{overflow:hidden;}

/* ---------------- hero ---------------- */
.hero{position:relative; padding-top:150px; padding-bottom:90px; overflow:hidden; isolation:isolate;}
.hero::before{content:''; position:absolute; inset:0; z-index:-1; background:radial-gradient(80% 60% at 50% 38%, rgba(201,168,106,.06), transparent 60%), radial-gradient(120% 100% at 50% 0%, #100f0d, var(--ink) 70%);}
.hero-inner{text-align:center; max-width:1000px; margin:0 auto;}
.h-title{font-family:var(--font-d); font-weight:700; font-size:clamp(50px,9.5vw,118px); letter-spacing:-.04em; line-height:.98;}
.h-title .em{font-weight:700; color:var(--accent);}
.h-sub{font-size:clamp(17px,1.9vw,20px); color:var(--cream-soft); max-width:52ch; margin:28px auto 34px; line-height:1.7; text-wrap:balance;}
.h-cta{display:flex; gap:16px; justify-content:center; flex-wrap:wrap;}
.h-trust{display:flex; align-items:center; gap:14px; justify-content:center; margin-top:34px; font-size:11px; letter-spacing:.2em; text-transform:uppercase; color:var(--cream-faint);}
.h-trust b{color:var(--cream-soft); font-weight:600;}

/* ---- /ugc-to-ctv: two-column hero + scrolling video gallery ----
   Wider than the standard wrap so the copy sits further left, with a generous gap
   keeping clear space between the text and the video marquee. */
.uc-hero-grid{display:grid; grid-template-columns:1fr 1.05fr; gap:clamp(40px,6.5vw,112px); align-items:center; text-align:left; max-width:1360px;}
.uc-hero-copy{min-width:0;}
.uc-hero .h-title{font-size:clamp(40px,4.4vw,62px); line-height:1.0;}
.uc-hero .h-sub{margin:26px 0 34px; max-width:48ch;}
.uc-hero .h-cta{justify-content:flex-start;}
/* margin-right bleeds the gallery out to the viewport's right edge (620px = --maxw/2),
   so the bigger tiles fill the room; .hero{overflow:hidden} clips the overflow. */
.uc-gallery{display:flex; gap:18px; height:min(760px,90vh); overflow:hidden; pointer-events:none;
  margin-right:min(0px,calc(620px - 50vw));
  -webkit-mask-image:linear-gradient(180deg,transparent,#000 11%,#000 89%,transparent);
          mask-image:linear-gradient(180deg,transparent,#000 11%,#000 89%,transparent);}
.marq-col{flex:1; min-width:0; overflow:hidden;}
.marq-col.down{margin-top:-56px;}
.marq-track{display:flex; flex-direction:column;}
.marq-col.up .marq-track{animation:marqUp 30s linear infinite;}
.marq-col.down .marq-track{animation:marqDown 34s linear infinite;}
@keyframes marqUp{from{transform:translateY(0);} to{transform:translateY(-50%);}}
@keyframes marqDown{from{transform:translateY(-50%);} to{transform:translateY(0);}}
@keyframes marqLeft{from{transform:translateX(0);} to{transform:translateX(-50%);}}  /* mobile horizontal ribbon */
.marq-card{margin:0 0 16px; position:relative; overflow:hidden; border:1px solid var(--line-2); border-radius:var(--r-m); background:#000; box-shadow:0 24px 50px -30px rgba(0,0,0,.9);}
.marq-card video{display:block; width:100%; aspect-ratio:16/9; object-fit:cover; filter:saturate(.98) brightness(.9) contrast(1.02);}
/* testimonial scroll (above "why it's a no-brainer") — horizontal auto-marquee.
   Cards use margin-right (not gap) so the track is uniform units and -50% loops seamlessly;
   one copy (3 cards) overfills the wrap, so there's never empty space. */
.quote-marq{margin-top:54px; overflow:hidden;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 6%,#000 94%,transparent);
          mask-image:linear-gradient(90deg,transparent,#000 6%,#000 94%,transparent);}
.quote-track{display:flex; width:max-content; animation:quoteMarq 48s linear infinite;}
.quote-marq:hover .quote-track{animation-play-state:paused;}
.quote-card{flex:0 0 clamp(290px,32vw,400px); margin-right:20px; background:var(--ink-1); border:1px solid var(--line-2); border-radius:var(--r-m); padding:30px 30px 26px; display:flex; flex-direction:column; box-shadow:var(--shadow); text-align:left;}
.quote-card blockquote{margin:0; font-family:var(--font-d); font-weight:500; font-size:clamp(16px,1.2vw,18px); line-height:1.5; color:var(--cream); letter-spacing:-.01em; text-wrap:pretty;}
.quote-card .q-short{display:none;}  /* full quote on desktop; a shorter variant swaps in on mobile */
.qc-person{display:flex; align-items:center; gap:13px; margin-top:auto; padding-top:24px;}
.qc-avatar{flex:none; width:42px; height:42px; border-radius:50%; object-fit:cover; display:flex; align-items:center; justify-content:center; font-family:var(--font-b); font-weight:700; font-size:13px; letter-spacing:.03em; color:var(--cream); background:rgba(236,231,221,.08); border:1px solid var(--line);}
.qc-meta{display:flex; flex-direction:column; line-height:1.3;}
.qc-meta b{font-weight:600; font-size:14.5px; color:var(--cream);}
.qc-meta span{font-size:12.5px; color:var(--cream-soft);}
/* Testimonial swipe indicator — built by the inline carousel JS, shown on mobile only
   (the .quote-dots{display:flex} lives in the max-width:760px block). */
.quote-dots{display:none;}
.quote-dot{width:7px; height:7px; padding:0; border:0; -webkit-appearance:none; appearance:none; border-radius:50%; background:var(--line); cursor:pointer; transition:width .25s var(--ease), background .25s var(--ease);}
.quote-dot.is-on{width:22px; border-radius:4px; background:var(--cream-soft);}
@keyframes quoteMarq{from{transform:translateX(0);} to{transform:translateX(-50%);}}
@media(prefers-reduced-motion:reduce){ .quote-track{animation:none; flex-wrap:wrap; justify-content:center; row-gap:20px;} }
/* Mobile: marquee → native swipeable carousel. The card sits centered with a
   slice of the neighbours peeking on both sides, so it reads as a swipeable strip.
   Both card sets stay rendered so quotes.js can loop the swipe endlessly (card N
   and card N+4 are identical, so the recenter jump is invisible). */
@media(max-width:760px){
  .quote-marq{overflow:visible; -webkit-mask-image:none; mask-image:none;}
  .quote-track{width:auto; animation:none; overflow-x:auto; scroll-snap-type:x mandatory;
    -webkit-overflow-scrolling:touch; scrollbar-width:none; padding:4px 8vw;}
  .quote-track::-webkit-scrollbar{display:none;}
  /* size by the viewport (a % flex-basis resolves against the padded track box, and
     <figure> carries a default 40px side margin). 84vw fills the screen while leaving a
     visible sliver of the next card on each side; the brighter border makes that peek read. */
  .quote-card{flex:0 0 84vw; margin:0 14px 0 0; padding:26px 24px 24px; scroll-snap-align:center;
    border-color:var(--line);}
  .quote-card .q-full{display:none;}
  .quote-card .q-short{display:inline;}
  .quote-dots{display:flex; justify-content:center; gap:8px; margin-top:24px;}
}
/* /ugc-to-ctv-examples — static responsive grid of the brand UGC→CTV clips
   (reuses .marq-card styling; just lays them out and drops the marquee bottom-margin) */
.uc-ex-grid{display:grid; gap:24px; grid-template-columns:repeat(2,1fr); margin-top:44px;}
.uc-ex-grid .marq-card{margin:0;}
@media(max-width:640px){ .uc-ex-grid{grid-template-columns:1fr;} }
/* each card is its own compare/expand demo (reuses .ctv-mask + .ctv-expand-btn). Starts
   expanded to full CTV with the band guides faded; the button collapses the masks back to
   the original vertical band. Scoped to .uc-ex-grid so the hero marquee cards are untouched. */
.uc-ex-grid .ctv-demo::before,.uc-ex-grid .ctv-demo::after{transition:opacity .35s;}
.uc-ex-grid .ctv-demo.is-expanded::before,.uc-ex-grid .ctv-demo.is-expanded::after{opacity:0;}
/* each card sits in the TV-bezel (.tv-frame) like the /ugc-to-ctv showcase; the button is
   a sibling of the figure, so it floats over the screen on desktop and the showcase's
   ≤640px rule drops it below the video as a section on mobile. Reset the frame's
   showcase-only centering/width and strip the card's own border so it reads as the screen. */
.uc-ex-grid .tv-frame{max-width:none; margin:0;}
.uc-ex-grid .tv-frame .marq-card{border:none; border-radius:4px; box-shadow:none;}
/* single "See it" showcase clip (replaces the example grid) */
.uc-showcase{margin:46px auto 0; max-width:900px; overflow:hidden; background:#000; border:1px solid var(--line-2); border-radius:var(--r-m); box-shadow:var(--shadow); position:relative;}
.uc-showcase video{display:block; width:100%; aspect-ratio:16/9; object-fit:cover; filter:saturate(.98) brightness(.94) contrast(1.02);}
/* outpaint demo guides — dashed lines marking the original (centered vertical UGC band) vs the
   outpainted sides. --dg-l/--dg-r are the band edges; default ≈31.6%-wide band for 9:16 → 16:9. */
.uc-showcase,.marq-card{--dg-l:34.2%; --dg-r:65.8%;}
.marq-card::before,.marq-card::after,.demo-guide::before,.demo-guide::after{
  content:''; position:absolute; top:0; bottom:0; z-index:3; width:2px; pointer-events:none;
  /* white dashes. NO `filter` (iOS WebKit drops drop-shadow on a thin box). translateZ(0)
     promotes the line to its own compositing layer so WebKit orders it ABOVE the video's
     filter layer by z-index — otherwise the hardware-composited <video> paints over it on
     real iPhones (desktop Blink painted it fine, which is why it only broke on the phone). */
  background:repeating-linear-gradient(to bottom, rgba(236,231,221,.98) 0 5px, transparent 5px 10px);
  transform:translateZ(0);
  opacity:0; transition:opacity .3s;}
.marq-card::before,.demo-guide::before{left:var(--dg-l);}
.marq-card::after,.demo-guide::after{left:var(--dg-r);}
/* Plain card: a full 16:9 clip with no vertical-UGC original to mark (a cinematic spot, not
   an outpaint) — drop the dashed band guides. */
.marq-card.is-plain::before,.marq-card.is-plain::after{content:none;}
/* Show guide lines only once the video is actually playing */
.marq-card.is-playing::before,.marq-card.is-playing::after{opacity:1;}
/* Physical iOS (a real touch device, unlike desktop responsive emulation): the marquee
   video's `playing` event can fire late or get throttled, so don't gate the band guides on
   it there — show them on touch regardless of play state. Scoped to the hero gallery; the
   examples-page expand demo manages its own guides. */
@media(hover:none){
  .uc-gallery .marq-card:not(.is-plain)::before,
  .uc-gallery .marq-card:not(.is-plain)::after{opacity:1;}
}
.demo-guide{position:absolute; inset:0; z-index:3; pointer-events:none;}
.demo-guide .dg-tag{position:absolute; bottom:13px; font-family:var(--font-b); font-size:10px; font-weight:600; letter-spacing:.16em; text-transform:uppercase; color:var(--cream); background:rgba(7,7,7,.5); border:1px solid var(--line); padding:5px 9px; border-radius:999px; backdrop-filter:blur(6px); white-space:nowrap;}
.demo-guide .dg-orig{left:50%; transform:translateX(-50%); color:var(--accent);}
.demo-guide .dg-l{left:12px;}
.demo-guide .dg-r{right:12px;}
/* brand logo watermark — top-left of each demo (carousel cards + showcase) */
.ad-badge{position:absolute; top:9px; left:9px; z-index:4; display:flex; align-items:center; height:30px; padding:0 12px; border-radius:999px; background:rgba(7,7,7,.46); border:1px solid rgba(236,231,221,.16); backdrop-filter:blur(7px); pointer-events:none;}
.ad-badge img{height:15px; width:auto; max-width:130px; display:block; filter:drop-shadow(0 1px 1px rgba(0,0,0,.45));}
.ad-badge.is-siren img{height:22px;}
.ad-badge.is-wide img{height:12px;}
.uc-showcase .ad-badge{top:14px; left:14px; height:30px; padding:0 13px;}
.uc-showcase .ad-badge img{height:15px;}
/* mobile: keep all three labels but shrink them so they fit across the narrow showcase */
@media(max-width:640px){
  .demo-guide .dg-tag{font-size:8.5px; letter-spacing:.07em; padding:4px 7px; bottom:9px;}
  .demo-guide .dg-l{left:8px;}
  .demo-guide .dg-r{right:8px;}
}
/* Expand-for-CTV interactive demo */
.ctv-mask{position:absolute; top:0; bottom:0; z-index:2; background:#000; transition:width .85s cubic-bezier(.4,.12,.2,1);}
.ctv-mask-l{left:0; width:34.2%;}
.ctv-mask-r{right:0; width:34.2%;}
.ctv-demo .demo-guide{transition:opacity .35s;}
.ctv-demo .demo-guide .dg-orig{top:13px; bottom:auto; left:50%; transform:translateX(-50%);}
.ctv-demo .demo-guide::before,.ctv-demo .demo-guide::after{transition:opacity .35s;}
/* Show guide lines in showcase once video is playing; is-expanded rule below overrides this */
.ctv-demo.is-playing .demo-guide::before,.ctv-demo.is-playing .demo-guide::after{opacity:1;}
.ctv-demo.is-expanded .ctv-mask-l,.ctv-demo.is-expanded .ctv-mask-r{width:0;}
.ctv-demo.is-expanded .demo-guide::before,.ctv-demo.is-expanded .demo-guide::after{opacity:0;}
.ctv-expand-btn{position:absolute; bottom:18px; left:50%; transform:translateX(-50%); z-index:5; cursor:pointer; font-family:var(--font-b); font-size:13px; font-weight:600; letter-spacing:.01em; text-transform:none; color:var(--cream); background:rgba(7,7,7,.5); border:1px solid rgba(236,231,221,.16); padding:11px 20px; border-radius:999px; backdrop-filter:blur(8px); white-space:nowrap; transition:background .15s,border-color .15s,opacity .3s; line-height:1;}
.ctv-expand-btn:hover{background:rgba(7,7,7,.74); border-color:rgba(236,231,221,.32);}
.ctv-expand-btn .ar{display:inline-block; transition:transform .3s var(--ease);}
.ctv-expand-btn:hover .ar{transform:translateX(4px);}
@media(max-width:640px){
  .ctv-expand-btn{position:static; display:block; transform:none; margin:16px auto 0; width:fit-content;}
  .tv-frame{padding-bottom:14px;}
}
/* TV bezel wrapper for the showcase clip */
.tv-frame{max-width:940px; margin:46px auto 0; padding:7px; background:#1e1c18; border-radius:10px; box-shadow:0 0 0 1px rgba(236,231,221,.13),0 20px 50px rgba(0,0,0,.7); position:relative;}
.tv-frame .uc-showcase{margin:0; max-width:100%; border-radius:4px;}
.tv-caption{text-align:center; margin-top:14px; font-family:var(--font-b); font-size:11px; font-weight:600; letter-spacing:.18em; text-transform:uppercase; color:var(--cream-faint);}
/* benefits — 4 boxes, editorial: hairline top rule + bare icon + heading + copy. Open and airy
   (no heavy cell borders) so it reads premium, not a SaaS feature grid. */
.benefits{display:grid; grid-template-columns:repeat(4,1fr); gap:clamp(26px,3vw,46px); margin-top:clamp(48px,6vw,72px);}
.benefit{padding-top:24px; border-top:1px solid var(--line);}
.benefit .bf-ic{display:block; color:var(--accent);}
.benefit .bf-ic svg{width:26px; height:26px;}
.benefit h3{font-size:clamp(19px,1.5vw,22px); font-weight:600; letter-spacing:-.01em; margin-top:22px;}
.benefit p{color:var(--cream-soft); margin-top:12px; font-size:15px; line-height:1.6; text-wrap:pretty;}
@media(max-width:900px){ .benefits{grid-template-columns:repeat(2,1fr); gap:34px 44px;} }
@media(max-width:540px){ .benefits{grid-template-columns:1fr; gap:28px;} }
/* examples section: a touch more compact than the global .section rhythm (it packs the
   showcase + logo wall + CTA, so the default 156px block padding ran tall) */
#examples{padding-block:clamp(60px,9vw,116px);}
/* examples section: keep the heading to two lines (one sentence each), lead to one line on desktop */
#examples .sec-head{max-width:none;}
#examples .sec-head h2{font-size:clamp(32px,4.6vw,54px);}
#examples .sec-head h2 em{font-style:italic;}
#examples .sec-head .lead{max-width:none; font-size:clamp(14.5px,1.5vw,17px);}
/* survey fill comparison (#fills): the same vertical ad in three 16:9 treatments —
   letterboxed | blurred | outpainted — side by side. It's a .light (grey) section so it
   keeps the page's grey/black alternation; the black sections above/below set it apart.
   It's a proof section, not a hero: trimmed block padding, a wider wrap + tight gaps so
   the three read as one comparison unit, and the cards sit close under the copy.
   Outpainted (.is-win) gets the cream highlight (brighter border + filled tag). Stacks on mobile. */
#fills{padding-top:clamp(74px,8.5vw,118px); padding-bottom:clamp(80px,9vw,122px);}
#fills .wrap{max-width:1460px;}
#fills .sec-head h2{font-size:clamp(33px,5vw,58px);}
.fill-cmp{margin-top:clamp(12px,1.4vw,20px); display:grid; grid-template-columns:repeat(3,1fr); gap:clamp(10px,0.9vw,14px); align-items:start;}
.fill-col{margin:0;}
/* 16:9 lock via the classic height:0 + padding-top hack applied to the box ITSELF (no
   aspect-ratio: WebKit mis-measures it on a gridded media child → tall box in Safari;
   no ::before either: keep the ratio on a real element so it can't be dropped). The
   video then fills the padded box absolutely. Bulletproof across Chromium/WebKit/Brave. */
.fill-stage{position:relative; height:0; padding-top:56.25%; overflow:hidden; border:1px solid var(--line); border-radius:var(--r-m); background:#000; box-shadow:var(--shadow);}
.fill-stage video{position:absolute; inset:0; width:100%; height:100%; object-fit:cover;}
.fill-tag{position:absolute; top:11px; left:11px; z-index:3; font-family:var(--font-b); font-size:10.5px; font-weight:600; letter-spacing:.16em; text-transform:uppercase; color:var(--cream); background:rgba(7,7,7,.5); border:1px solid var(--line); padding:5px 10px; border-radius:999px; backdrop-filter:blur(7px);}
.fill-col figcaption{margin-top:12px; font-family:var(--font-b); font-size:12px; line-height:1.4; letter-spacing:.01em; color:rgba(236,231,221,.78); text-align:center;}
.fill-col.is-win .fill-stage{border-color:rgba(236,231,221,.72); box-shadow:var(--shadow), 0 0 40px -4px rgba(236,231,221,.16);}
.fill-col.is-win .fill-tag{color:#0a0a0a; background:var(--cream); border-color:var(--cream);}
.fill-col.is-win figcaption{color:var(--cream);}
/* The outpainted clip fills the box edge-to-edge, so a sub-pixel sliver of the black
   .fill-stage background can bleed through at the bottom edge. A hair of scale overflows
   it (clipped by overflow:hidden). ponytail: cheaper than re-encoding the clip. */
.fill-col.is-win .fill-stage video{transform:scale(1.012);}
/* Survey scorecard under each treatment — top-two-box % from the Caraway case study,
   with a mini bar so the gap reads at a glance. Losers get a dim fill; Outpainted
   (.is-win) brightens to the cream accent. The numbers ARE the "why good/bad". */
.fill-score{margin-top:16px; display:grid; gap:12px;}
.fs-metric{display:grid; gap:6px;}
.fs-top{display:flex; align-items:baseline; justify-content:space-between; gap:10px;}
.fs-lab{font-family:var(--font-b); font-size:11px; font-weight:600; letter-spacing:.04em; text-transform:uppercase; color:var(--cream-soft);}
.fs-val{font-family:var(--font-b); font-size:14px; font-weight:700; color:var(--cream-soft); font-variant-numeric:tabular-nums;}
.fs-bar{display:block; height:4px; border-radius:999px; background:var(--line-2); overflow:hidden;}
.fs-bar i{display:block; height:100%; border-radius:999px; background:rgba(236,231,221,.34);}
.fill-col.is-win .fs-lab,.fill-col.is-win .fs-val{color:var(--cream);}
.fill-col.is-win .fs-bar i{background:var(--accent);}
/* Source attribution + link to the full case study */
.fill-src{margin-top:clamp(28px,3.2vw,42px); text-align:center; font-size:13px; color:var(--cream-readable); line-height:1.6;}
.fill-src a{display:inline-block; margin-top:12px; color:var(--cream); font-weight:600; white-space:nowrap; border-bottom:1px solid var(--line); padding-bottom:1px; transition:border-color .2s;}
.fill-src a:hover{border-bottom-color:var(--accent);}
.fill-src .ar{margin-left:2px;}
@media(max-width:760px){ #fills .wrap{max-width:none;} .fill-cmp{grid-template-columns:1fr; gap:22px; max-width:460px; margin-inline:auto;} }
/* "Ready to run on" lead-in line above the channel logo wall (inside the showcase section) */
.uc-chan-head{margin-top:56px; font-family:var(--font-d); font-weight:600; font-size:clamp(18px,2vw,22px); letter-spacing:-.01em; color:var(--cream-soft); text-align:center;}
.uc-chan-head + .chan-marq{margin-top:30px;}
/* "Ready to run on" — auto-scrolling logo wall of CTV/streaming destinations. Mirrors
   .quote-marq: a flex track holds the logo set twice, animated translateX 0 → -50% for a
   seamless loop. The dupe set is aria-hidden + .is-dupe so reduced motion can hide it and
   fall back to a static centered wrap. Mono brand: every mark is pre-recolored to cream
   (assets/logos/<brand>-cream.svg), resting at 60% and lifting to full-cream on hover. */
.chan-marq{overflow:hidden; padding-bottom:8px; /* headroom so the nudged-down Amazon smile isn't clipped by overflow:hidden */
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 10%,#000 90%,transparent);
          mask-image:linear-gradient(90deg,transparent,#000 10%,#000 90%,transparent);}
.chan-track{display:flex; width:max-content; align-items:center; animation:chanMarq 42s linear infinite;}
.chan-marq:hover .chan-track{animation-play-state:paused;}
.chan-logo{height:clamp(22px,2.5vw,29px); width:auto; flex:none; margin:0 clamp(28px,4.2vw,58px);
  opacity:.6; transition:opacity .25s ease;}
/* Optical sizing — equal metric height reads unequal. The Max badge & Pluto blob
   (compact marks) and the Amazon wordmark (its smile eats the lower third, shrinking
   the letters) are sized up ~27% so their letterforms match the wide wordmarks. The
   Netflix wordmark is thin all-caps and reads light, so it gets a smaller ~14% nudge.
   The wordmark SVGs were also cropped to their artwork bounds so equal height stays even. */
.chan-logo[src*="netflix-cream"]{ height:clamp(25px,2.85vw,33px); }
.chan-logo[src*="max-cream"],
.chan-logo[src*="plutotv-cream"],
.chan-logo[src*="amazon-cream"]{ height:clamp(28px,3.2vw,37px); }
/* Amazon's smile lives in the lower third, so box-centering floats the wordmark high —
   nudge it down (~% of its own height, so it scales) to optically center the letters. */
.chan-logo[src*="amazon-cream"]{ transform:translateY(14%); }
.chan-logo:hover{opacity:1;}
@keyframes chanMarq{from{transform:translateX(-50%);} to{transform:translateX(0);}}
@media(prefers-reduced-motion:reduce){
  .chan-track{animation:none; width:auto; flex-wrap:wrap; justify-content:center; gap:clamp(26px,4vw,52px);}
  .chan-logo{margin:0;}
  .chan-logo.is-dupe{display:none;}
}
@media(prefers-reduced-motion:reduce){ .marq-col.up .marq-track,.marq-col.down .marq-track{animation:none;} }
@media(max-width:900px){
  .uc-hero-grid{grid-template-columns:1fr; text-align:center;}
  .uc-hero .h-title{text-align:center;}
  .uc-hero .h-sub{margin-inline:auto;}
  .uc-hero .h-cta{justify-content:center;}
  /* gallery → one horizontal auto-scroll ribbon: flatten the "up" column into a row,
     hide the "down" column (its videos stay display:none so they don't decode). */
  .uc-gallery{display:block; height:auto; margin:32px 0 0; overflow:hidden; pointer-events:none;
    -webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);
            mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);}
  .uc-gallery .marq-col.down{display:none;}
  .uc-gallery .marq-col.up{overflow:visible; margin-top:0;}
  .marq-col.up .marq-track{flex-direction:row; width:max-content; animation:marqLeft 24s linear infinite;}
  .marq-col.up .marq-card{margin:0 12px 0 0; width:clamp(180px,52vw,232px);}
}

/* entrance */
.rise{opacity:0; transform:translateY(20px); animation:rise 1.1s var(--ease) forwards;}
.d1{animation-delay:.05s;} .d2{animation-delay:.18s;} .d3{animation-delay:.32s;} .d4{animation-delay:.46s;} .d5{animation-delay:.6s;}
@keyframes rise{to{opacity:1; transform:none;}}
@media(prefers-reduced-motion:reduce){ .rise{animation:none; opacity:1; transform:none;} }

/* ---------------- reframe demo ---------------- */
.demo-wrap{margin-top:64px; display:flex; flex-direction:column; align-items:center; gap:26px;}
.switch{display:inline-flex; gap:0; border:1px solid var(--line); border-radius:var(--r-s); overflow:hidden; flex-wrap:wrap; justify-content:center; position:relative;}
.switch button{font-family:var(--font-b); font-weight:600; font-size:11px; letter-spacing:.14em; text-transform:uppercase; cursor:pointer; color:var(--cream-soft); background:transparent; border:none; border-right:1px solid var(--line-2); padding:13px 18px; transition:color .25s var(--ease); white-space:nowrap; position:relative; z-index:1;}
.switch button:last-child{border-right:none;}
.switch button:hover{color:var(--cream); background:rgba(236,231,221,.03);}
.switch button.on{color:var(--accent);}
.switch-ink{position:absolute; left:0; top:0; width:0; height:0; pointer-events:none;
  background:rgba(236,231,221,.07); box-shadow:inset 0 -2px 0 var(--accent);
  transition:transform .44s var(--ease), width .44s var(--ease), height .44s var(--ease);}

/* FIXED height (not min-height): the canvas morphs between aspect ratios inside this box,
   so reserving a constant footprint keeps the demo from reflowing the page below it as it
   cycles (otherwise the stage grows/shrinks per format and content snaps around on scroll). */
.stage{position:relative; width:100%; min-width:0; max-width:100%; align-self:stretch; display:flex; justify-content:center; align-items:center; height:440px;}
.scaler{transition:none; transform-origin:50% 50%;}
.canvas{position:relative; height:392px; width:220px; overflow:hidden; border-radius:var(--r-s);
  transition:opacity .35s var(--ease);
  box-shadow:0 40px 90px -40px rgba(0,0,0,.9), 0 0 0 1px var(--line-2);
  background:#000;}
.canvas .scene{position:absolute; inset:0; width:100%; height:100%; object-fit:cover; display:block; filter:saturate(.98) brightness(.9) contrast(1.03); transition:filter .5s;}
.canvas.dome .scene{transform:scale(1.045);}
.canvas .poster{z-index:2; transition:opacity .45s var(--ease);}
.canvas .buf{opacity:0; transition:opacity .52s var(--ease);}
.canvas .buf.is-front{opacity:1;}
/* generated-region field is painted by #original's clipped box-shadow (see .original) */
.canvas .gen-scan{display:none;}
.gen-tag{display:none;}
@keyframes pulse{50%{opacity:.3;}}

.original{position:absolute; left:50%; top:50%; transform:translate(-50%,-50%); z-index:5; width:220px; height:392px; pointer-events:none;
  box-shadow:0 0 0 1.5px var(--cream), 0 0 0 9999px var(--gen-field), inset 0 1px 0 var(--lift-top);
  transition:opacity .4s var(--ease);}
.original .owin{position:absolute; inset:0; overflow:hidden;}
.original .oscene{position:absolute; left:50%; top:50%; transform:translate(-50%,-50%); max-width:none; object-fit:cover;}
.original .corner{position:absolute; width:14px; height:14px; border:2px solid var(--accent);}
.original .corner.tl{left:-1px; top:-1px; border-right:none; border-bottom:none;}
.original .corner.tr{right:-1px; top:-1px; border-left:none; border-bottom:none;}
.original .corner.bl{left:-1px; bottom:-1px; border-right:none; border-top:none;}
.original .corner.br{right:-1px; bottom:-1px; border-left:none; border-top:none;}
/* fisheye radius is JS-driven per-frame (px) so the box rounds into a true circle */

/* ---------------- lifted dark panels ---------------- */
.light{background:var(--ink-1); color:var(--cream); border-top:1px solid var(--line-2); border-bottom:1px solid var(--line-2);}
.light .eyebrow{color:rgba(236,231,221,.72);}
.light .muted{color:var(--cream-soft);}
.sec-head{max-width:680px;}
.sec-head h2{font-size:clamp(34px,5.4vw,62px); letter-spacing:-.01em; line-height:1.02;}
.sec-head .lead{font-size:clamp(16px,1.7vw,19px); color:var(--cream-soft); margin-top:20px; line-height:1.7; text-wrap:pretty;}
.center.sec-head{margin-inline:auto;}

/* ---------------- how it works ---------------- */
.steps{display:grid; grid-template-columns:repeat(3,1fr); gap:1px; margin-top:60px; background:var(--line-2); border:1px solid var(--line-2);}
.step{position:relative; padding:38px 32px; background:var(--ink-1); transition:background .35s var(--ease);}
.step:hover{background:var(--ink-2);}
.step .n{font-family:var(--font-b); font-size:11px; letter-spacing:.24em; text-transform:uppercase; color:var(--accent); font-weight:600;}
.step .ic{width:46px; height:46px; border:1px solid var(--line); border-radius:var(--r-s); display:flex; align-items:center; justify-content:center; margin:22px 0 22px; color:var(--cream);}
.step h3{font-size:27px; font-weight:600;}
.step p{color:var(--cream-soft); margin-top:10px; font-size:15.5px;}
/* ---------------- case studies ---------------- */
/* Big claim/metric number, used in the proof strip and the source cards. */
.cs-stat{font-family:var(--font-d); font-weight:700; font-size:clamp(42px,4.6vw,60px); line-height:.95; letter-spacing:-.03em; color:var(--cream);}
/* Proof strip — three oversized figures with hairline dividers */
.cs-figures{display:grid; grid-template-columns:repeat(3,1fr); gap:clamp(24px,4vw,40px); margin-top:clamp(44px,6vw,76px);}
.cs-fig{display:flex; flex-direction:column; align-items:center; text-align:center; padding:0 clamp(8px,2vw,28px);}
.cs-fig + .cs-fig{border-left:1px solid var(--line-2);}
.cs-figures .cs-stat{font-size:clamp(58px,9vw,116px); line-height:.9;}
.cs-stat-sub{display:block; margin-top:10px; font-family:var(--font-b); font-weight:600; font-size:clamp(15px,1.5vw,19px); letter-spacing:0; color:var(--cream-soft);}
.cs-card-foot{display:flex; align-items:flex-end; justify-content:space-between; gap:16px; margin-top:clamp(32px,3.5vw,46px);}
.cs-figures-block{position:relative; padding-bottom:28px;}
.cs-figures-block .cs-figures-note{position:absolute; right:0; bottom:0; margin:0;}
.cs-figures-note{font-family:var(--font-b); font-size:11px; letter-spacing:.2em; text-transform:uppercase; color:var(--cream-readable); font-weight:600; text-align:right;}
.cs-fig .lab{margin-top:20px; color:var(--cream-soft); font-size:clamp(13.5px,1.3vw,16px); line-height:1.55; max-width:24ch;}
/* Source cards (2×2) — evidence from platforms + studies; the big claim is the visual hook */
.cs-grid{display:grid; grid-template-columns:repeat(2,1fr); gap:18px; margin-top:clamp(46px,5vw,62px);}
.cs-card{display:flex; flex-direction:column; background:var(--ink-1); border:1px solid var(--line-2); border-radius:var(--r-l); padding:clamp(30px,2.8vw,44px) clamp(28px,2.6vw,40px); box-shadow:var(--shadow);
  transition:transform .4s var(--ease), border-color .4s var(--ease), background .4s var(--ease);}
.cs-card:hover{transform:translateY(-5px); border-color:var(--line); background:var(--ink-2);}
.cs-card .n{font-family:var(--font-b); font-size:11px; letter-spacing:.2em; text-transform:uppercase; color:var(--cream-readable); font-weight:600;}
.cs-card .cs-stat{margin-top:18px; font-size:clamp(38px,3.4vw,54px); line-height:1;}
.cs-card h3{font-size:clamp(19px,1.5vw,23px); font-weight:600; letter-spacing:-.01em; margin-top:20px;}
.cs-card p{color:var(--cream-soft); margin-top:11px; font-size:14.5px; line-height:1.62;}
/* "Read source →" — pinned to the card bottom so links align across the row */
.cs-link{margin-top:auto; padding-top:26px; align-self:flex-start; font-family:var(--font-b); font-size:12px; font-weight:600; letter-spacing:.14em; text-transform:uppercase; color:var(--cream); display:inline-flex; align-items:center; gap:8px; transition:gap .2s var(--ease), color .2s;}
.cs-link .ar{transition:transform .25s var(--ease);}
.cs-link:hover .ar{transform:translateX(5px);}
@media(max-width:920px){
  .cs-figures{grid-template-columns:1fr; gap:0;}
  .cs-fig{padding:30px 0;}
  .cs-fig + .cs-fig{border-left:0; border-top:1px solid var(--line-2);}
}
@media(max-width:560px){ .cs-grid{grid-template-columns:1fr;} }
.how-note{margin-top:38px; text-align:center; font-size:13px; letter-spacing:.04em; color:var(--cream-readable);}
.how-note strong{color:var(--cream); font-weight:600;}
.how-note a{color:var(--accent); font-weight:600; white-space:nowrap; border-bottom:1px solid transparent; transition:border-color .2s; letter-spacing:.1em; text-transform:uppercase; font-size:12px; margin-left:6px;}
.how-note a:hover{border-bottom-color:var(--accent);}

/* ---------------- case-study report (survey) ---------------- */
/* Metadata strip under the report hero — brand / source / n / date */
.rep-meta{display:flex; flex-wrap:wrap; gap:22px 40px; margin-top:clamp(34px,4vw,46px); padding-top:30px; border-top:1px solid var(--line-2);}
.rep-meta div{min-width:0;}
.rep-meta b{display:block; font-family:var(--font-b); font-size:11px; letter-spacing:.18em; text-transform:uppercase; color:var(--cream-readable); font-weight:600; margin-bottom:5px;}
.rep-meta span{font-size:15px; color:var(--cream);}
/* Article prose — abstract / narrative blocks */
.rep-prose{max-width:760px;}
.rep-prose p{color:var(--cream-soft); font-size:clamp(16px,1.7vw,18px); line-height:1.78;}
.rep-prose p + p{margin-top:18px;}
.rep-prose strong{color:var(--cream); font-weight:600;}
/* Methods callout — how to read the report */
.rep-method{background:var(--ink-1); border:1px solid var(--line-2); border-radius:var(--r-l); padding:clamp(26px,3vw,40px); margin-top:clamp(40px,5vw,60px);}
.rep-method p{color:var(--cream-soft); font-size:15px; line-height:1.7;}
.rep-method p + p{margin-top:14px;}
.rep-method strong{color:var(--cream); font-weight:600;}
/* One survey question block: tag + question + scale + table + takeaway */
.rep-q{margin-top:clamp(46px,6vw,80px); max-width:920px;}
.rep-tag{font-family:var(--font-b); font-size:11px; letter-spacing:.2em; text-transform:uppercase; color:var(--cream-readable); font-weight:600;}
.rep-q h3{font-size:clamp(21px,2.2vw,30px); font-weight:600; margin-top:12px; letter-spacing:-.012em; max-width:24ch;}
.rep-q h3 .q-tag{color:var(--cream-readable); font-weight:500;}
.rep-q .scale{font-size:13.5px; color:var(--cream-readable); margin-top:10px; font-style:italic; line-height:1.55;}
/* Data table — hairline rows, mono uppercase head, numerals right-aligned */
.rep-tw{overflow-x:auto; margin-top:22px; -webkit-overflow-scrolling:touch; border:1px solid var(--line-2); border-radius:var(--r-m);}
table.rep{width:100%; border-collapse:collapse; font-size:14px; min-width:540px;}
table.rep th,table.rep td{padding:12px 16px; text-align:right; border-bottom:1px solid var(--line-2); white-space:nowrap; color:var(--cream-soft);}
table.rep th:first-child,table.rep td:first-child{text-align:left; white-space:normal; color:var(--cream);}
table.rep thead th{font-family:var(--font-b); font-size:10.5px; letter-spacing:.1em; text-transform:uppercase; color:var(--cream-readable); font-weight:600; border-bottom:1px solid var(--line); background:var(--ink-1);}
table.rep tbody tr:last-child td{border-bottom:0;}
table.rep strong{color:var(--cream); font-weight:700;}
table.rep .tal{text-align:left; white-space:normal;}
/* Outpaint is the product — anchor its row/column with a faint warm wash */
table.rep tr.is-out td,table.rep td.is-out,table.rep th.is-out{background:rgba(236,231,221,.045);}
table.rep tr.is-out td:first-child{box-shadow:inset 2px 0 0 var(--accent);}
/* Significance pill */
.sig{display:inline-block; font-family:var(--font-b); font-size:10px; font-weight:700; letter-spacing:.06em; padding:2px 8px; border:1px solid var(--accent); border-radius:100px; color:var(--cream); vertical-align:middle; margin-left:6px; text-transform:uppercase;}
/* Per-question takeaway — accent-edged note */
.rep-take{margin-top:18px; padding:16px 22px; border-left:2px solid var(--accent); background:var(--ink-1); border-radius:0 var(--r-m) var(--r-m) 0; font-size:15px; color:var(--cream-soft); line-height:1.66;}
.rep-take strong{color:var(--cream); font-weight:600;}
/* Bottom-line list */
.rep-bottom{list-style:none; padding:0; margin:clamp(34px,4vw,46px) 0 0; display:grid; gap:16px; max-width:880px;}
.rep-bottom li{padding-left:28px; position:relative; color:var(--cream-soft); font-size:16px; line-height:1.64;}
.rep-bottom li::before{content:''; position:absolute; left:0; top:10px; width:9px; height:9px; background:var(--accent);}
.rep-bottom li strong{color:var(--cream); font-weight:600;}
.rep-foot{margin-top:clamp(44px,5vw,64px); padding-top:28px; border-top:1px solid var(--line-2); font-size:13px; color:var(--cream-readable); line-height:1.72; max-width:880px;}
@media(max-width:560px){ .rep-method,.rep-q .scale{font-size:13.5px;} }

/* ---------------- gallery ---------------- */
.gal{display:grid; grid-template-columns:repeat(12,1fr); gap:14px; margin-top:60px;}
.tile{position:relative; overflow:hidden; background:#000; box-shadow:var(--shadow); cursor:pointer; grid-column:span 4; border:1px solid var(--line-2);}
.tile.wide{grid-column:span 8;} .tile.half{grid-column:span 6;}
.tile img{width:100%; height:100%; object-fit:cover; transition:transform .7s var(--ease); filter:brightness(.88);}
.tile:hover img{transform:scale(1.04);}
.tile .dome-vid{filter:brightness(.9); transition:transform .7s var(--ease);}
.tile:hover .dome-vid{transform:scale(1.04);}
.tile .ov{position:absolute; inset:0; background:linear-gradient(180deg,transparent 45%,rgba(5,5,5,.78)); display:flex; align-items:flex-end; padding:24px;}
.tile .frameline{position:absolute; top:50%; left:50%; transform:translate(-50%,-50%); border:1.5px solid rgba(236,231,221,.9); box-shadow:0 0 0 9999px rgba(5,5,5,0); transition:box-shadow .45s var(--ease), border-color .45s;}
.tile:hover .frameline{box-shadow:0 0 0 9999px rgba(5,5,5,.5); border-color:var(--accent);}
.tile .lab{position:relative; z-index:2; color:var(--cream); font-family:var(--font-d); font-weight:600; font-size:18px; letter-spacing:-.01em; line-height:1.25; text-wrap:balance;}
.tile .lab .to{color:var(--accent); margin:0 4px;}
.tile .ratio-tag{position:absolute; top:16px; right:16px; z-index:2; white-space:nowrap; font-family:var(--font-b); font-size:10px; font-weight:600; letter-spacing:.18em; text-transform:uppercase; color:var(--cream); background:rgba(5,5,5,.5); border:1px solid var(--line); padding:6px 11px; border-radius:var(--r-s); backdrop-filter:blur(6px);}

/* ---------------- pixel-perfect compare ---------------- */
.pp{display:grid; grid-template-columns:1fr 1fr; gap:clamp(36px,7vw,90px); align-items:center;}
.pp-compare-col{display:flex; flex-direction:column;}
.cmp-hint{margin:12px 0 0; font-size:14.5px; line-height:1.5; color:var(--cream-soft); text-align:center; text-wrap:pretty;}
.compare{position:relative; overflow:hidden; aspect-ratio:16/10; background:#000; box-shadow:var(--shadow); border:1px solid var(--line-2); user-select:none; touch-action:pan-y;}
.compare .full{position:absolute; inset:0;}
.compare .full img,.compare .full video{width:100%; height:100%; object-fit:cover; display:block;}
.compare .before{position:absolute; inset:0;}
.compare .before .crop{position:absolute; left:50%; transform:translateX(-50%); box-shadow:0 0 0 9999px #000;}
.compare .before .crop img{position:absolute; height:100%; left:50%; transform:translateX(-50%); max-width:none; object-fit:cover;}
.compare .before .crop video{position:absolute; max-width:none; object-fit:cover; display:block;}
.compare .cmp-mark{position:absolute; left:50%; transform:translateX(-50%); box-shadow:0 0 0 1.5px var(--cream); pointer-events:none; z-index:4;}
.compare .hbar{position:absolute; top:0; bottom:0; width:1px; background:var(--accent); z-index:5; cursor:ew-resize;}
.compare .hbar .knob{position:absolute; top:50%; left:50%; transform:translate(-50%,-50%); width:44px; height:44px; border-radius:50%; background:var(--accent); color:#0a0a0a; display:flex; align-items:center; justify-content:center; gap:6px; box-shadow:0 6px 18px -4px rgba(0,0,0,.7); font-size:16px; font-weight:700; line-height:1;}
.compare .ctag{position:absolute; bottom:16px; z-index:6; white-space:nowrap; font-family:var(--font-b); font-size:10px; font-weight:600; letter-spacing:.18em; text-transform:uppercase; padding:6px 11px; border-radius:var(--r-s); backdrop-filter:blur(6px); background:rgba(5,5,5,.55); color:var(--cream); border:1px solid var(--line); transition:opacity .25s var(--ease); pointer-events:none;}
.pp-list{display:flex; flex-direction:column; gap:0; margin-top:30px; border-top:1px solid var(--line-2);}
.pp-item{display:flex; gap:16px; align-items:flex-start; padding:18px 0; border-bottom:1px solid var(--line-2);}
.pp-item .tick{flex:none; width:22px; height:22px; border:1px solid var(--accent); border-radius:50%; color:var(--accent); display:flex; align-items:center; justify-content:center; font-size:11px; margin-top:3px;}
.pp-item b{font-weight:600; color:var(--cream);} .pp-item span{color:var(--cream-soft); display:block; font-size:14.5px; margin-top:2px;}

/* ---------------- blurhash skeleton ---------------- */
/* Painted into a canvas inserted by blurhash.js BEFORE the <video> it
   bridges. The 32px-edge canvas stretches via width/height:100% and the
   browser smooth-scales it — that's the cheap blur. Fades on canplay. */
.blurhash-bg{position:absolute; top:0; left:0; width:100%; height:100%;
  border-radius:inherit; pointer-events:none; z-index:0;
  opacity:1; transition:opacity .5s var(--ease);}
.blurhash-bg.is-hidden{opacity:0;}
/* Dome video sits as a centered square inside a 2:1 tile; match it. */
.fisheye-tile .blurhash-bg{width:auto; aspect-ratio:1/1; left:50%;
  transform:translateX(-50%); border-radius:50%;}

/* ---------------- formats ---------------- */
.formats{display:flex; flex-wrap:wrap; gap:12px; margin-top:50px; justify-content:center;}
.formats > .formats-break{flex-basis:100%; height:0; width:0; overflow:hidden;}
.fmt{display:flex; align-items:center; gap:13px; padding:15px 22px; border-radius:var(--r-s); border:1px solid var(--line); background:transparent; transition:.3s var(--ease); cursor:default;}
.fmt:hover{border-color:var(--accent); background:rgba(236,231,221,.05);}
.fmt .glyph{border:1.5px solid var(--accent); flex:none;}
.fmt b{font-family:var(--font-d); font-weight:500; font-size:17px;} .fmt small{color:var(--cream-readable); font-size:11px; letter-spacing:.14em; text-transform:uppercase;}
.formats-spec{margin-top:0;}

/* ---------------- faq (native <details>) ---------------- */
.faq{max-width:780px; margin:54px auto 0; border-top:1px solid var(--line-2);}
.faq details{border-bottom:1px solid var(--line-2);}
.faq summary{display:flex; justify-content:space-between; align-items:center; gap:24px; cursor:pointer; padding:24px 0; font-family:var(--font-d); font-weight:600; font-size:clamp(18px,2.2vw,23px); letter-spacing:-.01em; color:var(--cream); list-style:none; transition:color .2s;}
.faq summary::-webkit-details-marker{display:none;}
.faq summary::after{content:'+'; flex:none; font-family:var(--font-b); font-weight:400; font-size:26px; line-height:1; color:var(--cream-soft); transition:transform .25s var(--ease), color .2s;}
.faq summary:hover{color:var(--cream);}
.faq details[open] summary{color:var(--accent);}
.faq details[open] summary::after{transform:rotate(45deg); color:var(--accent);}
.faq p{color:var(--cream-soft); font-size:15.5px; line-height:1.7; padding:0 0 26px; max-width:66ch;}

/* ---------------- CTA ---------------- */
.cta{position:relative; text-align:center; overflow:hidden; isolation:isolate; border-top:1px solid var(--line-2);}
.cta::before{content:''; position:absolute; inset:0; z-index:-1; background:radial-gradient(70% 100% at 50% 0%, rgba(201,168,106,.07), transparent 62%);}
.cta h2{font-size:clamp(40px,7vw,84px); letter-spacing:-.035em; font-weight:700; line-height:1;}
.cta .lead{font-size:clamp(17px,2vw,21px); color:var(--cream-soft); max-width:48ch; margin:24px auto 36px; line-height:1.7;}

/* ---------------- footer ---------------- */
.footer{border-top:1px solid var(--line-2); padding-block:56px 44px; color:var(--cream-soft);}
.foot-top{display:flex; justify-content:space-between; align-items:center; gap:24px 44px; flex-wrap:wrap; padding-bottom:30px; border-bottom:1px solid var(--line-2);}
.footer .cols{display:flex; gap:14px 40px; flex-wrap:wrap; font-size:11px; letter-spacing:.24em; text-transform:uppercase;}
.footer .cols a{color:var(--cream-readable); padding-block:4px; transition:color .25s ease;}
.footer a:hover{color:var(--cream);}
.foot-bot{display:flex; justify-content:space-between; align-items:baseline; gap:10px 26px; flex-wrap:wrap; padding-top:26px; font-size:11px; letter-spacing:.18em; text-transform:uppercase; color:var(--cream-readable);}

/* ---------------- modal ---------------- */
.scrim{position:fixed; inset:0; z-index:90; background:rgba(3,3,3,.78); backdrop-filter:blur(10px); opacity:0; pointer-events:none; transition:opacity .35s; display:flex; align-items:center; justify-content:center;
  padding-top:max(24px, env(safe-area-inset-top, 0px));
  padding-right:max(24px, env(safe-area-inset-right, 0px));
  padding-bottom:max(24px, env(safe-area-inset-bottom, 0px));
  padding-left:max(24px, env(safe-area-inset-left, 0px));}
.scrim.open{opacity:1; pointer-events:auto;}
.modal{width:min(540px,100%); background:var(--ink-1); color:var(--cream); border:1px solid var(--line); border-radius:var(--r-l); padding:clamp(28px,4vw,44px); box-shadow:0 50px 120px -30px rgba(0,0,0,.9); transform:translateY(16px); opacity:0; transition:.4s var(--ease); max-height:92vh; overflow:auto;}
.scrim.open .modal{transform:none; opacity:1;}
.modal .x{position:absolute; top:18px; right:18px;}
.modal h3{font-size:32px; font-weight:600; letter-spacing:-.02em;}
.modal .msub{color:var(--cream-soft); margin-top:10px; font-size:15px;}
.m-list{list-style:none; padding:0; margin:22px 0 0; border-top:1px solid var(--line-2);}
.m-list li{display:flex; gap:13px; align-items:flex-start; padding:13px 0; border-bottom:1px solid var(--line-2); font-size:14.5px; color:var(--cream-soft); line-height:1.5;}
.m-list .tick{flex:none; width:20px; height:20px; border:1px solid var(--accent); border-radius:50%; color:var(--accent); display:flex; align-items:center; justify-content:center; font-size:10px; margin-top:2px;}

/* reveal */
.reveal{opacity:0; transform:translateY(22px); transition:opacity .9s var(--ease), transform .9s var(--ease);}
.reveal.in{opacity:1; transform:none;}
@media(prefers-reduced-motion:reduce){ .reveal{opacity:1; transform:none;} }

/* ============================================================
   RESPONSIVE
   desktop ≥1025 · tablet 641–1024 · phone ≤640 · small ≤380
   ============================================================ */

/* ---- tablet & small laptop ---- */
@media(max-width:1024px){
  /* gallery → two-up, wide pieces stay full-bleed */
  .gal{gap:12px;}
  .gal .tile,.gal .tile.half{grid-column:span 6;}
  .gal .tile.wide{grid-column:span 12;}
  .tile .lab{font-size:16px;}
}

/* pixel-perfect splits before the gallery does — it needs the width */
@media(max-width:900px){
  .pp{grid-template-columns:1fr; gap:40px;}
}

/* nav: brand + Gallery + the primary CTA — all three stay visible at every width */
@media(max-width:820px){
  .nav-links{gap:20px;}
}

/* ---- phone ---- */
@media(max-width:640px){
  body{font-size:16px;}
  .brand{font-size:19px;}
  .nav-links{gap:12px;}
  .nav-cta{display:none;}        /* phone: collapse to the hamburger */
  .nav-burger{display:inline-flex;}
  .eyebrow{font-size:12px; letter-spacing:.22em;}
  .tile .ov{display:none;}
  .steps{grid-template-columns:1fr; margin-top:40px;}
  .gal{margin-top:40px;}
  .gal .tile,.gal .tile.wide,.gal .tile.half{grid-column:span 12;}

  .hero{padding-top:104px; padding-bottom:60px;}
  .hero .eyebrow{display:none;}
  .h-sub{margin:22px auto 28px;}
  .h-cta{flex-direction:column; align-items:stretch;}
  .h-cta .btn{justify-content:center;}
  /* Demote the secondary "See examples" CTA to a text-link on mobile so it
     doesn't compete with the primary button — same pattern as .see-all. */
  .h-cta .btn-ghost{
    background:transparent; border:none; padding:8px 0;
    font-size:12px; letter-spacing:.12em; gap:8px;
    color:var(--accent); align-self:center; width:auto;
  }
  .h-cta .btn-ghost:hover, .h-cta .btn-ghost:focus-visible{background:transparent; border:none;}
  .h-cta .btn-ghost::after{content:'↓'; margin-left:2px;}
  .h-trust{flex-direction:column; gap:8px; text-align:center; margin-top:28px;}

  .demo-wrap{margin-top:40px; gap:20px;}
  /* mobile: content on top, the format selector (and outline toggle) sit beneath it.
     Keep the fixed 440px height from the base rule so the morphing canvas never reflows
     the page (the format swing used to make this stage grow/shrink → content snapped around). */
  .stage{order:-1;}
  .switch{width:100%;}
  .switch button{flex:1 1 38%; padding:12px 10px; font-size:10px; letter-spacing:.1em;}

  .step{padding:28px 24px;}
  .step h3{font-size:23px;}
  .how-note a{display:inline-block; margin-left:0; margin-top:6px;}

  .formats{gap:7px; margin-top:34px;}
  .fmt{padding:9px 12px; gap:9px;}
  .fmt b{font-size:14px;}
  .fmt small{display:none;}

  .cta .lead{margin:20px auto 30px;}
  .cta div[style*="display:flex"]{flex-direction:column; align-items:stretch;}
  .cta .btn{justify-content:center;}

  .footer{padding-block:44px 36px;}
  .foot-top{flex-direction:column; align-items:flex-start; gap:22px; padding-bottom:24px;}
  .footer .cols{gap:12px 26px;}
  .foot-bot{flex-direction:column; align-items:flex-start; gap:8px; padding-top:20px;}

  .scrim{padding-top:max(14px, env(safe-area-inset-top, 0px));
    padding-right:max(14px, env(safe-area-inset-right, 0px));
    padding-bottom:max(14px, env(safe-area-inset-bottom, 0px));
    padding-left:max(14px, env(safe-area-inset-left, 0px));}
  .modal h3{font-size:26px;}
}

/* ---- small phone ---- */
@media(max-width:380px){
  .brand{font-size:18px;}
  .nav-links .btn{padding:10px 10px; font-size:10px;}
  .h-title{font-size:44px;}
}

/* ---------------- QA hardening (a11y / mobile) ---------------- */
@media(prefers-reduced-motion:reduce){
  html{scroll-behavior:auto;}
  .scaler,.canvas,.tile img,.tile .dome-vid,.switch-ink,.canvas .buf,.original,.ex-frame{transition:none;}
}
/* iOS Safari auto-zooms inputs <16px on focus — bump on phones only */
@media(max-width:640px){
  .field input,.field select,.field textarea{font-size:16px;}
}

/* ================= EXAMPLES GALLERY (/gallery) ================= */
.ex-intro{max-width:760px; margin-inline:auto; text-align:center;}
/* CSS GRID masonry — no CSS multi-column (WebKit/Safari mis-measures it). Base is a plain
   responsive grid (works with JS off — just leaves row-gaps under shorter cards). `gallery.js`
   `masonry()` then adds `.is-masoned` (1px row track) and sets each card's `grid-row-end:span <h>`
   so cards pack tight with no gaps — standard Grid + JS, which Safari handles fine. Card height
   comes from the `.ex-ratio` spacer's inline `padding-top:%` (self-contained; no `aspect-ratio`,
   no calc, no CSS-var that can desync from a stale cache). */
.ex-grid{display:grid; grid-template-columns:repeat(auto-fill, minmax(320px, 1fr)); gap:18px; margin-top:54px;}
.ex-grid.is-masoned{grid-auto-rows:1px; row-gap:0; align-items:start;}  /* cards stay content-height; row-span makes the 18px gap */
.ex{display:block; margin:0; background:var(--ink-1); border:1px solid var(--line-2); box-shadow:var(--shadow); position:relative; transition:opacity .55s var(--ease), filter .55s var(--ease);}
/* cards rest darkened; hovering one plays it and brightens it (toggled in gallery.js) */
.ex.is-dim{opacity:.74; filter:saturate(.8) brightness(.88);}
.ex-stage{position:relative; width:100%; background:#000; overflow:hidden;}
.ex-ratio{display:block; width:100%; padding-top:56.25%;}  /* per-card override via inline style */
.ex-vid,.ex-poster{position:absolute; inset:0; width:100%; height:100%; object-fit:cover; display:block;}
.ex-vid{filter:saturate(.98) brightness(.92) contrast(1.02);}
.ex-poster{z-index:2; transition:opacity .45s var(--ease);}
.ex-veil{position:absolute; inset:0; z-index:3; pointer-events:none; background:linear-gradient(180deg,rgba(7,7,7,.08),rgba(7,7,7,.0) 30%,rgba(7,7,7,.0) 62%,rgba(7,7,7,.42));}
/* original-frame outline (IMAX): marks the source band; everything outside was generated */
.ex-frame{position:absolute; left:0; right:0; top:50%; transform:translateY(-50%); z-index:4; pointer-events:none;
  border-top:1.5px solid var(--cream); border-bottom:1.5px solid var(--cream); transition:opacity .3s var(--ease);}
/* vertical variant: source was 9:16 inside a 16:9 result, so the outline is a tall strip in the middle */
.ex-frame.vert{left:50%; right:auto; top:0; bottom:0; transform:translateX(-50%);
  border-top:none; border-bottom:none; border-left:1.5px solid var(--cream); border-right:1.5px solid var(--cream);}
/* dome variant: a full box marking the original footage's footprint inside the 180° dome
   (width/height/top set inline per clip). Hidden by the "Original outline" toggle like the rest. */
.ex-frame.box{left:50%; right:auto; top:50%; bottom:auto; transform:translate(-50%,-50%); border:1.5px solid var(--cream);}
.ex-frame::before{content:none;}
.ex-badge{position:absolute; top:12px; right:12px; z-index:5; white-space:nowrap; font-family:var(--font-b); font-size:10px; font-weight:600; letter-spacing:.16em; text-transform:uppercase; color:var(--cream); background:rgba(7,7,7,.55); border:1px solid var(--line); padding:6px 10px; backdrop-filter:blur(6px);}
.ex-cap{padding:15px 16px 16px;}
.ex-row{display:flex; align-items:flex-start; justify-content:space-between; gap:12px;}
.ex-title{font-family:var(--font-d); font-weight:600; font-size:18px; letter-spacing:-.01em; color:var(--cream);}
.ex-year{color:var(--cream-readable); font-size:13px; margin-left:6px;}
.ex-tag{margin-top:8px; font-family:var(--font-b); font-size:10.5px; font-weight:600; letter-spacing:.16em; text-transform:uppercase; color:var(--cream-readable); display:flex; align-items:center; gap:8px;}
.ex-tag .to{color:var(--accent); letter-spacing:0; font-size:13px;}
.see-all{display:inline-flex; align-items:center; gap:8px; margin-top:18px; font-family:var(--font-b); font-size:12px; font-weight:600; letter-spacing:.12em; text-transform:uppercase; color:var(--accent); border-bottom:1px solid transparent; transition:border-color .2s;}
.see-all:hover{border-bottom-color:var(--accent);}
/* homepage gallery mirror: shows the first few cards; "See more examples" links to /gallery */
.ex-more{margin-top:34px; text-align:center;}
@media(max-width:640px){
  .ex-grid{grid-template-columns:1fr; margin-top:34px;}
  .ex-title{font-size:16px;}
}

/* ---- outline guide toggle (hide/show the original-frame lines) ---- */
.guide-toggle{display:inline-flex; align-items:center; gap:11px; cursor:pointer; font-family:var(--font-b); font-size:11px; font-weight:600; letter-spacing:.16em; text-transform:uppercase; color:var(--cream-soft); background:transparent; border:none; padding:6px; transition:color .2s;}
.guide-toggle:hover{color:var(--cream);}
.guide-toggle .gt-track{position:relative; width:40px; height:21px; border-radius:999px; background:rgba(236,231,221,.12); border:1px solid var(--line); transition:.25s var(--ease); flex:none;}
.guide-toggle .gt-track::after{content:''; position:absolute; top:2px; left:2px; width:15px; height:15px; border-radius:50%; background:var(--cream-soft); transition:.25s var(--ease);}
.guide-toggle[aria-checked="true"]{color:var(--cream);}
.guide-toggle[aria-checked="true"] .gt-track{background:rgba(236,231,221,.22); border-color:var(--cream-soft);}
.guide-toggle[aria-checked="true"] .gt-track::after{left:22px; background:var(--accent);}
.guide-toggle:focus-visible{outline:2px solid var(--accent); outline-offset:3px; border-radius:var(--r-s);}
.ex-grid.lines-hidden .ex-frame{opacity:0;}
.demo-wrap.guides-off .original{opacity:0;}
.demo-wrap.fmt-src .original{opacity:0;}
.original.dome-marker{border-radius:2px;}   /* dome: original stays a clean rectangle window (its true shape) */

/* ---- fisheye look-around viewer ---- */
.ex-look{position:absolute; left:50%; bottom:14px; transform:translateX(-50%); z-index:5; display:inline-flex; align-items:center; gap:8px; font-family:var(--font-b); font-size:10.5px; font-weight:600; letter-spacing:.16em; text-transform:uppercase; color:var(--cream); background:rgba(7,7,7,.5); border:1px solid var(--line); padding:9px 15px; border-radius:999px; cursor:pointer; backdrop-filter:blur(6px); transition:.2s;}
.ex-look:hover{color:var(--ink); background:var(--cream); border-color:var(--cream);}
.ex-look .lk-ico{font-size:13px; line-height:1;}
/* inline fisheye look-around canvas — overlays the card's video while active */
.ex-gl{position:absolute; inset:0; width:100%; height:100%; display:block; z-index:4; background:#000;}
.ex-hint{position:absolute; top:50%; left:50%; transform:translate(-50%, calc(-50% - 4px)); z-index:5;
  font-family:var(--font-b); font-size:10px; font-weight:600; letter-spacing:.18em; text-transform:uppercase;
  color:var(--cream); background:rgba(7,7,7,.6); border:1px solid var(--line); padding:7px 13px;
  border-radius:999px; backdrop-filter:blur(6px); pointer-events:none; white-space:nowrap;
  opacity:0; transition:opacity .35s var(--ease), transform .35s var(--ease);}
.ex-hint.show{opacity:1; transform:translate(-50%, -50%);}
.ex-hint.gone{opacity:0; transition-duration:.5s;}
