/* =====================================================================
   GridShift Creative — Design System (shared across all pages)
   Studio-grade, editorial, grid-based. Plain CSS, no frameworks.
   Sections:
     1  Tokens
     2  Base & reset
     3  Utilities + section scaffolding
     4  Buttons + magnetic + link CTAs
     5  Brand wordmark / mark
     6  Header + navigation + mobile menu
     7  Footer
     8  Atmosphere: noise, custom cursor, grid background
     9  Reveal / page-transition
     10 Shared cards + marquee
     11 HOME page
     12 SERVICES page
     13 THE SHIFT page
     14 WORK page
     15 ABOUT page
     16 CONTACT page
     17 Responsive
     18 Reduced motion
   ===================================================================== */

/* ============================================================
   Display type = Libre Baskerville, bold 700 (Google Fonts serif) — a clean,
   credible, restrained editorial serif for large headings. Loaded via the
   Google Fonts <link> in each page's <head> (Libre Baskerville + Montserrat +
   Playfair). Montserrat handles all body/UI text.
   Earlier Borax and Libre Baskerville setups have been fully removed.
   ============================================================ */

/* -------------------------------------------------- 1. TOKENS -------- */
:root {
  /* Brand palette */
  --green: #3A76BB;
  --mint: #2AB59A;
  --ink: #231F20;
  --paper: #F0F0F0;
  --purple: #925FA7;
  --orange: #FF9800;
  --white: #ffffff;

  /* Accessible variants for small text on light */
  --green-deep: #2C588F;

  /* Neutral helpers */
  --ink-72: rgba(35, 31, 32, 0.72);
  --ink-55: rgba(35, 31, 32, 0.55);
  --ink-38: rgba(35, 31, 32, 0.38);
  --line: rgba(35, 31, 32, 0.13);
  --line-2: rgba(35, 31, 32, 0.22);
  --green-tint: rgba(58, 118, 187, 0.08);
  --mint-tint: rgba(42, 181, 154, 0.14);
  --purple-tint: rgba(146, 95, 167, 0.12);
  --paper-2: #E7E7E5;
  --surface: #ffffff;

  /* Type — Libre Baskerville (Google Fonts serif, used at bold 700) for big
     display headings; Montserrat for all body/UI/text-heavy areas.
     Georgia/serif is the graceful fallback. */
  --f-display: "Libre Baskerville", Georgia, "Times New Roman", serif;
  --f-body: "Montserrat", system-ui, -apple-system, "Segoe UI", sans-serif;
  --f-mono: "Montserrat", system-ui, sans-serif; /* small labels/numbers (uppercase + tracked) */
  --f-serif: "Playfair Display", Georgia, "Times New Roman", serif; /* logo wordmark only */

  /* Layout */
  --container: 1280px;
  --container-wide: 1480px;
  --gutter: clamp(1.25rem, 4vw, 4rem);
  --section-y: clamp(4.5rem, 9vw, 9rem);
  --radius: 16px;
  --radius-sm: 10px;
  --radius-lg: 26px;
  --header-h: 76px;

  /* Elevation */
  --shadow-sm: 0 1px 2px rgba(35,31,32,.04), 0 4px 14px rgba(35,31,32,.06);
  --shadow-md: 0 10px 30px rgba(35,31,32,.10), 0 2px 8px rgba(35,31,32,.05);
  --shadow-lg: 0 30px 70px rgba(35,31,32,.16);

  /* Motion */
  --ease: cubic-bezier(.22, .61, .36, 1);
  --ease-out: cubic-bezier(.16, 1, .3, 1);
  --ease-snap: cubic-bezier(.2, .9, .2, 1); /* reveals snapping into alignment */
  --t-fast: .25s;
  --t-med: .45s;
  --t-slow: .9s;
}

/* -------------------------------------------------- 2. BASE --------- */
*, *::before, *::after { box-sizing: border-box; }
* { margin: 0; }

html {
  scroll-behavior: smooth;
  scroll-padding-top: calc(var(--header-h) + 16px);
  -webkit-text-size-adjust: 100%;
}

body {
  font-family: var(--f-body);
  background: var(--paper);
  color: var(--ink);
  line-height: 1.6;
  font-size: clamp(1rem, .96rem + .2vw, 1.0625rem);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
  position: relative;
  min-height: 100vh;
}

img, svg { display: block; max-width: 100%; }
a { color: inherit; }
button { font: inherit; cursor: pointer; color: inherit; }
ul, ol { list-style: none; padding: 0; }

h1, h2, h3, h4 {
  font-family: var(--f-display);
  line-height: 1.04;
  font-weight: 700;
  letter-spacing: -0.02em;
  text-wrap: balance;
}

::selection { background: var(--mint); color: var(--ink); }

/* -------------------------------------------------- 3. UTILITIES ---- */
.container { width: 100%; max-width: var(--container); margin-inline: auto; padding-inline: var(--gutter); }
.container--wide { max-width: var(--container-wide); }

.visually-hidden {
  position: absolute !important;
  width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

.skip-link {
  position: absolute; left: 1rem; top: -120%; z-index: 300;
  background: var(--ink); color: var(--white);
  padding: .7rem 1.1rem; border-radius: 0 0 10px 10px; text-decoration: none;
  transition: top .2s var(--ease);
}
.skip-link:focus { top: 0; }

:focus-visible { outline: 3px solid var(--mint); outline-offset: 3px; border-radius: 4px; }

.section { padding-block: var(--section-y); position: relative; }
.section--tight { padding-block: clamp(3rem, 6vw, 5rem); }

/* Editorial section head: mono number + kicker + title + lead */
.s-head { max-width: 820px; margin-bottom: clamp(2.25rem, 4.5vw, 4rem); }
.s-head--right { margin-left: auto; text-align: right; }
.kicker {
  display: inline-flex; align-items: center; gap: .6rem;
  font-family: var(--f-mono); font-size: .74rem; font-weight: 700;
  letter-spacing: .12em; text-transform: uppercase; color: var(--ink-72);
}
.kicker__num { color: var(--green-deep); }
.kicker__dot { width: 8px; height: 8px; border-radius: 2px; background: var(--orange); }
.s-title {
  font-size: clamp(1.9rem, 1.2rem + 2.9vw, 3.4rem);
  margin-top: .8rem; color: var(--ink);
}
.s-lead {
  margin-top: 1.1rem; font-size: clamp(1.05rem, 1rem + .45vw, 1.25rem);
  color: var(--ink-72); max-width: 60ch;
}
.s-head--right .s-lead { margin-left: auto; }

.text-mint { color: var(--green); }
.text-em { font-family: var(--f-display); font-style: italic; }

/* -------------------------------------------------- 4. BUTTONS ------ */
.btn {
  --btn-bg: var(--green); --btn-fg: var(--white);
  position: relative; display: inline-flex; align-items: center; justify-content: center;
  gap: .55rem; font-family: var(--f-display); font-weight: 600; font-size: .98rem;
  letter-spacing: -.01em; text-decoration: none; padding: .9rem 1.6rem;
  border-radius: 999px; border: 1.5px solid transparent; background: var(--btn-bg); color: var(--btn-fg);
  transition: transform var(--t-fast) var(--ease), background var(--t-fast) var(--ease),
    box-shadow var(--t-fast) var(--ease), color var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease);
  will-change: transform;
}
.btn__label { display: inline-block; transition: transform var(--t-fast) var(--ease); }
.btn svg, .btn .arr { transition: transform var(--t-fast) var(--ease); }
.btn:hover .arr { transform: translateX(4px); }

.btn--sm { padding: .62rem 1.1rem; font-size: .9rem; }
.btn--lg { padding: 1.05rem 2rem; font-size: 1.06rem; }

