/* ============================================================================
   ALARM CLOCK FILMS — SITE STYLESHEET
   ----------------------------------------------------------------------------
   All styling for index.html, terms.html and 404.html.

   Sections appear in the same order they appear in the markup, which keeps the
   cascade identical to the original. Every block is scoped to its own wrapper
   class (.acf-nav, .acf-hero, .acf-mission, .services, .acf-terms, .acf-footer,
   …) so nothing leaks between sections. The page-wide rules are the BASE block
   directly below, the :root design tokens in the SERVICES section, and
   .acf-svc-locked, which locks body scrolling while a services card is open.

   NOT IN HERE: the 404 page's styling. 404.html is served at arbitrary URLs
   where a relative stylesheet href would resolve against the missing path, so
   it inlines everything it needs in its own <style> block and never loads this
   file. Its section 13 used to be duplicated here as well, which meant every
   visitor to the homepage downloaded 4KB of CSS for a page they were not on.
   Sections 00, 01 and 14 ARE still shared with it by hand — _tools/check-sync.py
   fails the build if those copies drift.

   Fonts (Anton + Space Grotesk) are SELF-HOSTED from /fonts/ and declared in
   the FONTS block directly below.
   ============================================================================ */


/* ============================================================================
   FONTS — Anton (display) + Space Grotesk (body), SELF-HOSTED
   ----------------------------------------------------------------------------
   These used to come from Google Fonts, which cost every first visit a DNS
   lookup, a TLS handshake and a round trip to fonts.googleapis.com for a
   stylesheet that then pointed at a SECOND origin, fonts.gstatic.com, for the
   files themselves — and the whole chain was render-blocking, so nothing on
   the page painted until it finished. The exact same .woff2 files now sit in
   /fonts/ and ship from this origin on the connection the browser has already
   opened. Nothing about how the type renders changed; only where it comes from.

   Each page <head> preloads the two `latin` files so the fetch starts before
   this stylesheet has even been parsed. Because the fonts are same-origin now,
   the CSP no longer needs fonts.googleapis.com in style-src or
   fonts.gstatic.com in font-src.

   WHY FOUR RULES FOR TWO FAMILIES: `latin` covers English; `latin-ext` covers
   the accented characters. unicode-range means a browser downloads latin-ext
   ONLY if the page actually uses a character from it, so the second file costs
   nothing on an English page but is there if a client name ever needs it.

   Space Grotesk is a VARIABLE font — one file carries every weight, which is
   why a single rule declares the 400–700 range instead of three rules naming
   400, 500 and 700 separately. Anton is a single-weight display face.

   Paths are ROOT-ABSOLUTE (/fonts/…) on purpose: 404.html inlines this block
   and is served at arbitrary URLs, where a relative path would resolve against
   the missing directory and 404 the font.

   KEEP IN SYNC: identical block at the top of 404.html's <style>.
   To update a face, refetch it from Google's css2 API with a browser
   User-Agent (that is what makes it hand back woff2) and replace the file.
   ============================================================================ */

@font-face{font-family:'Anton';font-style:normal;font-weight:400;font-display:swap;src:url('/fonts/anton-v27-latin.woff2') format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Anton';font-style:normal;font-weight:400;font-display:swap;src:url('/fonts/anton-v27-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'Space Grotesk';font-style:normal;font-weight:400 700;font-display:swap;src:url('/fonts/space-grotesk-v22-latin.woff2') format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Space Grotesk';font-style:normal;font-weight:400 700;font-display:swap;src:url('/fonts/space-grotesk-v22-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}

/* ============================================================================
   00 · BASE — page ground
   ----------------------------------------------------------------------------
   Every section is designed against a black page: sections that paint no
   background of their own let this show through, and the display type is white
   or yellow. Set it here, on the page itself, so both pages match end to end
   and no gap between sections can flash white.
   ============================================================================ */

html{background:#050505}
body{
  margin:0;
  background:#050505;
  color:#f5f5f5;
  -webkit-font-smoothing:antialiased;
}

/* -----------------------------------------------------------------------------
   ANCHOR TARGETS
   -----------------------------------------------------------------------------
   The nav bar is position:fixed, so it floats over the top of whatever a
   #hash jump lands on. Without this the section heading ends up hidden
   underneath it. Offset every jump target by the bar height plus a little
   breathing room.

   Targets: #work (01 Our Work) · #about (Mission) · #services · #contact and
   #acfGetStarted (Get Started).
   ----------------------------------------------------------------------------- */
#work, #about, #services, #contact, #acfGetStarted{
  scroll-margin-top:calc(72px + 24px);
}

/* NOTE: deliberately NOT setting `scroll-behavior:smooth` here. Browsers apply
   it to fragment navigation on page load as well as to clicks, so arriving from
   another page at index.html#contact would animate a ~12,000px scroll through
   the whole site instead of landing on the section. The hero's scroll arrow
   asks for smooth explicitly in js/main.js where it actually wants it. */



/* ============================================================================
   01 · MAIN NAV + MOBILE OVERLAY   (shared: all pages)
   ============================================================================ */

/* ============================================================
   DESIGN TOKENS — shared by the bar AND the (relocated) overlay
   ============================================================ */
.acf-nav, .acf-mobile-menu{
  --black:#050505;
  --white:#f5f5f5;
  --white-dim:rgba(245,245,245,.62);
  --yellow:#FFD400;
  --line:rgba(245,245,245,.14);
  --display:'Anton', Impact, sans-serif;
  --body:'Space Grotesk', 'Helvetica Neue', Arial, sans-serif;
  --nav-h:72px;
  --pad:clamp(20px, 5vw, 72px);

  /* logo height — the single knob for on-screen logo size */
  --logo-h:55px;
  --logo-h-mobile:34px;

  font-family:var(--body);
  color:var(--white);
  -webkit-font-smoothing:antialiased;
}
.acf-nav *, .acf-mobile-menu *{margin:0;padding:0;box-sizing:border-box}
.acf-nav a, .acf-mobile-menu a{color:inherit;text-decoration:none}
.acf-nav button, .acf-mobile-menu button{font-family:inherit;background:none;border:0;color:inherit;cursor:pointer}
.acf-nav :focus-visible, .acf-mobile-menu :focus-visible{outline:2px solid var(--yellow);outline-offset:3px}
.acf-mobile-menu ::selection, .acf-nav ::selection{background:var(--yellow);color:#000}

/* ============================================================
   THE BAR
   ============================================================ */
.acf-nav{display:flex;width:100%;height:100%}

/* -------------------------------------------------------------
   SELF-PINNING: the script moves .acf-nav to <body> and adds
   this class. Being position:fixed, the bar is glued to the top
   of the viewport — it CANNOT lag the scroll — and sitting
   directly on <body> means backdrop-filter blurs correctly on
   the bar itself. No separate strip.
   ------------------------------------------------------------- */
.acf-nav.acf-nav--fixed{
  position:fixed;top:0;left:0;right:0;width:100%;height:auto;
  z-index:9000;
}

.acf-nav .nav{
  position:relative;flex:1;
  width:100%;min-height:var(--nav-h);
  display:flex;align-items:center;justify-content:space-between;
  padding:0 var(--pad);
  background:transparent;
  border-bottom:1px solid transparent;
  transition:background .3s ease, backdrop-filter .3s ease, border-color .3s ease;
}
/* frosted background once scrolled — applied directly to the (fixed) bar */
.acf-nav .nav.scrolled{
  background:rgba(5,5,5,.72);
  -webkit-backdrop-filter:blur(14px);
          backdrop-filter:blur(14px);
  border-bottom-color:var(--line);
}
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  .acf-nav .nav.scrolled{background:rgba(5,5,5,.92)}
}

/* NO FROST WHILE THE HERO VIDEO IS CROSSING THE BAR
   -------------------------------------------------
   backdrop-filter blurs whatever is BEHIND the bar, and a blur reads roughly
   3x its radius past any edge it finds. While the masked hero video grows to
   full bleed its rounded corners pass straight through this 72px strip, so the
   bright footage smears ~40px OUT of the mask's own outline and paints a soft
   arc on the black either side of each top corner — a second, ghost corner
   floating outside the real one. Nothing is wrong with the mask; the bar is
   drawing it twice.

   Dropping the blur for that one stretch of scroll is enough: the bar keeps
   its translucent fill, so the corner is simply darkened rather than smeared,
   and the frost returns the moment the video is either small enough to clear
   the bar or big enough to cover it. Toggled from js/main.js § 02b — without
   JavaScript the class is never added and the frost is always on.

   Both properties have to go: Safari answers to the -webkit- one. */
html.acf-nav-noblur .acf-nav .nav.scrolled{
  -webkit-backdrop-filter:none;
          backdrop-filter:none;
}
.acf-nav .nav-brand{display:flex;align-items:center}
.acf-nav .nav-brand img{height:var(--logo-h);width:auto;display:block}
@media (max-width:768px){.acf-nav .nav-brand img{height:var(--logo-h-mobile)}}

.acf-nav .nav-links{display:flex;gap:38px;list-style:none}
.acf-nav .nav-links a{
  font-size:13px;letter-spacing:.22em;text-transform:uppercase;font-weight:500;
  padding:8px 0;position:relative;
}
.acf-nav .nav-links a::after{
  content:"";position:absolute;left:0;bottom:2px;height:2px;width:0;
  background:var(--yellow);transition:width .3s ease;
}
.acf-nav .nav-links a:hover::after,.acf-nav .nav-links a:focus-visible::after{width:100%}

.acf-nav .nav-burger{display:none;width:44px;height:44px;flex-direction:column;gap:6px;
  align-items:flex-end;justify-content:center}
.acf-nav .nav-burger span{display:block;height:2px;background:var(--white);transition:.3s;width:28px}
.acf-nav .nav-burger span:nth-child(2){width:18px}
.acf-nav .nav-burger[aria-expanded="true"] span:nth-child(1){transform:translateY(8px) rotate(45deg);width:28px}
.acf-nav .nav-burger[aria-expanded="true"] span:nth-child(2){opacity:0}
.acf-nav .nav-burger[aria-expanded="true"] span:nth-child(3){transform:translateY(-8px) rotate(-45deg);width:28px}

@media (max-width:768px){
  .acf-nav .nav-links{display:none}
  .acf-nav .nav-burger{display:flex}
}

/* ============================================================
   FULL-SCREEN MOBILE OVERLAY  (relocated to <body> by JS)
   ============================================================ */
.acf-mobile-menu{
  position:fixed;inset:0;z-index:99990;background:rgba(5,5,5,.97);
  display:flex;flex-direction:column;justify-content:center;padding:0 var(--pad);
  transform:translateY(-100%);transition:transform .45s cubic-bezier(.65,0,.35,1);
}
.acf-mobile-menu[hidden]{display:none}
.acf-mobile-menu.open{transform:translateY(0)}
.acf-mobile-menu a{
  font-family:var(--display);font-size:clamp(40px,11vw,64px);line-height:1.15;
  text-transform:uppercase;letter-spacing:.02em;padding:6px 0;
}
.acf-mobile-menu a:hover,.acf-mobile-menu a:focus-visible{color:var(--yellow)}
.acf-mobile-menu .eyebrow{
  font-size:12px;letter-spacing:.32em;text-transform:uppercase;
  color:var(--white-dim);font-weight:500;margin-bottom:22px;
}
.acf-mobile-menu .eyebrow .tick{color:var(--yellow)}
.acf-mobile-menu .acf-mm-close{
  position:absolute;top:22px;right:var(--pad);
  width:44px;height:44px;display:grid;place-items:center;color:var(--white);
  transition:color .25s;
}
.acf-mobile-menu .acf-mm-close:hover,.acf-mobile-menu .acf-mm-close:focus-visible{color:var(--yellow)}


