/* ============================================================
   shock.css — SITE TEMPLATE (dotshock.ai marketing + suite landing)
   ------------------------------------------------------------
   Requires core.css (foundation: tokens, base, primitives, buttons),
   imported below. This file owns the PUBLIC marketing layer only:
   site header / nav, hero, homepage sections, footer, page chrome.
   Pair with pages.css or services.css per page. Foundation lives in
   core.css (managed on the design branch); edit site styles here.
   ============================================================ */
/* core.css (the foundation) is linked explicitly in every page <head> BEFORE
   this file — it loads in parallel, so no @import here. shock.css = SITE layer. */

/* ============================================================
   SITE HEADER + PRIMARY NAV
   ============================================================ */
/* Utility bar removed — hidden site-wide */
.utilbar { display: none; }

.site-header {
  position: sticky;
  top: 0;
  z-index: 100;
  border-bottom: 1px solid color-mix(in srgb, var(--line) 38%, transparent);
}
/* transparent + frosted glass on EVERY page (matches the intro/homepage look):
   a translucent surface tint with a backdrop blur, applied at all scroll
   positions so the top bar reads the same site-wide.
   blur kept at 12px — visually equivalent to the old 20px at this tint,
   but meaningfully cheaper to repaint on scroll (sticky element = the
   blur recomputes every frame; audit-flagged on low-end mobile).
   CRITICAL: the glass lives on ::before, NEVER on .site-header itself.
   A non-`none` backdrop-filter on the header would make it the containing
   block for the position:fixed mobile nav panel (.primary-nav), clipping the
   panel to the header box instead of the viewport — the mobile menu breaks. */
.site-header::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  background: color-mix(in srgb, var(--surface) 52%, transparent);
  -webkit-backdrop-filter: blur(12px) saturate(1.4);
  backdrop-filter: blur(12px) saturate(1.4);
  transition: background var(--dur) var(--ease), backdrop-filter var(--dur) var(--ease);
}
.site-header .container {
  display: flex;
  align-items: center;
  justify-content: space-between;
  min-height: 104px;
  padding-top: 44px;
  gap: 24px;
}

/* Brand wordmark, red dot & chevron mark now live in core.css (shared logo).
   Only the site-footer size override stays here. */
.footer-brand .brand::after { height: 1.12em; width: 1.267em; margin-left: 0.34em; }

.site-footer { position: relative; overflow: hidden; }
.site-footer .container { position: relative; z-index: 1; }
/* Blurred-photo backdrop: the random image (set by shock.js as --footer-img)
   lives in its own ::before layer so ONLY the photo is blurred and darkened —
   the footer text stays sharp and gets a soft shadow for legibility. */
/* Corner bleed: the random photo (set as --footer-img) bleeds in from the
   bottom-right corner and radial-fades to solid surface across the rest of the
   footer — asymmetric and a touch more alive than a full wash. The photo is
   darkened toward the corner so the newsletter / copyright stay readable. */
.site-footer.has-footer-bg { background-color: var(--surface); }
.site-footer.has-footer-bg::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  background-image:
    radial-gradient(135% 140% at 100% 100%,
      rgba(var(--scrim-rgb), 0.46) 0%,
      rgba(var(--scrim-rgb), 0.64) 26%,
      var(--surface) 56%,
      var(--surface) 100%),
    var(--footer-img, none);
  background-size: cover, cover;
  background-position: center, right bottom;
  background-repeat: no-repeat, no-repeat;
  pointer-events: none;
}
.site-footer.has-footer-bg .footer-top,
.site-footer.has-footer-bg .footer-platforms,
.site-footer.has-footer-bg .footer-bottom,
.site-footer.has-footer-bg .footer-news h3,
.site-footer.has-footer-bg .footer-news p,
.site-footer.has-footer-bg .footer-col--suite h3 {
  /* Legibility halo over the photo backdrop — tracks --scrim-rgb so light
     theme gets a light glow instead of a dark (dark-theme) shadow crushing
     text against a now-bright background. */
  text-shadow: 0 1px 3px rgba(var(--scrim-rgb), 0.72), 0 1px 11px rgba(var(--scrim-rgb), 0.45);
}
.primary-nav ul {
  display: flex;
  align-items: center;
  gap: clamp(18px, 2.4vw, 34px);
}
.primary-nav a {
  font-size: 0.95rem;
  font-weight: 500;
  color: var(--dim);
  position: relative;
  padding-block: 6px;
  transition: color var(--dur) var(--ease);
}
.primary-nav a:hover,
.primary-nav a[aria-current="page"] { color: var(--text); }
.primary-nav a[aria-current="page"]::after {
  content: "";
  position: absolute;
  left: 0; bottom: -2px;
  width: 100%; height: 1px;
  background: var(--red);
}

.header-cta { display: inline-flex; align-items: center; gap: 14px; }

/* Search trigger + sign-in/account link, grouped as one cluster ahead of the
   primary "Start a brief" CTA (injected by search.js + shock.js initAuthLink;
   tighter internal gap than the header-cta gap to the primary button keeps
   the two read as a pair). */
.header-utils { display: inline-flex; align-items: center; gap: 6px; }

/* .shock Suite trigger button in site header.
   Red TEXT on a dark surface → --red-strong, not --red: base --red sits at
   ~3.1:1 there and fails AA. The old #cc1e1e / #e03030 pair also drifted off
   the brand axis (hue 0, G=B — the pink/salmon axis) where every brand red
   sits at hue 359 with B>G. See PRODUCT.brand.md "Colour tokens". */
.suite-trigger{
  display:inline-flex;align-items:center;gap:6px;
  padding:6px 12px;border-radius:7px;
  color:var(--red-strong);border:1.5px solid color-mix(in srgb, var(--red) 35%, transparent);
  background:color-mix(in srgb, var(--red) 7%, transparent);
  font-size:12px;font-weight:700;letter-spacing:.2px;
  text-decoration:none;transition:all .18s ease;
  white-space:nowrap;
}
.suite-trigger:hover{
  background:color-mix(in srgb, var(--red) 15%, transparent);
  border-color:color-mix(in srgb, var(--red) 60%, transparent);
  color:var(--red-strong);
}
.suite-trigger svg{flex-shrink:0}

/* Mobile nav toggle */
.nav-toggle {
  display: none;
  flex-direction: column;
  justify-content: center;
  gap: 5px;
  width: 44px; height: 44px;
  background: none;
  border: 1px solid var(--line2);
  border-radius: var(--radius);
  padding: 0 11px;
}
.nav-toggle span {
  display: block;
  height: 1.5px;
  width: 100%;
  background: var(--text);
  transition: transform var(--dur) var(--ease), opacity var(--dur) var(--ease);
}
.nav-toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(6.5px) rotate(45deg); }
.nav-toggle[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.nav-toggle[aria-expanded="true"] span:nth-child(3) { transform: translateY(-6.5px) rotate(-45deg); }

@media (max-width: 880px) {
  .nav-toggle { display: flex; }
  /* .nav-close (injected inside the open panel) renders almost exactly on top
     of this button — both draw an × at once, reading as a doubled/garbled
     icon. .nav-close fully covers the close action once open, so hide this one. */
  .nav-toggle[aria-expanded="true"] { visibility: hidden; }
  .header-cta .btn--primary { display: none; }

  /* (13) Reclaim dead vertical space: the 44px top padding only cleared the
     utility bar, which is display:none on mobile. Shrink the header so it stops
     eating ~148px of the first screen on phones. */
  .site-header .container { min-height: 64px; padding-top: 14px; gap: 14px; }
  .site-header.is-scrolled .container { min-height: 64px; }

  .primary-nav {
    position: fixed;
    inset: 0 0 0 auto;
    width: min(82vw, 340px);
    background: var(--panel);
    border-left: 1px solid var(--line);
    transform: translateX(100%);
    transition: transform var(--dur) var(--ease);
    padding: 92px var(--gutter) var(--gutter);
    overflow-y: auto;
  }
  .primary-nav.is-open { transform: translateX(0); }
  .primary-nav ul {
    flex-direction: column;
    align-items: stretch;
    gap: 4px;
  }
  .primary-nav a {
    font-size: 1.2rem;
    padding: 14px 0;
    border-bottom: 1px solid var(--line);
    color: var(--text);
  }
  .nav-scrim {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.5);
    opacity: 0;
    visibility: hidden;
    transition: opacity var(--dur) var(--ease), visibility var(--dur) var(--ease);
    z-index: 99;
  }
  .nav-scrim.is-open { opacity: 1; visibility: visible; }
}

/* ============================================================
   1. HERO — full-viewport showreel
   ============================================================ */
.hero {
  position: relative;
  min-height: clamp(520px, 82vh, 860px); /* Flagship tier — synced with .page-hero--flagship */
  display: flex;
  align-items: flex-end;
  overflow: hidden;
  background: var(--surface);
  border-bottom: 1px solid var(--line);
}
@media (max-width: 720px) {
  .hero { min-height: clamp(440px, 72vh, 600px); }
}
.hero__media {
  position: absolute;
  inset: 0;
  z-index: 0;
}
.hero__media video,
.hero__poster {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* Poster placeholder = intentional gradient until owner supplies media —
   built entirely from theme tokens so it reads as a neutral "loading" tone
   in light theme too, not a hardcoded dark-theme leftover. */
.hero__poster {
  background:
    radial-gradient(120% 90% at 70% 10%, var(--panel3) 0%, var(--surface) 60%),
    linear-gradient(180deg, var(--panel2) 0%, var(--surface) 100%);
}
.hero__scrim {
  position: absolute;
  inset: 0;
  z-index: 1;
  background:
    linear-gradient(180deg, rgba(12,12,15,0.35) 0%, rgba(12,12,15,0.15) 38%, rgba(12,12,15,0.92) 100%),
    linear-gradient(90deg, rgba(12,12,15,0.7) 0%, rgba(12,12,15,0) 55%);
}
.hero__inner {
  position: relative;
  z-index: 2;
  width: 100%;
  padding-block: clamp(48px, 8vh, 96px);
}
.hero__content { max-width: 760px; }
/* readability over the showreel video */
.hero__kicker, .hero h1, .hero__sub {
  text-shadow: 0 2px 10px rgba(0,0,0,0.62), 0 1px 28px rgba(0,0,0,0.45);
}

/* ---- video showreel (homepage hero + intro overlay) ----
   Muted, randomly-mixed loop of the studio's real clips, driven by
   videoreel.js. Two stacked <video> layers crossfade; a still poster sits
   underneath (and is all that shows in reduced-motion / Save-Data modes). */
.vreel { position: absolute; inset: 0; overflow: hidden; background: #0c0c0f; }
.hero__media .vreel { z-index: 1; }            /* sit above the gradient .hero__poster fallback */
.vreel__poster {
  position: absolute; inset: 0;
  background-size: cover; background-position: center; background-repeat: no-repeat;
}
.vreel__v {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
  opacity: 0;
  transition: opacity 0.9s ease;
  will-change: opacity; backface-visibility: hidden;
}
.vreel__v.is-on { opacity: 1; }
.vreel--cut .vreel__v { transition: opacity 0.28s ease; }   /* mobile: quicker, lighter cuts */
.vreel--bg { pointer-events: none; }
@media (prefers-reduced-motion: reduce) {
  .vreel__v { transition: none; }
}
.hero h1 {
  font-size: clamp(2.5rem, 6.4vw, 5rem);
  font-weight: 800;
  letter-spacing: -0.035em;
  line-height: 0.98;
}
.hero__sub {
  margin-top: 22px;
  font-size: clamp(1.05rem, 2vw, 1.32rem);
  color: var(--text);
  font-weight: 400;
  max-width: 52ch;
}
.hero__cta { margin-top: 34px; display: flex; align-items: center; gap: 18px; flex-wrap: wrap; }

/* mono kicker above headline */
.hero__kicker {
  font-family: var(--font-mono);
  font-size: 12.5px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--dim);
  margin-bottom: 20px;
  display: flex;
  align-items: center;
  gap: 12px;
}
.hero__kicker::before {
  content: "";
  width: 28px; height: 1px;
  background: var(--red);
}

/* play/pause control for the showreel */
.reel-toggle {
  position: absolute;
  z-index: 3;
  right: var(--gutter);
  bottom: clamp(24px, 5vh, 48px);
  display: inline-flex;
  align-items: center;
  gap: 9px;
  font-family: var(--font-mono);
  font-size: 11.5px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.72);
  background: color-mix(in srgb, var(--surface) 14%, transparent);
  border: 1px solid color-mix(in srgb, var(--line) 30%, transparent);
  border-radius: 999px;
  padding: 8px 14px;
  -webkit-backdrop-filter: blur(20px) saturate(1.4);
  backdrop-filter: blur(20px) saturate(1.4);
}
.reel-toggle:hover {
  color: #fff;
  background: color-mix(in srgb, var(--surface) 28%, transparent);
  border-color: color-mix(in srgb, var(--line) 55%, transparent);
}
.reel-toggle .dot-ind {
  width: 7px; height: 7px; border-radius: 50%;
  background: var(--green);
}
.reel-toggle[data-state="paused"] .dot-ind { background: var(--faint); }