.btn--primary { box-shadow: 0 8px 22px rgba(58,118,187,.28); }
.btn--primary:hover { background: #305F9A; box-shadow: 0 14px 30px rgba(58,118,187,.34); }

.btn--ghost { --btn-bg: transparent; --btn-fg: var(--ink); border-color: var(--line-2); }
.btn--ghost:hover { border-color: var(--ink); background: rgba(35,31,32,.04); }

.btn--accent { --btn-bg: var(--orange); --btn-fg: var(--ink); box-shadow: 0 10px 26px rgba(255,152,0,.3); }
.btn--accent:hover { background: #ffa720; box-shadow: 0 16px 34px rgba(255,152,0,.4); }

.btn--light { --btn-bg: var(--white); --btn-fg: var(--ink); }
.btn--light:hover { background: var(--paper); }

/* Magnetic wrapper sets a translate via JS custom props */
[data-magnetic] { transform: translate(var(--mgx, 0), var(--mgy, 0)); }

/* Inline link CTA */
.link-cta {
  display: inline-flex; align-items: center; gap: .45rem;
  font-family: var(--f-display); font-weight: 600; font-size: .96rem;
  color: var(--green-deep); text-decoration: none;
}
.link-cta .arr { transition: transform var(--t-fast) var(--ease); }
.link-cta:hover { color: var(--green); }
.link-cta:hover .arr { transform: translateX(5px); }

/* -------------------------------------------------- 5. BRAND -------- */
/* Logo recreated from the supplied top-left concept: a high-contrast Didone
   wordmark (Playfair Display) — "Grid" roman + "Shift" italic — with a
   letter-spaced "Creative" beneath and a two-bar teal/green accent mark above
   the "i". Built from real text so it is crisp on retina and accessible: the
   link carries the aria-label and the visible lockup is aria-hidden. */
.brand { display: inline-flex; text-decoration: none; color: var(--ink); }
.logo { position: relative; display: inline-flex; flex-direction: column; line-height: 1; padding-top: .52em; }
.logo__word { font-family: var(--f-serif); font-weight: 700; font-size: var(--logo-size, 1.5rem); letter-spacing: -.005em; white-space: nowrap; color: currentColor; }
.logo__grid { font-style: normal; }
.logo__shift { font-style: italic; }
.logo__sub { font-family: var(--f-serif); font-weight: 600; font-size: calc(var(--logo-size, 1.5rem) * .315); letter-spacing: .34em; text-transform: uppercase; margin-top: .3em; margin-left: .12em; color: currentColor; opacity: .9; }
.logo__mark { position: absolute; top: 0; left: calc(var(--logo-size, 1.5rem) * .64); width: calc(var(--logo-size, 1.5rem) * .92); }
.logo__mark svg { width: 100%; height: auto; overflow: visible; display: block; }
.logo__mark .b1 { fill: var(--mint); }
.logo__mark .b2 { fill: var(--green); }
.logo__mark .b1, .logo__mark .b2 { transition: transform var(--t-med) var(--ease); transform-box: fill-box; transform-origin: center; }
/* hover microinteraction: the two bars separate, then settle back into alignment */
.brand:hover .logo__mark .b1 { transform: translate(1.3px, -1.5px); }
.brand:hover .logo__mark .b2 { transform: translate(-1.3px, 1.5px); }
.site-header .logo { --logo-size: 1.34rem; }
.site-footer .logo { --logo-size: 1.6rem; }

/* -------------------------------------------------- 6. HEADER ------- */
.site-header {
  position: sticky; top: 0; z-index: 100;
  background: rgba(240,240,240,.7);
  backdrop-filter: saturate(150%) blur(14px);
  -webkit-backdrop-filter: saturate(150%) blur(14px);
  border-bottom: 1px solid transparent;
  transition: border-color var(--t-med) var(--ease), background var(--t-med) var(--ease), box-shadow var(--t-med) var(--ease);
}
.site-header.is-scrolled { border-bottom-color: var(--line); box-shadow: var(--shadow-sm); background: rgba(240,240,240,.86); }
.header__inner { display: flex; align-items: center; justify-content: space-between; min-height: var(--header-h); gap: 1rem; }

.nav { display: flex; align-items: center; gap: .4rem; }
.nav__menu { display: flex; align-items: center; gap: .1rem; }
.nav__menu a:not(.btn) {
  position: relative; display: inline-block; text-decoration: none; color: var(--ink);
  font-weight: 500; font-size: .95rem; padding: .5rem .85rem; border-radius: 8px;
  transition: color var(--t-fast) var(--ease);
}
.nav__menu a:not(.btn)::after {
  content: ""; position: absolute; left: .85rem; right: .85rem; bottom: .35rem; height: 2px;
  background: var(--mint); transform: scaleX(0); transform-origin: left; transition: transform var(--t-fast) var(--ease);
}
.nav__menu a:not(.btn):hover { color: var(--green); }
.nav__menu a:not(.btn):hover::after { transform: scaleX(1); }
.nav__menu a[aria-current="page"] { color: var(--green-deep); }
.nav__menu a[aria-current="page"]::after { transform: scaleX(1); background: var(--green); }
.nav__cta { margin-left: .5rem; }

.nav__toggle {
  display: none; width: 46px; height: 46px; border: 1px solid var(--line-2);
  border-radius: 12px; background: var(--white); position: relative; z-index: 130;
}
.nav__bars, .nav__bars::before, .nav__bars::after {
  content: ""; position: absolute; left: 50%; width: 20px; height: 2px; background: var(--ink);
  border-radius: 2px; transform: translateX(-50%); transition: transform var(--t-med) var(--ease), opacity var(--t-fast) var(--ease);
}
.nav__bars { top: 50%; margin-top: -1px; }
.nav__bars::before { top: -6px; }
.nav__bars::after { top: 6px; }
.nav__toggle[aria-expanded="true"] .nav__bars { background: transparent; }
.nav__toggle[aria-expanded="true"] .nav__bars::before { transform: translateX(-50%) rotate(45deg); top: 0; }
.nav__toggle[aria-expanded="true"] .nav__bars::after { transform: translateX(-50%) rotate(-45deg); top: 0; }

/* -------------------------------------------------- 7. FOOTER ------- */
.site-footer { position: relative; background: var(--ink); color: rgba(255,255,255,.8); overflow: hidden; }
.footer__top { display: grid; grid-template-columns: 1.5fr .8fr .8fr; gap: 2.5rem; padding-block: clamp(3rem, 6vw, 5rem) 2.5rem; }
.site-footer .brand { color: var(--white); }
.site-footer .logo__sub { opacity: .6; }
.footer__tag { margin-top: 1.1rem; font-family: var(--f-display); font-weight: 600; color: var(--white); display: inline-flex; align-items: center; gap: .6rem; }
.footer__tag::before { content: ""; width: 26px; height: 2px; background: var(--mint); }
.footer__loc { margin-top: .7rem; color: rgba(255,255,255,.6); max-width: 34ch; }
.footer__email { margin-top: 1rem; }
.footer__email a { color: var(--mint); text-decoration: none; font-weight: 500; font-family: var(--f-mono); font-size: .95rem; }
.footer__email a:hover { text-decoration: underline; text-underline-offset: 3px; }
.footer__col h2 { font-family: var(--f-mono); font-size: .74rem; letter-spacing: .14em; text-transform: uppercase; color: rgba(255,255,255,.45); margin-bottom: 1.1rem; font-weight: 700; }
.footer__col ul { display: grid; gap: .65rem; }
.footer__col a { color: rgba(255,255,255,.8); text-decoration: none; }
.footer__col a:hover { color: var(--mint); }
.footer__base { display: flex; justify-content: space-between; gap: 1rem; flex-wrap: wrap; padding-block: 1.4rem; border-top: 1px solid rgba(255,255,255,.12); font-size: .82rem; color: rgba(255,255,255,.5); font-family: var(--f-mono); }
.footer__watermark {
  font-family: var(--f-display); font-weight: 800; letter-spacing: -.04em;
  font-size: clamp(3rem, 16vw, 13rem); line-height: .8; color: rgba(255,255,255,.04);
  padding-bottom: clamp(1rem, 3vw, 2rem); user-select: none; white-space: nowrap;
}

/* -------------------------------------------------- 8. ATMOSPHERE --- */
/* Noise/texture overlay — fixed, very subtle, never blocks clicks */
.noise {
  position: fixed; inset: 0; z-index: 1; pointer-events: none; opacity: .04;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  mix-blend-mode: multiply;
}

/* Custom cursor follower — SQUARE grid-block style (desktop, fine-pointer only).
   A blue outlined square trails the pointer; a small solid mint square sits on it.
   pointer-events:none so it never blocks clicks; hidden on touch + reduced motion. */
.cursor-ring {
  position: fixed; top: 0; left: 0; z-index: 9999; width: 30px; height: 30px;
  margin: -15px 0 0 -15px; border: 1.5px solid var(--green); border-radius: 0;
  pointer-events: none; opacity: 0;
  transform: translate(var(--cx, -100px), var(--cy, -100px)) scale(var(--cs, 1));
  transition: opacity .3s var(--ease), background .25s var(--ease), border-color .25s var(--ease), width .2s var(--ease), height .2s var(--ease);
}
.cursor-dot {
  position: fixed; top: 0; left: 0; z-index: 9999; width: 10px; height: 10px; margin: -5px 0 0 -5px;
  background: var(--mint); border-radius: 0; pointer-events: none; opacity: 0;
  transform: translate(var(--dx, -100px), var(--dy, -100px));
  transition: opacity .3s var(--ease);
}
html.has-cursor .cursor-ring.is-on, html.has-cursor .cursor-dot.is-on { opacity: 1; }
.cursor-ring.is-hot { background: var(--mint-tint); border-color: var(--mint); --cs: 1.4; }

/* Interactive grid background */
.grid-bg {
  position: absolute; inset: 0; pointer-events: none; opacity: .9;
  background-image:
    linear-gradient(to right, var(--line) 1px, transparent 1px),
    linear-gradient(to bottom, var(--line) 1px, transparent 1px);
  background-size: 58px 58px; background-position: center;
  transform: translate3d(var(--gx, 0), var(--gy, 0), 0);
  transition: transform .6s var(--ease);
  -webkit-mask-image: radial-gradient(ellipse 85% 80% at 50% 35%, #000 50%, transparent 100%);
  mask-image: radial-gradient(ellipse 85% 80% at 50% 35%, #000 50%, transparent 100%);
}
.grid-bg--dark { --line: rgba(255,255,255,.09); }
.grid-bg--full { -webkit-mask-image: radial-gradient(ellipse 100% 100% at 50% 50%, #000 45%, transparent 100%); mask-image: radial-gradient(ellipse 100% 100% at 50% 50%, #000 45%, transparent 100%); }

/* Hero grid-rain (HOME hero only) — a few columns of small modular blocks that
   drift downward at different speeds, inspired by the logo's pixel-grid. JS
   builds the columns; CSS animates each one's background position (one GPU-light
   property). Masked top & bottom so the motion fades into the hero. Disabled
   entirely under prefers-reduced-motion. */
.gridrain {
  position: absolute; inset: 0; overflow: hidden; pointer-events: none; z-index: 0;
  -webkit-mask-image: linear-gradient(to bottom, transparent 0, #000 16%, #000 62%, transparent 100%);
  mask-image: linear-gradient(to bottom, transparent 0, #000 16%, #000 62%, transparent 100%);
}
.gridrain__col {
  position: absolute; top: -48px; bottom: -48px;
  background-repeat: repeat;
  animation-name: gridfall; animation-timing-function: linear; animation-iteration-count: infinite;
  will-change: background-position;
}
@keyframes gridfall { from { background-position: 0 0; } to { background-position: 0 var(--period, 34px); } }

/* -------------------------------------------------- 9. REVEAL ------- */
/* Sections settle into place with a small snap (rise + slight scale + a short
   slide), so they feel like they're aligning to the grid rather than a generic
   fade-up. JS adds a per-item stagger for grouped cards. */
.js .reveal { opacity: 0; transform: translateY(20px) scale(.986); transition: opacity .6s var(--ease-out), transform .7s var(--ease-snap); }
.js .reveal.is-in { opacity: 1; transform: none; }

/* Page transitions — robust by design:
   entrance is a pure-CSS animation on <main> (runs even if JS never loads, so the
   page can never get stuck hidden); the exit fade is JS-driven on <body>. */
.js main { animation: pageIn .5s var(--ease) both; }
@keyframes pageIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
.js body.is-leaving { opacity: 0; transition: opacity .22s var(--ease); }

/* keep content above noise */
.site-header, main, .site-footer { position: relative; z-index: 2; }

/* -------------------------------------------------- 10. CARDS ------- */
.card {
  position: relative; display: flex; flex-direction: column; background: var(--surface);
  border: 1px solid var(--line); border-radius: var(--radius); padding: clamp(1.4rem, 2.4vw, 2rem);
  box-shadow: var(--shadow-sm);
  transition: transform var(--t-med) var(--ease), box-shadow var(--t-med) var(--ease), border-color var(--t-med) var(--ease);
}
.card__mark { position: absolute; top: 14px; right: 14px; width: 10px; height: 10px; border-radius: 2px; background: var(--paper); border: 1px solid var(--line-2); transition: all var(--t-med) var(--ease); }
.card:hover { transform: translateY(-6px); box-shadow: var(--shadow-md); border-color: rgba(58,118,187,.35); }
.card:hover .card__mark { background: var(--orange); border-color: var(--orange); transform: translate(2px,-2px); }
.card__title { font-size: 1.25rem; }
.card__text { margin-top: .65rem; color: var(--ink-72); }

/* Kinetic marquee band */
.marquee { border-block: 1px solid var(--line); background: var(--white); overflow: hidden; }
.marquee__track { display: flex; gap: 0; width: max-content; animation: marquee 38s linear infinite; }
.marquee__track span { font-family: var(--f-display); font-weight: 700; font-size: clamp(1.1rem, 2.4vw, 1.7rem); letter-spacing: -.02em; color: var(--ink); padding: .9rem 1.5rem; display: inline-flex; align-items: center; gap: 1.5rem; }
.marquee__track span::after { content: "✶"; color: var(--mint); font-size: .7em; }
.marquee__track--alt span { color: var(--ink-38); }
@keyframes marquee { to { transform: translateX(-50%); } }

/* =====================================================================
   11. HOME
   ===================================================================== */
.hero { position: relative; padding-block: clamp(2.5rem, 6vw, 5rem) clamp(3rem, 6vw, 5.5rem); overflow: hidden; }
.hero__inner { position: relative; display: grid; grid-template-columns: 1.02fr .98fr; gap: clamp(2rem, 5vw, 4rem); align-items: center; }
.hero__copy { max-width: 660px; }
.hero__eyebrow { margin-bottom: 1.3rem; }
.hero__title { font-size: clamp(2.6rem, 1.2rem + 5.4vw, 5.2rem); font-weight: 800; letter-spacing: -.035em; }
.hero__title .ln { display: block; overflow: hidden; }
.rotate { position: relative; display: inline-block; color: var(--green); }
.rotate::after { content: ""; position: absolute; left: 0; right: 0; bottom: .07em; height: .1em; background: var(--orange); border-radius: 2px; }
.rotate__word { display: inline-block; transition: opacity .4s var(--ease), transform .4s var(--ease); }
.rotate.is-swapping .rotate__word { opacity: 0; transform: translateY(-.3em); }
.hero__sub { margin-top: 1.5rem; font-size: clamp(1.05rem, 1rem + .5vw, 1.28rem); color: var(--ink-72); max-width: 54ch; }
.hero__actions { display: flex; flex-wrap: wrap; gap: .8rem; margin-top: 2.2rem; }
.hero__tag { margin-top: 1.8rem; font-family: var(--f-mono); font-size: .9rem; letter-spacing: .02em; color: var(--ink); display: inline-flex; align-items: center; gap: .65rem; }
.hero__tag::before { content: ""; width: 28px; height: 2px; background: var(--mint); }

/* Hero stage: scattered-to-structured */
.stage { position: relative; aspect-ratio: 1 / 1; }
.stage__grid { position: relative; height: 100%; display: grid; grid-template-columns: repeat(6, 1fr); grid-template-rows: repeat(6, 1fr); gap: clamp(.5rem, 1.2vw, .85rem); }
.tile {
  position: relative; border-radius: 12px; background: var(--surface); border: 1px solid var(--line);
  box-shadow: var(--shadow-sm); overflow: hidden;
  animation: settle 1s var(--ease-out) both;
}
/* Scattered -> structured runs as a CSS animation on load (no JS dependency). */
@keyframes settle {
  from { opacity: 0; transform: translate(var(--tx,0), var(--ty,0)) rotate(var(--tr,0)) scale(var(--ts,.7)); }
  to { opacity: 1; transform: none; }
}
/* Pointer parallax lives on the grid container (set by JS), so it never fights
   the per-tile settle animation. */
.stage__grid { transform: translate(var(--px, 0), var(--py, 0)); transition: transform .4s var(--ease); }

/* Tile placements (col-start / row-start / spans) */
.tile--a { grid-column: 1 / span 3; grid-row: 1 / span 2; --tx:-40px; --ty:-30px; --tr:-8deg; }
.tile--b { grid-column: 4 / span 3; grid-row: 1 / span 2; --tx:50px; --ty:-20px; --tr:7deg; }
.tile--c { grid-column: 1 / span 2; grid-row: 3 / span 2; --tx:-55px; --ty:25px; --tr:10deg; }
.tile--d { grid-column: 3 / span 2; grid-row: 3 / span 3; --tx:10px; --ty:45px; --tr:-6deg; }
.tile--e { grid-column: 5 / span 2; grid-row: 3 / span 2; --tx:55px; --ty:18px; --tr:9deg; }
.tile--f { grid-column: 1 / span 2; grid-row: 5 / span 2; --tx:-35px; --ty:50px; --tr:-11deg; }
.tile--g { grid-column: 5 / span 2; grid-row: 5 / span 2; --tx:48px; --ty:42px; --tr:8deg; }
.tile--a { animation-delay: .05s; }
.tile--b { animation-delay: .12s; }
.tile--c { animation-delay: .19s; }
.tile--d { animation-delay: .26s; }
.tile--e { animation-delay: .33s; }
.tile--f { animation-delay: .40s; }
.tile--g { animation-delay: .47s; }

.tile__fill { position: absolute; inset: 0; }
.tile--green .tile__fill { background: var(--green); }
.tile--mint .tile__fill { background: var(--mint); }
.tile--ink .tile__fill { background: var(--ink); }
.tile__aa { position: absolute; inset: 0; display: grid; place-items: center; font-family: var(--f-display); font-weight: 800; font-size: clamp(2rem, 6vw, 4rem); color: var(--green); }
.tile__mono { position: absolute; left: 12px; bottom: 10px; font-family: var(--f-mono); font-size: .72rem; letter-spacing: .1em; color: var(--white); }
.tile__chips { position: absolute; inset: 0; display: flex; }
.tile__chips i { flex: 1; }
.tile__chips i:nth-child(1) { background: var(--green); }
.tile__chips i:nth-child(2) { background: var(--mint); }
.tile__chips i:nth-child(3) { background: var(--purple); }
.tile__chips i:nth-child(4) { background: var(--orange); }
.tile__web { position: absolute; inset: 0; padding: 10px; display: grid; gap: 6px; align-content: start; background: var(--white); }
.tile__web .bar { height: 8px; border-radius: 3px; background: var(--line-2); }
.tile__web .bar.lg { height: 14px; width: 65%; background: var(--ink); }
.tile__web .bar.btn { height: 16px; width: 50px; background: var(--green); border-radius: 99px; margin-top: 2px; }
.tile__social { position: absolute; inset: 0; background: linear-gradient(150deg, var(--green), var(--mint)); }
.tile__social::after { content: ""; position: absolute; left: 10px; right: 10px; bottom: 10px; height: 8px; background: rgba(255,255,255,.7); border-radius: 3px; }
.stage__caption { position: absolute; bottom: -1.8rem; left: 0; right: 0; text-align: center; font-family: var(--f-mono); font-size: .72rem; letter-spacing: .16em; text-transform: uppercase; color: var(--ink-55); }
.stage__caption b { color: var(--green); font-weight: 700; }

/* Problem (asymmetric, editorial) */
.problem__grid { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(1.5rem, 5vw, 4rem); align-items: center; }
.problem__body p { font-size: clamp(1.05rem, 1rem + .45vw, 1.25rem); color: var(--ink-72); }
.problem__body p + p { margin-top: 1rem; }
.bigquote {
  position: relative; background: var(--ink); color: var(--white); border-radius: var(--radius-lg);
  padding: clamp(2rem, 4.5vw, 3.4rem); box-shadow: var(--shadow-lg); overflow: hidden;
}
.bigquote::before { content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 5px; background: linear-gradient(var(--mint), var(--green)); }
.bigquote::after { content: ""; position: absolute; right: -28px; bottom: -28px; width: 130px; height: 130px; background-image: linear-gradient(rgba(255,255,255,.08) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,.08) 1px, transparent 1px); background-size: 20px 20px; }
.bigquote q { font-family: var(--f-display); font-style: italic; font-weight: 600; font-size: clamp(1.6rem, 1.1rem + 2vw, 2.5rem); line-height: 1.15; quotes: none; }
.bigquote figcaption { margin-top: 1.2rem; font-family: var(--f-mono); font-size: .76rem; letter-spacing: .12em; text-transform: uppercase; color: var(--mint); }

/* Solution pillars */
.pillars { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(1rem, 2.4vw, 1.5rem); }
.pillar { padding-top: 2.6rem; }
.pillar__n { font-family: var(--f-mono); font-weight: 700; font-size: .9rem; color: var(--green); }
.pillar .card__title { margin-top: .5rem; }
.pillar__bar { margin-top: 1.2rem; height: 4px; border-radius: 4px; background: var(--paper-2); overflow: hidden; }
.pillar__bar i { display: block; height: 100%; width: 38%; background: var(--green); transition: width var(--t-slow) var(--ease-out); }
.pillar:nth-child(2) .pillar__bar i { background: var(--mint); width: 64%; }
.pillar:nth-child(3) .pillar__bar i { background: var(--purple); width: 88%; }
.pillar:hover .pillar__bar i { width: 100%; }

/* Brand shift toggle demo */
.shiftdemo { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); padding: clamp(1.4rem, 3vw, 2.4rem); box-shadow: var(--shadow-sm); }
.shiftdemo__head { display: flex; align-items: flex-end; justify-content: space-between; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.6rem; }
.shiftdemo__title { font-size: clamp(1.3rem, 1rem + 1.3vw, 1.9rem); margin-top: .5rem; }
.toggle { display: inline-flex; background: var(--paper); border: 1px solid var(--line); border-radius: 999px; padding: 4px; }
.toggle__btn { border: 0; background: transparent; font-family: var(--f-display); font-weight: 600; font-size: .92rem; color: var(--ink-72); padding: .5rem 1.2rem; border-radius: 999px; transition: background var(--t-med) var(--ease), color var(--t-med) var(--ease), box-shadow var(--t-med) var(--ease); }
.toggle__btn.is-active { background: var(--green); color: var(--white); box-shadow: var(--shadow-sm); }
.stagegrid { display: grid; grid-template-columns: repeat(4, 1fr); gap: clamp(.6rem, 1.5vw, 1rem); padding: clamp(.8rem, 2vw, 1.4rem); border-radius: var(--radius); background: linear-gradient(to right, var(--line) 1px, transparent 1px) , linear-gradient(to bottom, var(--line) 1px, transparent 1px), var(--paper); background-size: 25% 50%, 25% 50%, auto; }
.cell { aspect-ratio: 1 / 1; border-radius: 10px; background: var(--green); transition: transform .65s var(--ease), background .65s var(--ease), border-radius .65s var(--ease); }
.stagegrid.is-structured .cell:nth-child(4n+1){ background: var(--green); }
.stagegrid.is-structured .cell:nth-child(4n+2){ background: var(--mint); }
.stagegrid.is-structured .cell:nth-child(4n+3){ background: var(--ink); }
.stagegrid.is-structured .cell:nth-child(4n+4){ background: var(--green); }
.stagegrid.is-structured .cell { transform: none; border-radius: 10px; }
.stagegrid.is-scattered .cell:nth-child(1){ background: var(--green); transform: translate(7px,9px) rotate(-6deg) scale(.82); border-radius: 14px; }
.stagegrid.is-scattered .cell:nth-child(2){ background: var(--orange); transform: translate(-9px,5px) rotate(5deg) scale(1.06); border-radius: 4px; }
.stagegrid.is-scattered .cell:nth-child(3){ background: var(--purple); transform: translate(5px,-7px) rotate(8deg) scale(.76); border-radius: 16px; }
.stagegrid.is-scattered .cell:nth-child(4){ background: #b9b9b9; transform: translate(-6px,7px) rotate(-9deg) scale(.9); border-radius: 6px; }
.stagegrid.is-scattered .cell:nth-child(5){ background: var(--mint); transform: translate(10px,-5px) rotate(6deg) scale(1.08); border-radius: 14px; }
.stagegrid.is-scattered .cell:nth-child(6){ background: var(--ink); transform: translate(-5px,-9px) rotate(-7deg) scale(.8); border-radius: 4px; }
.stagegrid.is-scattered .cell:nth-child(7){ background: #cfa3df; transform: translate(8px,7px) rotate(9deg) scale(.9); border-radius: 12px; }
.stagegrid.is-scattered .cell:nth-child(8){ background: var(--green); transform: translate(-10px,-4px) rotate(-5deg) scale(1.05); border-radius: 16px; }
.stagegrid.is-scattered .cell:nth-child(9){ background: #ffc266; transform: translate(6px,-8px) rotate(7deg) scale(.78); border-radius: 6px; }
.stagegrid.is-scattered .cell:nth-child(10){ background: var(--mint); transform: translate(-7px,6px) rotate(-8deg) scale(.86); border-radius: 12px; }
.stagegrid.is-scattered .cell:nth-child(11){ background: var(--green); transform: translate(9px,4px) rotate(5deg) scale(1.03); border-radius: 14px; }
.stagegrid.is-scattered .cell:nth-child(12){ background: #c9c9c9; transform: translate(-8px,-6px) rotate(-6deg) scale(.82); border-radius: 6px; }
.shiftdemo__cap { margin-top: 1rem; color: var(--ink-72); font-size: .95rem; }

/* Featured services — editorial list (not cards) */
.flist { border-top: 1px solid var(--line-2); }
.frow { display: grid; grid-template-columns: auto 1fr auto auto; align-items: center; gap: clamp(1rem,3vw,2.5rem); padding: clamp(1.3rem, 3vw, 2.1rem) 0; border-bottom: 1px solid var(--line); text-decoration: none; color: inherit; position: relative; transition: padding-left var(--t-med) var(--ease); }
.frow__n { font-family: var(--f-mono); font-size: .85rem; color: var(--ink-38); }
.frow__name { font-family: var(--f-display); font-weight: 700; font-size: clamp(1.3rem, 1rem + 1.6vw, 2.1rem); letter-spacing: -.02em; }
.frow__desc { color: var(--ink-72); font-size: .98rem; max-width: 46ch; }
.frow__price { font-family: var(--f-mono); font-weight: 700; color: var(--green-deep); white-space: nowrap; }
.frow__arr { width: 44px; height: 44px; border-radius: 50%; border: 1.5px solid var(--line-2); display: grid; place-items: center; transition: all var(--t-med) var(--ease); }
.frow::before { content: ""; position: absolute; left: -1rem; top: 0; bottom: 0; width: 4px; background: var(--green); transform: scaleY(0); transform-origin: top; transition: transform var(--t-med) var(--ease); border-radius: 4px; }
.frow:hover { padding-left: 1.2rem; }
.frow:hover::before { transform: scaleY(1); }
.frow:hover .frow__arr { background: var(--green); border-color: var(--green); color: var(--white); transform: rotate(-45deg); }
@media (max-width: 760px){ .frow { grid-template-columns: auto 1fr auto; } .frow__desc { display: none; } }

/* System preview */
.sysprev { display: grid; grid-template-columns: .9fr 1.1fr; gap: clamp(1.5rem, 4vw, 3.5rem); align-items: center; }
.steps-mini { display: grid; gap: .2rem; }
.steps-mini li { display: grid; grid-template-columns: auto 1fr; gap: 1rem; align-items: center; padding: .8rem 0; border-bottom: 1px dashed var(--line); }
.steps-mini b { font-family: var(--f-mono); color: var(--green); font-size: .9rem; }
.steps-mini span { font-family: var(--f-display); font-weight: 600; }

/* Work preview / concept cards */
.concept-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(1rem, 2.4vw, 1.5rem); }
.concept { padding: 0; overflow: hidden; }
.cmock { position: relative; aspect-ratio: 4/3; display: grid; padding: 1.3rem; overflow: hidden; border-bottom: 1px solid var(--line); }
.cmock--consult { background: linear-gradient(135deg,#eef3f1,#dde9e5); align-content: center; gap: .55rem; }
.cmock--consult .ch { width: 46px; height: 46px; border-radius: 12px; background: var(--green); }
.cmock--consult .bar { height: 10px; width: 70%; border-radius: 4px; background: rgba(35,31,32,.25); }
.cmock--consult .bar.s { width: 45%; background: rgba(35,31,32,.15); }
.cmock--service { background: linear-gradient(135deg,#eaf2f0,#d3e6e0); align-content: end; gap: .5rem; }
.cmock--service .win { height: 46%; border-radius: 10px 10px 0 0; background: var(--white); border: 1px solid var(--line); box-shadow: var(--shadow-sm); }
.cmock--service .bar { height: 10px; width: 62%; border-radius: 4px; background: var(--green); }
.cmock--service .bar.s { width: 40%; background: var(--mint); }
.cmock--wellness { background: linear-gradient(135deg,#f1ecf4,#e5dbeb); grid-template-columns: 1fr 1fr; gap: .55rem; place-content: center; }
.cmock--wellness i { aspect-ratio: 1; border-radius: 10px; }
.cmock--wellness i:nth-child(1){ background: var(--purple); }
.cmock--wellness i:nth-child(2){ background: var(--mint); }
.cmock--wellness i:nth-child(3){ background: var(--green); }
.cmock--wellness i:nth-child(4){ background: var(--ink); }
.concept__tag { align-self: start; margin: 1.3rem 1.4rem 0; font-family: var(--f-mono); font-weight: 700; font-size: .68rem; letter-spacing: .12em; text-transform: uppercase; color: var(--purple); background: var(--purple-tint); padding: .25rem .6rem; border-radius: 999px; }
.concept .card__title { margin: .8rem 1.4rem 0; }
.concept .card__text { margin: .5rem 1.4rem 1.5rem; }

/* CTA band (dark) */
.cta { background: var(--ink); color: var(--white); overflow: hidden; }
.cta__inner { position: relative; text-align: center; max-width: 820px; margin-inline: auto; }
.cta__title { font-size: clamp(2.1rem, 1.3rem + 3.4vw, 3.8rem); }
.cta__copy { margin: 1.2rem auto 2.2rem; color: rgba(255,255,255,.78); max-width: 54ch; }

/* Shared page hero (interior pages) */
.page-hero { position: relative; overflow: hidden; padding-block: clamp(3rem, 7vw, 6.5rem) clamp(2.2rem, 4vw, 3.5rem); }
.page-hero__inner { position: relative; max-width: 900px; }
.page-hero__title { font-size: clamp(2.4rem, 1.3rem + 4.4vw, 4.6rem); font-weight: 800; letter-spacing: -.035em; margin-top: 1rem; }
.page-hero__lead { margin-top: 1.3rem; font-size: clamp(1.08rem, 1rem + .55vw, 1.32rem); color: var(--ink-72); max-width: 60ch; }
.page-hero__meta { margin-top: 1.6rem; display: flex; flex-wrap: wrap; gap: .5rem; }
.tagchip { font-family: var(--f-mono); font-size: .74rem; letter-spacing: .04em; color: var(--green-deep); background: var(--green-tint); border: 1px solid var(--line); padding: .35rem .7rem; border-radius: 999px; }

/* =====================================================================
   12. SERVICES
   ===================================================================== */

/* Comparison table */
.ctable-wrap { overflow-x: auto; border: 1px solid var(--line); border-radius: var(--radius); background: var(--surface); box-shadow: var(--shadow-sm); }
.ctable { width: 100%; border-collapse: collapse; min-width: 720px; }
.ctable th, .ctable td { text-align: left; padding: 1rem 1.1rem; border-bottom: 1px solid var(--line); }
.ctable thead th { font-family: var(--f-display); font-weight: 700; font-size: 1rem; background: var(--paper); position: sticky; top: 0; }
.ctable thead th:first-child { font-family: var(--f-mono); font-size: .76rem; letter-spacing: .1em; text-transform: uppercase; color: var(--ink-55); font-weight: 700; }
.ctable tbody th { font-weight: 600; color: var(--ink); font-family: var(--f-body); }
.ctable td { color: var(--ink-72); font-size: .95rem; }
.ctable .yes { color: var(--green-deep); font-weight: 700; }
.ctable .no { color: var(--ink-38); }
.ctable tr:hover td, .ctable tr:hover th { background: var(--green-tint); }
.ctable col.is-feature, .ctable .col-feature { background: rgba(42,181,154,.06); }

/* Which package decision guide */
.decide { display: grid; grid-template-columns: repeat(2, 1fr); gap: clamp(1rem, 2.4vw, 1.5rem); }
.decide__card { background: var(--surface); border: 1px solid var(--line); border-left: 4px solid var(--green); border-radius: var(--radius); padding: clamp(1.3rem, 2.4vw, 1.8rem); box-shadow: var(--shadow-sm); transition: transform var(--t-med) var(--ease), box-shadow var(--t-med) var(--ease); }
.decide__card:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.decide__q { font-family: var(--f-display); font-weight: 700; font-size: 1.12rem; }
.decide__a { margin-top: .6rem; color: var(--ink-72); font-size: .96rem; }
.decide__pick { margin-top: 1rem; display: inline-flex; align-items: center; gap: .5rem; font-family: var(--f-mono); font-size: .85rem; color: var(--green-deep); font-weight: 700; }
.decide__card:nth-child(2){ border-left-color: var(--mint); }
.decide__card:nth-child(3){ border-left-color: var(--purple); }
.decide__card:nth-child(4){ border-left-color: var(--orange); }


/* =====================================================================
   13. THE SHIFT — process map, deliverables, brand panel
   ===================================================================== */
.pmap { display: grid; grid-template-columns: .85fr 1.15fr; gap: clamp(1.5rem, 4vw, 3.5rem); align-items: start; }
.pmap__rail { position: sticky; top: calc(var(--header-h) + 2rem); }
.pmap__big { font-family: var(--f-mono); font-weight: 700; font-size: clamp(3rem, 10vw, 6rem); line-height: 1; color: var(--green); letter-spacing: -.04em; }
.pmap__bigtitle { font-family: var(--f-display); font-weight: 700; font-size: clamp(1.3rem,1rem+1.4vw,2rem); margin-top: .4rem; min-height: 2.4em; }
.pmap__dots { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: 1.4rem; }
.pmap__dot { width: 30px; height: 8px; border-radius: 99px; background: var(--paper-2); transition: background var(--t-med) var(--ease), width var(--t-med) var(--ease); }
.pmap__dot.is-active { background: var(--green); width: 46px; }
.pmap__dot.is-done { background: var(--mint); }
.pmap__steps { display: grid; gap: clamp(1rem, 2vw, 1.4rem); }
.pmap__step { position: relative; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: clamp(1.3rem, 2.6vw, 2rem); box-shadow: var(--shadow-sm); display: grid; grid-template-columns: auto 1fr; gap: 1.3rem; transition: transform var(--t-med) var(--ease), box-shadow var(--t-med) var(--ease), border-color var(--t-med) var(--ease); }
.pmap__num { width: 54px; height: 54px; border-radius: 14px; background: var(--paper); border: 1px solid var(--line); display: grid; place-items: center; font-family: var(--f-mono); font-weight: 700; font-size: 1.2rem; color: var(--ink-55); transition: all var(--t-med) var(--ease); }
.pmap__step.is-active { border-color: rgba(58,118,187,.45); transform: translateX(6px); box-shadow: var(--shadow-md); }
.pmap__step.is-active .pmap__num { background: var(--green); border-color: var(--green); color: var(--white); transform: rotate(-6deg); }
.pmap__step h3 { font-size: 1.2rem; }
.pmap__step p { margin-top: .45rem; color: var(--ink-72); font-size: .98rem; }
.pmap__tag { display: inline-block; margin-top: .8rem; font-family: var(--f-mono); font-size: .72rem; letter-spacing: .08em; text-transform: uppercase; color: var(--purple); }

/* Why AI alone — two columns */
.why2 { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(1rem, 2.5vw, 1.6rem); }
.why2__col { border-radius: var(--radius); padding: clamp(1.5rem, 3vw, 2.2rem); }
.why2__col--ai { background: var(--surface); border: 1px dashed var(--line-2); }
.why2__col--sys { background: var(--green); color: var(--white); box-shadow: var(--shadow-md); }
.why2__h { font-size: 1.3rem; margin-bottom: 1rem; }
.why2__col--ai .why2__h { color: var(--ink-72); }
.why2 ul li { position: relative; padding-left: 1.8rem; padding-block: .55rem; border-top: 1px solid var(--line); }
.why2__col--sys ul li { border-top-color: rgba(255,255,255,.18); }
.why2 ul li:first-child { border-top: 0; }
.why2__col--ai li::before { content: "–"; position: absolute; left: .4rem; color: var(--ink-38); font-weight: 700; }
.why2__col--sys li::before { content: ""; position: absolute; left: 0; top: .95rem; width: 15px; height: 8px; border-left: 2px solid var(--mint); border-bottom: 2px solid var(--mint); transform: rotate(-45deg); }

/* What the client leaves with */
.deliver { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(.8rem, 2vw, 1.2rem); }
.deliver__item { position: relative; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: 1.4rem; box-shadow: var(--shadow-sm); transition: transform var(--t-med) var(--ease), border-color var(--t-med) var(--ease); }
.deliver__item:hover { transform: translateY(-4px); border-color: rgba(58,118,187,.35); }
.deliver__n { font-family: var(--f-mono); font-size: .76rem; color: var(--ink-38); }
.deliver__item h3 { font-size: 1.08rem; margin-top: .5rem; }
.deliver__item::after { content: ""; position: absolute; left: 1.4rem; bottom: 1.1rem; width: 22px; height: 3px; background: var(--mint); border-radius: 3px; }

/* Brand system panel (CSS design board) */
.bsys { display: grid; grid-template-columns: repeat(4, 1fr); grid-template-areas: "logo logo palette palette" "type web web social" "prompt prompt flyer flyer"; gap: clamp(.8rem, 1.8vw, 1.2rem); }
.bsys__cell { position: relative; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: clamp(1.1rem, 2vw, 1.5rem); box-shadow: var(--shadow-sm); min-height: 150px; display: flex; flex-direction: column; transition: transform var(--t-med) var(--ease), box-shadow var(--t-med) var(--ease); }
.bsys__cell:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.bsys__label { font-family: var(--f-mono); font-weight: 700; font-size: .7rem; letter-spacing: .14em; text-transform: uppercase; color: var(--ink-55); margin-bottom: .9rem; }
.bsys__logo { grid-area: logo; } .bsys__palette { grid-area: palette; } .bsys__type { grid-area: type; } .bsys__web { grid-area: web; } .bsys__social { grid-area: social; } .bsys__prompt { grid-area: prompt; } .bsys__flyer { grid-area: flyer; }
.bsys__lock { display: flex; align-items: center; gap: .7rem; margin: auto 0; }
.bsys__lock { align-items: center; }
.bsys__lock .logo { --logo-size: clamp(1.6rem, 1rem + 2.2vw, 2.4rem); }
.chips { display: flex; flex-wrap: wrap; gap: .55rem; margin: auto 0; }
.chip { flex: 1 1 84px; min-width: 80px; height: 64px; border-radius: 10px; background: var(--chip); border: 1px solid var(--line); display: flex; align-items: flex-end; padding: .4rem; }
.chip span { font-family: var(--f-mono); font-size: .66rem; font-weight: 700; color: var(--chiptext, #fff); }
.typeset { display: flex; align-items: center; gap: 1rem; margin: auto 0; }
.typeset__aa { font-family: var(--f-display); font-weight: 800; font-size: clamp(2.4rem, 2rem + 3vw, 3.8rem); line-height: 1; color: var(--green); }
.typeset__name { font-family: var(--f-display); font-weight: 700; font-size: .85rem; }
.typeset__name.body { font-family: var(--f-body); color: var(--ink-72); font-weight: 500; }
.typeset__sample { font-family: var(--f-mono); color: var(--ink-72); margin-top: .4rem; font-size: .8rem; }
.mock { margin: auto 0; width: 100%; }
.mock--web { border: 1px solid var(--line); border-radius: 10px; overflow: hidden; background: var(--paper); }
.mock__bar { display: flex; gap: 5px; padding: 8px 10px; background: var(--white); border-bottom: 1px solid var(--line); }
.mock__bar i { width: 8px; height: 8px; border-radius: 50%; background: var(--line-2); }
.mock__bar i:first-child { background: var(--green); } .mock__bar i:nth-child(2){ background: var(--mint); }
.mock__web { padding: .9rem; display: grid; gap: .5rem; }
.mock__web .hl { height: 16px; width: 70%; border-radius: 4px; background: var(--ink); }
.mock__web .ln { height: 8px; border-radius: 4px; background: var(--line-2); } .mock__web .ln.s { width: 55%; }
.mock__web .bt { height: 22px; width: 92px; border-radius: 99px; background: var(--green); margin-top: .3rem; }
.mock--social { aspect-ratio: 1/1; max-height: 150px; margin-inline: auto; border-radius: 12px; background: linear-gradient(150deg, var(--green), var(--mint)); display: flex; flex-direction: column; justify-content: flex-end; padding: .9rem; gap: .4rem; }
.mock__tag { align-self: flex-start; font-family: var(--f-mono); font-size: .6rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--ink); background: var(--white); padding: .15rem .5rem; border-radius: 999px; margin-bottom: auto; }
.mock__social .h { height: 14px; width: 75%; border-radius: 4px; background: var(--white); }
.mock__social .sub { height: 8px; width: 50%; border-radius: 4px; background: rgba(255,255,255,.6); }
.mock--prompt { background: var(--ink); border-radius: 10px; padding: 1rem; }
.mock__pdot { display: inline-block; width: 10px; height: 10px; border-radius: 50%; background: var(--purple); box-shadow: 0 0 0 4px var(--purple-tint); margin-bottom: .6rem; }
.mock__ptext { font-family: var(--f-mono); font-size: .78rem; line-height: 1.5; color: rgba(255,255,255,.86); }
.mock--flyer { border: 1px solid var(--line); border-radius: 10px; background: var(--paper); padding: 1rem; display: grid; gap: .5rem; align-content: start; }
.mock__flyer .h { height: 26px; width: 80%; border-radius: 4px; background: var(--green); }
.mock__flyer .ln { height: 8px; border-radius: 4px; background: var(--line-2); } .mock__flyer .ln.s { width: 60%; }
.mock__flyer .badge { width: 50px; height: 50px; border-radius: 50%; background: var(--orange); justify-self: end; }

/* =====================================================================
   14. WORK — hover/tap reveal concept cards
   ===================================================================== */
.work-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(1rem, 2.4vw, 1.6rem); }
.wcard { position: relative; border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; background: var(--surface); box-shadow: var(--shadow-sm); transition: transform var(--t-med) var(--ease), box-shadow var(--t-med) var(--ease), border-color var(--t-med) var(--ease); }
.wcard:hover { transform: translateY(-6px); box-shadow: var(--shadow-lg); border-color: rgba(58,118,187,.35); }
.wcard__visual { position: relative; aspect-ratio: 4/3; }
.wcard__body { padding: 1.3rem 1.4rem 1.5rem; }
.wcard__tag { font-family: var(--f-mono); font-weight: 700; font-size: .68rem; letter-spacing: .12em; text-transform: uppercase; color: var(--purple); background: var(--purple-tint); padding: .25rem .6rem; border-radius: 999px; }
.wcard__title { font-size: 1.25rem; margin-top: .8rem; }
.wcard__desc { margin-top: .5rem; color: var(--ink-72); font-size: .96rem; }
.wcard__more { margin-top: 1rem; border: 0; background: none; padding: 0; font: inherit; cursor: pointer; }
.wcard__reveal { position: absolute; inset: 0; background: rgba(35,31,32,.94); color: var(--white); padding: 1.5rem; display: grid; align-content: center; gap: 1rem; opacity: 0; visibility: hidden; transform: translateY(8px); transition: opacity var(--t-med) var(--ease), transform var(--t-med) var(--ease), visibility var(--t-med); }
.wcard:hover .wcard__reveal, .wcard:focus-within .wcard__reveal, .wcard.is-open .wcard__reveal { opacity: 1; visibility: visible; transform: none; }
.wcard__reveal dt { font-family: var(--f-mono); font-size: .7rem; letter-spacing: .12em; text-transform: uppercase; color: var(--mint); }
.wcard__reveal dd { margin: .2rem 0 0; font-size: .95rem; color: rgba(255,255,255,.88); }
.wcard__close { position: absolute; top: 12px; right: 12px; width: 34px; height: 34px; border-radius: 50%; border: 1px solid rgba(255,255,255,.3); background: transparent; color: var(--white); font-size: 1.1rem; display: grid; place-items: center; }

/* =====================================================================
   15. ABOUT
   ===================================================================== */
.about-lead { display: grid; grid-template-columns: 1.1fr .9fr; gap: clamp(1.5rem, 4vw, 4rem); align-items: start; }
.about-lead__big { font-family: var(--f-display); font-weight: 600; font-size: clamp(1.4rem, 1.1rem + 1.4vw, 2.1rem); line-height: 1.25; letter-spacing: -.02em; }
.about-lead__big em { font-style: italic; color: var(--green); }
.about-lead__body p { color: var(--ink-72); }
.about-lead__body p + p { margin-top: 1rem; }

.values { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(1rem, 2.4vw, 1.5rem); }
.value { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: clamp(1.3rem, 2.4vw, 1.8rem); box-shadow: var(--shadow-sm); transition: transform var(--t-med) var(--ease); }
.value:hover { transform: translateY(-4px); }
.value__n { font-family: var(--f-mono); font-size: .76rem; color: var(--green); }
.value h3 { font-size: 1.15rem; margin-top: .5rem; }
.value p { margin-top: .5rem; color: var(--ink-72); font-size: .95rem; }

/* human + AI + system diagram */
.triad { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 1rem; align-items: stretch; position: relative; }
.triad__node { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: clamp(1.3rem, 2.4vw, 2rem); text-align: center; box-shadow: var(--shadow-sm); }
.triad__node--human { border-top: 4px solid var(--green); }
.triad__node--mkt { border-top: 4px solid var(--purple); }
.triad__node--sys { border-top: 4px solid var(--mint); }
.triad__icon { width: 46px; height: 46px; margin: 0 auto 1rem; border-radius: 12px; display: grid; place-items: center; font-family: var(--f-mono); font-weight: 700; color: var(--white); }
.triad__node--human .triad__icon { background: var(--green); }
.triad__node--mkt .triad__icon { background: var(--purple); }
.triad__node--sys .triad__icon { background: var(--mint); }
.triad__node h3 { font-size: 1.15rem; }
.triad__node p { margin-top: .5rem; color: var(--ink-72); font-size: .94rem; }
.triad__eq { display: grid; place-items: center; }
.triad__result { margin-top: 1rem; text-align: center; font-family: var(--f-mono); font-size: .8rem; letter-spacing: .1em; text-transform: uppercase; color: var(--ink-55); }
.triad__result b { color: var(--green-deep); }

.facts { display: grid; grid-template-columns: repeat(2,1fr); gap: .9rem; }
.facts li { display: flex; align-items: center; gap: .8rem; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 1rem 1.2rem; font-weight: 500; box-shadow: var(--shadow-sm); }
.facts__i { flex: none; width: 14px; height: 14px; border-radius: 3px; background: var(--green); position: relative; }
.facts__i::after { content: ""; position: absolute; right: -5px; bottom: -5px; width: 8px; height: 8px; border-radius: 2px; background: var(--mint); }

/* =====================================================================
   16. CONTACT
   ===================================================================== */
.contact-grid { display: grid; grid-template-columns: 1.15fr .85fr; gap: clamp(2rem, 5vw, 4rem); align-items: start; }
.form { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); padding: clamp(1.4rem, 3.5vw, 2.5rem); box-shadow: var(--shadow-md); }
.form__row { display: grid; grid-template-columns: 1fr 1fr; gap: 1.1rem; margin-bottom: 1.1rem; }
.field { display: flex; flex-direction: column; }
.field label { font-family: var(--f-display); font-weight: 600; font-size: .85rem; margin-bottom: .4rem; }
.field input, .field select, .field textarea { font: inherit; color: var(--ink); background: var(--paper); border: 1.5px solid var(--line); border-radius: 10px; padding: .72rem .85rem; width: 100%; transition: border-color var(--t-fast) var(--ease), background var(--t-fast) var(--ease), box-shadow var(--t-fast) var(--ease); }
.field textarea { resize: vertical; min-height: 120px; }
.field input:focus, .field select:focus, .field textarea:focus { outline: none; border-color: var(--green); background: var(--white); box-shadow: 0 0 0 3px var(--green-tint); }
.field select { appearance: none; -webkit-appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23231F20' stroke-width='2.5'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right .85rem center; padding-right: 2.2rem; }
.form > .field { margin-bottom: 1.1rem; }
.form__submit { width: 100%; margin-top: .4rem; }
.form__note { margin-top: .9rem; font-size: .85rem; color: var(--ink-55); text-align: center; font-family: var(--f-mono); }
.contact-aside { display: grid; gap: 1.2rem; }
.aside-card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: clamp(1.3rem, 2.6vw, 1.8rem); box-shadow: var(--shadow-sm); }
.aside-card h3 { font-size: 1.1rem; }
.aside-card--dark { background: var(--ink); color: var(--white); }
.aside-card--dark a { color: var(--mint); }
.aside-steps { display: grid; gap: .9rem; margin-top: 1rem; counter-reset: step; }
.aside-steps li { display: grid; grid-template-columns: auto 1fr; gap: .9rem; align-items: start; color: var(--ink-72); font-size: .95rem; }
.aside-steps li::before { counter-increment: step; content: counter(step); font-family: var(--f-mono); font-weight: 700; width: 28px; height: 28px; border-radius: 8px; background: var(--green-tint); color: var(--green-deep); display: grid; place-items: center; font-size: .85rem; }
.aside-email { font-family: var(--f-mono); font-size: 1rem; font-weight: 700; margin-top: .8rem; word-break: break-all; }

/* =====================================================================
   17. RESPONSIVE
   ===================================================================== */
@media (max-width: 1000px) {
  .hero__inner { grid-template-columns: 1fr; }
  .stage { max-width: 460px; margin-inline: auto; width: 100%; }
  .problem__grid { grid-template-columns: 1fr; }
  .sysprev { grid-template-columns: 1fr; }
  .footer__top { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 820px) {
  /* Mobile: hide the inline desktop nav and show the hamburger. The actual
     mobile navigation is the full-screen .mobilemenu overlay (a body-level
     element, so its position:fixed is viewport-relative and never trapped by
     the header's backdrop-filter). */
  .nav__toggle { display: inline-flex; align-items: center; justify-content: center; }
  .nav__menu { display: none; }
  .nav__backdrop { display: none; }
  .pillars { grid-template-columns: 1fr; }
  .concept-grid { grid-template-columns: 1fr; }
  .stagegrid { grid-template-columns: repeat(3, 1fr); }
  .footer__top { grid-template-columns: 1fr; gap: 1.6rem; }
}
@media (max-width: 540px) {
  .hero__actions .btn { width: 100%; }
  .shiftdemo__head { flex-direction: column; align-items: stretch; }
  .toggle { align-self: flex-start; }
}

/* Interior pages */
@media (max-width: 1000px) {
  .pmap { grid-template-columns: 1fr; }
  .pmap__rail { position: relative; top: 0; }
  .pmap__bigtitle { min-height: 0; }
  .about-lead { grid-template-columns: 1fr; }
  .contact-grid { grid-template-columns: 1fr; }
  .deliver { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 820px) {
  .pkgs { grid-template-columns: 1fr; }
  .decide { grid-template-columns: 1fr; }
  .why2 { grid-template-columns: 1fr; }
  .work-grid { grid-template-columns: 1fr; }
  .values { grid-template-columns: 1fr; }
  .triad { grid-template-columns: 1fr; }
  .deliver { grid-template-columns: 1fr; }
  .bsys { grid-template-columns: 1fr 1fr; grid-template-areas: "logo logo" "palette palette" "type web" "social prompt" "flyer flyer"; }
  .facts { grid-template-columns: 1fr; }
  /* Touch: reveal cards open via .is-open instead of hover */
  .wcard__reveal { padding: 1.3rem; }
}
@media (max-width: 540px) {
  .form__row { grid-template-columns: 1fr; }
  .bsys { grid-template-columns: 1fr; grid-template-areas: "logo" "palette" "type" "web" "social" "prompt" "flyer"; }
}

/* =====================================================================
   18. REDUCED MOTION
   ===================================================================== */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { animation-duration: .001ms !important; animation-iteration-count: 1 !important; transition-duration: .001ms !important; }
  .tile { opacity: 1 !important; transform: none !important; }
  .grid-bg { transform: none !important; }
  .js .reveal { opacity: 1 !important; transform: none !important; }
  .js main { animation: none !important; }
  .marquee__track { animation: none !important; }
  .cursor-ring, .cursor-dot { display: none !important; }
}

/* =====================================================================
   REVIEW UPDATE (v3): blue palette, Libre Baskerville/Montserrat, new home sections,
   grid-flow background, thinner ticker, square scroll-mouse.
   Later in the file = these override earlier equal-specificity rules.
   ===================================================================== */

/* ---- Hero: single column, eyebrow, rotating word ---- */
.hero__inner { grid-template-columns: 1fr; }
.hero__copy { max-width: 940px; }
.hero__eyebrow {
  font-family: var(--f-body); font-weight: 700; font-size: .82rem;
  letter-spacing: .16em; text-transform: uppercase; color: var(--green);
  margin-bottom: 1.15rem;
}
.hero__title { letter-spacing: -.02em; }
.rotate { color: var(--green); display: inline-block; min-width: 5.2ch; text-align: left; }
.rotate::after { content: none !important; display: none !important; }
.kicker__dot { background: var(--mint); }
/* (Removed the .scrollmouse hero scroll-indicator — the bordered rectangle with
   the moving mint dot — per request.) */

/* ---- Grid-flow background: blocks that rearrange every 3s ---- */
.gridflow {
  position: absolute; inset: 0; overflow: hidden; pointer-events: none; z-index: 0;
  -webkit-mask-image: radial-gradient(ellipse 92% 88% at 50% 38%, #000 52%, transparent 100%);
  mask-image: radial-gradient(ellipse 92% 88% at 50% 38%, #000 52%, transparent 100%);
}
.gridflow__cell {
  position: absolute; border-radius: 2px; opacity: 0; transform: scale(.5);
  transition: opacity 1.35s var(--ease), transform 1.35s var(--ease), background-color 1.35s var(--ease);
}
.gridflow__cell.is-on { opacity: var(--gf-o, .16); transform: scale(1); }

/* ---- Ticker: thinner, seamless, square separators ---- */
.ticker { border-block: 1px solid var(--line); background: var(--surface); overflow: hidden; }
.ticker__track { display: flex; width: max-content; animation: tickermove 45s linear infinite; }
.ticker__track span { display: inline-flex; align-items: center; font-family: var(--f-body); font-weight: 600; font-size: .78rem; letter-spacing: .09em; text-transform: uppercase; color: var(--ink-72); padding: .5rem 0; white-space: nowrap; }
.ticker__track span::after { content: ""; width: 5px; height: 5px; margin: 0 1.4rem; background: var(--green); display: inline-block; }
.ticker__track span:nth-child(even)::after { background: var(--mint); }
@keyframes tickermove { from { transform: translateX(0); } to { transform: translateX(-50%); } }

/* ---- 2. General value ---- */
.value2 { display: grid; grid-template-columns: 1.05fr .95fr; gap: clamp(1.5rem, 4vw, 4rem); align-items: start; }
.value2__lead .s-lead { margin-bottom: 1.4rem; }
.value2__list { border-top: 1px solid var(--line-2); }
.value2__list li { display: grid; grid-template-columns: 9.5rem 1fr; gap: 1rem; padding: 1.05rem 0; border-bottom: 1px solid var(--line); align-items: baseline; }
.value2__k { font-family: var(--f-display); font-weight: 700; font-size: 1.3rem; letter-spacing: -.01em; }
.value2__d { color: var(--ink-72); }

/* ---- 3. Services tiles ---- */
.svc-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: clamp(.7rem, 1.6vw, 1rem); }
.svc a { position: relative; display: grid; grid-template-columns: auto 1fr auto; grid-template-rows: auto auto; column-gap: 1.1rem; padding: 1.25rem 1.4rem; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); text-decoration: none; color: inherit; overflow: hidden; transition: transform .3s var(--ease), box-shadow .3s var(--ease), border-color .3s var(--ease); }
.svc a::before { content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background: var(--green); transform: scaleY(0); transform-origin: top; transition: transform .3s var(--ease); }
.svc a:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); border-color: rgba(58,118,187,.4); }
.svc a:hover::before { transform: scaleY(1); }
.svc__n { grid-row: 1 / 3; align-self: center; font-family: var(--f-mono); font-weight: 700; font-size: .82rem; letter-spacing: .06em; color: var(--ink-38); }
.svc__name { grid-column: 2; grid-row: 1; font-family: var(--f-display); font-weight: 700; font-size: 1.14rem; }
.svc__d { grid-column: 2; grid-row: 2; color: var(--ink-72); font-size: .88rem; margin-top: .1rem; }
.svc__arr { grid-column: 3; grid-row: 1 / 3; align-self: center; color: var(--green); transition: transform .3s var(--ease); }
.svc a:hover .svc__arr { transform: translateX(4px); }

/* ---- 4. Why us ---- */
.whyus { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(1.5rem, 4vw, 4rem); align-items: start; }
.whyus__lead p { color: var(--ink-72); margin-top: 1rem; max-width: 48ch; }
.whyus__lead .btn { margin-top: 1.5rem; }
.whyus__list { display: grid; gap: .9rem; }
.whyus__list li { background: var(--surface); border: 1px solid var(--line); border-left: 3px solid var(--green); border-radius: var(--radius-sm); padding: 1.1rem 1.3rem; }
.whyus__t { display: block; font-family: var(--f-display); font-weight: 700; font-size: 1.05rem; }
.whyus__d { display: block; color: var(--ink-72); font-size: .93rem; margin-top: .25rem; }
.whyus__list li:nth-child(2) { border-left-color: var(--mint); }
.whyus__list li:nth-child(3) { border-left-color: var(--purple); }

/* ---- 5. Packages preview (dark, no prices) ---- */
.packages-preview { background: var(--ink); color: var(--white); }
.pprev { display: grid; grid-template-columns: 1.1fr .9fr; gap: clamp(1.5rem, 4vw, 4rem); align-items: center; }
.packages-preview .s-title { color: var(--white); }
.packages-preview .s-lead { color: rgba(255,255,255,.75); }
.packages-preview .kicker { color: rgba(255,255,255,.7); }
.packages-preview .kicker__num { color: var(--mint); background: rgba(42,181,154,.16); }
.pprev__copy .btn { margin-top: 1.6rem; }
.pprev__tiers { display: grid; gap: .6rem; }
.pprev__tiers li { display: flex; align-items: center; gap: 1rem; padding: 1rem 1.2rem; border: 1px solid rgba(255,255,255,.16); border-radius: var(--radius-sm); font-family: var(--f-display); font-weight: 700; font-size: 1.08rem; transition: border-color .3s var(--ease), background .3s var(--ease); }
.pprev__tiers li:hover { border-color: var(--mint); background: rgba(255,255,255,.04); }
.pprev__num { font-family: var(--f-mono); font-size: .8rem; color: var(--mint); }

/* ---- 6. Rotating client needs ---- */
.needs__head { max-width: 760px; margin-inline: auto; text-align: center; }
.needs__head .kicker { justify-content: center; }
.needs__head .s-lead { margin-inline: auto; }
.needs__quote { max-width: 920px; margin: clamp(1.4rem, 4vw, 2.4rem) auto 1.4rem; text-align: center; min-height: 4.2em; display: grid; place-items: center; }
.needs__text { font-family: var(--f-display); font-weight: 700; font-size: clamp(1.4rem, 1rem + 2.2vw, 2.5rem); line-height: 1.22; color: var(--ink); transition: opacity .4s var(--ease), transform .4s var(--ease); }
.needs__quote.is-swapping .needs__text { opacity: 0; transform: translateY(10px); }
.needs__dots { display: flex; justify-content: center; gap: .5rem; }
.needs__dots button { width: 9px; height: 9px; border-radius: 2px; background: var(--line-2); border: 0; padding: 0; cursor: pointer; transition: background .3s var(--ease), transform .3s var(--ease); }
.needs__dots button.is-active { background: var(--green); transform: scale(1.15); }

/* ---- 7. Home contact intro (kept: index-refined.html still uses these) ---- */
.contact-intro__email { margin-top: 1.2rem; color: var(--ink-72); }
.contact-intro__email a { color: var(--green-deep); font-weight: 600; text-decoration: underline; text-underline-offset: 3px; }
.contact-intro__email a:hover { color: var(--green); }

/* ---- Responsive for new sections ---- */
@media (max-width: 920px) {
  .value2, .whyus, .pprev { grid-template-columns: 1fr; }
}
@media (max-width: 760px) {
  .svc-grid { grid-template-columns: 1fr; }
  .value2__list li { grid-template-columns: 1fr; gap: .15rem; }
}

/* ---- Reduced motion for new motion ---- */
@media (prefers-reduced-motion: reduce) {
  .ticker__track { animation: none !important; transform: none !important; }
  .gridflow__cell { transition: none !important; }
}

/* ---- Services detail blocks (services.html) ---- */
.svc-detail { display: grid; gap: clamp(.8rem, 2vw, 1.2rem); }
.svcblock { display: grid; grid-template-columns: auto 1fr; gap: clamp(1rem, 3vw, 2.4rem); padding: clamp(1.4rem, 3vw, 2.2rem); background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow-sm); scroll-margin-top: 96px; transition: border-color .3s var(--ease), transform .3s var(--ease); }
.svcblock:hover { border-color: rgba(58,118,187,.35); transform: translateY(-2px); }
.svcblock__n { font-family: var(--f-mono); font-weight: 700; color: var(--ink-38); font-size: 1.05rem; }
.svcblock__body h2 { font-size: clamp(1.4rem, 1.1rem + 1vw, 1.95rem); }
.svcblock__desc { color: var(--ink-72); margin-top: .55rem; max-width: 62ch; }
.svcblock__list { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: 1.1rem; }
.svcblock__list li { font-family: var(--f-mono); font-size: .74rem; letter-spacing: .02em; color: var(--green-deep); background: var(--green-tint); border: 1px solid var(--line); padding: .3rem .65rem; border-radius: 999px; }
.svcblock .link-cta { margin-top: 1.2rem; }
@media (max-width: 640px) { .svcblock { grid-template-columns: 1fr; gap: .6rem; } }

/* ---- Packages page: minimum-term note ---- */

/* =====================================================================
   TYPOGRAPHY CORRECTIONS (authoritative — placed last so they win)
   • Libre Baskerville (serif, --f-display) -> large hero/display + major section headings
   • Montserrat (--f-body) -> body, nav, buttons, forms, labels, pricing, FAQ,
                   footer text and card/offering headings (readability)
   ===================================================================== */

/* Default sub-headings to Montserrat; reserve Libre Baskerville for h1 + display classes */
h2, h3, h4, h5, h6 { font-family: var(--f-body); }
h1 { font-family: var(--f-display); }

/* Libre Baskerville — big display / major statements only */
.hero__title,
.page-hero__title,
.s-title,
.cta__title,
.about-lead__big,
.needs__text,
.value2__k,
.footer__watermark { font-family: var(--f-display); }

/* Montserrat — UI, forms, nav, buttons, small labels, pricing, card titles */
.btn, .btn__label,
.link-cta,
.field label,
input, select, textarea, button,
.footer__tag,
.svcblock__body h2,
.wcard__title,
.card__title,
.svc__name,
.whyus__t,
.pprev__tiers li,
.value h3,
.triad__node h3,
.deliver__item h3,
.aside-card h3,
.value2__d { font-family: var(--f-body); }

/* Nav is Montserrat at every breakpoint */
.nav__menu a { font-family: var(--f-body); }
@media (max-width: 820px) {
  .nav__menu a:not(.btn) { font-family: var(--f-body); }
}

/* =====================================================================
   MOBILE MENU — full-screen overlay (body-level, so position:fixed is
   viewport-relative and always paints above everything). Replaces the old
   in-header drawer that was trapped by the header's backdrop-filter.
   ===================================================================== */
.mobilemenu {
  position: fixed; inset: 0; z-index: 300;
  background: var(--ink); color: var(--white);
  display: flex; flex-direction: column; justify-content: center;
  padding: clamp(1.6rem, 7vw, 3.5rem);
  opacity: 0; visibility: hidden; transform: translateY(-6px);
  transition: opacity .35s var(--ease), transform .35s var(--ease), visibility .35s;
  overflow-y: auto; overscroll-behavior: contain;
}
.mobilemenu.is-open { opacity: 1; visibility: visible; transform: none; }
/* subtle GridShift grid lines in the background */
.mobilemenu__lines { position: absolute; inset: 0; pointer-events: none; opacity: .5;
  background-image: linear-gradient(to right, rgba(255,255,255,.06) 1px, transparent 1px);
  background-size: 25% 100%; }
.mobilemenu__close {
  position: absolute; top: 1.1rem; right: 1.1rem; width: 46px; height: 46px;
  background: transparent; border: 1px solid rgba(255,255,255,.28); border-radius: 0; cursor: pointer;
  transition: border-color .2s var(--ease), background .2s var(--ease);
}
.mobilemenu__close:hover, .mobilemenu__close:focus-visible { border-color: var(--mint); background: rgba(255,255,255,.05); }
.mobilemenu__close::before, .mobilemenu__close::after { content: ""; position: absolute; left: 50%; top: 50%; width: 18px; height: 2px; background: var(--white); }
.mobilemenu__close::before { transform: translate(-50%, -50%) rotate(45deg); }
.mobilemenu__close::after { transform: translate(-50%, -50%) rotate(-45deg); }
.mobilemenu__nav { position: relative; z-index: 1; }
.mobilemenu__list { display: grid; gap: .1rem; }
.mobilemenu__list li { opacity: 0; transform: translateY(10px); }
.mobilemenu.is-open .mobilemenu__list li { opacity: 1; transform: none; transition: opacity .4s var(--ease) calc(var(--i, 0) * .05s + .08s), transform .4s var(--ease) calc(var(--i, 0) * .05s + .08s); }
.mobilemenu__list a {
  display: inline-block; font-family: var(--f-display); font-weight: 700;
  font-size: clamp(2rem, 9vw, 3.1rem); letter-spacing: -.02em; line-height: 1.1;
  color: var(--white); text-decoration: none; padding: .3rem 0;
  transition: color .2s var(--ease), transform .25s var(--ease);
}
.mobilemenu__list a:hover, .mobilemenu__list a:focus-visible { color: var(--mint); transform: translateX(6px); }
.mobilemenu__list a[aria-current="page"] { color: var(--mint); }
.mobilemenu__list a[aria-current="page"]::after { content: ""; display: inline-block; width: .45em; height: .12em; background: var(--orange); margin-left: .35em; vertical-align: middle; }
.mobilemenu__cta { margin-top: 1.7rem; }
.mobilemenu__foot { position: relative; z-index: 1; margin-top: 2rem; font-family: var(--f-body); font-size: .78rem; letter-spacing: .12em; text-transform: uppercase; color: rgba(255,255,255,.5); }
/* Only ever shown on mobile; on desktop the inline nav is used */
@media (min-width: 821px) { .mobilemenu { display: none; } }
@media (prefers-reduced-motion: reduce) {
  .mobilemenu, .mobilemenu__list li { transition: none !important; }
}

/* =====================================================================
   Libre Baskerville display polish (subtle — no layout redesign).
   Libre Baskerville ships only 400 + 700, so every display heading is pinned
   to bold 700 for a clean, credible serif (no synthesized 800, never thin).
   A slightly more generous line-height on the biggest titles keeps it airy.
   ===================================================================== */
h1,
.hero__title, .page-hero__title,
.s-title, .cta__title,
.about-lead__big, .needs__text, .value2__k,
.footer__watermark,
.mobilemenu__list a {
  font-weight: 700;
}
.hero__title, .page-hero__title { line-height: 1.08; }
.s-title { line-height: 1.12; }
/* Libre Baskerville (serif) is a touch wider — give the rotating hero word more
   room so the fixed headline text never shifts. */
.rotate { min-width: 6.5ch; }

/* =====================================================================
   SERVICE ICONS — consistent inline Lucide-style icons in square grid
   tiles, with a polished hover (icon shifts, tile tints, accent square).
   ===================================================================== */
/* Square icon tile (shared home + services page) */
.svc__tile, .svcblock__tile {
  position: relative; display: inline-flex; align-items: center; justify-content: center;
  width: 46px; height: 46px; flex: none;
  background: var(--paper); border: 1px solid var(--line); border-radius: 6px;
  color: var(--ink);
  transition: background .3s var(--ease), border-color .3s var(--ease), color .3s var(--ease);
}
.svc__ico, .svcblock__ico { width: 22px; height: 22px; display: block; transition: transform .3s var(--ease); }
/* small mint accent square that pops on hover */
.svc__tile::after, .svcblock__tile::after {
  content: ""; position: absolute; top: -3px; right: -3px; width: 7px; height: 7px;
  background: var(--mint); opacity: 0; transform: scale(.4);
  transition: opacity .3s var(--ease), transform .3s var(--ease);
}
.svc a:hover .svc__tile, .svcblock:hover .svcblock__tile {
  background: var(--green-tint); border-color: rgba(58,118,187,.45); color: var(--green);
}
.svc a:hover .svc__ico, .svcblock:hover .svcblock__ico { transform: translate(2px,-2px); }
.svc a:hover .svc__tile::after, .svcblock:hover .svcblock__tile::after { opacity: 1; transform: scale(1); }

/* Home service tiles: icon | text | arrow (number is now inline in the name) */
.svc a { grid-template-columns: auto 1fr auto; grid-template-rows: auto; align-items: center; column-gap: 1.1rem; }
.svc__text { display: flex; flex-direction: column; gap: .12rem; min-width: 0; }
.svc__name { grid-column: auto; grid-row: auto; font-family: var(--f-body); font-weight: 700; font-size: 1.05rem; letter-spacing: 0; }
.svc__n { position: static; grid-row: auto; align-self: auto; display: inline; font-family: var(--f-body); font-weight: 700; font-size: .72rem; color: var(--ink-38); margin-right: .45rem; letter-spacing: .04em; }
.svc__d { grid-column: auto; grid-row: auto; color: var(--ink-72); font-size: .86rem; }
.svc__arr { grid-column: auto; grid-row: auto; }

/* Services page: stack the number above the icon tile in the lead column */
.svcblock__lead { display: flex; flex-direction: column; align-items: flex-start; gap: .7rem; }

@media (max-width: 400px) {
  .svc__tile, .svcblock__tile { width: 42px; height: 42px; }
  .svc a { column-gap: .8rem; }
}

/* Services page: "Best for" line under each service description */
.svcblock__for { margin-top: .7rem; font-size: .92rem; color: var(--ink-72); }
.svcblock__for span { display: inline-block; font-family: var(--f-body); font-weight: 700; font-size: .68rem; letter-spacing: .09em; text-transform: uppercase; color: var(--green-deep); margin-right: .5rem; vertical-align: 1px; }

/* =====================================================================
   SAMPLE DIRECTIONS PAGE — concept sample gallery + CSS mockup kit
   ===================================================================== */
/* ---- Hero cluster (design-board fragments) ---- */
.samphero { display: grid; grid-template-columns: 1.05fr .95fr; gap: clamp(1.5rem, 4vw, 3.5rem); align-items: center; }
.samphero__cluster { position: relative; aspect-ratio: 5 / 4; }
.samphero__cluster .mk { position: absolute; box-shadow: var(--shadow-md); }
.samphero__cluster .mk:nth-child(1) { left: 0; top: 6%; width: 62%; height: 46%; transform: rotate(-2deg); }
.samphero__cluster .mk:nth-child(2) { right: 2%; top: 0; width: 40%; height: 34%; transform: rotate(2.5deg); }
.samphero__cluster .mk:nth-child(3) { right: 6%; bottom: 4%; width: 52%; height: 44%; transform: rotate(-1.5deg); }
.samphero__cluster .mk:nth-child(4) { left: 10%; bottom: 0; width: 34%; height: 34%; transform: rotate(3deg); }
@media (max-width: 1000px) { .samphero { grid-template-columns: 1fr; } .samphero__cluster { max-width: 460px; } }

/* ---- Honesty note ---- */
.notecard { display: grid; grid-template-columns: auto 1fr; gap: 1.3rem; background: var(--ink); color: var(--white); border-radius: var(--radius-lg); padding: clamp(1.5rem, 3.5vw, 2.4rem); box-shadow: var(--shadow-lg); align-items: start; overflow: hidden; position: relative; }
.notecard::after { content: ""; position: absolute; right: -30px; bottom: -30px; width: 130px; height: 130px; background-image: linear-gradient(rgba(255,255,255,.08) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,.08) 1px, transparent 1px); background-size: 20px 20px; }
.notecard__mark { display: grid; grid-template-columns: 1fr 1fr; gap: 4px; width: 40px; height: 40px; }
.notecard__mark i { border-radius: 3px; } .notecard__mark i:nth-child(1){background:var(--green)} .notecard__mark i:nth-child(2){background:var(--mint)} .notecard__mark i:nth-child(3){background:var(--purple)} .notecard__mark i:nth-child(4){background:var(--orange)}
.notecard h2 { color: var(--white); font-size: clamp(1.3rem, 1rem + 1.2vw, 1.8rem); }
.notecard p { color: rgba(255,255,255,.8); margin-top: .6rem; max-width: 70ch; }

/* ---- Filter chips ---- */
.filters { display: flex; flex-wrap: wrap; gap: .5rem; margin-bottom: clamp(1.4rem, 3vw, 2rem); }
.filter { font-family: var(--f-body); font-weight: 600; font-size: .85rem; letter-spacing: .01em; padding: .5rem 1.05rem; border: 1px solid var(--line-2); background: var(--surface); color: var(--ink); border-radius: 999px; cursor: pointer; transition: background .25s var(--ease), color .25s var(--ease), border-color .25s var(--ease); }
.filter:hover { border-color: var(--ink); }
.filter.is-active { background: var(--ink); color: var(--white); border-color: var(--ink); }

/* ---- Sample cards ---- */
.samp-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: clamp(1rem, 2.4vw, 1.6rem); }
.samp { position: relative; border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; background: var(--surface); box-shadow: var(--shadow-sm); transition: transform .4s var(--ease), box-shadow .4s var(--ease), border-color .4s var(--ease); }
.samp:hover { transform: translateY(-6px); box-shadow: var(--shadow-lg); border-color: rgba(58,118,187,.35); }
.samp.is-hidden { display: none; }
.samp__meta { padding: 1.2rem 1.4rem 1.5rem; }
.samp__label { display: inline-block; font-family: var(--f-body); font-weight: 700; font-size: .66rem; letter-spacing: .12em; text-transform: uppercase; color: var(--purple); background: var(--purple-tint); padding: .28rem .6rem; border-radius: 999px; }
.samp__title { font-family: var(--f-display); font-weight: 700; font-size: clamp(1.2rem, 1rem + .8vw, 1.5rem); margin-top: .8rem; line-height: 1.12; }
.samp__for { margin-top: .6rem; font-size: .9rem; color: var(--ink-72); }
.samp__for span { display: inline-block; font-weight: 700; font-size: .66rem; letter-spacing: .09em; text-transform: uppercase; color: var(--green-deep); margin-right: .4rem; }
.samp__desc { margin-top: .6rem; color: var(--ink-72); font-size: .95rem; }
.samp__services { display: flex; flex-wrap: wrap; gap: .4rem; margin-top: 1rem; }
.samp__services a { font-family: var(--f-body); font-weight: 600; font-size: .74rem; color: var(--green-deep); background: var(--green-tint); border: 1px solid var(--line); padding: .26rem .6rem; border-radius: 999px; text-decoration: none; transition: background .2s var(--ease), color .2s var(--ease); }
.samp__services a:hover, .samp__services a:focus-visible { background: var(--green); color: var(--white); }
.samp__more { margin-top: 1.2rem; border: 0; background: none; padding: 0; cursor: pointer; font-family: var(--f-body); font-weight: 600; font-size: .9rem; color: var(--green-deep); display: inline-flex; align-items: center; gap: .4rem; }
.samp__more .arr { transition: transform .25s var(--ease); }
.samp__more:hover .arr { transform: translateX(4px); }
/* reveal overlay */
.samp__reveal { position: absolute; inset: 0; background: rgba(35,31,32,.95); color: var(--white); padding: clamp(1.2rem,3vw,1.7rem); display: grid; align-content: center; gap: .85rem; opacity: 0; visibility: hidden; transform: translateY(8px); transition: opacity .35s var(--ease), transform .35s var(--ease), visibility .35s; }
.samp:hover .samp__reveal, .samp:focus-within .samp__reveal, .samp.is-open .samp__reveal { opacity: 1; visibility: visible; transform: none; }
.samp__reveal dt { font-family: var(--f-body); font-weight: 700; font-size: .68rem; letter-spacing: .12em; text-transform: uppercase; color: var(--mint); }
.samp__reveal dd { margin: .2rem 0 0; font-size: .95rem; color: rgba(255,255,255,.9); }
.samp__close { position: absolute; top: 12px; right: 12px; width: 34px; height: 34px; border-radius: 0; border: 1px solid rgba(255,255,255,.3); background: transparent; color: var(--white); font-size: 1.1rem; display: grid; place-items: center; cursor: pointer; }
@media (max-width: 820px) { .samp-grid { grid-template-columns: 1fr; } }

/* ---- Mockup kit (CSS-built artboards) ---- */
.samp__board { position: relative; aspect-ratio: 4 / 3; background: var(--paper); border-bottom: 1px solid var(--line); padding: clamp(.85rem, 2.4vw, 1.25rem); display: grid; grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; gap: .7rem; overflow: hidden; }
.samp__board::before { content: ""; position: absolute; inset: 0; background-image: linear-gradient(var(--line) 1px, transparent 1px), linear-gradient(90deg, var(--line) 1px, transparent 1px); background-size: 26px 26px; opacity: .45; pointer-events: none; }
.mk { position: relative; z-index: 1; background: var(--surface); border: 1px solid var(--line); border-radius: 6px; box-shadow: var(--shadow-sm); overflow: hidden; padding: .55rem; display: flex; flex-direction: column; gap: .34rem; min-width: 0; }
.mk__bar { display: flex; gap: 4px; margin: -.55rem -.55rem .28rem; padding: 6px 8px; background: #fff; border-bottom: 1px solid var(--line); }
.mk__dot { width: 6px; height: 6px; border-radius: 50%; background: var(--line-2); }
.mk__bar .mk__dot:nth-child(1){ background: var(--green); } .mk__bar .mk__dot:nth-child(2){ background: var(--mint); }
.mk__hl { height: 9px; border-radius: 2px; background: var(--ink); width: 72%; }
.mk__ln { height: 5px; border-radius: 2px; background: var(--line-2); } .mk__ln.s { width: 55%; } .mk__ln.xs { width: 34%; }
.mk__btn { height: 12px; width: 44px; border-radius: 99px; background: var(--green); margin-top: 2px; }
.mk__btn.accent { background: var(--orange); }
.mk__chips { display: flex; gap: 4px; height: 15px; margin-top: auto; } .mk__chips i { flex: 1; border-radius: 2px; } .mk__chips i:nth-child(1){background:var(--green)}.mk__chips i:nth-child(2){background:var(--mint)}.mk__chips i:nth-child(3){background:var(--ink)}.mk__chips i:nth-child(4){background:var(--purple)}
.mk__wm { font-family: var(--f-display); font-weight: 700; font-size: 1rem; letter-spacing: -.01em; color: var(--ink); line-height: 1; }
.mk__wm b { color: var(--green); font-weight: 700; }
.mk__aa { font-family: var(--f-display); font-weight: 700; font-size: 1.5rem; color: var(--green); line-height: 1; }
.mk__tag { align-self: flex-start; font-family: var(--f-body); font-weight: 700; font-size: .52rem; letter-spacing: .1em; text-transform: uppercase; color: var(--ink); background: var(--white); padding: .12rem .4rem; border-radius: 999px; }
.mk__bars { display: flex; align-items: flex-end; gap: 4px; height: 34px; margin-top: auto; }
.mk__bars i { flex: 1; background: var(--green); border-radius: 2px 2px 0 0; }
.mk__bars i:nth-child(2){ background: var(--mint); } .mk__bars i:nth-child(4){ background: var(--purple); }
.mk__badge { width: 26px; height: 26px; border-radius: 50%; background: var(--orange); align-self: flex-end; margin-top: auto; }
/* tile variants */
.mk--social { background: linear-gradient(150deg, var(--green), var(--mint)); }
.mk--social .mk__hl { background: #fff; } .mk--social .mk__ln { background: rgba(255,255,255,.6); }
.mk--ad { background: var(--ink); } .mk--ad .mk__hl { background: #fff; width: 80%; } .mk--ad .mk__ln { background: rgba(255,255,255,.35); }
.mk--dark { background: var(--ink); } .mk--dark .mk__hl { background: #fff; } .mk--dark .mk__ln { background: rgba(255,255,255,.3); }
.mk--fill { background: var(--paper); }
.mk__phonebar { height: 5px; width: 34px; border-radius: 99px; background: var(--line-2); align-self: center; margin: -.2rem 0 .1rem; }
.mk__emailhead { height: 16px; border-radius: 3px 3px 0 0; background: linear-gradient(90deg, var(--green), var(--mint)); margin: -.55rem -.55rem .3rem; }

/* =====================================================================
   SERVICES + PACKAGES v2 — premium agency layout components
   ===================================================================== */
/* Core service grid (icon tile card + helps-with chips) */
.score-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: clamp(.9rem, 2vw, 1.3rem); }
.score { position: relative; display: flex; flex-direction: column; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: clamp(1.3rem, 2.4vw, 1.8rem); box-shadow: var(--shadow-sm); scroll-margin-top: 96px; transition: transform .3s var(--ease), box-shadow .3s var(--ease), border-color .3s var(--ease); }
.score:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); border-color: rgba(58,118,187,.35); }
.score__ico { position: relative; width: 46px; height: 46px; display: inline-flex; align-items: center; justify-content: center; background: var(--paper); border: 1px solid var(--line); border-radius: 6px; color: var(--ink); transition: background .3s var(--ease), color .3s var(--ease), border-color .3s var(--ease); }
.score__ico svg { width: 23px; height: 23px; transition: transform .3s var(--ease); }
.score__ico::after { content: ""; position: absolute; top: -3px; right: -3px; width: 7px; height: 7px; background: var(--mint); opacity: 0; transform: scale(.4); transition: opacity .3s var(--ease), transform .3s var(--ease); }
.score:hover .score__ico { background: var(--green-tint); color: var(--green); border-color: rgba(58,118,187,.45); }
.score:hover .score__ico svg { transform: translate(2px,-2px); }
.score:hover .score__ico::after { opacity: 1; transform: scale(1); }
.score__title { font-family: var(--f-display); font-weight: 700; font-size: 1.18rem; margin-top: 1rem; }
.score__desc { color: var(--ink-72); margin-top: .5rem; font-size: .95rem; }
.score__chips { display: flex; flex-wrap: wrap; gap: .35rem; margin-top: 1rem; }
.score__chips li { font-family: var(--f-body); font-size: .72rem; color: var(--ink-72); background: var(--paper); border: 1px solid var(--line); padding: .22rem .55rem; border-radius: 999px; }
.score .link-cta { margin-top: auto; padding-top: 1.2rem; }
@media (max-width: 820px) { .score-grid { grid-template-columns: 1fr; } }

/* Strategic category blocks */
.cat { background: var(--surface); border: 1px solid var(--line); border-left: 4px solid var(--green); border-radius: var(--radius); padding: clamp(1.4rem, 3vw, 2.1rem); box-shadow: var(--shadow-sm); }
.cat + .cat { margin-top: 1rem; }
.cat--b { border-left-color: var(--mint); } .cat--c { border-left-color: var(--purple); }
.cat__k { font-family: var(--f-body); font-weight: 700; font-size: .72rem; letter-spacing: .1em; text-transform: uppercase; color: var(--green-deep); }
.cat__title { font-family: var(--f-display); font-weight: 700; font-size: clamp(1.4rem, 1rem + 1vw, 1.9rem); margin-top: .4rem; }
.cat__desc { color: var(--ink-72); margin-top: .7rem; max-width: 74ch; }
.cat__services { display: flex; flex-wrap: wrap; gap: .45rem; margin-top: 1.1rem; }
.cat__services a { font-family: var(--f-body); font-weight: 600; font-size: .78rem; color: var(--green-deep); background: var(--green-tint); border: 1px solid var(--line); padding: .28rem .65rem; border-radius: 999px; text-decoration: none; transition: background .2s var(--ease), color .2s var(--ease); }
.cat__services a:hover, .cat__services a:focus-visible { background: var(--green); color: var(--white); }

/* Connected-system flow */
.flow { display: grid; grid-template-columns: repeat(4, 1fr); gap: .7rem; }
.flow__step { position: relative; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: 1.2rem 1.3rem; }
.flow__step .n { font-family: var(--f-body); font-weight: 700; font-size: .72rem; color: var(--green); }
.flow__step h3 { font-family: var(--f-display); font-weight: 700; font-size: 1.05rem; margin-top: .3rem; }
.flow__step p { color: var(--ink-72); font-size: .85rem; margin-top: .35rem; }
.flow__step:not(:last-child)::after { content: "→"; position: absolute; right: -.6rem; top: 50%; transform: translateY(-50%); color: var(--ink-38); z-index: 2; font-size: 1.1rem; }
@media (max-width: 820px) { .flow { grid-template-columns: 1fr; } .flow__step:not(:last-child)::after { content: "↓"; right: 50%; top: auto; bottom: -.65rem; transform: translateX(50%); } }

/* Numbered process list */
.proclist { display: grid; gap: .8rem; max-width: 860px; counter-reset: proc; }
.proclist li { display: grid; grid-template-columns: auto 1fr; gap: 1rem; align-items: start; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 1rem 1.2rem; box-shadow: var(--shadow-sm); }
.proclist li::before { counter-increment: proc; content: counter(proc); font-family: var(--f-body); font-weight: 700; width: 30px; height: 30px; border-radius: 8px; background: var(--green-tint); color: var(--green-deep); display: grid; place-items: center; font-size: .9rem; }
.proclist strong { font-family: var(--f-display); font-weight: 700; display: block; }
.proclist p { color: var(--ink-72); font-size: .92rem; margin-top: .2rem; }

/* Inclusions (grouped "what support can include") */
.incl-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 1rem; }
.incl { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: 1.3rem 1.4rem; box-shadow: var(--shadow-sm); }
.incl h3 { font-family: var(--f-display); font-weight: 700; font-size: 1.06rem; }
.incl ul { margin-top: .75rem; display: grid; gap: .42rem; }
.incl li { position: relative; padding-left: 1.15rem; color: var(--ink-72); font-size: .9rem; }
.incl li::before { content: ""; position: absolute; left: 0; top: .5rem; width: 6px; height: 6px; background: var(--mint); border-radius: 2px; }

/* benefit cards reuse .deliver__item; allow a supporting line */
.deliver__item p { color: var(--ink-72); font-size: .85rem; margin-top: .35rem; }

/* Why-GridShift point grid */
.whyg { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(.9rem, 2vw, 1.3rem); }
.whyg__item { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: 1.3rem 1.4rem; box-shadow: var(--shadow-sm); }
.whyg__item h3 { font-family: var(--f-display); font-weight: 700; font-size: 1.08rem; }
.whyg__item p { color: var(--ink-72); font-size: .92rem; margin-top: .4rem; }
.whyg__item::before { content: ""; display: block; width: 22px; height: 4px; background: var(--green); border-radius: 3px; margin-bottom: .9rem; }
.whyg__item:nth-child(2)::before { background: var(--mint); } .whyg__item:nth-child(3)::before { background: var(--purple); }
.whyg__item:nth-child(5)::before { background: var(--mint); } .whyg__item:nth-child(6)::before { background: var(--purple); }
@media (max-width: 820px) { .whyg { grid-template-columns: 1fr; } }

/* editorial philosophy statement */
.philo { font-family: var(--f-display); font-weight: 700; font-size: clamp(1.5rem, 1.1rem + 2vw, 2.6rem); line-height: 1.18; letter-spacing: -.01em; max-width: 20ch; }
.philo-grid { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(1.5rem, 4vw, 3.5rem); align-items: center; }
.philo-grid p { color: var(--ink-72); font-size: clamp(1.02rem,1rem+.3vw,1.15rem); }
@media (max-width: 820px) { .philo-grid { grid-template-columns: 1fr; } .philo { max-width: none; } }


/* ---- The Shift page (merged About + Shift) helpers ---- */
.triad__icon svg { width: 22px; height: 22px; }
.whofor { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: 1.4rem; }
.whofor .tagchip { font-size: .82rem; padding: .45rem .95rem; }
.prob-grid { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(1.5rem,4vw,3.5rem); align-items: center; }
@media (max-width: 820px) { .prob-grid { grid-template-columns: 1fr; } }

/* =====================================================================
   SERVICES DROPDOWN (desktop disclosure) + MOBILE SUBMENU + service pages
   Added for the Services split. No changes to the existing design language.
   ===================================================================== */

/* ---- Layering fix: the hero <main> gets a transform animation + z-index:2
   (a stacking context), so the header/dropdown must sit clearly above it. ---- */
.site-header { z-index: 1000; }        /* overrides the earlier .site-header,main z-index:2 */
.header__inner { position: relative; } /* positioning context for the mega panel */
.mobilemenu { z-index: 2000; }         /* full-screen menu above the raised header */
.skip-link { z-index: 3000; }          /* keep the skip link reachable on focus */

/* ---- Desktop Services mega-menu ---- */
.hasdrop { position: static; display: flex; align-items: center; align-self: stretch; }
.nav__dropbtn {
  display: inline-flex; align-items: center; gap: .4rem; height: 100%;
  font-family: var(--f-body); font-weight: 500; font-size: .95rem; color: var(--ink);
  background: transparent; border: 0; padding: .5rem .85rem; cursor: pointer;
  position: relative; letter-spacing: normal; transition: color var(--t-fast) var(--ease);
}
.nav__dropbtn::after {
  content: ""; position: absolute; left: .85rem; right: .85rem; bottom: 0; height: 2px;
  background: var(--mint); transform: scaleX(0); transform-origin: left;
  transition: transform var(--t-fast) var(--ease);
}
.hasdrop:hover .nav__dropbtn, .nav__dropbtn:focus-visible { color: var(--green); }
.hasdrop.is-open .nav__dropbtn { color: var(--green); }
.hasdrop:hover .nav__dropbtn::after, .hasdrop.is-open .nav__dropbtn::after, .nav__dropbtn:focus-visible::after { transform: scaleX(1); }
.hasdrop.is-current .nav__dropbtn { color: var(--green-deep); }
.hasdrop.is-current .nav__dropbtn::after { transform: scaleX(1); background: var(--green); }
.nav__caret {
  width: 7px; height: 7px; border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
  transform: translateY(-2px) rotate(45deg); transition: transform var(--t-fast) var(--ease);
}
.hasdrop.is-open .nav__caret { transform: translateY(1px) rotate(-135deg); }

/* Panel: solid, container-aligned, drops flush under the header (no hover gap) */
.nav__panel {
  position: absolute; top: 100%; left: 0; right: 0; margin: 0;
  background: var(--surface);
  border: 1px solid var(--line-2); border-top: 2px solid var(--green);
  border-radius: 0 0 var(--radius) var(--radius);
  box-shadow: 0 26px 54px rgba(35,31,32,.18), 0 4px 12px rgba(35,31,32,.08);
  padding: clamp(1.5rem, 2.4vw, 2.3rem);
  display: grid; grid-template-columns: minmax(230px, .9fr) 2.2fr; gap: clamp(1.4rem, 3vw, 3rem);
  opacity: 0; visibility: hidden; pointer-events: none; transform: translateY(-10px);
  transition: opacity .2s var(--ease), transform .2s var(--ease), visibility .2s;
  z-index: 60;
}
.hasdrop.is-open .nav__panel,
html:not(.js) .hasdrop:hover .nav__panel,
html:not(.js) .hasdrop:focus-within .nav__panel {
  opacity: 1; visibility: visible; pointer-events: auto; transform: translateY(0);
}
/* Left intro column */
.nav__mega-intro { border-right: 1px solid var(--line); padding-right: clamp(1rem, 2vw, 2rem); }
.nav__mega-label { font-family: var(--f-mono); font-weight: 700; font-size: .72rem; letter-spacing: .14em; text-transform: uppercase; color: var(--green-deep); }
.nav__mega-title { font-family: var(--f-display); font-weight: 700; font-size: 1.4rem; line-height: 1.15; margin-top: .5rem; letter-spacing: -.01em; }
.nav__mega-copy { font-family: var(--f-body); font-weight: 400; font-size: .88rem; line-height: 1.5; color: var(--ink-72); margin-top: .7rem; letter-spacing: normal; }
/* Right: grouped link columns */
.nav__mega-cols { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(1rem, 1.6vw, 1.6rem); align-items: start; }
.nav__mega-group { display: flex; flex-direction: column; gap: .1rem; }
.nav__mega-gk { font-family: var(--f-mono); font-weight: 700; font-size: .68rem; letter-spacing: .12em; text-transform: uppercase; color: var(--ink-55); padding: 0 .55rem; margin-bottom: .35rem; }
.megalink { display: grid; grid-template-columns: auto 1fr; align-items: center; gap: .7rem; text-decoration: none; padding: .5rem .55rem; border-radius: 10px; transition: background .16s var(--ease); }
.megalink__ico { width: 34px; height: 34px; flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; background: var(--paper); border: 1px solid var(--line); border-radius: 7px; color: var(--ink); transition: background .16s var(--ease), color .16s var(--ease), border-color .16s var(--ease); }
.megalink__ico svg { width: 17px; height: 17px; }
.megalink__tx { display: flex; flex-direction: column; min-width: 0; }
.megalink__name { font-family: var(--f-body); font-weight: 600; font-size: .92rem; line-height: 1.25; color: var(--ink); letter-spacing: normal; }
.megalink__desc { font-family: var(--f-body); font-weight: 400; font-size: .78rem; line-height: 1.3; color: var(--ink-72); letter-spacing: normal; margin-top: .05rem; }
.megalink:hover, .megalink:focus-visible { background: var(--green-tint); }
.megalink:hover .megalink__ico, .megalink:focus-visible .megalink__ico { background: var(--white); color: var(--green); border-color: rgba(58,118,187,.45); }
.megalink:hover .megalink__name, .megalink:focus-visible .megalink__name { color: var(--green-deep); }
.megalink[aria-current="page"] { background: var(--green-tint); }
.megalink[aria-current="page"] .megalink__ico { background: var(--green); color: var(--white); border-color: var(--green); }
.megalink[aria-current="page"] .megalink__name { color: var(--green-deep); }
.nav__mega-enquire { display: inline-flex; align-items: center; gap: .4rem; margin-top: .55rem; margin-left: .55rem; font-family: var(--f-body); font-weight: 600; font-size: .86rem; color: var(--green-deep); text-decoration: none; }
.nav__mega-enquire:hover, .nav__mega-enquire:focus-visible { color: var(--green); }
.nav__mega-enquire .arr { transition: transform var(--t-fast) var(--ease); }
.nav__mega-enquire:hover .arr { transform: translateX(3px); }
@media (max-width: 1040px) {
  .nav__panel { grid-template-columns: 1fr; gap: 1.2rem; padding: 1.4rem; }
  .nav__mega-intro { border-right: 0; border-bottom: 1px solid var(--line); padding-right: 0; padding-bottom: 1.1rem; }
  .nav__mega-cols { grid-template-columns: 1fr 1fr; }
}

/* ---- Mobile Services submenu (inside the full-screen overlay) ---- */
.mobilemenu.is-expanded { justify-content: flex-start; }
.mobilemenu__subtoggle {
  display: flex; align-items: center; gap: .5rem; width: 100%; background: transparent; border: 0;
  padding: .3rem 0; text-align: left; cursor: pointer;
  font-family: var(--f-display); font-weight: 700; font-size: clamp(2rem, 9vw, 3.1rem);
  letter-spacing: -.02em; line-height: 1.1; color: var(--white);
  transition: color .2s var(--ease);
}
.mobilemenu__subtoggle:hover, .mobilemenu__subtoggle:focus-visible { color: var(--mint); }
.mm-caret { width: .46em; height: .46em; border-right: 3px solid currentColor; border-bottom: 3px solid currentColor; transform: rotate(45deg); transition: transform .25s var(--ease); opacity: .7; margin-left: .15em; }
.mm-group.is-sub-open .mm-caret { transform: rotate(-135deg); }
.mm-group.is-current > .mobilemenu__subtoggle { color: var(--mint); }
.mobilemenu__sub { margin: .5rem 0 .8rem; display: grid; gap: .05rem; padding-left: .1rem; border-left: 2px solid rgba(255,255,255,.16); }
.mobilemenu__sub li { opacity: 1 !important; transform: none !important; }
.mobilemenu__sub a {
  display: inline-block; font-family: var(--f-body); font-weight: 500; font-size: 1.18rem; line-height: 1.3;
  letter-spacing: 0; color: rgba(255,255,255,.82); text-decoration: none; padding: .5rem .9rem;
  transition: color .2s var(--ease), transform .2s var(--ease);
}
.mobilemenu__sub a:hover, .mobilemenu__sub a:focus-visible { color: var(--mint); transform: translateX(5px); }
.mobilemenu__sub a[aria-current="page"] { color: var(--mint); }
.mobilemenu__sub a[aria-current="page"]::after { content: none; }

/* ---- Service page helpers ---- */
.svc-hero__ico { margin-bottom: 1.1rem; }
.bestfor {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: .3rem .8rem;
  background: var(--surface); border: 1px solid var(--line); border-left: 4px solid var(--mint);
  border-radius: var(--radius-sm); padding: 1rem 1.2rem; box-shadow: var(--shadow-sm);
  color: var(--ink-72); font-size: .98rem;
}
.bestfor__k { font-family: var(--f-mono); font-weight: 700; font-size: .72rem; letter-spacing: .1em; text-transform: uppercase; color: var(--green-deep); }
.checklist { display: grid; grid-template-columns: 1fr 1fr; gap: .5rem 1.2rem; }
.checklist li { position: relative; padding-left: 1.3rem; color: var(--ink-72); font-size: .95rem; }
.checklist li::before { content: ""; position: absolute; left: 0; top: .55em; width: 8px; height: 8px; background: var(--mint); border-radius: 2px; }
@media (max-width: 640px) { .checklist { grid-template-columns: 1fr; } }

.rel-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: clamp(.7rem, 1.6vw, 1rem); }
.relcard {
  display: flex; align-items: center; gap: .8rem; text-decoration: none; color: var(--ink);
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 1.1rem 1.2rem; box-shadow: var(--shadow-sm);
  transition: transform .25s var(--ease), box-shadow .25s var(--ease), border-color .25s var(--ease);
}
.relcard:hover, .relcard:focus-visible { transform: translateY(-4px); box-shadow: var(--shadow-md); border-color: rgba(58,118,187,.35); }
.relcard__ico { width: 40px; height: 40px; flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; background: var(--paper); border: 1px solid var(--line); border-radius: 6px; color: var(--ink); }
.relcard__ico svg { width: 20px; height: 20px; }
.relcard:hover .relcard__ico { background: var(--green-tint); color: var(--green); border-color: rgba(58,118,187,.45); }
.relcard__t { font-family: var(--f-display); font-weight: 700; font-size: .98rem; line-height: 1.15; }
.relcard .arr { margin-left: auto; color: var(--ink-38); transition: transform .25s var(--ease), color .25s var(--ease); }
.relcard:hover .arr { color: var(--green-deep); transform: translateX(3px); }
@media (max-width: 900px) { .rel-grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 560px) { .rel-grid { grid-template-columns: 1fr; } }

@media (prefers-reduced-motion: reduce) {
  .nav__panel, .nav__caret, .mm-caret, .relcard, .megalink { transition: none !important; }
}

/* Invisible hover bridge: fills the gap between the (vertically-centred) Services
   button and the panel that drops at the header's bottom edge, so the pointer
   never leaves the hover region on the way down. */
.nav__dropbtn::before { content: ""; position: absolute; left: 0; right: 0; top: 100%; height: 26px; }

/* =====================================================================
   HOMEPAGE REFRESH (2026-07) — appended last so these win at equal
   specificity. Covers: mint hero button, stronger hero subheadline,
   dark "What we do" + "Why GridShift" sections, premium service cards
   (3-up, no SEO on home), packages teaser (background-image ready),
   editorial client-goal quotes.
   ===================================================================== */

/* ---- Buttons: solid mint (ink text for contrast on #2AB59A) + light ghost ---- */
.btn--mint { --btn-bg: var(--mint); --btn-fg: var(--ink); box-shadow: 0 8px 22px rgba(42,181,154,.28); }
.btn--mint:hover { background: #23a189; box-shadow: 0 14px 30px rgba(42,181,154,.36); }
.btn--ghostlight { --btn-bg: transparent; --btn-fg: var(--white); border-color: rgba(255,255,255,.45); }
.btn--ghostlight:hover { border-color: var(--white); background: rgba(255,255,255,.08); }

/* ---- Hero subheadline: black, slightly larger + heavier (supports the H1) ---- */
.hero__sub {
  color: #000000;
  font-size: clamp(1.12rem, 1rem + .62vw, 1.42rem);
  font-weight: 500;
  line-height: 1.55;
  max-width: 56ch;
}

/* ---- Shared dark-section treatment ---- */
.section--dark { background: var(--ink); color: var(--white); }
.section--dark .s-title { color: var(--white); }
.section--dark .s-lead { color: rgba(255,255,255,.75); }
.section--dark .kicker { color: var(--mint); }
.link-cta--light { color: var(--mint); }
.link-cta--light:hover { color: var(--white); }

/* ---- 2. What we do (dark, 3×2 card grid, mint key titles) ---- */
.wwd {
  background-image:
    linear-gradient(rgba(255,255,255,.045) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,.045) 1px, transparent 1px);
  background-size: 44px 44px;
}
.wwd__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(.9rem, 2vw, 1.3rem); }
.wwd__item {
  position: relative; background: rgba(255,255,255,.03);
  border: 1px solid rgba(255,255,255,.14); border-radius: var(--radius);
  padding: clamp(1.3rem, 2.4vw, 1.9rem);
  transition: transform .3s var(--ease), border-color .3s var(--ease), background .3s var(--ease);
}
.wwd__item::before { content: ""; display: block; width: 10px; height: 10px; background: var(--mint); margin-bottom: 1rem; }
.wwd__item:nth-child(3n+2)::before { background: var(--green); }
.wwd__item:nth-child(3n)::before { background: var(--purple); }
.wwd__item:hover { transform: translateY(-4px); border-color: rgba(42,181,154,.55); background: rgba(255,255,255,.055); }
.wwd__k { font-family: var(--f-display); font-weight: 700; font-size: 1.35rem; letter-spacing: -.01em; color: var(--mint); }
.wwd__d { margin-top: .55rem; color: rgba(255,255,255,.72); font-size: .95rem; }
.wwd .link-cta--light { margin-top: clamp(1.8rem, 3.5vw, 2.6rem); }

/* ---- 3. Service cards (visual block on top, 3-up desktop) ---- */
.scard-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(1rem, 2vw, 1.4rem); }
.scard a {
  position: relative; display: flex; flex-direction: column; height: 100%;
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
  overflow: hidden; text-decoration: none; color: inherit; box-shadow: var(--shadow-sm);
  transition: transform .35s var(--ease), box-shadow .35s var(--ease), border-color .35s var(--ease);
}
.scard a:hover { transform: translateY(-6px); box-shadow: var(--shadow-md); border-color: rgba(58,118,187,.4); }
/* Visual block: tinted panel + faint grid + large line-icon watermark.
   Swap in a real image later by replacing the contents of .scard__visual. */
.scard__visual {
  position: relative; aspect-ratio: 16 / 9; display: grid; place-items: center;
  border-bottom: 1px solid var(--line); overflow: hidden;
  background: linear-gradient(135deg, var(--green-tint), rgba(58,118,187,.18));
}
.scard__visual::before {
  content: ""; position: absolute; inset: 0;
  background-image: linear-gradient(var(--line) 1px, transparent 1px), linear-gradient(90deg, var(--line) 1px, transparent 1px);
  background-size: 26px 26px; opacity: .5;
}
.scard__visual::after {
  content: ""; position: absolute; top: 12px; right: 12px; width: 8px; height: 8px;
  background: var(--mint); opacity: 0; transform: scale(.4);
  transition: opacity .3s var(--ease), transform .3s var(--ease);
}
.scard a:hover .scard__visual::after { opacity: 1; transform: scale(1); }
.scard__wm { position: relative; width: 54px; height: 54px; color: var(--green); opacity: .85; transition: transform .35s var(--ease); }
.scard a:hover .scard__wm { transform: translate(3px, -3px); }
.scard__visual--b { background: linear-gradient(135deg, var(--mint-tint), rgba(42,181,154,.22)); }
.scard__visual--b .scard__wm { color: #1E8E77; }
.scard__visual--c { background: linear-gradient(135deg, var(--purple-tint), rgba(146,95,167,.22)); }
.scard__visual--c .scard__wm { color: var(--purple); }
.scard__body { display: flex; flex-direction: column; flex: 1; padding: 1.15rem 1.3rem 1.25rem; }
.scard__head { display: flex; align-items: center; gap: .8rem; }
.scard__ico {
  width: 40px; height: 40px; flex: none; display: inline-flex; align-items: center; justify-content: center;
  background: var(--paper); border: 1px solid var(--line); border-radius: 6px; color: var(--ink);
  transition: background .3s var(--ease), color .3s var(--ease), border-color .3s var(--ease);
}
.scard__ico svg { width: 19px; height: 19px; }
.scard a:hover .scard__ico { background: var(--green-tint); color: var(--green); border-color: rgba(58,118,187,.45); }
.scard__name { font-family: var(--f-body); font-weight: 700; font-size: 1.05rem; line-height: 1.25; }
.scard__d { margin-top: .7rem; color: var(--ink-72); font-size: .92rem; }
.scard__go { margin-top: auto; padding-top: 1rem; align-self: flex-end; color: var(--green); transition: transform .3s var(--ease); }
.scard a:hover .scard__go { transform: translateX(4px); }
.scard-more { margin-top: clamp(1.6rem, 3vw, 2.2rem); }

/* ---- 4. Why GridShift (dark) ---- */
.whydark .whyus__copy { margin-top: 1.1rem; color: rgba(255,255,255,.75); max-width: 52ch; }
.whydark .whyus__lead .btn { margin-top: 1.8rem; }
.whydark .whyus__list li { background: rgba(255,255,255,.04); border: 1px solid rgba(255,255,255,.14); border-left: 3px solid var(--green); }
.whydark .whyus__list li:nth-child(2) { border-left-color: var(--mint); }
.whydark .whyus__list li:nth-child(3) { border-left-color: var(--purple); }
.whydark .whyus__t { color: var(--white); }
.whydark .whyus__d { color: rgba(255,255,255,.65); }

/* ---- 5. Packages teaser (dark; ready for a background image).
   To add the image: set background-image on .packages-preview — the
   ::before overlay keeps text readable. ---- */
.packages-preview { position: relative; overflow: hidden; background-color: var(--ink); background-size: cover; background-position: center; }
.packages-preview::before { content: ""; position: absolute; inset: 0; background: linear-gradient(rgba(28,25,26,.78), rgba(28,25,26,.88)); }
.packages-preview .container { position: relative; z-index: 1; }
.packages-preview .kicker { color: var(--mint); }
.pprev-teaser { max-width: 860px; margin-inline: auto; text-align: center; }
.pprev-teaser .s-lead { margin-inline: auto; }
.pprev-teaser__actions { display: flex; justify-content: center; flex-wrap: wrap; gap: .9rem; margin-top: 2.2rem; }

/* ---- 6. Client goals: large coloured quote marks, editorial feel ---- */
.needs__quote { position: relative; padding-top: clamp(2.6rem, 6vw, 4rem); }
.needs__quote::before {
  content: "\201C"; position: absolute; top: 0; left: 50%; transform: translateX(-52%);
  font-family: var(--f-display); font-weight: 700; line-height: 1;
  font-size: clamp(4.6rem, 10vw, 7.5rem); color: var(--green);
  pointer-events: none; user-select: none;
}
.needs__text { font-style: italic; }
.needs__text::after { content: ""; display: block; width: 44px; height: 3px; background: var(--mint); margin: 1.3rem auto 0; }

/* ---- Responsive ---- */
@media (max-width: 1000px) {
  .wwd__grid { grid-template-columns: repeat(2, 1fr); }
  .scard-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 640px) {
  .wwd__grid { grid-template-columns: 1fr; }
  .scard-grid { grid-template-columns: 1fr; }
}
@media (max-width: 540px) {
  .pprev-teaser__actions .btn { width: 100%; }
}
@media (prefers-reduced-motion: reduce) {
  .wwd__item, .scard a, .scard__wm, .scard__ico, .scard__go { transition: none !important; }
}

/* =====================================================================
   SERVICES DROPDOWN — hover-open safety net (desktop fine pointers).
   Pure CSS: even if JS is delayed or its hover detection misfires, hovering
   anywhere on the Services wrapper (button, hover bridge, or open panel —
   all inside .hasdrop) opens and holds the mega-menu. JS still adds
   .is-open for the 160ms close-delay, click toggle and keyboard support.
   ===================================================================== */
@media (hover: hover) and (pointer: fine) {
  .hasdrop:hover .nav__panel {
    opacity: 1; visibility: visible; pointer-events: auto; transform: translateY(0);
  }
  .hasdrop:hover .nav__caret { transform: translateY(1px) rotate(-135deg); }
}

/* =====================================================================
   IMAGE SLOTS (2026-07 refinement pass) — designed placeholders for the
   photography/mockups listed in IMAGE-STRATEGY.md. Replace the <figure>
   contents with a real <img loading="lazy" alt="..."> when images are
   chosen; the frame styling stays.
   ===================================================================== */
.img-slot-band { margin-block: clamp(.4rem, 1.5vw, 1rem) clamp(2rem, 4vw, 3rem); }
.img-slot {
  position: relative; display: grid; place-items: center; overflow: hidden;
  border: 1px dashed var(--line-2); border-radius: var(--radius);
  background:
    repeating-linear-gradient(45deg, rgba(35,31,32,.028) 0 14px, transparent 14px 28px),
    var(--surface);
}
.img-slot--wide { aspect-ratio: 21 / 8; }
.img-slot--tall { aspect-ratio: 4 / 5; }
.img-slot::before, .img-slot::after { content: ""; position: absolute; width: 10px; height: 10px; }
.img-slot::before { top: 12px; left: 12px; background: var(--mint); }
.img-slot::after { bottom: 12px; right: 12px; background: var(--green); }
.img-slot__note {
  font-family: var(--f-mono); font-weight: 600; font-size: .74rem;
  letter-spacing: .08em; text-transform: uppercase; color: var(--ink-55);
  text-align: center; padding: 1rem 1.5rem; max-width: 46ch;
}
.img-slot img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
@media (max-width: 640px) { .img-slot--wide { aspect-ratio: 16 / 9; } }

/* =====================================================================
   REFINEMENT PASS 2 (2026-07-15) — approved logo files, What-we-do icons,
   compact service cards, footer + typography consistency. Appended last.
   ===================================================================== */

/* ---- Approved logo (SVG files) replaces the CSS text lockup ---- */
.brand__img { display: block; width: auto; height: 44px; }
.site-footer .brand__img { height: 56px; }
@media (max-width: 540px) { .site-header .brand__img { height: 36px; } }

/* ---- Footer: descriptor sits under the logo, no decorative dash ---- */
.footer__tag { display: block; margin-top: 1rem; font-family: var(--f-body); font-weight: 600; }
.footer__tag::before { content: none; }

/* ---- What we do: icon tiles replace the accent squares ---- */
.wwd__item::before { content: none; }
.wwd__ico {
  display: inline-flex; align-items: center; justify-content: center;
  width: 42px; height: 42px; margin-bottom: 1rem;
  background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.18);
  border-radius: 6px; color: var(--mint);
  transition: border-color .3s var(--ease), color .3s var(--ease);
}
.wwd__ico svg { width: 21px; height: 21px; }
.wwd__item:hover .wwd__ico { border-color: rgba(42,181,154,.6); }

/* ---- Services: compact wide cards (3×3 fits one desktop viewport) ---- */
.scard-grid { gap: clamp(.7rem, 1.4vw, 1rem); }
.scard a { display: grid; grid-template-columns: 96px 1fr; align-items: stretch; }
.scard__visual { aspect-ratio: auto; height: 100%; min-height: 104px; border-bottom: 0; border-right: 1px solid var(--line); }
.scard__visual::before { background-size: 20px 20px; }
.scard__visual::after { top: 8px; right: 8px; width: 6px; height: 6px; }
.scard__wm { width: 32px; height: 32px; }
.scard__body { padding: .85rem 1.05rem .9rem; }
.scard__head { gap: .65rem; }
.scard__ico { width: 32px; height: 32px; border-radius: 5px; }
.scard__ico svg { width: 16px; height: 16px; }
.scard__name { font-size: .95rem; }
.scard__d { margin-top: .45rem; font-size: .82rem; line-height: 1.45; }
.scard__go { padding-top: .55rem; font-size: .95rem; }
@media (max-width: 640px) { .scard a { grid-template-columns: 84px 1fr; } .scard__visual { min-height: 92px; } }

/* ---- Why GridShift: uniform body sizing (hierarchy via heading only) ---- */
.whydark .whyus__sub { margin-top: 1.1rem; color: rgba(255,255,255,.92); font-weight: 600; max-width: 52ch; }

/* ---- Image placeholders: quieter, less "unfinished" in previews ---- */
.img-slot { border: 1px solid var(--line); background: linear-gradient(135deg, var(--green-tint), var(--mint-tint)); }
.img-slot__note { color: var(--ink-38); font-size: .68rem; }

/* =====================================================================
   REFINEMENT PASS 3 (2026-07-15) — footer logo watermark, two-column
   service heroes, mobile-menu overflow fix, dark-section register line.
   ===================================================================== */

/* ---- Footer watermark: approved inverse logo, oversized + subdued ---- */
.footer__watermark img { display: block; width: min(70%, 880px); height: auto; opacity: .05; user-select: none; }
@media (max-width: 640px) { .footer__watermark img { width: 88%; opacity: .06; } }

/* ---- Service-page hero: balanced copy + keyed image on desktop ---- */
.svc-hero2 { display: grid; grid-template-columns: 1.08fr .92fr; gap: clamp(2rem, 4vw, 4rem); align-items: center; position: relative; }
.svc-hero2 .page-hero__inner { max-width: 620px; }
.img-slot--hero { aspect-ratio: 4 / 3; margin: 0; }
.page-hero { padding-block: clamp(2.6rem, 5.5vw, 5rem) clamp(2rem, 4vw, 3.2rem); }
@media (max-width: 900px) {
  .svc-hero2 { grid-template-columns: 1fr; gap: 1.6rem; }
  .svc-hero2 .page-hero__inner { max-width: 640px; }
  .img-slot--hero { aspect-ratio: 16 / 9; }
}

/* ---- Signature "register line": the two logo bars as a hairline gradient
   marking every light→dark transition (brand alignment motif) ---- */
.section--dark, .packages-preview, .cta, .site-footer {
  border-top: 3px solid;
  border-image: linear-gradient(90deg, var(--mint), var(--green)) 1;
}

/* ---- Mobile menu: overflow-safe centering + comfier targets ---- */
.mobilemenu { justify-content: flex-start; padding-top: calc(var(--header-h) + 1rem); }
.mobilemenu__nav { margin-block: auto; width: 100%; }
.mobilemenu__sub a { padding: .65rem .9rem; }
.mobilemenu__foot { flex: none; }

/* =====================================================================
   CORRECTIONS (2026-07-15b) — restrained button hover, package-card
   alignment, tighter site-wide spacing scale.
   ===================================================================== */

/* ---- Buttons: magnetic drift capped at ±2px (JS strength also reduced) ---- */
[data-magnetic] { transform: translate(clamp(-2px, var(--mgx, 0px), 2px), clamp(-2px, var(--mgy, 0px), 2px)); }

/* ---- Package cards: CTAs pinned to a common baseline (grid rows stretch,
   .card is a flex column, so margin-top:auto reserves the description area
   without visible blank lines) ---- */

/* ---- Spacing scale (tokens re-declared last so they win):
   standard sections ~52–88px, tight ~40–56px, heads pulled closer to content.
   Hero, footer and dark feature transitions keep their intentional room. ---- */
:root {
  --section-y: clamp(3.25rem, 6vw, 5.5rem);   /* was 72–144px */
}
.section--tight { padding-block: clamp(2.5rem, 4vw, 3.5rem); }
.s-head { margin-bottom: clamp(1.7rem, 3vw, 2.6rem); }
.s-title { margin-top: .65rem; }
.s-lead { margin-top: .9rem; }
.img-slot-band { margin-block: clamp(.4rem, 1.2vw, .8rem) clamp(1.5rem, 3vw, 2.25rem); }
.wwd .link-cta--light { margin-top: clamp(1.4rem, 2.5vw, 2rem); }
.scard-more { margin-top: clamp(1.3rem, 2.5vw, 1.8rem); }
.pprev-teaser__actions { margin-top: 1.8rem; }
@media (max-width: 640px) {
  :root { --section-y: clamp(2.75rem, 10vw, 4rem); }  /* ~44–64px on mobile */
}

/* =====================================================================
   APPROVED IMAGES (2026-07-15c) — real service photos in the homepage
   cards + brick-wall background on the packages teaser.
   ===================================================================== */

/* Service card visuals: photo fully replaces the grid-line placeholder.
   One consistent treatment: cover, centred, gentle zoom on hover. */
.scard__visual img {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; object-position: center;
  transition: transform .35s var(--ease);
}
.scard a:hover .scard__visual img { transform: scale(1.04); }
.scard__visual::before { content: none; }   /* grid lines off behind photos */
@media (prefers-reduced-motion: reduce) { .scard__visual img { transition: none !important; transform: none !important; } }

/* Packages teaser: brick-wall photo (dark, lum ~22) + restrained overlay.
   Scoped to .packages-preview only — no other section is affected. */
/* (brick background moved to .whydark; homepage packages section deleted) */
.packages-preview::before { background: linear-gradient(rgba(28,25,26,.52), rgba(28,25,26,.66)); }
@media (max-width: 640px) {
  .packages-preview { background-position: center; }
}

/* ---- The Shift hero cluster: photo tiles (positions, rotations and
   shadows still come from the existing .samphero__cluster .mk rules) ---- */
.samphero__cluster .mk--photo { padding: 0; overflow: hidden; border: 1px solid var(--line); border-radius: 6px; }
.mk--photo img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: center; }
/* keep the top of the brand-board photo (tile 3) in view */
.samphero__cluster .mk:nth-child(3).mk--photo img { object-position: center 30%; }

/* ---- The Shift large visual (logo assembly): fully transparent stage —
   the animation sits directly on the page background. No panel, no frame. ---- */
.alignfield { background: transparent; border: none; }
.alignfield::before, .alignfield::after { content: none; }

/* =====================================================================
   STICKY BACKGROUND REVEAL (homepage, Services → Why GridShift).
   The image lives BEHIND the page: a tall wrapper with ±1 viewport of
   NEGATIVE MARGIN slides under the neighbouring sections, and its child
   frame pins to the viewport (position:sticky, one viewport tall).
   Timeline: Services (raised, opaque) scrolls away and REVEALS the
   already-pinned image → the image holds stationary → Why GridShift
   (raised, opaque) slides up and COVERS it. Pure CSS; no
   background-attachment:fixed; no scroll hijack; scroll-native so
   reduced motion needs no special casing. Sticky is safe here: body's
   overflow-x propagates to the viewport (the sticky header already
   relies on this), and no ancestor of the frame clips or transforms
   after the page-in animation completes.
   ===================================================================== */
.freveal {
  --fvh: 100vh;
  position: relative;
  height: calc(var(--fvh) * 2.6);              /* 260vh total scroll distance */
  margin-top: calc(var(--fvh) * -1);           /* first 100vh hides under Services */
  margin-bottom: calc(var(--fvh) * -1);        /* last 100vh hides under Why GridShift */
  background: var(--ink);                      /* seam safety: dark, never white */
}
@supports (height: 100svh) { .freveal { --fvh: 100svh; } }
@media (max-width: 820px) { .freveal { height: calc(var(--fvh) * 2.4); } }
.freveal__frame { position: sticky; top: 0; height: var(--fvh); overflow: hidden; }
.freveal__frame img { width: 100%; height: 100%; object-fit: cover; object-position: center 30%; display: block; }
.freveal__frame::after { content: ""; position: absolute; inset: 0; background: rgba(35,31,32,.18); }

/* Foreground layers: the sections around the reveal get solid backgrounds
   and a raised stacking order so they visibly slide OVER the pinned image.
   (#value and #why are dark sections with their own backgrounds; the
   Services section is given the page background explicitly.) */
#value, #services-preview, #why { position: relative; z-index: 2; }
#services-preview { background: var(--paper); }

/* =====================================================================
   ANTI-AI REFINEMENT PASS (2026-07-17). Each block below is independent —
   delete a block to revert that change. Full pre-pass copy of the site:
   gridshift-before-anti-ai-refinement.zip (+ browsable _original-preview/).
   ===================================================================== */

/* ---- [R1] Registration detail: crop marks on the pinned-image window
   (blue→teal, top-left / bottom-right). Delete block to remove. ---- */
.freveal__frame::before {
  content: ""; position: absolute; inset: 16px; z-index: 1; pointer-events: none;
  background:
    linear-gradient(var(--mint), var(--mint)) top left / 16px 2px,
    linear-gradient(var(--mint), var(--mint)) top left / 2px 16px,
    linear-gradient(var(--green), var(--green)) bottom right / 16px 2px,
    linear-gradient(var(--green), var(--green)) bottom right / 2px 16px;
  background-repeat: no-repeat; opacity: .85;
}

/* ---- [R2] Type statement (markup is its own section on index) ---- */
.typestate { padding-block: clamp(2.8rem, 6vw, 5rem); background: var(--paper); }
.typestate__t {
  margin: 0; font-family: var(--f-display); font-weight: 700;
  font-size: clamp(2.5rem, 1rem + 6.6vw, 6.2rem); line-height: 1.03;
  letter-spacing: -.025em; color: var(--ink); text-wrap: balance;
}
.typestate__t em { font-style: normal; color: var(--green); }

/* ---- [R3] Hover refinement: generic card-lift replaced with contextual
   feedback (border/arrow/image already move). Delete block to restore lifts. ---- */
.scard a:hover { transform: none; box-shadow: var(--shadow-sm); border-color: rgba(58,118,187,.55); }
.card:hover { transform: translateY(-2px); box-shadow: var(--shadow-sm); }
.relcard:hover, .relcard:focus-visible { transform: translateY(-2px); box-shadow: var(--shadow-sm); }
.decide__card:hover { transform: translateY(-2px); box-shadow: var(--shadow-sm); }
.score:hover { transform: translateY(-2px); box-shadow: var(--shadow-sm); }
.svc a:hover { transform: none; box-shadow: var(--shadow-sm); }
.svcblock:hover { transform: none; }
.deliver__item:hover { transform: none; border-color: rgba(58,118,187,.4); }
.value:hover { transform: none; }
.wwd__item:hover { transform: none; border-color: rgba(42,181,154,.55); background: rgba(255,255,255,.055); }
.samp:hover { transform: none; box-shadow: var(--shadow-md); }
.wcard:hover { transform: none; box-shadow: var(--shadow-md); }

/* ---- [R4] Motion hierarchy: scroll reveals softened so the three signature
   effects (hero grid, logo assembly, pinned window) stay dominant. ---- */
.js .reveal { transform: translateY(10px); transition: opacity .5s var(--ease-out), transform .55s var(--ease-out); }

/* ---- [R5] Hero Option A (preview: index.html?hero=a) — restrained editorial ---- */
.hero-a .hero__title { font-size: clamp(2.9rem, 1.1rem + 6.2vw, 6rem); letter-spacing: -.032em; }
.hero-a .hero__sub { max-width: 46ch; }
.hero-a .hero__eyebrow { color: var(--ink-55); letter-spacing: .2em; }
.hero-a .hero__copy { position: relative; }
.hero-a .hero__copy::before {
  content: ""; position: absolute; top: -6px; right: clamp(0px, 6vw, 90px);
  width: 15px; height: 15px; border: 1.5px solid rgba(58,118,187,.55); border-radius: 50%;
  background:
    linear-gradient(rgba(58,118,187,.55), rgba(58,118,187,.55)) center / 23px 1.5px,
    linear-gradient(rgba(58,118,187,.55), rgba(58,118,187,.55)) center / 1.5px 23px;
  background-repeat: no-repeat;
}
.hero-a .hero::after {
  content: ""; position: absolute; left: 50%; bottom: 14px; width: 1.5px; height: 34px;
  background: linear-gradient(var(--green), var(--mint)); opacity: .6;
}
@media (max-width: 640px) { .hero-a .hero__copy::before, .hero-a .hero::after { display: none; } }

/* ---- [R6] Hero Option B (preview: index.html?hero=b) — expressive asymmetry ---- */
.hero-b .hero__copy { max-width: 1080px; }
.hero-b .hero__title { font-size: clamp(3rem, 1rem + 7vw, 6.6rem); letter-spacing: -.035em; }
.hero-b .hero__eyebrow { margin-left: clamp(0px, 5vw, 70px); }
.hero-b .hero__sub {
  margin-left: clamp(0px, 9vw, 130px); max-width: 44ch;
  border-left: 2px solid var(--mint); padding-left: 1.1rem;
}
.hero-b .hero__actions { margin-left: clamp(0px, 9vw, 130px); }
@media (max-width: 640px) {
  .hero-b .hero__eyebrow, .hero-b .hero__sub, .hero-b .hero__actions { margin-left: 0; }
  .hero-b .hero__sub { border-left-width: 2px; }
}

/* =====================================================================
   VIDEO HERO (homepage; rollback: gridshift-before-video-hero.zip).
   Full-viewport background video under a transparent header; large
   inverse logo + centred blue/teal CTAs near the bottom. Reduced motion
   and autoplay failure both fall back to the poster frame.
   ===================================================================== */
.vhero {
  position: relative; height: 100vh; min-height: 560px;
  margin-top: calc(var(--header-h) * -1);   /* video reaches the very top, behind the transparent header */
  overflow: hidden; background: var(--ink);
}
@supports (height: 100svh) { .vhero { height: 100svh; } }
.vhero__video {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; object-position: center;
  background: url("../img/hero-poster.jpg") center / cover no-repeat; /* no black box before/without playback */
}
.vhero__shade {
  position: absolute; inset: 0;
  background: linear-gradient(rgba(20,18,19,.6) 0%, rgba(20,18,19,.16) 28%, rgba(20,18,19,.16) 55%, rgba(20,18,19,.68) 100%);
}
.vhero__content {
  position: absolute; left: 0; right: 0; bottom: 0;
  display: flex; flex-direction: column; align-items: center;
  padding: 0 var(--gutter) clamp(2.4rem, 5.5vh, 3.8rem);
}
.vhero__logo { width: min(340px, 62vw); height: auto; filter: drop-shadow(0 2px 12px rgba(20,18,19,.5)); }
.vhero__actions { display: flex; flex-wrap: wrap; justify-content: center; gap: .9rem; margin-top: clamp(1.5rem, 3.2vh, 2.4rem); }
@media (max-width: 540px) {
  .vhero__actions { flex-direction: column; width: min(320px, 100%); }
  .vhero__actions .btn { width: 100%; }
  .vhero__logo { width: min(250px, 66vw); }
}
@media (prefers-reduced-motion: reduce) {
  .vhero__video { display: none; }   /* static poster composition instead */
  .vhero { background: url("../img/hero-poster.jpg") center / cover no-repeat var(--ink); }
}

/* =====================================================================
   HERO RESTORED + video1 AS BACKGROUND ONLY (2026-07-24b).
   The previous approved left-aligned hero is back verbatim (markup from
   gridshift-before-video-hero.zip). video1 sits behind it under a
   paper-tinted left→right scrim: dense behind the ink text so every
   previous text/button style stays untouched, opening toward the video
   on the right. Gridflow + all hero styling unchanged. The centred
   video-hero version is archived in gridshift-video-hero-centred-version.zip.
   (.vhero / body.has-vhero blocks above are now inert — kept for that
   archive; delete freely once a direction is final.)
   ===================================================================== */
.hero--video { background: var(--paper); }
.hero__vid { position: absolute; inset: 0; overflow: hidden; }
.hero__vid video {
  width: 100%; height: 100%; object-fit: cover; object-position: center;
  display: block;
  background: url("../img/hero-poster.jpg") center / cover no-repeat; /* autoplay-blocked fallback */
}
/* Black overlay between video and content. The video is bright, so a
   uniform 40% left the headline weak over the windows/walls; per spec the
   fallback is a subtle left-heavier gradient: .62 behind the text → .26
   at the right edge (≈.44 average, inside the tested 35–50% band).
   Mobile (text spans full width): uniform .5. Never blocks pointer input. */
.hero__overlay {
  position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(90deg, rgba(0,0,0,.62) 0%, rgba(0,0,0,.44) 55%, rgba(0,0,0,.26) 100%);
}
@media (max-width: 760px) {
  .hero__overlay { background: rgba(0,0,0,.5); }
}
/* Content colours over the dark video (scoped to .hero--video only; the
   layout, wording, sizes and button system are untouched) */
.hero--video .hero__inner { z-index: 1; }
.hero--video .hero__title { color: var(--white); text-shadow: 0 1px 14px rgba(0,0,0,.35); }
.hero--video .hero__eyebrow { color: var(--mint); }
.hero--video .hero__sub { color: rgba(255,255,255,.94); text-shadow: 0 1px 10px rgba(0,0,0,.3); }
.hero--video .rotate { color: var(--mint); }
@media (prefers-reduced-motion: reduce) {
  .hero__vid video { display: none; }
  .hero__vid { background: url("../img/hero-poster.jpg") center / cover no-repeat; }
}

/* =====================================================================
   TARGETED REFINEMENT (2026-07-24c; rollback:
   gridshift-before-targeted-refinement.zip). Homepage-scoped via body.home.
   ===================================================================== */

/* ---- Global homepage consistency: sharp rectangular buttons, refined
   height, controlled heading scale ---- */
.home .btn { border-radius: 0; }
.home .btn--lg { padding: .85rem 1.8rem; font-size: 1.02rem; }   /* was 1.05rem 2rem — slightly shorter, still ≥48px tall */
.home .btn:not(.btn--lg):not(.btn--sm) { padding: .74rem 1.45rem; }
.home .btn--sm { padding: .55rem 1rem; }
.home .hero__title { font-size: clamp(2.3rem, 1rem + 4.6vw, 4.4rem); }   /* was up to 5.2rem */
.home .s-title { font-size: clamp(1.7rem, 1.1rem + 2.2vw, 2.7rem); }     /* was up to 3.4rem */
.home .hero { padding-block: clamp(2.2rem, 5vw, 4rem) clamp(2.6rem, 5vw, 4.5rem); }

/* ---- Hero overlay: 6% darker than previous (.62/.44/.26 → .68/.50/.32) ---- */
.home .hero__overlay { background: linear-gradient(90deg, rgba(0,0,0,.68) 0%, rgba(0,0,0,.5) 55%, rgba(0,0,0,.32) 100%); }
@media (max-width: 760px) { .home .hero__overlay { background: rgba(0,0,0,.56); } }

/* ---- What we do: two-column copy + editorial checklist ---- */
.wwd2 { display: grid; grid-template-columns: 1.05fr .95fr; gap: clamp(2rem, 5vw, 5rem); align-items: center; }
.wwd2__copy .s-lead { margin-top: .9rem; }
.wwd2__list { border-top: 1px solid rgba(255,255,255,.16); }
.wwd2__list li {
  display: flex; align-items: center; gap: .9rem;
  padding: .95rem 0; border-bottom: 1px solid rgba(255,255,255,.12);
  font-family: var(--f-body); font-weight: 600; font-size: 1.05rem; color: var(--white);
}
.wwd2__check { width: 20px; height: 20px; flex: none; color: var(--mint); }
@media (max-width: 920px) {
  .wwd2 { grid-template-columns: 1fr; gap: 1.8rem; }
}

/* ---- Why GridShift: brick background moves here (removed from the deleted
   packages section); overlay keeps content readable ---- */
.whydark {
  position: relative; overflow: hidden;
  background-image: url("../img/brick-wall-background.jpg");
  background-size: cover; background-position: center 40%;
}
/* Restore the anchored/fixed scroll feel on desktop (viewport-anchored image,
   section scrolls over it). Mobile keeps a stable scrolling background —
   background-attachment:fixed is broken/janky on iOS and Android WebView. */
@media (min-width: 821px) and (hover: hover) {
  .whydark { background-attachment: fixed; background-position: center; }
}
.whydark::before { content: ""; position: absolute; inset: 0; background: linear-gradient(rgba(28,25,26,.66), rgba(28,25,26,.78)); }
.whydark .container { position: relative; z-index: 1; }
@media (max-width: 640px) { .whydark { background-position: center; } }

/* ---- ROOT-CAUSE FIX: no "second opening" before the quotes section.
   The pinned-window wrapper (.freveal) overlaps one viewport into #why;
   after the refinement #why can be shorter than a viewport, so the still-
   pinned image showed through the TRANSPARENT sections that follow. Fix
   the cause: the following sections get solid backgrounds + raised
   stacking, so the page is opaque from #why onward. ---- */
#needs, .typestate, #contact { position: relative; z-index: 2; background: var(--paper); }
/* "Clear scope and pricing" matches its sibling cards; its purple accent
   border comes from the existing .whydark li:nth-child(3) rule */

/* ---- Quotes: one line on standard desktops, quieter block ---- */
.needs__quote { max-width: 1040px; min-height: 2.6em; }
.needs__text { font-size: clamp(1.1rem, 1rem + 1.1vw, 1.55rem); }
.needs__quote::before { font-size: clamp(3.4rem, 7vw, 5.2rem); }
.needs__quote { padding-top: clamp(2rem, 4.5vw, 3rem); }

/* =====================================================================
   TARGETED CORRECTIONS (2026-07-24d)
   ===================================================================== */

/* 1. Services eyebrow in brand teal (light section; 3.3:1 on #F0F0F0 for
   700-weight uppercase micro-type — above the 3:1 large/bold threshold) */
.home #services-preview .kicker { color: var(--mint); }

/* 2. "Explore all services" removed from markup; kill its leftover spacing
   so the grid ends cleanly into the pinned window */
.home #services-preview .scard-grid { margin-bottom: 0; }

/* 3. Contact: form takes ~50% of the desktop section; intro column balances it */
.home .contact-grid { grid-template-columns: 1fr 1fr; gap: clamp(2rem, 4vw, 3.5rem); align-items: start; }
@media (max-width: 1000px) { .home .contact-grid { grid-template-columns: 1fr; } }

/* 4. Quotes +3pt (≈0.25rem) at the desktop cap: 1.55rem → 1.80rem;
   floor lifted to match. Measure widened so the longest quote still fits
   one line (≈1064px of 1180px), wrapping naturally below that. */
.home .needs__text { font-size: clamp(1.3rem, 1rem + 1.35vw, 1.8rem); }
.home .needs__quote { max-width: 1180px; min-height: 2.5em; }

/* =====================================================================
   FOOTER / LEGAL / HERO-HEADER PASS (2026-07-25).
   Rollback: gridshift-before-footer-legal-pass.zip
   ===================================================================== */

/* ---- [A] What we do checklist: editorial serif, larger, brand teal ---- */
.wwd2__list li {
  font-family: var(--f-display); font-weight: 700;
  font-size: clamp(1.05rem, 1rem + .55vw, 1.35rem);   /* stays below the section H2 */
  line-height: 1.3; letter-spacing: -.01em;
  color: var(--mint);
  align-items: center; gap: 1rem;                     /* icon + text optically centred on each row */
  /* no dividers: rhythm comes from spacing alone */
  padding: 0; border: 0;
}
/* Alignment: with the dividers gone the list sat flush on its grid-column
   edge, reading as under-indented against the left column. Inset the whole
   block (one padding on the container, so every row moves identically and
   the icon/text gap is untouched). Scales with the viewport; zero inset once
   the section stacks, so mobile layout is unchanged. */
.wwd2__list { border-top: 0; display: grid; gap: clamp(1rem, 2.2vw, 1.5rem); }
.wwd2__list li:last-child { border-bottom: 0; }

/* supplied brand asset (images/checkmark_icon.svg, already #29b499 — used as-is,
   no recolouring); SVG so it stays crisp on retina, aspect ratio preserved */
.wwd2__check { width: 22px; height: 22px; flex: none; }   /* row uses align-items:center — no manual offset */

/* ---- [B] Hero video reaches the very top; header overlays it.
   The header is a sticky element OUTSIDE <main>, so the hero is pulled up
   by exactly one header height (once, not twice) and its own top padding
   is restored so content still clears the nav. ---- */
.home .hero--video { margin-top: calc(var(--header-h) * -1); padding-top: calc(var(--header-h) + clamp(2.2rem, 5vw, 4rem)); }

/* ---- [C] (retired 2026-07-25) Homepage transparent/7%-tint header removed:
   every page now uses the shared solid black header defined at the end of
   this file. Restore from gridshift-before-nav-standardisation.zip. ---- */

/* ---- [D] Three brand-coloured periods (words keep their colour) ---- */
.pd--blue { color: var(--green); }
.pd--teal { color: var(--mint); }
.pd--purple { color: var(--purple); }

/* ---- [E] Footer: brand column, social placeholders, information column ---- */
.footer__top { grid-template-columns: 1.6fr .7fr .7fr; }
.footer__social { display: flex; gap: .55rem; margin-top: 1.2rem; }
.footer__social-item {
  display: inline-flex; align-items: center; justify-content: center;
  width: 38px; height: 38px; border: 1px solid rgba(255,255,255,.22);
  color: rgba(255,255,255,.75);
  transition: color .25s var(--ease), border-color .25s var(--ease);
}
.footer__social-item svg { width: 18px; height: 18px; }
a.footer__social-item:hover, a.footer__social-item:focus-visible { color: var(--mint); border-color: var(--mint); }
.footer__social li span.footer__social-item { cursor: default; opacity: .8; }   /* placeholder state, not a link */

/* ---- [F] Legal pages: readable measure, quiet hierarchy ---- */
.legal { max-width: 74ch; }
.legal h2 { font-family: var(--f-display); font-weight: 700; font-size: clamp(1.2rem, 1rem + .8vw, 1.55rem); margin-top: 2.2rem; }
.legal p { margin-top: .8rem; color: var(--ink-72); }
.legal__intro { font-size: 1.08rem; color: var(--ink) !important; }
.legal__list { margin-top: .9rem; display: grid; gap: .5rem; }
.legal__list li { position: relative; padding-left: 1.25rem; color: var(--ink-72); }
.legal__list li::before { content: ""; position: absolute; left: 0; top: .62em; width: 7px; height: 7px; background: var(--mint); }
.legal__updated { margin-top: 1.1rem; font-family: var(--f-body); font-size: .85rem; letter-spacing: .04em; text-transform: uppercase; color: var(--ink-55); }
.legal a { color: var(--green-deep); text-decoration: underline; text-underline-offset: 3px; }
.legal a:hover { color: var(--green); }
@media (max-width: 820px) { .footer__top { grid-template-columns: 1fr; } }

/* =====================================================================
   SERVICE-PAGE VARIANT (2026-07-25) — scoped to body.svc-page ONLY, so the
   homepage (body.home) and every other page are untouched.
   Rollback: gridshift-before-service-page-pass.zip
   ===================================================================== */

/* ---- [S1] Solid near-black header, white nav + white logo ---- */
.svc-page .site-header { background: var(--ink); backdrop-filter: none; -webkit-backdrop-filter: none; border-bottom: 1px solid rgba(255,255,255,.1); }
.svc-page .site-header.is-scrolled { background: var(--ink); box-shadow: 0 6px 24px rgba(35,31,32,.18); }
.svc-page .nav__menu a:not(.btn) { color: #fff; }
.svc-page .nav__menu a:not(.btn):hover, .svc-page .nav__menu a[aria-current="page"] { color: var(--mint); }
.svc-page .nav__menu a:not(.btn)::after { background: var(--mint); }
.svc-page .nav__dropbtn { color: #fff; }
.svc-page .hasdrop:hover .nav__dropbtn, .svc-page .hasdrop.is-open .nav__dropbtn,
.svc-page .nav__dropbtn:focus-visible, .svc-page .hasdrop.is-current .nav__dropbtn { color: var(--mint); }
.svc-page .nav__toggle { background: rgba(255,255,255,.12); border-color: rgba(255,255,255,.5); }
.svc-page .nav__bars, .svc-page .nav__bars::before, .svc-page .nav__bars::after { background: #fff; }
.svc-page .nav__toggle[aria-expanded="true"] .nav__bars { background: transparent; }
.svc-page .nav__panel { color: var(--ink); }      /* dropdown stays solid white with ink text */
.svc-page :focus-visible { outline-color: var(--mint); }

/* ---- [S2] Buttons match the homepage system exactly ---- */
.svc-page .btn { border-radius: 0; }
.svc-page .btn--lg { padding: .85rem 1.8rem; font-size: 1.02rem; }
.svc-page .btn:not(.btn--lg):not(.btn--sm) { padding: .74rem 1.45rem; }
.svc-page .btn--sm { padding: .55rem 1rem; }

/* ---- [S3] Hero: no icon/buttons any more, so rebalance and set one H1 scale ---- */
.svc-page .page-hero { padding-block: clamp(2.6rem, 5vw, 4.4rem) clamp(2rem, 3.5vw, 3rem); }
.svc-page .page-hero__title { font-size: clamp(2.4rem, 1.2rem + 4vw, 4.2rem); margin-top: .7rem; }
.svc-page .page-hero__lead { margin-top: 1.1rem; max-width: 54ch; }
.svc-page .svc-hero2 { align-items: center; }

/* ---- [S4] "What it helps with" statement in full near-black
   (root cause: .philo is a <p> inside .philo-grid, which set colour to
   --ink-72, so the statement rendered at 72% opacity) ---- */
.svc-page .philo { color: var(--ink); }

/* ---- [S5] Section rhythm after the removals; nothing crowds the footer ---- */
.svc-page .section--tight { padding-block: clamp(2.4rem, 4vw, 3.4rem); }
.svc-page .section { padding-block: clamp(2.4rem, 4vw, 3.6rem); }
.svc-page main > .section:last-of-type { padding-bottom: clamp(3rem, 5vw, 4.4rem); }
.svc-page .cta { padding-block: clamp(3rem, 5vw, 4.4rem); }

/* ---- [S6] Native scrolling: no smooth-scroll easing, lighter reveals ---- */
html:has(body.svc-page) { scroll-behavior: auto; }   /* native wheel/anchor speed on service pages */
.js .svc-page .reveal { transform: translateY(8px); transition: opacity .4s var(--ease-out), transform .4s var(--ease-out); }

/* =====================================================================
   SERVICE CARDS → SUPPLIED ICONS (2026-07-25; homepage only)
   Rollback: gridshift-before-icon-cards.zip
   The photo panel and the small line-icon are gone from the markup; each
   card is now [icon] [heading + description + arrow]. Card shape, size,
   grid, colours, type and links are unchanged.
   ===================================================================== */
.scard a { grid-template-columns: 104px 1fr; align-items: stretch; }
.scard__ico-wrap {
  display: flex; align-items: center; justify-content: center;
  min-height: 104px;                      /* matches the old visual block, so card height is unchanged */
  padding: .55rem;
  background: var(--surface);             /* icons are supplied on white — no visible plate */
  border-right: 1px solid var(--line);
}
/* One box for every icon + contain: identical source canvases (1145×1276)
   normalise optically at a single size; nothing is cropped or stretched. */
.scard__ico-img {
  width: 100%; height: 100%; max-width: 66px; max-height: 74px;
  object-fit: contain; display: block;
  transition: transform .3s var(--ease);
}
.scard a:hover .scard__ico-img { transform: translateY(-1px); }   /* restrained; card itself does not move */
.scard__body { justify-content: center; }
@media (max-width: 640px) {
  .scard a { grid-template-columns: 88px 1fr; }
  .scard__ico-wrap { min-height: 92px; }
  .scard__ico-img { max-width: 56px; max-height: 62px; }
}

/* ---- What we do: more air between the check icon and its text ---- */
.wwd2__list li { gap: clamp(1.15rem, 1.9vw, 1.9rem); }   /* was 1rem — one shared rule, all six rows */
@media (max-width: 640px) { .wwd2__list li { gap: 1.05rem; } }   /* keeps text from compressing on narrow screens */

/* ---- Type statement: single line, tighter section ---- */
.typestate { padding-block: clamp(2.2rem, 4.5vw, 3.6rem); }
.typestate__t { font-size: clamp(1.9rem, 1rem + 3.4vw, 4rem); white-space: nowrap; }
/* MOBILE FIX: at 1.9rem the line is ~411px wide, which overflows every phone
   viewport and gets clipped by body{overflow-x:hidden}. Allow it to wrap onto
   three lines below 620px; the phrase still reads as three statements. */
@media (max-width: 620px) {
  .typestate__t { white-space: normal; font-size: clamp(1.5rem, 1rem + 3vw, 1.9rem); line-height: 1.25; }
}
@media (max-width: 640px) { .typestate__t { white-space: normal; font-size: clamp(1.7rem, 8vw, 2.4rem); } }

/* Header over the video (homepage only, via body.has-vhero): transparent at
   top with white links; solid dark bar once scrolled (inverse logo works in
   both states). The dropdown panel keeps its solid white background. */
body.has-vhero .site-header { background: transparent; backdrop-filter: none; -webkit-backdrop-filter: none; }
body.has-vhero .site-header.is-scrolled {
  background: rgba(28,25,26,.9);
  backdrop-filter: saturate(140%) blur(12px); -webkit-backdrop-filter: saturate(140%) blur(12px);
  border-bottom-color: rgba(255,255,255,.12);
}
body.has-vhero .nav__menu a:not(.btn) { color: #fff; }
body.has-vhero .nav__menu a:not(.btn):hover { color: var(--mint); }
body.has-vhero .nav__menu a[aria-current="page"] { color: var(--mint); }
body.has-vhero .nav__dropbtn { color: #fff; }
body.has-vhero .hasdrop:hover .nav__dropbtn,
body.has-vhero .hasdrop.is-open .nav__dropbtn,
body.has-vhero .nav__dropbtn:focus-visible,
body.has-vhero .hasdrop.is-current .nav__dropbtn { color: var(--mint); }
body.has-vhero .nav__toggle { background: rgba(255,255,255,.14); border-color: rgba(255,255,255,.45); }
body.has-vhero .nav__bars, body.has-vhero .nav__bars::before, body.has-vhero .nav__bars::after { background: #fff; }
body.has-vhero .nav__toggle[aria-expanded="true"] .nav__bars { background: transparent; }

/* ---- [R7] Service-hero variation: 4 alternating pages run image-left ---- */
.svc-hero2--flip { grid-template-columns: .92fr 1.08fr; }
.svc-hero2--flip .page-hero__inner { order: 2; }
.svc-hero2--flip .img-slot--hero { order: 1; }
@media (max-width: 900px) {
  .svc-hero2--flip .page-hero__inner { order: 1; }
  .svc-hero2--flip .img-slot--hero { order: 2; }
}

/* =====================================================================
   SHARED SITE HEADER (2026-07-25) — the Website Design service-page
   header, promoted to the single site-wide standard. Unscoped and placed
   last, so it wins on every page (homepage included). The old
   body.home transparent variant is retired; body.svc-page rules below
   are now redundant but harmless duplicates of these values.
   Rollback: gridshift-before-nav-standardisation.zip
   ===================================================================== */
.site-header {
  background: var(--ink);
  backdrop-filter: none; -webkit-backdrop-filter: none;
  border-bottom: 1px solid rgba(255,255,255,.1);
  z-index: 1000;
}
.site-header.is-scrolled { background: var(--ink); box-shadow: 0 6px 24px rgba(35,31,32,.18); border-bottom-color: rgba(255,255,255,.1); }
.header__inner::before { content: none; }                 /* kills the old homepage tint layer */
.nav__menu a:not(.btn) { color: #fff; }
.nav__menu a:not(.btn):hover { color: var(--mint); }
.nav__menu a:not(.btn)::after { background: var(--mint); }
.nav__menu a[aria-current="page"] { color: var(--mint); }  /* current page stays readable on black */
.nav__menu a[aria-current="page"]::after { background: var(--mint); }
.nav__dropbtn { color: #fff; }
.hasdrop:hover .nav__dropbtn, .hasdrop.is-open .nav__dropbtn,
.nav__dropbtn:focus-visible, .hasdrop.is-current .nav__dropbtn { color: var(--mint); }
.nav__toggle { background: rgba(255,255,255,.12); border-color: rgba(255,255,255,.5); }
.nav__bars, .nav__bars::before, .nav__bars::after { background: #fff; }
.nav__toggle[aria-expanded="true"] .nav__bars { background: transparent; }
.nav__panel { color: var(--ink); }                        /* dropdown stays solid white with ink text */
/* square nav CTA on every page (matches the service-page treatment) */
.nav__cta .btn { border-radius: 0; padding: .55rem 1rem; }
.site-header :focus-visible { outline-color: var(--mint); }

/* =====================================================================
   WHAT WE DO — checklist group offset (2026-07-25). Final rule in the
   file, so nothing can override it. One shared rule moves all six
   complete groups (tick + label) right together; the tick travels with
   its text because the padding is on the list, not the text node.
   ===================================================================== */
.wwd2 .wwd2__list { padding-left: 56px; }                          /* desktop */
@media (max-width: 1100px) { .wwd2 .wwd2__list { padding-left: 40px; } }   /* laptop/tablet landscape */
@media (max-width: 920px)  { .wwd2 .wwd2__list { padding-left: 24px; } }   /* stacked: keep a light indent */
@media (max-width: 560px)  { .wwd2 .wwd2__list { padding-left: 0; } }      /* phones: full width, no squeeze */

/* =====================================================================
   HOMEPAGE HEADER EXCEPTION (restored 2026-07-25 from
   gridshift-before-nav-standardisation.zip — verbatim previous rules).
   Every internal page keeps the shared solid black header above; the
   homepage alone returns to the transparent treatment over the hero
   video, with a 7% BLACK BACKGROUND painted by a pseudo-element BEHIND
   the header content, so the logo, links, dropdown trigger, CTA and
   hamburger all stay 100% opaque (no opacity on the header element).
   Rollback: gridshift-before-homepage-header-exception.zip
   ===================================================================== */
.home .site-header { background: transparent; backdrop-filter: none; -webkit-backdrop-filter: none; border-bottom-color: transparent; box-shadow: none; }
.home .header__inner { position: relative; }
.home .header__inner::before {          /* the tint lives behind the content, so nothing fades */
  content: ""; position: absolute; top: 0; bottom: 0; left: calc(var(--gutter) * -1); right: calc(var(--gutter) * -1);
  background: rgba(0, 0, 0, 0.07); pointer-events: none;
}
.home .site-header.is-scrolled { background: transparent; box-shadow: none; }
.home .site-header.is-scrolled .header__inner::before { background: rgba(0,0,0,.55); }  /* readable once over page content */
/* FIX (2026-07-25): the previous rule gave .nav__menu position:relative, which made
   the right-aligned <ul> the containing block for .nav__panel (left:0;right:0) — the
   dropdown therefore opened pinned to the far right. The tint is now pushed behind
   the content with z-index:-1 instead, so NO nav element is positioned and the panel
   resolves against .header__inner again. */
.home .header__inner::before { z-index: -1; }

/* white nav text + icons on the homepage (unchanged from the previous version) */
.home .nav__menu a:not(.btn) { color: #fff; }
.home .nav__menu a:not(.btn):hover, .home .nav__menu a[aria-current="page"] { color: var(--mint); }
.home .nav__dropbtn { color: #fff; }
.home .hasdrop:hover .nav__dropbtn, .home .hasdrop.is-open .nav__dropbtn,
.home .nav__dropbtn:focus-visible, .home .hasdrop.is-current .nav__dropbtn { color: var(--mint); }
.home .nav__toggle { background: rgba(255,255,255,.12); border-color: rgba(255,255,255,.5); }
.home .nav__bars, .home .nav__bars::before, .home .nav__bars::after { background: #fff; }
.home .nav__toggle[aria-expanded="true"] .nav__bars { background: transparent; }
/* dropdown panel keeps its solid white background and ink text; the open
   mobile overlay keeps its own solid dark panel — neither is tinted */
.home .nav__panel { color: var(--ink); }

/* ---- Centre "Brand. Website. Marketing." in its section (2026-07-25) ---- */
.typestate__t { text-align: center; margin-inline: auto; }

/* ---- Services dropdown: supplied service icons (2026-07-25).
   Sized for the menu (not the homepage card size); SEO keeps its inline SVG
   and its existing tile styling, so both variants sit on the same baseline. ---- */
.megalink__img { width: 26px; height: 26px; object-fit: contain; display: block; }
/* white plate behind the supplied (white-background) icons; :has() is well
   supported now, and without it the icon simply keeps the default tile — no breakage */
.megalink__ico:has(.megalink__img) { background: #fff; border-color: var(--line); padding: 3px; }
.megalink:hover .megalink__ico:has(.megalink__img),
.megalink:focus-visible .megalink__ico:has(.megalink__img) { background: #fff; }

/* ---- Homepage now ends on the type statement (contact section removed
   2026-07-25). Give the last section the standard section-bottom rhythm so the
   footer follows deliberately, using the existing clamp scale. ---- */
.home main > .typestate:last-of-type { padding-bottom: clamp(3.2rem, 5.5vw, 4.8rem); }


/* =====================================================================
   MARKETING PACKAGES PAGE (body.pkg-page) — 2026-07-27 art-direction pass
   Five parts: 1 hero · 2 benefits · 3 package frame · 4 custom band ·
   5 page calm. Scoped to .pkg-page or to classes used only on
   packages.html. Delete a part to revert that section.
   ===================================================================== */

/* ---- 1. HERO ---- */
.pkg-hero {
  padding-block: 0; min-height: 66vh;
  display: grid; align-items: center; background: var(--ink);
}
.pkg-hero__media { position: absolute; inset: 0; overflow: hidden; }
.pkg-hero__media img {
  display: block; width: 100%; height: 100%;
  object-fit: cover; object-position: 62% 38%;   /* crop away the flat lower band */
}
.pkg-hero__overlay {
  position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(90deg, rgba(0,0,0,.62) 0%, rgba(0,0,0,.46) 52%, rgba(0,0,0,.3) 100%);
}
.pkg-hero .page-hero__inner {
  position: relative; z-index: 1;
  max-width: 940px;                                 /* matches .home .hero__copy */
  padding-block: clamp(3rem, 7vw, 5rem);
}
/* quiet registration mark: a hairline with a teal tick, set on the copy edge */
.pkg-hero__reg { display: block; width: 84px; height: 1px; background: rgba(255,255,255,.45); position: relative; margin-bottom: 1.6rem; }
.pkg-hero__reg::after { content: ""; position: absolute; left: 0; top: -3px; width: 7px; height: 7px; background: var(--mint); }
.pkg-hero .page-hero__title {
  margin-top: 0; color: var(--white);
  font-size: clamp(2.3rem, 1rem + 4.6vw, 4.4rem);   /* matches .home .hero__title */
  text-shadow: 0 1px 14px rgba(0,0,0,.35);
}
.pkg-hero .page-hero__title .ln { display: block; }
.pkg-hero .page-hero__lead {
  margin-top: 1.4rem; max-width: 46ch;
  color: rgba(255,255,255,.94); text-shadow: 0 1px 10px rgba(0,0,0,.3);
}
.pkg-hero .hero__actions { margin-top: 2rem; gap: .7rem; }
/* compact rectangular hero buttons: 45px, one step above the 41px package CTAs */
.pkg-hero__btn, .shift-hero__btn {
  font-family: var(--f-body); font-weight: 600; font-size: .92rem; line-height: 1.15;
  padding: .8rem 1.45rem; border-radius: 3px; box-shadow: none;
}
.pkg-hero__btn:hover, .shift-hero__btn:hover { box-shadow: none; transform: translateY(-1px); }
/* a 3px brand bar closes the hero and hands off to the page */
.pkg-hero__edge { position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: linear-gradient(90deg, var(--green) 0 38%, var(--mint) 38% 62%, var(--purple) 62% 100%); }
@media (max-width: 1024px) { .pkg-hero { min-height: 60vh; } }
@media (max-width: 760px) {
  .pkg-hero { min-height: 66svh; }
  .pkg-hero__overlay { background: rgba(0,0,0,.54); }
  .pkg-hero__media img { object-position: 58% 42%; }
  .pkg-hero .page-hero__title .ln { display: inline; }
}

/* ---- 2. BENEFITS: heading holds a third, four items in a ruled 2x2 ---- */
.pkg-why__grid {
  display: grid; grid-template-columns: minmax(200px, 30%) 1fr;
  gap: clamp(1.6rem, 4vw, 3.5rem); align-items: start;
}
.pkg-why__h { font-size: clamp(1.7rem, 1.1rem + 1.9vw, 2.6rem); }
.pkg-why__list {
  display: grid; grid-template-columns: repeat(2, 1fr);
  border-top: 1px solid var(--ink);
}
.pkg-why__list li {
  border-bottom: 1px solid var(--line);
  padding: clamp(1.1rem, 2vw, 1.5rem) clamp(1.1rem, 2vw, 1.6rem) clamp(1.2rem, 2.2vw, 1.7rem) 0;
}
.pkg-why__list li:nth-child(even) { padding-left: clamp(1.1rem, 2vw, 1.6rem); padding-right: 0; border-left: 1px solid var(--line); }
.pkg-why__m { display: block; width: 9px; height: 9px; margin-bottom: .85rem; }
.pkg-why__m--a, .pkg-why__m--c { background: var(--green); }
.pkg-why__m--b, .pkg-why__m--d { background: var(--mint); }
.pkg-why__list h3 { font-family: var(--f-body); font-weight: 700; font-size: 1rem; line-height: 1.3; }
.pkg-why__list p { margin-top: .5rem; color: var(--ink-72); font-size: .93rem; line-height: 1.6; }
@media (max-width: 900px) {
  .pkg-why__grid { grid-template-columns: 1fr; }
  .pkg-why__list { grid-template-columns: 1fr; }
  .pkg-why__list li, .pkg-why__list li:nth-child(even) { padding-inline: 0; border-left: 0; }
}

/* ---- 3. PACKAGES: four columns inside one shared frame ---- */
.pkg-head { max-width: 720px; }
/* Four separate boxes: no shared outer frame, no divider-only edges.
   Each package carries the same 1px black border the group used to have,
   and one shared grid gap does all the spacing. */
.pkgtable {
  display: grid; grid-template-columns: repeat(4, 1fr);
  gap: 24px; align-items: stretch;
}
.pkgtable__col {
  position: relative; display: flex; flex-direction: column;
  padding: clamp(1.4rem, 2vw, 1.9rem);
  border: 1px solid var(--ink); background: var(--surface);
}
/* progression: colour density and name weight rise with the tier */
.pkgtable__rule { position: absolute; top: 0; left: 0; right: 0; height: 4px; }   /* sits inside each box border */
.pkgtable__col--1 .pkgtable__rule { background: rgba(58,118,187,.4); }
.pkgtable__col--2 .pkgtable__rule { background: var(--green); }
.pkgtable__col--3 .pkgtable__rule { background: var(--mint); }
.pkgtable__col--4 .pkgtable__rule { background: var(--purple); }
.pkgtable__tier {
  font-family: var(--f-body); font-weight: 700; font-size: .72rem;
  letter-spacing: .16em; text-transform: uppercase; color: var(--ink-72); margin-top: .4rem;
}
.pkgtable__col--1 .pkgtable__tier { color: var(--ink-72); }   /* neutral = quietest tier; --ink-55 was 3.7:1 */
.pkgtable__col--2 .pkgtable__tier { color: var(--green-deep); }
.pkgtable__col--3 .pkgtable__tier { color: #1d7f6c; }
.pkgtable__col--4 .pkgtable__tier { color: #7a4a8e; }
.pkgtable__name {
  font-family: var(--f-body); font-size: clamp(1.02rem, .95rem + .3vw, 1.2rem);
  letter-spacing: -.015em; line-height: 1.25; margin-top: .7rem; min-height: 2.5em;
}
.pkgtable__col--1 .pkgtable__name, .pkgtable__col--2 .pkgtable__name { font-weight: 600; }
.pkgtable__col--3 .pkgtable__name, .pkgtable__col--4 .pkgtable__name { font-weight: 700; }
.pkgtable__price {
  margin-top: .6rem; padding-top: 1rem; border-top: 1px solid var(--line);
  font-family: var(--f-body); font-weight: 700; font-size: clamp(1.28rem, 1.1rem + .5vw, 1.55rem);
  letter-spacing: -.025em; color: var(--ink);
}
.pkgtable__price span {
  display: block; margin-top: .2rem; font-weight: 500; font-size: .73rem;
  letter-spacing: .02em; color: var(--ink-72);
}
.pkgtable__for { margin-top: .9rem; color: var(--ink-72); font-size: .9rem; line-height: 1.55; min-height: 4.65em; }
.pkgtable__list {
  margin-top: 1.1rem; padding-top: 1.1rem; border-top: 1px solid var(--line);
  display: grid; gap: .55rem; margin-bottom: 1.4rem;
}
.pkgtable__list li { position: relative; padding-left: 1rem; font-size: .9rem; color: var(--ink-72); line-height: 1.5; }
.pkgtable__list li::before { content: ""; position: absolute; left: 0; top: .55em; width: 5px; height: 5px; background: var(--ink-38); }
.pkgtable__cta {
  margin-top: auto; align-self: flex-start;
  font-family: var(--f-body); font-weight: 600; font-size: .86rem; line-height: 1.15;
  padding: .68rem 1.15rem; border-radius: 3px; box-shadow: none;
}   /* computed height: 21.8px padding + 15.8px line + 3px border = 41px */
.pkgtable__cta:hover { box-shadow: none; background: #305F9A; transform: translateY(-1px); }

.pkg-fine { margin-top: clamp(1rem, 2vw, 1.4rem); font-size: .86rem; line-height: 1.6; color: var(--ink-72); max-width: 68ch; }
.pkg-fine--second { margin-top: .5rem; }

@media (max-width: 1100px) {
  .pkgtable { grid-template-columns: repeat(2, 1fr); gap: 20px; }
  .pkgtable__name { min-height: 0; }
  .pkgtable__for { min-height: 3.1em; }
}
@media (max-width: 620px) {
  .pkgtable { grid-template-columns: 1fr; gap: 18px; }
  .pkgtable__for { min-height: 0; }
  .pkgtable__cta { width: 100%; align-self: stretch; }
}

/* ---- 4. CUSTOM BAND: a fifth option without a fifth price card ---- */
.pkg-band { background: var(--paper-2); color: var(--ink); padding-block: clamp(2rem, 4vw, 3rem); border-top: 1px solid var(--line-2); }   /* soft grey: the footer is --ink and the two would merge */
.pkg-band__grid {
  display: grid; grid-template-columns: minmax(220px, 30%) 1fr auto;
  gap: clamp(1.2rem, 3vw, 2.4rem); align-items: center;
}
.pkg-band__h { font-family: var(--f-display); font-weight: 700; font-size: clamp(1.25rem, 1rem + .9vw, 1.7rem); line-height: 1.2; }
.pkg-band__copy { color: var(--ink-72); font-size: .95rem; line-height: 1.6; max-width: 52ch; }
.pkg-band__cta {
  font-family: var(--f-body); font-weight: 600; font-size: .86rem; line-height: 1.15;
  padding: .68rem 1.15rem; border-radius: 3px; box-shadow: none; white-space: nowrap;
}
.pkg-band__cta:hover { box-shadow: none; transform: translateY(-1px); }
@media (max-width: 900px) {
  .pkg-band__grid { grid-template-columns: 1fr; align-items: start; }
  .pkg-band__cta { justify-self: start; }
}

/* ---- 5. page calm: no scroll-reveal on this page ---- */
.pkg-page .reveal { opacity: 1; transform: none; }

/* =====================================================================
   NAVIGATION — even distribution after the Contact link was removed
   (2026-07-26). One shared rule; no per-link margins, no absolute
   positioning. All four text items already share padding .5rem .85rem
   (.nav__menu a and .nav__dropbtn), so the flex gap alone sets rhythm.
   ===================================================================== */
.nav__menu { gap: .45rem; }        /* text-to-text spacing = .45 + .85 + .85 = 2.15rem */
.nav__cta { margin-left: 1.4rem; } /* deliberate larger break before the CTA = 2.7rem */

/* =====================================================================
   THE SHIFT PAGE (body.shift-page) — 2026-07-27 art-direction pass
   Seven parts: 1 hero · 2 culture statement · 3 Studio Orbit team ·
   4 approach · 5 process route · 6 signature field · 7 CTA + calm.
   Scoped to .shift-page or to classes used only on the-shift.html.
   ===================================================================== */

/* ---- 1. HERO: same structure as the homepage, different composition.
        The copy block is inset from the left rather than flush and the
        registration mark is vertical, so the page does not read as a
        clone of Marketing Packages. ---- */
.shift-hero {
  padding-block: 0; min-height: 72vh;
  display: grid; align-items: end; background: var(--ink);
}
.shift-hero__media { position: absolute; inset: 0; overflow: hidden; }
.shift-hero__media img {
  display: block; width: 100%; height: 100%;
  object-fit: cover; object-position: 34% 56%;
}
.shift-hero__overlay {
  position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(90deg, rgba(0,0,0,.58) 0%, rgba(0,0,0,.4) 55%, rgba(0,0,0,.24) 100%);
}
.shift-hero .page-hero__inner {
  position: relative; z-index: 1; max-width: none;
  padding-block: clamp(3rem, 7vw, 5.5rem);
}
.shift-hero__copy { max-width: 880px; position: relative; padding-left: clamp(0px, 2.5vw, 42px); }
.shift-hero__reg { position: absolute; left: 0; top: .35rem; bottom: .35rem; width: 2px; background: rgba(255,255,255,.35); }
.shift-hero__reg::after { content: ""; position: absolute; left: 0; top: 0; width: 2px; height: 34%; background: var(--mint); }
@media (max-width: 700px) { .shift-hero__reg { display: none; } }
.shift-hero .page-hero__title .ln { display: block; }
@media (max-width: 700px) { .shift-hero .page-hero__title .ln { display: inline; } }
.shift-hero .page-hero__title {
  margin-top: 0; color: var(--white);
  font-size: clamp(2.3rem, 1rem + 4.6vw, 4.4rem);
  text-shadow: 0 1px 14px rgba(0,0,0,.35);
}
.shift-hero .page-hero__lead {
  margin-top: 1.3rem; max-width: 44ch;
  color: rgba(255,255,255,.94); text-shadow: 0 1px 10px rgba(0,0,0,.3);
}
.shift-hero .hero__actions { margin-top: 2rem; gap: .7rem; }
@media (max-width: 1024px) { .shift-hero { min-height: 62vh; } }
@media (max-width: 760px) {
  .shift-hero { min-height: 70svh; align-items: center; }
  .shift-hero__overlay { background: rgba(0,0,0,.5); }
  .shift-hero__media img { object-position: 42% 48%; }
}

/* ---- 2. OUR TEAM — Claude Design version 2B ----
   Recreated as live HTML/CSS from the approved 2B screen. Desktop follows 2B
   (1200px reference); below 900px it follows the approved 2C mobile screen.
   Approved values kept: #231F20 field, #F0F0F0 text, Libre Baskerville for the
   heading and role names, Montserrat for everything else, teal/blue/purple
   group accents, 4-3-3-1 people markers, oval portrait, Business Lead last and
   quietest. Delete this part to revert the team section. */
.gsteam { background: var(--ink); color: var(--paper); padding-block: clamp(3.2rem, 6vw, 4.5rem); }

/* --- top row: oval portrait + heading, lead and Creative Lead --- */
.gsteam__top {
  display: grid; align-items: start;
  grid-template-columns: auto minmax(0, 1fr);
  grid-template-areas: "portrait intro" "portrait role";
  column-gap: clamp(1.6rem, 4vw, 4.5rem);
  margin-bottom: clamp(2.4rem, 5vw, 4rem);
}
.gsteam__portrait { grid-area: portrait; }
.gsteam__intro { grid-area: intro; }
.gsteam__role { grid-area: role; }
.gsteam__portrait {
  flex: none; width: clamp(118px, 12vw, 154px); aspect-ratio: 154 / 196;
  background: #2b2728; border-radius: 50%; overflow: hidden;
  display: grid; place-items: center; text-align: center; padding: 1rem;
}
.gsteam__ph {
  font-family: var(--f-body); font-size: .72rem; line-height: 1.45;
  letter-spacing: .03em; color: rgba(240,240,240,.62);
}
/* once a portrait is in place the oval carries the image edge to edge.
   Swapping the illustrated placeholder for a real photograph is a src
   change; this rule needs no edit. */
.gsteam__portrait--filled { padding: 0; }
.gsteam__portrait--filled img { width: 100%; height: 100%; object-fit: cover; object-position: center top; display: block; }
.gsteam__intro { padding-top: .5rem; }
.gsteam__mark { display: block; width: 36px; height: 2px; background: var(--mint); margin-bottom: 1.1rem; }
.gsteam__h {
  font-family: var(--f-display); font-weight: 700;
  font-size: clamp(1.5rem, 1.05rem + 1.35vw, 2.06rem);
  line-height: 1.3; letter-spacing: -.005em; color: var(--paper);
  max-width: 640px; margin: 0 0 1rem;
}
.gsteam__lead {
  margin: 0 0 1.4rem; font-size: .875rem; line-height: 1.65;
  color: rgba(240,240,240,.6); max-width: 520px;
}
.gsteam__role { display: flex; align-items: baseline; gap: .875rem; flex-wrap: wrap; }
.gsteam__rolename {
  font-family: var(--f-display); font-weight: 700; font-size: 1.25rem;
  line-height: 1.2; color: var(--paper); margin: 0;
}
.gsteam__rolerule { flex: none; width: 26px; height: 1px; background: var(--mint); }
.gsteam__roletxt { max-width: 330px; }
.gsteam__roletxt p { margin: 0; font-size: .8125rem; line-height: 1.6; color: rgba(240,240,240,.62); }
.gsteam__roletxt .gsteam__exp { margin-top: .56rem; font-size: .78rem; color: rgba(240,240,240,.58); }

/* --- divider with the purple registration diamond --- */
.gsteam__div { position: relative; height: 1px; background: rgba(240,240,240,.16); }
.gsteam__diamond {
  position: absolute; left: -14px; top: -3px;
  width: 7px; height: 7px; background: var(--purple); transform: rotate(45deg);
}

/* --- four capability groups, level, ruled, no cards --- */
.gsteam__grid {
  display: grid; grid-template-columns: 1.15fr 1fr 1fr .85fr;
  gap: clamp(1.4rem, 3vw, 2.5rem);
}
.gsteam__grp {
  position: relative; padding: 2.6rem 0 0 1.375rem; box-sizing: border-box;
}
.gsteam__grp::before {
  content: ""; position: absolute; left: 0; top: 0; width: 1px; height: 100%;
  background: rgba(240,240,240,.12);
}
.gsteam__grp::after { content: ""; position: absolute; left: 0; top: 0; width: 1px; height: 26px; }
.gsteam__grp--design::after { background: var(--mint); }
.gsteam__grp--mkt::after    { background: var(--green); }
.gsteam__grp--dev::after    { background: var(--purple); }
.gsteam__grp--biz::after    { background: rgba(240,240,240,.3); }

/* people markers: a head and shoulders, no faces, no invented individuals */
.gsteam__people { display: flex; gap: 9px; align-items: flex-end; height: 18px; margin-bottom: 1rem; }
.gsteam__people i { display: flex; flex-direction: column; align-items: center; gap: 2px; }
.gsteam__people i::before { content: ""; width: 8px; height: 8px; border-radius: 50%; background: currentColor; }
.gsteam__people i::after { content: ""; width: 13px; height: 6px; border-radius: 3px 3px 0 0; background: currentColor; }
.gsteam__grp--design .gsteam__people { color: var(--mint); }
.gsteam__grp--design .gsteam__people i::before { width: 9px; height: 9px; }
.gsteam__grp--design .gsteam__people i::after { width: 14px; height: 7px; border-radius: 4px 4px 0 0; }
.gsteam__grp--mkt .gsteam__people { color: var(--green); }
.gsteam__grp--dev .gsteam__people { color: var(--purple); }
.gsteam__grp--biz .gsteam__people { color: rgba(240,240,240,.45); }

.gsteam__gname {
  font-family: var(--f-body); font-weight: 600; font-size: 1.25rem;
  line-height: 1.25; color: var(--paper); margin: 0 0 .625rem; min-height: 2.75rem;
}
.gsteam__grp--mkt .gsteam__gname, .gsteam__grp--dev .gsteam__gname { font-size: 1.0625rem; }
.gsteam__grp--biz .gsteam__gname { font-size: .9375rem; font-weight: 500; color: rgba(240,240,240,.86); }
.gsteam__gdesc { margin: 0; font-size: .84rem; line-height: 1.6; color: rgba(240,240,240,.6); }
.gsteam__grp--mkt .gsteam__gdesc, .gsteam__grp--dev .gsteam__gdesc { font-size: .8125rem; }
.gsteam__grp--biz .gsteam__gdesc { font-size: .78rem; color: rgba(240,240,240,.5); }

/* --- tablet --- */
@media (max-width: 1100px) {
  .gsteam__grid { grid-template-columns: 1fr 1fr; row-gap: clamp(1.8rem, 4vw, 2.6rem); }
  .gsteam__gname { min-height: 0; }
}

/* --- mobile: the approved 2C screen. Heading and lead lead, then the
       portrait and Creative Lead, then the four groups stacked and ruled. --- */
@media (max-width: 900px) {
  /* 2C: heading and lead first, then the portrait beside the Creative Lead */
  .gsteam__top {
    grid-template-columns: 118px minmax(0, 1fr);
    grid-template-areas: "intro intro" "portrait role";
    column-gap: 1.25rem; margin-bottom: 2.25rem;
  }
  .gsteam__intro { padding-top: 0; }
  .gsteam__h { max-width: none; }
  .gsteam__lead { max-width: none; margin-bottom: 2rem; }
  .gsteam__role { display: block; }
  .gsteam__rolename { margin-bottom: .75rem; }
  .gsteam__rolerule { display: block; margin-bottom: .75rem; }
  .gsteam__roletxt { max-width: none; }
  .gsteam__portrait { width: 118px; }
  .gsteam__div { display: none; }
  .gsteam__grid { grid-template-columns: 1fr; gap: 1.625rem; }
  .gsteam__grp { padding: 1.25rem 0 0; border-top: 1px solid rgba(240,240,240,.14); }
  .gsteam__grp::before, .gsteam__grp::after { content: none; }
}
@media (max-width: 560px) {
  .gsteam__top { grid-template-columns: 104px minmax(0, 1fr); column-gap: 1rem; }
  .gsteam__portrait { width: 104px; }
}

/* ---- 4. APPROACH: three editorial columns, thin dividers, no cards ---- */
.shift-head { max-width: 760px; }
.shift-approach__h { font-size: clamp(2rem, 1.2rem + 2.6vw, 3.4rem); }
.shift-cols {
  display: grid; grid-template-columns: repeat(3, 1fr);
  column-gap: clamp(1.4rem, 2.8vw, 2.6rem); row-gap: clamp(1.6rem, 3vw, 2.2rem);
  border-top: 1px solid var(--ink);
  padding-top: clamp(1.4rem, 2.8vw, 2rem);
}
.shift-cols li { border-left: 1px solid var(--line); padding-left: clamp(1rem, 1.8vw, 1.6rem); }
.shift-cols li:first-child { border-left: 0; padding-left: 0; }
.shift-cols__n { display: block; font-family: var(--f-body); font-weight: 700; font-size: .74rem; letter-spacing: .16em; color: var(--green-deep); margin-bottom: .7rem; }   /* --mint was 2.25:1 on --paper */
.shift-cols h3 { font-family: var(--f-body); font-weight: 700; font-size: 1.02rem; line-height: 1.3; }
.shift-cols p { margin-top: .55rem; color: var(--ink-72); font-size: .95rem; line-height: 1.6; }
@media (max-width: 900px) {
  .shift-cols { grid-template-columns: 1fr; }
  .shift-cols li { border-left: 0; padding-left: 0; border-top: 1px solid var(--line); padding-top: 1.1rem; }
  .shift-cols li:first-child { border-top: 0; padding-top: 0; }
}

/* ---- 5. PROCESS: one continuous route with four stops ---- */
.proute {
  position: relative; display: grid; grid-template-columns: repeat(4, 1fr);
  column-gap: clamp(1.2rem, 2.6vw, 2.4rem); row-gap: clamp(1.6rem, 3vw, 2.2rem);
  padding-top: 1.9rem;
}
.proute::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 1px; background: var(--ink); }
.proute li { position: relative; }
.proute__dot { position: absolute; top: -1.9rem; left: 0; width: 9px; height: 9px; background: var(--green); transform: translateY(-4px); }
.proute li:nth-child(2) .proute__dot { background: var(--mint); }
.proute li:nth-child(3) .proute__dot { background: var(--green); }
.proute li:nth-child(4) .proute__dot { background: var(--purple); }
.proute__n { display: block; font-family: var(--f-body); font-weight: 700; font-size: .74rem; letter-spacing: .16em; color: var(--ink-72); margin-bottom: .5rem; }
.proute h3 { font-family: var(--f-body); font-weight: 700; font-size: 1.05rem; }
.proute p { margin-top: .45rem; color: var(--ink-72); font-size: .95rem; line-height: 1.6; }
@media (max-width: 820px) {
  .proute { grid-template-columns: 1fr; padding-top: 0; padding-left: 1.9rem; row-gap: 1.6rem; }
  .proute::before { top: .45rem; bottom: .45rem; left: 4px; right: auto; width: 1px; height: auto; }
  .proute__dot { top: .45rem; left: -1.9rem; transform: none; }
}

/* ---- 6. SIGNATURE FIELD ----
   Soft grey, not near-black: the approved logo artwork is drawn in
   #231f20 and would be invisible on a dark plane. */
.shift-sig { background: var(--paper-2); padding-block: clamp(2.6rem, 5vw, 4.5rem); }
.shift-sig__head { max-width: 640px; }
.shift-sig__head .s-title { font-size: clamp(1.7rem, 1.1rem + 1.9vw, 2.6rem); }
.shift-sig__line { margin-top: .9rem; color: var(--ink-72); font-size: 1rem; line-height: 1.6; }
.shift-page .img-slot-band { margin-block: clamp(1.6rem, 3vw, 2.4rem) 0; }

/* ---- 7. CTA + page calm ---- */
.shift-cta .cta__inner { text-align: left; max-width: 820px; margin-inline: 0; }
.shift-cta .cta__copy { margin: 1rem 0 0; }
.shift-cta .hero__actions { margin-top: 2rem; }
.shift-page .reveal { opacity: 1; transform: none; }

/* =====================================================================
   SELECTED WORK — homepage image strip (2026-07-26, image-only revision)
   A native horizontal scroll container (so touch and trackpad work for
   free) holding two identical sets of nine images, with a JS-driven
   auto-drift on top. No text, no captions, no controls. Delete this block
   plus <section id="selected-work"> and the matching js/main.js block to
   remove the feature entirely.
   ===================================================================== */

/* Sits between Services and the pinned image window, so it needs the same
   solid background and raised stacking as #services-preview or .freveal's
   negative top margin would show through it. */
#selected-work { position: relative; z-index: 2; background: var(--paper); }

/* Text and controls are gone, so the section is now just breathing room
   around the strip: enough that it never touches its neighbours, not so
   much that it reads as an empty band. */
.swork { padding-block: clamp(2.2rem, 4vw, 3.4rem); overflow: hidden; }

.swork__viewport {
  overflow-x: auto; overflow-y: hidden;
  scrollbar-width: none; -ms-overflow-style: none;
  padding-inline: var(--gutter);
  max-width: var(--container-wide); margin-inline: auto;
  overscroll-behavior-x: contain;
}
.swork__viewport::-webkit-scrollbar { display: none; }
.swork__track { display: flex; width: max-content; }
.swork__set { display: flex; gap: clamp(1rem, 1.8vw, 1.75rem); padding-right: clamp(1rem, 1.8vw, 1.75rem); }

/* frames: identical width, aspect, crop and corner treatment.
   Width, aspect ratio and gap are unchanged from the five-project version. */
.swork__img {
  width: clamp(258px, 25vw, 372px); flex: none;
  aspect-ratio: 4 / 5; overflow: hidden;
  background: var(--paper-2); border-radius: 2px;
}
.swork__img img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* touch: snap, and show a slice of the next image */
@media (max-width: 900px) {
  .swork__viewport { scroll-snap-type: x proximity; }
  .swork__img { width: min(74vw, 320px); scroll-snap-align: start; }
}
@media (max-width: 560px) { .swork__img { width: 78vw; } }

/* reduced motion: the drift never starts (handled in JS); the strip stays
   a manually scrollable row at the same dimensions */
@media (prefers-reduced-motion: reduce) {
  .swork__viewport { scroll-behavior: auto; }
}

/* =====================================================================
   GET IN TOUCH PAGE (body.gt-page) — 2026-07-26
   Scoped to .gt-page or to classes used only on contact.html. Delete this
   block plus contact.html's <main> to revert the page.
   ===================================================================== */
.gt-intro { padding-bottom: 0; }
.gt-intro__inner { max-width: 720px; }
.gt-page .page-hero__title { margin-top: 0; font-size: clamp(2.1rem, 1.3rem + 2.6vw, 3.2rem); }
.gt-page .page-hero__lead { margin-top: 1rem; max-width: 52ch; }
.gt-body { padding-top: clamp(1.8rem, 3.5vw, 2.6rem); }

/* form is visually primary; the contact column is quieter and shorter */
.gt-page .contact-grid { grid-template-columns: 1.45fr .55fr; gap: clamp(2rem, 4vw, 3.5rem); }
.gt-page .form {
  background: var(--surface); border: 1px solid var(--line-2);
  border-radius: 3px; box-shadow: none;
  padding: clamp(1.3rem, 3vw, 2rem);
  display: grid; gap: 1.05rem;
}
.gt-page .form > .field { margin-bottom: 0; }
.gt-page .field label {
  font-family: var(--f-body); font-weight: 600; font-size: .84rem;
  letter-spacing: .01em; margin-bottom: .45rem; color: var(--ink);
}
.gt-page .field input, .gt-page .field select, .gt-page .field textarea {
  border-radius: 2px; border-color: var(--line-2); background: var(--white);
  padding: .78rem .9rem; font-family: var(--f-body); font-size: .97rem;
}
.gt-page .field textarea { min-height: 150px; }
.gt-page .field input:invalid:not(:placeholder-shown),
.gt-page .field textarea:invalid:not(:placeholder-shown) { border-color: var(--purple); }

/* submit: compact and rectangular, not full width on desktop */
.gt-page .form__submit {
  width: auto; justify-self: start; margin-top: .3rem;
  border-radius: 2px; box-shadow: none;
  font-family: var(--f-body); font-weight: 600; font-size: .9rem; line-height: 1.15;
  padding: .68rem 1.35rem;
}
.gt-page .form__submit:hover { box-shadow: none; background: #305F9A; }
.gt-page .form__submit[aria-busy="true"], .gt-page .form__submit:disabled { opacity: .65; cursor: default; }

.form__status { margin: 0; font-family: var(--f-body); font-size: .9rem; padding: .7rem .85rem; border-radius: 2px; }
.form__status--ok { color: #1d6f5e; background: var(--mint-tint); border: 1px solid rgba(42,181,154,.45); }
.form__status--err { color: #7a3f8c; background: var(--purple-tint); border: 1px solid rgba(146,95,167,.45); }

.gt-page .form__note {
  margin: 0; text-align: left; font-family: var(--f-body);
  font-size: .82rem; color: var(--ink-55); line-height: 1.6;
}
.gt-page .form__note a { color: var(--green-deep); }

/* direct contact: quiet blocks, not cards */
.gt-page .contact-aside { display: grid; gap: clamp(1.4rem, 2.6vw, 2rem); align-content: start; }
.gt-direct, .gt-social { border-top: 2px solid var(--ink); padding-top: 1rem; }
.gt-social { border-top-color: var(--line-2); }
.gt-direct__h { font-family: var(--f-body); font-weight: 700; font-size: .95rem; letter-spacing: -.01em; }
.gt-direct__email { margin-top: .6rem; font-family: var(--f-body); font-weight: 700; font-size: 1.02rem; word-break: break-word; }
.gt-direct__email a { color: var(--green-deep); }
.gt-direct__line { margin-top: .7rem; color: var(--ink-72); font-size: .92rem; line-height: 1.6; }
.gt-social .gt-direct__line { margin-top: .5rem; font-weight: 600; }
.gt-social .gt-direct__line a { color: var(--green-deep); }

/* mobile order: heading, copy, direct email + response time, form, Instagram */
@media (max-width: 860px) {
  .gt-page .contact-grid { display: flex; flex-direction: column; gap: clamp(1.6rem, 4vw, 2.2rem); }
  .gt-page .contact-aside { display: contents; }
  .gt-direct { order: 1; }
  .gt-page .form { order: 2; }
  .gt-social { order: 3; }
  .gt-page .form__submit { width: 100%; justify-self: stretch; }
}


/* =====================================================================
   SERVICE PAGES (body.svc-page) — 2026-07-28 refresh
   One shared system for all ten service pages: full-bleed image hero,
   editorial sections, no cards. Per-page variation comes from an accent
   colour (--svc-accent) and which sections run dark. Delete this block
   to revert every service page's appearance at once.
   ===================================================================== */
.svc-page { --svc-accent: var(--green);  --svc-on-dark: #8FB4E0; --svc-on-light: #2C588F; }
.svc-page.svc--teal   { --svc-accent: var(--mint);   --svc-on-dark: #2AB59A; --svc-on-light: #1D7F6C; }
.svc-page.svc--purple { --svc-accent: var(--purple); --svc-on-dark: #C29CD4; --svc-on-light: #7A4A8E; }
/* --svc-accent is used for decorative marks only. Text takes the on-dark or
   on-light variant: the raw brand blue and purple are 3.5:1 on --ink and the
   raw teal is 2.6:1 on white, none of which clear 4.5:1. */

/* ---- 1. FULL-BLEED HERO ---- */
.svch {
  position: relative; overflow: hidden;
  padding-block: 0; min-height: 66vh;
  display: grid; align-items: end; background: var(--ink);
}
.svch__media { position: absolute; inset: 0; overflow: hidden; }
.svch__media img { display: block; width: 100%; height: 100%; object-fit: cover; }
.svch__overlay {
  position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(90deg, rgba(0,0,0,.6) 0%, rgba(0,0,0,.46) 52%, rgba(0,0,0,.3) 100%);
}
.svch__inner { position: relative; z-index: 1; padding-block: clamp(2.8rem, 6vw, 4.5rem); }
.svch__copy { max-width: 820px; position: relative; padding-left: clamp(0px, 2.2vw, 36px); }
.svch__reg { position: absolute; left: 0; top: .4rem; bottom: .4rem; width: 2px; background: rgba(255,255,255,.3); }
.svch__reg::after { content: ""; position: absolute; left: 0; top: 0; width: 2px; height: 32%; background: var(--svc-accent); }
@media (max-width: 700px) { .svch__reg { display: none; } }
.svch__label {
  font-family: var(--f-body); font-weight: 600; font-size: .74rem;
  letter-spacing: .18em; text-transform: uppercase; color: var(--svc-on-dark);
  margin: 0 0 1rem;
}
.svch__title {
  font-family: var(--f-display); font-weight: 700; margin: 0;
  font-size: clamp(2.1rem, 1rem + 4.2vw, 3.9rem); line-height: 1.1;
  letter-spacing: -.03em; color: var(--white); text-shadow: 0 1px 14px rgba(0,0,0,.35);
}
.svch__lead {
  margin: 1.2rem 0 0; max-width: 46ch; font-size: clamp(1rem, .95rem + .3vw, 1.12rem);
  line-height: 1.6; color: rgba(255,255,255,.94); text-shadow: 0 1px 10px rgba(0,0,0,.3);
}
.svch__actions { display: flex; flex-wrap: wrap; gap: .7rem; margin-top: 1.9rem; }
.svch__btn {
  font-family: var(--f-body); font-weight: 600; font-size: .9rem; line-height: 1.15;
  padding: .78rem 1.4rem; border-radius: 3px; box-shadow: none;
}
.svch__btn:hover { box-shadow: none; transform: translateY(-1px); }
@media (max-width: 1024px) { .svch { min-height: 60vh; } }
@media (max-width: 760px) {
  .svch { min-height: 66svh; }
  .svch__overlay { background: rgba(0,0,0,.54); }
  .svch__actions .btn { width: 100%; justify-content: center; }
}

.svch__title, .svcmid__h { text-wrap: pretty; }


/* ---- page calm: no scroll-reveal on service pages ---- */
.svc-page .reveal { opacity: 1; transform: none; }


/* =====================================================================
   WIDTH + RHYTHM AUDIT (2026-07-28)
   One shared width system so no commercial section reads as a narrow,
   isolated block. Appended last so it wins. Delete this block to revert
   the width corrections.
   ===================================================================== */

/* Reading widths. Commercial sections (pricing, packages, deliverables,
   problems, team, related services, CTAs) never take a reading width; they
   run to the wide container. --w-head matches the homepage .s-head, which
   is the agreed scale reference. */
:root { --w-head: 820px; --w-read: 62ch; --w-legal: 74ch; }

/* Section heading blocks: one width everywhere, levelled UP to the
   homepage value. Internal pages were previously 720px and 760px, which is
   what made their headings read smaller than the homepage. */
.s-head, .shift-head, .pkg-head, .gt-intro__inner { max-width: var(--w-head); }

/* Legal pages keep a comfortable measure, but the heading block and the
   body now share one left edge and one width. */
.legal { max-width: var(--w-legal); }
.legal-page .page-hero__inner { max-width: var(--w-legal); }

/* Contact: one contact column rather than two stacked blocks. */
.gt-direct__social { margin-top: 1.1rem; padding-top: 1rem; border-top: 1px solid var(--line); font-size: .92rem; color: var(--ink-72); }
.gt-direct__social a { color: var(--green-deep); font-weight: 600; }

/* Spacing scale. Major editorial sections, standard content sections and
   compact integrated sections, so a small block never carries full
   major-section padding. */


/* =====================================================================
   SERVICE PAGES — one middle section (2026-07-28)
   Three visible sections per page: hero, this, footer. Everything the
   service needs to say lives inside one <section> as one continuous
   composition, not several bands stacked in a wrapper.
   Delete this block plus the earlier SERVICE PAGES block to revert.
   ===================================================================== */
.svcmid { padding-block: clamp(3.6rem, 7.5vw, 7.5rem); }   /* 58 - 120px */
.svcmid--light { background: var(--surface); }
.svcmid--grey  { background: var(--paper-2); }
.svcmid--dark  { background: var(--ink); color: var(--paper); }

/* one grid holds the whole composition, so the parts stay tied together */
.svcmid__grid {
  display: grid;
  grid-template-columns: minmax(260px, 34%) minmax(0, 1fr);
  column-gap: clamp(1.6rem, 4vw, 4rem);
  row-gap: 0;
  align-items: start;
}

/* top: heading left, overview right */
.svcmid__intro { grid-column: 1; }
.svcmid__rule { display: block; width: 44px; height: 2px; background: var(--svc-accent); margin-bottom: 1.2rem; }
.svcmid__h {
  font-family: var(--f-display); font-weight: 700; margin: 0;
  font-size: clamp(1.7rem, 1.1rem + 2vw, 2.7rem); line-height: 1.16; letter-spacing: -.025em;
}
.svcmid__ov {
  grid-column: 2; margin: 0; max-width: 62ch;
  font-size: clamp(1.02rem, .98rem + .3vw, 1.15rem); line-height: 1.75; color: var(--ink-72);
}

/* middle: the two content zones, tied to the same rule line */
.svcmid__cols {
  grid-column: 1 / -1; display: grid; grid-template-columns: 1fr 1fr;
  column-gap: clamp(1.6rem, 4vw, 4rem); row-gap: clamp(1.8rem, 3vw, 2.4rem);
  margin-top: clamp(2.4rem, 5vw, 4rem);
  border-top: 1px solid var(--line-2); padding-top: clamp(1.6rem, 3vw, 2.4rem);
}
.svcmid__col--use { border-left: 1px solid var(--line); padding-left: clamp(1.4rem, 3vw, 3rem); }
.svcmid__lab {
  font-family: var(--f-body); font-weight: 700; font-size: .76rem;
  letter-spacing: .18em; text-transform: uppercase; color: var(--ink-72); margin: 0 0 1.1rem;
}
.svcmid__list { columns: 2; column-gap: clamp(1.2rem, 2.5vw, 2.2rem); }
.svcmid__list li {
  break-inside: avoid; padding: .5rem 0; border-bottom: 1px solid var(--line);
  font-size: .95rem; line-height: 1.5; color: var(--ink);
}
.svcmid__scope { margin-top: 1.1rem; font-size: .84rem; line-height: 1.6; color: var(--ink-72); }
.svcmid__use { display: grid; gap: 1.15rem; }
.svcmid__use h3 { font-family: var(--f-body); font-weight: 700; font-size: 1rem; line-height: 1.3; margin: 0; }
.svcmid__use p { margin: .35rem 0 0; font-size: .93rem; line-height: 1.6; color: var(--ink-72); }

/* bottom: note, related links, closing line and the single CTA */
.svcmid__foot {
  grid-column: 1 / -1; display: grid; grid-template-columns: minmax(0, 1fr) auto;
  column-gap: clamp(1.6rem, 4vw, 4rem); row-gap: 1.4rem; align-items: end;
  margin-top: clamp(2rem, 4vw, 3rem); border-top: 1px solid var(--line-2);
  padding-top: clamp(1.6rem, 3vw, 2.2rem);
}
.svcmid__note { margin: 0 0 .9rem; font-size: .92rem; line-height: 1.65; color: var(--ink-72); max-width: 68ch; }
.svcmid__note a, .svcmid__rel a { color: var(--svc-on-light); text-decoration: underline; text-underline-offset: 3px; }
.svcmid__rel { margin: 0; font-size: .88rem; line-height: 1.6; color: var(--ink-72); }
.svcmid__close { margin: .7rem 0 0; font-size: clamp(1rem, .96rem + .3vw, 1.12rem); line-height: 1.55; color: var(--ink); max-width: 46ch; }
.svcmid__cta { display: flex; align-items: center; gap: 1.2rem; flex-wrap: wrap; }
.svcmid__all { font-family: var(--f-body); font-weight: 600; font-size: .88rem; color: var(--ink-72); text-decoration: underline; text-underline-offset: 3px; }
.svcmid__all:hover { color: var(--ink); }

/* dark variant, if a page ever uses it */
.svcmid--dark .svcmid__ov, .svcmid--dark .svcmid__use p, .svcmid--dark .svcmid__note,
.svcmid--dark .svcmid__rel, .svcmid--dark .svcmid__scope { color: rgba(240,240,240,.72); }
.svcmid--dark .svcmid__lab { color: rgba(240,240,240,.72); }
.svcmid--dark .svcmid__list li, .svcmid--dark .svcmid__close { color: var(--paper); border-color: rgba(240,240,240,.16); }
.svcmid--dark .svcmid__cols, .svcmid--dark .svcmid__foot { border-color: rgba(240,240,240,.24); }
.svcmid--dark .svcmid__col--use { border-color: rgba(240,240,240,.16); }
.svcmid--dark .svcmid__note a, .svcmid--dark .svcmid__rel a { color: var(--svc-on-dark); }
.svcmid--dark .svcmid__all { color: rgba(240,240,240,.72); }

/* ---- tablet ---- */
@media (max-width: 1000px) {
  .svcmid__grid { grid-template-columns: 1fr; }
  .svcmid__intro, .svcmid__ov { grid-column: 1; }
  .svcmid__ov { margin-top: 1.2rem; max-width: none; }
  .svcmid__list { columns: 1; }
}
/* ---- mobile: overview, include, useful, note and links, CTA ---- */
@media (max-width: 720px) {
  .svcmid__cols { grid-template-columns: 1fr; }
  .svcmid__col--use { border-left: 0; padding-left: 0; border-top: 1px solid var(--line); padding-top: 1.6rem; }
  .svcmid__foot { grid-template-columns: 1fr; align-items: start; }
  .svcmid__cta { width: 100%; }
  .svcmid__cta .btn { flex: 1 1 auto; justify-content: center; }
}


/* =====================================================================
   MOBILE PASS (2026-07-28) — touch targets and small-screen safety.
   Appended last so it wins. Delete this block to revert.
   ===================================================================== */

/* Compact buttons sit at 41px, which is under the 44px touch guidance.
   They go full width on phones anyway, so lift the height there rather
   than making them heavier on desktop. */
@media (max-width: 720px) {
  .pkgtable__cta, .gt-page .form__submit, .pkg-band__cta, .svcmid__cta .btn {
    padding-block: .82rem; min-height: 44px;
  }
}

/* Prices and package names must never force a horizontal scroll. */
.pkgtable__price, .pkgtable__name { overflow-wrap: anywhere; }

/* Long email addresses and URLs in body copy wrap rather than push out. */
.gt-direct__email a, .footer__email a, .aside-email a { overflow-wrap: anywhere; }

/* Belt and braces: nothing inside the page grid may exceed the viewport. */
main img, main svg, main video { max-width: 100%; }


/* =====================================================================
   SERVICES OVERVIEW REMOVED (2026-07-28)
   The dropdown intro panel lost its "View all services" link, so it no
   longer needs the trailing space that link occupied. Single-button CTA
   groups keep their left alignment rather than stretching.
   ===================================================================== */
.nav__mega-intro { align-self: start; }
.nav__mega-copy:last-child { margin-bottom: .2rem; }

/* =====================================================================
   TASTE + EMIL PASS (2026-07-29)  —  packages.html and the-shift.html ONLY
   Every rule below is scoped to body.pkg-page or body.shift-page.
   TO REVERT EVERYTHING: delete this entire block. Nothing else depends on it.
   Brand tokens, fonts, colours, prices, package names and the scattered
   logo animation are untouched by design.
   ===================================================================== */

/* --- 1. Press feedback (Emil: buttons must feel responsive) -----------
   The stylesheet had ZERO :active states. A press produced no acknowledgement.
   140ms is inside Emil's 100-160ms band for press feedback. Own transition
   declaration so it does not fight the .btn hover transition. */
body.pkg-page .btn,
body.shift-page .btn {
  transition: transform 140ms cubic-bezier(.16, 1, .3, 1),
              background var(--t-fast) var(--ease),
              box-shadow var(--t-fast) var(--ease),
              color var(--t-fast) var(--ease),
              border-color var(--t-fast) var(--ease);
}
body.pkg-page .btn:active,
body.shift-page .btn:active { transform: scale(.97); }

/* Text links get a lighter press than buttons: they have less mass. */
body.pkg-page .pkg-why__link:active,
body.shift-page .shift-cols__link:active { opacity: .62; }

/* --- 2. Hover gating (Emil: touch devices fire hover on tap) ---------- */
@media (hover: hover) and (pointer: fine) {
  body.pkg-page .pkgtable__col:hover .pkgtable__name,
  body.shift-page .gsteam__node:hover { transition: color 200ms var(--ease); }
}

/* --- 3. Tier enumeration retired (taste skill: no section-number
   eyebrows; eyebrow count was 4 against an allowance of 2 for a
   4-section page). The per-package colour cue is KEPT, moved to a
   3px top edge on each box so the boxes stay differentiated without
   counting themselves.
   TO REVERT: delete rules 3a and 3b. The labels are hidden, not deleted,
   so the words "Tier 01".."Tier 04" come straight back. */
body.pkg-page .pkgtable__tier { display: none; }                      /* 3a */
body.pkg-page .pkgtable__col { border-top-width: 3px; }               /* 3b */
body.pkg-page .pkgtable__col--1 { border-top-color: var(--ink); }
body.pkg-page .pkgtable__col--2 { border-top-color: var(--green-deep); }
body.pkg-page .pkgtable__col--3 { border-top-color: #1d7f6c; }
body.pkg-page .pkgtable__col--4 { border-top-color: #7a4a8e; }

/* --- 4. Reduced motion: remove the movement, keep the colour feedback
   (Emil: reduced motion means gentler, not zero) ---------------------- */
@media (prefers-reduced-motion: reduce) {
  body.pkg-page .btn:active,
  body.shift-page .btn:active { transform: none; }
  body.pkg-page .btn,
  body.shift-page .btn { transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease); }
}

/* =====================================================================
   FULL AUDIT PASS (2026-07-29) — site-wide.  TO REVERT: delete this block.
   ===================================================================== */
/* Brand rule: no pill buttons. .btn carried border-radius:999px on all 17
   pages while package CTAs were already 3px. Unified to 3px. */
.btn { border-radius: 3px; }
/* Press feedback, site-wide (140ms sits in the 100-160ms band). */
.btn {
  transition: transform 140ms var(--ease-out),
              background var(--t-fast) var(--ease),
              box-shadow var(--t-fast) var(--ease),
              color var(--t-fast) var(--ease),
              border-color var(--t-fast) var(--ease);
}
.btn:active { transform: scale(.97); }
@media (hover: none) { .btn:hover { box-shadow: none; } }
@media (prefers-reduced-motion: reduce) {
  .btn { transition: background var(--t-fast) var(--ease), color var(--t-fast) var(--ease); }
  .btn:active { transform: none; }
}

/* =====================================================================
   ACCESSIBILITY + PERFORMANCE PASS (2026-07-29).  TO REVERT: delete block.
   White on brand teal #2AB59A = 2.57:1 and fails even large-text AA.
   Brand teal preserved; the label darkens instead:
   ink on #2AB59A = 6.35:1, ink on hover #23a189 = 5.07:1. Both pass AA.
   ===================================================================== */
.btn--mint { color: var(--ink); }
.btn--mint:hover { color: var(--ink); }
.btn--mint .arr { color: currentColor; }

/* =====================================================================
   CONSISTENCY + TYPOGRAPHY PASS (2026-07-30).  TO REVERT: delete block.
   ===================================================================== */
/* Packages hero was centred because .page-hero__inner set max-width:940px
   on the element carrying .container (which has margin-inline:auto), so the
   whole block centred: copy began at x=308px vs x=58px elsewhere at 1440px.
   Mirrors the pattern .shift-hero already uses. */
.pkg-hero .page-hero__inner { max-width: none; text-align: left; }
.pkg-hero .page-hero__title { max-width: 880px; margin-inline: 0; }
.pkg-hero .page-hero__lead  { max-width: 46ch;  margin-inline: 0; }
.pkg-hero .hero__actions    { justify-content: flex-start; }
.pkg-hero__reg              { margin-inline: 0; }
.page-hero .page-hero__inner { text-align: left; }
.page-hero .page-hero__title,
.page-hero .page-hero__lead { margin-inline: 0; }
.gsteam__br { display: inline; }
h1, h2, h3,
.page-hero__title, .s-head h2, .gsteam__h, .pkgtable__name,
.svcmid__h, .proute__t, .shift-cols__h, .cta__title { text-wrap: balance; }
p, li, .page-hero__lead, .s-lead, .pkgtable__desc, .pkg-fine { text-wrap: pretty; }
.btn { white-space: nowrap; }
@media (max-width: 380px) { .btn { white-space: normal; } }
.pkgtable__price, .frow__price { white-space: nowrap; }
/* Service hero H1 scale crossed the packages/shift curve (3.2px smaller at
   1440px but 1.6px larger at 390px). Unified. Contact keeps its own smaller
   scale deliberately: form page, no image hero, different composition. */
.svc-page .page-hero__title { font-size: clamp(2.3rem, 1rem + 4.6vw, 4.4rem); }

/* =====================================================================
   HOMEPAGE VIDEO SWAP (2026-07-30).  TO REVERT: delete this block.
   Hero poster rules only. The lower What We Do video was removed on
   2026-07-30; the hero clip itself was later replaced (see 2026-07-30e).
   ===================================================================== */
.hero--video .hero__vid video { background: url("../img/herovideo-poster.jpg") center / cover no-repeat; }
@media (prefers-reduced-motion: reduce) {
  .hero--video .hero__vid { background: url("../img/herovideo-poster.jpg") center / cover no-repeat var(--ink); }
}
/* What We Do returns to copy + checklist, two columns, original proportions. */
.wwd2 { grid-template-columns: 1.05fr .95fr; align-items: center; }
.wwd2__copy { display: block; }
.wwd2__list { margin-top: 0; }
@media (max-width: 920px) {
  .wwd2 { grid-template-columns: 1fr; gap: 1.8rem; }
  .wwd2__list { margin-top: .4rem; }
}

/* =====================================================================
   THE SHIFT REWORK + SERVICE TICKS (2026-07-30).  TO REVERT: delete block.
   ===================================================================== */
/* 1. Service pages: the homepage tick, same asset, size and colour. */
.svcmid__list li { display: flex; align-items: flex-start; gap: .7rem; }
.svcmid__check { width: 20px; height: 20px; flex: none; margin-top: .16em; color: var(--mint); }

/* 4. Process without numbers: sequence reads from the shared top rule and
      column order. Overrides the earlier .proute dot/counter treatment. */
.proute { padding-top: 0; }
.proute::before { content: none; }
.proute > li { position: relative; padding-top: 1.4rem; border-top: 1px solid var(--line-2); }
.proute > li::before { content: ""; position: absolute; left: 0; top: -1px; width: 34px; height: 3px; background: var(--green); }
.proute > li:nth-child(2)::before { background: var(--mint); }
.proute > li:nth-child(3)::before { background: var(--purple); }
.proute > li:nth-child(4)::before { background: var(--green-deep); }
.proute h3 { font-family: var(--f-display); font-weight: 700; font-size: 1.22rem; margin: 0 0 .5rem; }
.proute p { margin: 0; font-size: .93rem; line-height: 1.6; color: var(--ink-72); }
.proute__dot { display: none; }
@media (max-width: 900px) { .proute { grid-template-columns: repeat(2, 1fr); row-gap: 1.9rem; } }
@media (max-width: 560px) { .proute { grid-template-columns: 1fr; row-gap: 1.5rem; } }
@media (max-width: 820px) {
  .proute { padding-left: 0; }
  .proute > li { padding-top: 1.2rem; }
}

/* =====================================================================
   THE SHIFT: OUR APPROACH + CULTURE (2026-07-30b)
   TO REVERT: delete this block and restore the-shift.html from backup.
   ===================================================================== */

/* --- Our Approach: heading and direct-relationship message across the top */
.clead__head { max-width: var(--w-head); }
.clead__h {
  font-family: var(--f-display); font-weight: 700;
  font-size: clamp(1.9rem, 1.15rem + 2.4vw, 3.1rem);
  line-height: 1.2; letter-spacing: -.015em; margin: .5rem 0 0;
}
.clead__lead { margin: 1.2rem 0 0; font-size: 1.06rem; line-height: 1.7; color: var(--ink-72); max-width: 66ch; }

/* --- Portrait + biography ------------------------------------------- */
.clead__body {
  display: grid; grid-template-columns: auto minmax(0, 1fr);
  gap: clamp(1.8rem, 4vw, 3.4rem); align-items: start;
}
.clead__portrait {
  margin: 0; width: clamp(220px, 22vw, 290px); aspect-ratio: 29 / 38;
  border-radius: 50%; overflow: hidden;      /* refined vertical oval */
  background: var(--paper-2); flex: none;
}
/* Source is a full-length 560x831 frame with the face in the upper third.
   cover alone would show head to hip, so the image is scaled from a high
   origin to bring head and shoulders up as the focal content. */
.clead__portrait img {
  display: block; width: 100%; height: 100%;
  object-fit: cover; object-position: 50% 0%;
}
.clead__role {
  font-family: var(--f-body); font-weight: 700; font-size: .74rem;
  letter-spacing: .16em; text-transform: uppercase; color: var(--ink-72);
  margin: 0 0 1rem;
}
.clead__bio p + p { margin-top: 1rem; }
.clead__bio p:not(.clead__role) { font-size: 1rem; line-height: 1.75; color: var(--ink-72); max-width: 62ch; }

@media (max-width: 860px) {
  .clead__body { grid-template-columns: 1fr; gap: clamp(1.4rem, 4vw, 2rem); }
  .clead__portrait { width: clamp(190px, 46vw, 240px); }
  .clead__band { margin-right: 0; }          /* contained band on mobile, no bleed */
}

/* --- Culture: soft-grey plane, wide editorial split ------------------ */
.culture { background: var(--paper-2); }
.culture__grid {
  display: grid; grid-template-columns: minmax(220px, 30%) minmax(0, 1fr);
  gap: clamp(1.6rem, 4vw, 4rem); align-items: start;
}
.culture__h {
  font-family: var(--f-display); font-weight: 700;
  font-size: clamp(1.7rem, 1.1rem + 1.9vw, 2.6rem);
  line-height: 1.24; margin: .5rem 0 0;
}
.culture__body p { margin: 0; font-size: 1.02rem; line-height: 1.75; color: var(--ink-72); max-width: 64ch; }
.culture__body p + p { margin-top: 1.1rem; }
.culture__pull {
  font-family: var(--f-display); font-weight: 700;
  font-size: clamp(1.12rem, 1rem + .55vw, 1.42rem) !important;
  line-height: 1.45 !important; color: var(--ink) !important;
  padding-left: 1.15rem; border-left: 3px solid var(--green);
  margin-top: 1.4rem !important;
}
@media (max-width: 860px) {
  .culture__grid { grid-template-columns: 1fr; gap: 1.4rem; }
}
.culture__head { min-width: 0; }

/* =====================================================================
   INTRO, SCROLL REVEALS, PORTRAIT + SPACING (2026-07-30c)
   TO REVERT: delete this block and the matching js/main.js section.
   ===================================================================== */

/* ---------- 2. Scroll reveals -------------------------------------- */
/* Content is visible by default. Only once JS confirms support does it
   arm the hidden state, so a no-JS visitor sees everything normally. */
.js-reveal [data-reveal],
.js-reveal [data-reveal-group] > * {
  opacity: 0; transform: translateY(16px);
  transition: opacity 560ms cubic-bezier(.16,1,.3,1), transform 560ms cubic-bezier(.16,1,.3,1);
}
.js-reveal [data-reveal].is-in,
.js-reveal [data-reveal-group] > .is-in { opacity: 1; transform: none; }
.js-reveal [data-reveal-group] > * { transition-delay: calc(var(--i, 0) * 70ms); }

@media (prefers-reduced-motion: reduce) {
  .js-reveal [data-reveal],
  .js-reveal [data-reveal-group] > * { opacity: 1 !important; transform: none !important; transition: none !important; }
}

/* ---------- 3. Portrait: horizontal centring only ------------------
   object-position X is inert here: the source (560x831, ratio .674) is a
   narrower ratio than the 29/38 oval, so cover scales by WIDTH and leaves
   no horizontal overflow to reposition. The zoom transform is what creates
   horizontal room, so the correction is a translateX on that transform.
   Measured: subject centre sits at ~42-44% of frame width against a 50%
   frame centre, i.e. 6-8% left. translateX(8%) moves the frame right by
   8%/1.32 = 6.1% of image width. VERTICAL IS UNCHANGED: object-position Y
   stays 0% and transform-origin Y stays 16%. */
.clead__portrait img {
  object-position: 50% 0%;
  transform: translateX(5%) scale(1.32);
  transform-origin: 50% 16%;
}

/* ---------- 4. Banner: blue band with a teal offset edge ------------ */
.clead__band {
  position: relative;
  margin: clamp(1.6rem, 3vw, 2.4rem) 0 clamp(1.8rem, 3.5vw, 2.8rem);
  margin-right: calc(var(--gutter) * -1);   /* never 100vw: cannot scroll */
  background: var(--green);
  padding: clamp(.95rem, 1.9vw, 1.35rem) clamp(1.15rem, 2.4vw, 2rem);
  border-radius: 6px 0 0 6px;               /* slight left radius, square right */
}
/* the "shift": a thin teal strip stepped off the lower edge */
.clead__band::after {
  content: ""; position: absolute; left: 6px; right: 0; bottom: -5px; height: 5px;
  background: var(--mint); border-radius: 0 0 0 3px;
}
.clead__band__tx {
  margin: 0; font-family: var(--f-body); font-weight: 600;
  font-size: clamp(.95rem, .88rem + .3vw, 1.12rem);
  line-height: 1.5; color: var(--white); max-width: 44ch;
}
@media (max-width: 860px) {
  .clead__band { margin-right: 0; border-radius: 6px; }
  .clead__band::after { right: 6px; border-radius: 0 0 3px 3px; }
}

/* ---------- 5. Spacing: Our Approach -> A Clear Process -------------
   CAUSE: .clead used .section (--section-y = 72-144px) while #process uses
   .section--tight (48-80px), so adjacent padding stacked to ~224px.
   Fixed at source by trimming the two paddings, not with negative margin.
   Desktop total 56+40 = 96px. Mobile 40+24 = 64px. */
.shift-page .clead { padding-bottom: clamp(2.5rem, 4vw, 3.5rem); }
.shift-page #process { padding-top: clamp(1.5rem, 2.6vw, 2.5rem); }

/* ---------- 6. Spacing: Culture -> shattered logo -------------------
   The removed statement took .shift-sig__head with it, so the band's old
   top margin now separates nothing. Desktop 56+40 = 96px, mobile 40+32. */
.shift-page .culture { padding-bottom: clamp(2.5rem, 4vw, 3.5rem); }
.shift-sig { padding-block: clamp(2rem, 3.5vw, 2.5rem) clamp(2.6rem, 5vw, 4.5rem); }
.shift-page .img-slot-band { margin-block: 0; }

/* =====================================================================
   INTRO v2 + TICK-LIST REVEAL (2026-07-30d)
   TO REVERT: delete this block and the matching js/main.js timings.
   ===================================================================== */

/* ---------- 1. Intro: ticks assemble, then the wordmark flashes in ----
   The <img> is the complete approved logo (wordmark AND its ticks). The
   inline SVG carries copies of the two real tick polygons at their exact
   logo coordinates in the same viewBox, so when the wordmark flashes in
   the shapes coincide precisely and the handoff is invisible.
   TIMELINE  ticks 0-420ms | wordmark flash 440-620ms | hold 620-1020ms
             exit 1020-1270ms  =>  overlay gone at ~1.27s */
.gsintro {
  position: fixed; inset: 0; z-index: 9999;
  display: grid; place-items: center;
  background: #141112;
  pointer-events: none;                       /* never blocks links */
  animation: gsintro-out 250ms cubic-bezier(.16,1,.3,1) 1020ms both;
}
.gsintro__stage { position: relative; width: min(46vw, 340px); aspect-ratio: 696.45 / 225.96; }
.gsintro__logo,
.gsintro__ticks { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }

/* wordmark: hidden while the ticks travel, then one brief flash to solid */
.gsintro__logo { opacity: 0; animation: gsintro-word 180ms steps(1,end) 440ms forwards; }

/* ticks: independent paths, no crossover. The teal tick rests LEFT of the
   blue one in the real logo, so teal comes from the left and blue from the
   right; sending blue from the left would drag it across teal. */
.gsintro__tick { opacity: 0; }
.gsintro__tick--teal { animation: gsintro-tick-teal 420ms cubic-bezier(.22,.9,.28,1) both; }
.gsintro__tick--blue { animation: gsintro-tick-blue 420ms cubic-bezier(.22,.9,.28,1) 60ms both; }
/* once the full logo is solid the temporary ticks retire behind it */
.gsintro__ticks { animation: gsintro-ticks-off 1ms linear 640ms forwards; }

@keyframes gsintro-tick-teal {
  0%   { opacity: 0; transform: translate(-150px, -48px) }
  55%  { opacity: 1 }
  88%  { transform: translate(4px, 2px) }        /* small settle, no bounce */
  100% { opacity: 1; transform: translate(0, 0) }
}
@keyframes gsintro-tick-blue {
  0%   { opacity: 0; transform: translate(150px, 40px) }
  55%  { opacity: 1 }
  88%  { transform: translate(-4px, -2px) }
  100% { opacity: 1; transform: translate(0, 0) }
}
@keyframes gsintro-word {
  0%   { opacity: 0 }
  40%  { opacity: 1 }
  60%  { opacity: .35 }                          /* one restrained flicker */
  100% { opacity: 1 }
}
@keyframes gsintro-ticks-off { to { opacity: 0 } }
@keyframes gsintro-out { to { opacity: 0; visibility: hidden } }
.gsintro.is-done { display: none; }

@media (prefers-reduced-motion: reduce) {
  .gsintro { animation: gsintro-out 180ms linear 620ms both; }
  .gsintro__logo { opacity: 1; animation: none; }        /* static, readable */
  .gsintro__ticks { display: none; }                     /* no travel, no flicker */
}

/* ---------- 2. Tick lists: reveal top to bottom ---------------------
   Applies ONLY to lists using the approved checkmark_icon.svg tick:
   .wwd2__list (homepage) and .svcmid__list (ten service pages).
   Packages lists use a square ::before marker and are deliberately excluded.
   Items start ABOVE their resting position and drop into place, so the
   list assembles downward the way a list reads. */
.js-reveal [data-tick-list] > li {
  opacity: 0; transform: translateY(-11px);
  transition: opacity 620ms cubic-bezier(.16,1,.3,1), transform 620ms cubic-bezier(.16,1,.3,1);
  transition-delay: calc(var(--i, 0) * 110ms);
}
.js-reveal [data-tick-list] > li.is-in { opacity: 1; transform: none; }

@media (prefers-reduced-motion: reduce) {
  .js-reveal [data-tick-list] > li {
    opacity: 1 !important; transform: none !important; transition: none !important;
  }
}

/* =====================================================================
   HERO VIDEO -> HeroVideo.mp4 + VIEWPORT-HEIGHT HERO (2026-07-30e)
   TO REVERT: delete this block; restore the hero <video> from backup.
   ===================================================================== */

/* The clip is true 1920x1080 now, so no focal nudge is needed: centre it. */
.home .hero--video .hero__vid video { object-position: 50% 50%; }

/* --- Hero fills one screen, and only one screen ----------------------
   The header is fixed/sticky OUTSIDE normal flow and sits transparent over
   the hero, so no header height is subtracted: the hero already starts at
   the top of the viewport. svh is used so mobile browser chrome collapsing
   cannot make the hero jump. max-height stops it stretching absurdly tall
   on very large or ultrawide monitors. */
.home .hero--video {
  min-height: 680px;
  height: 100vh;                  /* fallback for older engines */
  max-height: 1080px;
  display: flex; align-items: center;
}
@supports (height: 100svh) { .home .hero--video { height: 100svh; } }

/* Below the desktop range the fixed 680px floor would exceed a phone
   screen and push the next section off, so height follows the viewport
   with a small content floor instead. */
@media (max-width: 900px) {
  .home .hero--video { min-height: 560px; height: auto; max-height: none; padding-block: clamp(4rem, 12vh, 7rem); }
}
@media (max-height: 700px) and (min-width: 901px) {
  .home .hero--video { min-height: 0; height: auto; padding-block: clamp(3rem, 8vh, 5rem); }
}
.home .hero--video .hero__inner { width: 100%; }


/* =====================================================================
   HOMEPAGE HERO: PURPLE ROTATING WORD + OUTLINED CTA (2026-07-30g)
   Homepage hero only. TO REVERT: delete this block (and change the button
   class in index.html back from btn--primary to btn--mint if wanted).
   ===================================================================== */

/* --- Rotating word: purple -------------------------------------------
   Measured against this footage in the copy region (no scrim behind it):
     brand --purple #925FA7 : 3.93 / 2.96 / 1.87 / 1.68  -> fails 3:1 AA
     on-dark      #C29CD4   : 8.01 / 6.04 / 3.81 / 3.42  -> passes
   Using the lighter purple, which is already the --svc-on-dark purple in
   the GridShift system rather than a new colour, so the word stays legible
   through the whole loop instead of only the opening seconds. */
.home .hero--video .rotate { color: var(--white); }


/* --- Hero video mirrored horizontally (2026-07-30i) -------------------
   Done in CSS rather than re-encoding: no quality loss, no extra bytes,
   source file untouched. Applies to the <video> only, so the copy, button
   and rotating word are unaffected and read normally.
   TO REVERT: delete this rule. */
.home .hero--video .hero__vid video { transform: scaleX(-1); }

/* --- Homepage hero button: white label (2026-07-30j) ------------------
   Overrides the site-wide ink label on .btn--mint, homepage hero only.
   All other teal buttons keep the ink label and stay AA compliant.

   CONTRAST NOTE: white on brand teal #2AB59A computes to 2.57:1, which is
   below both the 4.5:1 body and the 3:1 large-text AA thresholds. The ink
   label measured 6.35:1. Applied as asked; see the note in the reply for
   the two ways to get white text and keep contrast.
   TO REVERT: delete this rule. */
.home .hero--video .btn--mint { color: var(--white); }
.home .hero--video .btn--mint:hover { color: var(--white); }

/* --- Rotating word: white, single white underline ---------------------
   The stroke sits on .rotate__word, not on .rotate. That matters: .rotate
   carries min-width: 5.2ch to stop the line reflowing as words swap, so an
   underline on the container would run past the end of a short word like
   "grow". On the inner span it measures exactly the word.
   text-decoration is used rather than a pseudo-element so the stroke tracks
   the text width automatically on every swap, with no JS and nothing to
   re-measure.
   TO REVERT: delete this block. */
.home .hero--video .rotate { padding-bottom: 0; }
.home .hero--video .rotate::before,
.home .hero--video .rotate::after { content: none !important; display: none !important; }

.home .hero--video .rotate__word {
  text-decoration: underline;
  text-decoration-color: #ffffff;
  text-decoration-thickness: 2px;
  text-underline-offset: .18em;
  text-decoration-skip-ink: none;   /* one unbroken stroke, no gap at the g */
}

/* =====================================================================
   INTERNAL HERO SYSTEM: responsive image pairs + full viewport (2026-07-31)
   Applies to the ten .svch service heroes and .shift-hero.
   packages.html and contact.html are untouched: no matching pair supplied.
   TO REVERT: delete this block and restore the <img> tags from backup.
   ===================================================================== */

/* --- 1. Full first screen, matching the homepage hero video ---------
   The header is fixed and transparent over the hero, so nothing is
   subtracted from the height. svh/dvh keep mobile browser chrome from
   causing a jump. max-height stops absurd stretching on tall monitors. */
.svch, .shift-hero {
  position: relative;
  min-height: 680px;
  height: 100vh;                 /* fallback */
  max-height: 1080px;
  overflow: hidden;
  display: flex;
  align-items: center;
}
@supports (height: 100svh) { .svch, .shift-hero { height: 100svh; } }

/* Short laptops: let the hero shrink rather than clip the copy. */
@media (max-height: 700px) and (min-width: 769px) {
  .svch, .shift-hero { min-height: 0; height: auto; max-height: none;
                       padding-block: clamp(3rem, 8vh, 5rem); }
}

/* Phones: full screen, no fixed floor that could exceed a short device. */
@media (max-width: 768px) {
  .svch, .shift-hero { min-height: 100svh; height: 100dvh; max-height: none; }
}
@media (max-width: 768px) and (max-height: 620px) {
  .svch, .shift-hero { min-height: 0; height: auto; padding-block: 3.5rem; }
}

/* --- 2. Image fit: cover, no bars, no distortion -------------------- */
.svch__media, .shift-hero__media { position: absolute; inset: 0; overflow: hidden; }
.svch__pic, .shift-hero__pic { display: block; width: 100%; height: 100%; }
.svch__media img, .shift-hero__media img {
  display: block; width: 100%; height: 100%;
  object-fit: cover; object-position: center center;
}
.svch__inner, .shift-hero .page-hero__inner { position: relative; z-index: 1; width: 100%; }

/* --- 3. Overlay: per-page opacity, tuned so the backdrop behind the
   copy lands on a common effective luminance (~0.105) despite the
   source images ranging 0.123-0.201. This equalises how bright each
   hero reads WITHOUT altering the supplied photography. --- */

/* service-brand-development: source 0.124 desktop / 0.123 mobile */
body[data-hero="service-brand-development"] .svch__overlay { background: linear-gradient(90deg, rgba(0,0,0,0.32) 0%, rgba(0,0,0,0.18) 45%, rgba(0,0,0,0.12) 100%); }
@media (max-width: 768px) { body[data-hero="service-brand-development"] .svch__overlay { background: rgba(0,0,0,0.18); } }
/* service-creative-support: source 0.148 desktop / 0.183 mobile */
body[data-hero="service-creative-support"] .svch__overlay { background: linear-gradient(90deg, rgba(0,0,0,0.43) 0%, rgba(0,0,0,0.29) 45%, rgba(0,0,0,0.12) 100%); }
@media (max-width: 768px) { body[data-hero="service-creative-support"] .svch__overlay { background: rgba(0,0,0,0.43); } }
/* service-digital-advertising: source 0.18 desktop / 0.149 mobile */
body[data-hero="service-digital-advertising"] .svch__overlay { background: linear-gradient(90deg, rgba(0,0,0,0.42) 0%, rgba(0,0,0,0.28) 45%, rgba(0,0,0,0.12) 100%); }
@media (max-width: 768px) { body[data-hero="service-digital-advertising"] .svch__overlay { background: rgba(0,0,0,0.20); } }
/* service-email-marketing: source 0.186 desktop / 0.195 mobile */
body[data-hero="service-email-marketing"] .svch__overlay { background: linear-gradient(90deg, rgba(0,0,0,0.44) 0%, rgba(0,0,0,0.30) 45%, rgba(0,0,0,0.12) 100%); }
@media (max-width: 768px) { body[data-hero="service-email-marketing"] .svch__overlay { background: rgba(0,0,0,0.33); } }
/* service-marketing-packages: source 0.151 desktop / 0.191 mobile */
body[data-hero="service-marketing-packages"] .svch__overlay { background: linear-gradient(90deg, rgba(0,0,0,0.45) 0%, rgba(0,0,0,0.31) 45%, rgba(0,0,0,0.12) 100%); }
@media (max-width: 768px) { body[data-hero="service-marketing-packages"] .svch__overlay { background: rgba(0,0,0,0.45); } }
/* service-print-design: source 0.193 desktop / 0.198 mobile */
body[data-hero="service-print-design"] .svch__overlay { background: linear-gradient(90deg, rgba(0,0,0,0.60) 0%, rgba(0,0,0,0.46) 45%, rgba(0,0,0,0.24) 100%); }
@media (max-width: 768px) { body[data-hero="service-print-design"] .svch__overlay { background: rgba(0,0,0,0.47); } }
/* service-seo: source 0.155 desktop / 0.162 mobile */
body[data-hero="service-seo"] .svch__overlay { background: linear-gradient(90deg, rgba(0,0,0,0.46) 0%, rgba(0,0,0,0.32) 45%, rgba(0,0,0,0.12) 100%); }
@media (max-width: 768px) { body[data-hero="service-seo"] .svch__overlay { background: rgba(0,0,0,0.35); } }
/* service-slide-presentations: source 0.139 desktop / 0.18 mobile */
body[data-hero="service-slide-presentations"] .svch__overlay { background: linear-gradient(90deg, rgba(0,0,0,0.39) 0%, rgba(0,0,0,0.25) 45%, rgba(0,0,0,0.12) 100%); }
@media (max-width: 768px) { body[data-hero="service-slide-presentations"] .svch__overlay { background: rgba(0,0,0,0.42); } }
/* service-social-media-management: source 0.127 desktop / 0.157 mobile */
body[data-hero="service-social-media-management"] .svch__overlay { background: linear-gradient(90deg, rgba(0,0,0,0.32) 0%, rgba(0,0,0,0.18) 45%, rgba(0,0,0,0.12) 100%); }
@media (max-width: 768px) { body[data-hero="service-social-media-management"] .svch__overlay { background: rgba(0,0,0,0.33); } }
/* service-website-design: source 0.201 desktop / 0.188 mobile */
body[data-hero="service-website-design"] .svch__overlay { background: linear-gradient(90deg, rgba(0,0,0,0.62) 0%, rgba(0,0,0,0.48) 45%, rgba(0,0,0,0.26) 100%); }
@media (max-width: 768px) { body[data-hero="service-website-design"] .svch__overlay { background: rgba(0,0,0,0.44); } }
/* the-shift: source 0.182 desktop / 0.176 mobile */
.shift-hero__overlay { background: linear-gradient(90deg, rgba(0,0,0,0.56) 0%, rgba(0,0,0,0.42) 45%, rgba(0,0,0,0.20) 100%); }
@media (max-width: 768px) { .shift-hero__overlay { background: rgba(0,0,0,0.40); } }

/* --- Marketing Packages page hero (2026-07-31b) -----------------------
   Now uses the same Marketing pair as the service page, and joins the
   shared full-viewport internal hero system so it matches the other 11.
   Source left-40% luminance 0.151 desktop / 0.191 mobile. */
.pkg-hero__pic { display: block; width: 100%; height: 100%; }
.pkg-hero__media img { display: block; width: 100%; height: 100%; object-fit: cover; object-position: center center; }
.pkg-hero { min-height: 680px; height: 100vh; max-height: 1080px; overflow: hidden; display: flex; align-items: center; }
@supports (height: 100svh) { .pkg-hero { height: 100svh; } }
@media (max-height: 700px) and (min-width: 769px) {
  .pkg-hero { min-height: 0; height: auto; max-height: none; padding-block: clamp(3rem, 8vh, 5rem); }
}
@media (max-width: 768px) { .pkg-hero { min-height: 100svh; height: 100dvh; max-height: none; } }
@media (max-width: 768px) and (max-height: 620px) { .pkg-hero { min-height: 0; height: auto; padding-block: 3.5rem; } }
.pkg-hero .page-hero__inner { position: relative; z-index: 1; width: 100%; }
.pkg-hero__overlay { background: linear-gradient(90deg, rgba(0,0,0,0.45) 0%, rgba(0,0,0,0.31) 45%, rgba(0,0,0,0.12) 100%); }
@media (max-width: 768px) { .pkg-hero__overlay { background: rgba(0,0,0,0.45); } }

/* =====================================================================
   HERO OVERLAYS REMOVED, SITE-WIDE (2026-07-31c)
   Every internal hero scrim is switched off. The overlay divs are left in
   the markup (they are aria-hidden and inert), so restoring any of them is
   a one-line change rather than a markup edit.

   Safe because the supplied photography is uniformly dark: left-40%
   luminance runs 0.123-0.201, so white hero copy still measures between
   12.59:1 and 16.41:1 against it, well past the 4.5:1 AA body threshold.
   TO REVERT: delete this block; the per-page values above come back.
   ===================================================================== */
.svch__overlay,
.shift-hero__overlay,
.pkg-hero__overlay,
body[data-hero] .svch__overlay {
  background: none !important;
}
@media (max-width: 768px) {
  .svch__overlay,
  .shift-hero__overlay,
  .pkg-hero__overlay,
  body[data-hero] .svch__overlay {
    background: none !important;
  }
}

/* =====================================================================
   PORTFOLIO CAROUSEL + LIGHTBOX (2026-07-31d)
   TO REVERT: delete this block and restore the swork section from backup.
   ===================================================================== */

/* --- Frames -----------------------------------------------------------
   The three pieces are 2.00, 0.77 and 3.90 in ratio - a website mockup, a
   portrait flyer and a wide logo lockup. No single crop can hold all three,
   so every frame is one size with object-fit: contain and a soft-grey
   ground. Cropping would cut the phone off the mockup and slice the
   wordmark, which is the opposite of showing the work. */
.swork__viewport { cursor: grab; }
.swork__viewport.is-dragging { cursor: grabbing; }
.swork__viewport.is-dragging * { pointer-events: none; }

.swork__img {
  width: clamp(272px, 30vw, 460px);
  aspect-ratio: 3 / 2;                 /* middle ground across the three ratios */
  flex: none; overflow: hidden;
  background: var(--paper-2);
  border-radius: 2px;                  /* very low radius, matches the site */
  padding: clamp(.6rem, 1vw, 1rem);
  border: 0; margin: 0;
  display: block; cursor: pointer;
  transition: opacity 200ms var(--ease);
}
.swork__img img {
  width: 100%; height: 100%;
  object-fit: contain;                 /* never crop client work */
  object-position: center center;
  display: block;
}
/* Full-bleed variant. The base frame pads the image so letterboxed artwork
   sits on a grey ground; an image already at the frame's 3:2 ratio needs
   neither, so it fills corner to corner. Add this class to any future slide
   supplied at 3:2 (1400x933 or similar). */
.swork__img--bleed { padding: 0; background: transparent; }
.swork__img--bleed img { object-fit: cover; }

@media (hover: hover) and (pointer: fine) {
  .swork__img:hover { opacity: .88; }
}
.swork__img:focus-visible { outline: 3px solid var(--green); outline-offset: 3px; }

/* Clones exist to make the loop seamless. They stay CLICKABLE - the strip is
   always moving, so most of what a visitor reaches for is a clone - but they
   are removed from the keyboard order and from assistive tech, so Tab and a
   screen reader still see exactly three pieces of work, not nine. */
.swork__set[data-swork-clone] .swork__img { cursor: pointer; }

@media (max-width: 620px) {
  /* show most of one frame plus a slice of the next, so it reads as a strip */
  .swork__img { width: 78vw; aspect-ratio: 4 / 3; }
}

/* --- Lightbox --------------------------------------------------------- */
.swlb {
  position: fixed; inset: 0; z-index: 1000;
  display: grid; place-items: center;
  padding: clamp(1rem, 3vw, 2.5rem);
}
.swlb[hidden] { display: none; }
/* Light enough that the page stays legible around the image, dark enough
   that the artwork still reads as the focus. */
.swlb__backdrop { position: absolute; inset: 0; background: rgba(12, 10, 11, .52); }
.swlb__panel {
  position: relative; max-width: 64vw; max-height: 68vh;
  display: flex; align-items: center; justify-content: center;
}
/* The grey ground is sized to the image, not the viewport, so the page is
   still visible all the way around it. */
.swlb__img {
  display: block; max-width: 64vw; max-height: 68vh;
  width: auto; height: auto; object-fit: contain;
  background: var(--paper-2);
  box-shadow: 0 24px 70px rgba(12, 10, 11, .38);
}
@media (max-width: 900px) {
  .swlb__panel, .swlb__img { max-width: 78vw; max-height: 66vh; }
}
@media (max-width: 620px) {
  .swlb__panel, .swlb__img { max-width: 88vw; max-height: 62vh; }
}
.swlb__close {
  position: absolute; top: -8px; right: -8px;
  width: 46px; height: 46px;              /* comfortably past the 44px target */
  display: grid; place-items: center;
  background: var(--ink); color: var(--white);
  border: 1.5px solid rgba(255,255,255,.85); border-radius: 2px;
  font-size: 1.5rem; line-height: 1; cursor: pointer;
  transition: transform 140ms var(--ease-out), background 200ms var(--ease);
}
.swlb__close:hover { background: #000; }
.swlb__close:active { transform: scale(.96); }
.swlb__close:focus-visible { outline: 3px solid var(--mint); outline-offset: 3px; }
@media (max-width: 620px) {
  .swlb__close { top: 0; right: 0; transform: translate(25%, -110%); }
  .swlb__close:active { transform: translate(25%, -110%) scale(.96); }
}
body.swlb-open { overflow: hidden; }

/* --- Reduced motion: no drift, plain scrollable strip ----------------- */
@media (prefers-reduced-motion: reduce) {
  .swork__viewport { overflow-x: auto; scroll-snap-type: x proximity; }
  .swork__img { scroll-snap-align: start; }
  .swlb { transition: none; }
}

/* --- Rotating word: the full stop travels with the word (2026-08-05) ----
   .rotate carries min-width: 6.5ch so the headline does not reflow as the
   word swaps. A full stop typed after the span therefore sat at the far
   edge of that box, up to 2.5ch clear of a short word like "grow".
   Attaching it to .rotate__word makes it part of the word: it hugs the
   final letter and moves with every swap. */
.home .hero--video .rotate__word::after { content: "."; }

/* --- Package card alignment after the approved copy update (2026-08-05) --
   .pkgtable__for reserves min-height: 4.65em, which is exactly three lines
   at .9rem/1.55. The approved "Marketing Design Partner" description is 96
   characters and wraps to a fourth line once the four-column grid tightens
   below about 1400px, dropping that card's inclusion list one line lower
   than its neighbours.
   Reserving four lines across the whole four-column range keeps the row
   level whichever card wraps longest. Two- and one-column layouts are
   unaffected: they already release the min-height. */
@media (min-width: 1101px) {
  .pkgtable__for { min-height: 6.2em; }
}

/* =====================================================================
   COPY BATCH — 2026-08-07.  Homepage / The Shift / Contact / Packages.
   Everything here is additive and scoped.  TO REVERT: delete this block.
   ===================================================================== */

/* --- 1. Homepage: the rotating slot now has to hold 7-letter words ----
   Was 6.5ch, sized when the longest word was "shine" (5). The list is now
   grow / scale / lead / succeed / impress / engage / excel, so the slot is
   widened to stop the headline reflowing on every swap. The full stop is
   ::after on .rotate__word, so it still hugs the word; the reserve is
   trailing slack at the end of the H1 only. NOT verified in a browser. */
.rotate { min-width: 8ch; }

/* --- 2. Contact: social row -----------------------------------------
   Small solid circles in brand blue with white glyphs. White on #3A76BB
   is 4.70:1 - well past the 3:1 that non-text UI needs.
   2026-08-11: Instagram and Facebook are both live links. Any future
   profile without a URL renders as a span, never as href="#". */
.gt-social {
  display: flex; gap: .5rem; align-items: center;
  margin-top: 1rem; padding: 0; list-style: none;
}
.gt-social li { margin: 0; padding: 0; }
.gt-social li::before { content: none; }
.gt-social__item {
  display: grid; place-items: center;
  width: 34px; height: 34px; border-radius: 50%;
  background: var(--green); color: #fff;
  transition: background 200ms var(--ease), transform 140ms var(--ease-out);
}
.gt-social__item svg { width: 17px; height: 17px; display: block; }
a.gt-social__item:hover { background: #305F9A; }
a.gt-social__item:active { transform: scale(.94); }
a.gt-social__item:focus-visible { outline: 3px solid var(--ink); outline-offset: 3px; }
/* Kept for any future profile that has no URL yet: it would render as a
   non-interactive mark rather than a dead button, and never as href="#".
   Both current icons are real links, so nothing matches this today.
   Fading such a mark to .55 opacity was tried and rejected - it computed to
   2.15:1 for the glyph, under the 3:1 WCAG needs for meaningful graphics. */
span.gt-social__item { cursor: default; }
@media (prefers-reduced-motion: reduce) {
  a.gt-social__item:active { transform: none; }
}

/* --- 3. Packages: "Best for" line ------------------------------------ */
.pkgtable__best {
  margin: 0 0 1.4rem; font-size: .84rem; line-height: 1.5; color: var(--ink-72);
}
.pkgtable__best strong { font-weight: 700; color: var(--ink); }

/* --- 4. Packages: fine print steps down ------------------------------ */
.pkg-fine { font-size: .78rem; line-height: 1.55; }

/* --- 5. Packages: Marketing Design Partner as the recommended card ----
   Chip is solid teal with near-black text: 6.18:1. White on teal would
   have been 2.59:1 and failed, so the label is inked, not reversed. */
.pkgtable { overflow: visible; margin-top: .8rem; }
.pkgtable__col--pick {
  border-color: #1d7f6c; box-shadow: 0 10px 30px -18px rgba(35,31,32,.55);
}
body.pkg-page .pkgtable__col--pick { border-width: 2px; border-top-width: 4px; }
.pkgtable__flag {
  position: absolute; top: -.72rem; left: clamp(1.4rem, 2vw, 1.9rem);
  display: inline-block; padding: .26rem .6rem;
  background: var(--mint); color: var(--ink);
  font-family: var(--f-body); font-weight: 700; font-size: .64rem;
  letter-spacing: .13em; text-transform: uppercase; line-height: 1;
  border-radius: 2px; white-space: nowrap;
}
@media (max-width: 1100px) {
  .pkgtable__flag { font-size: .6rem; letter-spacing: .1em; }
}

/* =====================================================================
   PACKAGES LAYOUT — 2026-08-07b.  Three monthly cards across the top,
   Tier 04 as a full-width band beneath.  TO REVERT: delete this block.
   ===================================================================== */

/* --- 1. Three across instead of four ---------------------------------
   At container--wide (1480px) each card goes from ~352px to ~477px.
   Most bullets that were wrapping to two lines now fit on one, which is
   what takes the height out - no content was cut. */
@media (min-width: 1101px) {
  .pkgtable { grid-template-columns: repeat(3, 1fr); }

  /* The reserve on the "for" line was 6.2em (four lines) when the cards
     were narrow. At 477px the longest of the three wraps to two, so the
     old value was padding every card with two dead lines. Three lines
     reserved keeps them aligned with a little headroom. */
  .pkgtable__for { min-height: 4.65em; }
  .pkgtable__col--band .pkgtable__for { min-height: 0; }
}

/* --- 2. Tier 04 as a horizontal band --------------------------------- */
.pkgtable__col--band { grid-column: 1 / -1; }

@media (min-width: 1101px) {
  .pkgtable__col--band {
    display: grid;
    grid-template-columns: minmax(300px, 1fr) 1.75fr;
    grid-template-areas: "head list" "foot list";
    grid-template-rows: auto 1fr;
    column-gap: 0;
    padding: clamp(1.6rem, 2.2vw, 2.2rem) clamp(1.4rem, 2vw, 1.9rem);
  }
  .pkgband__head { grid-area: head; }
  .pkgband__foot { grid-area: foot; align-self: end; padding-top: 1.2rem; }
  .pkgband__list {
    grid-area: list; align-self: start;
    margin: 0; padding: .2rem 0 .2rem clamp(2rem, 3.5vw, 3.2rem);
    border-top: 0; border-left: 1px solid var(--line);
    display: block; columns: 2; column-gap: clamp(1.6rem, 2.6vw, 2.6rem);
  }
  .pkgband__list li { break-inside: avoid; margin-bottom: .55rem; }
  .pkgband__list li:last-child { margin-bottom: 0; }
  /* the band is one wide box, so its copy should not run the full width */
  .pkgtable__col--band .pkgtable__for { max-width: 42ch; }
  .pkgtable__col--band .pkgtable__best { max-width: 42ch; }
}

/* Below the band breakpoint it stacks head / list / foot in source order,
   inheriting the flex column already on .pkgtable__col. */
@media (max-width: 1100px) {
  .pkgband__list { columns: 2; column-gap: 1.6rem; display: block; }
  .pkgband__list li { break-inside: avoid; margin-bottom: .55rem; }
}
@media (max-width: 620px) {
  .pkgband__list { columns: 1; }
}

/* --- 3. The recommended chip centres on the top edge ------------------ */
.pkgtable__flag { left: 50%; transform: translateX(-50%); }

/* =====================================================================
   MOBILE MENU TIDY-UP — 2026-08-07c.  Readability and hit targets only.
   No change to colours, fonts or the menu's structure.
   TO REVERT: delete this block.
   ===================================================================== */

/* --- 1. Whole-row hit targets ----------------------------------------
   Top-level links were display:inline-block, so only the text itself was
   tappable and everything to its right was dead space. Now each row spans
   the panel and clears the 44px minimum. */
.mobilemenu__list a,
.mobilemenu__subtoggle {
  display: flex; align-items: center;
  width: 100%; min-height: 52px;
  padding: .45rem .6rem .45rem 0;
  border-radius: 3px;
}
.mobilemenu__subtoggle { justify-content: space-between; gap: .6rem; }

/* Size down from clamp(2rem, 9vw, 3.1rem): at 390px that rendered 35px,
   which put "Marketing Packages" right on the wrap boundary. This keeps
   the display serif dominant but fits every label on one line. */
.mobilemenu__list a,
.mobilemenu__subtoggle { font-size: clamp(1.65rem, 7vw, 2.4rem); }

/* --- 2. Rows read as rows -------------------------------------------
   gap was .1rem, so items nearly touched with nothing dividing them. */
.mobilemenu__list { gap: 0; }
.mobilemenu__list > li + li { border-top: 1px solid rgba(255,255,255,.12); }

/* --- 3. Grouped Services list ---------------------------------------
   Matches the desktop mega panel. The headings are plain list items with
   no link, so screen readers still announce the grouping. role="presentation"
   was tried and removed - it hid the labels from assistive tech entirely. */
.mobilemenu__subhead {
  font-family: var(--f-body); font-weight: 700; font-size: .68rem;
  letter-spacing: .16em; text-transform: uppercase;
  color: rgba(255,255,255,.62);
  padding: .95rem .9rem .3rem; margin: 0;
}
.mobilemenu__subhead:first-child { padding-top: .35rem; }

/* --- 4. Submenu rows: full width, 44px clear ------------------------- */
.mobilemenu__sub { gap: 0; padding-left: 0; margin: .35rem 0 .9rem; }
.mobilemenu__sub a {
  display: flex; align-items: center;
  width: 100%; min-height: 46px;
  padding: .5rem .9rem; border-radius: 3px;
  font-size: 1.06rem; line-height: 1.35;
  color: rgba(255,255,255,.88);          /* was .82 -> 13.9:1 on --ink */
}
.mobilemenu__sub li + li > a { border-top: 1px solid rgba(255,255,255,.07); }

/* --- 5. Hover is a pointer thing ------------------------------------
   These rules were ungated, so on a phone the translateX stuck to the last
   item tapped. Movement now only exists for real pointers; keyboard focus
   keeps the colour change on every device. */
.mobilemenu__list a:hover,
.mobilemenu__sub a:hover { transform: none; }
@media (hover: hover) and (pointer: fine) {
  .mobilemenu__list a:hover { transform: translateX(6px); }
  .mobilemenu__sub a:hover  { transform: translateX(5px); }
  .mobilemenu__list a:hover,
  .mobilemenu__sub a:hover  { background: rgba(255,255,255,.05); }
}
/* Touch feedback instead: a brief press state. */
.mobilemenu__list a:active,
.mobilemenu__sub a:active,
.mobilemenu__subtoggle:active { background: rgba(255,255,255,.08); }

/* --- 6. Focus ring that is actually visible on the dark panel -------- */
.mobilemenu__list a:focus-visible,
.mobilemenu__sub a:focus-visible,
.mobilemenu__subtoggle:focus-visible,
.mobilemenu__cta:focus-visible {
  outline: 3px solid var(--mint); outline-offset: 2px;
}

/* --- 7. Breathing room at the bottom so the CTA is never under the
   home indicator on iOS. ---------------------------------------------- */
.mobilemenu { padding-bottom: calc(clamp(1.6rem, 7vw, 3.5rem) + env(safe-area-inset-bottom, 0px)); }
.mobilemenu__cta { margin-top: 1.5rem; width: 100%; justify-content: center; }

@media (prefers-reduced-motion: reduce) {
  .mobilemenu__list a, .mobilemenu__sub a { transition: color .2s var(--ease); }
}

/* =====================================================================
   HOMEPAGE HERO — slight brightness lift (2026-08-07d)
   TO REVERT: delete this block. Nothing else references it.
   ===================================================================== */
/* The clip is genuinely dark in the source file: mean relative luminance
   0.052 behind the copy, 0.066 on its brightest frame. There was never a
   filter or scrim on this hero - the .hero__overlay div was removed from
   the markup on 2026-07-31 and its CSS has been inert since.

   Measured across 31 frames sampled every 2s. Because the video carries
   transform: scaleX(-1), the copy on screen-left sits over the RIGHT 45%
   of the source frame, which is the region measured.

   brightness(1.15) lifts midtones and highlights while leaving true blacks
   at zero (a multiply cannot raise 0), so the clip keeps its depth.
   Worst-frame white-text contrast after the lift: 7.6:1, still past AAA.
   The ceiling for AAA is 1.20; AA runs out at 1.60. */
.home .hero--video .hero__vid video { filter: brightness(1.15); }

@media (prefers-reduced-motion: reduce) {
  /* poster fallback is a still, same treatment for consistency */
  .home .hero--video .hero__vid { filter: brightness(1.15); }
}

/* =====================================================================
   CREATIVE SUPPORT — Pro package block (2026-08-07e)
   Lives INSIDE the existing #service section so the page still holds
   exactly two <section> elements in <main>, per the standing rule.
   Self-contained classes: the .pkgtable styles are scoped to body.pkg-page
   and would half-apply here (the tier label would reappear, the top border
   weight would not), so they are deliberately not reused.
   TO REVERT: delete this block and the .csupp markup on that one page.
   ===================================================================== */
.csupp {
  grid-column: 1 / -1;                 /* .svcmid__grid is a 2-col grid */
  margin-top: clamp(2.4rem, 5vw, 4rem);
  padding-top: clamp(2rem, 4vw, 3rem);
  border-top: 1px solid var(--line);
}
.csupp__h {
  font-family: var(--f-display); font-weight: 700;
  font-size: clamp(1.5rem, 1.2rem + 1.3vw, 2.1rem);
  line-height: 1.2; letter-spacing: -.015em; margin: 0 0 .9rem; color: var(--ink);
}
.csupp__lead {
  margin: 0 0 clamp(1.6rem, 3vw, 2.2rem); max-width: 68ch;
  font-size: clamp(1rem, .96rem + .25vw, 1.1rem); line-height: 1.75; color: var(--ink-72);
}
.csupp__card {
  position: relative; border: 1px solid var(--ink); border-top-width: 3px;
  border-top-color: #7a4a8e;           /* Tier 04 purple, same as the packages page */
  background: var(--surface); padding: clamp(1.5rem, 3vw, 2.1rem);
}
.csupp__rule { position: absolute; top: 0; left: 0; right: 0; height: 4px; background: var(--purple); }
.csupp__name {
  font-family: var(--f-body); font-weight: 700; margin: .4rem 0 0;
  font-size: clamp(1.1rem, 1rem + .35vw, 1.3rem); letter-spacing: -.015em; color: var(--ink);
}
.csupp__price {
  margin: .6rem 0 0; padding-top: 1rem; border-top: 1px solid var(--line);
  font-family: var(--f-body); font-weight: 700;
  font-size: clamp(1.3rem, 1.1rem + .5vw, 1.6rem); letter-spacing: -.025em; color: var(--ink);
}
.csupp__price span { display: block; margin-top: .2rem; font-weight: 500; font-size: .73rem; letter-spacing: .02em; color: var(--ink-72); }
.csupp__for { margin: .9rem 0 0; max-width: 62ch; font-size: .95rem; line-height: 1.6; color: var(--ink-72); }
.csupp__list {
  margin: 1.1rem 0 0; padding-top: 1.1rem; border-top: 1px solid var(--line);
  list-style: none; columns: 2; column-gap: clamp(1.4rem, 3vw, 2.6rem);
}
.csupp__list li {
  break-inside: avoid; position: relative; padding: 0 0 .55rem 1rem;
  font-size: .92rem; line-height: 1.5; color: var(--ink-72);
}
.csupp__list li::before { content: ""; position: absolute; left: 0; top: .55em; width: 5px; height: 5px; background: var(--ink-38); }
.csupp__best { margin: 1.2rem 0 0; font-size: .88rem; line-height: 1.55; color: var(--ink-72); max-width: 62ch; }
.csupp__best strong { font-weight: 700; color: var(--ink); }
.csupp__actions { display: flex; flex-wrap: wrap; gap: .7rem; margin-top: 1.5rem; }
.csupp__cta {
  font-family: var(--f-body); font-weight: 600; font-size: .86rem; line-height: 1.15;
  padding: .68rem 1.15rem; border-radius: 3px; box-shadow: none;
}
@media (max-width: 760px) {
  .csupp__list { columns: 1; }
  .csupp__actions .btn { width: 100%; justify-content: center; }
}

/* =====================================================================
   SELF-HOSTED FONTS (2026-08-11)
   Replaces the Google Fonts stylesheet link that was on all 18 pages.
   Reason: every page load previously sent each visitor's IP address to
   Google. Serving the files ourselves removes that entirely, drops two
   DNS lookups and two TLS handshakes, and lets the CSP forbid Google's
   origins outright.
   Both families are SIL Open Font License 1.1 — commercial use and
   self-hosting are expressly permitted. Files: fonts/*.woff2, latin
   subset only, 7 files totalling 144 KB.
   font-display: swap matches the previous behaviour exactly (the Google
   URL carried &display=swap), so there is no change to how text paints.
   TO REVERT: delete this block and restore the <link> tags from
   _private/backups/gridshift-before-selfhosted-fonts-2026-08-11.zip
   ===================================================================== */
@font-face {
  font-family: "Libre Baskerville";
  font-style: normal; font-weight: 400; font-display: swap;
  src: url("../fonts/libre-baskerville-v24-latin-regular.woff2") format("woff2");
}
@font-face {
  font-family: "Libre Baskerville";
  font-style: italic; font-weight: 400; font-display: swap;
  src: url("../fonts/libre-baskerville-v24-latin-italic.woff2") format("woff2");
}
@font-face {
  font-family: "Libre Baskerville";
  font-style: normal; font-weight: 700; font-display: swap;
  src: url("../fonts/libre-baskerville-v24-latin-700.woff2") format("woff2");
}
@font-face {
  font-family: "Montserrat";
  font-style: normal; font-weight: 400; font-display: swap;
  src: url("../fonts/montserrat-v31-latin-regular.woff2") format("woff2");
}
@font-face {
  font-family: "Montserrat";
  font-style: normal; font-weight: 500; font-display: swap;
  src: url("../fonts/montserrat-v31-latin-500.woff2") format("woff2");
}
@font-face {
  font-family: "Montserrat";
  font-style: normal; font-weight: 600; font-display: swap;
  src: url("../fonts/montserrat-v31-latin-600.woff2") format("woff2");
}
@font-face {
  font-family: "Montserrat";
  font-style: normal; font-weight: 700; font-display: swap;
  src: url("../fonts/montserrat-v31-latin-700.woff2") format("woff2");
}

/* =====================================================================
   PORTFOLIO CAROUSEL — nudge arrows (2026-08-11)
   Replaces the position bar. A standard PC wheel emits only vertical
   scroll, which a horizontally scrolling container ignores, so wheel
   users had no visible control. These sit on the artwork and step one
   frame per click. The drift is never stopped, only paused for the
   length of the nudge.
   TO REVERT: delete this block and the .swork__stage wrapper + the two
   .swork__nudge buttons on index.html.
   ===================================================================== */

/* The strip is capped at --container-wide and centred, so on a wide screen
   there is empty section either side of it. The arrows must track the strip,
   not the section, or they float in that empty margin. */
.swork__stage { position: relative; max-width: var(--container-wide); margin-inline: auto; }

.swork__nudge {
  position: absolute; top: 50%; transform: translateY(-50%);
  z-index: 3;
  width: 44px; height: 44px; padding: 0;
  display: grid; place-items: center;
  border: 0; border-radius: 50%;
  color: #fff;
  cursor: pointer;
  -webkit-backdrop-filter: blur(2px);
  backdrop-filter: blur(2px);
  transition: background 240ms var(--ease), transform 160ms var(--ease-out);

  /* The faintness lives in the DISC ALPHA, deliberately not in `opacity`.
     An element opacity flattens the glyph and the disc together, so over a
     white portfolio image the white chevron blends into the white and the
     control vanishes: measured 1.47:1 at opacity .38. Alpha .50 keeps the
     chevron at 3.4:1 over the palest image on the strip and 17.5:1 over the
     ink footage, while still reading as a quiet mark rather than a button. */
  background: rgba(35, 31, 32, .50);
}
.swork__nudge svg {
  width: 19px; height: 19px; display: block;
  /* belt and braces on a pale frame: the glyph keeps an edge regardless */
  filter: drop-shadow(0 1px 1px rgba(0, 0, 0, .45));
}
.swork__nudge--prev { left: clamp(6px, 1.1vw, 20px); }
.swork__nudge--next { right: clamp(6px, 1.1vw, 20px); }

/* Present themselves when the pointer is anywhere near the strip, and
   further still on the control itself. */
@media (hover: hover) and (pointer: fine) {
  /* .40 was tried here and rejected: it measured 2.53:1 for the chevron over
     the palest frame on the strip, under the 3:1 a meaningful control needs.
     .48 is the floor that holds over every image and is still visibly quiet. */
  .swork__nudge { background: rgba(35, 31, 32, .48); }
  .swork__stage:hover .swork__nudge { background: rgba(35, 31, 32, .62); }
  .swork__nudge:hover { background: rgba(35, 31, 32, .82); }
}
.swork__nudge:active { transform: translateY(-50%) scale(.93); }

/* Keyboard users get them at full strength, never faded. */
.swork__nudge:focus-visible {
  background: rgba(35, 31, 32, .82);
  outline: 3px solid var(--mint); outline-offset: 3px;
}

@media (max-width: 760px) {
  /* touch already has swipe, so keep them smaller and further out of the way */
  .swork__nudge { width: 36px; height: 36px; background: rgba(35, 31, 32, .48); }
  .swork__nudge svg { width: 16px; height: 16px; }
}
@media (prefers-reduced-motion: reduce) {
  .swork__nudge { transition: background 240ms var(--ease); }
  .swork__nudge:active { transform: translateY(-50%); }
}

/* =====================================================================
   CONTACT FORM — optional-field markers (2026-08-11)
   Only Email is required now. People assume every field in a form is
   required unless told otherwise, so the useful thing to label is the
   OPTIONAL ones - marking the single required field instead would leave
   three unmarked fields that still read as compulsory.
   TO REVERT: delete this block and the three .field__opt spans.
   ===================================================================== */
.field__opt {
  font-weight: 500;
  font-size: .92em;          /* relative, so it tracks the label size */
  color: var(--ink-72);      /* 6.42:1 on white - past AA for body text */
  letter-spacing: .01em;
}

/* =====================================================================
   MOBILE PASS — 2026-08-11
   TO REVERT: delete this block.
   ===================================================================== */

/* --- 1. iOS zoom-on-focus (a real bug, not a nicety) -----------------
   Form fields were .97rem = 15.52px. Safari on iOS zooms the whole page
   whenever a focused field is under 16px, and it does not zoom back out
   afterwards - the visitor is left stranded mid-form on a zoomed page.
   16px is the threshold; this sets exactly that on small screens only,
   so the desktop sizing is untouched. */
@media (max-width: 760px) {
  .gt-page .field input,
  .gt-page .field select,
  .gt-page .field textarea { font-size: 16px; }
}

/* --- 2. Touch targets ------------------------------------------------
   WCAG 2.2 AA asks for 24x24 minimum, which both already cleared, but 44px
   is the comfortable figure Apple and the WCAG AAA guidance use. */

/* Carousel arrows keep their small 36px look on mobile; the tappable area
   is expanded invisibly to 44px. They sit at opposite edges of the strip,
   so a larger hit area cannot overlap anything. */
@media (max-width: 760px) {
  .swork__nudge::before {
    content: ""; position: absolute;
    top: 50%; left: 50%; transform: translate(-50%, -50%);
    width: 44px; height: 44px; border-radius: 50%;
  }
}

/* The two social circles are a different case: expanding their hit areas
   would overlap each other and cause mis-taps, so on touch they simply
   become 44px. There are only two of them, so the row still sits well
   short of the column width. */
@media (max-width: 760px) {
  .gt-social { gap: .65rem; }
  .gt-social__item { width: 44px; height: 44px; }
  .gt-social__item svg { width: 20px; height: 20px; }
}

/* =====================================================================
   SERVICE PAGE COLOUR PASS — 2026-08-11
   TO REVERT: delete this block.
   ===================================================================== */

/* --- 9. The two column labels take brand colours -----------------------
   These labels are .76rem (12.2px) bold, which WCAG counts as NORMAL text,
   so they need 4.5:1 — not the 3:1 that large text gets.
     brand blue  #3A76BB on white = 4.68:1  -> used as asked
     brand teal  #2AB59A on white = 2.57:1  -> FAILS, cannot be used at 12px
   The teal label therefore uses #1D7F6C, the deeper teal already defined in
   this project as --svc-on-light for exactly this situation. Same hue family,
   4.88:1, legible at 12px. */
.svcmid__col--use .svcmid__lab { color: #3A76BB; }          /* When it is useful */
.svcmid__col:not(.svcmid__col--use) .svcmid__lab { color: #1D7F6C; }  /* What it can include */

/* on the dark variant of the mid section, keep the lighter on-dark pair */
.svcmid--dark .svcmid__col--use .svcmid__lab { color: #8FB4E0; }
.svcmid--dark .svcmid__col:not(.svcmid__col--use) .svcmid__lab { color: #2AB59A; }

/* --- 18-22. Per-page hero eyebrow colours ------------------------------
   These sit on the near-black hero, where the requested values are the
   on-dark tokens and all clear 6:1. */
/* the attribute values carry the full filename stem, e.g.
   data-hero="service-brand-development" — verified against the pages */
body[data-hero="service-brand-development"] .svch__label { color: #C29CD4; }
body[data-hero="service-social-media-management"] .svch__label { color: #C29CD4; }
body[data-hero="service-creative-support"] .svch__label { color: #C29CD4; }
body[data-hero="service-digital-advertising"] .svch__label { color: #8FB4E0; }
body[data-hero="service-seo"] .svch__label { color: #2AB59A; }

/* --- 7. SEO H1 breaks onto two lines ---------------------------------- */
.svch__title .ln { display: block; }

/* =====================================================================
   SERVICE HERO ON MOBILE — 2026-08-11
   Only .svch (the nine service pages). The Shift, Packages and the
   homepage are untouched.
   TO REVERT: delete this block.
   =====================================================================
   The mobile portrait hero images were removed on request, so the
   landscape 2560x1440 desktop image is now used at every width. But the
   service hero was still height:100dvh on mobile - a full-screen PORTRAIT
   box. object-fit:cover has to scale a landscape image by its height to
   fill that, so on an iPhone 15 the image rendered 1515px wide inside a
   393px window: only 26% of it visible, a narrow vertical slice.
   Removing the mobile image alone could not fix that; the CONTAINER was
   the problem. Bringing the height down to 58svh shows ~45% of the frame
   and still leaves ~494px for the label, heading, lead and buttons.
   height:auto means the section still grows if the copy needs more room,
   so nothing can ever be clipped. */
@media (max-width: 768px) {
  .svch {
    min-height: 58svh;
    height: auto;
    max-height: none;
    padding-block: clamp(3.25rem, 9vh, 5rem);
  }
}
/* Very short phones in landscape already had their own rule; keep it
   winning by restating it after this block. */
@media (max-width: 768px) and (max-height: 620px) {
  .svch { min-height: 0; height: auto; padding-block: 3.5rem; }
}

/* =====================================================================
   HOMEPAGE HERO ON MOBILE — taller (2026-08-16)
   Homepage only. Service pages, The Shift and Packages are untouched.
   TO REVERT: delete this block; the 560px rule above takes over again.
   =====================================================================
   The mobile rule pinned the hero to a FIXED min-height of 560px. That was
   84% of an iPhone SE but only 60% of an iPhone 15 Pro Max, so on a tall
   phone the hero stopped well short of the fold.
   95svh scales with the screen instead. It deliberately stops short of a
   full 100svh: leaving a sliver of the next section visible is what tells a
   visitor there is more below. A hero that exactly fills the screen reads
   as the end of the page.
   svh, not dvh: svh is measured against the browser chrome EXPANDED, so the
   hero does not jump when the address bar hides on scroll.
   height:auto is kept, so the section still grows if the copy ever needs
   more room and nothing can be clipped. */
@media (max-width: 900px) {
  .home .hero--video {
    min-height: 95svh;
    height: auto;
    max-height: none;
  }
}
/* Landscape phones and very short screens: fall back to content height so a
   hero can never be taller than the screen it sits on. */
@media (max-width: 900px) and (max-height: 560px) {
  .home .hero--video {
    min-height: 0;
    padding-block: clamp(2.5rem, 8vh, 4rem);
  }
}

/* =====================================================================
   CONTACT: remove the rule above the social icons (2026-08-16)
   TO REVERT: delete this block.
   =====================================================================
   `.gt-direct, .gt-social { border-top: 2px solid var(--ink) }` put a 2px
   rule directly on top of the icon row. That is the line to go. The rule
   above the "Prefer email?" block is .gt-direct and is deliberately left
   alone. The padding-top that paired with the border is swapped for margin
   so the icons keep their breathing room without the stroke.
   NOTE: the class name .gt-direct__line refers to a line of TEXT, not a
   drawn line. It was deleted by mistake and has been put back. */
.gt-social {
  border-top: 0;
  padding-top: 0;
  margin-top: 1.15rem;
}

/* =====================================================================
   DESIGN PASS (2026-08-17) — carousel rest position, mobile carousel
   controls, site-wide social buttons, non-home hero height on mobile.
   Appended last on purpose: every rule here is intended to win over the
   equivalent earlier rule by cascade order, not by specificity inflation.
   TO REVERT: delete this entire block. Nothing above it was edited.
   ===================================================================== */

/* --- 1. Carousel rests CENTRED ---------------------------------------
   The frames snapped with `scroll-snap-align: start`, which parks the
   snapped image against the viewport's left padding edge - so it sat left
   of centre and showed a slice of the NEXT image only. `center` parks it in
   the middle of the scrollport, which is what puts an equal sliver of the
   previous and next frame either side. The viewport's inline padding is
   zeroed at the same time: with `start` that padding was the left margin,
   but with `center` it just narrows the scrollport and shrinks the slivers
   asymmetrically at the ends of the run. */
@media (max-width: 900px) {
  .swork__viewport { padding-inline: 0; scroll-padding-inline: 0; }
  .swork__img { scroll-snap-align: center; }
}

/* Snap and the autoplay drift cannot both own scrollLeft. Now that the
   drift runs on touch too (change 3), snapping would drag every frame back
   to centre mid-drift and the strip would judder in place. js/main.js adds
   .is-drifting while the loop is actually running and removes it the moment
   the strip is paused, so the snap only ever applies at rest - which is
   exactly when it is wanted. */
.swork__viewport.is-drifting { scroll-snap-type: none; }

/* --- 2. Nudge arrows: desktop only ------------------------------------
   Touch has swipe, and the drift now runs on mobile as well, so the arrows
   are redundant there and sit on top of the work. display:none also takes
   them out of the accessibility tree and the tab order, so nothing is left
   focusable but invisible. The buttons stay in the markup and the JS keeps
   binding them; above 900px they are unchanged. */
@media (max-width: 900px) {
  .swork__nudge { display: none; }
}

/* --- 4. Social buttons: one treatment everywhere ----------------------
   The contact page's solid blue circles (.gt-social__item) are now the
   single site-wide style. The footer previously used a hollow square with a
   translucent white hairline. Same geometry and glyph size as the contact
   version so the two are identical, not merely similar.
   White on #3A76BB is 4.70:1, comfortably past the 3:1 that non-text UI
   needs, and it holds on the dark footer because the glyph's contrast is
   carried by the disc, not by the footer behind it. */
.footer__social-item {
  display: grid; place-items: center;
  width: 34px; height: 34px;
  border: 0; border-radius: 50%;
  background: var(--green); color: #fff;
  transition: background 200ms var(--ease), transform 140ms var(--ease-out);
}
.footer__social-item svg { width: 17px; height: 17px; display: block; }
a.footer__social-item:hover { background: #305F9A; color: #fff; }
a.footer__social-item:active { transform: scale(.94); }
/* The footer is near-black, so the contact page's ink outline would be
   invisible here. Teal reads clearly against both the footer and the disc. */
a.footer__social-item:focus-visible {
  background: #305F9A; color: #fff;
  outline: 3px solid var(--mint); outline-offset: 3px;
}
.footer__social li span.footer__social-item { cursor: default; opacity: .8; }
@media (prefers-reduced-motion: reduce) {
  a.footer__social-item:active { transform: none; }
}

/* --- 5. Non-home heroes match the home hero on mobile -----------------
   The home hero settled on 95svh (see the 2026-08-16 block above). Service
   pages were on 58svh, The Shift and Packages on 100svh/100dvh, so the
   three page types opened at three different heights on the same phone.
   All now use the same 95svh, the same `height: auto` so copy can never be
   clipped, and the same 900px breakpoint the home hero uses.
   svh, not dvh, for the same reason as the home hero: svh is measured with
   the browser chrome expanded, so the hero does not jump when the address
   bar hides on scroll. */
@media (max-width: 900px) {
  .svch, .shift-hero, .pkg-hero {
    min-height: 95svh;
    height: auto;
    max-height: none;
  }
}
/* Landscape phones and very short screens: fall back to content height, so
   a hero can never be taller than the screen it sits on. Restated after the
   rule above for the same reason the home hero restates its own - the block
   above would otherwise win on cascade order and reintroduce the overflow
   these rules exist to prevent. */
@media (max-width: 900px) and (max-height: 620px) {
  .svch, .shift-hero, .pkg-hero {
    min-height: 0;
    height: auto;
    max-height: none;
    padding-block: 3.5rem;
  }
}

/* =====================================================================
   HERO RULES + PROCESS MARKERS (2026-08-18)
   Requested change: the decorative rules were part-coloured — an accent
   segment sitting on a longer grey or translucent line. They now run in
   the full accent colour end to end.
   TO REVERT: delete this block; the part-coloured versions above resume.
   ===================================================================== */

/* --- 1. Service page heroes: the vertical rule runs full height -------
   .svch__reg was a translucent white line with only its top 32% in the
   service accent. The base now takes the accent itself and the partial
   overlay is removed, so one element draws one solid line. */
.svch__reg { background: var(--svc-accent); }
.svch__reg::after { content: none; }

/* --- 2. The Shift hero: same treatment ------------------------------- */
.shift-hero__reg { background: var(--mint); }
.shift-hero__reg::after { content: none; }

/* --- 3. Marketing Packages hero --------------------------------------
   This hero used a different mark: an 84px horizontal line with a teal
   square sitting on its left end, above the heading. Both are removed and
   replaced with the same vertical rule the other two heroes use, so all
   three page heroes now share one treatment.
   The rule is positioned against .pkg-hero__copy — a wrapper added to
   packages.html for this purpose — rather than against the container, so
   it lines up with the text edge instead of the gutter edge. */
.pkg-hero__copy {
  max-width: 880px;
  position: relative;
  padding-left: clamp(0px, 2.5vw, 42px);
}
.pkg-hero__reg {
  position: absolute; left: 0; top: .35rem; bottom: .35rem;
  width: 2px; height: auto;
  background: var(--mint);
  margin: 0;
}
.pkg-hero__reg::after { content: none; }   /* the dot */
@media (max-width: 700px) {
  .pkg-hero__reg { display: none; }
  .pkg-hero__copy { padding-left: 0; }
}

/* --- 4. "A clear process": full-width colour bar over each step -------
   Each step carried a 34px accent bar sitting on a full-width grey rule,
   so the colour read as a fragment of a longer line. The bar now spans the
   whole column in its own colour. The grey border underneath is made
   transparent rather than removed, so the 1px it contributes to the box
   is preserved and the four columns keep their existing vertical rhythm. */
.proute > li { border-top-color: transparent; }
.proute > li::before { width: 100%; }

/* =====================================================================
   UNSUBSCRIBE PAGES (2026-08-19)
   Two rules, both scoped to .unsub-page, which exists only on
   unsubscribe.html and unsubscribe-confirmed.html. Nothing here can reach
   any other page. No new colours, type or components — the form, button
   and field styles are the existing ones.
   TO REVERT: delete this block and the two pages.
   ===================================================================== */
.unsub-page .page-hero__copy { margin-bottom: clamp(1.5rem, 3vw, 2.3rem); }
.unsub-page .form { max-width: 520px; }