/* ============================================================================
   02 · HERO — CIRCLE-TO-ROUNDED-SQUARE VIDEO MASK
   ============================================================================ */

  .vid-mask-outer {
    /* THE HERO'S TWO SIZES. Both are heights, because height is the axis that
       actually runs out — the mask has to fit inside a 100vh hero, and there
       is always more width to spare. That is also why every shape width in the
       cycle below is min(<a multiple of --hero-h>, N vw): the --hero-h term
       governs on any normal screen, and the vw term only steps in on a phone,
       where the viewport is taller than it is wide.

       --hero-h    how tall the video mask stands, whichever of the six shapes
                   it is currently morphing through. Every shape width is a
                   multiple of it, so the whole cycle scales off this one number
                   and the circle stays a circle when it changes.

                   Not a flat percentage: `100vh - 190px` holds a roughly
                   constant band of black above and below the video instead, so
                   the mask claims the extra room a bigger display actually has
                   rather than leaving proportionally more of it empty. The
                   floor keeps short viewports (a laptop, a phone on its side)
                   at the 70vh this hero was drawn at; the ceiling stops the
                   shape before it reaches the fixed nav.

                   The `86vw` term is what keeps this growth off portrait
                   devices, and it is 86vw precisely because that is the circle's
                   own width cap two rules down. Every shape width is vw-capped
                   on a narrow screen — a phone's circle is 86vw across, not a
                   multiple of --hero-h — so letting the height grow past that
                   cap would not enlarge any shape, it would only stretch it
                   into an ellipse. Holding the height to the widest the circle
                   is ever allowed to be means the circle can always still be a
                   circle. On anything portrait this term falls under the floor,
                   and the mask stays exactly the size it has always been.

       --hero-type what the WORDMARK is proportioned against. Deliberately a
                   flat 70vh rather than --hero-h: the point of growing the mask
                   is that it grows relative to the type, so the type stays
                   pinned to the size the hero was drawn at while the video
                   pulls away from it. Still a height, so the two continue to
                   move together on the axis that matters. */
    --hero-h:    clamp(70vh, min(100vh - 190px, 86vw), 86vh);
    --hero-type: 70vh;

    /* THE WORDMARK'S SIZE, as one ramp both lines are cut from. Three terms,
       and whichever is smallest wins:

         14vw                     the original slope, and what governs up to a
                                  1500px-wide viewport — a phone, a tablet, a
                                  laptop all render exactly what they always did.

         180px + 2vw              the knee. 14vw is a fine slope on a laptop and
                                  far too fast on a big display, where it used to
                                  overtake the video entirely. Past 1500px the
                                  type keeps growing, just gently. The two terms
                                  are equal at 1500px (both 210px), so the
                                  handover is continuous — no visible step as a
                                  window crosses it.

                                  This replaces a flat `clamp(..., 220px)` cap,
                                  which did stop the type running away but by
                                  freezing it dead: past 1571px the wordmark
                                  never grew again no matter how large the
                                  display, while .word-bleed had no cap at all
                                  and sailed past it. 180px + 2vw lands within a
                                  few px of that 220px on the screens the cap
                                  covered, and keeps moving after it.

         --hero-type * 0.3556     the height guard, for viewports wider than
                                  16:9 — see the note on the font-size below. */
    --hero-word: min(14vw, 180px + 2vw, calc(var(--hero-type) * 0.3556));

    position: relative;
    width: 100%;
    min-height: 100vh;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    overflow-x: hidden; /* this alone is enough to prevent the horizontal scrollbar */
  }


  /* ---------------------------------------------------------------------------
     PULSING YELLOW GLOW behind the hero video
     ---------------------------------------------------------------------------
     .vid-mask-wrap is overflow:hidden (that is what masks the video into a
     circle), so a pseudo-element on it would be clipped away. Instead the glow
     is a sibling inside .vid-mask-stage, which shrink-wraps the video — so the
     glow inherits the circle-to-rounded-square morph for free, with no second
     copy of those keyframes to keep in sync.

     Structure:
       .vid-glow          positioning box + the overall 3s brightness pulse
       .vid-glow::before  a faint even base halo, so no part of the rim ever
                          goes fully dark and the effect never looks patchy
       .vid-glow-blob     three large soft blobs that ORBIT the rim, each on its
                          own period, giving the glow its wandering hot spots

     Why the halo wanders rather than sitting still: the three blobs orbit on
     19s / 27s / 23s (one of them reversed) and fade on 6.5s / 8.3s / 5.1s. None
     of those six periods divide into each other, so their combined bright spot
     drifts around the rim for minutes without visibly repeating — random to the
     eye, with no JavaScript and no randomness to compute.

     Stacking: the glow comes first in the DOM and the video is painted after it,
     so the video always sits on top. The glow is never over the video and can
     not dim or tint it.

     Layout: everything here is position:absolute, so it is out of flow and
     contributes nothing to the stage's size. Nothing around it can shift.

     Performance: only opacity and transform animate — both composited on the
     GPU, neither triggers layout or repaint. Each blurred layer is blurred
     individually and its shape never changes, so the browser rasterises each
     one once and then only transforms and fades those textures. (Putting a
     single blur on the container instead would force it to re-blur the whole
     moving subtree every frame.)
     --------------------------------------------------------------------------- */
  .vid-mask-stage {
    position: relative;
    display: flex;          /* shrink-wraps to the video */
    isolation: isolate;     /* keeps the glow's stacking local to the stage */
  }

  .vid-glow {
    position: absolute;
    /* Blur lives here, on the parent, so it is applied AFTER .vid-glow-shape
       clips — a hard-clipped shape blurred into a soft halo. Blurring each
       layer individually instead would leave the clip edge crisp. */
    filter: blur(24px);
    /* 34px of halo past the video on all sides at rest. A fixed px inset
       (not %) keeps the spread predictable as the video morphs size. */
    inset: -34px;
    z-index: 0;             /* behind .vid-mask-wrap, which is position:relative */
    pointer-events: none;

    /* Two loops of the same 3s period. The scale runs a quarter-cycle early
       (-0.8s) so peak brightness and peak size do not land on the same frame —
       that offset is what stops it reading as a mechanical on/off blink. */
    animation:
      vidGlowFade  3s ease-in-out infinite,
      vidGlowExpand 3s ease-in-out -0.8s infinite;
    will-change: opacity, transform;
  }

  /* Faint even base halo. Keeps a continuous rim of light under the drifting
     blobs so the edge never breaks up into disconnected blobs.
     `farthest-side` (not the default farthest-corner) makes the gradient reach
     the box's edges rather than its corners, so the corners stay clear and the
     halo reads round instead of square. */
  /* Clips the whole glow to the mask's current shape, so the halo hugs the
     triangle / hexagon / circle instead of staying a fixed blob. Without this
     the glow's bright middle shows through wherever the shape does not cover
     the box — a yellow slab with a triangle punched out of it. */
  .vid-glow-shape {
    position: absolute;
    inset: 0;
    /* Mirrors the mask's own intro then cycle on the same clock, so the halo
       hugs the shape from the first frame instead of snapping into alignment
       at 2.4s. */
    animation: vidGlowIntro 1.4s ease-in-out 1s both,
               vidGlowShapeCycle 31.2s ease-in-out 2.4s infinite;
  }

  .vid-glow-shape::before {
    content: "";
    position: absolute;
    inset: 0;
    background: radial-gradient(ellipse farthest-side at center,
                  rgba(255, 212, 0, 0.55)  0%,
                  rgba(255, 212, 0, 0.42) 50%,
                  rgba(255, 212, 0, 0.30) 78%,
                  rgba(255, 212, 0, 0.15) 90%,
                  rgba(255, 212, 0, 0)   100%);
  }

  /* The wandering hot spots. Each is centred, then pushed off-centre and spun
     about the box's middle, which walks it around the rim. */
  .vid-glow-blob {
    position: absolute;
    top: 50%;
    left: 50%;
    border-radius: 50%;
    background: radial-gradient(circle farthest-side,
                  rgba(255, 212, 0, 0.95)  0%,
                  rgba(255, 212, 0, 0.50) 45%,
                  rgba(255, 212, 0, 0)    75%);
    will-change: transform, opacity;
  }

  .vid-glow-blob.b1 {
    width: 74%; height: 74%;
    animation: blobOrbit1 19s linear infinite,
               blobFade1 6.5s ease-in-out infinite;
  }
  .vid-glow-blob.b2 {
    width: 62%; height: 62%;
    animation: blobOrbit2 27s linear infinite,
               blobFade2 8.3s ease-in-out -2.1s infinite;
  }
  .vid-glow-blob.b3 {
    width: 86%; height: 86%;
    animation: blobOrbit3 23s linear infinite,
               blobFade3 5.1s ease-in-out -3.4s infinite;
  }

  /* translate() after rotate() moves along the rotated axis, so the blob traces
     a circle. Different radii and one reversed direction keep them from ever
     lining up. */
  @keyframes blobOrbit1 {
    from { transform: translate(-50%, -50%) rotate(0deg)    translate(20%); }
    to   { transform: translate(-50%, -50%) rotate(360deg)  translate(20%); }
  }
  @keyframes blobOrbit2 {
    from { transform: translate(-50%, -50%) rotate(140deg)  translate(30%); }
    to   { transform: translate(-50%, -50%) rotate(-220deg) translate(30%); }
  }
  @keyframes blobOrbit3 {
    from { transform: translate(-50%, -50%) rotate(260deg)  translate(14%); }
    to   { transform: translate(-50%, -50%) rotate(620deg)  translate(14%); }
  }

  @keyframes blobFade1 { 0%,100% { opacity: 0.30; } 50% { opacity: 0.95; } }
  @keyframes blobFade2 { 0%,100% { opacity: 0.85; } 50% { opacity: 0.25; } }
  @keyframes blobFade3 { 0%,100% { opacity: 0.45; } 50% { opacity: 0.90; } }

  /* brightness: ~40% -> 100% -> ~40% */
  @keyframes vidGlowFade {
    0%, 100% { opacity: 0.4; }
    50%      { opacity: 1; }
  }

  /* radius: 34px of spread at rest -> ~59px at the peak, measured against the
     video's final morphed size (70vw). Because scale is proportional, the px
     spread is smaller during the brief opening circle — which reads correctly,
     since a small circle wants a smaller halo. Kept subtle: the halo breathes
     rather than throbs. */
  @keyframes vidGlowExpand {
    0%, 100% { transform: scale(1); }
    50%      { transform: scale(1.053); }
  }

  /* Reduced motion: hold the halo at a static mid-intensity, and park the blobs
     at fixed points around the rim — still an uneven, organic-looking glow,
     just not a moving one. */
  @media (prefers-reduced-motion: reduce) {
    .vid-glow-shape { animation: none; }

    .vid-glow {
      animation: none;
      opacity: 0.7;
      transform: scale(1.027);
    }
    /* NOTE: these need the doubled class to match the specificity of the
       .vid-glow-blob.bN rules above — a plain .vid-glow-blob selector loses to
       them and the blobs keep animating. */
    .vid-glow-blob.b1,
    .vid-glow-blob.b2,
    .vid-glow-blob.b3 { animation: none; opacity: 0.6; }
    .vid-glow-blob.b1 { transform: translate(-50%, -50%) rotate(20deg)  translate(20%); }
    .vid-glow-blob.b2 { transform: translate(-50%, -50%) rotate(160deg) translate(30%); }
    .vid-glow-blob.b3 { transform: translate(-50%, -50%) rotate(280deg) translate(14%); }
  }

  .vid-mask-wrap {
    position: relative;
    width: 320px;
    height: 320px;
    overflow: hidden;
    /* No border-radius: clip-path defines the shape for the whole life of the
       element now, including the opening circle. Mixing the two is what made
       the intro jump — border-radius:32px handing over to a polygon whose
       corners were a different size. The intro's last frame and the cycle's
       first frame are now the SAME polygon, so there is nothing to jump to. */
    border-radius: 0;
    /* `both` fill so the 0% frame (the circle) already applies during the 1s
       delay, before the intro starts moving. */
    animation: morphShape 1.4s ease-in-out 1s both,
               vidShapeCycle 31.2s ease-in-out 2.4s infinite;
    background: #000;
  }

  .vid-mask-wrap video,
  .vid-mask-wrap .vid-fallback-img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
  }

  .vid-mask-wrap .vid-fallback-img {
    position: absolute;
    top: 0;
    left: 0;
    display: none;
  }

  @keyframes morphShape {
    0% { clip-path: polygon(100.00% 50.00%, 99.93% 52.62%, 99.73% 55.23%, 99.38% 57.82%, 98.91% 60.40%, 98.30% 62.94%, 97.55% 65.45%, 96.68% 67.92%, 95.68% 70.34%, 94.55% 72.70%, 93.30% 75.00%, 91.93% 77.23%, 90.45% 79.39%, 88.86% 81.47%, 87.16% 83.46%, 85.36% 85.36%, 83.46% 87.16%, 81.47% 88.86%, 79.39% 90.45%, 77.23% 91.93%, 75.00% 93.30%, 72.70% 94.55%, 70.34% 95.68%, 67.92% 96.68%, 65.45% 97.55%, 62.94% 98.30%, 60.40% 98.91%, 57.82% 99.38%, 55.23% 99.73%, 52.62% 99.93%, 50.00% 100.00%, 47.38% 99.93%, 44.77% 99.73%, 42.18% 99.38%, 39.60% 98.91%, 37.06% 98.30%, 34.55% 97.55%, 32.08% 96.68%, 29.66% 95.68%, 27.30% 94.55%, 25.00% 93.30%, 22.77% 91.93%, 20.61% 90.45%, 18.53% 88.86%, 16.54% 87.16%, 14.64% 85.36%, 12.84% 83.46%, 11.14% 81.47%, 9.55% 79.39%, 8.07% 77.23%, 6.70% 75.00%, 5.45% 72.70%, 4.32% 70.34%, 3.32% 67.92%, 2.45% 65.45%, 1.70% 62.94%, 1.09% 60.40%, 0.62% 57.82%, 0.27% 55.23%, 0.07% 52.62%, 0.00% 50.00%, 0.07% 47.38%, 0.27% 44.77%, 0.62% 42.18%, 1.09% 39.60%, 1.70% 37.06%, 2.45% 34.55%, 3.32% 32.08%, 4.32% 29.66%, 5.45% 27.30%, 6.70% 25.00%, 8.07% 22.77%, 9.55% 20.61%, 11.14% 18.53%, 12.84% 16.54%, 14.64% 14.64%, 16.54% 12.84%, 18.53% 11.14%, 20.61% 9.55%, 22.77% 8.07%, 25.00% 6.70%, 27.30% 5.45%, 29.66% 4.32%, 32.08% 3.32%, 34.55% 2.45%, 37.06% 1.70%, 39.60% 1.09%, 42.18% 0.62%, 44.77% 0.27%, 47.38% 0.07%, 50.00% 0.00%, 52.62% 0.07%, 55.23% 0.27%, 57.82% 0.62%, 60.40% 1.09%, 62.94% 1.70%, 65.45% 2.45%, 67.92% 3.32%, 70.34% 4.32%, 72.70% 5.45%, 75.00% 6.70%, 77.23% 8.07%, 79.39% 9.55%, 81.47% 11.14%, 83.46% 12.84%, 85.36% 14.64%, 87.16% 16.54%, 88.86% 18.53%, 90.45% 20.61%, 91.93% 22.77%, 93.30% 25.00%, 94.55% 27.30%, 95.68% 29.66%, 96.68% 32.08%, 97.55% 34.55%, 98.30% 37.06%, 98.91% 39.60%, 99.38% 42.18%, 99.73% 44.77%, 99.93% 47.38%); }
    100% {
      width: min(70vw, calc(var(--hero-h) * 2.2857));
      height: var(--hero-h);
      clip-path: polygon(100.00% 50.00%, 100.00% 54.55%, 100.00% 59.10%, 100.00% 63.65%, 100.00% 68.20%, 100.00% 72.75%, 100.00% 77.30%, 100.00% 81.85%, 100.00% 86.40%, 100.00% 90.95%, 100.00% 95.50%, 99.94% 96.20%, 99.78% 96.89%, 99.51% 97.54%, 99.14% 98.15%, 98.68% 98.68%, 98.15% 99.14%, 97.54% 99.51%, 96.89% 99.78%, 96.20% 99.94%, 95.50% 100.00%, 90.95% 100.00%, 86.40% 100.00%, 81.85% 100.00%, 77.30% 100.00%, 72.75% 100.00%, 68.20% 100.00%, 63.65% 100.00%, 59.10% 100.00%, 54.55% 100.00%, 50.00% 100.00%, 45.45% 100.00%, 40.90% 100.00%, 36.35% 100.00%, 31.80% 100.00%, 27.25% 100.00%, 22.70% 100.00%, 18.15% 100.00%, 13.60% 100.00%, 9.05% 100.00%, 4.50% 100.00%, 3.80% 99.94%, 3.11% 99.78%, 2.46% 99.51%, 1.85% 99.14%, 1.32% 98.68%, 0.86% 98.15%, 0.49% 97.54%, 0.22% 96.89%, 0.06% 96.20%, 0.00% 95.50%, 0.00% 90.95%, 0.00% 86.40%, 0.00% 81.85%, 0.00% 77.30%, 0.00% 72.75%, 0.00% 68.20%, 0.00% 63.65%, 0.00% 59.10%, 0.00% 54.55%, 0.00% 50.00%, 0.00% 45.45%, 0.00% 40.90%, 0.00% 36.35%, 0.00% 31.80%, 0.00% 27.25%, 0.00% 22.70%, 0.00% 18.15%, 0.00% 13.60%, 0.00% 9.05%, 0.00% 4.50%, 0.06% 3.80%, 0.22% 3.11%, 0.49% 2.46%, 0.86% 1.85%, 1.32% 1.32%, 1.85% 0.86%, 2.46% 0.49%, 3.11% 0.22%, 3.80% 0.06%, 4.50% 0.00%, 9.05% 0.00%, 13.60% 0.00%, 18.15% 0.00%, 22.70% 0.00%, 27.25% 0.00%, 31.80% 0.00%, 36.35% 0.00%, 40.90% 0.00%, 45.45% 0.00%, 50.00% 0.00%, 54.55% 0.00%, 59.10% 0.00%, 63.65% 0.00%, 68.20% 0.00%, 72.75% 0.00%, 77.30% 0.00%, 81.85% 0.00%, 86.40% 0.00%, 90.95% 0.00%, 95.50% 0.00%, 96.20% 0.06%, 96.89% 0.22%, 97.54% 0.49%, 98.15% 0.86%, 98.68% 1.32%, 99.14% 1.85%, 99.51% 2.46%, 99.78% 3.11%, 99.94% 3.80%, 100.00% 4.50%, 100.00% 9.05%, 100.00% 13.60%, 100.00% 18.15%, 100.00% 22.70%, 100.00% 27.25%, 100.00% 31.80%, 100.00% 36.35%, 100.00% 40.90%, 100.00% 45.45%);
    }
  }

  @keyframes vidGlowIntro {
    0%   { clip-path: polygon(100.00% 50.00%, 99.93% 52.62%, 99.73% 55.23%, 99.38% 57.82%, 98.91% 60.40%, 98.30% 62.94%, 97.55% 65.45%, 96.68% 67.92%, 95.68% 70.34%, 94.55% 72.70%, 93.30% 75.00%, 91.93% 77.23%, 90.45% 79.39%, 88.86% 81.47%, 87.16% 83.46%, 85.36% 85.36%, 83.46% 87.16%, 81.47% 88.86%, 79.39% 90.45%, 77.23% 91.93%, 75.00% 93.30%, 72.70% 94.55%, 70.34% 95.68%, 67.92% 96.68%, 65.45% 97.55%, 62.94% 98.30%, 60.40% 98.91%, 57.82% 99.38%, 55.23% 99.73%, 52.62% 99.93%, 50.00% 100.00%, 47.38% 99.93%, 44.77% 99.73%, 42.18% 99.38%, 39.60% 98.91%, 37.06% 98.30%, 34.55% 97.55%, 32.08% 96.68%, 29.66% 95.68%, 27.30% 94.55%, 25.00% 93.30%, 22.77% 91.93%, 20.61% 90.45%, 18.53% 88.86%, 16.54% 87.16%, 14.64% 85.36%, 12.84% 83.46%, 11.14% 81.47%, 9.55% 79.39%, 8.07% 77.23%, 6.70% 75.00%, 5.45% 72.70%, 4.32% 70.34%, 3.32% 67.92%, 2.45% 65.45%, 1.70% 62.94%, 1.09% 60.40%, 0.62% 57.82%, 0.27% 55.23%, 0.07% 52.62%, 0.00% 50.00%, 0.07% 47.38%, 0.27% 44.77%, 0.62% 42.18%, 1.09% 39.60%, 1.70% 37.06%, 2.45% 34.55%, 3.32% 32.08%, 4.32% 29.66%, 5.45% 27.30%, 6.70% 25.00%, 8.07% 22.77%, 9.55% 20.61%, 11.14% 18.53%, 12.84% 16.54%, 14.64% 14.64%, 16.54% 12.84%, 18.53% 11.14%, 20.61% 9.55%, 22.77% 8.07%, 25.00% 6.70%, 27.30% 5.45%, 29.66% 4.32%, 32.08% 3.32%, 34.55% 2.45%, 37.06% 1.70%, 39.60% 1.09%, 42.18% 0.62%, 44.77% 0.27%, 47.38% 0.07%, 50.00% 0.00%, 52.62% 0.07%, 55.23% 0.27%, 57.82% 0.62%, 60.40% 1.09%, 62.94% 1.70%, 65.45% 2.45%, 67.92% 3.32%, 70.34% 4.32%, 72.70% 5.45%, 75.00% 6.70%, 77.23% 8.07%, 79.39% 9.55%, 81.47% 11.14%, 83.46% 12.84%, 85.36% 14.64%, 87.16% 16.54%, 88.86% 18.53%, 90.45% 20.61%, 91.93% 22.77%, 93.30% 25.00%, 94.55% 27.30%, 95.68% 29.66%, 96.68% 32.08%, 97.55% 34.55%, 98.30% 37.06%, 98.91% 39.60%, 99.38% 42.18%, 99.73% 44.77%, 99.93% 47.38%); }
    100% { clip-path: polygon(100.00% 50.00%, 100.00% 54.55%, 100.00% 59.10%, 100.00% 63.65%, 100.00% 68.20%, 100.00% 72.75%, 100.00% 77.30%, 100.00% 81.85%, 100.00% 86.40%, 100.00% 90.95%, 100.00% 95.50%, 99.94% 96.20%, 99.78% 96.89%, 99.51% 97.54%, 99.14% 98.15%, 98.68% 98.68%, 98.15% 99.14%, 97.54% 99.51%, 96.89% 99.78%, 96.20% 99.94%, 95.50% 100.00%, 90.95% 100.00%, 86.40% 100.00%, 81.85% 100.00%, 77.30% 100.00%, 72.75% 100.00%, 68.20% 100.00%, 63.65% 100.00%, 59.10% 100.00%, 54.55% 100.00%, 50.00% 100.00%, 45.45% 100.00%, 40.90% 100.00%, 36.35% 100.00%, 31.80% 100.00%, 27.25% 100.00%, 22.70% 100.00%, 18.15% 100.00%, 13.60% 100.00%, 9.05% 100.00%, 4.50% 100.00%, 3.80% 99.94%, 3.11% 99.78%, 2.46% 99.51%, 1.85% 99.14%, 1.32% 98.68%, 0.86% 98.15%, 0.49% 97.54%, 0.22% 96.89%, 0.06% 96.20%, 0.00% 95.50%, 0.00% 90.95%, 0.00% 86.40%, 0.00% 81.85%, 0.00% 77.30%, 0.00% 72.75%, 0.00% 68.20%, 0.00% 63.65%, 0.00% 59.10%, 0.00% 54.55%, 0.00% 50.00%, 0.00% 45.45%, 0.00% 40.90%, 0.00% 36.35%, 0.00% 31.80%, 0.00% 27.25%, 0.00% 22.70%, 0.00% 18.15%, 0.00% 13.60%, 0.00% 9.05%, 0.00% 4.50%, 0.06% 3.80%, 0.22% 3.11%, 0.49% 2.46%, 0.86% 1.85%, 1.32% 1.32%, 1.85% 0.86%, 2.46% 0.49%, 3.11% 0.22%, 3.80% 0.06%, 4.50% 0.00%, 9.05% 0.00%, 13.60% 0.00%, 18.15% 0.00%, 22.70% 0.00%, 27.25% 0.00%, 31.80% 0.00%, 36.35% 0.00%, 40.90% 0.00%, 45.45% 0.00%, 50.00% 0.00%, 54.55% 0.00%, 59.10% 0.00%, 63.65% 0.00%, 68.20% 0.00%, 72.75% 0.00%, 77.30% 0.00%, 81.85% 0.00%, 86.40% 0.00%, 90.95% 0.00%, 95.50% 0.00%, 96.20% 0.06%, 96.89% 0.22%, 97.54% 0.49%, 98.15% 0.86%, 98.68% 1.32%, 99.14% 1.85%, 99.51% 2.46%, 99.78% 3.11%, 99.94% 3.80%, 100.00% 4.50%, 100.00% 9.05%, 100.00% 13.60%, 100.00% 18.15%, 100.00% 22.70%, 100.00% 27.25%, 100.00% 31.80%, 100.00% 36.35%, 100.00% 40.90%, 100.00% 45.45%); }
  }

  /* ---------------------------------------------------------------------------
     SHAPE CYCLE — the mask keeps morphing after the intro
     ---------------------------------------------------------------------------
     Six shapes, each held 2s then morphed over 1.2s, looping forever.

     Every shape is a 120-point polygon(), and every shape has EXACTLY the same
     point count — that is what lets the browser interpolate one into the next.
     Every shape is also traversed in the same direction starting from its
     rightmost point, so point 1 of the triangle corresponds to point 1 of the
     circle and the morph is a clean blend rather than a scramble.

     Rounded corners: each polygon was generated by replacing every sharp corner
     with a circular arc before sampling, so the triangle, hexagon and diamond
     all have soft corners rather than points.

     The points are allocated unevenly, but every part of the outline gets some.
     Sampling purely by arc length starves the corners — the rectangle's are a
     small fraction of its outline, so they ended up with a couple of points
     each and a 90-degree turn rendered as a visible bevel. Spending every point
     on the corners instead fixes that and breaks something else: it leaves each
     straight edge as one long chord, which is exact while the shape holds but
     blends against the oval's short ones into a flat bar cutting across the
     curve mid-morph. So each corner arc gets a fixed 10 points however small its
     radius, and the remaining points go to the straight edges by length. Every
     shape's corners sit within 0.35px of a true curve and no chord is more than
     about twice the oval's, which is what keeps the morphs clean.
     See _tools/shapes-generator.py for the generator.

     Why `width` animates too: clip-path percentages resolve against the box's
     width and height SEPARATELY, so a "circle" drawn in a 896x569 box comes out
     an ellipse — indistinguishable from the oval. Giving each shape its own box
     width lets the circle be a real circle and the oval a real oval. Height is
     deliberately left at --hero-h throughout, so nothing below the video shifts
     as the shapes change, and each width is a fixed multiple of it so one edit
     to --hero-h rescales all six shapes without distorting any of them.

     border-radius is intentionally NOT used at all — the polygons carry every
     corner themselves, which is what keeps the 2.4s handover free of a pop.
     Corner rounding is deliberately shallow: the rectangle's radius is 4.5% of
     the box, which lands on roughly the 32px of the original design, and the
     other shapes are scaled from the same figure.

     Cost note: clip-path is a paint-level property, not a composited one, so
     each morph repaints this element. That is a 1.2s burst once every 5.2s on a
     single element — cheap enough, and the 4s holds are completely static.
     --------------------------------------------------------------------------- */
  /* 6 shapes x (4s hold + 1.2s morph) = 31.2s loop.
     The percentages are the clock: each shape's pair is <start>, <start +
     4s>, and the 1.2s morph is the gap from there to the next shape's
     start. 4/31.2 = 12.8205% of hold, 1.2/31.2 = 3.8462% of morph, and the
     two add up to the 16.6667% each of the six shapes owns. Retiming the
     hold means recomputing all three numbers, not just the duration. */
  @keyframes vidShapeCycle {
    /* rectangle */
    0.0000%, 12.8205% {
      width: min(70vw, calc(var(--hero-h) * 2.2857));
      clip-path: polygon(100.00% 50.00%, 100.00% 54.55%, 100.00% 59.10%, 100.00% 63.65%, 100.00% 68.20%, 100.00% 72.75%, 100.00% 77.30%, 100.00% 81.85%, 100.00% 86.40%, 100.00% 90.95%, 100.00% 95.50%, 99.94% 96.20%, 99.78% 96.89%, 99.51% 97.54%, 99.14% 98.15%, 98.68% 98.68%, 98.15% 99.14%, 97.54% 99.51%, 96.89% 99.78%, 96.20% 99.94%, 95.50% 100.00%, 90.95% 100.00%, 86.40% 100.00%, 81.85% 100.00%, 77.30% 100.00%, 72.75% 100.00%, 68.20% 100.00%, 63.65% 100.00%, 59.10% 100.00%, 54.55% 100.00%, 50.00% 100.00%, 45.45% 100.00%, 40.90% 100.00%, 36.35% 100.00%, 31.80% 100.00%, 27.25% 100.00%, 22.70% 100.00%, 18.15% 100.00%, 13.60% 100.00%, 9.05% 100.00%, 4.50% 100.00%, 3.80% 99.94%, 3.11% 99.78%, 2.46% 99.51%, 1.85% 99.14%, 1.32% 98.68%, 0.86% 98.15%, 0.49% 97.54%, 0.22% 96.89%, 0.06% 96.20%, 0.00% 95.50%, 0.00% 90.95%, 0.00% 86.40%, 0.00% 81.85%, 0.00% 77.30%, 0.00% 72.75%, 0.00% 68.20%, 0.00% 63.65%, 0.00% 59.10%, 0.00% 54.55%, 0.00% 50.00%, 0.00% 45.45%, 0.00% 40.90%, 0.00% 36.35%, 0.00% 31.80%, 0.00% 27.25%, 0.00% 22.70%, 0.00% 18.15%, 0.00% 13.60%, 0.00% 9.05%, 0.00% 4.50%, 0.06% 3.80%, 0.22% 3.11%, 0.49% 2.46%, 0.86% 1.85%, 1.32% 1.32%, 1.85% 0.86%, 2.46% 0.49%, 3.11% 0.22%, 3.80% 0.06%, 4.50% 0.00%, 9.05% 0.00%, 13.60% 0.00%, 18.15% 0.00%, 22.70% 0.00%, 27.25% 0.00%, 31.80% 0.00%, 36.35% 0.00%, 40.90% 0.00%, 45.45% 0.00%, 50.00% 0.00%, 54.55% 0.00%, 59.10% 0.00%, 63.65% 0.00%, 68.20% 0.00%, 72.75% 0.00%, 77.30% 0.00%, 81.85% 0.00%, 86.40% 0.00%, 90.95% 0.00%, 95.50% 0.00%, 96.20% 0.06%, 96.89% 0.22%, 97.54% 0.49%, 98.15% 0.86%, 98.68% 1.32%, 99.14% 1.85%, 99.51% 2.46%, 99.78% 3.11%, 99.94% 3.80%, 100.00% 4.50%, 100.00% 9.05%, 100.00% 13.60%, 100.00% 18.15%, 100.00% 22.70%, 100.00% 27.25%, 100.00% 31.80%, 100.00% 36.35%, 100.00% 40.90%, 100.00% 45.45%);
    }
    /* oval */
    16.6667%, 29.4872% {
      width: min(70vw, calc(var(--hero-h) * 2.2857));
      clip-path: polygon(100.00% 50.00%, 99.93% 52.56%, 99.71% 55.12%, 99.36% 57.66%, 98.86% 60.18%, 98.23% 62.66%, 97.46% 65.11%, 96.55% 67.51%, 95.52% 69.86%, 94.36% 72.15%, 93.08% 74.37%, 91.68% 76.52%, 90.16% 78.59%, 88.54% 80.58%, 86.82% 82.48%, 84.99% 84.29%, 83.08% 85.99%, 81.08% 87.60%, 79.00% 89.10%, 76.84% 90.50%, 74.62% 91.78%, 72.34% 92.94%, 70.00% 93.99%, 67.61% 94.93%, 65.17% 95.74%, 62.70% 96.43%, 60.20% 96.99%, 57.67% 97.43%, 55.12% 97.75%, 52.56% 97.94%, 50.00% 98.00%, 47.44% 97.94%, 44.88% 97.75%, 42.33% 97.43%, 39.80% 96.99%, 37.30% 96.43%, 34.83% 95.74%, 32.39% 94.93%, 30.00% 93.99%, 27.66% 92.94%, 25.38% 91.78%, 23.16% 90.50%, 21.00% 89.10%, 18.92% 87.60%, 16.92% 85.99%, 15.01% 84.29%, 13.18% 82.48%, 11.46% 80.58%, 9.84% 78.59%, 8.32% 76.52%, 6.92% 74.37%, 5.64% 72.15%, 4.48% 69.86%, 3.45% 67.51%, 2.54% 65.11%, 1.77% 62.66%, 1.14% 60.18%, 0.64% 57.66%, 0.29% 55.12%, 0.07% 52.56%, 0.00% 50.00%, 0.07% 47.44%, 0.29% 44.88%, 0.64% 42.34%, 1.14% 39.82%, 1.77% 37.34%, 2.54% 34.89%, 3.45% 32.49%, 4.48% 30.14%, 5.64% 27.85%, 6.92% 25.63%, 8.32% 23.48%, 9.84% 21.41%, 11.46% 19.42%, 13.18% 17.52%, 15.01% 15.71%, 16.92% 14.01%, 18.92% 12.40%, 21.00% 10.90%, 23.16% 9.50%, 25.38% 8.22%, 27.66% 7.06%, 30.00% 6.01%, 32.39% 5.07%, 34.83% 4.26%, 37.30% 3.57%, 39.80% 3.01%, 42.33% 2.57%, 44.88% 2.25%, 47.44% 2.06%, 50.00% 2.00%, 52.56% 2.06%, 55.12% 2.25%, 57.67% 2.57%, 60.20% 3.01%, 62.70% 3.57%, 65.17% 4.26%, 67.61% 5.07%, 70.00% 6.01%, 72.34% 7.06%, 74.62% 8.22%, 76.84% 9.50%, 79.00% 10.90%, 81.08% 12.40%, 83.08% 14.01%, 84.99% 15.71%, 86.82% 17.52%, 88.54% 19.42%, 90.16% 21.41%, 91.68% 23.48%, 93.08% 25.63%, 94.36% 27.85%, 95.52% 30.14%, 96.55% 32.49%, 97.46% 34.89%, 98.23% 37.34%, 98.86% 39.82%, 99.36% 42.34%, 99.71% 44.88%, 99.93% 47.44%);
    }
    /* circle */
    33.3333%, 46.1538% {
      width: min(var(--hero-h), 86vw);
      clip-path: polygon(99.50% 50.00%, 99.43% 52.59%, 99.23% 55.17%, 98.89% 57.74%, 98.42% 60.29%, 97.81% 62.81%, 97.08% 65.30%, 96.21% 67.74%, 95.22% 70.13%, 94.10% 72.47%, 92.87% 74.75%, 91.51% 76.96%, 90.05% 79.10%, 88.47% 81.15%, 86.79% 83.12%, 85.00% 85.00%, 83.12% 86.79%, 81.15% 88.47%, 79.10% 90.05%, 76.96% 91.51%, 74.75% 92.87%, 72.47% 94.10%, 70.13% 95.22%, 67.74% 96.21%, 65.30% 97.08%, 62.81% 97.81%, 60.29% 98.42%, 57.74% 98.89%, 55.17% 99.23%, 52.59% 99.43%, 50.00% 99.50%, 47.41% 99.43%, 44.83% 99.23%, 42.26% 98.89%, 39.71% 98.42%, 37.19% 97.81%, 34.70% 97.08%, 32.26% 96.21%, 29.87% 95.22%, 27.53% 94.10%, 25.25% 92.87%, 23.04% 91.51%, 20.90% 90.05%, 18.85% 88.47%, 16.88% 86.79%, 15.00% 85.00%, 13.21% 83.12%, 11.53% 81.15%, 9.95% 79.10%, 8.49% 76.96%, 7.13% 74.75%, 5.90% 72.47%, 4.78% 70.13%, 3.79% 67.74%, 2.92% 65.30%, 2.19% 62.81%, 1.58% 60.29%, 1.11% 57.74%, 0.77% 55.17%, 0.57% 52.59%, 0.50% 50.00%, 0.57% 47.41%, 0.77% 44.83%, 1.11% 42.26%, 1.58% 39.71%, 2.19% 37.19%, 2.92% 34.70%, 3.79% 32.26%, 4.78% 29.87%, 5.90% 27.53%, 7.13% 25.25%, 8.49% 23.04%, 9.95% 20.90%, 11.53% 18.85%, 13.21% 16.88%, 15.00% 15.00%, 16.88% 13.21%, 18.85% 11.53%, 20.90% 9.95%, 23.04% 8.49%, 25.25% 7.13%, 27.53% 5.90%, 29.87% 4.78%, 32.26% 3.79%, 34.70% 2.92%, 37.19% 2.19%, 39.71% 1.58%, 42.26% 1.11%, 44.83% 0.77%, 47.41% 0.57%, 50.00% 0.50%, 52.59% 0.57%, 55.17% 0.77%, 57.74% 1.11%, 60.29% 1.58%, 62.81% 2.19%, 65.30% 2.92%, 67.74% 3.79%, 70.13% 4.78%, 72.47% 5.90%, 74.75% 7.13%, 76.96% 8.49%, 79.10% 9.95%, 81.15% 11.53%, 83.12% 13.21%, 85.00% 15.00%, 86.79% 16.88%, 88.47% 18.85%, 90.05% 20.90%, 91.51% 23.04%, 92.87% 25.25%, 94.10% 27.53%, 95.22% 29.87%, 96.21% 32.26%, 97.08% 34.70%, 97.81% 37.19%, 98.42% 39.71%, 98.89% 42.26%, 99.23% 44.83%, 99.43% 47.41%);
    }
    /* triangle */
    50.0000%, 62.8205% {
      width: min(calc(var(--hero-h) * 1.1714), 92vw);
      clip-path: polygon(76.95% 50.74%, 78.30% 53.18%, 79.64% 55.61%, 80.99% 58.05%, 82.34% 60.48%, 83.68% 62.92%, 85.03% 65.35%, 86.38% 67.79%, 87.72% 70.22%, 89.07% 72.66%, 90.42% 75.09%, 91.76% 77.53%, 93.11% 79.96%, 94.46% 82.40%, 94.71% 82.99%, 94.83% 83.62%, 94.82% 84.26%, 94.68% 84.89%, 94.41% 85.47%, 94.03% 85.99%, 93.55% 86.42%, 92.99% 86.74%, 92.38% 86.93%, 91.74% 87.00%, 88.86% 87.00%, 85.99% 87.00%, 83.11% 87.00%, 80.23% 87.00%, 77.35% 87.00%, 74.47% 87.00%, 71.59% 87.00%, 68.71% 87.00%, 65.83% 87.00%, 62.95% 87.00%, 60.08% 87.00%, 57.20% 87.00%, 54.32% 87.00%, 51.44% 87.00%, 48.56% 87.00%, 45.68% 87.00%, 42.80% 87.00%, 39.92% 87.00%, 37.05% 87.00%, 34.17% 87.00%, 31.29% 87.00%, 28.41% 87.00%, 25.53% 87.00%, 22.65% 87.00%, 19.77% 87.00%, 16.89% 87.00%, 14.01% 87.00%, 11.14% 87.00%, 8.26% 87.00%, 7.62% 86.93%, 7.01% 86.74%, 6.45% 86.42%, 5.97% 85.99%, 5.59% 85.47%, 5.32% 84.89%, 5.18% 84.26%, 5.17% 83.62%, 5.29% 82.99%, 5.54% 82.40%, 6.94% 79.88%, 8.33% 77.37%, 9.72% 74.85%, 11.11% 72.33%, 12.50% 69.82%, 13.89% 67.30%, 15.28% 64.78%, 16.68% 62.27%, 18.07% 59.75%, 19.46% 57.24%, 20.85% 54.72%, 22.24% 52.20%, 23.63% 49.69%, 25.02% 47.17%, 26.42% 44.65%, 27.81% 42.14%, 29.20% 39.62%, 30.59% 37.10%, 31.98% 34.59%, 33.37% 32.07%, 34.76% 29.55%, 36.16% 27.04%, 37.55% 24.52%, 38.94% 22.01%, 40.33% 19.49%, 41.72% 16.97%, 43.11% 14.46%, 44.50% 11.94%, 45.90% 9.42%, 47.29% 6.91%, 47.67% 6.37%, 48.15% 5.92%, 48.72% 5.58%, 49.34% 5.38%, 50.00% 5.31%, 50.66% 5.38%, 51.28% 5.58%, 51.85% 5.92%, 52.33% 6.37%, 52.71% 6.91%, 54.06% 9.34%, 55.41% 11.78%, 56.75% 14.21%, 58.10% 16.65%, 59.45% 19.08%, 60.79% 21.52%, 62.14% 23.95%, 63.49% 26.39%, 64.83% 28.82%, 66.18% 31.26%, 67.53% 33.69%, 68.87% 36.13%, 70.22% 38.56%, 71.56% 41.00%, 72.91% 43.44%, 74.26% 45.87%, 75.60% 48.31%);
    }
    /* hexagon */
    66.6667%, 79.4872% {
      width: min(calc(var(--hero-h) * 1.1429), 90vw);
      clip-path: polygon(98.46% 50.00%, 98.44% 50.37%, 98.38% 50.73%, 98.29% 51.08%, 98.16% 51.42%, 97.99% 51.75%, 95.74% 55.64%, 93.49% 59.54%, 91.25% 63.43%, 89.00% 67.32%, 86.75% 71.22%, 84.50% 75.11%, 82.25% 79.00%, 80.01% 82.90%, 77.76% 86.79%, 75.51% 90.69%, 75.31% 90.99%, 75.08% 91.28%, 74.82% 91.54%, 74.54% 91.77%, 74.23% 91.97%, 73.90% 92.13%, 73.56% 92.26%, 73.21% 92.36%, 72.85% 92.42%, 72.48% 92.44%, 67.98% 92.44%, 63.49% 92.44%, 58.99% 92.44%, 54.50% 92.44%, 50.00% 92.44%, 45.50% 92.44%, 41.01% 92.44%, 36.51% 92.44%, 32.02% 92.44%, 27.52% 92.44%, 27.15% 92.42%, 26.79% 92.36%, 26.44% 92.26%, 26.10% 92.13%, 25.77% 91.97%, 25.46% 91.77%, 25.18% 91.54%, 24.92% 91.28%, 24.69% 90.99%, 24.49% 90.69%, 22.24% 86.79%, 19.99% 82.90%, 17.75% 79.00%, 15.50% 75.11%, 13.25% 71.22%, 11.00% 67.32%, 8.75% 63.43%, 6.51% 59.54%, 4.26% 55.64%, 2.01% 51.75%, 1.84% 51.42%, 1.71% 51.08%, 1.62% 50.73%, 1.56% 50.37%, 1.54% 50.00%, 1.56% 49.63%, 1.62% 49.27%, 1.71% 48.92%, 1.84% 48.58%, 2.01% 48.25%, 4.26% 44.36%, 6.51% 40.46%, 8.75% 36.57%, 11.00% 32.68%, 13.25% 28.78%, 15.50% 24.89%, 17.75% 21.00%, 19.99% 17.10%, 22.24% 13.21%, 24.49% 9.31%, 24.69% 9.01%, 24.92% 8.72%, 25.18% 8.46%, 25.46% 8.23%, 25.77% 8.03%, 26.10% 7.87%, 26.44% 7.74%, 26.79% 7.64%, 27.15% 7.58%, 27.52% 7.56%, 32.02% 7.56%, 36.51% 7.56%, 41.01% 7.56%, 45.50% 7.56%, 50.00% 7.56%, 54.50% 7.56%, 58.99% 7.56%, 63.49% 7.56%, 67.98% 7.56%, 72.48% 7.56%, 72.85% 7.58%, 73.21% 7.64%, 73.56% 7.74%, 73.90% 7.87%, 74.23% 8.03%, 74.54% 8.23%, 74.82% 8.46%, 75.08% 8.72%, 75.31% 9.01%, 75.51% 9.31%, 77.76% 13.21%, 80.01% 17.10%, 82.25% 21.00%, 84.50% 24.89%, 86.75% 28.78%, 89.00% 32.68%, 91.25% 36.57%, 93.49% 40.46%, 95.74% 44.36%, 97.99% 48.25%, 98.16% 48.58%, 98.29% 48.92%, 98.38% 49.27%, 98.44% 49.63%);
    }
    /* diamond */
    83.3333%, 96.1538% {
      width: min(calc(var(--hero-h) * 1.1143), 88vw);
      clip-path: polygon(98.38% 50.00%, 98.34% 50.61%, 98.19% 51.21%, 97.96% 51.77%, 97.64% 52.29%, 97.24% 52.76%, 95.02% 54.98%, 92.79% 57.21%, 90.57% 59.43%, 88.35% 61.65%, 86.12% 63.88%, 83.90% 66.10%, 81.67% 68.33%, 79.45% 70.55%, 77.22% 72.78%, 75.00% 75.00%, 72.78% 77.22%, 70.55% 79.45%, 68.33% 81.67%, 66.10% 83.90%, 63.88% 86.12%, 61.65% 88.35%, 59.43% 90.57%, 57.21% 92.79%, 54.98% 95.02%, 52.76% 97.24%, 52.29% 97.64%, 51.77% 97.96%, 51.21% 98.19%, 50.61% 98.34%, 50.00% 98.38%, 49.39% 98.34%, 48.79% 98.19%, 48.23% 97.96%, 47.71% 97.64%, 47.24% 97.24%, 45.02% 95.02%, 42.79% 92.79%, 40.57% 90.57%, 38.35% 88.35%, 36.12% 86.12%, 33.90% 83.90%, 31.67% 81.67%, 29.45% 79.45%, 27.22% 77.22%, 25.00% 75.00%, 22.78% 72.78%, 20.55% 70.55%, 18.33% 68.33%, 16.10% 66.10%, 13.88% 63.88%, 11.65% 61.65%, 9.43% 59.43%, 7.21% 57.21%, 4.98% 54.98%, 2.76% 52.76%, 2.36% 52.29%, 2.04% 51.77%, 1.81% 51.21%, 1.66% 50.61%, 1.62% 50.00%, 1.66% 49.39%, 1.81% 48.79%, 2.04% 48.23%, 2.36% 47.71%, 2.76% 47.24%, 4.98% 45.02%, 7.21% 42.79%, 9.43% 40.57%, 11.65% 38.35%, 13.88% 36.12%, 16.10% 33.90%, 18.33% 31.67%, 20.55% 29.45%, 22.78% 27.22%, 25.00% 25.00%, 27.22% 22.78%, 29.45% 20.55%, 31.67% 18.33%, 33.90% 16.10%, 36.12% 13.88%, 38.35% 11.65%, 40.57% 9.43%, 42.79% 7.21%, 45.02% 4.98%, 47.24% 2.76%, 47.71% 2.36%, 48.23% 2.04%, 48.79% 1.81%, 49.39% 1.66%, 50.00% 1.62%, 50.61% 1.66%, 51.21% 1.81%, 51.77% 2.04%, 52.29% 2.36%, 52.76% 2.76%, 54.98% 4.98%, 57.21% 7.21%, 59.43% 9.43%, 61.65% 11.65%, 63.88% 13.88%, 66.10% 16.10%, 68.33% 18.33%, 70.55% 20.55%, 72.78% 22.78%, 75.00% 25.00%, 77.22% 27.22%, 79.45% 29.45%, 81.67% 31.67%, 83.90% 33.90%, 86.12% 36.12%, 88.35% 38.35%, 90.57% 40.57%, 92.79% 42.79%, 95.02% 45.02%, 97.24% 47.24%, 97.64% 47.71%, 97.96% 48.23%, 98.19% 48.79%, 98.34% 49.39%);
    }
    /* back to rectangle to close the loop */
    100% {
      width: min(70vw, calc(var(--hero-h) * 2.2857));
      clip-path: polygon(100.00% 50.00%, 100.00% 54.55%, 100.00% 59.10%, 100.00% 63.65%, 100.00% 68.20%, 100.00% 72.75%, 100.00% 77.30%, 100.00% 81.85%, 100.00% 86.40%, 100.00% 90.95%, 100.00% 95.50%, 99.94% 96.20%, 99.78% 96.89%, 99.51% 97.54%, 99.14% 98.15%, 98.68% 98.68%, 98.15% 99.14%, 97.54% 99.51%, 96.89% 99.78%, 96.20% 99.94%, 95.50% 100.00%, 90.95% 100.00%, 86.40% 100.00%, 81.85% 100.00%, 77.30% 100.00%, 72.75% 100.00%, 68.20% 100.00%, 63.65% 100.00%, 59.10% 100.00%, 54.55% 100.00%, 50.00% 100.00%, 45.45% 100.00%, 40.90% 100.00%, 36.35% 100.00%, 31.80% 100.00%, 27.25% 100.00%, 22.70% 100.00%, 18.15% 100.00%, 13.60% 100.00%, 9.05% 100.00%, 4.50% 100.00%, 3.80% 99.94%, 3.11% 99.78%, 2.46% 99.51%, 1.85% 99.14%, 1.32% 98.68%, 0.86% 98.15%, 0.49% 97.54%, 0.22% 96.89%, 0.06% 96.20%, 0.00% 95.50%, 0.00% 90.95%, 0.00% 86.40%, 0.00% 81.85%, 0.00% 77.30%, 0.00% 72.75%, 0.00% 68.20%, 0.00% 63.65%, 0.00% 59.10%, 0.00% 54.55%, 0.00% 50.00%, 0.00% 45.45%, 0.00% 40.90%, 0.00% 36.35%, 0.00% 31.80%, 0.00% 27.25%, 0.00% 22.70%, 0.00% 18.15%, 0.00% 13.60%, 0.00% 9.05%, 0.00% 4.50%, 0.06% 3.80%, 0.22% 3.11%, 0.49% 2.46%, 0.86% 1.85%, 1.32% 1.32%, 1.85% 0.86%, 2.46% 0.49%, 3.11% 0.22%, 3.80% 0.06%, 4.50% 0.00%, 9.05% 0.00%, 13.60% 0.00%, 18.15% 0.00%, 22.70% 0.00%, 27.25% 0.00%, 31.80% 0.00%, 36.35% 0.00%, 40.90% 0.00%, 45.45% 0.00%, 50.00% 0.00%, 54.55% 0.00%, 59.10% 0.00%, 63.65% 0.00%, 68.20% 0.00%, 72.75% 0.00%, 77.30% 0.00%, 81.85% 0.00%, 86.40% 0.00%, 90.95% 0.00%, 95.50% 0.00%, 96.20% 0.06%, 96.89% 0.22%, 97.54% 0.49%, 98.15% 0.86%, 98.68% 1.32%, 99.14% 1.85%, 99.51% 2.46%, 99.78% 3.11%, 99.94% 3.80%, 100.00% 4.50%, 100.00% 9.05%, 100.00% 13.60%, 100.00% 18.15%, 100.00% 22.70%, 100.00% 27.25%, 100.00% 31.80%, 100.00% 36.35%, 100.00% 40.90%, 100.00% 45.45%);
    }
  }

  /* Same six shapes on the same clock, so the halo tracks the mask exactly. */
  @keyframes vidGlowShapeCycle {
    /* rectangle */
    0.0000%, 12.8205% {
      clip-path: polygon(100.00% 50.00%, 100.00% 54.55%, 100.00% 59.10%, 100.00% 63.65%, 100.00% 68.20%, 100.00% 72.75%, 100.00% 77.30%, 100.00% 81.85%, 100.00% 86.40%, 100.00% 90.95%, 100.00% 95.50%, 99.94% 96.20%, 99.78% 96.89%, 99.51% 97.54%, 99.14% 98.15%, 98.68% 98.68%, 98.15% 99.14%, 97.54% 99.51%, 96.89% 99.78%, 96.20% 99.94%, 95.50% 100.00%, 90.95% 100.00%, 86.40% 100.00%, 81.85% 100.00%, 77.30% 100.00%, 72.75% 100.00%, 68.20% 100.00%, 63.65% 100.00%, 59.10% 100.00%, 54.55% 100.00%, 50.00% 100.00%, 45.45% 100.00%, 40.90% 100.00%, 36.35% 100.00%, 31.80% 100.00%, 27.25% 100.00%, 22.70% 100.00%, 18.15% 100.00%, 13.60% 100.00%, 9.05% 100.00%, 4.50% 100.00%, 3.80% 99.94%, 3.11% 99.78%, 2.46% 99.51%, 1.85% 99.14%, 1.32% 98.68%, 0.86% 98.15%, 0.49% 97.54%, 0.22% 96.89%, 0.06% 96.20%, 0.00% 95.50%, 0.00% 90.95%, 0.00% 86.40%, 0.00% 81.85%, 0.00% 77.30%, 0.00% 72.75%, 0.00% 68.20%, 0.00% 63.65%, 0.00% 59.10%, 0.00% 54.55%, 0.00% 50.00%, 0.00% 45.45%, 0.00% 40.90%, 0.00% 36.35%, 0.00% 31.80%, 0.00% 27.25%, 0.00% 22.70%, 0.00% 18.15%, 0.00% 13.60%, 0.00% 9.05%, 0.00% 4.50%, 0.06% 3.80%, 0.22% 3.11%, 0.49% 2.46%, 0.86% 1.85%, 1.32% 1.32%, 1.85% 0.86%, 2.46% 0.49%, 3.11% 0.22%, 3.80% 0.06%, 4.50% 0.00%, 9.05% 0.00%, 13.60% 0.00%, 18.15% 0.00%, 22.70% 0.00%, 27.25% 0.00%, 31.80% 0.00%, 36.35% 0.00%, 40.90% 0.00%, 45.45% 0.00%, 50.00% 0.00%, 54.55% 0.00%, 59.10% 0.00%, 63.65% 0.00%, 68.20% 0.00%, 72.75% 0.00%, 77.30% 0.00%, 81.85% 0.00%, 86.40% 0.00%, 90.95% 0.00%, 95.50% 0.00%, 96.20% 0.06%, 96.89% 0.22%, 97.54% 0.49%, 98.15% 0.86%, 98.68% 1.32%, 99.14% 1.85%, 99.51% 2.46%, 99.78% 3.11%, 99.94% 3.80%, 100.00% 4.50%, 100.00% 9.05%, 100.00% 13.60%, 100.00% 18.15%, 100.00% 22.70%, 100.00% 27.25%, 100.00% 31.80%, 100.00% 36.35%, 100.00% 40.90%, 100.00% 45.45%);
    }
    /* oval */
    16.6667%, 29.4872% {
      clip-path: polygon(100.00% 50.00%, 99.93% 52.56%, 99.71% 55.12%, 99.36% 57.66%, 98.86% 60.18%, 98.23% 62.66%, 97.46% 65.11%, 96.55% 67.51%, 95.52% 69.86%, 94.36% 72.15%, 93.08% 74.37%, 91.68% 76.52%, 90.16% 78.59%, 88.54% 80.58%, 86.82% 82.48%, 84.99% 84.29%, 83.08% 85.99%, 81.08% 87.60%, 79.00% 89.10%, 76.84% 90.50%, 74.62% 91.78%, 72.34% 92.94%, 70.00% 93.99%, 67.61% 94.93%, 65.17% 95.74%, 62.70% 96.43%, 60.20% 96.99%, 57.67% 97.43%, 55.12% 97.75%, 52.56% 97.94%, 50.00% 98.00%, 47.44% 97.94%, 44.88% 97.75%, 42.33% 97.43%, 39.80% 96.99%, 37.30% 96.43%, 34.83% 95.74%, 32.39% 94.93%, 30.00% 93.99%, 27.66% 92.94%, 25.38% 91.78%, 23.16% 90.50%, 21.00% 89.10%, 18.92% 87.60%, 16.92% 85.99%, 15.01% 84.29%, 13.18% 82.48%, 11.46% 80.58%, 9.84% 78.59%, 8.32% 76.52%, 6.92% 74.37%, 5.64% 72.15%, 4.48% 69.86%, 3.45% 67.51%, 2.54% 65.11%, 1.77% 62.66%, 1.14% 60.18%, 0.64% 57.66%, 0.29% 55.12%, 0.07% 52.56%, 0.00% 50.00%, 0.07% 47.44%, 0.29% 44.88%, 0.64% 42.34%, 1.14% 39.82%, 1.77% 37.34%, 2.54% 34.89%, 3.45% 32.49%, 4.48% 30.14%, 5.64% 27.85%, 6.92% 25.63%, 8.32% 23.48%, 9.84% 21.41%, 11.46% 19.42%, 13.18% 17.52%, 15.01% 15.71%, 16.92% 14.01%, 18.92% 12.40%, 21.00% 10.90%, 23.16% 9.50%, 25.38% 8.22%, 27.66% 7.06%, 30.00% 6.01%, 32.39% 5.07%, 34.83% 4.26%, 37.30% 3.57%, 39.80% 3.01%, 42.33% 2.57%, 44.88% 2.25%, 47.44% 2.06%, 50.00% 2.00%, 52.56% 2.06%, 55.12% 2.25%, 57.67% 2.57%, 60.20% 3.01%, 62.70% 3.57%, 65.17% 4.26%, 67.61% 5.07%, 70.00% 6.01%, 72.34% 7.06%, 74.62% 8.22%, 76.84% 9.50%, 79.00% 10.90%, 81.08% 12.40%, 83.08% 14.01%, 84.99% 15.71%, 86.82% 17.52%, 88.54% 19.42%, 90.16% 21.41%, 91.68% 23.48%, 93.08% 25.63%, 94.36% 27.85%, 95.52% 30.14%, 96.55% 32.49%, 97.46% 34.89%, 98.23% 37.34%, 98.86% 39.82%, 99.36% 42.34%, 99.71% 44.88%, 99.93% 47.44%);
    }
    /* circle */
    33.3333%, 46.1538% {
      clip-path: polygon(99.50% 50.00%, 99.43% 52.59%, 99.23% 55.17%, 98.89% 57.74%, 98.42% 60.29%, 97.81% 62.81%, 97.08% 65.30%, 96.21% 67.74%, 95.22% 70.13%, 94.10% 72.47%, 92.87% 74.75%, 91.51% 76.96%, 90.05% 79.10%, 88.47% 81.15%, 86.79% 83.12%, 85.00% 85.00%, 83.12% 86.79%, 81.15% 88.47%, 79.10% 90.05%, 76.96% 91.51%, 74.75% 92.87%, 72.47% 94.10%, 70.13% 95.22%, 67.74% 96.21%, 65.30% 97.08%, 62.81% 97.81%, 60.29% 98.42%, 57.74% 98.89%, 55.17% 99.23%, 52.59% 99.43%, 50.00% 99.50%, 47.41% 99.43%, 44.83% 99.23%, 42.26% 98.89%, 39.71% 98.42%, 37.19% 97.81%, 34.70% 97.08%, 32.26% 96.21%, 29.87% 95.22%, 27.53% 94.10%, 25.25% 92.87%, 23.04% 91.51%, 20.90% 90.05%, 18.85% 88.47%, 16.88% 86.79%, 15.00% 85.00%, 13.21% 83.12%, 11.53% 81.15%, 9.95% 79.10%, 8.49% 76.96%, 7.13% 74.75%, 5.90% 72.47%, 4.78% 70.13%, 3.79% 67.74%, 2.92% 65.30%, 2.19% 62.81%, 1.58% 60.29%, 1.11% 57.74%, 0.77% 55.17%, 0.57% 52.59%, 0.50% 50.00%, 0.57% 47.41%, 0.77% 44.83%, 1.11% 42.26%, 1.58% 39.71%, 2.19% 37.19%, 2.92% 34.70%, 3.79% 32.26%, 4.78% 29.87%, 5.90% 27.53%, 7.13% 25.25%, 8.49% 23.04%, 9.95% 20.90%, 11.53% 18.85%, 13.21% 16.88%, 15.00% 15.00%, 16.88% 13.21%, 18.85% 11.53%, 20.90% 9.95%, 23.04% 8.49%, 25.25% 7.13%, 27.53% 5.90%, 29.87% 4.78%, 32.26% 3.79%, 34.70% 2.92%, 37.19% 2.19%, 39.71% 1.58%, 42.26% 1.11%, 44.83% 0.77%, 47.41% 0.57%, 50.00% 0.50%, 52.59% 0.57%, 55.17% 0.77%, 57.74% 1.11%, 60.29% 1.58%, 62.81% 2.19%, 65.30% 2.92%, 67.74% 3.79%, 70.13% 4.78%, 72.47% 5.90%, 74.75% 7.13%, 76.96% 8.49%, 79.10% 9.95%, 81.15% 11.53%, 83.12% 13.21%, 85.00% 15.00%, 86.79% 16.88%, 88.47% 18.85%, 90.05% 20.90%, 91.51% 23.04%, 92.87% 25.25%, 94.10% 27.53%, 95.22% 29.87%, 96.21% 32.26%, 97.08% 34.70%, 97.81% 37.19%, 98.42% 39.71%, 98.89% 42.26%, 99.23% 44.83%, 99.43% 47.41%);
    }
    /* triangle */
    50.0000%, 62.8205% {
      clip-path: polygon(76.95% 50.74%, 78.30% 53.18%, 79.64% 55.61%, 80.99% 58.05%, 82.34% 60.48%, 83.68% 62.92%, 85.03% 65.35%, 86.38% 67.79%, 87.72% 70.22%, 89.07% 72.66%, 90.42% 75.09%, 91.76% 77.53%, 93.11% 79.96%, 94.46% 82.40%, 94.71% 82.99%, 94.83% 83.62%, 94.82% 84.26%, 94.68% 84.89%, 94.41% 85.47%, 94.03% 85.99%, 93.55% 86.42%, 92.99% 86.74%, 92.38% 86.93%, 91.74% 87.00%, 88.86% 87.00%, 85.99% 87.00%, 83.11% 87.00%, 80.23% 87.00%, 77.35% 87.00%, 74.47% 87.00%, 71.59% 87.00%, 68.71% 87.00%, 65.83% 87.00%, 62.95% 87.00%, 60.08% 87.00%, 57.20% 87.00%, 54.32% 87.00%, 51.44% 87.00%, 48.56% 87.00%, 45.68% 87.00%, 42.80% 87.00%, 39.92% 87.00%, 37.05% 87.00%, 34.17% 87.00%, 31.29% 87.00%, 28.41% 87.00%, 25.53% 87.00%, 22.65% 87.00%, 19.77% 87.00%, 16.89% 87.00%, 14.01% 87.00%, 11.14% 87.00%, 8.26% 87.00%, 7.62% 86.93%, 7.01% 86.74%, 6.45% 86.42%, 5.97% 85.99%, 5.59% 85.47%, 5.32% 84.89%, 5.18% 84.26%, 5.17% 83.62%, 5.29% 82.99%, 5.54% 82.40%, 6.94% 79.88%, 8.33% 77.37%, 9.72% 74.85%, 11.11% 72.33%, 12.50% 69.82%, 13.89% 67.30%, 15.28% 64.78%, 16.68% 62.27%, 18.07% 59.75%, 19.46% 57.24%, 20.85% 54.72%, 22.24% 52.20%, 23.63% 49.69%, 25.02% 47.17%, 26.42% 44.65%, 27.81% 42.14%, 29.20% 39.62%, 30.59% 37.10%, 31.98% 34.59%, 33.37% 32.07%, 34.76% 29.55%, 36.16% 27.04%, 37.55% 24.52%, 38.94% 22.01%, 40.33% 19.49%, 41.72% 16.97%, 43.11% 14.46%, 44.50% 11.94%, 45.90% 9.42%, 47.29% 6.91%, 47.67% 6.37%, 48.15% 5.92%, 48.72% 5.58%, 49.34% 5.38%, 50.00% 5.31%, 50.66% 5.38%, 51.28% 5.58%, 51.85% 5.92%, 52.33% 6.37%, 52.71% 6.91%, 54.06% 9.34%, 55.41% 11.78%, 56.75% 14.21%, 58.10% 16.65%, 59.45% 19.08%, 60.79% 21.52%, 62.14% 23.95%, 63.49% 26.39%, 64.83% 28.82%, 66.18% 31.26%, 67.53% 33.69%, 68.87% 36.13%, 70.22% 38.56%, 71.56% 41.00%, 72.91% 43.44%, 74.26% 45.87%, 75.60% 48.31%);
    }
    /* hexagon */
    66.6667%, 79.4872% {
      clip-path: polygon(98.46% 50.00%, 98.44% 50.37%, 98.38% 50.73%, 98.29% 51.08%, 98.16% 51.42%, 97.99% 51.75%, 95.74% 55.64%, 93.49% 59.54%, 91.25% 63.43%, 89.00% 67.32%, 86.75% 71.22%, 84.50% 75.11%, 82.25% 79.00%, 80.01% 82.90%, 77.76% 86.79%, 75.51% 90.69%, 75.31% 90.99%, 75.08% 91.28%, 74.82% 91.54%, 74.54% 91.77%, 74.23% 91.97%, 73.90% 92.13%, 73.56% 92.26%, 73.21% 92.36%, 72.85% 92.42%, 72.48% 92.44%, 67.98% 92.44%, 63.49% 92.44%, 58.99% 92.44%, 54.50% 92.44%, 50.00% 92.44%, 45.50% 92.44%, 41.01% 92.44%, 36.51% 92.44%, 32.02% 92.44%, 27.52% 92.44%, 27.15% 92.42%, 26.79% 92.36%, 26.44% 92.26%, 26.10% 92.13%, 25.77% 91.97%, 25.46% 91.77%, 25.18% 91.54%, 24.92% 91.28%, 24.69% 90.99%, 24.49% 90.69%, 22.24% 86.79%, 19.99% 82.90%, 17.75% 79.00%, 15.50% 75.11%, 13.25% 71.22%, 11.00% 67.32%, 8.75% 63.43%, 6.51% 59.54%, 4.26% 55.64%, 2.01% 51.75%, 1.84% 51.42%, 1.71% 51.08%, 1.62% 50.73%, 1.56% 50.37%, 1.54% 50.00%, 1.56% 49.63%, 1.62% 49.27%, 1.71% 48.92%, 1.84% 48.58%, 2.01% 48.25%, 4.26% 44.36%, 6.51% 40.46%, 8.75% 36.57%, 11.00% 32.68%, 13.25% 28.78%, 15.50% 24.89%, 17.75% 21.00%, 19.99% 17.10%, 22.24% 13.21%, 24.49% 9.31%, 24.69% 9.01%, 24.92% 8.72%, 25.18% 8.46%, 25.46% 8.23%, 25.77% 8.03%, 26.10% 7.87%, 26.44% 7.74%, 26.79% 7.64%, 27.15% 7.58%, 27.52% 7.56%, 32.02% 7.56%, 36.51% 7.56%, 41.01% 7.56%, 45.50% 7.56%, 50.00% 7.56%, 54.50% 7.56%, 58.99% 7.56%, 63.49% 7.56%, 67.98% 7.56%, 72.48% 7.56%, 72.85% 7.58%, 73.21% 7.64%, 73.56% 7.74%, 73.90% 7.87%, 74.23% 8.03%, 74.54% 8.23%, 74.82% 8.46%, 75.08% 8.72%, 75.31% 9.01%, 75.51% 9.31%, 77.76% 13.21%, 80.01% 17.10%, 82.25% 21.00%, 84.50% 24.89%, 86.75% 28.78%, 89.00% 32.68%, 91.25% 36.57%, 93.49% 40.46%, 95.74% 44.36%, 97.99% 48.25%, 98.16% 48.58%, 98.29% 48.92%, 98.38% 49.27%, 98.44% 49.63%);
    }
    /* diamond */
    83.3333%, 96.1538% {
      clip-path: polygon(98.38% 50.00%, 98.34% 50.61%, 98.19% 51.21%, 97.96% 51.77%, 97.64% 52.29%, 97.24% 52.76%, 95.02% 54.98%, 92.79% 57.21%, 90.57% 59.43%, 88.35% 61.65%, 86.12% 63.88%, 83.90% 66.10%, 81.67% 68.33%, 79.45% 70.55%, 77.22% 72.78%, 75.00% 75.00%, 72.78% 77.22%, 70.55% 79.45%, 68.33% 81.67%, 66.10% 83.90%, 63.88% 86.12%, 61.65% 88.35%, 59.43% 90.57%, 57.21% 92.79%, 54.98% 95.02%, 52.76% 97.24%, 52.29% 97.64%, 51.77% 97.96%, 51.21% 98.19%, 50.61% 98.34%, 50.00% 98.38%, 49.39% 98.34%, 48.79% 98.19%, 48.23% 97.96%, 47.71% 97.64%, 47.24% 97.24%, 45.02% 95.02%, 42.79% 92.79%, 40.57% 90.57%, 38.35% 88.35%, 36.12% 86.12%, 33.90% 83.90%, 31.67% 81.67%, 29.45% 79.45%, 27.22% 77.22%, 25.00% 75.00%, 22.78% 72.78%, 20.55% 70.55%, 18.33% 68.33%, 16.10% 66.10%, 13.88% 63.88%, 11.65% 61.65%, 9.43% 59.43%, 7.21% 57.21%, 4.98% 54.98%, 2.76% 52.76%, 2.36% 52.29%, 2.04% 51.77%, 1.81% 51.21%, 1.66% 50.61%, 1.62% 50.00%, 1.66% 49.39%, 1.81% 48.79%, 2.04% 48.23%, 2.36% 47.71%, 2.76% 47.24%, 4.98% 45.02%, 7.21% 42.79%, 9.43% 40.57%, 11.65% 38.35%, 13.88% 36.12%, 16.10% 33.90%, 18.33% 31.67%, 20.55% 29.45%, 22.78% 27.22%, 25.00% 25.00%, 27.22% 22.78%, 29.45% 20.55%, 31.67% 18.33%, 33.90% 16.10%, 36.12% 13.88%, 38.35% 11.65%, 40.57% 9.43%, 42.79% 7.21%, 45.02% 4.98%, 47.24% 2.76%, 47.71% 2.36%, 48.23% 2.04%, 48.79% 1.81%, 49.39% 1.66%, 50.00% 1.62%, 50.61% 1.66%, 51.21% 1.81%, 51.77% 2.04%, 52.29% 2.36%, 52.76% 2.76%, 54.98% 4.98%, 57.21% 7.21%, 59.43% 9.43%, 61.65% 11.65%, 63.88% 13.88%, 66.10% 16.10%, 68.33% 18.33%, 70.55% 20.55%, 72.78% 22.78%, 75.00% 25.00%, 77.22% 27.22%, 79.45% 29.45%, 81.67% 31.67%, 83.90% 33.90%, 86.12% 36.12%, 88.35% 38.35%, 90.57% 40.57%, 92.79% 42.79%, 95.02% 45.02%, 97.24% 47.24%, 97.64% 47.71%, 97.96% 48.23%, 98.19% 48.79%, 98.34% 49.39%);
    }
    /* back to rectangle to close the loop */
    100% {
      clip-path: polygon(100.00% 50.00%, 100.00% 54.55%, 100.00% 59.10%, 100.00% 63.65%, 100.00% 68.20%, 100.00% 72.75%, 100.00% 77.30%, 100.00% 81.85%, 100.00% 86.40%, 100.00% 90.95%, 100.00% 95.50%, 99.94% 96.20%, 99.78% 96.89%, 99.51% 97.54%, 99.14% 98.15%, 98.68% 98.68%, 98.15% 99.14%, 97.54% 99.51%, 96.89% 99.78%, 96.20% 99.94%, 95.50% 100.00%, 90.95% 100.00%, 86.40% 100.00%, 81.85% 100.00%, 77.30% 100.00%, 72.75% 100.00%, 68.20% 100.00%, 63.65% 100.00%, 59.10% 100.00%, 54.55% 100.00%, 50.00% 100.00%, 45.45% 100.00%, 40.90% 100.00%, 36.35% 100.00%, 31.80% 100.00%, 27.25% 100.00%, 22.70% 100.00%, 18.15% 100.00%, 13.60% 100.00%, 9.05% 100.00%, 4.50% 100.00%, 3.80% 99.94%, 3.11% 99.78%, 2.46% 99.51%, 1.85% 99.14%, 1.32% 98.68%, 0.86% 98.15%, 0.49% 97.54%, 0.22% 96.89%, 0.06% 96.20%, 0.00% 95.50%, 0.00% 90.95%, 0.00% 86.40%, 0.00% 81.85%, 0.00% 77.30%, 0.00% 72.75%, 0.00% 68.20%, 0.00% 63.65%, 0.00% 59.10%, 0.00% 54.55%, 0.00% 50.00%, 0.00% 45.45%, 0.00% 40.90%, 0.00% 36.35%, 0.00% 31.80%, 0.00% 27.25%, 0.00% 22.70%, 0.00% 18.15%, 0.00% 13.60%, 0.00% 9.05%, 0.00% 4.50%, 0.06% 3.80%, 0.22% 3.11%, 0.49% 2.46%, 0.86% 1.85%, 1.32% 1.32%, 1.85% 0.86%, 2.46% 0.49%, 3.11% 0.22%, 3.80% 0.06%, 4.50% 0.00%, 9.05% 0.00%, 13.60% 0.00%, 18.15% 0.00%, 22.70% 0.00%, 27.25% 0.00%, 31.80% 0.00%, 36.35% 0.00%, 40.90% 0.00%, 45.45% 0.00%, 50.00% 0.00%, 54.55% 0.00%, 59.10% 0.00%, 63.65% 0.00%, 68.20% 0.00%, 72.75% 0.00%, 77.30% 0.00%, 81.85% 0.00%, 86.40% 0.00%, 90.95% 0.00%, 95.50% 0.00%, 96.20% 0.06%, 96.89% 0.22%, 97.54% 0.49%, 98.15% 0.86%, 98.68% 1.32%, 99.14% 1.85%, 99.51% 2.46%, 99.78% 3.11%, 99.94% 3.80%, 100.00% 4.50%, 100.00% 9.05%, 100.00% 13.60%, 100.00% 18.15%, 100.00% 22.70%, 100.00% 27.25%, 100.00% 31.80%, 100.00% 36.35%, 100.00% 40.90%, 100.00% 45.45%);
    }
  }

  @media (max-width: 600px) {
    .vid-mask-wrap {
      width: 220px;
      height: 220px;
    }
    /* The shared morphShape keyframes cover small screens too: its 0% frame
       carries no width, so it animates from whatever size the element has
       (220px here), and the end widths are min(..vh, ..vw) which already clamp
       on a narrow viewport. A separate mobile copy would just be a second
       thing to keep in sync. */
  }

  .vid-text-overlay {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 100%;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 4px;
    z-index: 100;
    opacity: 0;
    pointer-events: none;
    overflow: visible; /* explicitly allow children to render past this box's edges */
    animation: fadeInOverlayText 1s ease-in-out 2.4s forwards;
  }

  /* The box the scroll zoom/fade owns. It is a separate element because
     .vid-text-overlay's opacity is already spoken for by the intro animation
     above, and a running CSS animation outranks an inline style — so GSAP
     could never fade the overlay itself. Fading a child multiplies with the
     parent's opacity, which is exactly the wanted result. */
  .vid-text-inner {
    /* This is the page's <h1> (see index.html). margin:0 overrides the
       browser's default heading margin, which would otherwise push the
       wordmark off the centre of the video; font-size is irrelevant here
       because every span sets its own. */
    margin: 0;
    width: 100%;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 4px;
  }

  .vid-text-overlay span {
    display: block;
    line-height: 0.95;
    font-family: 'Anton', Arial, Helvetica, sans-serif;
    font-weight: 400; /* Anton is a single-weight display face, already bold by design */
    text-transform: uppercase;
    letter-spacing: 1px;
    /* --hero-word is the whole size story — see the token on .vid-mask-outer.
       What is left here is the floor, which is the old clamp's 48px.

       On the third of that token's three terms: 0.3556 is 14vw restated in vh
       at a 16:9 viewport (14 * 16/9 / 70). That is what puts the handover onto
       exactly 16:9, so anything that shape or narrower is governed by width the
       way it always was, and only a wider-than-16:9 screen — where the mask is
       running out of height while the width keeps going — hands over to the
       height. Without it the type tracked one axis of the viewport while the
       video tracked the other, and on a 3440x1440 that left CINEMATIC spilling
       right outside the circle it is supposed to sit across. */
    font-size: max(48px, var(--hero-word));
    text-align: center;
    white-space: nowrap;
    -webkit-font-smoothing: antialiased;
    text-rendering: optimizeLegibility;
    /* Soft black halo so the wordmark holds up over bright frames of the reel.
       em units keep it proportional as the font-size clamps down on mobile. */
    text-shadow:
      0 0.02em 0.05em rgba(0, 0, 0, 0.45),
      0 0 0.12em rgba(0, 0, 0, 0.30);
    /* no max-width here — capping this would clip the intentional bleed effect */
  }

  /* Desktop only: "Cinematic" bleeds past the video square's edges. The bleed
     IS this 13/14 — the word is set slightly smaller than its siblings, so the
     longer string lands slightly wider than they do. Taking that straight off
     --hero-word rather than restating the ramp is what guarantees the ratio
     holds on all three of its branches at once: at 14vw this resolves to the
     13vw it has always been, at the knee to 13/14 of the knee, and at the
     height guard to 13 * 16/9 / 70. It also removes the failure that started
     all this, where the two rules were written separately, only one of them
     carried a ceiling, and the pair silently came apart on a wide monitor. */
  .vid-text-overlay .word-bleed {
    font-size: calc(var(--hero-word) * 0.9286);   /* 13/14 of its siblings */
  }

  .vid-text-overlay .word-white {
    color: rgba(255, 255, 255, 0.8);
  }

  .vid-text-overlay .word-yellow {
    color: rgba(255, 212, 0, 0.8);
  }

  @keyframes fadeInOverlayText {
    0% { opacity: 0; }
    100% { opacity: 1; }
  }

  @media (max-width: 600px) {
    .vid-text-overlay {
      width: 100%;
      padding: 0 16px;
      box-sizing: border-box;
    }

    .vid-text-overlay span {
      font-size: clamp(40px, 17vw, 90px);
      letter-spacing: 0px;
    }

    /* Mobile: full word must stay fully visible within screen width */
    .vid-text-overlay .word-bleed {
      font-size: clamp(24px, 9.5vw, 56px);
    }
  }

  .scroll-indicator {
    position: absolute;
    bottom: 10%;
    left: 50%;
    transform: translateX(-50%);
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 8px;
    opacity: 0;
    cursor: pointer;
    z-index: 10000;
    animation: fadeInArrow 0.8s ease-in-out 1s forwards, bobArrow 1.8s ease-in-out 1.8s infinite;
  }

  /* Same split as .vid-text-inner: the outer box keeps the fade-in and the
     bob, this one is what the scroll fade-out animates. */
  .scroll-cue-inner {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 8px;
    /* The cue sits ON the footage now. --hero-h grew the mask past the 90% mark
       this is anchored at, so the yellow lands on whatever the reel is showing
       — grass, sky, water — instead of on flat black. drop-shadow rather than
       text-shadow because it has to carry the arrow's SVG stroke as well as the
       label, and applying it to their shared parent covers both in one pass.
       Same two-layer recipe as the wordmark's halo in § 02a: a tight offset
       shadow for contrast, a wider soft one to lift it off a busy frame. */
    filter:
      drop-shadow(0 1px 2px rgba(0, 0, 0, 0.55))
      drop-shadow(0 0 7px rgba(0, 0, 0, 0.45));
  }

  .scroll-indicator span {
    color: #FFD400;
    font-size: 13px;
    font-weight: 600;
    letter-spacing: 2px;
    text-transform: uppercase;
    font-family: Arial, Helvetica, sans-serif;
  }

  .scroll-indicator svg {
    width: 28px;
    height: 28px;
    display: block;
  }

  .scroll-indicator path {
    fill: none;
    stroke: #FFD400;
    stroke-width: 2.5;
    stroke-linecap: round;
    stroke-linejoin: round;
  }

  @keyframes fadeInArrow {
    0% { opacity: 0; }
    100% { opacity: 0.85; }
  }

  @keyframes bobArrow {
    0%, 100% { transform: translateX(-50%) translateY(0); }
    50% { transform: translateX(-50%) translateY(10px); }
  }

  @media (max-width: 600px) {
    .scroll-indicator {
      display: none;
    }
  }


  /* Placed at the end of this section, AFTER .vid-mask-wrap's own rule, so it
     actually wins — an equal-specificity override earlier in the file would
     lose on source order. The intro still plays once; the mask then simply
     stays the rounded rectangle it lands on. */
  @media (prefers-reduced-motion: reduce) {
    .vid-mask-wrap {
      animation: morphShape 1.4s ease-in-out 1s forwards;
    }
  }