/* ============================================================
   2. PROOF STRIP
   ============================================================ */
.proof {
  border-bottom: 1px solid var(--line);
  background: var(--panel);
}
.proof .container {
  display: grid;
  grid-template-columns: auto 1fr;
  align-items: center;
  gap: clamp(28px, 5vw, 72px);
  padding-block: clamp(36px, 5vw, 56px);
}
.proof__label {
  font-family: var(--font-mono);
  font-size: 12px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--dim);
  max-width: 16ch;
}
.proof__logos {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: clamp(24px, 4vw, 56px);
}
/* text wordmark placeholders — no real platform logos shipped */
.platform-wordmark {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1rem, 1.7vw, 1.25rem);
  letter-spacing: -0.01em;
  color: var(--dim);
  display: inline-flex;
  align-items: baseline;
  gap: 0.3em;
  transition: color var(--dur) var(--ease);
  white-space: nowrap;
}
.platform-wordmark .pw-mark { color: var(--faint); font-weight: 800; }
.proof:hover .platform-wordmark { color: var(--text); }
.proof__stat {
  grid-column: 1 / -1;
  margin-top: 6px;
  font-family: var(--font-mono);
  font-size: 13px;
  color: var(--text);
  letter-spacing: 0.02em;
}
.proof__stat b { color: var(--text); font-weight: 500; }
.proof__stat .sep { color: var(--red); padding-inline: 8px; }

@media (max-width: 720px) {
  .proof .container { grid-template-columns: 1fr; gap: 22px; }
  .proof__label { max-width: none; }
}

/* ============================================================
   3. WORK GRID — 8 collection tiles
   ============================================================ */
.work-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 1px;
  background: var(--line);
  border: 1px solid var(--line);
}
.work-tile {
  position: relative;
  display: block;
  background: var(--panel);
  aspect-ratio: 4 / 5;
  overflow: hidden;
  isolation: isolate;
}
/* Placeholder cover — intentional, labelled, swappable.
   Owner replaces by setting a background-image via data-cover or inline style. */
.work-tile__cover {
  position: absolute;
  inset: 0;
  background:
    linear-gradient(155deg, var(--ph-a, var(--panel3)) 0%, var(--ph-b, var(--panel)) 100%);
  z-index: 0;
  transition: transform 0.5s var(--ease);
}
.work-tile__cover::after {
  /* faint diagonal texture so the placeholder reads as intentional */
  content: "";
  position: absolute;
  inset: 0;
  background-image: radial-gradient(circle, rgba(255,255,255,0.05) 1px, transparent 1px);
  background-size: 18px 18px;
}
.work-tile:hover .work-tile__cover { transform: scale(1.045); }
.work-tile__scrim {
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(180deg, rgba(12,12,15,0) 30%, rgba(12,12,15,0.88) 100%);
}
.work-tile__meta {
  position: absolute;
  z-index: 2;
  inset: auto 0 0 0;
  padding: 20px;
  display: flex;
  flex-direction: column;   /* tag / title / hook each on its own row (4 rows total) */
}
.work-tile__tag {
  font-family: var(--font-mono);
  font-size: 10.5px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--dim);
  margin-bottom: 8px;
}
.work-tile__title {
  font-size: 1.12rem;
  font-weight: 700;
  letter-spacing: -0.015em;
}
.work-tile__hook {
  margin-top: 5px;
  font-size: 0.88rem;
  color: var(--dim);
  line-height: 1.45;
}
.work-tile__ph-note {
  position: absolute;
  z-index: 2;
  top: 14px; left: 14px;
  font-family: var(--font-mono);
  font-size: 9.5px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--faint);
  border: 1px dashed var(--line2);
  border-radius: 3px;
  padding: 3px 6px;
  opacity: 0.7;
}

@media (max-width: 980px) {
  .work-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 520px) {
  .work-grid { grid-template-columns: 1fr; }
  .work-tile { aspect-ratio: 16 / 11; }
}

/* ------------------------------------------------------------
   3a. CASE-STUDY LEAD CARDS
   The homepage used to open its work section with eight genre
   tiles ("Gulf lifestyle", "Endurance & action") — a stock-library
   taxonomy, where every comparable studio leads with named
   productions. These three cards put the written case studies
   first and carry the thing a buyer actually scans for: what
   was briefed and what was delivered.
   ------------------------------------------------------------ */
.cs-lead {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1px;
  background: var(--line);
  border: 1px solid var(--line);
  margin-bottom: 30px;
}
.cs-lead__card {
  display: flex;
  flex-direction: column;
  background: var(--panel);
  color: inherit;
  text-decoration: none;
  transition: background 0.18s var(--ease);
}
.cs-lead__card:hover { background: var(--panel3, var(--panel)); }
.cs-lead__cover {
  display: block;
  aspect-ratio: 16 / 10;
  overflow: hidden;
}
.cs-lead__cover img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 0.5s var(--ease);
}
.cs-lead__card:hover .cs-lead__cover img { transform: scale(1.045); }
.cs-lead__body {
  display: flex;
  flex-direction: column;
  gap: 9px;
  padding: 22px 20px 20px;
  flex: 1;
}
.cs-lead__tag {
  font-family: var(--font-mono);
  font-size: 10.5px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--accent, #cc1e1e);
}
.cs-lead__title {
  font-size: 1.15rem;
  font-weight: 700;
  letter-spacing: -0.015em;
  line-height: 1.25;
}
.cs-lead__brief {
  font-size: 0.9rem;
  color: var(--dim);
  line-height: 1.55;
}
/* The deliverable spec — the part competitors show and this page didn't. */
.cs-lead__shipped {
  display: block;
  margin-top: 3px;
  padding-top: 13px;
  border-top: 1px solid var(--line);
  font-size: 0.84rem;
  line-height: 1.6;
  color: var(--dim);
}
.cs-lead__shipped b {
  display: block;
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--faint);
  margin-bottom: 6px;
}
.cs-lead__more {
  margin-top: auto;
  padding-top: 14px;
  font-size: 0.86rem;
  font-weight: 600;
  color: var(--text);
}
.cs-lead__card:hover .cs-lead__more { color: var(--accent, #cc1e1e); }
.cs-lead__note {
  font-size: 0.82rem;
  color: var(--faint);
  max-width: 78ch;
  margin: 0 0 34px;
}
.work-browse-h {
  font-family: var(--font-mono);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--faint);
  margin: 0 0 14px;
}

@media (max-width: 980px) {
  .cs-lead { grid-template-columns: 1fr; }
  .cs-lead__cover { aspect-ratio: 21 / 9; }
}

/* ------------------------------------------------------------
   4b. CLEARED — rights & licensing band
   ------------------------------------------------------------ */
.cleared-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1px;
  background: var(--line);
  border: 1px solid var(--line);
}
.cleared-item {
  background: var(--panel);
  padding: 26px 24px 28px;
}
.cleared-item h3 {
  font-size: 1.02rem;
  font-weight: 700;
  letter-spacing: -0.01em;
  margin: 0 0 10px;
}
.cleared-item p {
  font-size: 0.9rem;
  color: var(--dim);
  line-height: 1.6;
  margin: 0;
}
.cleared-item b { color: var(--text); font-weight: 600; }

/* Strategic-advantages band — the same component at four across, plus the
   line that carries each advantage's source. The source line is not
   decoration: an advantage may only be published with a real fact behind it
   (advantages-api.js enforces it on write), so showing the fact is what
   separates this band from a features grid. Generated between the
   ADV:BAND markers by tools/build-advantages.mjs — edit the registry at
   /admin/advantages.html, not the markup. */
.cleared-grid--4up { grid-template-columns: repeat(4, 1fr); }
.cleared-item__src {
  margin: 12px 0 0;
  padding-top: 11px;
  border-top: 1px dashed var(--line2, var(--line));
  font-size: 0.78rem;
  line-height: 1.55;
  color: var(--faint);
}
.cleared-item__src b { color: var(--dim); font-weight: 500; }
@media (max-width: 1120px) { .cleared-grid--4up { grid-template-columns: repeat(2, 1fr); } }

@media (max-width: 860px) {
  .cleared-grid { grid-template-columns: 1fr; }
}

/* ------------------------------------------------------------
   9. HOMEPAGE FAQ — the objection block.
   /faq/ styles .faq-list itself, page-scoped; this variant is
   namespaced so the two never collide.
   ------------------------------------------------------------ */
