/* =====================================================================
   WFOE Company China  |  main.css  |  one file, native cascade layers
   ---------------------------------------------------------------------
   Layer order is declared once, here, and never fought again. Specificity
   stops mattering: a later layer always wins regardless of selector weight.
   No !important outside the utilities layer. If you reach for it elsewhere,
   the layer order is wrong, not the rule.

   Design system, tokens and the WCAG ratio table: design/design-plan.md.
   Every colour and size comes from a token. No hardcoded hex outside the
   token block below.
   ===================================================================== */

@layer reset, tokens, base, layout, components, utilities;

/* =====================================================================
   FONTS  |  Montserrat, self hosted, two weights, latin subset, woff2
   ---------------------------------------------------------------------
   No Google Fonts CDN. A large share of the audience is behind the GFW
   where fonts.googleapis.com is unreliable, so this is functional, not a
   preference. Both weights are preloaded in <head>. swap so text paints
   immediately in the fallback and reflows once, rather than blocking.
   tabular-nums is verified present and working in these subsets: the
   tnum feature substitutes all ten digits to an equal 700-unit advance.
   ===================================================================== */
@font-face {
  font-family: "Montserrat";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("/assets/fonts/montserrat-400.woff2?v=2026-09-03") format("woff2");
}
@font-face {
  font-family: "Montserrat";
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url("/assets/fonts/montserrat-500.woff2?v=2026-09-03") format("woff2");
}
@font-face {
  font-family: "Montserrat";
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url("/assets/fonts/montserrat-600.woff2?v=2026-09-03") format("woff2");
}
@font-face {
  font-family: "Montserrat";
  font-style: normal;
  font-weight: 900;
  font-display: swap;
  src: url("/assets/fonts/montserrat-900.woff2?v=2026-09-03") format("woff2");
}
/* One weight, self-hosted for the same GFW reason as Montserrat. Used only
   where a figure should read as official data rather than body prose: the
   pricing amounts, the estimator's output range, and the chop lettering. */
@font-face {
  font-family: "JetBrains Mono";
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url("/assets/fonts/jetbrains-mono-600.woff2?v=2026-09-03") format("woff2");
}

/* =====================================================================
   TOKENS  |  light is base, dark is override
   Ground: cream paper.  Ink: brick.  Dark inverts the same idea.
   Every value verified against WCAG 2.1 AA by computation. Full ratio
   table (37 pairs x 2 themes, 74/74 pass) in design/design-plan.md.
   ===================================================================== */