/* ============================================================================
   02b · HERO SCROLL CHOREOGRAPHY
   ============================================================================
   The layout half of the scroll story; the moving half is js/main.js § 02b.

   Everything here is gated behind `html.acf-sfx`, a class that script adds
   only once GSAP has actually loaded and prefers-reduced-motion is off. If the
   CDN is blocked or motion is reduced, none of this applies and the page keeps
   the plain stacked layout it has without JavaScript.

   WHY STICKY AND NOT A SCROLLTRIGGER PIN
   --------------------------------------
   .acf-scroll-stage wraps the hero, the morph section and the demo reel. Its
   only job is to give `position:sticky` an end: a sticky element sticks until
   its PARENT's bottom edge, so the wrapper is what decides where the video
   lets go. Sticky also solves two things a pin does not — the hero keeps its
   100vh in the document, so nothing below it shifts when the effect turns on,
   and the release is an ordinary scroll rather than a snap back to a document
   position four screens above.

   STACKING — deliberately shallow, so the lightboxes still work
   -------------------------------------------------------------
     .vid-mask-outer     z-index 2       the video (blurs, as the backdrop)
     .acf-morph-widget   z-index 3       the morph text, sharp, OVER the video
     .feature-content    z-index 5       play button, over the fullscreen video
     .acf-nav            z-index 9000
     .lightbox           z-index 99999
   The play button carries the z-index rather than .acf-demo-reel itself. A
   stacking context on .acf-demo-reel would trap its .lightbox child underneath
   the nav; .feature-content is a SIBLING of that lightbox, so raising it is
   safe. For the same reason .acf-scroll-stage stays unpositioned — giving the
   wrapper a z-index would trap everything inside it.

   A note on the hero's own children: .vid-mask-outer becomes a stacking
   context once it is sticky, so .vid-text-overlay (100) and .scroll-indicator
   (10000) now stack only against each other instead of against the nav.
   ============================================================================ */

  html.acf-sfx .acf-scroll-stage > .vid-mask-outer {
    position: sticky;
    top: 0;
    height: 100vh;
    height: 100svh;
    min-height: 0;
    z-index: 2;
    /* `clip`, not the base rule's `overflow-x:hidden`: hidden computes
       overflow-y to `auto`, which would make this a scroll container and hand
       it a scrollbar of its own once the video grows to fill it. */
    overflow: clip;
  }

  html.acf-sfx .acf-morph-widget {
    position: relative;
    z-index: 3;
    /* MUST go with the z-index above. The base rule fills this section with a
       solid var(--acf-black); once it stacks over the video that fill would
       black the video out completely for the whole 200vh it covers. Dropping
       to transparent costs nothing visually — <html> and <body> are already
       painted the same #050505 in § 00, so anywhere the video is not behind
       the text, the identical black still shows through. */
    background: transparent;
  }

  /* Sits inside .vid-mask-stage, which shrink-wraps the video — so at full
     bleed it covers the viewport exactly, with no second set of size rules to
     keep in step. Darker at the edges than the middle, so it reads as a
     vignette rather than a flat wash over the footage. js/main.js § 02b fades
     it in over the back half of the expansion, by which point the mask is
     close enough to a rectangle that the scrim's square corners cannot show
     past it (and where they briefly could, it is near-black on near-black). */
  .vid-scrim {
    position: absolute;
    inset: 0;
    z-index: 1;
    opacity: 0;
    pointer-events: none;
    background:
      radial-gradient(ellipse at center,
        rgba(0,0,0,0.10) 0%,
        rgba(0,0,0,0.34) 55%,
        rgba(0,0,0,0.62) 100%);
  }

  /* Blur is paint-level, so hint the layer. Desktop only — the blur is the one
     part of the sequence phones skip, and pinning a needless compositor layer
     on a video is exactly the wrong trade on a phone. */
  @media (min-width: 769px) {
    html.acf-sfx .vid-mask-wrap video,
    html.acf-sfx .vid-mask-wrap .vid-fallback-img { will-change: filter, transform; }
  }

  /* Demo reel: twice the viewport tall, with its content sticky inside, so the
     fullscreen video and the play button hold together for one screen of
     scroll before both move on into the work grid. */
  html.acf-sfx .acf-demo-reel {
    height: 200vh;
    height: 200svh;
    min-height: 0;
    align-items: flex-start;   /* the sticky child does the centring now */
  }

  html.acf-sfx .acf-demo-reel .feature-content {
    position: sticky;
    top: 0;
    height: 100vh;
    height: 100svh;
    z-index: 5;
  }

  /* Phones: same sequence, shorter hold. */
  @media (max-width: 768px) {
    html.acf-sfx .acf-demo-reel {
      height: 150vh;
      height: 150svh;
    }
  }

  /* Belt and braces. js/main.js § 02b already refuses to add .acf-sfx when
     motion is reduced, so this should never fire — but if it ever did, the
     page must fall back to plain stacked sections rather than a video stuck
     to the viewport with nothing left to animate it. */
  @media (prefers-reduced-motion: reduce) {
    html.acf-sfx .acf-scroll-stage > .vid-mask-outer {
      position: static;
      height: auto;
      min-height: 100vh;
    }
    html.acf-sfx .acf-demo-reel {
      height: auto;
      min-height: 100vh;
      align-items: center;
    }
    html.acf-sfx .acf-demo-reel .feature-content {
      position: static;
      height: auto;
    }
  }