.faq-list--home { max-width: 820px; }
.faq-list--home .faq-q {
  border-bottom: 1px solid var(--line);
}
.faq-list--home .faq-q > summary {
  list-style: none;
  cursor: pointer;
  padding: 18px 34px 18px 0;
  position: relative;
  font-size: 1rem;
  font-weight: 600;
  color: var(--text);
}
.faq-list--home .faq-q > summary::-webkit-details-marker { display: none; }
.faq-list--home .faq-q > summary::after {
  content: "+";
  position: absolute;
  right: 6px;
  top: 50%;
  transform: translateY(-50%);
  font-family: var(--font-mono);
  font-size: 1.15rem;
  font-weight: 400;
  color: var(--faint);
  transition: color 0.15s var(--ease);
}
.faq-list--home .faq-q[open] > summary::after { content: "–"; color: var(--accent, #cc1e1e); }
.faq-list--home .faq-q > summary:hover { color: var(--accent, #cc1e1e); }
.faq-list--home .faq-q > summary:focus-visible {
  outline: 2px solid var(--accent, #cc1e1e);
  outline-offset: 3px;
}
.faq-list--home .faq-a {
  padding: 0 0 20px;
  color: var(--dim);
  line-height: 1.65;
  max-width: 64ch;
}

/* ============================================================
   4. SERVICES TILES — 6 photo + 2 video
   ============================================================ */
.services-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 1px;
  background: var(--line);
  border: 1px solid var(--line);
}
.service-tile {
  background: var(--panel);
  padding: 28px 24px 30px;
  display: flex;
  flex-direction: column;
  gap: 12px;
  min-height: 210px;
  transition: background var(--dur) var(--ease);
}
.service-tile:hover { background: var(--panel2); }
.service-tile__icon {
  width: 34px; height: 34px;
  color: var(--text);
}
.service-tile__icon svg { width: 100%; height: 100%; }
.service-tile__name {
  font-size: 1.08rem;
  font-weight: 700;
  letter-spacing: -0.01em;
}
.service-tile__out {
  font-size: 0.92rem;
  color: var(--dim);
  line-height: 1.5;
}
.service-tile__kind {
  margin-top: auto;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--dim); /* informational label — AA contrast (>=4.5:1) */
}
.service-tile--video .service-tile__kind { color: var(--red); }

.services-grid--three { grid-template-columns: repeat(3, 1fr); }

@media (max-width: 980px) {
  .services-grid,
  .services-grid--three { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 520px) {
  .services-grid,
  .services-grid--three { grid-template-columns: 1fr; }
}

/* ============================================================
   5. VIDEO STRIP
   ============================================================ */
.video-strip {
  background: var(--panel);
  border-block: 1px solid var(--line);
}
.video-strip .container {
  display: grid;
  grid-template-columns: 1.3fr 1fr;
  gap: clamp(32px, 6vw, 80px);
  align-items: center;
  padding-block: clamp(56px, 8vw, 96px);
}
.video-strip h2 {
  font-size: clamp(1.8rem, 4vw, 2.9rem);
  font-weight: 800;
}
.video-strip p {
  margin-top: 18px;
  color: var(--dim);
  font-size: 1.05rem;
  max-width: 48ch;
}
.video-strip__cta { margin-top: 28px; }
/* Real photo+video media card (assets/js/showreel-toggle.js) — the wrapper
   just gives it a sane min-width in the two-column grid; the card itself
   brings its own border/background via the script's injected styles. */
.video-strip__media { min-width: 0; }

@media (max-width: 820px) {
  .video-strip .container { grid-template-columns: 1fr; }
  .video-strip__media { order: -1; }
}

/* ============================================================
   6. ABOUT STRIP
   ============================================================ */
.about-strip .container {
  display: grid;
  grid-template-columns: 0.85fr 1.15fr;
  gap: clamp(32px, 6vw, 72px);
  align-items: center;
}
.about-portrait {
  position: relative;
  aspect-ratio: 4 / 5;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  overflow: hidden;
  background:
    linear-gradient(160deg, #1d1d25 0%, #0e0e13 100%);
}
.about-portrait::after {
  content: "";
  position: absolute;
  inset: 0;
  background-image: radial-gradient(circle, rgba(255,255,255,0.05) 1px, transparent 1px);
  background-size: 18px 18px;
}
.about-portrait .ph-note {
  position: absolute;
  z-index: 2;
  bottom: 14px; left: 14px;
  font-family: var(--font-mono);
  font-size: 9.5px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--faint);
  border: 1px dashed var(--line2);
  border-radius: 3px;
  padding: 3px 6px;
}
.about-portrait__video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  z-index: 1;
}
/* agency credibility grid — centered logos, label above, stat right-aligned below */
.agency-grid {
  display: flex;
  flex-direction: column;
  gap: 14px;
  padding-block: 20px;
  border-bottom: 1px solid var(--line);
}
.agency-label {
  font-size: 0.67rem;
  font-family: var(--font-mono);
  color: var(--faint);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  width: 100%;
  text-align: left;
}
.agency-row {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: center;
  gap: 16px 22px;
}
.agency-link {
  display: inline-flex; align-items: center;
  border: none; padding: 0; text-decoration: none;
  transform-origin: center bottom; will-change: transform;
  transition: transform 0.14s var(--ease), filter 0.2s var(--ease);
}
/* black-and-white logos, toned light grey; full colour on hover */
.agency-link img {
  width: 32px; height: 32px;
  display: block; background: none; object-fit: contain;
  filter: grayscale(1) brightness(1.4) opacity(0.72);
  transition: filter 0.2s var(--ease);
}
.agency-link:hover img { filter: grayscale(0) brightness(1) opacity(1); }
/* Text fallback for an agency with no usable artwork in AGENCY_LOGOS (shock.js
   renders the name instead of a broken image), so a future addition degrades to
   a readable name. */
.agency-name {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--dim);
  white-space: nowrap;
}
.agency-link:hover .agency-name { color: var(--text); }
.agency-stat {
  width: 100%;
  text-align: right;
  font-family: var(--font-mono);
  font-size: 0.85rem;
  color: var(--text);
  letter-spacing: 0.02em;
  margin: 4px 0 0;
}
.agency-stat b { color: var(--text); font-weight: 500; }
.agency-stat .sep { color: var(--red); padding-inline: 8px; }

/* ---- clients wall — continuous horizontal marquee, compact logos ---- */
.proof--clients .container { display: block; padding-block: 2px 8px; }
.proof--clients .proof__label {
  max-width: none; white-space: normal; text-align: left; margin: 0 0 6px;
}
.proof__more {
  margin: 18px 0 0;
  font-family: var(--font-mono);
  font-size: 12px;
  letter-spacing: 0.06em;
}
.proof__more a { color: var(--dim); text-decoration: none; }
.proof__more a:hover { color: var(--text); }
.proof__more .arrow { color: var(--red); }
.proof__note {
  margin: 14px 0 0;
  color: var(--dim);
  font-size: 12px;
  line-height: 1.5;
  max-width: 62ch;
}
.proof__note a { color: var(--dim); text-decoration: underline; text-underline-offset: 2px; }
.proof__note a:hover { color: var(--text); }
/* Homepage variant: CTA + disclaimer joined on one row — CTA left,
   disclaimer right at a smaller size. Wraps to two stacked rows on
   narrow viewports (the note keeps its right alignment). */
.proof__foot {
  display: flex; align-items: baseline; justify-content: space-between;
  flex-wrap: wrap; gap: 10px 24px; margin-top: 8px;
}
.proof__foot .proof__more, .proof__foot .proof__note { margin: 0; }
.proof__foot .proof__note { font-size: 11px; text-align: right; margin-left: auto; }
#verified { scroll-margin-top: 96px; }
/* Full-bleed marquee: logos scroll continuously in a single row, large enough
   to be recognised at a glance. Hover pauses the scroll and colour-reveals the
   brand. Reduced-motion: animation stops, logos visible at rest. */
/* The belt breaks out of .container to run edge-to-edge. `100vw` counts the
   vertical scrollbar but the container's width does not, so on any page that
   scrolls the belt ends up wider than the viewport's content box and the whole
   document picks up a scrollbar's worth of horizontal scroll — most obvious on
   mobile, where it reads as the page wobbling sideways. Clipping on the section
   contains the bleed; `clip` rather than `hidden` so this never becomes a
   scroll container and starts capturing sticky/anchor behaviour. */
.proof--clients { overflow-x: clip; }
.clients {
  box-sizing: border-box;
  width: 100vw;
  margin-left: calc(50% - 50vw);
  overflow: hidden;
  -webkit-mask-image: linear-gradient(to right, transparent 0%, #000 7%, #000 93%, transparent 100%);
  mask-image: linear-gradient(to right, transparent 0%, #000 7%, #000 93%, transparent 100%);
  opacity: 0; transform: translateY(8px);
  transition: opacity 0.5s var(--ease), transform 0.5s var(--ease);
}
.clients.is-in { opacity: 1; transform: none; }
.clients__belt {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  gap: 7px;
  width: max-content;
  padding-block: 12px;   /* headroom so the dock-magnified cell never clips */
  animation: clients-scroll 90s linear infinite;
}
@keyframes clients-scroll {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }
}
@media (prefers-reduced-motion: reduce) { .clients__belt { animation: none; } }
.clients:hover .clients__belt,
.clients:focus-within .clients__belt { animation-play-state: paused; }
.client-logo {
  flex-shrink: 0;
  width: 40px; height: 40px;
  display: flex; align-items: center; justify-content: center;
  padding: 3px; border-radius: 6px;
  background: transparent;
  border: none;
  text-decoration: none;
  overflow: hidden;
  transform-origin: center center; will-change: transform;
  /* transform is driven live by the JS dock magnifier (clients.js) — no transition
     on it so it tracks the cursor instantly; only bg/shadow ease. */
  transition: background 0.18s var(--ease), box-shadow 0.18s var(--ease);
}
.client-logo:hover {
  background: rgba(255,255,255,0.92);
  box-shadow: 0 4px 18px rgba(0,0,0,0.4);
}
/* smooth zoom-out when the pointer leaves the belt */
.clients__belt.dock-reset .client-logo { transition: transform 0.24s var(--ease), background 0.18s var(--ease), box-shadow 0.18s var(--ease); }
.client-logo img {
  width: 82%; height: 82%; object-fit: contain;
  filter: invert(1) grayscale(1) brightness(1.05) opacity(0.75);
  transition: filter 0.18s var(--ease);
  backface-visibility: hidden;
  will-change: filter;
  transform: translateZ(0);
}
.client-logo:hover img { filter: none; }
/* Fallback chip for a client whose logo never resolved. Deliberately tiny —
   it is read through the dock magnifier, not at rest. Colour comes off --faint
   rather than a 35%-white wash so it reads as recessive texture instead of a
   half-failed render; the belt still carries the full name via aria-label for
   touch and screen readers, where the magnifier never fires. */
.client-name {
  font-family: var(--font-mono);
  font-size: 7px; line-height: 1.2; letter-spacing: 0.01em;
  text-align: center; color: var(--faint);
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical;
  overflow: hidden; word-break: break-word; hyphens: auto;
  padding: 0 2px;
  transition: color 0.18s var(--ease);
}
.client-logo:hover .client-name { color: rgba(0,0,0,0.65); }
@media (max-width: 820px)  { .clients__belt { gap: 6px; padding-block: 10px; } .client-logo { width: 36px; height: 36px; } }
@media (max-width: 540px)  { .clients__belt { padding-block: 9px; } .client-logo { width: 32px; height: 32px; } }

/* footer Suite block (injected by initFooterSuite) — spans the full footer
   width and lists every module in a single horizontal row (wraps only when the
   viewport is too narrow to fit them). flex-direction:row resets the column
   direction the base .footer-col ul rule sets for the other footer lists. */
.footer-top .footer-col--suite { grid-column: 1 / -1; }
.footer-top .footer-col--suite ul {
  display: flex;
  flex-direction: row;               /* resets the column direction the base .footer-col ul rule sets */
  flex-wrap: wrap;                   /* 18 entries never fit on one line */
  align-items: center;
  justify-content: flex-start;
  gap: 6px 14px;
}
.footer-col--suite li { break-inside: auto; }
/* Heading: ".shock.SUITE" on ONE line, "WEB APPS" on the line below.
   (NOT flex-column — that splits the dotted title into one item per fragment.) */
.footer-top .footer-col--suite h3 {
  display: block;
  white-space: nowrap;               /* never break ".shock.SUITE" */
  text-transform: none;              /* render ".shock.SUITE" as written, not all-caps */
  line-height: 1.2;
}
.footer-col--suite h3 .dot { color: var(--red); }
.footer-col--suite h3 .suite-label-sub { display: block; margin-top: 3px; font-size: 10px; letter-spacing: 0.10em; text-transform: uppercase; color: var(--faint); font-weight: 400; }
.footer-top .footer-col--suite a { white-space: nowrap; font-size: 12.5px; }
/* The footer Software column is ONE flat list — modules then platforms, no
   phase sub-headings. The Preproduction / Production / Postproduction grouping
   still exists in the top-bar Software dropdown (.suite-dd-*), which is where
   the pipeline story belongs; the footer is a navigation map. */
.footer-col--suite a .dot { color: var(--red); }

/* newsletter: email field + submit merged into ONE pill, aligned to the right */
.news-input-wrap {
  display: flex;
  align-items: stretch;
  width: 100%;
  max-width: 420px;
  margin-left: auto;                 /* push the field to the right of its container */
  background: var(--panel2);
  border: 1px solid var(--line2);
  border-radius: 8px;
  overflow: hidden;
  transition: border-color 0.2s var(--ease), box-shadow 0.2s var(--ease);
}
.news-input-wrap:focus-within { border-color: var(--text); box-shadow: 0 0 0 3px rgba(255,255,255,0.06); }
.news-input-wrap .input {
  flex: 1 1 auto;
  min-width: 0;
  border: none;
  background: transparent;
  border-radius: 0;
  box-shadow: none;
  padding: 0.72em 0.95em;
  color: var(--text);
}
.news-input-wrap .input:focus, .news-input-wrap .input:focus-visible { outline: none; box-shadow: none; }
.news-input-wrap .btn--primary {
  position: static;
  flex: none;
  transform: none;
  margin: 0;
  border: none;
  border-radius: 0;
  font-size: 0.78rem;
  padding: 0 1.15em;
  white-space: nowrap;
}
.news-input-wrap .btn--primary:hover { transform: none; }
.about-body h2 {
  font-size: clamp(1.7rem, 3.8vw, 2.7rem);
  font-weight: 800;
}
.about-body p {
  margin-top: 18px;
  color: var(--dim);
  font-size: 1.08rem;
  line-height: 1.62;
  max-width: 52ch;
}
.about-body p + p { margin-top: 14px; }
.about-body__cta { margin-top: 28px; }

@media (max-width: 820px) {
  .about-strip .container { grid-template-columns: 1fr; }
  .about-portrait { max-width: 360px; }
}

/* ============================================================
   7. PRODUCTION NETWORK STRIP
   ============================================================ */
.network {
  background: var(--panel);
  border-block: 1px solid var(--line);
}
.network .container {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: clamp(28px, 5vw, 64px);
  align-items: center;
  padding-block: clamp(48px, 7vw, 80px);
}
.network h2 {
  font-size: clamp(1.5rem, 3.2vw, 2.2rem);
  font-weight: 700;
  max-width: 22ch;
}
.network p {
  margin-top: 12px;
  color: var(--dim);
  font-size: 1rem;
  max-width: 46ch;
}
.network__ctas { display: flex; gap: 14px; flex-wrap: wrap; }

@media (max-width: 720px) {
  .network .container { grid-template-columns: 1fr; }
}

/* ============================================================
   8. CONTACT CTA — full-width dark section
   ============================================================ */
.contact-cta {
  position: relative;
  background: var(--surface);
  text-align: center;
  overflow: hidden;
}
.contact-cta::before {
  /* single restrained red hairline — frame motif */
  content: "";
  position: absolute;
  left: 50%; top: 0;
  transform: translateX(-50%);
  width: 1px; height: 56px;
  background: var(--red);
}
.contact-cta h2 {
  font-size: clamp(2rem, 5vw, 3.6rem);
  font-weight: 800;
  letter-spacing: -0.03em;
  max-width: 18ch;
  margin-inline: auto;
}
.contact-cta p {
  margin: 20px auto 0;
  color: var(--dim);
  font-size: 1.08rem;
  max-width: 50ch;
}
.contact-cta__cta { margin-top: 36px; }

/* ============================================================
   FOOTER
   ============================================================ */
.site-footer {
  background: var(--panel);
  border-top: 1px solid var(--line);
  padding-block: clamp(32px, 4vw, 52px) 24px;
}
.footer-top {
  display: grid;
  grid-template-columns: 1.4fr 1fr 1fr 1fr 1fr;
  gap: clamp(14px, 2vw, 30px);
  padding-bottom: 26px;
  border-bottom: 1px solid var(--line);
}
.footer-brand .brand { font-size: 1.5rem; }
.footer-brand p {
  margin-top: 10px;
  color: var(--dim);
  font-size: 0.92rem;
  max-width: 32ch;
  line-height: 1.55;
}
.footer-col h3 {
  font-family: var(--font-mono);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--dim); /* column heading — AA contrast (>=4.5:1) */
  margin-bottom: 12px;
}
.footer-col ul { display: flex; flex-direction: column; gap: 8px; }
.footer-col a {
  font-size: 0.94rem;
  color: var(--dim);
  transition: color var(--dur) var(--ease);
}
.footer-col a:hover { color: var(--text); }

.footer-platforms {
  padding-block: 18px;
  border-bottom: 1px solid var(--line);
  font-family: var(--font-mono);
  font-size: 12px;
  color: var(--dim);
  letter-spacing: 0.02em;
}
.footer-platforms b { color: var(--text); font-weight: 500; }

.footer-bottom {
  display: flex;
  align-items: center;
  justify-content: flex-end;   /* copy is pushed left by its auto margin; legal + Suite group right */
  gap: 20px;
  flex-wrap: wrap;
  padding-top: 20px;
}
.footer-bottom .footer-copy { margin-right: auto; }
.footer-bottom .footer-suite { order: 1; }   /* Suite sits at the far right of the row */
.footer-legal {
  display: flex;
  gap: 22px;
  flex-wrap: wrap;
  font-size: 0.86rem;
}
.footer-legal a { color: var(--dim); transition: color var(--dur) var(--ease); }
.footer-legal a:hover { color: var(--text); }
.footer-copy {
  font-family: var(--font-mono);
  font-size: 12px;
  color: var(--dim); /* copyright line — AA contrast (>=4.5:1) */
}
/* Language switch (EN ⇄ BS) — injected by shock.js initLangSwitch(), footer
   only, and only on pages that actually have a translated counterpart. */
.dsx-lang-foot {
  display: flex;
  align-items: center;
  gap: 7px;
  font-size: 0.86rem;
}
.dsx-lang-foot__cur { color: var(--dim); }
.dsx-lang-foot__sep { color: var(--line2); }
.dsx-lang-foot a { color: var(--dim); text-decoration: underline; text-underline-offset: 2px; transition: color var(--dur) var(--ease); }
.dsx-lang-foot a:hover { color: var(--text); }

/* Suite link — small, footer only (never in primary nav) */
.footer-suite {
  font-family: var(--font-mono);
  font-size: 12px;
  color: var(--dim);
}
.footer-suite a { color: var(--text); }
.footer-suite a .dot { color: var(--red); }

/* Back to top — the footer is the bottom of a long page, and until now the only
   way back up was a manual scroll. Plain anchor to #top: per the HTML spec a
   "top" fragment with no matching element scrolls to the document start, so this
   needs no JS and no id on every page. Sits after the legal row (.footer-suite
   holds order:1). */
.footer-top-link {
  order: 2;
  font-family: var(--font-mono);
  font-size: 12px;
  color: var(--dim);
  text-decoration: none;
  transition: color var(--dur) var(--ease);
}
.footer-top-link:hover { color: var(--text); }
.footer-top-link .arrow { transition: transform var(--dur) var(--ease); display: inline-block; }
.footer-top-link:hover .arrow { transform: translateY(-2px); }
@media (prefers-reduced-motion: reduce) {
  .footer-top-link .arrow { transition: none; }
  .footer-top-link:hover .arrow { transform: none; }
}

/* Visible keyboard focus for every footer link. The footer sits on --panel, so
   the red brand token would not clear AA against it on its own; the offset ring
   keeps the indicator legible without recolouring the link. */
.site-footer a:focus-visible {
  outline: 2px solid var(--red);
  outline-offset: 3px;
  border-radius: 2px;
}

/* Slim variant — the auth flow (/login, /register, /forgot-password,
   /reset-password) and /client. Those pages centre a ~400px card in a flex
   column; the full five-column footer would dwarf it. They previously had NO
   footer at all, which left no route from the sign-in screen to privacy, terms
   or the statutory impresum. This is that route, and nothing more. */
.site-footer--slim {
  padding-block: 20px;
  background: transparent;
  border-top: 1px solid var(--line);
}
.site-footer--slim .footer-bottom { padding-top: 0; }

@media (max-width: 880px) {
  .footer-top { grid-template-columns: 1fr 1fr; }
  .footer-brand { grid-column: 1 / -1; }
  .footer-col--suite { grid-column: 1 / -1; }
  /* Suite list is a flex row; flex-wrap handles narrow widths automatically. */
}
@media (max-width: 520px) {
  .footer-top { grid-template-columns: 1fr; }
  .footer-bottom { flex-direction: column; align-items: flex-start; }
}

/* ============================================================
   REVEAL-ON-SCROLL (progressive enhancement; degrades to visible)
   ============================================================ */
.reveal {
  opacity: 0;
  transform: translateY(18px);
  transition: opacity 0.6s var(--ease), transform 0.6s var(--ease);
  will-change: opacity, transform;
}
.reveal.is-in { opacity: 1; transform: none; }
.no-js .reveal { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) {
  .reveal { opacity: 1; transform: none; transition: none; }
}


/* ============================================================
   PORTFOLIO IMAGE SLOTS (pre-wired) — drop your own files into
   /assets/ with these names and they appear automatically. Until
   then the gradient fallback shows. See /ASSET-CHECKLIST.md.
   ============================================================ */
.work-tile[data-cover="mena-lifestyle"] .work-tile__cover{background:url("/assets/portfolio/home-mena.jpg") center/cover no-repeat, linear-gradient(155deg, var(--ph-a, var(--panel3)) 0%, var(--ph-b, var(--panel)) 100%);}
.work-tile[data-cover="diversity"] .work-tile__cover{background:url("/assets/portfolio/home-diversity.jpg") center/cover no-repeat, linear-gradient(155deg, var(--ph-a, var(--panel3)) 0%, var(--ph-b, var(--panel)) 100%);}
.work-tile[data-cover="sport"] .work-tile__cover{background:url("/assets/portfolio/home-sport.jpg") center/cover no-repeat, linear-gradient(155deg, var(--ph-a, var(--panel3)) 0%, var(--ph-b, var(--panel)) 100%);}
.work-tile[data-cover="emergency"] .work-tile__cover{background:url("/assets/portfolio/home-emergency.jpg") center/cover no-repeat, linear-gradient(155deg, var(--ph-a, var(--panel3)) 0%, var(--ph-b, var(--panel)) 100%);}
.work-tile[data-cover="tech"] .work-tile__cover{background:url("/assets/portfolio/home-tech.jpg") center/cover no-repeat, linear-gradient(155deg, var(--ph-a, var(--panel3)) 0%, var(--ph-b, var(--panel)) 100%);}
.work-tile[data-cover="healthcare"] .work-tile__cover{background:url("/assets/portfolio/home-healthcare.jpg") center/cover no-repeat, linear-gradient(155deg, var(--ph-a, var(--panel3)) 0%, var(--ph-b, var(--panel)) 100%);}
.work-tile[data-cover="lifestyle"] .work-tile__cover{background:url("/assets/portfolio/home-lifestyle.jpg") center/cover no-repeat, linear-gradient(155deg, var(--ph-a, var(--panel3)) 0%, var(--ph-b, var(--panel)) 100%);}
.work-tile[data-cover="corporate"] .work-tile__cover{background:url("/assets/portfolio/home-corporate.jpg") center/cover no-repeat, linear-gradient(155deg, var(--ph-a, var(--panel3)) 0%, var(--ph-b, var(--panel)) 100%);}
.about-portrait{background:url("/assets/img/benis-portrait.jpg") center/cover no-repeat, linear-gradient(160deg, #1d1d25 0%, #0e0e13 100%);}
.work-tile__ph-note, .about-portrait .ph-note{display:none;}


/* ============================================================
   FIRST-VISIT INTRO — full-screen showreel + logo + enter (66% vertical)
   Hidden by default; intro.js reveals it on the first visit only.
   ============================================================ */
.intro { display: none; position: fixed; inset: 0; z-index: 1000; background: var(--surface); overflow: hidden; }
.intro.is-active { display: block; }
.intro.is-leaving { opacity: 0; transition: opacity 0.6s var(--ease); pointer-events: none; }
.intro__media { position: absolute; inset: 0; background: linear-gradient(160deg, #1a1a22 0%, #0b0b0f 100%); }
.intro__video { width: 100%; height: 100%; object-fit: cover; opacity: 0; transition: opacity 0.7s ease; }
.intro__scrim { position: absolute; inset: 0; background: linear-gradient(180deg, rgba(12,12,15,0.18) 0%, rgba(12,12,15,0.52) 100%); }
.intro__content { position: absolute; left: 50%; top: 75%; transform: translate(-50%, -50%); z-index: 2; display: flex; flex-direction: column; align-items: center; gap: 24px; text-align: center; padding: 0 24px; max-height: 92vh; overflow-y: auto; }
.intro__slogan {
  font-size: 0.78rem;
  font-family: var(--font-mono);
  color: rgba(255,255,255,0.55);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  margin: 6px 0 0;
  line-height: 1;
}
.intro__brand {
  font-size: clamp(2rem, 6vw, 3.2rem);
  text-shadow: 0 2px 20px rgba(0,0,0,0.75), 0 1px 5px rgba(0,0,0,0.55);
}
.intro__brand::after {
  filter: drop-shadow(0 3px 10px rgba(0,0,0,0.65));
}
.intro__enter {
  font-size: 1.05rem;
  padding: 1em 1.9em;
  background: transparent;
  border: 1.5px solid rgba(255,255,255,0.65);
  color: #fff;
  box-shadow: 0 6px 28px rgba(0,0,0,0.55), inset 0 1px 0 rgba(255,255,255,0.08);
  text-shadow: 0 1px 5px rgba(0,0,0,0.6);
  transition: background 0.2s var(--ease), border-color 0.2s var(--ease), box-shadow 0.2s var(--ease);
}
.intro__enter:hover, .intro__enter:focus-visible {
  background: rgba(255,255,255,0.10);
  border-color: #fff;
  box-shadow: 0 8px 36px rgba(0,0,0,0.65), inset 0 1px 0 rgba(255,255,255,0.12);
}
.intro__suite {
  font-size: 1.05rem;
  padding: 0.85em 1.7em;
  background: transparent;
  border: 1px solid rgba(255,255,255,0.22);
  color: rgba(255,255,255,0.58);
  border-radius: 3px;
  letter-spacing: 0.04em;
  font-weight: 600;
  text-decoration: none;
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  gap: 2px;
  line-height: 1.25;
  margin-top: 32px;
  box-shadow: 0 4px 20px rgba(0,0,0,0.3);
  transition: background 0.2s var(--ease), border-color 0.2s var(--ease), color 0.2s var(--ease);
}
.intro__suite-top { font-weight: 700; }
.intro__suite-sub { font-weight: 400; opacity: 0.78; font-size: 0.92em; }
.intro__suite:hover, .intro__suite:focus-visible {
  background: rgba(255,255,255,0.07);
  border-color: rgba(255,255,255,0.44);
  color: rgba(255,255,255,0.88);
}
body.intro-open { overflow: hidden; }

/* Software nav dropdown (formerly Suite) — "Pipeline Rail": the three production
   phases read left→right as a production line. Each stage carries a node + step
   number + phase label on a connecting rail (the adjacent stage-head hairlines
   form one continuous line), with its module cards beneath. Postproduction's six
   modules use a 2-up card grid so the panel stays short. Platforms + primary
   links live in the foot bar.
   NB: the double-class selectors below beat the later base .nav-dropdown /
   .nav-dropdown__inner rules — without them the panel min-width falls back to
   460px and the inner collapses to a 2-col grid. */
.nav-dropdown.nav-dropdown--suite { min-width: 900px; }
.nav-dropdown__inner.nav-dropdown__inner--suite { display: block; }
.suite-dd-rail {
  display: grid;
  grid-template-columns: 1fr 1fr 1.5fr;   /* postproduction gets the wider, 2-up column */
  align-items: start;
}
.suite-dd-stage { padding: 0 16px; border-left: 1px solid var(--line); min-width: 0; }
.suite-dd-stage:first-child { padding-left: 4px; border-left: 0; }
.suite-dd-stage-head {
  position: relative;
  display: flex;
  align-items: center;
  gap: 9px;
  padding-bottom: 11px;
  margin-bottom: 5px;
}
.suite-dd-stage-head::after {   /* the rail: adjacent underlines join into one line */
  content: "";
  position: absolute;
  left: 0; bottom: 0;
  width: 100%; height: 1px;
  background: var(--line);
}
.suite-dd-node {
  flex: 0 0 auto;
  width: 9px; height: 9px;
  border-radius: 50%;
  background: var(--red);
  box-shadow: 0 0 0 4px rgba(200,7,10,0.16);
}
.suite-dd-step {
  font-family: var(--font-mono);
  font-size: 0.66rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  color: var(--red-strong);
}
.suite-dd-group-label {
  font-family: var(--font-mono);
  font-size: 0.6rem;
  font-weight: 700;
  letter-spacing: 0.13em;
  text-transform: uppercase;
  color: var(--faint);
  margin: 0;
}
.suite-dd-stage--post .suite-dd-stage-cards {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0 6px;
  align-items: start;
}
/* foot bar — Platforms label + platform links on the left, primary links right */
.suite-dd-foot { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.suite-dd-foot-label { align-self: center; }
.suite-dd-plats { display: flex; gap: 6px; }
.suite-dd-plat {
  display: flex;
  flex-direction: column;
  gap: 1px;
  text-decoration: none;
  padding: 4px 10px;
  border-radius: 9px;
  transition: background var(--dur) var(--ease);
}
.suite-dd-plat:hover { background: var(--panel3); }
.suite-dd-plat-name { font-size: 0.8rem; font-weight: 700; color: var(--text); letter-spacing: 0.005em; }
.suite-dd-plat:hover .suite-dd-plat-name { color: var(--text); }
.suite-dd-plat-desc { font-size: 0.68rem; color: var(--faint); }
.suite-dd-foot-links { margin-left: auto; display: flex; gap: 18px; }
@media (max-width: 920px) {
  .nav-dropdown.nav-dropdown--suite { min-width: 0; }
  .suite-dd-rail { grid-template-columns: 1fr; }
  .suite-dd-stage { border-left: 0; padding: 0; margin-bottom: 6px; }
  .suite-dd-stage--post .suite-dd-stage-cards { grid-template-columns: 1fr 1fr; }
  .suite-dd-foot-links { margin-left: 0; width: 100%; }
}
@media (max-width: 560px) {
  .suite-dd-stage--post .suite-dd-stage-cards { grid-template-columns: 1fr; }
}
.suite-dd-item {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 3px;
  padding: 7px 11px;
  border-radius: 9px;
  text-decoration: none;
  position: relative;
  text-align: left;
  transition: background var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
.suite-dd-item:hover {
  background: var(--panel3);
  box-shadow: inset 0 0 0 1px var(--line);
}
.suite-dd-name {
  font-size: 0.82rem;
  font-weight: 700;
  color: var(--text);
  letter-spacing: 0.01em;
  display: block;
}
.suite-dd-item:hover .suite-dd-name { color: var(--text); }
.suite-dd-desc {
  font-size: 0.7rem;
  color: var(--dim);
  letter-spacing: 0.005em;
  line-height: 1.35;
}
.suite-dd-status {
  font-size: 0.56rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  padding: 2px 7px 2px 6px;
  border-radius: 999px;
  border: 1px solid;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  line-height: 1;
}
.suite-dd-status::before { content: ""; width: 5px; height: 5px; border-radius: 50%; background: currentColor; box-shadow: 0 0 6px currentColor; }
.suite-dd-status--available, .suite-dd-status--live { color: var(--status-green); border-color: rgba(88,214,138,0.34); background: rgba(88,214,138,0.11); }
.suite-dd-status--dev { color: var(--status-amber); border-color: rgba(240,180,106,0.36); background: rgba(240,180,106,0.12); }
.suite-dd-status--planned { color: var(--status-blue); border-color: rgba(110,168,254,0.34); background: rgba(110,168,254,0.11); }
.suite-dd-status--concept, .suite-dd-status--unknown { color: var(--status-purple); border-color: rgba(192,140,245,0.34); background: rgba(192,140,245,0.11); }
.suite-dd-section-label {
  font-family: var(--font-mono);
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--faint);
  padding: 14px 13px 6px;
  margin-top: 8px;
  border-top: 1px solid var(--line);
}
.suite-dd-item--platform .suite-dd-name { color: var(--text); letter-spacing: 0.005em; }
/* intro services grid (reversible — remove initIntroServices() call to disable) */
.intro__services {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 6px 8px;
  max-width: 460px;
}
.intro__services a {
  font-size: 0.67rem;
  color: rgba(255,255,255,0.4);
  text-decoration: none;
  letter-spacing: 0.07em;
  text-transform: uppercase;
  padding: 3px 8px;
  border: 1px solid rgba(255,255,255,0.1);
  border-radius: 2px;
  transition: color 0.18s, border-color 0.18s;
}
.intro__services a:hover { color: rgba(255,255,255,0.7); border-color: rgba(255,255,255,0.22); }
@media (prefers-reduced-motion: reduce) { .intro.is-leaving { transition: none; } }

/* =================================================================
   HOME PORTFOLIO LIGHTBOX
   ================================================================= */
#home-lb {
  position: fixed;
  inset: 0;
  z-index: 800;
  background: rgba(0,0,0,0.92);
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0;
  transition: opacity 0.22s var(--ease);
}
#home-lb.is-open { opacity: 1; }
#home-lb[hidden] { display: none; }
.hlb__close {
  position: absolute;
  top: 16px;
  right: 20px;
  background: none;
  border: none;
  color: rgba(255,255,255,0.7);
  cursor: pointer;
  padding: 8px;
  line-height: 1;
  transition: color 0.2s;
  z-index: 2;
}
.hlb__close:hover { color: #fff; }
.hlb__nav {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  background: rgba(255,255,255,0.08);
  border: 1px solid rgba(255,255,255,0.12);
  color: rgba(255,255,255,0.8);
  cursor: pointer;
  padding: 12px 14px;
  border-radius: 4px;
  line-height: 1;
  transition: background 0.2s;
  z-index: 2;
}
.hlb__nav:hover { background: rgba(255,255,255,0.18); }
.hlb__prev { left: 16px; }
.hlb__next { right: 16px; }
.hlb__figure {
  display: flex;
  flex-direction: column;
  align-items: center;
  max-width: min(90vw, 1200px);
  gap: 20px;
  margin: 0;
}
.hlb__img {
  max-width: 100%;
  max-height: calc(90vh - 100px);
  object-fit: contain;
  display: block;
  border-radius: 3px;
}
.hlb__bar {
  display: flex;
  align-items: center;
  gap: 24px;
  flex-wrap: wrap;
  justify-content: center;
}
.hlb__title {
  color: var(--text-2);
  font-size: 0.85rem;
  letter-spacing: 0.04em;
}
.hlb__brief { flex-shrink: 0; }
@media (max-width: 600px) {
  .hlb__nav { display: none; }
  .hlb__img { max-height: calc(85vh - 80px); }
}

/* =================================================================
   CONTACT PAGE
   ================================================================= */
.contact-hero { padding-block: clamp(48px, 8vw, 96px) clamp(32px, 5vw, 56px); }
/* section wrapper — spacing only */
.section.contact-body { padding-block: clamp(40px, 6vw, 72px); }

/* inner container — two-column grid */
.contact-body.container {
  display: grid;
  grid-template-columns: 3fr 2fr;
  gap: clamp(40px, 6vw, 80px);
  align-items: start;
}
@media (max-width: 860px) {
  .contact-body.container { grid-template-columns: 1fr; }
}
.contact-form-wrap, .contact-info { text-align: left; }
.contact-form { text-align: left; }
.contact-form__submit { display: flex; justify-content: flex-start; }
.contact-info__list { align-items: flex-start; }
.contact-info__list li { text-align: left; }
.contact-info__alt { text-align: center; }
.contact-form-wrap h2 { margin-bottom: 0.5em; }
.contact-form { display: flex; flex-direction: column; gap: 18px; margin-top: 28px; }
.contact-form .field { display: flex; flex-direction: column; gap: 6px; }
.contact-form label {
  font-size: 0.8rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--text-2);
}
.contact-form .input,
.contact-form textarea,
.contact-form select {
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  color: var(--text-1);
  font: inherit;
  padding: 12px 14px;
  transition: border-color 0.2s;
  width: 100%;
}
.contact-form .input:focus,
.contact-form textarea:focus,
.contact-form select:focus {
  outline: none;
  border-color: var(--accent);
}
.contact-form textarea { resize: vertical; min-height: 130px; }
.contact-form select { appearance: none; cursor: pointer; }
.contact-form__submit { margin-top: 8px; }
.contact-msg { margin-top: 12px; font-size: 0.9rem; }
.contact-msg--ok { color: #4ade80; }
.contact-msg--err { color: #f87171; }
.contact-info { padding-top: 8px; }
.contact-info h2 { margin-bottom: 1.2em; }
.contact-info__list { list-style: none; padding: 0; margin: 0 0 2em; display: flex; flex-direction: column; gap: 20px; }
.contact-info__list li { display: flex; gap: 14px; align-items: flex-start; }
.contact-info__icon {
  flex-shrink: 0;
  width: 36px;
  height: 36px;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--text-2);
  margin-top: 2px;
}
.contact-info__text strong { display: block; font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-2); margin-bottom: 3px; }
.contact-info__alt { margin-top: 28px; padding-top: 28px; border-top: 1px solid var(--line); }
.contact-info__alt p { color: var(--text-2); font-size: 0.9rem; margin-bottom: 14px; }

/* =================================================================
   SERVICES DROPDOWN — injected by shock.js into the Services nav item.
   Desktop: hover/focus panel. Mobile: inline expandable inside the
   slide-in menu (toggled by the caret button).
   ================================================================= */
.primary-nav li.has-dropdown { position: relative; display: inline-flex; align-items: center; gap: 2px; }
.nav-dd-toggle {
  display: none;
  background: none; border: none; color: var(--dim);
  padding: 4px; line-height: 1; font-size: 0.7rem;
  transition: transform var(--dur) var(--ease), color var(--dur) var(--ease);
}
.has-dropdown:hover .nav-dd-toggle, .has-dropdown.is-open .nav-dd-toggle { color: var(--text); }
.has-dropdown.is-open .nav-dd-toggle { transform: rotate(180deg); }

/* Client-access entry point (injected by shock.js).
   Desktop: quiet header link before the CTA. Mobile: a nav-menu item. */
.util-client {
  align-self: center; margin-right: 16px;
  font-size: 0.85rem; color: var(--dim); white-space: nowrap;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
  transition: color var(--dur) var(--ease);
}
.util-client:hover { color: var(--text); }
.util-client[aria-current="page"] { color: var(--text); }
.nav-client-li { display: none; }
.nav-client-li a { text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4); }
@media (max-width: 880px) {
  .util-client { display: none; }
  .nav-client-li { display: block; }
}

.nav-dropdown {
  position: absolute;
  top: calc(100% + 12px);
  left: 50%;
  transform: translateX(-50%) translateY(10px) scale(0.985);
  transform-origin: top center;
  min-width: 460px;
  max-width: calc(100vw - 32px);
  background:
    radial-gradient(120% 100% at 50% -10%, rgba(200,7,10,0.06), transparent 60%),
    linear-gradient(180deg, var(--panel2) 0%, var(--panel) 100%);
  border: 1px solid var(--line2);
  border-radius: 16px;
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.05),
    0 2px 6px rgba(0,0,0,0.4),
    0 30px 64px -18px rgba(0,0,0,0.78);
  padding: 20px;
  opacity: 0;
  visibility: hidden;
  transition: opacity var(--dur) var(--ease), transform var(--dur) var(--ease), visibility var(--dur);
  z-index: 120;
}
.nav-dropdown::before { /* hover bridge so the panel doesn't close in the gap */
  content: ""; position: absolute; top: -14px; left: 0; right: 0; height: 14px;
}
.nav-dropdown::after { /* branded hairline accent along the top edge */
  content: ""; position: absolute; top: -1px; left: 22px; right: 22px; height: 2px;
  background: linear-gradient(90deg, transparent, rgba(200,7,10,0.85) 35%, rgba(200,7,10,0.85) 65%, transparent);
  border-radius: 2px; pointer-events: none;
}
.has-dropdown:hover .nav-dropdown,
.has-dropdown:focus-within .nav-dropdown,
.has-dropdown.is-open .nav-dropdown {
  opacity: 1; visibility: visible; transform: translateX(-50%) translateY(0) scale(1);
}
@media (prefers-reduced-motion: reduce) {
  .nav-dropdown { transform: translateX(-50%) translateY(0) scale(1); transition: opacity var(--dur) var(--ease), visibility var(--dur); }
  .has-dropdown:hover .nav-dropdown,
  .has-dropdown:focus-within .nav-dropdown,
  .has-dropdown.is-open .nav-dropdown { transform: translateX(-50%) translateY(0) scale(1); }
}
.nav-dropdown--services { min-width: 360px; }
.nav-dropdown--about { min-width: 210px; left: 0; transform: translateX(0) translateY(8px); }
.has-dropdown:hover .nav-dropdown--about,
.has-dropdown:focus-within .nav-dropdown--about,
.has-dropdown.is-open .nav-dropdown--about { transform: translateX(0) translateY(0); }
.nav-dropdown__inner { display: grid; grid-template-columns: 1fr 1fr; gap: 10px 26px; }
.nav-dropdown__head {
  display: block;
  font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.12em;
  color: var(--faint); margin: 0 0 8px; padding: 0 8px;
}
.nav-dropdown__col > a {
  display: block;
  font-size: 0.92rem; font-weight: 500; color: var(--dim);
  padding: 7px 8px; border-radius: var(--radius);
  transition: background var(--dur) var(--ease), color var(--dur) var(--ease), padding-left var(--dur) var(--ease);
}
.nav-dropdown__col > a:hover { background: var(--panel2); color: var(--text); padding-left: 13px; }
.nav-dropdown__col > a[aria-current="page"] { color: var(--text); }
.nav-dropdown__foot { grid-column: 1 / -1; margin-top: 8px; padding-top: 12px; border-top: 1px solid var(--line); }
.nav-dropdown__foot a { font-size: 0.85rem; color: var(--red-strong); font-weight: 600; padding: 0 8px; }

@media (max-width: 880px) {
  .primary-nav li.has-dropdown { display: block; }
  .nav-dd-toggle { display: inline-block; float: right; font-size: 0.9rem; padding: 14px 4px; }
  .nav-dropdown {
    position: static; transform: none; min-width: 0; width: 100%;
    box-shadow: none; border: none; border-radius: 0; padding: 0;
    background: transparent;
    max-height: 0; overflow: hidden; opacity: 1; visibility: visible;
    transition: max-height var(--dur) var(--ease);
  }
  /* The desktop open-state rule re-applies translateX(-50%) at higher
     specificity than the reset above; inside the drawer that shoves the
     panel half its width off-screen left. Match the specificity here. */
  .has-dropdown:hover .nav-dropdown,
  .has-dropdown:focus-within .nav-dropdown,
  .has-dropdown.is-open .nav-dropdown { transform: none; }
  /* padding-bottom only applies once open: on the closed rule above it would
     survive max-height:0 (overflow:hidden clips at the padding edge, not the
     content edge) and leak an 8px sliver of the collapsed submenu — exactly
     the "ghost text" bug behind the closed Services/Software rows.
     max-height 2000px must clear the tallest expanded panel — currently
     Services w/ "View all" ≈1633px, Software ≈1298px; re-check if either
     grows past it (a hard cut, not a scroll, since overflow is hidden). */
  .has-dropdown.is-open .nav-dropdown { max-height: 2000px; padding-bottom: 8px; }
  .nav-dropdown__inner { grid-template-columns: 1fr; gap: 0; }
  .nav-dropdown__col > a { font-size: 1rem; padding: 10px 0 10px 14px; border-bottom: 1px solid var(--line); }
  .nav-dropdown__col > a:hover { padding-left: 18px; }
  .nav-dropdown__head { margin-top: 10px; }
}

/* Services dropdown — 2 discipline columns + a featured-work column */
.nav-dropdown--services { min-width: 940px; }
.nav-dropdown__inner--services {
  display: grid; grid-template-columns: 1fr 1fr 1.05fr; gap: 0 26px; align-items: start;
}

/* Featured-work card — third column, the only real-image slot in the nav */
.nav-dd-featured {
  display: flex; flex-direction: column; justify-content: flex-end;
  position: relative; overflow: hidden;
  min-height: 210px; border-radius: 13px;
  border: 1px solid var(--line); text-decoration: none;
  box-shadow: inset 0 0 0 1px rgba(255,255,255,0.03);
}
.nav-dd-featured__img {
  position: absolute; inset: 0;
  background-size: cover; background-position: center;
  transition: transform 0.7s var(--ease), filter 0.5s var(--ease);
  filter: saturate(1.02);
}
.nav-dd-featured::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(12,12,15,0) 24%, rgba(12,12,15,0.55) 62%, rgba(12,12,15,0.92) 100%);
}
.nav-dd-featured:hover .nav-dd-featured__img { transform: scale(1.06); filter: saturate(1.1); }
.nav-dd-featured__meta { position: relative; z-index: 1; padding: 14px 15px; }
.nav-dd-featured__label {
  display: inline-block; font-family: var(--font-mono);
  font-size: 0.58rem; letter-spacing: 0.16em;
  text-transform: uppercase; color: #fff; margin-bottom: 6px;
  padding: 3px 8px; border-radius: 999px;
  background: rgba(200,7,10,0.9);
}
.nav-dd-featured__title { display: block; font-size: 1rem; font-weight: 700; color: #fff; line-height: 1.25; letter-spacing: -0.01em; }
.nav-dd-featured__sub {
  display: block; margin-top: 4px; font-size: 0.75rem; color: #d0d0d6;
  transition: color var(--dur) var(--ease);
}
.nav-dd-featured:hover .nav-dd-featured__sub { color: #fff; }
.nav-dropdown__inner--services .nav-dropdown__foot {
  grid-column: 1 / -1;
  display: flex; align-items: center; flex-wrap: wrap; gap: 8px 14px;
  margin-top: 14px; padding-top: 14px;
}
.nav-dropdown__inner--services .nav-dropdown__foot a { color: var(--dim); font-size: 0.82rem; }
.nav-dropdown__inner--services .nav-dropdown__foot a:hover { color: var(--text); }
.nav-dropdown__inner--services .nav-dropdown__foot a.nav-dd-foot--cta {
  color: #fff; margin-left: auto; font-weight: 600; font-size: 0.8rem;
  background: var(--red); padding: 8px 15px; border-radius: 999px;
  transition: background var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.nav-dropdown__inner--services .nav-dropdown__foot a.nav-dd-foot--cta:hover { background: var(--red-hover); transform: translateY(-1px); }
.nav-dd-col { display: flex; flex-direction: column; gap: 2px; }
.nav-dd-group {
  margin: 0 0 4px; padding: 0 10px;
  font-family: var(--font-mono);
  font-size: 0.62rem; letter-spacing: 0.16em; text-transform: uppercase; color: var(--faint);
}

.svc-dd-item {
  display: block; padding: 9px 10px; border-radius: 11px;
  position: relative;
  transition: background var(--dur) var(--ease), box-shadow var(--dur) var(--ease); text-decoration: none;
}
.svc-dd-item:hover { background: var(--panel3); box-shadow: inset 0 0 0 1px var(--line); }
.svc-dd-item__name {
  display: flex; align-items: baseline; gap: 8px;
  font-size: 0.9rem; font-weight: 600; color: var(--text); line-height: 1.3;
}
.svc-dd-item__num {
  font-family: var(--font-mono); font-size: 0.6rem; font-weight: 700; letter-spacing: 0.06em;
  color: var(--red-strong); flex-shrink: 0; opacity: 0.85;
}
.svc-dd-item:hover .svc-dd-item__name { color: var(--text); }
.svc-dd-item[aria-current="page"] .svc-dd-item__name { color: var(--red-strong); }
/* Subcategory explainer line under each services-menu item */
.svc-dd-item__sub {
  display: block; margin-top: 3px; padding-left: 22px;
  font-size: 0.705rem; line-height: 1.45; color: var(--faint); letter-spacing: 0.01em;
}
.svc-dd-item:hover .svc-dd-item__sub { color: var(--dim); }

/* "View all services" expansion — grouped by production phase */
.nav-dd-foot--expand {
  display: inline-flex; align-items: center; gap: 7px;
  background: none; border: 1px solid var(--line); padding: 6px 12px; border-radius: 999px; cursor: pointer;
  color: var(--dim); font-size: 0.78rem; font-weight: 500; font-family: inherit;
  transition: color var(--dur) var(--ease), border-color var(--dur) var(--ease), background var(--dur) var(--ease);
}
.nav-dd-foot--expand:hover { color: var(--text); border-color: var(--line2); background: var(--panel2); }
.nav-dd-foot--expand.is-open { color: var(--text); border-color: rgba(200,7,10,0.4); }
.svc-expand-arrow { display: inline-block; transition: transform 0.24s var(--ease); font-size: 0.7em; color: var(--red); }
.nav-dd-foot--expand.is-open .svc-expand-arrow { transform: rotate(180deg); }
.svc-expand { grid-column: 1 / -1; }
.svc-expand__inner {
  border-top: 1px solid var(--line); margin-top: 14px; padding-top: 16px;
  display: grid; grid-template-columns: repeat(5, 1fr); gap: 4px 16px;
  align-items: start;
  max-height: 60vh; overflow-y: auto;
  scrollbar-width: thin; scrollbar-color: var(--line2) transparent;
}
.svc-expand__inner::-webkit-scrollbar { width: 8px; }
.svc-expand__inner::-webkit-scrollbar-thumb { background: var(--line2); border-radius: 8px; border: 2px solid transparent; background-clip: padding-box; }
.svc-expand-col { display: flex; flex-direction: column; gap: 1px; }
/* All mega-menu column labels share one colour (--faint). The "Other" column
   used to override to --status-purple: that token belongs to the semantic
   status set (concept/unknown chips) and must not double as a nav accent.
   Removed once already and reintroduced by a lineage merge — if it reappears,
   check the merge rather than re-deleting blind. */
.svc-expand-label {
  margin: 0 0 7px; padding: 0 9px;
  font-family: var(--font-mono);
  font-size: 0.6rem; letter-spacing: 0.13em; text-transform: uppercase; color: var(--faint);
}
.svc-expand-col a {
  display: block; padding: 6px 9px; border-radius: 8px;
  font-size: 0.775rem; color: var(--dim); text-decoration: none; line-height: 1.35;
  transition: background var(--dur) var(--ease), color var(--dur) var(--ease);
}
.svc-expand-col a:hover { background: rgba(255,255,255,0.05); color: var(--text); }

/* ── Animated dropdowns — staggered fade-up of items on open ── */
.nav-dropdown .svc-dd-item,
.nav-dropdown .suite-dd-item {
  opacity: 0; transform: translateY(7px);
  transition: opacity .26s var(--ease), transform .26s var(--ease), background var(--dur) var(--ease);
}
.has-dropdown:hover .svc-dd-item,
.has-dropdown:focus-within .svc-dd-item,
.has-dropdown.is-open .svc-dd-item,
.has-dropdown:hover .suite-dd-item,
.has-dropdown:focus-within .suite-dd-item,
.has-dropdown.is-open .suite-dd-item {
  opacity: 1; transform: none;
  transition-delay: calc(var(--i, 0) * 28ms);
}
@media (prefers-reduced-motion: reduce) {
  .nav-dropdown .svc-dd-item,
  .nav-dropdown .suite-dd-item { opacity: 1; transform: none; transition: background var(--dur) var(--ease); }
}

@media (max-width: 880px) {
  .nav-dropdown--services { min-width: 0; }
  .nav-dropdown__inner--services { grid-template-columns: 1fr; gap: 0; }
  .nav-dd-col { gap: 0; }
  .svc-dd-item { padding: 10px 0 10px 14px; border-bottom: 1px solid var(--line); border-radius: 0; }
  .nav-dd-featured { display: none; } /* featured work is desktop-only */
  /* "View all services" expansion: one column, no inner scroller — the
     drawer itself scrolls (.primary-nav is overflow-y:auto). */
  .svc-expand__inner { grid-template-columns: 1fr; max-height: none; overflow-y: visible; }
}

/* =================================================================
   ANIMATION LAYER — extends the .reveal system. All motion is
   gated by prefers-reduced-motion (see block at end).
   ================================================================= */
/* directional + scale reveal variants */
.reveal--left  { transform: translateX(-26px); }
.reveal--right { transform: translateX(26px); }
.reveal--scale { transform: scale(0.94); }
.reveal--left.is-in, .reveal--right.is-in, .reveal--scale.is-in { transform: none; }

/* staggered children: shock.js sets --i on each child of [data-stagger] */
[data-stagger] > * {
  opacity: 0; transform: translateY(16px);
  transition: opacity 0.55s var(--ease), transform 0.55s var(--ease);
  transition-delay: calc(var(--i, 0) * 70ms);
  will-change: opacity, transform;
}
[data-stagger].is-in > * { opacity: 1; transform: none; }
.no-js [data-stagger] > * { opacity: 1; transform: none; }

/* card hover lifts — applied to the recurring card components */
.work-tile, .service-tile, .module-card, .suite-card, .plan-card {
  transition: transform var(--dur) var(--ease), border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease), background var(--dur) var(--ease);
}
.service-tile:hover, .module-card:hover, .suite-card:hover {
  transform: translateY(-4px);
  box-shadow: 0 18px 40px rgba(0,0,0,0.35);
}
.work-tile { overflow: hidden; }
.work-tile:hover { transform: translateY(-3px); }
.work-tile .work-tile__cover { transition: transform 0.6s var(--ease); }
.work-tile:hover .work-tile__cover { transform: scale(1.05); }

/* animated underline on primary nav links (desktop) */
@media (min-width: 881px) {
  .primary-nav a::before {
    content: ""; position: absolute; left: 0; bottom: -2px;
    width: 100%; height: 1px; background: var(--text);
    transform: scaleX(0); transform-origin: right;
    transition: transform var(--dur) var(--ease);
  }
  .primary-nav a:hover::before { transform: scaleX(1); transform-origin: left; }
  .primary-nav a[aria-current="page"]::before { display: none; }
}

/* button arrow nudge */
.btn .arrow { transition: transform var(--dur) var(--ease); display: inline-block; }
.btn:hover .arrow { transform: translateX(4px); }

/* homepage: header floats over showreel (fixed) */
.page-home .site-header { position: fixed; top: 0; left: 0; right: 0; width: 100%; z-index: 200; }

/* Readability: the header is transparent and floats over the showreel / page
   backdrops, so give its text a soft dark halo — keeps nav legible over bright
   video or imagery without adding a visible bar. */
.site-header .brand,
.site-header .primary-nav a,
.site-header .brand-tagline,
.site-header .nav-dd-toggle {
  text-shadow: 0 1px 3px rgba(0,0,0,0.7), 0 1px 12px rgba(0,0,0,0.5);
}
/* …but not inside the dropdown panels: they sit on a solid token surface, and
   in light mode a dark halo behind dark text reads as a smudge. */
.site-header .nav-dropdown a { text-shadow: none; }
/* Same for the mobile drawer — everything in it sits on solid var(--panel). */
@media (max-width: 880px) {
  .site-header .primary-nav a,
  .site-header .nav-dd-toggle { text-shadow: none; }
}

/* header shrink on scroll (class toggled by shock.js) */
.site-header { transition: min-height var(--dur) var(--ease), border-color var(--dur) var(--ease); }
/* scrolled state deepens the glass — still on ::before, never on the header
   itself (see the .site-header::before note above). */
.site-header.is-scrolled::before {
  background: color-mix(in srgb, var(--surface) 62%, transparent);
  -webkit-backdrop-filter: blur(24px) saturate(1.4);
  backdrop-filter: blur(24px) saturate(1.4);
}
.site-header.is-scrolled {
  border-bottom: 1px solid color-mix(in srgb, var(--line) 45%, transparent);
}
.site-header.is-scrolled .container { min-height: 84px; }
.header-cta .btn--primary {
  font-size: 0.78rem;
  padding: 0.55em 1.1em;
  box-shadow: 0 4px 16px rgba(0,0,0,0.45);
  transition: background 0.2s var(--ease), color 0.2s var(--ease), border-color 0.2s var(--ease), box-shadow 0.2s var(--ease), transform var(--dur) var(--ease);
}
.header-cta .btn--primary:hover,
.header-cta .btn--primary:focus-visible {
  background: var(--red);
  color: #fff;
  border-color: var(--red);
  box-shadow: 0 6px 22px rgba(200,7,10,0.5);
}
/* Injected account control — match the primary CTA's vertical size
   (same font-size + padding) and give it the same drop shadow. */
.header-cta .btn--ghost,
.header-cta .shock-account__btn {
  font-size: 0.78rem;
  padding: 0.55em 1.1em;
  box-shadow: 0 4px 16px rgba(0,0,0,0.45);
}
.header-cta .btn--ghost:hover,
.header-cta .shock-account__btn:hover,
.header-cta .btn--ghost:focus-visible,
.header-cta .shock-account__btn:focus-visible {
  box-shadow: 0 6px 22px rgba(0,0,0,0.55);
}

/* Account dropdown (guest: Sign in / Create account; member: Account,
   admin-only User management, Sign out) — same visual language as
   suite-menu.js's .dsx-acct popup so the account control reads the same
   whether it's shown here (marketing header) or on a Suite app page. */
.shock-account { position: relative; display: inline-flex; }
.shock-account__btn { display: inline-flex; align-items: center; gap: 7px; cursor: pointer; }
.shock-account__cv { flex-shrink: 0; opacity: .7; transition: transform .18s var(--ease); }
.shock-account.is-open .shock-account__cv { transform: rotate(180deg); }
.shock-account__pop {
  position: absolute; top: calc(100% + 8px); right: 0; z-index: 200; min-width: 210px;
  box-sizing: border-box; padding: 7px; overflow: hidden;
  background: linear-gradient(180deg, rgba(24,24,29,.98), rgba(14,14,17,.99));
  border: 1px solid rgba(255,255,255,.09); border-radius: 16px;
  -webkit-backdrop-filter: blur(24px) saturate(160%); backdrop-filter: blur(24px) saturate(160%);
  box-shadow: 0 30px 80px rgba(0,0,0,.55), inset 0 1px 0 rgba(255,255,255,.05);
  opacity: 0; visibility: hidden; pointer-events: none; transform: translateY(-8px) scale(.98);
  transition: opacity .18s ease, transform .18s cubic-bezier(.2,.7,.3,1);
}
.shock-account.is-open .shock-account__pop { opacity: 1; visibility: visible; pointer-events: auto; transform: translateY(0) scale(1); }
.shock-account__it {
  display: flex; align-items: center; width: 100%; box-sizing: border-box;
  padding: 9px 11px; border-radius: 9px; background: transparent; border: 0;
  text-align: left; text-decoration: none; color: var(--text); font-size: 12.5px; font-weight: 500;
  font-family: inherit; cursor: pointer; transition: background .12s;
}
.shock-account__it:hover { background: var(--panel3); }
.shock-account__it:focus-visible { outline: 2px solid var(--red); outline-offset: -2px; }
/* red text on a dark panel → --red-strong (the old #ff8a8a / #ff7a7a were
   pink-axis, hue 0 with G=B, not brand red brightened) */
.shock-account__it--primary { background: color-mix(in srgb, var(--red) 16%, transparent); color: var(--red-strong); font-weight: 700; justify-content: center; }
.shock-account__it--primary:hover { background: color-mix(in srgb, var(--red) 26%, transparent); }
.shock-account__it--out { color: var(--red-strong); }
.shock-account__sep { height: 1px; margin: 6px 5px; background: var(--line); }
@media (prefers-reduced-motion: reduce) {
  .shock-account__pop, .shock-account__cv { transition: none; }
}
/* logo mark drop-shadow — keeps the red box legible over bright video/imagery */
.site-header .brand::after { filter: drop-shadow(0 2px 6px rgba(0,0,0,0.6)); }

/* count-up + fade for stat figures */
.count-up { font-variant-numeric: tabular-nums; }

/* page backdrop (applied by shock.js initPageBackdrops) */
.page-hero.has-backdrop, .contact-hero.has-backdrop, .cs-hero.has-backdrop {
  background-color: var(--surface);
  border-bottom: 1px solid var(--line);
}
.page-hero.has-backdrop { padding-block: clamp(56px, 9vw, 120px) clamp(40px, 6vw, 72px); }
/* case-study hero gets extra headroom so its content clears the fixed header
   once the portfolio backdrop is applied */
.cs-hero.has-backdrop { padding-top: clamp(96px, 11vw, 150px); }
/* closing CTA + network sections also receive a random portfolio backdrop */
.contact-cta.has-backdrop, .network.has-backdrop, .about-strip.has-backdrop {
  background-color: var(--surface);
  background-size: cover;
  background-position: center;
}

@media (prefers-reduced-motion: reduce) {
  .reveal--left, .reveal--right, .reveal--scale,
  [data-stagger] > * { opacity: 1 !important; transform: none !important; transition: none !important; }
  .work-tile:hover, .service-tile:hover, .module-card:hover, .suite-card:hover { transform: none; }
  .work-tile:hover .work-tile__cover { transform: none; }
}

/* ============================================================
   SHARED COMPONENT STYLES
   Class contract shared with the markup agents + pages.css.
   ============================================================ */

/* Generic hidden helper (mirrors the scoped #video-modal[hidden] / #home-lb[hidden]
   rules above) so [hidden] form alerts and field errors stay collapsed. */
[hidden] { display: none !important; }

/* ---- .client-chip : monochrome text wordmark fallback inside [data-clients].
   Sits in the existing flex/grid trust row when a logo image is unavailable. ---- */
[data-clients] { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; }
.client-chip {
  display: inline-flex;
  align-items: center;
  font-family: var(--font-mono);
  font-size: 0.72rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--dim);
  padding: 6px 12px;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--panel);
  white-space: nowrap;
  transition: color 0.18s var(--ease), border-color 0.18s var(--ease);
}
.client-chip:hover { color: var(--text); border-color: var(--line2); }

/* ---- .form-alert : form-level error banner (quote + contact) ---- */
.form-alert {
  margin: 0 0 16px;
  padding: 12px 16px;
  font-size: 0.92rem;
  line-height: 1.45;
  color: var(--text);
  background: color-mix(in srgb, var(--red) 14%, var(--panel));
  border: 1px solid color-mix(in srgb, var(--red) 55%, var(--line));
  border-radius: var(--radius);
}
.form-alert a { color: var(--text); text-decoration: underline; }

/* ---- .field-error : inline per-field error message + invalid-input border ---- */
.field-error {
  margin: 6px 0 0;
  font-size: 0.8rem;
  line-height: 1.4;
  color: color-mix(in srgb, var(--red) 70%, var(--text));
}
[aria-invalid="true"] { border-color: var(--red); }

/* ---- .nav-close : close (×) button for the mobile nav panel ---- */
.nav-close {
  display: none; /* only shown inside the mobile panel below */
  position: absolute;
  top: 12px;
  right: 12px;
  width: 44px;
  height: 44px;
  align-items: center;
  justify-content: center;
  font-size: 1.9rem;
  line-height: 1;
  color: var(--text);
  background: transparent;
  border: 1px solid transparent;
  border-radius: var(--radius);
  cursor: pointer;
  transition: color 0.18s var(--ease), background 0.18s var(--ease), border-color 0.18s var(--ease);
}
.nav-close:hover { color: var(--text); background: var(--panel2); }
.nav-close:focus-visible { outline: 2px solid var(--red); outline-offset: 2px; }

/* ---- .hero__price : small muted reassurance caption under the hero H1 ---- */
.hero__price {
  margin: 14px 0 0;
  font-family: var(--font-mono);
  font-size: 0.75rem;
  letter-spacing: 0;
  white-space: nowrap;   /* keep the whole budget signal on one row */
  color: var(--dim);
}
/* let it wrap again once the column is too narrow for one line */
@media (max-width: 760px) { .hero__price { white-space: normal; font-size: 0.8rem; } }
.hero__price a {
  color: var(--text);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.hero__price a:hover { color: var(--red); }

@media (max-width: 880px) {
  /* close button is only relevant once the nav becomes a slide-in panel */
  .primary-nav .nav-close { display: inline-flex; }
}

/* ---- Sector chips (homepage sectors strip) ---- */
.wsector {
  display: inline-block;
  border: 1px solid var(--line2);
  color: var(--dim);
  font-size: 12.5px;
  letter-spacing: .01em;
  padding: 5px 12px;
  border-radius: 20px;
  white-space: nowrap;
}

/* ---- Sector strip layout helpers ---- */
.section--strip { padding-block: clamp(1.3rem, 3.4vw, 2rem); }
.section--alt   { background: var(--panel); border-block: 1px solid var(--line); }
.section--bordered { border-block: 1px solid var(--line); }
.sector-blurb {
  color: var(--dim);
  font-size: clamp(1rem, 1.4vw, 1.12rem);
  line-height: 1.65;
  max-width: 74ch;
  margin: 0 auto;
  text-align: center;
}
.sector-blurb b { color: var(--text); font-weight: 600; }
.sector-chips {
  display: flex;
  flex-wrap: wrap;
  gap: .5rem;
  justify-content: center;
  margin-top: 1.2rem;
}

/* ---- Suite strip (homepage) ---- */
.suite-strip__h { max-width: 32ch; }
.suite-strip__p { max-width: 64ch; margin-top: 18px; color: var(--dim); line-height: 1.65; }
.suite-strip__p a { color: var(--text); text-decoration: underline; text-underline-offset: 2px; }
.suite-strip__p a:hover { color: var(--red); }

/* ---- Footer social links ---- */
.footer-social {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
  margin-top: 10px;
  font-size: 0.85rem;
}

/* ---- Proof cards (On the record section) ---- */
.proof-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 1.2rem;
}
.proof-card {
  margin: 0;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: 6px;
  padding: 1.4rem 1.6rem;
}
.proof-statement {
  margin: 0;
  color: var(--text);
  line-height: 1.65;
  font-size: 0.97rem;
}
.proof-card__foot {
  margin-top: 1.1rem;
  color: var(--dim);
  font-size: .88rem;
  border-top: 1px solid var(--line);
  padding-top: .9rem;
}
.proof-card__foot a { color: var(--text); transition: color var(--dur) var(--ease); }
.proof-card__foot a:hover { color: var(--red); }

/* ============================================================
   LIGHT-MODE OVERRIDES — fix hardcoded dark-theme values that
   break when data-mode="light" (or "auto" on a light-pref OS).
   The nav dropdown panel itself is token-driven (--panel/--line),
   so in light mode it renders light — these hover states assumed
   a dark panel: white text / white washes vanish on light fills.
   Mirrors the pattern in services.css. Only direct rgba/#hex
   values need patching; tokens are already remapped by themes.css.
   ============================================================ */
html[data-mode="light"] {
  /* svc-expand-col link hover + newsletter focus ring: hardcoded white
     washes are invisible on light panels. (suite-dd-plat/item, svc-dd-item
     and nav-dd-foot--expand hovers are already token-driven — var(--panel3)/
     var(--panel2)/var(--text) — and need no override here.) */
  .svc-expand-col a:hover { background: rgba(0,0,0,0.05); }
  .news-input-wrap:focus-within { box-shadow: 0 0 0 3px rgba(0,0,0,0.08); }
}

/* Same overrides for OS-level auto (when visitor hasn't picked a mode) */
@media (prefers-color-scheme: light) {
  html[data-mode="auto"] {
    .svc-expand-col a:hover { background: rgba(0,0,0,0.05); }
    .news-input-wrap:focus-within { box-shadow: 0 0 0 3px rgba(0,0,0,0.08); }
  }
}