@layer tokens {
  :root {
    color-scheme: light;

    /* Amplus warm palette. Ink is warm near-black, ground is cream,
       primary is a deep orange tuned to pass AA as text and buttons.
       Vivid orange lives in --accent-vivid for graphics only. */
    --ink:         #262322;
    --ink-soft:    #57534E;
    --ink-mute:    #6B655E;   /* 4.94 on paper, passes as small text */

    /* Warm cream ground, white cards, beige alt sections. */
    --paper:       #F4F2E8;
    --surface:     #FFFFFF;
    --surface-2:   #E8E4D6;
    --surface-3:   #DED8C6;

    /* PRIMARY. Deep orange: 4.6 on cream, 5.08 white-on-it. */
    --brick:      #C2410C;
    --brick-hover:#9A3412;   /* light: hover goes DARKER */
    --brick-lift: #E8590C;
    --brick-wash: #F8E7DC;
    --on-brick:   #FFFFFF;

    /* Buttons: vivid orange + near-black text. 5.9:1, vibrant and AA. */
    --btn:         #F96A2C;
    --btn-hover:   #E85410;
    --on-btn:      #241A15;

    --azure:       #E8590C;   /* graphics only */
    --azure-wash:  #FBEDE3;

    /* Vivid Amplus orange + pale yellow. Graphics and fills only. */
    --accent-vivid:#F55107;
    --accent-2:    #FEEA9D;

    /* Seal red. Signature and the price figure only. */
    --seal:        #C0392B;
    --seal-ink:    #7A2118;   /* engraved detail lines inside the chop */
    --seal-wash:   #F9EBE9;
    /* Review gold. Warm enough to sit inside the brick palette rather than
       fighting it, dark enough to read as a filled shape on cream. */
    --star:        #C0850C;

    /* WhatsApp brand green. Fixed corner widget only, not part of the
       site palette, so it is not re-themed in the dark blocks below:
       every real WhatsApp button on the web keeps this exact green
       regardless of the host page's theme, which is what makes it
       recognisable as "the WhatsApp button" at a glance. */
    --whatsapp-green:      #25D366;
    --whatsapp-green-dark: #1DA851;

    --line:        #E2DED0;   /* decorative only, WCAG 1.4.11 exempt */
    --line-firm:   #CDC6B4;   /* decorative only, WCAG 1.4.11 exempt */
    --line-control:#8C8069;   /* interactive boundaries. 3.9 on white. */

    --ok:          #1B7A5A;
    --ok-wash:     #E7F3EE;
    --warn:        #8A5A0B;
    --warn-wash:   #FBF1DE;
    --stop:        #A3271B;   /* form errors. NOT --seal. */
    --stop-wash:   #FBEAE8;
    --focus:       #9A3412;
    --focus-halo:  #FFFFFF;   /* inner tone, covers filled components */

    /* Fluid type scale. clamp() so there are no breakpoint jumps. */
    --step--1: clamp(0.83rem, 0.80rem + 0.15vw, 0.90rem);
    --step-0:  clamp(1.00rem, 0.96rem + 0.20vw, 1.09rem);
    --step-1:  clamp(1.25rem, 1.18rem + 0.35vw, 1.45rem);
    --step-2:  clamp(1.56rem, 1.44rem + 0.60vw, 1.94rem);
    --step-3:  clamp(2.00rem, 1.70rem + 1.30vw, 2.90rem);
    --step-4:  clamp(2.60rem, 2.05rem + 2.60vw, 4.30rem);

    --s-1: .25rem; --s-2: .5rem;  --s-3: .75rem; --s-4: 1rem;
    --s-6: 1.5rem; --s-8: 2rem;   --s-12: 3rem;  --s-16: 4rem;
    --s-24: 6rem;  --s-32: 8rem;

    --radius: 8px;
    --radius-lg: 16px;
    --radius-pill: 999px;

    /* Icon scale. Every inline SVG glyph and every "icon in a rounded
       square" chip container picks the nearest of these three, so the
       same visual role never lands on a different pixel size in two
       components that sit near each other on the same page. */
    --icon-sm: 18px;
    --icon-md: 22px;
    --icon-lg: 26px;
    --chip-sm: 44px;
    --chip-md: 48px;
    --chip-lg: 52px;
    --measure: 60ch;            /* 60, not 68. Montserrat is wide. */
    --wrap: 1200px;
    --gutter: var(--s-4);

    /* Depth. Theme-aware: soft, brick-tinted layering in light for a
       premium feel; near-absent in dark, where borders carry elevation
       (a bright shadow on ink reads wrong). Overridden in the dark blocks. */
    --shadow-sm: 0 1px 2px rgba(38, 35, 34, .05), 0 2px 6px rgba(38, 35, 34, .05);
    --shadow:    0 2px 6px rgba(38, 35, 34, .06), 0 12px 28px rgba(38, 35, 34, .10);
    --shadow-lg: 0 8px 18px rgba(38, 35, 34, .10), 0 26px 56px rgba(38, 35, 34, .14);
    --shadow-brick: 0 8px 20px rgba(194, 65, 12, .26), 0 2px 6px rgba(194, 65, 12, .20);

    /* Warm accents. Button gradient stays dark enough that white text
       clears 4.5:1 at the lightest stop. The text gradient (hero
       highlight) uses deep-orange stops so it passes as text on cream.
       Glows are decorative background only. Overridden in the dark blocks. */
    --grad-primary: linear-gradient(135deg, #C2410C 0%, #A5360A 100%);
    --grad-accent:  linear-gradient(90deg, #F55107, #E8590C);
    --grad-text:    linear-gradient(120deg, #C2410C 0%, #9A3412 100%);
    --glow:         radial-gradient(58% 48% at 50% 0%, rgba(245, 81, 7, .10), transparent 72%);
    --glow-strong:  radial-gradient(50% 55% at 50% 40%, rgba(245, 81, 7, .14), transparent 70%);

    --font: "Montserrat", system-ui, -apple-system, "Segoe UI", sans-serif;
    --font-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", Consolas, monospace;
    --w-body: 400;
    --w-display: 600;

    /* Motion. One orchestrated moment (the chop). Everything else is a
       150ms colour transition. The theme switch never animates. */
    --t-quick: 150ms;
    --ease: cubic-bezier(.2, 0, 0, 1);
    /* The one exception to the 150ms colour-only budget: the chop's single
       landing moment. A back-out curve, so it overshoots slightly before
       settling, the way a real stamp presses past its rest point. */
    --ease-land: cubic-bezier(.34, 1.56, .64, 1);
  }

  /* DARK TOKENS. Kept identical in both selectors below, on purpose:
     the @media query is the first-visit default (no stored choice), and
     the [data-theme="dark"] attribute is the explicit user choice written
     by the theme toggle. Both must carry the same values or the two paths
     drift. :not([data-theme="light"]) lets an explicit light choice beat
     the OS preference. */
  @media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) {
      color-scheme: dark;
      --ink:         #F4F2E8;   /* warm cream on warm ink */
      --ink-soft:    #C9C1B5;
      --ink-mute:    #9A9082;
      --paper:       #1A1714;
      --surface:     #241F1B;
      --surface-2:   #2E2823;
      --surface-3:   #39322C;
      --brick:      #FF8A4C;   /* lifted orange: 7.7 on warm ink */
      --brick-hover:#FFA366;   /* dark: hover goes LIGHTER. Inverted. */
      --brick-lift: #E8590C;
      --brick-wash: #2E211A;
      --on-brick:   #1A1714;   /* dark text on a light-orange button */
      --btn:         #FF8A4C;
      --btn-hover:   #FFA366;
      --on-btn:      #1A1714;
      --azure:       #FF8A4C;
      --azure-wash:  #2A1F18;
      --accent-vivid:#FF6B29;
      --accent-2:    #FEEA9D;
      --seal:        #F0857A;   /* lifted red */
      --seal-ink:    #B8493D;
      --seal-wash:   #2E1A1A;
      --star:        #F0B93F;
      --line:        #38312B;
      --line-firm:   #4A4139;
      --line-control:#7A6E60;
      --ok:          #4FBF95;
      --ok-wash:     #16302A;
      --warn:        #D9A441;
      --warn-wash:   #332619;
      --stop:        #F08579;
      --stop-wash:   #33201D;
      --focus:       #FFB380;
      --focus-halo:  #1A1714;
      --shadow-sm: 0 1px 2px rgba(0, 0, 0, .30);
      --shadow:    0 2px 8px rgba(0, 0, 0, .34), 0 12px 30px rgba(0, 0, 0, .40);
      --shadow-lg: 0 8px 24px rgba(0, 0, 0, .44), 0 24px 60px rgba(0, 0, 0, .52);
      --shadow-brick: 0 4px 14px rgba(0, 0, 0, .40);
      --grad-primary: linear-gradient(135deg, #FF9A5C 0%, #FF8A4C 100%);
      --grad-accent:  linear-gradient(90deg, #FF8A4C, #FF6B29);
      --grad-text:    linear-gradient(120deg, #FFA366 0%, #FF8A4C 100%);
      --glow:         radial-gradient(58% 48% at 50% 0%, rgba(255, 138, 76, .14), transparent 72%);
      --glow-strong:  radial-gradient(50% 55% at 50% 40%, rgba(255, 138, 76, .18), transparent 70%);
    }
  }
  :root[data-theme="dark"] {
    color-scheme: dark;
    --ink:         #F4F2E8;
    --ink-soft:    #C9C1B5;
    --ink-mute:    #9A9082;
    --paper:       #1A1714;
    --surface:     #241F1B;
    --surface-2:   #2E2823;
    --surface-3:   #39322C;
    --brick:      #FF8A4C;
    --brick-hover:#FFA366;
    --brick-lift: #E8590C;
    --brick-wash: #2E211A;
    --on-brick:   #1A1714;
    --btn:         #FF8A4C;
    --btn-hover:   #FFA366;
    --on-btn:      #1A1714;
    --azure:       #FF8A4C;
    --azure-wash:  #2A1F18;
    --accent-vivid:#FF6B29;
    --accent-2:    #FEEA9D;
    --seal:        #F0857A;
    --seal-ink:    #B8493D;
    --seal-wash:   #2E1A1A;
    --star:        #F0B93F;
    --line:        #38312B;
    --line-firm:   #4A4139;
    --line-control:#7A6E60;
    --ok:          #4FBF95;
    --ok-wash:     #16302A;
    --warn:        #D9A441;
    --warn-wash:   #332619;
    --stop:        #F08579;
    --stop-wash:   #33201D;
    --focus:       #FFB380;
    --focus-halo:  #1A1714;
    --shadow-sm: 0 1px 2px rgba(0, 0, 0, .30);
    --shadow:    0 2px 8px rgba(0, 0, 0, .34), 0 12px 30px rgba(0, 0, 0, .40);
    --shadow-lg: 0 8px 24px rgba(0, 0, 0, .44), 0 24px 60px rgba(0, 0, 0, .52);
    --shadow-brick: 0 4px 14px rgba(0, 0, 0, .40);
    --grad-primary: linear-gradient(135deg, #FF9A5C 0%, #FF8A4C 100%);
    --grad-accent:  linear-gradient(90deg, #FF8A4C, #FF6B29);
    --grad-text:    linear-gradient(120deg, #FFA366 0%, #FF8A4C 100%);
    --glow:         radial-gradient(58% 48% at 50% 0%, rgba(255, 138, 76, .14), transparent 72%);
    --glow-strong:  radial-gradient(50% 55% at 50% 40%, rgba(255, 138, 76, .18), transparent 70%);
  }
}

/* =====================================================================
   RESET  |  minimal, modern, no opinions the base layer will overturn
   ===================================================================== */
@layer reset {
  *, *::before, *::after { box-sizing: border-box; }
  * { margin: 0; }
  html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }
  body { min-height: 100svh; line-height: 1.7; -webkit-font-smoothing: antialiased; }
  img, picture, svg, video { display: block; max-width: 100%; height: auto; }
  input, button, textarea, select { font: inherit; color: inherit; }
  button { background: none; border: 0; cursor: pointer; }
  a { color: inherit; }
  ul[class], ol[class] { list-style: none; padding: 0; }
  table { border-collapse: collapse; }
  :target { scroll-margin-top: calc(64px + var(--s-4)); }

  /* Reduced motion is a hard stop, not a suggestion. Kills the chop
     press and every transition. Set here so nothing in later layers
     can reintroduce motion for these users. */
  @media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
      animation-duration: .001ms !important;
      animation-iteration-count: 1 !important;
      transition-duration: .001ms !important;
      scroll-behavior: auto !important;
    }
  }
}

/* =====================================================================
   BASE  |  element defaults. Type is set here, once.
   ===================================================================== */
@layer base {
  html { font-family: var(--font); }
  body {
    /* Paper grain: a tiled, low-opacity fractal-noise filter under the flat
       ground colour, not a raster asset (CSP img-src already allows data:).
       Alpha is deliberately near-invisible (max ~4%) -- this reads as
       "this is paper" at a glance, not as a texture anyone consciously
       notices, and it never touches the AA-verified flat colour beneath. */
    background:
      url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.05 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")
      repeat, var(--paper);
    color: var(--ink);
    font-weight: var(--w-body);
    font-size: var(--step-0);
    /* No overflow-x:hidden. That hides the bug rather than fixing it.
       Any element that would overflow scrolls inside its own region. */
  }

  /* Headings. 900 only. Negative tracking grows with size or the
     geometric forms fall apart into circles at display sizes. */
  h1, h2, h3, h4, h5, h6 {
    font-weight: var(--w-display);
    line-height: 1.12;
    text-wrap: balance;
    color: var(--ink);
  }
  /* Safety net, not a style choice: at a large heading size on a narrow
     phone, a single long word (e.g. "representative") can be wider than
     the column itself, and with no other break opportunity that alone
     forces the whole page to scroll horizontally. break-word only ever
     activates in that specific case -- every heading that already fits
     renders identically. Found on /{yiwu,shanghai}/company-changes/ at
     320px, where "representative" is 311px wide in a 273px column. */
  h1, h2, h3 { overflow-wrap: break-word; }
  h1 { font-size: var(--step-4); letter-spacing: -0.03em; }
  h2 { font-size: var(--step-3); letter-spacing: -0.03em; margin-block-start: var(--s-12); }
  h3 { font-size: var(--step-2); letter-spacing: -0.02em; margin-block-start: var(--s-8); }
  h4 { font-size: var(--step-1); letter-spacing: -0.01em; margin-block-start: var(--s-6); }
  h5, h6 { font-size: var(--step-0); letter-spacing: 0; margin-block-start: var(--s-4); }

  /* .l-prose is display:grid, so grid items never collapse margins the
     way normal block-flow siblings do. Left alone, a .c-eyebrow followed
     by a heading gets an 8px + 48px = 56px gap inside .l-prose sections,
     versus the 48px a plain .l-wrap section collapses the same pair down
     to. Subtracting the eyebrow's own margin-block-end here reproduces
     the collapsed 48px total in both wrapper types. */
  .l-prose > .c-eyebrow + h2 { margin-block-start: calc(var(--s-12) - var(--s-2)); }
  .l-prose > .c-eyebrow + h3 { margin-block-start: calc(var(--s-8) - var(--s-2)); }

  p, ul, ol, blockquote, table, figure { margin-block-start: var(--s-4); }
  p, li { max-width: var(--measure); }
  li + li { margin-block-start: var(--s-2); }
  ul:not([class]) { padding-inline-start: var(--s-6); list-style: square; }
  ol:not([class]) { padding-inline-start: var(--s-6); }

  strong, b { font-weight: var(--w-display); }

  /* Links in prose. Brick, underlined by default so colour is not the
     only signal. Hover inverts per theme via the token, not a new value. */
  main a:not([class]) {
    color: var(--brick);
    text-underline-offset: 0.15em;
    text-decoration-thickness: 1px;
    transition: color var(--t-quick) var(--ease);
  }
  main a:not([class]):hover { color: var(--brick-hover); }

  /* One focus ring, everywhere, two tone. A single tone cannot clear
     3:1 on both --paper and a --brick fill (dark passes on paper and
     fails on brick, light does the reverse). Inner halo covers filled
     components, outer ring covers page grounds. Never outline:none. */
  :where(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
    outline: 2px solid var(--focus);
    outline-offset: 2px;
    box-shadow: 0 0 0 2px var(--focus-halo);
    border-radius: var(--radius);
  }

  /* Eyebrow. Uppercase, wide tracking, small. What Montserrat is for:
     it was drawn from Buenos Aires signage and this is where it wins. */
  .c-eyebrow {
    font-size: var(--step--1);
    font-weight: var(--w-body);
    text-transform: uppercase;
    letter-spacing: 0.12em;
    color: var(--ink-mute);
    margin-block-end: var(--s-2);
  }

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

/* =====================================================================
   LAYOUT  |  .l-  page scaffolding
   ===================================================================== */
@layer layout {
  .l-wrap { width: 100%; max-width: var(--wrap); margin-inline: auto; padding-inline: var(--gutter); }

  /* Section rhythm varies with content (design plan self-critique #3):
     a modifier shortens a section that has little to say. The default is
     generous; --tight and --flush are deliberate departures. */
  /* Three tiers, one step apart on the spacing scale. Padding doesn't
     collapse the way margins do, so two adjacent full sections used to
     stack to 128px (mobile) / 192px (desktop) of pure whitespace at
     every boundary -- that was the default for most of the page, with
     only isolated single-line sections ever using --tight. Base is now
     the old --tight value; the old base becomes --generous, reserved for
     the handful of moments that should still read as a real break (e.g.
     right before the final CTA band). */
  .l-section { padding-block: var(--s-12); }
  .l-section--tight { padding-block: var(--s-6); }
  .l-section--generous { padding-block: var(--s-16); }
  .l-section--flush { padding-block-start: 0; }
  @media (min-width: 1024px) {
    .l-section { padding-block: var(--s-16); }
    .l-section--tight { padding-block: var(--s-8); }
    .l-section--generous { padding-block: var(--s-24); }
  }

  /* Prose column, capped at the measure. Used for body-heavy pages. */
  /* Content grid. Text sits in a centred column at the reading measure, so
     prose stays balanced on the page, while wide block components (tables,
     the estimator, the two-column fork) break out to the full section width
     and are also centred. This keeps a 6-column table from being squeezed to
     60ch and forced to scroll on a wide desktop, without left-stranding the
     prose. The measure column uses min() so it never overflows a narrow
     viewport. */
  .l-prose {
    max-width: none;
    display: grid;
    grid-template-columns: 1fr min(var(--measure), 100%) 1fr;
  }
  .l-prose > * { grid-column: 2; min-width: 0; }
  .l-prose > .c-est,
  .l-prose > .c-fork,
  /* The illustrated devices deliberately do NOT take the full-bleed
     escape hatch above. They sit in the measure column with the body
     copy, so every block on the page shares one left and right edge. */

  /* Skip link. First focusable thing on every page. Visible on focus. */
  .l-skip {
    position: absolute; left: var(--s-2); top: var(--s-2);
    z-index: 200; padding: var(--s-2) var(--s-4);
    background: var(--brick); color: var(--on-brick);
    border-radius: var(--radius);
    transform: translateY(-150%);
    transition: transform var(--t-quick) var(--ease);
  }
  .l-skip:focus { transform: translateY(0); }

  main { display: block; }
}

/* =====================================================================
   COMPONENTS  |  .c-  each block self contained, never reaches outside
   ===================================================================== */
@layer components {

  /* ---- Header ------------------------------------------------------
     Sticky, 64px desktop / 56px mobile, surface ground, line bottom
     border, no shadow. On scroll the border firms via a data attr set
     by nav.js. That firming is the only change. */
  .c-header {
    position: sticky; top: 0; z-index: 100;
    background: color-mix(in srgb, var(--surface) 88%, transparent);
    -webkit-backdrop-filter: saturate(1.4) blur(10px);
    backdrop-filter: saturate(1.4) blur(10px);
    border-block-end: 1px solid var(--line);
    transition: border-color var(--t-quick) var(--ease), box-shadow var(--t-quick) var(--ease);
  }
  .c-header[data-scrolled="true"] {
    border-block-end-color: var(--line-firm);
    box-shadow: var(--shadow-sm);
  }
  .c-header__bar {
    position: relative;
    display: flex; align-items: center; gap: var(--s-4);
    min-height: 56px;
  }
  @media (min-width: 1024px) { .c-header__bar { min-height: 64px; } }
  .c-wordmark {
    display: inline-flex; align-items: center; gap: var(--s-2);
    font-weight: var(--w-display); font-size: var(--step-0);
    letter-spacing: -0.02em; color: var(--ink); text-decoration: none;
    margin-inline-end: auto; white-space: nowrap;
  }
  .c-wordmark__mark { width: 30px; height: 30px; border-radius: var(--radius); flex: none; }
  @media (min-width: 1024px) { .c-wordmark__mark { width: 34px; height: 34px; } }
  @media (min-width: 1024px) { .c-wordmark { font-size: var(--step-1); } }

  /* Mobile header carries only the wordmark and the burger. The theme
     toggle and the Book a call CTA live in the drawer and the sticky
     bar on small screens, so the top bar never crowds or wraps. */
  .c-header .c-theme, .c-header__bar > .c-btn--primary { display: none; }
  @media (min-width: 1024px) {
    .c-header .c-theme { display: inline-flex; }
    .c-header__bar > .c-btn--primary { display: inline-flex; }
  }

  /* ---- Primary / ghost buttons ------------------------------------ */
  .c-btn {
    display: inline-flex; align-items: center; justify-content: center;
    gap: var(--s-3);
    min-height: 52px; padding: 0 var(--s-6);
    font-weight: var(--w-display); font-size: var(--step-0);
    letter-spacing: -0.005em; line-height: 1;
    border: 1.5px solid transparent;
    border-radius: 12px; text-decoration: none;
    transition: background-color var(--t-quick) var(--ease),
                color var(--t-quick) var(--ease),
                border-color var(--t-quick) var(--ease),
                box-shadow var(--t-quick) var(--ease),
                transform var(--t-quick) var(--ease);
  }
  .c-btn:active { transform: translateY(0); }
  /* Sliding arrow, Amplus signature. */
  .c-btn__arrow { flex: none; width: var(--icon-sm); height: var(--icon-sm); transition: transform var(--t-quick) var(--ease); }
  .c-btn:hover .c-btn__arrow { transform: translateX(4px); }
  .c-btn--primary { background: var(--btn); color: var(--on-btn); box-shadow: 0 1px 2px rgba(36, 26, 21, .12), 0 6px 16px rgba(233, 84, 16, .22); }
  .c-btn--primary:hover { background: var(--btn-hover); transform: translateY(-2px); box-shadow: 0 2px 4px rgba(36, 26, 21, .14), 0 12px 26px rgba(233, 84, 16, .30); }
  .c-btn--dark { background: var(--ink); color: var(--paper); }
  .c-btn--dark:hover { background: var(--btn); color: var(--on-btn); transform: translateY(-2px); box-shadow: 0 8px 18px rgba(233, 84, 16, .22); }
  /* Large CTA. */
  .c-btn--lg { min-height: 56px; padding: 0 var(--s-8); font-size: var(--step-1); }
  .c-btn--ghost {
    background: var(--surface); color: var(--ink);
    border-color: var(--line-control);
  }
  .c-btn--ghost:hover { background: var(--ink); color: var(--paper); border-color: var(--ink); transform: translateY(-2px); box-shadow: var(--shadow); }
  .c-btn--channel {
    background: var(--surface); color: var(--ink);
    border: 1px solid var(--line-control); box-shadow: var(--shadow-sm);
  }
  .c-btn--channel:hover { background: var(--surface-2); transform: translateY(-2px); box-shadow: var(--shadow); }

  /* ---- Primary navigation + mega panel -----------------------------
     Desktop nav is a flex row. Company Formation opens a click panel
     (never hover: hover menus are hostile on trackpads and unusable by
     keyboard). Panel state is aria-expanded, toggled by nav.js. With JS
     off the panel is a <details> and still works. */
  .c-nav { display: none; }
  @media (min-width: 1024px) {
    .c-nav { display: flex; align-items: center; gap: var(--s-6); }
    .c-nav__link { color: var(--ink); text-decoration: none; font-size: var(--step-0); }
    .c-nav__link:hover { color: var(--brick); }
  }

  /* No position here: .c-mega__panel's containing block is deliberately
     .c-header__bar (a full-width, gutter-padded ancestor), not this
     narrow trigger wrapper, so the panel's clamped width always has
     genuine room to its right regardless of how far into the header the
     trigger itself sits. See .c-mega__panel. */
  .c-mega__trigger {
    display: inline-flex; align-items: center; gap: var(--s-2);
    color: var(--ink); font-size: var(--step-0);
  }
  .c-mega__trigger:hover { color: var(--brick); }
  .c-mega__trigger[aria-expanded="true"] .c-mega__chev { transform: rotate(180deg); }
  .c-mega__chev { transition: transform var(--t-quick) var(--ease); }
  .c-mega__panel {
    position: absolute; inset-inline-start: 0; inset-block-start: calc(100% + 8px);
    /* Clamped, not a bare min-width: at 1024-1200px viewports the header's
       own content (wordmark, nav, search, theme toggle, CTA) leaves too
       little room for a fixed 720px panel anchored at the trigger's
       position, and the site does not clip overflow-x, so an unclamped
       panel could push the whole page into a horizontal scrollbar. */
    width: min(720px, calc(100vw - 2 * var(--gutter)));
    padding: var(--s-6) var(--s-8);
    background: var(--surface);
    border: 1px solid var(--line); border-radius: var(--radius-lg);
    box-shadow: var(--shadow-lg);
    display: grid; grid-template-columns: 1fr 1fr 1fr; gap: var(--s-6);
  }
  .c-mega__panel[hidden] { display: none; }
  .c-mega__col-head {
    font-size: var(--step--1); text-transform: uppercase; letter-spacing: 0.12em;
    color: var(--ink-mute); font-weight: var(--w-body);
    padding-block-end: var(--s-2); margin-block-end: var(--s-2);
    border-block-end: 1px solid var(--line);
    text-decoration: none; display: block;
  }
  a.c-mega__col-head:hover { color: var(--brick); }
  .c-mega__link {
    display: block; padding-block: var(--s-1);
    color: var(--ink); text-decoration: none; font-size: var(--step-0);
  }
  .c-mega__link:hover { color: var(--brick); }
  .c-mega__note { display: block; font-size: var(--step--1); color: var(--ink-mute); }

  /* ---- Mobile drawer + toggle --------------------------------------
     The burger sits next to .c-iconbtn (search) in the header, so it
     carries the same contained-pill treatment. A bare glyph beside a
     bordered circle read as an unfinished control rather than a pair. */
  .c-burger {
    display: inline-flex; width: var(--chip-sm); height: var(--chip-sm); flex: none;
    align-items: center; justify-content: center; color: var(--ink-soft);
    background: var(--surface); border: 1px solid var(--line-control);
    border-radius: var(--radius-pill); box-shadow: var(--shadow-sm);
    transition: color var(--t-quick) var(--ease),
                border-color var(--t-quick) var(--ease),
                background-color var(--t-quick) var(--ease);
  }
  .c-burger:hover { color: var(--brick); border-color: var(--brick); background: var(--brick-wash); }
  .c-burger svg { width: var(--icon-md); height: var(--icon-md); }
  @media (min-width: 1024px) { .c-burger { display: none; } }
  /* The drawer's own close button is on a plain ground and needs no pill. */
  .c-drawer__head .c-burger { background: none; border-color: transparent; box-shadow: none; }

  .c-drawer { display: none; }
  .c-drawer[data-open="true"] {
    display: block; position: fixed; inset: 0; z-index: 150;
    background: var(--paper); padding: var(--s-4);
    overflow-y: auto; overscroll-behavior: contain;
  }
  .c-drawer__head {
    display: flex; align-items: center; justify-content: space-between;
    height: 56px; margin-block-end: var(--s-2);
    border-block-end: 1px solid var(--line);
  }

  /* Three depth tiers, one indent step each, so a glance tells you where
     you are: top level flush, city level +16px, service level +32px.
     Previously every row rendered its text at the same x, and the
     top-level links were indented FURTHER than the "Company Formation"
     summary they sit beside, which inverted the hierarchy. */
  .c-drawer details { border-block-end: 1px solid var(--line); }
  .c-drawer summary {
    padding: var(--s-3) 0; min-height: var(--chip-sm);
    font-weight: var(--w-display); font-size: var(--step-1);
    list-style: none; cursor: pointer;
    display: flex; justify-content: space-between; align-items: center; gap: var(--s-3);
  }
  .c-drawer summary::-webkit-details-marker { display: none; }
  /* Expand affordance. summary already reserved the right-hand slot with
     space-between, but nothing was ever placed in it and the native marker
     is suppressed, so these rows looked like inert text. Drawn with borders
     rather than an asset, so it inherits colour and costs no request. */
  .c-drawer summary::after {
    content: ""; flex: none; width: 9px; height: 9px; margin-inline-end: 2px;
    border-inline-end: 2px solid currentColor; border-block-end: 2px solid currentColor;
    transform: translateY(-3px) rotate(45deg); opacity: .5;
    transition: transform var(--t-quick) var(--ease), opacity var(--t-quick) var(--ease);
  }
  .c-drawer details[open] > summary::after { transform: translateY(2px) rotate(-135deg); opacity: .9; }
  .c-drawer details[open] > summary { color: var(--brick); }
  .c-drawer details details { border-block-end: 0; }
  .c-drawer details details summary {
    font-weight: var(--w-display); font-size: var(--step-0);
    padding-inline-start: var(--s-4); color: var(--ink-soft);
  }
  /* Links: 44px minimum touch target (they measured 43px).
     .c-wordmark is excluded: it is the drawer's masthead, not a nav row,
     and was inheriting the 32px indent, which pushed the brand name out
     of line with every item beneath it. */
  .c-drawer a:not(.c-btn):not(.c-wordmark) {
    display: flex; align-items: center; min-height: var(--chip-sm);
    padding: var(--s-2) 0 var(--s-2) var(--s-8);
    color: var(--ink-soft); text-decoration: none; font-size: var(--step-0);
  }
  .c-drawer a:not(.c-btn):not(.c-wordmark):hover { color: var(--brick); }

  /* The drawer search box carries class="c-field", but .c-field is the
     flex COLUMN WRAPPER used around a label and an input; the input rules
     live in ".c-field input". Applied straight to the input it contributed
     nothing, leaving default browser chrome (2px inset border, square
     corners) in the middle of a themed panel. */
  .c-drawer input[type="search"] {
    display: block; width: 100%; min-height: var(--chip-sm);
    padding: var(--s-2) var(--s-3);
    font: inherit; font-size: max(16px, var(--step-0));
    background: var(--surface); color: var(--ink);
    border: 1px solid var(--line-control); border-radius: var(--radius);
    -webkit-appearance: none; appearance: none;
  }
  .c-drawer input[type="search"]::placeholder { color: var(--ink-mute); }
  /* Top-level links (Home, About, Contact) sit flush with the
     "Company Formation" summary they are siblings of, and carry the
     display weight and size so the two read as the same tier. */
  /* Selector carries enough weight to beat .c-drawer a:not(.c-btn) above,
     which is (0,2,1); a bare .c-drawer__link would lose and keep the indent. */
  .c-drawer a.c-drawer__link:not(.c-btn) {
    font-weight: var(--w-display); font-size: var(--step-1); color: var(--ink);
    padding-inline-start: 0; border-block-end: 1px solid var(--line);
  }
  /* Cities listed directly under Company Formation are one tier in. */
  .c-drawer > .l-wrap > details > a:not(.c-btn) { padding-inline-start: var(--s-4); }
  .c-drawer__cta { position: sticky; bottom: 0; padding-block: var(--s-4); background: var(--paper); }

  /* ---- Theme toggle ------------------------------------------------
     A contained, bordered pill so it reads as a deliberate control, not
     a floating icon. */
  /* --chip-sm, not a one-off 42px: these sit directly beside .c-burger in
     the header, so a 2px difference between two bordered circles reads as
     a mistake. Also brings them onto the icon scale the rest of the site
     uses instead of drifting off it. */
  .c-theme, .c-iconbtn {
    display: inline-flex; width: var(--chip-sm); height: var(--chip-sm);
    align-items: center; justify-content: center;
    color: var(--ink-soft);
    background: var(--surface);
    border: 1px solid var(--line-control);
    border-radius: var(--radius-pill);
    box-shadow: var(--shadow-sm);
    transition: color var(--t-quick) var(--ease),
                border-color var(--t-quick) var(--ease),
                background-color var(--t-quick) var(--ease),
                box-shadow var(--t-quick) var(--ease);
  }
  .c-iconbtn { flex: none; }
  .c-theme:hover, .c-iconbtn:hover { color: var(--brick); border-color: var(--brick); background: var(--brick-wash); box-shadow: var(--shadow); }
  /* Drawer variant: a labelled full-width row, not a bare icon square.
     The base .c-theme pill supplies a surface fill, a full border, a pill
     radius and a shadow. Only the radius was being overridden, so in the
     drawer this rendered as a white bordered box that read as a text input
     sitting among plain nav rows. All four are cleared here; the row is
     separated by a single hairline like the links above it. */
  .c-theme--drawer {
    width: 100%; justify-content: flex-start; gap: var(--s-3);
    min-height: var(--chip-sm); padding: var(--s-3) 0;
    font-weight: var(--w-display); font-size: var(--step-1); color: var(--ink);
    background: none; border: 0; box-shadow: none; border-radius: 0;
    border-block-start: 1px solid var(--line);
  }
  .c-theme--drawer:hover { background: none; border-color: transparent; box-shadow: none; color: var(--brick); }
  .c-theme--drawer svg { width: var(--icon-md); height: var(--icon-md); }
  .c-theme__sun { display: none; }
  .c-theme__moon { display: block; }
  :root[data-theme="dark"] .c-theme__sun,
  :root:not([data-theme="light"]) .c-theme__sun { display: block; }
  :root[data-theme="dark"] .c-theme__moon,
  :root:not([data-theme="light"]) .c-theme__moon { display: none; }
  @media (prefers-color-scheme: light) {
    :root:not([data-theme="dark"]) .c-theme__sun { display: none; }
    :root:not([data-theme="dark"]) .c-theme__moon { display: block; }
  }

  /* ---- Breadcrumb --------------------------------------------------- */
  .c-crumb { padding-block: var(--s-6) 0; }
  /* The ul[class]/ol[class] reset in @layer reset only fires on a list
     that carries its OWN class attribute. This <ol> doesn't (the class
     lives on the parent <nav class="c-crumb">), so the browser's default
     ~40px padding-inline-start was never zeroed, sitting the whole
     breadcrumb visibly right of the H1 and body copy in the same column
     on every page. Explicit padding: 0 here fixes it site-wide. */
  .c-crumb ol { display: flex; flex-wrap: wrap; gap: var(--s-1) var(--s-3); align-items: center; padding: 0; margin: 0; font-size: var(--step--1); font-weight: var(--w-display); }
  .c-crumb li { display: inline-flex; gap: var(--s-3); align-items: center; }
  .c-crumb li:not(:last-child)::after { content: ""; width: 5px; height: 5px; border-radius: 50%; background: var(--line-firm); }
  .c-crumb a { color: var(--ink-mute); text-decoration: none; transition: color var(--t-quick) var(--ease); }
  .c-crumb a:hover { color: var(--brick); }
  .c-crumb [aria-current="page"] { color: var(--brick); }

  /* ---- Hero. The one centred block on the site. -------------------- */
  .c-hero {
    text-align: center; padding-block: var(--s-16) var(--s-12);
    background: var(--glow-strong) no-repeat center top;
  }
  /* Eyebrow as a small badge, a modern-tech signature. */
  .c-hero .c-eyebrow {
    display: inline-flex; align-items: center; gap: var(--s-2);
    color: var(--brick); margin-block-end: var(--s-6);
    padding: var(--s-1) var(--s-3);
    border: 1px solid var(--line-control); border-radius: var(--radius-pill);
    background: var(--surface); box-shadow: var(--shadow-sm);
  }
  .c-hero .c-eyebrow::before {
    content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--seal);
  }
  .c-hero h1 { max-width: 18ch; margin-inline: auto; }
  .c-hero__lead { max-width: 42ch; margin-inline: auto; color: var(--ink-soft); font-size: var(--step-1); line-height: 1.5; margin-block-start: var(--s-6); }
  /* Interior page hero lede: left-aligned, wide, readable (not the grid l-prose). */
  .c-lede { max-width: 64ch; color: var(--ink-soft); font-size: var(--step-1); line-height: 1.6; margin-block-start: var(--s-4); }
  .c-hero__cta { display: flex; flex-wrap: wrap; gap: var(--s-3); justify-content: center; margin-block-start: var(--s-8); }
  .c-hero__cta--start { justify-content: flex-start; }
  @media (min-width: 1024px) { .c-hero { padding-block: var(--s-24) var(--s-16); } }

  /* Gradient-highlighted keyword inside a heading. */
  .c-hl { color: var(--brick); }
  @supports ((-webkit-background-clip: text) or (background-clip: text)) {
    .c-hl { background: var(--grad-text); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; color: transparent; }
  }

  /* USP strip under the hero: the headline selling points. */
  .c-usp { display: flex; flex-wrap: wrap; gap: var(--s-3) var(--s-6); justify-content: center; margin-block-start: var(--s-8); }
  .c-usp__item { display: inline-flex; align-items: center; gap: var(--s-2); font-weight: var(--w-display); font-size: var(--step-0); color: var(--ink); }
  .c-usp__item svg { width: var(--icon-sm); height: var(--icon-sm); flex: none; color: var(--brick); }
  .c-usp__price { color: var(--seal, #B4232A); }
  :root[data-theme="dark"] .c-usp__price, :root:not([data-theme="light"]) .c-usp__price { color: #F08A8F; }

  /* ---- The fork. Two columns that genuinely pair. ------------------- */
  .c-fork { display: grid; gap: var(--s-4); }
  .c-fork--top { align-items: start; }
  @media (min-width: 640px) { .c-fork { grid-template-columns: 1fr 1fr; gap: var(--s-6); } }

  .c-fork__card {
    padding: var(--s-8); background: var(--surface);
    border: 1px solid var(--line); border-radius: var(--radius-lg);
    box-shadow: var(--shadow-sm);
    transition: box-shadow var(--t-quick) var(--ease), transform var(--t-quick) var(--ease);
  }
  .c-fork__card:hover { box-shadow: var(--shadow); transform: translateY(-3px); }
  .c-fork__to {
    display: inline-flex; align-items: center; gap: var(--s-2);
    margin-block-start: var(--s-4); font-weight: var(--w-display);
    color: var(--brick); text-decoration: none;
  }
  .c-fork__to::after { content: "\2192"; transition: transform var(--t-quick) var(--ease); }
  .c-fork__card:hover .c-fork__to::after { transform: translateX(4px); }
  .c-fork__to:hover { color: var(--brick-hover); }

  /* ---- City list. A list with a leader, not a card grid. No icons. -- */
  .c-cities { border-block-start: 1px solid var(--line); }
  .c-cities__row {
    display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--s-2) var(--s-4);
    padding: var(--s-4); border-block-end: 1px solid var(--line);
    border-radius: var(--radius); text-decoration: none; color: var(--ink);
    transition: background-color var(--t-quick) var(--ease), box-shadow var(--t-quick) var(--ease);
  }
  .c-cities__row:hover { background: var(--surface); box-shadow: var(--shadow), inset 3px 0 0 var(--seal); }
  .c-cities__name { font-weight: var(--w-display); font-size: var(--step-1); min-width: 10ch; }
  .c-cities__who { color: var(--ink-soft); }

  /* ---- Service card grid on the hubs. NAV component, not body links.
     8 cards, 4x2 on desktop. Cards are interactive, so their border is
     --line-control (3:1), not the decorative --line. */
  .c-services { display: grid; gap: var(--s-3); grid-template-columns: 1fr; margin-block-start: var(--s-6); }
  @media (min-width: 640px) { .c-services { grid-template-columns: 1fr 1fr; } }
  @media (min-width: 1024px) { .c-services { grid-template-columns: repeat(4, 1fr); } }
  .c-service {
    position: relative; overflow: hidden;
    display: flex; flex-direction: column; align-items: flex-start;
    gap: 0; padding: var(--s-6); min-height: 168px;
    background: var(--surface); border: 1px solid var(--line);
    border-radius: var(--radius-lg); color: var(--ink); text-decoration: none;
    box-shadow: var(--shadow-sm);
    transition: background-color var(--t-quick) var(--ease),
                border-color var(--t-quick) var(--ease),
                box-shadow var(--t-quick) var(--ease),
                transform var(--t-quick) var(--ease);
  }
  /* Gradient accent bar slides in from the left on hover. */
  .c-service::before {
    content: ""; position: absolute; inset-inline: 0; inset-block-start: 0;
    height: 3px; background: var(--grad-accent);
    transform: scaleX(0); transform-origin: left;
    transition: transform var(--t-quick) var(--ease);
  }
  .c-service:hover::before { transform: scaleX(1); }
  .c-service:hover { border-color: var(--brick); box-shadow: var(--shadow); transform: translateY(-3px); }
  .c-service:hover .c-service__name { color: var(--brick); }
  .c-service__icon { display: inline-flex; align-items: center; justify-content: center; width: var(--chip-lg); height: var(--chip-lg); border-radius: var(--radius); background: var(--surface-2); color: var(--brick); margin-block-end: var(--s-6); flex: none; transition: background-color var(--t-quick) var(--ease), color var(--t-quick) var(--ease); }
  .c-service__icon svg { width: var(--icon-lg); height: var(--icon-lg); }
  .c-service:hover .c-service__icon { background: var(--btn); color: var(--on-btn); }
  .c-service__name { display: block; font-weight: var(--w-display); font-size: var(--step-1); line-height: 1.2; margin-block-end: var(--s-3); transition: color var(--t-quick) var(--ease); }
  .c-service__note { display: block; font-size: var(--step-0); color: var(--ink-soft); line-height: 1.5; margin-block-start: auto; padding-block-start: var(--s-4); }


  /* ---- Comparison: a featured block for the one clear answer (when
     there is one), plus a quiet ledger list for the rest. Replaces the
     earlier equal-weight card grid, which gave "WFOE" and "Domestic LLC
     (not even a real option, per the copy above it)" identical visual
     weight. Pills carry a status colour so a visitor scans the grid of
     facts in seconds instead of reading full sentences per row. ------- */
  .c-compare { margin-block-start: var(--s-8); }
  .c-compare__featured {
    position: relative; margin-block-end: var(--s-2);
    padding: var(--s-6);
    background: var(--brick-wash); border: 1px solid var(--brick);
    border-radius: var(--radius-lg); box-shadow: var(--shadow);
  }
  .c-compare__badge {
    position: absolute; inset-block-start: -12px; inset-inline-end: var(--s-8);
    padding: var(--s-1) var(--s-3); border-radius: var(--radius-pill);
    background: var(--btn); color: var(--on-btn);
    font-size: var(--step--1); font-weight: var(--w-display); box-shadow: var(--shadow-sm);
  }
  .c-compare__featured-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--s-2) var(--s-3); margin-block-end: var(--s-4); }
  .c-compare__featured-head h3 { margin: 0; font-size: var(--step-2); letter-spacing: -0.01em; }
  .c-compare__featured-head span { font-size: var(--step--1); font-weight: var(--w-display); color: var(--brick); }
  .c-compare__suits { margin: 0; font-size: var(--step-0); color: var(--ink-soft); }
  .c-compare__suits b { color: var(--ink); font-weight: var(--w-display); }

  .c-compare__pills { display: flex; flex-wrap: wrap; gap: var(--s-2); margin-block-end: var(--s-4); }
  .c-compare__pill-dot { width: 7px; height: 7px; border-radius: 50%; flex: none; background: currentColor; }
  .c-compare__pill {
    display: inline-flex; align-items: center; gap: var(--s-2);
    padding: var(--s-1) var(--s-3);
    border: 1px solid transparent; border-radius: var(--radius-pill);
    font-size: var(--step--1); font-weight: var(--w-display);
  }
  .c-compare__pill--ok    { background: var(--ok-wash);   border-color: var(--ok);   color: var(--ok); }
  .c-compare__pill--stop  { background: var(--stop-wash); border-color: var(--stop); color: var(--stop); }
  .c-compare__pill--warn  { background: var(--warn-wash); border-color: var(--warn); color: var(--warn); }

  .c-compare__ledger { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); overflow: hidden; }
  /* Grid, not flexbox, for the row: a flex-basis of 100% only forces a new
     line once the preceding siblings already fill the row, which on wide
     viewports they don't, so the suits caption floated up onto the pills'
     own line with a large gap instead of sitting predictably underneath.
     Named grid areas place name/pills/suits the same way at every width,
     and a wrapped two-line name simply grows its own row instead of
     fighting its neighbours for horizontal space. */
  .c-compare__row {
    position: relative;
    display: grid;
    grid-template-columns: 160px 1fr;
    grid-template-areas: "name pills" "suits suits";
    column-gap: var(--s-4); row-gap: var(--s-3);
    padding: var(--s-4) var(--s-6) var(--s-4) calc(var(--s-6) + 3px);
    border-block-end: 1px solid var(--line);
    transition: background-color var(--t-quick) var(--ease);
  }
  .c-compare__row:last-child { border-block-end: 0; }
  .c-compare__row:hover { background: var(--paper); }
  /* A quiet left rail in the row's worst-signal colour (stop beats warn
     beats ok), so a scanning eye catches which rows carry a real caveat
     before reading a single pill. */
  .c-compare__row::before {
    content: ""; position: absolute; inset-block: 0; inset-inline-start: 0; width: 3px;
    background: var(--row-accent, transparent);
  }
  .c-compare__row:has(.c-compare__pill--stop)::before { --row-accent: var(--stop); }
  .c-compare__row:has(.c-compare__pill--warn):not(:has(.c-compare__pill--stop))::before { --row-accent: var(--warn); }
  .c-compare__name { grid-area: name; align-self: start; margin: 0; padding-block-start: 2px; font-size: var(--step-0); font-weight: var(--w-display); color: var(--ink); }
  .c-compare__row .c-compare__pills { grid-area: pills; align-self: start; margin: 0; }
  .c-compare__rowsuits { grid-area: suits; margin: 0; font-size: var(--step--1); color: var(--ink-mute); }
  @media (max-width: 560px) {
    .c-compare__row { grid-template-columns: 1fr; grid-template-areas: "name" "pills" "suits"; }
  }

  /* ---- FAQ. Native details/summary. Answers stay in the DOM and stay
     crawlable: never inject them with JS, that loses the AI citations
     which since 7 May 2026 are the only thing FAQ markup is still for. */
  .c-faq { border-block-start: 1px solid var(--line); }
  .c-faq details { border-block-end: 1px solid var(--line); }
  .c-faq summary {
    padding: var(--s-4) 0; list-style: none; cursor: pointer;
    font-weight: var(--w-display); font-size: var(--step-1); letter-spacing: -0.01em;
    display: flex; justify-content: space-between; gap: var(--s-4); align-items: start;
  }
  .c-faq summary::-webkit-details-marker { display: none; }
  .c-faq__mark { flex: none; transition: transform var(--t-quick) var(--ease); }
  .c-faq details[open] .c-faq__mark { transform: rotate(45deg); }
  .c-faq__body { padding-block-end: var(--s-4); }
  .c-faq__body > :first-child { margin-block-start: 0; }

  /* ---- Table of contents (legal pages). Sticky at 900+, details on
     mobile, plain anchor list with JS off. Scroll spy adds
     aria-current. Stable ids live in the HTML, never regenerated. */
  .c-toc__list a { display: block; padding: var(--s-1) 0; color: var(--ink-mute); text-decoration: none; font-size: var(--step-0); }
  .c-toc__list a:hover { color: var(--brick); }
  .c-toc__list a[aria-current="true"] { color: var(--ink); font-weight: var(--w-display); }
  @media (min-width: 900px) {
    .c-legal { display: grid; grid-template-columns: 16rem 1fr; gap: var(--s-8); align-items: start; }
    .c-toc { position: sticky; top: calc(64px + var(--s-4)); }
    .c-toc__details { border: 0; }
    .c-toc__details summary { display: none; }
    .c-toc__details[open], .c-toc__details { display: block; }
  }
  @media (max-width: 899px) {
    .c-toc__details summary { padding: var(--s-3) 0; font-weight: var(--w-display); cursor: pointer; }
  }

  /* ---- Estimator. A form. Range never a single number, assumptions
     always visible, no email gate. Space reserved so results do not
     shift layout (CLS watch list). ------------------------------- */
  .c-est { padding: var(--s-8); background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow); }
  .c-est__grid { display: grid; gap: var(--s-4); }
  @media (min-width: 640px) { .c-est__grid { grid-template-columns: 1fr 1fr; } }
  .c-est__out { margin-block-start: var(--s-4); padding-block-start: var(--s-4); border-block-start: 1px solid var(--line); min-height: 6rem; }
  .c-est__range { font-family: var(--font-mono); font-weight: 600; font-size: var(--step-2); letter-spacing: -0.01em; font-variant-numeric: tabular-nums; }
  .c-est__assume { font-size: var(--step--1); color: var(--ink-mute); margin-block-start: var(--s-2); }

  /* ---- Forms. Labels above inputs. Errors below, icon and text,
     saying what to do. 16px min so iOS does not zoom. ------------- */
  .c-field { margin-block-start: var(--s-4); }
  .c-field label { display: block; font-weight: var(--w-display); font-size: var(--step-0); margin-block-end: var(--s-1); }
  .c-field input, .c-field select, .c-field textarea {
    width: 100%; min-height: 44px; padding: var(--s-2) var(--s-3);
    font-size: max(16px, var(--step-0));
    background: var(--surface); color: var(--ink);
    border: 1px solid var(--line-control); border-radius: var(--radius);
  }
  .c-field textarea { min-height: 8rem; resize: vertical; }
  .c-field[data-invalid="true"] input,
  .c-field[data-invalid="true"] textarea { border-color: var(--stop); }
  .c-field__hint { font-size: var(--step--1); color: var(--ink-mute); margin-block-start: var(--s-1); }
  .c-field__err { display: none; align-items: center; gap: var(--s-2); font-size: var(--step--1); color: var(--stop); margin-block-start: var(--s-1); }
  .c-field[data-invalid="true"] .c-field__err { display: flex; }

  /* ---- Callouts: the cost exclusions, the hard-rule boxes ---------- */
  /* Callout. Capped to a readable measure and centred so a standalone note
     in a full-width section does not stretch its text across the page. Notes
     inside the prose content grid are already within the measure column, so
     the cap is a no-op there. */
  .c-note { padding: var(--s-4) var(--s-6); border-inline-start: 3px solid var(--brick); background: var(--surface-2); border-radius: 0 var(--radius) var(--radius) 0; max-width: var(--measure); margin-inline: auto; }
  .c-note--warn { border-inline-start-color: var(--warn); }
  .c-note__label { font-size: var(--step--1); text-transform: uppercase; letter-spacing: 0.12em; color: var(--ink-mute); }

  /* ---- Last reviewed + YMYL footer note on content pages ---------- */
  .c-reviewed { display: flex; flex-wrap: wrap; gap: var(--s-2) var(--s-6); margin-block-start: var(--s-12); padding-block-start: var(--s-4); border-block-start: 1px solid var(--line); font-size: var(--step--1); color: var(--ink-mute); }

  /* ---- Mobile sticky CTA bar. After 40% scroll, set by main.js.
     Absent on contact, thank-you, search, errors (no markup there). -- */
  .c-stickybar {
    position: fixed; inset-inline: 0; bottom: 0; z-index: 90;
    display: none; gap: var(--s-2); padding: var(--s-2);
    padding-bottom: calc(var(--s-2) + env(safe-area-inset-bottom));
    background: var(--surface); border-block-start: 1px solid var(--line-firm);
  }
  .c-stickybar[data-show="true"] { display: flex; }
  .c-stickybar .c-btn { flex: 1; min-height: 48px; }
  @media (min-width: 1024px) { .c-stickybar { display: none !important; } }

  /* ---- WhatsApp floating widget. Every page, fixed corner. z-index
     sits above the header (100) and the sticky bar (90) so it is
     always reachable, but below the drawer (150) so the open mobile
     menu correctly covers it rather than floating on top of the menu.
     On <1024px the mobile sticky bar already occupies the bottom edge
     whenever it is showing, so the widget sits clear of it there; at
     1024px+ there is no sticky bar and it drops to a plain corner
     margin. Plain <a>, no JS: works with scripting off, like every
     other contact channel on the site. */
  .c-whatsapp {
    position: fixed; z-index: 140;
    inset-inline-end: var(--s-4); inset-block-end: calc(80px + env(safe-area-inset-bottom));
    display: inline-flex; align-items: center; justify-content: center;
    width: 56px; height: 56px; border-radius: 50%;
    background: var(--whatsapp-green); color: #FFFFFF;
    box-shadow: var(--shadow-lg);
    transition: transform var(--t-quick) var(--ease), box-shadow var(--t-quick) var(--ease), background-color var(--t-quick) var(--ease);
  }
  .c-whatsapp svg { width: 30px; height: 30px; }
  .c-whatsapp:hover { background: var(--whatsapp-green-dark); transform: translateY(-3px); box-shadow: var(--shadow-lg), 0 10px 22px rgba(0, 0, 0, .18); }
  @media (min-width: 1024px) {
    .c-whatsapp { inset-block-end: var(--s-6); }
  }

  /* ---- Contact page: info cards + premium form panel -------------- */
  .c-infocards { display: grid; gap: var(--s-4); grid-template-columns: 1fr; margin-block-start: var(--s-8); }
  @media (min-width: 560px) { .c-infocards { grid-template-columns: 1fr 1fr; } }
  @media (min-width: 1000px) { .c-infocards { grid-template-columns: repeat(4, 1fr); } }
  .c-infocard { display: flex; flex-direction: column; gap: var(--s-8); min-height: 168px; padding: var(--s-6); background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); transition: box-shadow var(--t-quick) var(--ease), transform var(--t-quick) var(--ease); min-width: 0; }
  .c-infocard:hover { box-shadow: var(--shadow); transform: translateY(-3px); }
  .c-infocard__head { display: flex; align-items: center; gap: var(--s-3); }
  .c-infocard__icon { flex: none; display: inline-flex; align-items: center; justify-content: center; width: var(--chip-sm); height: var(--chip-sm); border-radius: var(--radius); background: var(--surface-2); color: var(--brick); }
  .c-infocard__icon svg { width: var(--icon-md); height: var(--icon-md); }
  .c-infocard__head h2 { margin: 0; font-size: var(--step-1); }
  .c-infocard__val { margin-block-start: auto; color: var(--ink); font-size: var(--step-0); line-height: 1.5; }
  .c-infocard__val a { color: var(--ink); text-decoration: none; }
  .c-infocard__val a:hover { color: var(--brick); }

  /* Dedicated WeChat scan panel, above the fold on the contact page (the
     footer QR is a secondary, sitewide convenience; this is the primary
     one on the one page a visitor lands on specifically to get in touch). */
  .c-wechat-panel { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-8); padding: var(--s-8); margin-block-start: var(--s-8); background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); }
  .c-wechat-panel__qr { flex: none; width: 200px; height: 200px; border-radius: var(--radius); border: 1px solid var(--line); background: #FFFFFF; padding: var(--s-3); }
  .c-wechat-panel__body h3 { margin: 0 0 var(--s-2); font-size: var(--step-1); }
  .c-wechat-panel__body p { margin: 0 0 var(--s-3); color: var(--ink-soft); }
  .c-wechat-panel__steps { list-style: none; margin: 0; padding: 0; counter-reset: wechat-step; display: grid; gap: var(--s-2); }
  .c-wechat-panel__steps li { counter-increment: wechat-step; display: flex; gap: var(--s-3); align-items: baseline; color: var(--ink); }
  .c-wechat-panel__steps li::before { content: counter(wechat-step); flex: none; display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: var(--radius-pill); background: var(--brick-wash); color: var(--brick); font-size: var(--step--1); font-weight: var(--w-display); }

  .c-formpanel { background: var(--ink); border-radius: var(--radius-lg); padding: var(--s-6); box-shadow: var(--shadow-lg); }
  @media (min-width: 768px) { .c-formpanel { padding: var(--s-8); } }
  .c-formpanel__media { border-radius: var(--radius); overflow: hidden; margin-block-end: var(--s-8); }
  .c-formpanel__media img { width: 100%; height: 100%; object-fit: cover; aspect-ratio: 21 / 7; display: block; }
  .c-formpanel .c-form { max-width: none; }
  .c-formpanel .c-form label { color: var(--paper); }
  .c-formpanel .c-form input, .c-formpanel .c-form textarea { background: var(--surface); border-color: transparent; color: var(--ink); }
  .c-formpanel .c-form input:focus-visible, .c-formpanel .c-form textarea:focus-visible { border-color: var(--btn); box-shadow: 0 0 0 3px rgba(249, 106, 44, .35); }

  /* ---- CTA form band + form --------------------------------------- */
  /* overflow-x: clip, not hidden: the rotated chop stamp overhangs the
     wrap by ~2px, which was enough to give every page a horizontal
     scrollbar. clip trims it without creating a scroll container. */
  .c-cta-band { margin-block-start: var(--s-16); padding-block: var(--s-12); background: var(--glow) no-repeat center top, var(--paper); border-block: 1px solid var(--line); overflow-x: clip; }
  .c-cta-band .l-wrap { position: relative; }
  .c-cta-band .c-chop--sm { inset-block-start: 0; inset-inline-end: 0; display: none; }
  @media (min-width: 900px) { .c-cta-band .c-chop--sm { display: block; } }
  .c-cta-band h2 { margin-block-start: 0; }
  /* One column until there is room for two, and minmax(0,1fr) so the
     tracks are not floored at the inputs' min-content width, which on a
     320px phone held the fields at 300px inside a 240px form. */
  .c-form { display: grid; gap: var(--s-4); grid-template-columns: minmax(0, 1fr); margin-block-start: var(--s-6); max-width: 40rem; }
  @media (min-width: 560px) { .c-form { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); } }
  .c-field { display: flex; flex-direction: column; gap: var(--s-2); min-width: 0; }
  .c-field--full { grid-column: 1 / -1; }
  .c-form label { font-size: var(--step--1); font-weight: var(--w-display); color: var(--ink); }
  .c-form input, .c-form textarea { font: inherit; color: var(--ink); background: var(--surface); border: 1px solid var(--line-control); border-radius: var(--radius); padding: var(--s-3); width: 100%; }
  .c-form input::placeholder, .c-form textarea::placeholder { color: var(--ink-mute); }
  .c-form input:focus-visible, .c-form textarea:focus-visible { outline: none; border-color: var(--brick); box-shadow: 0 0 0 2px var(--focus-halo), 0 0 0 4px var(--brick); }
  .c-form textarea { resize: vertical; min-height: 120px; }
  .c-form button { grid-column: 1 / -1; justify-self: start; }
  .c-form__status { grid-column: 1 / -1; margin: 0; font-size: var(--step--1); font-weight: var(--w-display); color: var(--stop); min-height: 1.2em; }

  /* Turnstile renders a fixed 300px iframe we do not control. Below 360px
     that does not fit the form column at any padding, so the widget is
     scaled to fit and its box clipped, since a transform does not shrink
     the layout box and the leftover width would still scroll the page. */
  @media (max-width: 359px) {
    .c-field:has(> .cf-turnstile) { overflow-x: clip; }
    .cf-turnstile { transform: scale(.82); transform-origin: left top; }
  }
  .c-formpanel .c-form__status { color: var(--seal); }
  @media (max-width: 560px) { .c-form { grid-template-columns: 1fr; } }

  /* ---- Amplus-style layouts: figures, splits, stats, steps -------- */
  .c-figure { border-radius: var(--radius-lg); overflow: hidden; box-shadow: var(--shadow); background: var(--surface-2); }
  .c-figure img { width: 100%; height: 100%; object-fit: cover; display: block; }
  .c-figure--45 img { aspect-ratio: 4 / 5; }

  /* Hero image collage under the hero copy. */
  .c-hero__gallery { position: relative; display: grid; grid-template-columns: 1fr 1fr; gap: var(--s-4); margin-block-start: var(--s-12); }
  .c-hero__gallery .c-figure img { aspect-ratio: 4 / 3; }

  /* ---- The chop. One per page, in the hero, on first paint only. This is
     the "one orchestrated moment" main.css's own motion budget reserves:
     everywhere else on the site is a 150ms colour transition, and this is
     the single exception. Reduced-motion users get it at rest, handled
     for free by the global animation-duration override in @layer reset. */
  .c-chop-wrap {
    display: none; position: absolute; z-index: 5;
    inset-block-start: 50%; inset-inline-start: 50%;
    width: 92px; height: 92px; transform: translate(-50%, -50%);
  }
  @media (min-width: 640px) { .c-chop-wrap { display: block; } }
  .c-chop {
    position: relative; z-index: 2; display: block;
    width: 100%; height: 100%; color: var(--seal);
    filter: drop-shadow(0 6px 14px rgba(12, 8, 6, .22));
    animation: chop-land 550ms var(--ease-land) both;
  }
  .c-chop__ring { fill: none; stroke: currentColor; stroke-width: 3; }
  .c-chop__ring--inner { fill: none; stroke: var(--seal-ink); stroke-width: 1.4; opacity: .85; }
  .c-chop__mark { font-family: var(--font-mono); font-weight: 600; fill: currentColor; }
  .c-chop__halo {
    position: absolute; z-index: 1; inset: -35%; border-radius: 50%;
    background: radial-gradient(circle, var(--seal) 0%, transparent 68%);
    opacity: 0; filter: blur(10px);
    animation: chop-halo 900ms var(--ease) 480ms both;
  }
  @keyframes chop-land {
    0%   { opacity: 0; transform: rotate(-5deg) scale(1.4); }
    70%  { opacity: 1; transform: rotate(-5deg) scale(.96); }
    100% { opacity: 1; transform: rotate(-5deg) scale(1); }
  }
  @keyframes chop-halo {
    0%   { opacity: 0; }
    35%  { opacity: .16; }
    100% { opacity: .06; }
  }
  /* Small, quiet, static reuse: a corner mark, never re-animated and never
     paired with a halo div. Only the hero copy stamps in; every other
     appearance is at rest from first paint. */
  .c-chop--sm { position: absolute; width: 36px; height: 36px; animation: none; opacity: 1; transform: rotate(-5deg); filter: none; }

  /* Two-column image + content. Reverse puts the image on the right. */
  .c-split { display: grid; gap: var(--s-8); align-items: center; grid-template-columns: 1fr; }
  @media (min-width: 900px) {
    .c-split { grid-template-columns: 1fr 1fr; gap: var(--s-12); }
    .c-split--rev .c-split__media { order: 2; }
  }
  .c-split__body > :first-child { margin-block-start: 0; }

  /* Checklist with orange ticks. */
  .c-checks { list-style: none; margin: var(--s-6) 0 0; padding: 0; display: grid; gap: var(--s-4); }
  .c-checks li { display: flex; gap: var(--s-3); }
  .c-checks svg { flex: none; width: var(--icon-md); height: var(--icon-md); color: var(--brick); margin-block-start: 2px; }
  .c-checks strong { display: block; color: var(--ink); font-weight: var(--w-display); }
  .c-checks span { color: var(--ink-soft); }

  /* Dark stats band. Inverts with the theme; numbers stay full-contrast. */
  .c-statband { background: var(--ink); color: var(--paper); border-radius: var(--radius-lg); padding: var(--s-12) var(--s-8); box-shadow: var(--shadow); }
  .c-stats { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--s-8); }
  @media (min-width: 768px) { .c-stats { grid-template-columns: repeat(4, 1fr); } }
  .c-stat { border-block-start: 3px solid var(--brick-lift); padding-block-start: var(--s-4); }
  .c-stat__num { font-size: var(--step-3); font-weight: var(--w-display); line-height: 1; color: var(--paper); }
  .c-stat__label { margin-block-start: var(--s-2); color: var(--paper); opacity: .82; font-size: var(--step-0); }

  /* Dark values band (About mission/what-we-stand-for). Inverts with theme. */
  .c-valueband { background: var(--ink); color: var(--paper); border-radius: var(--radius-lg); padding: var(--s-12) var(--s-8); box-shadow: var(--shadow); margin-block-start: var(--s-8); }
  .c-values { display: grid; gap: var(--s-8); grid-template-columns: 1fr; }
  @media (min-width: 768px) { .c-values { grid-template-columns: 1fr 1fr; gap: var(--s-12); } }
  .c-value__head { display: flex; align-items: center; gap: var(--s-3); margin-block-end: var(--s-3); }
  .c-value__head svg { flex: none; width: var(--icon-lg); height: var(--icon-lg); color: var(--brick-lift); }
  .c-value h3 { margin: 0; color: var(--paper); font-size: var(--step-1); }
  .c-value > p { color: var(--paper); opacity: .82; margin: 0 0 var(--s-4); }
  .c-value ul { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--s-2); }
  .c-value li { display: flex; gap: var(--s-3); color: var(--paper); opacity: .92; font-size: var(--step-0); }
  .c-value li svg { flex: none; width: var(--icon-md); height: var(--icon-md); color: var(--brick-lift); margin-block-start: 2px; }

  /* About hero facts row under the split. */
  .c-facts { display: flex; flex-wrap: wrap; gap: var(--s-8); margin-block-start: var(--s-6); }
  .c-facts__n { font-size: var(--step-2); font-weight: var(--w-display); color: var(--brick); line-height: 1; }
  .c-facts__l { display: block; margin-block-start: var(--s-1); color: var(--ink-mute); font-size: var(--step--1); }

  /* Registration timeline (replaces the old chop graphic). */
  .c-timeline-card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); padding: var(--s-8) var(--s-6); box-shadow: var(--shadow-sm); }
  .c-timeline-card > p { margin: 0 0 var(--s-6); font-size: var(--step--1); text-transform: uppercase; letter-spacing: 0.1em; color: var(--ink-mute); font-weight: var(--w-display); }
  .c-timeline { list-style: none; margin: 0; padding: 0; }
  .c-timeline li { position: relative; padding-inline-start: var(--s-8); padding-block-end: var(--s-4); }
  .c-timeline li:last-child { padding-block-end: 0; }
  .c-timeline li::before { content: ""; position: absolute; inset-inline-start: 7px; inset-block-start: 8px; bottom: -4px; width: 2px; background: var(--line-firm); }
  .c-timeline li:last-child::before { display: none; }
  .c-timeline li::after { content: ""; position: absolute; inset-inline-start: 0; inset-block-start: 3px; width: 16px; height: 16px; border-radius: 50%; border: 3px solid var(--brick); background: var(--surface); }
  .c-timeline li.is-slow::after { background: var(--brick); box-shadow: 0 0 0 4px var(--brick-wash); }
  .c-timeline h3 { margin: 0; font-size: var(--step-0); font-weight: var(--w-display); color: var(--ink); }
  .c-timeline li.is-slow h3 { color: var(--brick); }
  .c-timeline p { margin: 2px 0 0; font-size: var(--step--1); color: var(--ink-soft); line-height: 1.45; }

  /* Numbered process steps. */
  .c-steps { display: grid; gap: var(--s-6); grid-template-columns: 1fr; margin-block-start: var(--s-8); }
  @media (min-width: 768px) { .c-steps { grid-template-columns: repeat(4, 1fr); } }
  .c-step { padding: var(--s-6); background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); }
  .c-step__num { display: inline-flex; align-items: center; justify-content: center; width: 46px; height: 46px; border-radius: var(--radius-pill); background: var(--grad-primary); color: var(--on-brick); font-weight: var(--w-display); font-size: var(--step-1); margin-block-end: var(--s-4); }
  .c-step h3 { margin: 0 0 var(--s-2); font-size: var(--step-1); }
  .c-step p { margin: 0; color: var(--ink-soft); }

  /* Sector cards with an icon chip. */
  .c-sectors { display: grid; gap: var(--s-4); grid-template-columns: 1fr; margin-block-start: var(--s-8); }
  @media (min-width: 560px) { .c-sectors { grid-template-columns: 1fr 1fr; } }
  @media (min-width: 1000px) { .c-sectors { grid-template-columns: repeat(4, 1fr); } }
  .c-sector { display: flex; flex-direction: column; align-items: flex-start; padding: var(--s-6); background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); transition: box-shadow var(--t-quick) var(--ease), transform var(--t-quick) var(--ease), border-color var(--t-quick) var(--ease); }
  .c-sector:hover { box-shadow: var(--shadow); transform: translateY(-3px); border-color: var(--line-firm); }
  .c-sector__icon { flex: none; display: inline-flex; align-items: center; justify-content: center; width: var(--chip-md); height: var(--chip-md); border-radius: var(--radius); background: var(--surface-2); color: var(--brick); margin-block-end: var(--s-4); }
  .c-sector__icon svg { width: var(--icon-md); height: var(--icon-md); }
  .c-sector h3 { margin: 0 0 var(--s-2); font-size: var(--step-1); line-height: 1.2; }
  .c-sector p { margin: 0; color: var(--ink-soft); font-size: var(--step-0); line-height: 1.5; }

  /* ---- Pricing cards (Amplus-style) ------------------------------- */
  .c-pricing { display: grid; gap: var(--s-4); grid-template-columns: 1fr; margin-block-start: var(--s-8); align-items: stretch; }
  @media (min-width: 680px) { .c-pricing { grid-template-columns: 1fr 1fr; } }
  @media (min-width: 1024px) { .c-pricing { grid-template-columns: repeat(3, 1fr); } }
  /* Equal-height cards. Reserved top space keeps every head on one line,
     min-height on the description keeps every price on one line, and the
     button is pinned to the bottom so all buttons align across the row. */
  .c-price { position: relative; display: flex; flex-direction: column; padding: var(--s-6); background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); transition: box-shadow var(--t-quick) var(--ease), transform var(--t-quick) var(--ease); }
  .c-price:hover { box-shadow: var(--shadow); transform: translateY(-3px); }
  .c-price--featured { border-color: var(--brick); box-shadow: 0 0 0 1px var(--brick), var(--shadow); }
  /* Top-right: clear of the "Most asked for" badge (top-left) and the
     corner registration marks (top-left + bottom-right diagonal). */
  .c-price--featured .c-chop--sm { inset-block-start: var(--s-4); inset-inline-end: var(--s-4); }

  /* Corner registration marks. A print/document convention (crop marks),
     drawn as two hairline gradients per corner so it stays pure CSS, no
     image asset, and fully theme-reactive via var(--line-firm). Only the
     top-left and bottom-right corners carry a mark, the same restrained,
     diagonal-pair convention real print crop marks often use, so it reads
     as a deliberate document detail rather than a decorative frame. */
  .c-price--featured::after {
    content: ""; position: absolute; pointer-events: none;
    inset-inline-start: var(--s-3); inset-block-start: var(--s-3);
    width: 10px; height: 10px;
    background:
      linear-gradient(var(--line-firm), var(--line-firm)) top left / 100% 1.5px no-repeat,
      linear-gradient(var(--line-firm), var(--line-firm)) top left / 1.5px 100% no-repeat;
  }
  .c-price--featured::before {
    content: ""; position: absolute; pointer-events: none;
    inset-inline-end: var(--s-3); inset-block-end: var(--s-3);
    width: 10px; height: 10px;
    background:
      linear-gradient(var(--line-firm), var(--line-firm)) bottom right / 100% 1.5px no-repeat,
      linear-gradient(var(--line-firm), var(--line-firm)) bottom right / 1.5px 100% no-repeat;
  }
  .c-price__badge { position: absolute; top: var(--s-4); inset-inline-start: var(--s-6); margin: 0; padding: var(--s-1) var(--s-3); border-radius: var(--radius-pill); background: var(--btn); color: var(--on-btn); font-size: var(--step--1); font-weight: var(--w-display); }
  .c-price__head { display: flex; align-items: center; gap: var(--s-3); margin-block: var(--s-8) var(--s-4); min-height: 48px; }
  .c-price__icon { flex: none; display: inline-flex; align-items: center; justify-content: center; width: var(--chip-md); height: var(--chip-md); border-radius: var(--radius); background: var(--surface-2); color: var(--brick); }
  .c-price__icon svg { width: var(--icon-md); height: var(--icon-md); }
  .c-price__name { margin: 0; font-size: var(--step-1); line-height: 1.15; }
  .c-price__desc { margin: 0 0 var(--s-4); color: var(--ink-soft); font-size: var(--step-0); line-height: 1.5; }
  @media (min-width: 680px) { .c-price__desc { min-height: 3.2em; } }
  .c-price__amount { margin: 0 0 var(--s-6); font-size: var(--step-3); font-weight: var(--w-display); color: var(--brick); line-height: 1; letter-spacing: -0.02em; }
  /* Only the figure itself reads as data; "From" stays body-voice prose. */
  .c-price__amount__fig { font-family: var(--font-mono); font-weight: 600; letter-spacing: -0.01em; font-variant-numeric: tabular-nums; }
  .c-price__amount small { font-size: var(--step--1); font-weight: var(--w-body); color: var(--ink-mute); letter-spacing: 0; }
  /* Ledger treatment: same border-block-end-between-rows pattern as the
     Seven Cities list and the FAQ, so the "official document" feel is
     consistent across every list-like section, not confined to one. */
  .c-price__list { list-style: none; margin: 0 0 var(--s-6); padding: var(--s-6) 0 0; border-block-start: 1px solid var(--line); display: grid; }
  .c-price__list li { position: relative; padding: var(--s-3) 0 var(--s-3) var(--s-6); border-block-end: 1px solid var(--line); color: var(--ink-soft); font-size: var(--step-0); line-height: 1.45; }
  .c-price__list li:last-child { border-block-end: 0; padding-block-end: 0; }
  .c-price__list li::before { content: ""; position: absolute; inset-inline-start: 0; inset-block-start: calc(var(--s-3) + .5em); width: 8px; height: 8px; border-radius: var(--radius-pill); background: var(--brick-lift); }
  .c-price .c-btn { width: 100%; margin-block-start: auto; }

  /* ---- Client quotes. Restrained on purpose: a gold rating row and a quiet
     brick rule, but no photos, no logos and no oversized quotation glyphs.
     Same bordered-card and hairline language as the pricing and comparison
     components, so they read as part of the document. Five items, so the last
     spans the full row rather than leaving an orphan in a two-column grid. */
  .c-quotes { display: grid; gap: var(--s-4); grid-template-columns: 1fr; margin-block-start: var(--s-8); }
  @media (min-width: 720px) {
    .c-quotes { grid-template-columns: 1fr 1fr; gap: var(--s-6); }
    .c-quotes > :last-child:nth-child(odd) { grid-column: 1 / -1; }
  }
  .c-quote {
    position: relative; overflow: hidden;
    display: flex; flex-direction: column; margin: 0;
    padding: var(--s-8) var(--s-6) var(--s-6);
    background: var(--surface); border: 1px solid var(--line);
    border-radius: var(--radius-lg); box-shadow: var(--shadow-sm);
    transition: box-shadow var(--t-quick) var(--ease), transform var(--t-quick) var(--ease),
                border-color var(--t-quick) var(--ease);
  }
  /* Gold hairline along the top edge, the counterpart to the brick accent bar
     on .c-service, tying the card to the rating it carries. */
  .c-quote::before {
    content: ""; position: absolute; inset-inline: 0; inset-block-start: 0; height: 3px;
    background: linear-gradient(90deg, var(--star), var(--brick-lift));
    opacity: .85;
  }
  .c-quote:hover { border-color: var(--line-firm); box-shadow: var(--shadow); transform: translateY(-3px); }

  .c-quote__stars { display: flex; gap: 3px; margin-block-end: var(--s-4); color: var(--star); }
  .c-quote__stars svg { width: var(--icon-sm); height: var(--icon-sm); flex: none; }

  .c-quote__text {
    margin: 0 0 var(--s-6); max-width: none; color: var(--ink);
    font-size: var(--step-1); line-height: 1.5; letter-spacing: -0.01em;
  }
  .c-quote__meta {
    display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--s-1) var(--s-3);
    margin-block-start: auto; padding-block-start: var(--s-4);
    border-block-start: 1px solid var(--line);
  }
  .c-quote__who { font-weight: var(--w-display); color: var(--ink); font-size: var(--step-0); }
  .c-quote__where { color: var(--ink-mute); font-size: var(--step--1); }
  .c-quote__svc {
    flex-basis: 100%; margin-block-start: var(--s-2);
    display: inline-flex; align-self: flex-start; width: fit-content;
    padding: var(--s-1) var(--s-3); border-radius: var(--radius-pill);
    /* --brick-hover, not --brick: at this size the chip is normal text, and
       --brick on --brick-wash measures 4.3, under the 4.5 AA floor. The hover
       tone is the same hue two steps darker and measures 6.07. In dark the
       inverted --brick already clears it at 6.67. */
    background: var(--brick-wash); color: var(--brick-hover);
    font-size: calc(var(--step--1) - 1px); font-weight: var(--w-display);
  }

  /* ---- Footer. Amplus layout: dark help bar + two rounded cards. --- */
  .c-footer { margin-block-start: var(--s-16); padding-block: var(--s-8) var(--s-12); background: var(--paper); }
  /* minmax(0,1fr), not the implicit auto track: an auto track is floored
     at its content's min-content width, so on narrow phones the footer
     grew past the wrap and gave every page a horizontal scrollbar. */
  .c-footer .l-wrap { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--s-3); }

  .c-footer__bar { background: var(--ink); color: var(--paper); border-radius: var(--radius-lg); padding: var(--s-6) var(--s-4); min-width: 0; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--s-4) var(--s-8); }
  .c-footer__bar h2 { margin: 0; font-size: var(--step-2); color: var(--paper); }
  .c-footer__barlinks { display: flex; flex-wrap: wrap; gap: var(--s-3) var(--s-6); min-width: 0; }
  .c-footer__barlinks a { overflow-wrap: anywhere; }
  .c-footer__barlinks a { display: inline-flex; align-items: center; gap: var(--s-2); color: var(--paper); text-decoration: none; font-weight: var(--w-display); font-size: var(--step-0); opacity: .88; }
  .c-footer__barlinks a:hover { color: var(--brick-lift); opacity: 1; }
  .c-footer__barlinks svg { width: var(--icon-sm); height: var(--icon-sm); }

  /* min-width:0 on the items: a grid item defaults to min-width:auto and
     so refuses to shrink below its min-content, which below ~360px made
     the cards 355px wide inside a 288px track and gave every page on the
     site a horizontal scrollbar. */
  .c-footer__cards { display: grid; gap: var(--s-3); grid-template-columns: minmax(0, 1fr); align-items: start; }
  .c-footer__cards > * { min-width: 0; }
  @media (min-width: 900px) { .c-footer__cards { grid-template-columns: 1fr 1fr; } }
  .c-footer__card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); padding: var(--s-6); display: flex; flex-direction: column; justify-content: space-between; gap: var(--s-6); min-width: 0; }
  @media (min-width: 480px) { .c-footer__card { padding: var(--s-8); gap: var(--s-8); } }

  .c-footer__linkgrid { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--s-6); }
  @media (min-width: 900px) { .c-footer__linkgrid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
  .c-footer__linkgrid h3 { font-size: var(--step--1); text-transform: uppercase; letter-spacing: 0.1em; color: var(--ink-mute); font-weight: var(--w-display); margin: 0 0 var(--s-3); }
  .c-footer__linkgrid a { display: block; padding-block: var(--s-1); color: var(--ink-soft); text-decoration: none; font-size: var(--step-0); }
  .c-footer__linkgrid a:hover { color: var(--brick); }
  .c-footer__brandlink { display: inline-flex; align-items: center; gap: var(--s-3); text-decoration: none; color: var(--ink); }
  .c-footer__brandlink img { width: 40px; height: 40px; border-radius: var(--radius); flex: none; }
  .c-footer__brandlink span { font-weight: var(--w-display); font-size: var(--step-1); letter-spacing: -0.02em; }

  .c-footer__cta { gap: var(--s-8); }
  .c-footer__ctatop { display: flex; flex-wrap: wrap; align-items: start; justify-content: space-between; gap: var(--s-4); }
  .c-footer__cta h3 { margin: 0; font-size: var(--step-2); line-height: 1.12; max-width: 16ch; }
  .c-footer__ctasub { margin: var(--s-2) 0 0; color: var(--ink-soft); font-size: var(--step-0); max-width: 34ch; }
  /* Honest trust row (no invented stats). */
  .c-footer__trustrow { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--s-3); grid-template-columns: 1fr; }
  @media (min-width: 480px) { .c-footer__trustrow { grid-template-columns: 1fr 1fr; column-gap: var(--s-6); } }
  .c-footer__trustrow li { display: flex; align-items: flex-start; gap: var(--s-3); color: var(--ink); font-weight: var(--w-display); font-size: var(--step-0); }
  .c-footer__trustrow svg { flex: none; width: var(--icon-md); height: var(--icon-md); color: var(--brick); margin-block-start: 2px; }

  .c-footer__companyhead { margin-block-end: var(--s-4); }
  .c-footer__companyhead h4 { margin: 0; font-size: var(--step-1); font-weight: var(--w-display); color: var(--ink); }
  .c-footer__companyhead span { color: var(--ink-mute); font-size: var(--step--1); }

  .c-footer__loc { display: flex; gap: var(--s-6); align-items: flex-start; justify-content: space-between; flex-wrap: wrap; }
  .c-footer__qr { text-align: center; order: 2; }
  .c-footer__qr img { width: 132px; height: auto; border-radius: var(--radius); border: 1px solid var(--line); background: #FFFFFF; padding: 5px; }
  .c-footer__qr span { display: block; margin-block-start: var(--s-2); font-size: calc(var(--step--1) - 1px); color: var(--ink-mute); max-width: 16ch; margin-inline: auto; }
  /* 15rem as a flex-basis, not a floor: as min-width it plus the icon and
     gap exceeded the card interior on a 320px phone. */
  .c-contact { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--s-4); flex: 1 1 15rem; min-width: 0; }
  .c-contact li { display: flex; gap: var(--s-3); align-items: flex-start; line-height: 1.55; }
  .c-contact li > svg { flex: none; width: var(--icon-md); height: var(--icon-md); margin-block-start: 2px; color: var(--brick); }
  .c-contact__label { display: block; font-size: calc(var(--step--1) - 1px); text-transform: uppercase; letter-spacing: 0.08em; color: var(--ink-mute); font-weight: var(--w-display); margin-block-end: 1px; }
  /* Email addresses are one unbreakable token; without this they set the
     min-content width of the whole footer card. */
  .c-contact__val { color: var(--ink); font-size: var(--step-0); overflow-wrap: anywhere; }
  .c-contact li > div { min-width: 0; }
  .c-contact a.c-contact__val { text-decoration: none; }
  .c-contact a.c-contact__val:hover { color: var(--brick); }
  .c-footer__co { color: var(--ink); font-weight: var(--w-display); }

  .c-footer__bottom { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--s-4); padding-block-start: var(--s-6); border-block-start: 1px solid var(--line); }
  .c-footer__bottom p { margin: 0; color: var(--ink-soft); font-size: var(--step--1); line-height: 1.5; }
  .c-footer__badges { display: flex; flex-wrap: wrap; gap: var(--s-2); }
  .c-badge { display: inline-flex; align-items: center; gap: var(--s-2); padding: var(--s-2) var(--s-3); border: 1px solid var(--line); border-radius: var(--radius-pill); font-size: var(--step--1); color: var(--ink); background: var(--paper); }
  .c-badge svg { width: var(--icon-sm); height: var(--icon-sm); color: var(--brick); }

  .c-footer__legal { padding: var(--s-2) var(--s-4); font-size: var(--step--1); color: var(--ink-mute); text-align: center; }
  .c-footer__legal a { color: var(--brick); }

  @media (min-width: 480px) { .c-footer__bar { padding: var(--s-6) var(--s-8); } }

  /* Email addresses and the street address are long unbreakable runs that
     set the card's min-content width; without this the contact card is
     305px wide inside a 288px column on a 320px phone. */
  .c-infocard a, .c-infocard p, .c-infocard li { overflow-wrap: anywhere; min-width: 0; }

  /* Below 400px the wordmark, search, and burger together need ~340px in
     a 288px bar, which pushed the burger off-screen on every page. The
     drawer carries its own search field, so the header icon is redundant
     at that width and is the right thing to drop. */
  @media (max-width: 399px) {
    .c-header__bar { gap: var(--s-3); }
    .c-header__bar > .c-iconbtn { display: none; }
    .c-wordmark { min-width: 0; }
  }

  /* ===================================================================
     ILLUSTRATED DEVICES
     Ported from the v4 mockup. Every fill below resolves to a token that
     already flips in the dark block, so these get dark mode for free and
     add no new tokens. Each device is opt-in per page: it is only placed
     where that page's existing prose already contains the material for
     it, so most pages carry none of them.
     =================================================================== */

  /* Split hero: prose beside a drawn scene. Single column until there is
     room for both, so the H1 never competes with the illustration. */
  .c-herosplit { display: grid; gap: var(--s-8); align-items: center; }
  @media (min-width: 900px) {
    .c-herosplit { grid-template-columns: 1.15fr 0.85fr; gap: var(--s-12); }
  }
  /* .l-prose is normally a centred-measure grid. Inside the split it is
     already in a sized column, so it collapses to a single track and
     fills that column instead of centring a second time. */
  .c-herosplit > .l-prose { grid-template-columns: minmax(0, var(--measure)); }
  .c-herosplit > .l-prose > * { grid-column: 1; }

  .c-scene { position: relative; }
  /* Below 900px the hero is stacked (not a two-column split), so the scene
     is a full-width sibling of .l-prose inside .c-herosplit -- and .l-prose
     is the only one of the two capped to the measure column. Uncapped, the
     illustration's right edge ran up to 85px past the H1/paragraph above
     it and the body text below, once the viewport had room to be wider
     than the measure but not yet 900px for the two-column split. */
  @media (max-width: 899px) { .c-scene { max-width: var(--measure); } }
  .c-scene > svg { display: block; width: 100%; height: auto; }

  /* Badges sit on the scene at desktop. Below 900px the scene is narrower
     and an outward offset would hang off the page, so they tuck inward. */
  .c-scene__badge {
    position: absolute; display: inline-flex; align-items: center; gap: var(--s-2);
    padding: var(--s-2) var(--s-3); border-radius: var(--radius-pill);
    background: var(--surface); border: 1px solid var(--line); box-shadow: var(--shadow);
    font-size: var(--step--1); font-weight: var(--w-display); color: var(--ink); white-space: nowrap;
  }
  .c-scene__badge svg { width: var(--icon-sm); height: var(--icon-sm); flex: none; color: var(--ok); }
  .c-scene__badge--a { inset-block-start: var(--s-2); inset-inline-end: var(--s-2); }
  .c-scene__badge--b { inset-block-end: var(--s-3); inset-inline-start: var(--s-2); }
  @media (min-width: 900px) {
    .c-scene__badge--b { inset-inline-start: calc(var(--s-2) * -1); }
  }

  /* Pure decoration: a repeating lattice with no words and no meaning
     tied to any one topic, so it is the one device safe to reuse freely.
     Held to the page container rather than running to the viewport edge. */
  .c-lattice {
    height: 26px; background: var(--paper);
    max-width: var(--wrap); margin-inline: auto;
    padding-inline: var(--gutter);
  }
  .c-lattice svg { display: block; width: 100%; height: 100%; }

  /* Large-type moment. The big line must be a sentence the page already
     had, set larger, never a new line written to fill the slot. */
  .c-statline { display: grid; gap: var(--s-6); align-items: center; margin-block-start: var(--s-8); }
  @media (min-width: 768px) {
    .c-statline { grid-template-columns: auto 1fr; gap: var(--s-8); }
  }
  .c-statline__num {
    font-family: var(--font-mono); font-weight: var(--w-display); color: var(--brick);
    font-size: clamp(3rem, 14vw, 6rem); line-height: 1; letter-spacing: -.03em;
  }
  .c-statline__unit { font-size: var(--step--1); font-weight: var(--w-display); text-transform: uppercase; letter-spacing: .1em; color: var(--ink-mute); margin: 0; }
  @media (min-width: 768px) { .c-statline__num, .c-statline__unit { text-align: center; } }
  /* Stays inside the measure rather than breaking out: a bare numeral at
     the gutter would put a third left edge on the page. */
  .c-statline__big { font-size: var(--step-1); font-weight: var(--w-display); line-height: 1.35; color: var(--ink); margin-block-end: var(--s-3); }
  .c-statline p:last-child { margin-block-end: 0; color: var(--ink-soft); }

  /* Location module. Only for a page that argues from a real named place
     already in its own copy. */
  /* Contained, like .c-est and .c-fork. A full-bleed device has to be a
     visible panel: bare prose at the gutter reads as a broken measure
     rather than as a deliberate breakout. */
     The panel sits in the measure column, so it is roughly 60ch wide at
     every viewport above ~640px. That is too narrow to split in two and
     keep either half readable, so the copy and the map stack. */
  .c-map {
    display: grid; gap: var(--s-6); align-items: start;
    background: var(--surface); border: 1px solid var(--line);
    border-radius: var(--radius-lg); padding: var(--s-6);
    margin-block-start: var(--s-8);
  }
  @media (min-width: 640px) { .c-map { padding: var(--s-8); } }
  .c-map > div > :first-child { margin-block-start: 0; }
  .c-map__tags { display: flex; flex-wrap: wrap; gap: var(--s-2); margin-block-start: var(--s-4); padding: 0; list-style: none; }
  .c-map__tags li {
    padding: var(--s-2) var(--s-3); border: 1px solid var(--line); border-radius: var(--radius-pill);
    background: var(--paper); font-size: var(--step--1); font-weight: var(--w-display); color: var(--ink);
  }
  .c-map__card { background: var(--paper); border: 1px solid var(--line); border-radius: var(--radius); padding: var(--s-4); }
  /* Capped: stacked in the measure column the map would otherwise render
     ~420px tall and dominate the section it illustrates. */
  .c-map__card svg { display: block; width: 100%; max-width: 420px; height: auto; margin-inline: auto; }

  /* Option comparison. Sized by however many options the page actually
     describes: two panels for two, three for three. Never pad to a set. */
  .c-options { display: grid; gap: var(--s-4); margin-block-start: var(--s-8); }
  .c-options--2 { --options-cols: 2; }
  /* 640px, not 900px: the panels live in the measure column now, whose
     width stops growing once the viewport passes it. Waiting for 900
     would leave them stacked on every desktop. */
  @media (min-width: 640px) {
    .c-options { grid-template-columns: repeat(var(--options-cols, 3), minmax(0, 1fr)); align-items: stretch; }
    /* Three panels inside the measure column leave ~170px of copy each at
       the standard padding, which wraps the verdict pills onto three
       lines. The three-up case gets a tighter box; two-up has room. */
    .c-options:not(.c-options--2) { gap: var(--s-3); }
    .c-options:not(.c-options--2) .c-options__band { padding: var(--s-4); gap: var(--s-2); }
    .c-options:not(.c-options--2) .c-options__ic { width: var(--chip-sm); height: var(--chip-sm); }
    .c-options:not(.c-options--2) .c-options__ic svg { width: var(--icon-sm); height: var(--icon-sm); }
  }
  .c-options__band {
    background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg);
    padding: var(--s-6); display: flex; flex-direction: column; gap: var(--s-3);
  }
  .c-options__name { font-size: var(--step-0); font-weight: var(--w-display); color: var(--ink); margin: 0; }
  .c-options__band p { font-size: var(--step--1); color: var(--ink-soft); margin: 0; }
  .c-options__ic {
    width: var(--chip-md); height: var(--chip-md); border-radius: var(--radius);
    background: var(--surface-2); color: var(--ink-mute);
    display: flex; align-items: center; justify-content: center;
  }
  .c-options__ic svg { width: var(--icon-md); height: var(--icon-md); }
  .c-options__band--pick { border: 2px solid var(--brick); box-shadow: var(--shadow); position: relative; }
  .c-options__band--pick .c-options__ic { background: var(--brick-wash); color: var(--brick-hover); }
  .c-verdict {
    margin-block-start: auto; align-self: flex-start;
    font-size: var(--step--1); font-weight: var(--w-display);
    padding: var(--s-1) var(--s-3); border-radius: var(--radius-pill);
  }
  .c-verdict--risk { background: var(--stop-wash); color: var(--stop); }
  .c-verdict--good { background: var(--ok-wash); color: var(--ok); }
  .c-verdict--check { background: var(--warn-wash); color: var(--warn); }

  /* Reserved device: the connected node flow. Assigned to
     /yiwu/company-cancellation/ alone, because that page's content is a
     strict ordered dependency chain where the order is the whole point.
     Do not place this anywhere else. */
  .c-flow {
    background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg);
    box-shadow: var(--shadow); padding: var(--s-6) var(--s-4);
    margin-block-start: var(--s-8);
  }
  @media (min-width: 640px) { .c-flow { padding: var(--s-8) var(--s-6) var(--s-6); } }

  /* Phones read the chain as a vertical list with a rail down the left,
     which is what an ordered sequence wants when there is no width for
     four columns. It goes horizontal once the container can hold them. */
  .c-flow__track { display: grid; gap: var(--s-4); position: relative; margin: 0; padding: 0; list-style: none; }
  .c-flow__node { position: relative; display: grid; grid-template-columns: 48px 1fr; gap: var(--s-4); align-items: center; }
  .c-flow__node:not(:last-child)::after {
    content: ""; position: absolute; inset-inline-start: 23px;
    inset-block-start: 48px; height: var(--s-4); width: 2px; background: var(--line);
  }
  .c-flow__circle {
    width: 48px; height: 48px; border-radius: 50%; margin: 0;
    background: var(--surface); border: 2px solid var(--line-firm); color: var(--ink-mute);
    display: flex; align-items: center; justify-content: center;
  }
  .c-flow__circle svg { width: var(--icon-md); height: var(--icon-md); }
  .c-flow__name { font-size: var(--step--1); font-weight: var(--w-display); color: var(--ink); margin: 0 0 2px; }
  .c-flow__node p { font-size: var(--step--1); color: var(--ink-mute); margin: 0; }

  @media (min-width: 640px) {
    .c-flow__track { grid-auto-flow: column; grid-auto-columns: 1fr; gap: var(--s-2); align-items: start; }
    .c-flow__node { grid-template-columns: 1fr; gap: 0; text-align: center; }
    /* The connector sits behind the nodes and stops short of both ends so
       it reads as a rule between them, not an underline beneath them. */
    .c-flow__node:not(:last-child)::after {
      inset-inline-start: calc(50% + 28px); inset-inline-end: calc(-50% + 28px);
      inset-block-start: 27px; width: auto; height: 2px;
    }
    .c-flow__circle { width: 56px; height: 56px; margin: 0 auto var(--s-3); }
    .c-flow__circle svg { width: var(--icon-lg); height: var(--icon-lg); }
    .c-flow__node p { max-width: 16ch; margin-inline: auto; }
  }
  .c-flow__node--crux .c-flow__circle { background: var(--seal); border-color: var(--seal-ink); color: var(--paper); box-shadow: 0 0 0 6px var(--seal-wash); }
  .c-flow__node--crux .c-flow__name { color: var(--seal); }
  .c-flow__note { text-align: center; font-size: var(--step-0); color: var(--seal); font-weight: var(--w-display); margin: var(--s-6) 0 0; padding-block-start: var(--s-6); border-block-start: 1px dashed var(--line); }
}

/* =====================================================================
   UTILITIES  |  .u-  the only layer where !important is allowed
   ===================================================================== */
@layer utilities {
  .u-visually-hidden {
    position: absolute !important; width: 1px !important; height: 1px !important;
    padding: 0 !important; margin: -1px !important; overflow: hidden !important;
    clip: rect(0 0 0 0) !important; white-space: nowrap !important; border: 0 !important;
  }
  .u-center { text-align: center !important; }
  .u-nowrap { white-space: nowrap !important; }
  .u-w-full { width: 100% !important; }
  .u-mt-0 { margin-block-start: 0 !important; }
  .u-tnum { font-variant-numeric: tabular-nums !important; }
  .u-hp { position: absolute !important; left: -9999px !important; width: 1px !important; height: 1px !important; overflow: hidden !important; }
  [hidden] { display: none !important; }
}