/* ============================================================================
   03 · MORPH TEXT / TAGLINE HERO
   ============================================================================ */

/* Scoped tokens — no *, html, or body selectors so the rest
   of the page is untouched */
.acf-morph-widget{
  --acf-black:#050505;
  --acf-white:#f5f5f5;
  --acf-white-dim:rgba(245,245,245,.62);
  --acf-yellow:#FFD400;
  --acf-display:'Anton', Impact, sans-serif;
  /* Morph text size lives here so the drop-shadow on .acf-morph-stage can be
     written as a fraction of it — `em` on the stage would resolve against the
     stage's own (body-sized) font, not the display type it wraps. */
  --acf-morph-fs:clamp(48px, 12.5vw, 210px);
  --acf-morph-shadow:drop-shadow(0 calc(var(--acf-morph-fs) * .02) calc(var(--acf-morph-fs) * .05) rgba(0,0,0,.5));
  --acf-body:'Space Grotesk', 'Helvetica Neue', Arial, sans-serif;

  background:var(--acf-black);
  /* NOTE: must NOT be `overflow:hidden` — that would make this a scroll
     container and silently kill the sticky panel. `clip` clips the blur
     bleed without breaking sticky. */
  overflow-x:clip;
  margin:0;
  font-family:var(--acf-display);
}
.acf-morph-widget *, .acf-morph-widget *::before, .acf-morph-widget *::after{
  margin:0;padding:0;box-sizing:border-box;
}

/* ---------- HERO: tall scroll track, sticky screen ----------
   NOTE: position:sticky below fails if ANY ancestor has overflow
   hidden/auto/scroll, or a transform/filter. .acf-morph-widget sits
   directly on <body>, so keep it that way if you ever re-wrap it.
   The track gives real scroll distance; the inner panel sticks
   so the morph text + tagline stay on screen while the tagline
   words animate in as you scroll. */
.acf-hero{
  position:relative;
  height:200vh;             /* scroll runway — raise for a slower reveal */
}
.acf-hero-inner{
  position:sticky;
  position:-webkit-sticky;
  top:0;
  height:100vh;
  height:100svh;
  min-height:480px;
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  gap:clamp(18px, 4vh, 54px);
  padding:0 6vw;
}

/* ---------- MORPH TEXT ---------- */
.acf-morph-stage{
  position:relative;
  width:100%;
  height:clamp(90px, 15vw, 240px);
  display:flex;
  align-items:center;
  justify-content:center;
  /* The threshold is NOT on by default. Its alpha crush snaps every edge
     pixel to fully on or fully off, which throws away the font's own
     antialiasing and leaves the resting headline visibly stair-stepped — so
     main.js only adds .is-morphing while a transition is actually running.
     At rest this is real, untouched text. */
  filter:var(--acf-morph-shadow);
}
/* Order matters: the threshold runs first and hands back the finished gooey
   shapes, then drop-shadow haloes those. A text-shadow on the words instead
   would feed a soft shadow INTO the alpha crush and come back as a hard black
   slab. */
.acf-morph-stage.is-morphing{
  filter:url(#acfThreshold) var(--acf-morph-shadow);
}
.acf-morph-text{
  position:absolute;
  inset:0;
  display:flex;
  align-items:center;
  justify-content:center;
  gap:.28em;
  white-space:nowrap;
  font-family:var(--acf-display);
  font-size:var(--acf-morph-fs);
  line-height:1;
  letter-spacing:.01em;
  text-transform:uppercase;
  user-select:none;
}
.acf-morph-text .acf-we{color:var(--acf-white)}
.acf-morph-text .acf-verb{color:var(--acf-yellow)}

/* ---------- TAGLINE — sits directly beneath the morph text ---------- */
.acf-tagline{
  display:flex;
  align-items:flex-start;
  justify-content:center;
}
.acf-tagline p{
  max-width:18ch;
  text-align:center;
  font-family:var(--acf-display);
  font-size:clamp(32px, 6vw, 92px);
  line-height:1.12;
  text-transform:uppercase;
  letter-spacing:.015em;
  color:var(--acf-white);
}
.acf-tagline .acf-w{
  display:inline-block;
  overflow:hidden;
  vertical-align:bottom;
}
.acf-tagline .acf-w > span{
  display:inline-block;
  transform:translateY(110%);
  opacity:0;
  will-change:transform,opacity;
}
.acf-tagline .acf-hl{color:var(--acf-yellow)}
/* drop-shadow on the paragraph, not text-shadow on the words: .acf-w is the
   reveal mask and its overflow:hidden would slice a blurred text-shadow off
   square at each word's edges. A filter runs after that clip, so the halo
   traces the glyphs instead. */
#acfTaglineCopy{
  filter:drop-shadow(0 0.02em 0.05em rgba(0,0,0,.5));
}

@media (prefers-reduced-motion: reduce){
  .acf-morph-stage, .acf-morph-stage.is-morphing{filter:var(--acf-morph-shadow)}
  .acf-tagline .acf-w > span{transform:none;opacity:1}
}


/* ============================================================================
   04 · DEMO REEL
   ============================================================================ */

/* ============================================================
   DESIGN TOKENS — scoped to the wrapper
   ============================================================ */
.acf-demo-reel{
  --white:#f5f5f5;
  --white-dim:rgba(245,245,245,.62);
  --yellow:#FFD400;
  --display:'Anton', Impact, sans-serif;
  --body:'Space Grotesk', 'Helvetica Neue', Arial, sans-serif;
  --pad:clamp(20px, 5vw, 72px);

  font-family:var(--body);
  font-size:17px;
  line-height:1.6;
  color:var(--white);
  -webkit-font-smoothing:antialiased;
  background:transparent;

  /* center the content in the middle of the container */
  display:flex;
  align-items:center;      /* vertical center  */
  justify-content:center;  /* horizontal center */
  width:100%;
  height:100%;             /* fill the parent if it has a height */
  min-height:100vh;        /* fallback: center in the viewport if it doesn't */
  min-height:100svh;
}

/* scoped resets (do not leak to the rest of the page) */
.acf-demo-reel *{margin:0;padding:0;box-sizing:border-box}
.acf-demo-reel button{font-family:inherit;background:none;border:0;color:inherit;cursor:pointer}
.acf-demo-reel ::selection{background:var(--yellow);color:#000}
.acf-demo-reel :focus-visible{outline:2px solid var(--yellow);outline-offset:3px}

/* small uppercase label */
.acf-demo-reel .eyebrow{
  font-size:12px;letter-spacing:.32em;text-transform:uppercase;
  color:var(--white-dim);font-weight:500;
}
.acf-demo-reel .eyebrow .tick{color:var(--yellow)}

/* ============================================================
   CONTENT (transparent — no background)
   ============================================================ */
.acf-demo-reel .feature-content{
  position:relative;z-index:2;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:22px;text-align:center;
  padding:clamp(24px,5vh,56px) var(--pad);
}
.acf-demo-reel .feature-title{
  font-family:var(--display);text-transform:uppercase;
  font-size:clamp(28px,4.6vw,58px);line-height:1.1;max-width:18ch;
}
.acf-demo-reel .play-big{
  width:clamp(110px,15vw,170px);aspect-ratio:1;border-radius:50%;
  background:var(--yellow);color:#000;display:grid;place-items:center;
  transition:transform .3s ease, box-shadow .3s ease;
  box-shadow:0 0 0 0 rgba(255,212,0,.35);
}
.acf-demo-reel .play-big svg{margin-left:6%}
.acf-demo-reel .play-big:hover,.acf-demo-reel .play-big:focus-visible{
  transform:scale(1.07);box-shadow:0 0 0 16px rgba(255,212,0,.12);
}
.acf-demo-reel .feature-hint{font-size:11px;letter-spacing:.3em;text-transform:uppercase;color:var(--white-dim)}

/* ============================================================
   LIGHTBOX — shared by the demo reel (04) and the work grid (05)

   Both sections ship byte-identical markup:
     .lightbox > .lightbox-inner > .lightbox-close
                                 + .lightbox-player
                                 + .lightbox-title
   so ONE rule set drives both players. These used to be two blocks
   and they drifted: the reel was hard-capped at 1280px while the
   grid filled the viewport. Keep the selectors grouped.
   ============================================================ */
.acf-demo-reel .lightbox,
.acf-work .lightbox{
  position:fixed;inset:0;z-index:99999;background:rgba(0,0,0,.92);
  display:none;align-items:center;justify-content:center;padding:clamp(10px,1.5vw,20px);
}
.acf-demo-reel .lightbox.open,
.acf-work .lightbox.open{display:flex}
/* fill the viewport: capped by width (96vw) or by height, whichever hits first.
   The 96px subtraction reserves room for the close button + title line. */
.acf-demo-reel .lightbox-inner,
.acf-work .lightbox-inner{
  position:relative;
  width:min(96vw, calc((92vh - 96px) * 16 / 9));
}
.acf-demo-reel .lightbox-player,
.acf-work .lightbox-player{position:relative;width:100%;aspect-ratio:16/9;background:#000;
  box-shadow:0 30px 90px rgba(0,0,0,.7)}
.acf-demo-reel .lightbox-player iframe,
.acf-work .lightbox-player iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
.acf-demo-reel .lightbox-close,
.acf-work .lightbox-close{
  position:absolute;top:-46px;right:0;width:44px;height:44px;
  display:grid;place-items:center;color:var(--white);transition:color .25s;
}
.acf-demo-reel .lightbox-close:hover,.acf-demo-reel .lightbox-close:focus-visible,
.acf-work .lightbox-close:hover,.acf-work .lightbox-close:focus-visible{color:var(--yellow)}
.acf-demo-reel .lightbox-title,
.acf-work .lightbox-title{margin-top:14px;font-size:14px;letter-spacing:.18em;text-transform:uppercase;
  color:var(--white-dim)}

/* ============================================================
   REDUCED MOTION
   ============================================================ */
@media (prefers-reduced-motion:reduce){
  .acf-demo-reel *,.acf-demo-reel *::before,.acf-demo-reel *::after{animation:none !important;transition:none !important}
}


/* ============================================================================
   05 · WORK GRID
   ============================================================================ */

/* ============================================================
   DESIGN TOKENS — scoped to the wrapper
   ============================================================ */
.acf-work{
  --black:#050505;
  --black-soft:#0a0a0a;
  --white:#f5f5f5;
  --white-dim:rgba(245,245,245,.62);
  --yellow:#FFD400;
  --line:rgba(245,245,245,.14);
  --display:'Anton', Impact, sans-serif;
  --body:'Space Grotesk', 'Helvetica Neue', Arial, sans-serif;
  --pad:clamp(20px, 5vw, 72px);

  font-family:var(--body);
  font-size:17px;
  line-height:1.6;
  color:var(--white);
  background:var(--black);
  -webkit-font-smoothing:antialiased;
}

/* scoped resets (do not leak to the rest of the page) */
.acf-work *{margin:0;padding:0;box-sizing:border-box}
.acf-work img{display:block;max-width:100%}
.acf-work a{color:inherit;text-decoration:none}
.acf-work button{font-family:inherit;background:none;border:0;color:inherit;cursor:pointer}
.acf-work ::selection{background:var(--yellow);color:#000}
.acf-work :focus-visible{outline:2px solid var(--yellow);outline-offset:3px}

.acf-work section{padding:clamp(84px,14vh,160px) var(--pad)}

/* small uppercase label + section head */
.acf-work .eyebrow{
  font-size:12px;letter-spacing:.32em;text-transform:uppercase;
  color:var(--white-dim);font-weight:500;
}
.acf-work .section-head{display:flex;align-items:baseline;gap:18px;margin-bottom:clamp(36px,6vh,64px)}
.acf-work .section-head .num{font-family:var(--display);font-size:14px;color:var(--yellow);letter-spacing:.1em}

/* ============================================================
   VIDEO GRID
   ============================================================ */
.acf-work .vgrid{
  display:grid;
  grid-template-columns:repeat(auto-fill, minmax(min(100%, 340px), 1fr));
  gap:3px;
  background:var(--black-soft);
}
.acf-work .vcard-wrap{
  display:flex;flex-direction:column;
  background:var(--black);
}
.acf-work .vcard{
  position:relative;aspect-ratio:16/9;overflow:hidden;
  background:#111;cursor:pointer;
}
/* thumbnail */
.acf-work .vcard-thumb{
  position:absolute;inset:0;width:100%;height:100%;
  object-fit:cover;transition:opacity .4s ease, transform 6s ease;
  transform:scale(1.02);
}
.acf-work .vcard:hover .vcard-thumb,.acf-work .vcard:focus-visible .vcard-thumb{ opacity:0 }
/* muted preview iframe */
.acf-work .vcard-frame{
  position:absolute;inset:0;overflow:hidden;opacity:0;
  transition:opacity .4s ease;pointer-events:none;
  container-type:size; /* establishes the query container for the cq units below */
}
.acf-work .vcard-frame iframe{
  position:absolute;top:50%;left:50%;border:0;
  /* oversized so YouTube chrome bleeds off-screen */
  width:max(100cqw, 178cqh);height:max(100cqh, 56.25cqw);
  transform:translate(-50%,-50%);
}
.acf-work .vcard:hover .vcard-frame,.acf-work .vcard:focus-visible .vcard-frame{ opacity:1 }
/* gradient overlay */
.acf-work .vcard-shade{
  position:absolute;inset:0;
  background:linear-gradient(to top, rgba(0,0,0,.55) 0%, transparent 52%);
  transition:background .3s ease;pointer-events:none;
}
.acf-work .vcard:hover .vcard-shade{ background:linear-gradient(to top,rgba(0,0,0,.35) 0%,transparent 52%) }
/* play icon — centre of card on hover */
.acf-work .vcard-play{
  position:absolute;top:50%;left:50%;transform:translate(-50%,-50%) scale(.8);
  width:48px;height:48px;border-radius:50%;
  background:var(--yellow);color:#000;display:grid;place-items:center;
  opacity:0;transition:opacity .3s ease,transform .3s ease;pointer-events:none;
}
.acf-work .vcard:hover .vcard-play,.acf-work .vcard:focus-visible .vcard-play{opacity:1;transform:translate(-50%,-50%) scale(1)}
/* caption below the 16:9 card */
.acf-work .vcard-caption{
  padding:12px 14px 16px;
  font-size:13px;font-weight:500;line-height:1.4;
  color:var(--white-dim);
  border-top:1px solid var(--line);
  transition:color .25s;
  min-height:42px; /* reserves space while oEmbed loads */
}
.acf-work .vcard-wrap:hover .vcard-caption{ color:var(--white) }
/* loading dots */
.acf-work .vgrid-loading{
  grid-column:1/-1;display:flex;justify-content:center;gap:10px;padding:64px 0;
}
.acf-work .vgrid-loading span{
  width:8px;height:8px;border-radius:50%;background:var(--yellow);
  animation:acf-work-ldot .9s ease-in-out infinite alternate;
}
.acf-work .vgrid-loading span:nth-child(2){animation-delay:.2s}
.acf-work .vgrid-loading span:nth-child(3){animation-delay:.4s}
@keyframes acf-work-ldot{from{opacity:.15;transform:scale(.7)}to{opacity:1;transform:scale(1)}}
/* more button */
.acf-work .vgrid-more{
  display:flex;justify-content:center;margin-top:clamp(36px,5vh,56px);
}
.acf-work .vgrid-more-btn{
  display:inline-flex;align-items:center;gap:12px;
  font-size:12px;letter-spacing:.3em;text-transform:uppercase;font-weight:700;
  border:1px solid var(--line);padding:16px 32px;
  transition:border-color .25s,color .25s;
}
.acf-work .vgrid-more-btn:hover,.acf-work .vgrid-more-btn:focus-visible{
  border-color:var(--yellow);color:var(--yellow);
}

/* ============================================================
   LIGHTBOX — see the shared block in section 04 (demo reel).
   The work grid and the demo reel use the same rules; do not
   re-declare .acf-work .lightbox* here.
   ============================================================ */

/* ============================================================
   REVEALS
   ============================================================ */
.acf-work .reveal{opacity:0;transform:translateY(34px);transition:opacity .8s ease,transform .8s ease}
.acf-work .reveal.in{opacity:1;transform:none}
.acf-work .reveal.d1{transition-delay:.08s}
.acf-work .reveal.d2{transition-delay:.16s}

/* ============================================================
   REDUCED MOTION
   ============================================================ */
@media (prefers-reduced-motion:reduce){
  .acf-work *,.acf-work *::before,.acf-work *::after{animation:none !important;transition:none !important}
  .acf-work .vcard-frame{display:none}
  .acf-work .vcard-thumb{opacity:1 !important;transform:none !important}
  .acf-work .vcard-play{opacity:1 !important;transform:translate(-50%,-50%) scale(1) !important}
  .acf-work .reveal{opacity:1;transform:none}
}


/* ============================================================================
   06 · WE MAKE
   ============================================================================ */

/* ============================================================
   DESIGN TOKENS — scoped to the wrapper
   ============================================================ */
.acf-make{
  --black:#050505;
  --white:#f5f5f5;
  --white-dim:rgba(245,245,245,.62);
  --yellow:#FFD400;
  --line:rgba(245,245,245,.14);
  --display:'Anton', Impact, sans-serif;
  --body:'Space Grotesk', 'Helvetica Neue', Arial, sans-serif;
  --pad:clamp(20px, 5vw, 72px);

  font-family:var(--body);
  font-size:17px;
  line-height:1.6;
  color:var(--white);
  background:var(--black);
  -webkit-font-smoothing:antialiased;
}

/* scoped resets (do not leak to the rest of the page) */
.acf-make *{margin:0;padding:0;box-sizing:border-box}
.acf-make a{color:inherit;text-decoration:none}
.acf-make ::selection{background:var(--yellow);color:#000}
.acf-make :focus-visible{outline:2px solid var(--yellow);outline-offset:3px}

.acf-make section{padding:clamp(84px,14vh,160px) var(--pad)}

/* small uppercase label + section head */
.acf-make .eyebrow{
  font-size:12px;letter-spacing:.32em;text-transform:uppercase;
  color:var(--white-dim);font-weight:500;
}
.acf-make .section-head{display:flex;align-items:baseline;gap:18px;margin-bottom:clamp(36px,6vh,64px)}
.acf-make .section-head .num{font-family:var(--display);font-size:14px;color:var(--yellow);letter-spacing:.1em}

/* ============================================================
   WE MAKE — services list
   ============================================================ */
.acf-make .make-list{list-style:none;border-top:1px solid var(--line);overflow:visible}
.acf-make .make-list li{
  position:relative; /* anchors the follow-video */
  border-bottom:1px solid var(--line);
  overflow:visible; /* let the preview float above neighboring rows/sections */
}
.acf-make .make-list a{
  position:relative;
  z-index:2;
  display:flex;align-items:baseline;justify-content:space-between;gap:18px;
  font-family:var(--display);text-transform:uppercase;
  font-size:clamp(40px, 8.5vw, 120px);line-height:1.06;
  padding:clamp(14px,2.4vh,26px) 0;
  transition:color .25s ease, padding-left .35s ease;
}
.acf-make .make-list a .tag{
  font-family:var(--body);font-size:12px;letter-spacing:.3em;text-transform:uppercase;
  color:var(--white-dim);font-weight:500;white-space:nowrap;transition:color .25s;
}
.acf-make .make-list a:hover,.acf-make .make-list a:focus-visible{color:var(--yellow);padding-left:clamp(8px,2vw,28px)}
.acf-make .make-list a:hover .tag,.acf-make .make-list a:focus-visible .tag{color:var(--yellow)}

/* ============================================================
   RESPONSIVE — tighter rhythm + stacked tag on small screens
   ============================================================ */
@media (max-width:640px){
  .acf-make .make-list a{
    flex-direction:column;
    align-items:flex-start;
    gap:6px;
    padding:16px 0;
  }
  .acf-make .make-list a .tag{white-space:normal;font-size:10px;letter-spacing:.22em}
  .acf-make .section-head{margin-bottom:28px}
}

/* ============================================================
   HOVER MEDIA PREVIEW — follows the cursor, falls back to a
   still image if the video can't load or play
   ============================================================ */
.acfmake-row-media{
  position:fixed;
  top:0;
  left:0;
  width:clamp(280px, 30vw, 460px);
  height:clamp(180px, 19vw, 290px);
  max-width:90vw;
  max-height:60vh;
  border-radius:3px;
  overflow:hidden;
  pointer-events:none; /* never blocks the link/click */
  z-index:1;
  opacity:0;
  transform:translate(-50%,-50%) scale(.82);
  transition:opacity .3s ease, transform .3s ease;
  box-shadow:0 24px 48px rgba(0,0,0,.55);
  background:#111; /* shows briefly if both video+image are still loading */
  will-change:transform,opacity;
}
.acfmake-row-media.is-active{
  opacity:1;
  transform:translate(-50%,-50%) scale(1);
}
.acfmake-row-media video,
.acfmake-row-media img{
  position:absolute;
  inset:0;
  width:100%;
  height:100%;
  object-fit:cover;
  display:block;
}
/* default: video showing, fallback image hidden */
.acfmake-row-media .acfmake-fallback-img{display:none}
/* if the video errors out, swap to the still image instead */
.acfmake-row-media.media-fallback video{display:none}
.acfmake-row-media.media-fallback .acfmake-fallback-img{display:block}
/* row color/slide on hover already handled by .make-list a:hover above */

/* ============================================================
   REVEALS
   ============================================================ */
.acf-make .reveal{opacity:0;transform:translateY(34px);transition:opacity .8s ease,transform .8s ease}
.acf-make .reveal.in{opacity:1;transform:none}
.acf-make .reveal.d1{transition-delay:.08s}
.acf-make .reveal.d2{transition-delay:.16s}
.acf-make .reveal.d3{transition-delay:.24s}

/* ============================================================
   REDUCED MOTION
   ============================================================ */
@media (prefers-reduced-motion:reduce){
  .acf-make *,.acf-make *::before,.acf-make *::after{animation:none !important;transition:none !important}
  .acf-make .reveal{opacity:1;transform:none}
  .acfmake-row-media{display:none}
}

/* touch devices: no cursor to follow, so skip the preview entirely
   (JS also guards this, but this keeps things clean if JS is blocked) */
@media (hover:none){
  .acfmake-row-media{display:none}
}


/* ============================================================================
   07 · MISSION
   ============================================================================ */

/* ============================================================
   DESIGN TOKENS — scoped to the wrapper
   ============================================================ */
.acf-mission{
  --black:#050505;
  --white:#f5f5f5;
  --white-dim:rgba(245,245,245,.62);
  --yellow:#FFD400;
  --display:'Anton', Impact, sans-serif;
  --body:'Space Grotesk', 'Helvetica Neue', Arial, sans-serif;
  --pad:clamp(20px, 5vw, 72px);

  /* total scroll length of the section — lower = faster word reveal */
  --mission-scroll:500vh;

  font-family:var(--body);
  font-size:17px;
  line-height:1.6;
  color:var(--white);
  -webkit-font-smoothing:antialiased;
  overflow:visible;            /* keep sticky alive */
}

/* scoped resets (do not leak to the rest of the page) */
.acf-mission *{margin:0;padding:0;box-sizing:border-box}
.acf-mission ::selection{background:var(--yellow);color:#000}

/* small uppercase label */
.acf-mission .eyebrow{
  font-size:12px;letter-spacing:.32em;text-transform:uppercase;
  color:var(--white-dim);font-weight:500;
}
.acf-mission .eyebrow .tick{color:var(--yellow)}

/* ============================================================
   MISSION — full-screen sticky word-reveal on scroll
   ============================================================ */
.acf-mission .mission{
  height:var(--mission-scroll);
  position:relative;padding:0;background:var(--black);
}
.acf-mission .mission-sticky{
  position:sticky;top:0;height:100vh;height:100svh;
  display:flex;align-items:center;justify-content:center;
  overflow:hidden;
}
.acf-mission .mission-inner{
  padding:clamp(72px,12vh,120px) var(--pad) clamp(40px,6vh,80px);
  max-width:1400px;width:100%;
}
.acf-mission .mission-eyebrow{margin-bottom:clamp(14px,2.5vh,28px)}
.acf-mission .mission-text{
  font-family:var(--display);
  text-transform:uppercase;
  /* fluid type: cinematic but always wraps on small screens */
  font-size:clamp(26px, 4.2vw, 72px);
  line-height:1.18;
  letter-spacing:.01em;
  word-break:normal;
  overflow-wrap:break-word;
}
.acf-mission .mw{
  display:inline;
  color:rgba(245,245,245,.12);
  transition:color .3s ease;
}
.acf-mission .mw.yellow{ color:rgba(255,212,0,.12) }
.acf-mission .mw.lit{ color:var(--white) !important }
.acf-mission .mw.yellow.lit{ color:var(--yellow) !important }
/* a hair of space after each word so inline spans read like real text */
.acf-mission .mw::after{ content:" " }

@media (max-width:600px){
  .acf-mission .mission-text{ font-size:clamp(22px, 7.5vw, 40px) }
}

/* ============================================================
   REDUCED MOTION — static, calm, fully-lit
   ============================================================ */
@media (prefers-reduced-motion:reduce){
  .acf-mission .mission{ height:auto; padding:clamp(84px,14vh,160px) var(--pad) }
  .acf-mission .mission-sticky{ position:static; height:auto }
  .acf-mission .mw{ color:var(--white); transition:none }
  .acf-mission .mw.yellow{ color:var(--yellow) }
}


/* ============================================================================
   08 · ABOUT
   ============================================================================ */

/* ============================================================
   DESIGN TOKENS — scoped to the wrapper
   ============================================================ */
.acf-about{
  --black:#050505;
  --white:#f5f5f5;
  --white-dim:rgba(245,245,245,.62);
  --yellow:#FFD400;
  --line:rgba(245,245,245,.14);
  --display:'Anton', Impact, sans-serif;
  --body:'Space Grotesk', 'Helvetica Neue', Arial, sans-serif;
  --pad:clamp(20px, 5vw, 72px);

  font-family:var(--body);
  font-size:17px;
  line-height:1.6;
  color:var(--white);
  background:var(--black);
  -webkit-font-smoothing:antialiased;
}

/* scoped resets (do not leak to the rest of the page) */
.acf-about *{margin:0;padding:0;box-sizing:border-box}
.acf-about a{color:inherit;text-decoration:none}
.acf-about ::selection{background:var(--yellow);color:#000}
.acf-about :focus-visible{outline:2px solid var(--yellow);outline-offset:3px}

.acf-about section{padding:clamp(84px,14vh,160px) var(--pad)}

/* small uppercase label + section head */
.acf-about .eyebrow{
  font-size:12px;letter-spacing:.32em;text-transform:uppercase;
  color:var(--white-dim);font-weight:500;
}
.acf-about .section-head{display:flex;align-items:baseline;gap:18px;margin-bottom:clamp(36px,6vh,64px)}
.acf-about .section-head .num{font-family:var(--display);font-size:14px;color:var(--yellow);letter-spacing:.1em}

/* ============================================================
   ABOUT
   ============================================================ */
.acf-about .about-grid{
  display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.6fr);
  gap:clamp(28px,5vw,80px);
}
.acf-about .about-statement{
  font-family:var(--display);text-transform:uppercase;
  font-size:clamp(30px,4.6vw,64px);line-height:1.12;letter-spacing:.01em;
}
.acf-about .about-statement .yellow{color:var(--yellow)}
.acf-about .about-copy{
  color:var(--white-dim);max-width:560px;
  display:flex;flex-direction:column;gap:18px;align-self:end;
}
.acf-about .about-copy strong{color:var(--white);font-weight:700}

/* underlined link */
.acf-about .contact-email{
  display:inline-block;font-size:clamp(18px,2.4vw,26px);font-weight:700;
  border-bottom:2px solid var(--yellow);padding-bottom:4px;transition:color .25s;
}
.acf-about .contact-email:hover,.acf-about .contact-email:focus-visible{color:var(--yellow)}

/* ============================================================
   REVEALS
   ============================================================ */
.acf-about .reveal{opacity:0;transform:translateY(34px);transition:opacity .8s ease,transform .8s ease}
.acf-about .reveal.in{opacity:1;transform:none}
.acf-about .reveal.d1{transition-delay:.08s}

/* ============================================================
   RESPONSIVE
   ============================================================ */
@media (max-width:920px){
  .acf-about .about-grid{grid-template-columns:1fr}
}

/* ============================================================
   REDUCED MOTION
   ============================================================ */
@media (prefers-reduced-motion:reduce){
  .acf-about *,.acf-about *::before,.acf-about *::after{animation:none !important;transition:none !important}
  .acf-about .reveal{opacity:1;transform:none}
}


/* ============================================================================
   09 · SERVICES
   ============================================================================ */

/* Custom props are prefixed (--acf-*) and defined on :root so an expanded
   card keeps them even after the script portals it onto <body>.
   (The fonts these rules use are loaded by the <link> tags in each page
   head — this section used to @import them a second time.) */
:root{
  --acf-black:#050505;
  --acf-black-soft:#0a0a0a;
  --acf-white:#f5f5f5;
  --acf-white-dim:rgba(245,245,245,.62);
  --acf-yellow:#FFD400;
  --acf-line:rgba(245,245,245,.14);
  --acf-display:'Anton', Impact, sans-serif;
  --acf-body:'Space Grotesk', 'Helvetica Neue', Arial, sans-serif;
  --acf-pad:clamp(20px, 5vw, 72px);
}

/* base — scoped so it never touches the rest of the page.
   box-sizing / display are also applied to .svc-card because that
   element is moved out to <body> while expanded. */
.acf-services-widget{
  font-family:var(--acf-body);color:var(--acf-white);
  font-size:17px;line-height:1.6;-webkit-font-smoothing:antialiased;
}
.acf-services-widget *,.acf-services-widget *::before,.acf-services-widget *::after,
.svc-card,.svc-card *,.svc-card *::before,.svc-card *::after{box-sizing:border-box}
.acf-services-widget img,.acf-services-widget svg,
.svc-card img,.svc-card svg{display:block;max-width:100%}
.acf-services-widget ::selection,.svc-card ::selection{background:var(--acf-yellow);color:#000}
.acf-services-widget :focus-visible,
.svc-card:focus-visible,.svc-card :focus-visible{outline:2px solid var(--acf-yellow);outline-offset:3px}
body.acf-svc-locked{overflow:hidden}

/* small uppercase labels */
.acf-services-widget .eyebrow{
  font-size:12px;letter-spacing:.32em;text-transform:uppercase;
  color:var(--acf-white-dim);font-weight:500;margin:0;
}

/* section shell */
.acf-services-widget .services{
  background:#000;
  padding:clamp(84px,14vh,160px) var(--acf-pad) clamp(44px,7vh,80px);
}
.acf-services-widget .section-head{display:flex;align-items:baseline;gap:18px;margin-bottom:clamp(30px,5vh,52px)}
.acf-services-widget .section-head .num{font-family:var(--acf-display);font-size:14px;color:var(--acf-yellow);letter-spacing:.1em}
.acf-services-widget .services-lead{
  max-width:640px;color:var(--acf-white-dim);margin:0 0 clamp(30px,5vh,56px);
  font-size:clamp(15px,1.6vw,19px);
}
.acf-services-widget .services-lead b{color:var(--acf-white);font-weight:700}

/* grid of three portrait cards, hairline seams like the film grid */
.acf-services-widget .services-grid{
  display:grid;grid-template-columns:repeat(3, minmax(0,1fr));
  gap:3px;background:#000;
}
@media (max-width:820px){ .acf-services-widget .services-grid{grid-template-columns:1fr} }

/* slot holds the layout space; the card can leave it to go fullscreen */
.acf-services-widget .svc-slot{position:relative;aspect-ratio:4/5;background:#000}
/* lift the whole slot on hover so the scaled card sits above neighbouring
   cells (a card's own z-index only stacks within its own slot) */
.acf-services-widget .svc-slot:hover{z-index:20}
@media (max-width:820px){ .acf-services-widget .svc-slot{aspect-ratio:16/10} }
/* Reveal state. The finished state lives on .svc-revealed, NOT on an inline
   style: the JS strips its inline transform when the tween ends (a transform
   on .svc-slot would become the containing block for the card's
   position:fixed), and without this class the element would fall back to the
   translateY below and visibly snap back down 34px. */
.acf-services-widget .svc-reveal{
  opacity:0;transform:translateY(34px);
  will-change:opacity,transform;           /* promoted only until it lands */
}
.acf-services-widget .svc-reveal.svc-revealed{
  opacity:1;transform:none;will-change:auto;
}
/* Don't let a hover scale start mid-reveal: while the slot is still sliding
   under the pointer the card would fight the entrance tween. */
.acf-services-widget .svc-slot:not(.svc-revealed) .svc-card{
  transition:none;pointer-events:none;
}

/* -------- card (global: styles must survive being portaled to body) -------- */
.svc-card{
  position:absolute;inset:0;overflow:hidden;cursor:pointer;
  background:#000;
  font-family:var(--acf-body);color:var(--acf-white);line-height:1.6;
  display:flex;flex-direction:column;
}
/* when lifted out to <body> it sits above everything on the page */
.svc-card.svc-portal{position:fixed;z-index:999999}

/* visibility (not just opacity:0) keeps the full-bleed SVG + the
   mix-blend-mode grain layer out of the paint/composite pass while idle.
   Blended layers can't take the fast opacity path, so leaving them merely
   transparent made every scroll-reveal frame re-rasterise three of them.
   The 0s-delayed visibility transition preserves the fade both ways. */
.svc-media{position:absolute;inset:0;opacity:0;visibility:hidden;pointer-events:none;
  transition:opacity .5s ease, visibility 0s linear .5s}
.svc-media svg{position:absolute;inset:0;width:100%;height:100%}
/* dim cinematic preview on hover; full photo when expanded
   (the .svc-open rule is placed AFTER :hover so it wins at equal specificity) */
.svc-card:hover .svc-media{opacity:.5;visibility:visible;transition:opacity .5s ease, visibility 0s}
.svc-card.svc-open .svc-media{opacity:1;visibility:visible;transition:opacity .5s ease, visibility 0s}
.svc-shade{
  position:absolute;inset:0;
  background:linear-gradient(to bottom,
     rgba(5,5,5,.30) 0%, rgba(5,5,5,.10) 34%,
     rgba(5,5,5,.55) 74%, rgba(5,5,5,.92) 100%);
}
.svc-grain{
  position:absolute;inset:0;opacity:.06;pointer-events:none;mix-blend-mode:screen;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='120' height='120'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");
}

.svc-inner{position:relative;z-index:2;height:100%;width:100%;display:flex;flex-direction:column;padding:clamp(20px,2.4vw,40px)}
.svc-inner-pad{max-width:1200px;width:100%;margin:0 auto;display:flex;flex-direction:column;height:100%}

.svc-top{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:clamp(16px,2vw,26px)}
.svc-num{font-family:var(--acf-display);letter-spacing:.06em;line-height:1;font-size:clamp(30px,3.4vw,48px);color:var(--acf-yellow)}
.svc-icon{width:clamp(46px,4.6vw,68px);height:clamp(46px,4.6vw,68px);color:var(--acf-white);flex:none}
/* fullscreen: float the animated icon to top-center, clear of the close button */
.svc-card.svc-open .svc-top{justify-content:center}
.svc-card.svc-open .svc-num{display:none}

.svc-title{font-family:var(--acf-display);text-transform:uppercase;line-height:.96;letter-spacing:.01em;font-size:clamp(26px,3vw,40px);margin:0}
.svc-kicker{font-size:11px;letter-spacing:.3em;text-transform:uppercase;color:var(--acf-yellow);margin:0 0 10px}

.svc-desc{margin:20px 0 0;max-width:64ch;color:var(--acf-white-dim);font-size:clamp(16px,1.5vw,22px);line-height:1.55;opacity:0;visibility:hidden}
.svc-desc b{color:var(--acf-white);font-weight:700}
.svc-meta{margin-top:auto;display:flex;flex-wrap:wrap;gap:10px;padding-top:26px;opacity:0;visibility:hidden}
/* while closed, take desc + meta out of flow so they don't push the CTA
   past the card's clipped edge; they return (and animate) when expanded */
.svc-card:not(.svc-open) .svc-desc,
.svc-card:not(.svc-open) .svc-meta{display:none}
.svc-tag{font-size:12px;letter-spacing:.22em;text-transform:uppercase;font-weight:500;color:var(--acf-white-dim);border:1px solid var(--acf-line);padding:8px 14px}

/* CTA — fades/rises in on hover so the card clearly reads as clickable */
.svc-cta{
  margin:auto 0 0;align-self:flex-start;display:inline-flex;align-items:center;gap:10px;
  background:var(--acf-yellow);color:#000;font-family:var(--acf-body);font-weight:700;
  font-size:11px;letter-spacing:.2em;text-transform:uppercase;padding:12px 18px;
  opacity:0;transform:translateY(12px);
  transition:opacity .4s ease,transform .4s ease;
}
.svc-cta-arrow{transition:transform .3s ease}
.svc-card:hover .svc-cta{opacity:1;transform:translateY(0)}
.svc-card:hover .svc-cta-arrow{transform:translateX(4px)}
/* touch devices have no hover — keep the CTA visible there */
@media (hover:none){ .svc-cta{opacity:1;transform:none} }
/* hide it once the card is expanded (description/tags take over) */
.svc-card.svc-open .svc-cta{opacity:0;visibility:hidden}

/* stronger click affordance: expand the whole card on hover */
.svc-card{transition:transform .4s cubic-bezier(.2,.7,.2,1)}
.svc-card:hover{transform:scale(1.04);z-index:5}
.svc-card.svc-open,.svc-card.svc-portal{transform:none}

.svc-card::after{content:"";position:absolute;inset:0;z-index:3;pointer-events:none;box-shadow:inset 0 0 0 1px transparent;transition:box-shadow .3s ease}
.svc-card:hover::after{box-shadow:inset 0 0 0 1px var(--acf-line)}
.svc-card.svc-open::after{box-shadow:none}

.svc-close{
  position:absolute;top:clamp(18px,2vw,30px);right:clamp(18px,2vw,30px);z-index:6;
  display:inline-flex;align-items:center;gap:12px;
  font-family:var(--acf-body);font-size:12px;letter-spacing:.26em;text-transform:uppercase;
  font-weight:700;color:#000;background:var(--acf-yellow);border:0;
  padding:12px 18px;cursor:pointer;opacity:0;visibility:hidden;transition:transform .25s ease;
  -webkit-tap-highlight-color:transparent;
}
/* Lock every interactive state. Generic button :hover/:focus/:active rules
   tint this button, and because the ✕ uses stroke:currentColor that bleeds
   into the icon too — so force it black. The doubled class
   (.svc-close.svc-close) raises specificity above any such rule. */
.svc-close.svc-close,
.svc-close.svc-close:link,.svc-close.svc-close:visited,.svc-close.svc-close:hover,
.svc-close.svc-close:focus,.svc-close.svc-close:active,
.svc-close.svc-close:focus-visible,.svc-close.svc-close:focus-within{
  color:#000 !important;-webkit-text-fill-color:#000 !important;
  background:var(--acf-yellow) !important;
  border:0 !important;text-decoration:none !important;box-shadow:none !important;
}
.svc-close:hover{transform:translateY(-2px)}
.svc-close.svc-close:focus{outline:0 !important}
.svc-close.svc-close:focus-visible{outline:2px solid #000 !important;outline-offset:2px}
.svc-close svg,.svc-close svg *{color:#000 !important;stroke:#000 !important}
.svc-close svg{width:14px;height:14px}

/* ---- animated icon internals (scoped under .svc-icon) ---- */
.svc-icon .stroke{fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.svc-icon .acc{stroke:var(--acf-yellow)}
.svc-icon .fillacc{fill:var(--acf-yellow)}

.svc-icon .ln{transform-origin:left center}
.svc-icon .ln-1{animation:acf-type 3.4s ease-in-out infinite}
.svc-icon .ln-2{animation:acf-type 3.4s ease-in-out infinite .5s}
.svc-icon .ln-3{animation:acf-type 3.4s ease-in-out infinite 1s}
@keyframes acf-type{0%{transform:scaleX(0)}22%{transform:scaleX(1)}72%{transform:scaleX(1)}82%,100%{transform:scaleX(1)}}
.svc-icon .caret{animation:acf-blink 1s steps(1) infinite}
@keyframes acf-blink{50%{opacity:0}}
.svc-icon .nib{animation:acf-nib 3.4s ease-in-out infinite}
@keyframes acf-nib{0%{transform:translateX(0)}22%{transform:translateX(11px)}30%{transform:translateX(0)}52%{transform:translateX(11px)}60%{transform:translateX(0)}82%{transform:translateX(11px)}100%{transform:translateX(0)}}

.svc-icon .reel{transform-box:fill-box;transform-origin:center;animation:acf-spin 3s linear infinite}
.svc-icon .reel-2{animation:acf-spin 3s linear infinite reverse}
@keyframes acf-spin{to{transform:rotate(360deg)}}
.svc-icon .rec{animation:acf-rec 1.4s ease-in-out infinite}
@keyframes acf-rec{0%,100%{opacity:1}50%{opacity:.2}}

.svc-icon .playhead{animation:acf-scrub 3.2s ease-in-out infinite}
@keyframes acf-scrub{0%{transform:translateX(0)}50%{transform:translateX(20px)}100%{transform:translateX(0)}}
.svc-icon .wave rect{animation:acf-vu 1.2s ease-in-out infinite}
.svc-icon .wave rect:nth-child(2){animation-delay:.15s}
.svc-icon .wave rect:nth-child(3){animation-delay:.3s}
.svc-icon .wave rect:nth-child(4){animation-delay:.45s}
@keyframes acf-vu{0%,100%{transform:scaleY(.4)}50%{transform:scaleY(1)}}

@media (prefers-reduced-motion:reduce){
  .acf-services-widget *, .svc-card, .svc-card *{animation:none !important}
  .acf-services-widget .svc-reveal{opacity:1;transform:none;will-change:auto}
  .acf-services-widget .svc-slot .svc-card{pointer-events:auto}
}

/* CSS fallback if GSAP fails to load */
.acf-no-gsap .svc-card.svc-open{position:fixed;inset:0;width:auto;height:auto;z-index:999999;transition:all .5s cubic-bezier(.65,0,.35,1)}
.acf-no-gsap .svc-card.svc-open .svc-media,
.acf-no-gsap .svc-card.svc-open .svc-desc,
.acf-no-gsap .svc-card.svc-open .svc-meta,
.acf-no-gsap .svc-card.svc-open .svc-close{opacity:1;visibility:visible}
.acf-no-gsap .svc-card.svc-open .svc-title{font-size:clamp(48px,12vw,150px)}
.acf-no-gsap .svc-reveal{opacity:1;transform:none;will-change:auto}
.acf-no-gsap .acf-services-widget .svc-slot .svc-card{pointer-events:auto}


/* ============================================================================
   10 · CLIENT LOGOS
   ============================================================================ */

/* ============================================================
   DESIGN TOKENS — scoped to the wrapper
   ============================================================ */
.acf-clients{
  --black:#050505;
  --white:#f5f5f5;
  --white-dim:rgba(245,245,245,.62);
  --yellow:#FFD400;
  --line:rgba(245,245,245,.14);
  --display:'Anton', Impact, sans-serif;
  --body:'Space Grotesk', 'Helvetica Neue', Arial, sans-serif;
  --pad:clamp(20px, 5vw, 72px);

  /* logo slideshow sizing/speed — tweak freely */
  --cell-w:clamp(190px, 19vw, 280px);  /* width of each logo box   */
  --cell-h:150px;                      /* height of each logo box  */
  --logo-max-h:90px;                   /* max logo height in a box */
  --marquee-speed-px:60;               /* scroll speed in px/second */

  font-family:var(--body);
  font-size:17px;
  line-height:1.6;
  color:var(--white);
  background:var(--black);
  -webkit-font-smoothing:antialiased;
}

/* scoped resets (do not leak to the rest of the page) */
.acf-clients *{margin:0;padding:0;box-sizing:border-box}
.acf-clients img{display:block;max-width:100%}
.acf-clients ::selection{background:var(--yellow);color:#000}
.acf-clients :focus-visible{outline:2px solid var(--yellow);outline-offset:3px}

.acf-clients section{padding:clamp(72px,12vh,140px) 0}

/* ============================================================
   HEADING
   ============================================================ */
.acf-clients .clients-title{
  font-family:var(--display);text-transform:uppercase;
  font-size:clamp(28px,5vw,68px);line-height:1.05;letter-spacing:.01em;
  text-align:center;
  padding:0 var(--pad);
  margin-bottom:clamp(36px,6vh,64px);
}
.acf-clients .clients-title .yellow{color:var(--yellow)}

/* ============================================================
   LOGO SLIDESHOW (marquee)
   ============================================================ */
.acf-clients .marquee{
  position:relative;overflow:hidden;width:100%;
  /* soft fade at both edges for a modern look */
  -webkit-mask-image:linear-gradient(90deg, transparent 0, #000 6%, #000 94%, transparent 100%);
          mask-image:linear-gradient(90deg, transparent 0, #000 6%, #000 94%, transparent 100%);
}
.acf-clients .marquee-track{
  display:flex;align-items:center;width:max-content;
  animation:acf-clients-marquee 40s linear infinite; /* duration overridden by JS */
  will-change:transform;
}
.acf-clients .marquee:hover .marquee-track{animation-play-state:paused}
@keyframes acf-clients-marquee{
  from{transform:translateX(0)}
  to{transform:translateX(-50%)}
}

/* identical-size box for every logo */
.acf-clients .logo-cell{
  flex:0 0 auto;
  width:var(--cell-w);height:var(--cell-h);
  margin:0 clamp(8px,1.6vw,22px);
  display:grid;place-items:center;
  border-radius:12px;
  transition:background .3s ease;
}
.acf-clients .logo-cell img{
  max-width:84%;max-height:var(--logo-max-h);
  width:auto;height:auto;object-fit:contain;
  /* highlight behaviour: dimmed by default, bright on hover */
  filter:grayscale(1);opacity:.62;
  transition:filter .3s ease, opacity .3s ease, transform .3s ease;
}
.acf-clients .logo-cell:hover{background:rgba(255,212,0,.06)}
.acf-clients .logo-cell:hover img{
  filter:grayscale(0);opacity:1;transform:scale(1.08);
}

/* empty placeholder cells (shown until you add image URLs) */
.acf-clients .logo-cell--empty{
  border:1px dashed var(--line);
}
.acf-clients .logo-cell--empty span{
  font-size:11px;letter-spacing:.22em;text-transform:uppercase;
  color:var(--white-dim);font-weight:500;
}

/* ============================================================
   REDUCED MOTION — no scroll, calm centred wrap
   ============================================================ */
@media (prefers-reduced-motion:reduce){
  .acf-clients .marquee{-webkit-mask-image:none;mask-image:none;overflow:visible}
  .acf-clients .marquee-track{
    animation:none;width:100%;flex-wrap:wrap;justify-content:center;gap:8px 0;
  }
  .acf-clients .logo-cell img{filter:none;opacity:1}
}


/* ============================================================================
   11 · CONTACT / CTA
   ============================================================================ */

/* ============================================================
   DESIGN TOKENS — scoped to the wrapper
   ============================================================ */
.acf-cta{
  --black:#050505;
  --white:#f5f5f5;
  --white-dim:rgba(245,245,245,.62);
  --yellow:#FFD400;
  --line:rgba(245,245,245,.14);
  --display:'Anton', Impact, sans-serif;
  --body:'Space Grotesk', 'Helvetica Neue', Arial, sans-serif;
  --pad:clamp(20px, 5vw, 72px);
  --marquee-speed-px:90; /* scroll speed in px/second */

  font-family:var(--body);
  font-size:17px;
  line-height:1.6;
  color:var(--white);
  background:var(--black);
  -webkit-font-smoothing:antialiased;
}

/* scoped resets (do not leak to the rest of the page) */
.acf-cta *{margin:0;padding:0;box-sizing:border-box}
.acf-cta a{color:inherit;text-decoration:none}
.acf-cta ::selection{background:var(--yellow);color:#000}
.acf-cta :focus-visible{outline:2px solid var(--yellow);outline-offset:3px}

.acf-cta section{padding:clamp(24px,4vh,48px) 0 clamp(72px,12vh,140px)}

/* small uppercase label */
.acf-cta .eyebrow{
  font-size:12px;letter-spacing:.32em;text-transform:uppercase;
  color:var(--white-dim);font-weight:500;
}
.acf-cta .eyebrow .tick{color:var(--yellow)}

/* ============================================================
   GET STARTED MARQUEE
   ============================================================ */
.acf-cta .marquee{
  overflow:hidden;border-top:1px solid var(--line);border-bottom:1px solid var(--line);
  padding:clamp(18px,3vh,30px) 0;white-space:nowrap;
}
.acf-cta .marquee-track{display:inline-flex;animation:acf-cta-marquee 22s linear infinite;will-change:transform}
.acf-cta .marquee:hover .marquee-track{animation-play-state:paused}
@keyframes acf-cta-marquee{from{transform:translateX(0)}to{transform:translateX(-50%)}}
.acf-cta .marquee a{
  font-family:var(--display);text-transform:uppercase;
  font-size:clamp(48px,9vw,128px);line-height:1;color:var(--yellow);
  padding:0 .35em;display:inline-flex;align-items:center;gap:.3em;
}
.acf-cta .marquee a .hollow{
  color:transparent;-webkit-text-stroke:2px var(--yellow);
}
.acf-cta .marquee a:hover .hollow{color:var(--yellow);-webkit-text-stroke:0}

/* standalone marquee band (between "We make" and "Mission") — a little
   tighter than the full CTA section so it reads as a divider */
.acf-cta-band{background:var(--black)}
.acf-cta-band section{padding:clamp(48px,8vh,90px) 0}

/* ============================================================
   CTA PANEL
   ============================================================ */
.acf-cta .contact-block{
  padding:clamp(44px,7vh,84px) var(--pad) 0;
  /* caps the content measure at 1200px so the form stops stretching on wide
     monitors; below that it stays fully fluid. Matches .svc-inner-pad. */
  max-width:calc(1200px + var(--pad) * 2);
  margin-inline:auto;
}
.acf-cta .contact-block h2{
  font-family:var(--display);text-transform:uppercase;
  font-size:clamp(34px,5vw,68px);line-height:1.08;margin:14px 0 22px;
}
.acf-cta .lede{color:var(--white-dim);max-width:52ch;margin-bottom:38px}
.acf-cta .contact-aside{
  margin-top:clamp(56px,8vh,96px);
  border-top:1px solid var(--line);
  padding-top:clamp(34px,5vh,52px);
}
.acf-cta .contact-rows{
  display:flex;flex-wrap:wrap;align-items:center;
  gap:20px clamp(32px,5vw,80px);
}
.acf-cta .contact-row{display:flex;align-items:center;gap:14px}
.acf-cta .contact-icon{color:var(--yellow);flex:none}
.acf-cta .contact-email{
  display:inline-block;font-size:clamp(16px,1.9vw,20px);font-weight:700;
  border-bottom:2px solid var(--yellow);padding-bottom:4px;transition:color .25s;
}
.acf-cta .contact-email:hover,.acf-cta .contact-email:focus-visible{color:var(--yellow)}

/* ============================================================
   CONTACT FORM
   ============================================================ */
/* inquiry type toggle */
.acf-cta .acf-intent{
  display:grid;grid-template-columns:1fr 1fr;
  border:1px solid var(--line);margin:0 0 38px;
}
.acf-cta .acf-intent-btn{
  font-family:inherit;background:none;border:0;color:inherit;cursor:pointer;
  padding:20px 18px;text-align:left;
  transition:background .25s ease,color .25s ease;
}
.acf-cta .acf-intent-btn + .acf-intent-btn{border-left:1px solid var(--line)}
.acf-cta .acf-intent-title{
  display:block;font-family:var(--display);text-transform:uppercase;
  font-size:clamp(17px,2.2vw,24px);line-height:1.15;letter-spacing:.02em;
  margin-bottom:4px;font-weight:400;
}
.acf-cta .acf-intent-sub{
  display:block;font-size:11px;letter-spacing:.18em;text-transform:uppercase;
  color:var(--white-dim);font-weight:500;
}
.acf-cta .acf-intent-btn[aria-pressed="true"]{background:var(--yellow);color:#000}
.acf-cta .acf-intent-btn[aria-pressed="true"] .acf-intent-sub{color:rgba(0,0,0,.65)}
.acf-cta .acf-intent-btn[aria-pressed="false"]:hover{background:rgba(255,212,0,.06);color:var(--yellow)}

/* fields */
.acf-cta .acf-field{margin-bottom:28px}
.acf-cta .acf-field > label{
  display:block;font-size:12px;letter-spacing:.26em;text-transform:uppercase;
  font-weight:500;color:var(--white-dim);margin-bottom:10px;
}
.acf-cta .acf-req{color:var(--yellow)}
.acf-cta .acf-opt{color:var(--white-dim);letter-spacing:.1em;text-transform:none}

.acf-cta input[type="text"],
.acf-cta input[type="email"],
.acf-cta input[type="tel"],
.acf-cta select,
.acf-cta textarea{
  display:block;width:100%;
  background:transparent;border:0;border-bottom:1px solid var(--line);
  color:var(--white);font-family:var(--body);font-size:17px;line-height:1.5;
  padding:10px 2px 13px;border-radius:0;box-shadow:none;
  transition:border-color .25s ease;
  appearance:none;-webkit-appearance:none;
}
.acf-cta select{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='9' viewBox='0 0 14 9' fill='none'%3E%3Cpath d='M1 1l6 6 6-6' stroke='%23FFD400' stroke-width='2'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 4px center;
  padding-right:32px;cursor:pointer;
}
.acf-cta select option{background:#0a0a0a;color:var(--white)}
.acf-cta textarea{resize:vertical;min-height:120px}
.acf-cta input:hover,.acf-cta select:hover,.acf-cta textarea:hover{border-bottom-color:rgba(245,245,245,.35)}
.acf-cta input:focus,.acf-cta select:focus,.acf-cta textarea:focus{outline:none;border-bottom-color:var(--yellow)}
.acf-cta input::placeholder,.acf-cta textarea::placeholder{color:rgba(245,245,245,.3);opacity:1}

.acf-cta .acf-field.acf-invalid input,
.acf-cta .acf-field.acf-invalid select,
.acf-cta .acf-field.acf-invalid textarea{border-bottom-color:#ff5a3c}
.acf-cta .acf-error-msg{
  display:none;font-size:13px;color:#ff5a3c;margin-top:8px;letter-spacing:.03em;
}
.acf-cta .acf-field.acf-invalid .acf-error-msg{display:block}

.acf-cta .acf-field-row{
  display:grid;grid-template-columns:1fr 1fr;gap:0 clamp(20px,3vw,36px);
}

/* conditional sections */
.acf-cta .acf-mode-section{display:none}
.acf-cta .acf-mode-section.acf-active{display:block}

/* honeypots */
.acf-cta .acf-hp{position:absolute;left:-9999px;top:-9999px;height:0;overflow:hidden}

/* hCaptcha — the widget is a 303px iframe whose size hCaptcha controls, and
   whose contents are clipped, not reflowed, by anything narrower. Constraining
   the iframe therefore cuts hCaptcha's own logo off; it is scaled instead.

   The column is the viewport less 2 x --pad, which is 20px a side below 400px
   wide — so 303px stops fitting at 343px of viewport, and only below that is
   the widget scaled. The height is restated by hand at the same time because a
   transform does not affect layout and the gap below would not close. */
.acf-cta .acf-captcha-field{margin-bottom:8px}
.acf-cta .h-captcha{line-height:0}
@media (max-width:342px){
  .acf-cta .h-captcha{transform:scale(.9);transform-origin:0 0;height:69px}
}

/* submit */
.acf-cta .acf-submit-row{
  margin-top:38px;display:flex;align-items:center;gap:24px;flex-wrap:wrap;
}
.acf-cta .acf-btn-submit{
  display:inline-flex;align-items:center;gap:12px;
  font-family:var(--body);font-size:13px;letter-spacing:.26em;
  text-transform:uppercase;font-weight:700;
  color:#000;background:var(--yellow);border:0;border-radius:0;
  padding:17px 32px;cursor:pointer;transition:transform .25s ease;
}
.acf-cta .acf-btn-submit:hover,
.acf-cta .acf-btn-submit:focus-visible{transform:translateY(-3px);background:var(--yellow);color:#000}
.acf-cta .acf-btn-submit:disabled{opacity:.5;cursor:wait;transform:none}
.acf-cta .acf-submit-note{
  font-size:13px;color:var(--white-dim);max-width:280px;line-height:1.5;
}

/* alerts + success */
.acf-cta .acf-alert{
  display:none;border:1px solid #ff5a3c;color:#ff9a86;
  padding:14px 18px;font-size:14px;margin-bottom:28px;
}
.acf-cta .acf-alert.acf-show{display:block}

.acf-cta .acf-success{display:none;border:1px solid var(--line);padding:clamp(30px,4vw,52px)}
.acf-cta .acf-success.acf-show{display:block}
.acf-cta .acf-success h3{
  font-family:var(--display);text-transform:uppercase;font-weight:400;
  font-size:clamp(28px,4vw,48px);line-height:1.05;margin:14px 0 16px;color:var(--white);
}
.acf-cta .acf-success h3 .acf-y{color:var(--yellow)}
.acf-cta .acf-success p{color:var(--white-dim);max-width:44ch;margin-bottom:24px}
.acf-cta .acf-btn-again{
  font-family:inherit;background:none;border:0;border-bottom:2px solid var(--yellow);
  color:var(--yellow);cursor:pointer;padding:0 0 4px;
  font-size:13px;letter-spacing:.24em;text-transform:uppercase;font-weight:700;
  transition:color .2s ease,border-color .2s ease;
}
.acf-cta .acf-btn-again:hover{color:var(--white);border-color:var(--white)}

/* ============================================================
   REVEALS
   ============================================================ */
.acf-cta .reveal{opacity:0;transform:translateY(34px);transition:opacity .8s ease,transform .8s ease}
.acf-cta .reveal.in{opacity:1;transform:none}
.acf-cta .reveal.d1{transition-delay:.08s}
.acf-cta .reveal.d2{transition-delay:.16s}

/* ============================================================
   RESPONSIVE
   ============================================================ */
@media (max-width:920px){
  .acf-cta .contact-rows{flex-direction:column;align-items:flex-start;gap:18px}
}
@media (max-width:600px){
  .acf-cta .acf-field-row{grid-template-columns:1fr}
}
@media (max-width:520px){
  .acf-cta .acf-intent{grid-template-columns:1fr}
  .acf-cta .acf-intent-btn + .acf-intent-btn{border-left:0;border-top:1px solid var(--line)}
}

/* ============================================================
   REDUCED MOTION
   ============================================================ */
@media (prefers-reduced-motion:reduce){
  .acf-cta *,.acf-cta *::before,.acf-cta *::after{animation:none !important;transition:none !important}
  .acf-cta .marquee-track{transform:none}
  .acf-cta .reveal{opacity:1;transform:none}
}


/* ============================================================================
   12 · TERMS PAGE   (terms.html only)
   ============================================================================ */

/* ============================================================
   DESIGN TOKENS — scoped to the wrapper
   ============================================================ */
.acf-terms{
  --black:#050505;
  --white:#f5f5f5;
  --white-dim:rgba(245,245,245,.62);
  --yellow:#FFD400;
  --line:rgba(245,245,245,.14);
  --display:'Anton', Impact, sans-serif;
  --body:'Space Grotesk', 'Helvetica Neue', Arial, sans-serif;
  --pad:clamp(20px, 5vw, 56px);

  font-family:var(--body);
  font-size:17px;
  line-height:1.6;
  color:var(--white);
  background:var(--black);
  -webkit-font-smoothing:antialiased;
}

/* scoped resets (do not leak to the rest of the page) */
.acf-terms *{margin:0;padding:0;box-sizing:border-box}
.acf-terms a{color:inherit;text-decoration:none}
.acf-terms ::selection{background:var(--yellow);color:#000}
.acf-terms :focus-visible{outline:2px solid var(--yellow);outline-offset:3px}

/* ============================================================
   PAGE LAYOUT
   ============================================================ */
.acf-terms .terms-page{
  max-width:860px;margin:0 auto;
  /* The nav is position:fixed and --nav-h tall, so it floats over whatever is
     at the top of this page. The old value was clamp(48px,9vh,110px), which
     only clears 72px above an 800px-tall viewport — on a laptop with browser
     chrome, or any phone in landscape, "Back to home" sat behind the bar.
     Reserve the bar's height explicitly, then add the breathing room on top. */
  padding:calc(72px + clamp(28px,5vh,60px)) var(--pad) clamp(48px,9vh,110px);
}
.acf-terms .terms-back{
  display:inline-block;margin-bottom:32px;
  font-size:12px;letter-spacing:.24em;text-transform:uppercase;font-weight:500;
  color:var(--white-dim);transition:color .25s;
}
.acf-terms .terms-back:hover,.acf-terms .terms-back:focus-visible{color:var(--yellow)}

.acf-terms .eyebrow{
  font-size:12px;letter-spacing:.32em;text-transform:uppercase;
  color:var(--white-dim);font-weight:500;
}
.acf-terms .eyebrow .tick{color:var(--yellow)}

.acf-terms .terms-head{
  border-bottom:1px solid var(--line);
  padding-bottom:clamp(24px,4vh,40px);
  margin-bottom:clamp(24px,4vh,40px);
}
.acf-terms .terms-head h1{
  font-family:var(--display);text-transform:uppercase;
  font-size:clamp(32px,6vw,64px);line-height:1.05;margin:10px 0 8px;
}
.acf-terms .terms-date{
  font-size:12px;letter-spacing:.2em;text-transform:uppercase;color:var(--white-dim);
}

/* ============================================================
   BODY TYPOGRAPHY
   ============================================================ */
.acf-terms .terms-body{display:flex;flex-direction:column;gap:16px}
.acf-terms .terms-body h3{
  font-family:var(--display);text-transform:uppercase;
  font-size:clamp(16px,1.7vw,21px);letter-spacing:.06em;
  color:var(--yellow);margin-top:30px;margin-bottom:4px;
}
.acf-terms .terms-body p{
  font-size:15px;line-height:1.75;color:rgba(245,245,245,.78);
}
.acf-terms .terms-body a{color:var(--yellow);border-bottom:1px solid rgba(255,212,0,.35)}
.acf-terms .terms-body a:hover{border-bottom-color:var(--yellow)}

/* Lists — used by privacy.html. The scoped reset above zeroes every margin and
   padding, which also strips a list's indent, so the bullets are put back here
   rather than left to the browser default. Yellow markers to match the rules. */
.acf-terms .terms-body ul{
  list-style:disc;margin:2px 0;padding-left:24px;
}
.acf-terms .terms-body li{
  font-size:15px;line-height:1.75;color:rgba(245,245,245,.78);
  margin-bottom:6px;
}
.acf-terms .terms-body li::marker{color:var(--yellow)}


/* ============================================================================
   14 · FOOTER   (shared: all pages)
   ============================================================================ */

/* ============================================================
   DESIGN TOKENS — scoped to the wrapper
   ============================================================ */
.acf-footer{
  --black:#050505;
  --white:#f5f5f5;
  --white-dim:rgba(245,245,245,.62);
  --yellow:#FFD400;
  --line:rgba(245,245,245,.14);
  --display:'Anton', Impact, sans-serif;
  --body:'Space Grotesk', 'Helvetica Neue', Arial, sans-serif;
  --pad:clamp(20px, 5vw, 72px);

  font-family:var(--body);
  font-size:17px;
  line-height:1.6;
  color:var(--white);
  background:var(--black);
  -webkit-font-smoothing:antialiased;
}

/* scoped resets (do not leak to the rest of the page) */
.acf-footer *{margin:0;padding:0;box-sizing:border-box}
.acf-footer a{color:inherit;text-decoration:none}
.acf-footer ::selection{background:var(--yellow);color:#000}
.acf-footer :focus-visible{outline:2px solid var(--yellow);outline-offset:3px}

/* ============================================================
   FOOTER
   ============================================================ */
.acf-footer .footer{
  border-top:1px solid var(--line);
  padding:clamp(48px,8vh,80px) var(--pad) 36px;
}
.acf-footer .footer-word{
  font-family:var(--display);text-transform:uppercase;line-height:.92;
  font-size:clamp(44px,10.5vw,150px);margin-bottom:clamp(32px,6vh,56px);
}
.acf-footer .footer-word .yellow{color:var(--yellow)}
.acf-footer .footer-grid{
  display:flex;flex-wrap:wrap;gap:24px 56px;justify-content:space-between;
  border-top:1px solid var(--line);padding-top:28px;
}
.acf-footer .footer-grid nav{display:flex;flex-wrap:wrap;gap:14px 28px}
.acf-footer .footer-grid a{
  font-size:12px;letter-spacing:.24em;text-transform:uppercase;font-weight:500;
  color:var(--white-dim);transition:color .25s;
}
.acf-footer .footer-grid a:hover,.acf-footer .footer-grid a:focus-visible{color:var(--yellow)}
.acf-footer .footer-legal{
  font-size:12px;color:var(--white-dim);margin-top:48px;letter-spacing:.04em;
}
