
/* ═══ DBS One — the design system ═════════════════════════════════════════
   Datche red #D5030C, sampled edge-for-edge from the logo. Fraunces for display,
   Inter for interface, JetBrains Mono for anything a machine printed.
   Written once here; every page reads it. ════════════════════════════════ */
:root{
  --red:#D5030C; --red-d:#A80209; --red-l:#F2565D; --red-p:#FCA9AD;
  --red-bg:#FDEEEF; --red-ln:#F7D2D4;
  --night:#0E1116; --night-2:#141A21; --night-3:#1B222B;
  --ink:#14161A; --ink-1:#22252B; --ink-2:#3A3D45; --ink-3:#5D606A; --ink-4:#6A6D77;
  --cream:#F7F6F3; --panel:#FFF; --sunk:#F1F2F0; --bg:#F7F6F3;
  --rule:#E4E2DC; --rule-2:#EFEDE8; --rule-f:#CDD0D4;
  --ok:#0F7B5A; --ok-bg:#E8F5EF; --ok-ln:#B9E0CE;
  --hold:#9A6207; --hold-bg:#FCF3E3; --hold-ln:#EFD9AE;
  --amber:#F5B92E;
  --r:12px; --r-s:9px; --r-l:16px;
  --shadow:0 1px 2px rgba(16,18,22,.05), 0 8px 26px rgba(16,18,22,.07);
  --shadow-l:0 2px 4px rgba(16,18,22,.06), 0 18px 48px rgba(16,18,22,.11);
  --ease:cubic-bezier(.22,.61,.36,1);
  --grid:rgba(16,18,24,.045);
}
*{box-sizing:border-box;margin:0;padding:0}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth;scroll-padding-top:86px}
body{font-family:Inter,system-ui,-apple-system,"Segoe UI",sans-serif;font-size:16px;
  line-height:1.6;color:var(--ink);background:var(--panel);
  -webkit-font-smoothing:antialiased;overflow-x:hidden}
a{color:inherit;text-decoration:none}
img,svg{max-width:100%}
.wrap{max-width:1240px;margin:0 auto;padding:0 32px;position:relative}

/* ── the column grid ──────────────────────────────────────────────────────
   Four hairlines on the page's own column boundaries, behind everything. It is
   almost invisible and it is a surprising amount of why a page reads as drawn
   rather than assembled — every edge on the page now lines up with something.
   Off on a phone, where four rules in 350px is noise. */
.wrap::before{content:"";position:absolute;inset:0;pointer-events:none;z-index:0;
  background:repeating-linear-gradient(90deg,
    var(--grid) 0 1px, transparent 1px calc((100% - 64px) / 4));
  background-position:32px 0;background-size:calc(100% - 64px) 100%;
  background-repeat:no-repeat}
.wrap > *{position:relative;z-index:1}
@media(max-width:820px){.wrap::before{display:none}}
.wrap.narrow{max-width:960px}
.mono{font-family:'JetBrains Mono',ui-monospace,monospace}
.serif{font-family:Fraunces,Georgia,serif}
.num{font-variant-numeric:tabular-nums}
.skip{position:absolute;left:-9999px;top:0;background:var(--red);color:#fff;padding:10px 16px;
  z-index:200;border-radius:0 0 8px 0}
.skip:focus{left:0}
:focus-visible{outline:2px solid var(--red);outline-offset:2px;border-radius:3px}

/* ── type ─────────────────────────────────────────────────────────────── */
h1,h2,h3{font-family:Fraunces,Georgia,serif;font-weight:600;letter-spacing:-.022em;
  line-height:1.08;text-wrap:balance}
/* ── the scale, measured against Stripe ────────────────────────────────────
   Their h1 is 48px on a 390px phone and 56px on a 1440px desktop — a 17% range.
   Ours was 38px and 60px: BIGGER than theirs on a desktop and ten pixels smaller
   on a phone, which is exactly backwards and most of why this read as cramped on
   a phone and shouty on a laptop. A headline that barely shrinks is the single
   loudest thing separating a confident mobile layout from a cramped one.
   Each clamp below hits its floor at 390px and its ceiling at 1440px. */
h1{font-size:clamp(46px,.95vw + 42.3px,56px);line-height:1.1}
h2{font-size:clamp(34px,.76vw + 31px,42px);line-height:1.12}
h3{font-size:clamp(21px,.29vw + 19.9px,24px);line-height:1.24;letter-spacing:-.018em}
/* The look of a fourth-level heading, available as a class.
   Card and step titles sit inside sections whose head is an h2, so an <h4> there skips
   a level and the document outline lies about the structure — a screen reader reading
   the headings alone gets a list with a hole in it. They are h3 elements now, wearing
   this. */
h4,.h4{font-family:Inter,sans-serif;font-size:17px;font-weight:600;
  letter-spacing:-.012em;line-height:1.35}
p{text-wrap:pretty}
.em{color:var(--red)}
/* A coloured clause that carries the turn in the sentence gets its own line. Left to
   wrap, "…the Philippines you / can just ask" strands one word of the phrase on the
   line above it, which on a phone is the first thing anybody sees.
   Whatever punctuation ends the sentence goes INSIDE this span: a block element leaves
   any trailing character behind on a line of its own, and a lone full stop at 56px
   renders as a large dot under the headline. */
.em.turn{display:block}
.onDark .em,.dark .em{color:var(--red-p)}
.eyebrow{font-family:'JetBrains Mono',monospace;font-size:11.5px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--red);font-weight:500;display:flex;gap:10px;
  align-items:flex-start;line-height:1.5}
/* Aligned to the FIRST line, not to the middle of the block: an eyebrow that wraps
   on a phone otherwise hangs its rule between the two lines. */
.eyebrow::before{content:"";width:22px;height:1.5px;background:var(--red);flex:none;
  margin-top:.72em}
.dark .eyebrow{color:var(--red-l)} .dark .eyebrow::before{background:var(--red-l)}
.lede{font-size:clamp(18px,.19vw + 17.3px,20px);line-height:1.58;color:var(--ink-3);max-width:33em}
/* ── measure ──────────────────────────────────────────────────────────────
   Somewhere between 45 and 75 characters a line the eye stops losing its place on
   the return sweep; past that it does. Measured across the site, FAQ answers were
   running 88 to 117 characters and one note reached 124, because nothing stopped a
   paragraph filling an 1122px container. Stripe hold 35-55 throughout.
   `ch` is the width of a zero in the current font, so this scales with the type
   rather than freezing a pixel width that is only right at one size. */
.faqa p,.callout p,.bill-note,.probl p,.whatis p,.appfoot,
.calc-gap p,.sgroup > .sg-head p,.stepside p,.lede{max-width:33em}
/* `em`, not `ch`. A `ch` is the width of a ZERO, and in Inter a zero is around 0.69em
   while the average character in running prose is about 0.47em — so 64ch measured out
   at 94 characters a line rather than the 64 it looks like it promises. In em the sum
   is direct: 33em / 0.47 is roughly 70 characters, at any size, in any of the three
   faces on this site. */
.dark .lede{color:#B7BCC6}

/* ── buttons ──────────────────────────────────────────────────────────── */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;height:46px;
  padding:0 21px;border-radius:var(--r-s);border:1px solid var(--red);background:var(--red);
  color:#fff;font:inherit;font-size:15px;font-weight:500;cursor:pointer;white-space:nowrap;
  transition:background .15s var(--ease),border-color .15s,transform .12s}
.btn:hover{background:var(--red-d);border-color:var(--red-d)}
.btn:active{transform:translateY(1px)}
.btn.ghost{background:transparent;color:var(--ink);border-color:var(--rule-f)}
.btn.ghost:hover{background:var(--sunk);border-color:var(--ink-4)}
.btn.onDark{background:#fff;color:var(--night);border-color:#fff}
.btn.onDark:hover{background:#E8ECF1;border-color:#E8ECF1}
.btn.onDark.ghost{background:transparent;color:#fff;border-color:rgba(255,255,255,.3)}
.btn.onDark.ghost:hover{background:rgba(255,255,255,.1)}
.btn.sm{height:38px;padding:0 15px;font-size:14px}
.btn.lg{height:54px;padding:0 26px;font-size:16.5px}
.tlink{color:var(--red);font-weight:500;display:inline-flex;align-items:center;gap:6px;
  min-height:34px}
.tlink::after{content:"→";transition:transform .16s var(--ease)}
.tlink:hover::after{transform:translateX(3px)}

/* ── the bar ──────────────────────────────────────────────────────────────
   Scoped to #nav, never to the element. A breadcrumb is a <nav> too, and a bare
   element selector gave it the header's sticky white bar across the hero. */
#nav{position:sticky;top:0;z-index:90;background:rgba(255,255,255,.94);
  backdrop-filter:saturate(180%) blur(14px);border-bottom:1px solid var(--rule)}
#nav > .wrap{display:flex;align-items:center;gap:28px;height:70px;position:relative}
.logo{display:flex;align-items:center;gap:11px;flex:none;padding:8px 0}
.logo .mk{width:30px;height:30px;flex:none;display:block}
.logo .nm{font-weight:600;font-size:18px;letter-spacing:-.02em;display:block}
.logo .by{font-size:10.5px;color:var(--ink-4);letter-spacing:.07em;text-transform:uppercase;
  font-weight:500;display:block;margin-top:1px}
#nav .links{display:flex;gap:4px;margin-left:auto;align-items:center}
#nav .links > a:not(.btn){font-size:14.5px;color:var(--ink-2);font-weight:450;white-space:nowrap;
  padding:9px 12px;border-radius:7px}
#nav .links > a:not(.btn):hover{color:var(--ink);background:var(--sunk)}
#nav .links > a.on{color:var(--red);font-weight:500}
#nav .links .btn{margin-left:10px}
.dropb{font:inherit;font-size:14.5px;color:var(--ink-2);font-weight:450;background:none;
  border:0;cursor:pointer;padding:9px 12px;border-radius:7px;display:flex;align-items:center;gap:7px}
.dropb:hover,.drop[data-open] .dropb{color:var(--ink);background:var(--sunk)}
.dropb.on{color:var(--red);font-weight:500}
.car{width:8px;height:8px;border-right:1.6px solid currentColor;border-bottom:1.6px solid currentColor;
  transform:rotate(45deg) translate(-2px,-2px);transition:transform .18s var(--ease);opacity:.65}
.drop[data-open] .car{transform:rotate(-135deg) translate(-3px,-3px)}
.drop{position:static}

/* ── the mega panel ───────────────────────────────────────────────────────
   A floating card anchored to its trigger, not a slab across the window. It is
   lighter, it points at the thing that opened it, and it lets the page behind
   stay visible — which is what stops a menu this large feeling like a wall. */
.drop{position:relative}
/* Centred under its trigger, and never wider than the window. At 1180px the Solutions
   panel is 1002px and the trigger sits well right of centre, so the panel reached
   1267px and the document reported a sideways scroll — hidden in practice only because
   the body clips it, which is papering over the geometry rather than fixing it. The
   clamp keeps it inside at every width, and it is a hidden element the rest of the
   time, so it must not shape the page it is sitting on. */
.mm{position:absolute;top:calc(100% + 10px);left:50%;
  transform:translateX(calc(-50% + var(--mm-shift, 0px))) translateY(-6px);
  max-width:calc(100vw - 32px);
  background:var(--panel);border:1px solid var(--rule);border-radius:16px;
  box-shadow:0 4px 10px rgba(16,18,22,.06),0 24px 60px rgba(16,18,22,.16);
  opacity:0;visibility:hidden;pointer-events:none;
  transition:opacity .2s var(--ease),transform .2s var(--ease),visibility .2s}
.drop[data-open] .mm{opacity:1;visibility:visible;pointer-events:auto;
  transform:translateX(calc(-50% + var(--mm-shift, 0px))) translateY(0)}
/* The pointer's bridge: without it, moving the mouse from the trigger to the panel
   crosses a 10px gap with no element under it and the panel closes on the way. */
.mm::before{content:"";position:absolute;left:0;right:0;top:-12px;height:12px}
.mm::after{content:"";position:absolute;top:-7px;
  left:calc(50% - var(--mm-shift, 0px));margin-left:-7px;width:13px;height:13px;
  background:var(--panel);border-left:1px solid var(--rule);border-top:1px solid var(--rule);
  transform:rotate(45deg);border-radius:3px 0 0 0}

.mmgrid{display:grid;grid-template-columns:232px 1fr;gap:26px;padding:24px;width:max-content;
  max-width:min(92vw,880px)}
.mmgrid.sol{grid-template-columns:216px 1fr;max-width:min(94vw,1000px)}
.mmside{border-right:1px solid var(--rule-2);padding-right:24px}
.mmside-h{font-family:Fraunces,Georgia,serif;font-size:19px;font-weight:600;
  letter-spacing:-.02em;margin-bottom:8px;line-height:1.2}
.mmside p{font-size:13.2px;color:var(--ink-4);line-height:1.55;margin-bottom:14px}
.mmall{color:var(--red);font-weight:550;font-size:13.5px}
.mmall:hover{color:var(--red-d)}
/* The rail's lower half was empty and the eye found the hole before the links.
   One featured destination fills it and earns its place. */
.mmfeat{display:block;margin-top:20px;padding:13px 14px;border-radius:11px;
  background:var(--cream);border:1px solid var(--rule-2);transition:border-color .14s,background .14s}
.mmfeat:hover{border-color:var(--red-ln);background:var(--red-bg)}
.mf-k{display:block;font-family:'JetBrains Mono',monospace;font-size:9.5px;letter-spacing:.13em;
  text-transform:uppercase;color:var(--red);margin-bottom:5px}
.mf-n{display:block;font-size:14px;font-weight:600;letter-spacing:-.01em;margin-bottom:4px}
.mf-b{display:block;font-size:12px;color:var(--ink-4);line-height:1.45}

.mmcols{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:2px;align-content:start}
.mmcols.sol{grid-template-columns:repeat(4,minmax(0,1fr));gap:0 12px;align-items:start}
.mmcol{display:block}
.mmc,.mml{display:block;padding:9px 11px;border-radius:9px;transition:background .13s}
.mmc:hover,.mml:hover{background:var(--sunk)}
.mmc.on,.mml.on{background:var(--red-bg)}
.mmn{display:block;font-size:14px;font-weight:550;color:var(--ink);letter-spacing:-.008em;
  line-height:1.3}
.mmc.on .mmn,.mml.on .mmn{color:var(--red-d)}
.mmb{display:block;font-size:12.2px;color:var(--ink-4);line-height:1.4;margin-top:2px}
.mmgroup{margin-bottom:2px}
.mmg-h{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:.13em;
  text-transform:uppercase;color:var(--ink-4);padding:0 11px;margin:12px 0 5px}
.mmgroup:first-child .mmg-h{margin-top:0}
.mmcols.sol .mml{padding:7px 11px}
.mmcols.sol .mmb{display:none}

/* ── the drawer ───────────────────────────────────────────────────────── */
.burger{display:none;margin-left:auto;background:none;border:0;cursor:pointer;padding:10px;
  flex-direction:column;gap:4.5px}
.burger span{display:block;width:20px;height:1.8px;background:var(--ink);border-radius:2px;
  transition:transform .2s var(--ease),opacity .15s}
.burger[aria-expanded="true"] span:nth-child(1){transform:translateY(6.3px) rotate(45deg)}
.burger[aria-expanded="true"] span:nth-child(2){opacity:0}
.burger[aria-expanded="true"] span:nth-child(3){transform:translateY(-6.3px) rotate(-45deg)}
.drawer{position:fixed;inset:70px 0 0;background:var(--panel);z-index:85;
  border-top:1px solid var(--rule);display:flex;flex-direction:column}
.drawer[hidden]{display:none}
.dr-in{padding:8px 20px 24px;overflow-y:auto;flex:1;-webkit-overflow-scrolling:touch}

/* Each group is closed until it is asked for, so the whole architecture is one
   screen and the button that matters is always in the same place at the bottom. */
.dr-sec{border-bottom:1px solid var(--rule-2)}
.dr-sec > summary{display:flex;align-items:baseline;gap:10px;padding:17px 34px 17px 0;
  cursor:pointer;list-style:none;position:relative;font-size:18px;font-weight:600;
  letter-spacing:-.015em}
.dr-sec > summary::-webkit-details-marker{display:none}
.dr-sec > summary::after{content:"";position:absolute;right:6px;top:24px;width:9px;height:9px;
  border-right:1.9px solid var(--ink-4);border-bottom:1.9px solid var(--ink-4);
  transform:rotate(45deg);transition:transform .18s var(--ease)}
.dr-sec[open] > summary::after{transform:rotate(-135deg);top:27px}
.dr-sec[open] > summary{color:var(--red)}
.dr-c{font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.11em;
  text-transform:uppercase;color:var(--ink-4);font-weight:500}
.dr-list{padding:0 0 14px}
.dr-list > a{display:block;padding:11px 0 11px 14px;border-left:2px solid var(--rule)}
.dr-list > a:active{border-left-color:var(--red)}
.dr-n{display:block;font-size:16px;font-weight:500;color:var(--ink)}
.dr-b{display:block;font-size:13px;color:var(--ink-4);line-height:1.45;margin-top:2px}
.dr-g{font-family:'JetBrains Mono',monospace;font-size:10px;letter-spacing:.12em;
  text-transform:uppercase;color:var(--ink-4);font-weight:500;margin:16px 0 4px}
.dr-g:first-child{margin-top:6px}
.dr-all{color:var(--red)!important;font-weight:500;font-size:15px;
  border-left-color:transparent!important}
.dr-flat{display:block;padding:17px 0;border-bottom:1px solid var(--rule-2);
  font-size:18px;font-weight:600;letter-spacing:-.015em}
.dr-flat.on{color:var(--red)}
.dr-flat span{display:block;font-size:13px;color:var(--ink-4);font-weight:400;
  letter-spacing:0;margin-top:2px}
/* The action sits on the floor of the drawer, not at the end of a 37-item scroll. */
.dr-foot{flex:none;padding:16px 20px calc(18px + env(safe-area-inset-bottom));
  border-top:1px solid var(--rule);background:var(--panel);display:grid;gap:10px;
  box-shadow:0 -10px 24px rgba(16,18,24,.06)}
.dr-foot .btn{width:100%;height:52px;font-size:16.5px}
.dr-tel{text-align:center;font-size:15px;color:var(--ink-3);padding:6px 0}

@media(max-width:1080px){
  #nav .links,.mm{display:none}
  .burger{display:flex}
  .logo .by{display:none}
}

/* ── sections ─────────────────────────────────────────────────────────── */
section{padding:clamp(64px,8vw,104px) 0}
section.tight{padding:clamp(44px,5vw,64px) 0}
section.cream{background:var(--cream)}
section.dark{background:var(--night);color:#fff}
section.dark h1,section.dark h2,section.dark h3{color:#fff}
section.dark p{color:#B7BCC6}
.shead{max-width:720px;margin-bottom:clamp(34px,4vw,52px)}
.shead .eyebrow{margin-bottom:16px}
.shead h2{margin-bottom:16px}
.shead.center{margin-left:auto;margin-right:auto;text-align:center}
.shead.center .eyebrow{justify-content:center}

/* ── cards ────────────────────────────────────────────────────────────── */
.grid{display:grid;gap:18px}
.g2{grid-template-columns:repeat(2,1fr)}
.g3{grid-template-columns:repeat(3,1fr)}
.g4{grid-template-columns:repeat(4,1fr)}
.card{background:var(--panel);border:1px solid var(--rule);border-radius:var(--r);
  padding:24px 24px 26px}
.dark .card{background:var(--night-2);border-color:rgba(255,255,255,.1)}
.card h4{margin-bottom:8px}
.card p{font-size:14.6px;color:var(--ink-3);line-height:1.6}
.dark .card p{color:#9AA0AC}
.card.lift{transition:transform .18s var(--ease),box-shadow .18s var(--ease),border-color .18s}
.card.lift:hover{transform:translateY(-3px);box-shadow:var(--shadow);border-color:var(--rule-f)}
.cardlink{display:block}
.cardlink .more{margin-top:14px;font-size:14px;color:var(--red);font-weight:500}
.cardlink .more::after{content:" →"}

/* ── foot ─────────────────────────────────────────────────────────────── */
footer{background:var(--night);color:#9AA0AC;padding:62px 0 30px;font-size:14px}
.fgrid{display:grid;grid-template-columns:1.5fr 1fr 1fr 1fr 1.1fr;gap:34px}
.fbrand .logo{margin-bottom:14px}
.fbrand .logo .nm{color:#fff}
.fbrand p{max-width:18em;line-height:1.6;margin-bottom:18px}
.fdat .dm{display:inline-block;background:var(--red);color:#fff;padding:9px 12px;border-radius:5px}
.fdat .dm b{display:block;font-size:15px;font-weight:800;letter-spacing:.01em;line-height:1}
.fdat .dm i{display:block;font-size:7.4px;font-weight:700;font-style:normal;line-height:1.1;
  margin-top:2px;text-align:justify;text-align-last:justify}
.fcol h3{font-family:Inter,sans-serif;font-size:12px;letter-spacing:.1em;text-transform:uppercase;
  color:#fff;font-weight:600;margin-bottom:13px}
.fcol h3.sp{margin-top:24px}
.fcol a{display:block;padding:4px 0;line-height:1.5;transition:color .13s}
.fcol a:hover{color:#fff}
.fbase{display:flex;justify-content:space-between;gap:20px;flex-wrap:wrap;margin-top:46px;
  padding-top:22px;border-top:1px solid rgba(255,255,255,.1);font-size:13px;color:#6A6D77}

@media(max-width:1000px){.fgrid{grid-template-columns:repeat(2,1fr)}.g4{grid-template-columns:repeat(2,1fr)}
  .g3{grid-template-columns:repeat(2,1fr)}}
@media(max-width:700px){.wrap{padding:0 28px}.fgrid,.g2,.g3,.g4{grid-template-columns:1fr}
  .fbrand{grid-column:1}}
/* On a phone a pair of buttons at two different widths reads as an accident.
   One column, equal width, thumb-sized. */
@media(max-width:560px){
  .phero .cta,.ctabtns,.mid-cta{display:grid;grid-template-columns:1fr;gap:10px}
  .phero .cta .btn,.ctabtns .btn,.mid-cta .btn{width:100%}
  .btn.lg{height:52px;font-size:16px}
}
@media(prefers-reduced-motion:reduce){*{animation-duration:.01ms!important;
  animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto}}


/* ═══ page furniture ══════════════════════════════════════════════════════ */

/* ── arriving ─────────────────────────────────────────────────────────────
   Everything is laid out and readable first; this moves it the last few pixels.
   [data-wait] is only ever set by script, so a page with no script is finished. */
[data-wait]{opacity:0;transform:translateY(14px)}
[data-rise]{transition:opacity .5s var(--ease),transform .5s var(--ease)}
[data-shown]{opacity:1;transform:none}

/* ── page hero ────────────────────────────────────────────────────────── */
/* Trimmed. The headline sat 221px down from the top of its own section, which pushed
   the figure band — 30 days, no license, unlimited users, since 1978 — off the first
   screen on any laptop. Those four claims are the strongest thing on the page after
   the headline and they were only ever seen by somebody who scrolled. */
.phero{padding:clamp(36px,4vw,54px) 0 clamp(40px,4.4vw,60px);position:relative;overflow:hidden}
.phero.dark{background:var(--night);color:#fff}

/* ── the light hero, and why the whole page went light ────────────────────
   Measured: every Stripe use-case page moves between #FFFFFF and #F6F9FC — nine
   units of red apart — so no section boundary on the page is visible at all, and
   the contrast comes entirely from the content sitting on that one surface.
   Ours alternated #0E1116 and #F7F6F3, a 233-unit swing, SEVEN times down the
   home page. Every one of those joins read as a hard border, which is exactly
   what "you can tell there's still borders especially when we scroll down" was
   pointing at. It was never a gradient bug; it was the page being a stack of
   slabs. Dark now survives in one place only — the closing band — where a single
   change of ground reads as an ending rather than as a seam. */
.phero.light{color:var(--ink);
  background:linear-gradient(180deg,#F5F8FC 0%,#FAFBFD 52%,#FFF 100%)}
/* A composed field, the same idea as the dark one and a twentieth of the strength:
   enough that the card in front of the graphic has something to sit ON, far too
   little to read as a panel. */
.phero.light::before{content:"";position:absolute;inset:-40% -20% -30% -20%;
  pointer-events:none;
  background:
    radial-gradient(46% 50% at 76% 26%, rgba(213,3,12,.06), rgba(213,3,12,0) 70%),
    radial-gradient(54% 58% at 8% 76%, rgba(30,58,138,.05), rgba(30,58,138,0) 72%)}
.phero.light::after{content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(180deg,rgba(255,255,255,0) 72%,#FFF 100%)}
.phero.light .lede{color:var(--ink-3)}
.phero.light .hstats .l{color:var(--ink-4)}
.phero.light .crumb a,.phero.light .crumb span{color:var(--ink-4)}
.phero.light .crumb a:hover{color:var(--ink)}
.phero.light .crumb i,.phero.light .crumb em{color:var(--rule-f)}
/* ── the ground the hero sits on ──────────────────────────────────────────
   Two faint radials on near-black read as flat: everything on the page then sits on
   one plane and the whole thing looks like a wireframe. This is a composed field —
   a warm mass behind the graphic, a cold one under the words, and a vignette to hold
   the edges — so there is something for the card in front to sit ON. */
.phero.dark::before{content:"";position:absolute;inset:-30% -20% -40% -20%;
  pointer-events:none;
  background:
    radial-gradient(52% 58% at 76% 22%, rgba(213,3,12,.50), rgba(213,3,12,0) 70%),
    radial-gradient(44% 46% at 88% 62%, rgba(255,86,96,.20), rgba(255,86,96,0) 72%),
    radial-gradient(56% 60% at 12% 78%, rgba(30,58,138,.34), rgba(30,58,138,0) 72%),
    radial-gradient(40% 44% at 4% 16%, rgba(56,92,190,.16), rgba(56,92,190,0) 74%)}
/* ── behind a globe, the ground goes quiet ────────────────────────────────
   The warm mass above was built for the flat map, which needed something to sit
   on. A dot globe is the opposite: what makes Stripe's read is that the ocean is
   EMPTY, so the land is the only thing there. A 50%-opacity red radial sitting
   exactly where the sphere lands washes the dots out to a smudge — which is what
   the first build looked like. Where a globe is present the field drops to a
   fraction of itself and the cold mass under the words stays, because the words
   still need it. */
.phero.dark:has(.heroglobe)::before{
  background:
    radial-gradient(54% 58% at 72% 44%, rgba(18,42,104,.44), rgba(18,42,104,0) 72%),
    radial-gradient(40% 44% at 86% 18%, rgba(213,3,12,.10), rgba(213,3,12,0) 70%),
    radial-gradient(56% 60% at 8% 78%, rgba(30,58,138,.26), rgba(30,58,138,0) 72%)}
/* The column grid is a device for TEXT. Run through a transparent canvas it puts
   three straight vertical rules across the middle of the globe, and a graphic
   sitting on graph paper reads as unfinished. Stripe keep their hairlines in the
   hero and keep them off the sphere. */
.phero:has(.heroglobe) .wrap::before{display:none}
.phero.dark:has(.heroglobe)::after{
  background:radial-gradient(130% 96% at 56% 42%, rgba(0,0,0,0) 46%, rgba(6,8,12,.66) 100%)}
.phero.light:has(.heroglobe)::before{
  background:
    radial-gradient(50% 54% at 72% 40%, rgba(30,58,138,.05), rgba(30,58,138,0) 72%),
    radial-gradient(38% 42% at 88% 16%, rgba(213,3,12,.04), rgba(213,3,12,0) 70%)}

/* The vignette, last, so the field never reaches a hard edge. */
.phero.dark::after{content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(120% 90% at 50% 40%, rgba(0,0,0,0) 38%, rgba(6,8,12,.72) 100%)}
.phero .wrap{position:relative;z-index:3}
.phero-grid{display:grid;grid-template-columns:1.02fr 1fr;gap:clamp(32px,4vw,56px);align-items:center}
/* A hero carrying a two-surface scene needs more room on the graphic side: four real
   columns of a register do not fit in 380px, and the figures were being cut off at
   the right where they matter most. The words lose 70px and lose nothing by it. */
@media(min-width:1100px){
  .phero-grid:has(.scene){grid-template-columns:.86fr 1.14fr}
}
.phero-grid.solo{grid-template-columns:minmax(0,860px)}
.phero h1{margin:16px 0 20px}
.phero .lede{margin-bottom:28px}
.phero .cta{display:flex;gap:12px;flex-wrap:wrap}
.phero.cream{background:var(--cream)}
/* The figure band sits under the WHOLE hero, not inside the left column: four
   labels sharing 500px wrapped to three ragged lines and read as an accident. */
.hstats{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:26px 30px;
  border-top:1px solid rgba(255,255,255,.14);padding-top:22px;
  margin-top:clamp(26px,2.8vw,38px)}
.phero.cream .hstats,.phero.light .hstats{border-top-color:var(--rule)}
.hstats > div{min-width:0}
.hstats .n{font-family:Fraunces,Georgia,serif;font-size:clamp(22px,2.4vw,30px);font-weight:600;
  line-height:1;letter-spacing:-.025em;margin-bottom:6px;white-space:nowrap}
.hstats .l{font-size:13.5px;color:#8E92A0;line-height:1.4}
.phero.cream .hstats .l{color:var(--ink-4)}

/* ── breadcrumb ───────────────────────────────────────────────────────── */
.crumb{display:flex;gap:8px;align-items:center;font-size:13px;margin-bottom:18px;flex-wrap:wrap}
.crumb a,.crumb span{padding:5px 0}
.crumb a,.crumb span{color:rgba(255,255,255,.6)}
.phero.cream .crumb a,.phero.cream .crumb span{color:var(--ink-4)}
.crumb a:hover{color:#fff}
.phero.cream .crumb a:hover{color:var(--ink)}
.crumb a::after{content:"/";margin-left:8px;opacity:.4}

/* ── feature rows ─────────────────────────────────────────────────────── */
.frow{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.12fr);
  gap:clamp(30px,4vw,60px);align-items:center;padding:clamp(34px,4vw,52px) 0;
  border-top:1px solid var(--rule)}
.frow:first-child{border-top:0;padding-top:0}
.frow.flip .fwords{order:2}
.frow .eyebrow{margin-bottom:14px}
.frow h3{margin-bottom:12px}
.frow p{color:var(--ink-3);font-size:16px;line-height:1.62;max-width:24em}
.frow .tlink{margin-top:16px}
.dark .frow{border-top-color:rgba(255,255,255,.1)}
.dark .frow p{color:#9AA0AC}

/* ── ticks ────────────────────────────────────────────────────────────── */
.ticks{list-style:none;display:grid;gap:9px;margin-top:16px}
.ticks li{position:relative;padding-left:26px;font-size:15px;line-height:1.55;color:var(--ink-2)}
.ticks li::before{content:"";position:absolute;left:0;top:7px;width:15px;height:15px;
  border-radius:50%;background:var(--red);
  -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M6.4 11.2 3.6 8.4l1-1 1.8 1.8 4.6-4.6 1 1z' fill='%23fff'/%3E%3Crect width='16' height='16' rx='8' fill='none'/%3E%3C/svg%3E") center/contain no-repeat;
  mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M6.4 11.2 3.6 8.4l1-1 1.8 1.8 4.6-4.6 1 1z' fill='%23fff'/%3E%3C/svg%3E") center/contain no-repeat;
  background:var(--red)}
.ticks li b,.ticks li strong{color:var(--ink);font-weight:600}
.dark .ticks li{color:#B7BCC6}
.dark .ticks li b,.dark .ticks li strong{color:#fff}
.dark .ticks li::before{background:var(--red-l)}

/* ── steps ────────────────────────────────────────────────────────────── */
.steps{list-style:none;display:grid;gap:4px;counter-reset:s}
.steps li{display:grid;grid-template-columns:34px 1fr;gap:18px;padding:18px 0;
  border-top:1px solid var(--rule);align-items:start}
.steps li:first-child{border-top:0}
.sn{font-family:'JetBrains Mono',monospace;font-size:13px;color:var(--red);font-weight:500;
  padding-top:2px}
.steps h4{margin-bottom:5px}
.steps p{font-size:15px;color:var(--ink-3);line-height:1.6;max-width:29em}
.dark .steps li{border-top-color:rgba(255,255,255,.1)}
.dark .steps p{color:#9AA0AC}

/* Four steps in a single left column left half the page empty. The words stay
   put while the sequence scrolls past them. */
.stepsplit{display:grid;grid-template-columns:minmax(0,.82fr) minmax(0,1.18fr);
  gap:clamp(36px,5vw,72px);align-items:start}
.stepside{position:sticky;top:98px}
.stepside > .shead{margin-bottom:20px}

/* ── stat band ────────────────────────────────────────────────────────── */
.statband{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--rule);
  border:1px solid var(--rule);border-radius:var(--r);overflow:hidden}
.statband > div{background:var(--panel);padding:24px 22px 26px}
.statband.dark{background:rgba(255,255,255,.1);border-color:rgba(255,255,255,.1)}
.statband.dark > div{background:var(--night-2)}
.bn{font-family:Fraunces,Georgia,serif;font-size:clamp(28px,3vw,36px);font-weight:600;
  line-height:1;letter-spacing:-.025em;margin-bottom:8px}
.statband.dark .bn{color:#fff}
.bl{font-size:11.5px;letter-spacing:.11em;text-transform:uppercase;color:var(--ink-4);
  font-weight:500;margin-bottom:7px}
.bd{font-size:14px;color:var(--ink-3);line-height:1.5}
.statband.dark .bd{color:#9AA0AC}

/* ── callout ──────────────────────────────────────────────────────────── */
.callout{display:grid;grid-template-columns:150px 1fr;gap:22px;border-left:3px solid var(--red);
  padding:18px 0 18px 22px;margin:28px 0}
.callout .ck{font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.12em;
  text-transform:uppercase;color:var(--red);font-weight:500;line-height:1.5}
.callout p{font-size:16px;line-height:1.62;color:var(--ink-2)}
.callout strong{color:var(--ink);font-weight:600}
.dark .callout p{color:#B7BCC6} .dark .callout strong{color:#fff}
.dark .callout{border-left-color:var(--red-l)} .dark .callout .ck{color:var(--red-l)}

/* ── faq ──────────────────────────────────────────────────────────────── */
.faqs{border-top:1px solid var(--rule)}
.faq{border-bottom:1px solid var(--rule)}
.faq summary{cursor:pointer;padding:18px 40px 18px 0;font-size:17px;font-weight:550;
  list-style:none;position:relative;letter-spacing:-.01em}
.faq summary::-webkit-details-marker{display:none}
.faq summary::after{content:"";position:absolute;right:6px;top:25px;width:10px;height:10px;
  border-right:1.8px solid var(--ink-4);border-bottom:1.8px solid var(--ink-4);
  transform:rotate(45deg);transition:transform .18s var(--ease)}
.faq[open] summary::after{transform:rotate(-135deg);top:28px}
.faq summary:hover{color:var(--red)}
.faqa{padding:0 60px 20px 0}
.faqa p{color:var(--ink-3);line-height:1.65;font-size:15.5px}

/* ── the closing band ─────────────────────────────────────────────────── */
.ctaband{background:var(--night);color:#fff;padding:clamp(52px,6vw,76px) 0}
.ctagrid{display:grid;grid-template-columns:1.4fr auto;gap:36px;align-items:center}
.ctaband h2{color:#fff;margin-bottom:12px}
.ctaband .lede{color:#B7BCC6;max-width:25em}
.ctabtns{display:flex;gap:12px;flex-wrap:wrap}

/* ── index tiles ──────────────────────────────────────────────────────── */
.tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(288px,1fr));gap:16px}
/* Eight trades in three columns leaves a two-card orphan row with a hole beside it.
   Four columns is two complete rows, so the set reads as a set. */
@media(min-width:1100px){.tiles.four{grid-template-columns:repeat(4,1fr)}}
@media(min-width:760px){.tiles.two{grid-template-columns:repeat(2,minmax(0,1fr))}}
.tiles.one{grid-template-columns:minmax(0,min(560px,100%))}
.tile{display:flex;flex-direction:column;border:1px solid var(--rule);border-radius:var(--r);
  padding:26px 24px 24px;background:var(--panel);
  transition:transform .18s var(--ease),box-shadow .18s,border-color .18s}
/* The link sits on one line across a row whatever the blurb above it runs to —
   otherwise four cards of equal height have their calls to action at four heights. */
.tile .more{margin-top:auto}
.tile:hover{transform:translateY(-3px);box-shadow:var(--shadow);border-color:var(--rule-f)}
.tile h3{font-size:20px;margin-bottom:8px}
.tile p{font-size:14.6px;color:var(--ink-3);line-height:1.58;margin-bottom:16px}
.tile .more{font-size:14px;color:var(--red);font-weight:500}
.tile .more::after{content:"\00A0→"}
.tilegroup{margin-bottom:46px}
.tilegroup > h3{font-family:Inter,sans-serif;font-size:12px;letter-spacing:.11em;
  text-transform:uppercase;color:var(--ink-4);font-weight:600;margin-bottom:16px}

.whatis .lede{max-width:33em;font-size:19px;color:var(--ink-2)}
.whatis .eyebrow{margin-bottom:12px}
.probl h2{margin:14px 0 16px;max-width:18em}
.probl .lede{max-width:30em}
.askgrid{list-style:none;display:grid;grid-template-columns:repeat(auto-fit,minmax(272px,1fr));
  gap:12px}
.askgrid li{background:var(--night-2);border:1px solid rgba(255,255,255,.1);border-radius:11px;
  padding:16px 18px;font-size:15px;line-height:1.5;color:#D4D8DF}
/* ── the enquiry form ─────────────────────────────────────────────────── */
.inq{background:var(--panel);border:1px solid var(--rule);border-radius:var(--r-l);
  padding:24px;box-shadow:var(--shadow);color:var(--ink);display:grid;gap:14px}
.inq-row{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.inq label{display:block;font-size:13px;font-weight:550;color:var(--ink-2)}
.inq label span{color:var(--red);margin-left:3px}
.inq input,.inq select,.inq textarea{display:block;width:100%;margin-top:6px;padding:11px 13px;
  font:inherit;font-size:15px;color:var(--ink);background:var(--panel);
  border:1px solid var(--rule-f);border-radius:var(--r-s);transition:border-color .14s,box-shadow .14s}
.inq textarea{resize:vertical;min-height:96px;line-height:1.5}
.inq select{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%235D606A' stroke-width='1.6' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 13px center;padding-right:34px}
.inq input:focus,.inq select:focus,.inq textarea:focus{outline:0;border-color:var(--red);
  box-shadow:0 0 0 3px var(--red-bg)}
.inq input[aria-invalid="true"],.inq textarea[aria-invalid="true"]{border-color:var(--red)}
.inq-foot{display:flex;gap:16px;align-items:center;flex-wrap:wrap;margin-top:4px}
.inq-foot .btn{flex:none}
.inq-note{font-size:12.5px;color:var(--ink-4);line-height:1.5;max-width:18em}
.inq-status{font-size:14px;line-height:1.55;padding:11px 14px;border-radius:var(--r-s);display:none}
.inq-status[data-state]{display:block}
.inq-status[data-state="ok"]{background:var(--ok-bg);color:var(--ok);border:1px solid var(--ok-ln)}
.inq-status[data-state="bad"]{background:var(--red-bg);color:var(--red-d);border:1px solid var(--red-ln)}
.inq-status[data-state="wait"]{background:var(--sunk);color:var(--ink-3)}
.inq .hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}

.findus{background:var(--cream);border:1px solid var(--rule);border-radius:var(--r-l);
  padding:clamp(28px,4vw,44px)}
.findus h3{margin:14px 0 14px;line-height:1.25}
.findus .lede{margin-bottom:16px;max-width:24em}
.findus{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,.75fr);
  gap:clamp(28px,4vw,56px);align-items:center}
.findus .office img{max-height:420px}
@media(max-width:860px){
  .findus{grid-template-columns:minmax(0,1fr)}
  .findus .office img{max-height:290px}
}
.findus-c{font-size:16px;margin-bottom:20px}
.findus-c a{color:var(--red);font-weight:500;display:inline-block;padding:5px 0}
.mid-cta{text-align:center;margin-top:32px}

.vis-hidden{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);
  clip-path:inset(50%);white-space:nowrap}

@media(max-width:900px){
  /* minmax(0,...) or the track grows to the widest thing inside it and takes the
     whole page sideways with it. */
  .phero-grid{grid-template-columns:minmax(0,1fr);gap:clamp(18px,4vw,30px)}
  .phero{padding-top:clamp(28px,7vw,48px);padding-bottom:clamp(30px,7vw,52px)}
  .phero .lede{margin-bottom:22px}
  .phero h1{margin:12px 0 16px}
  .frow,.frow.flip .fwords{grid-template-columns:1fr;order:0}
  .frow .fvis{order:2}
  .statband{grid-template-columns:repeat(2,1fr)}
  .ctagrid{grid-template-columns:1fr}
  .callout{grid-template-columns:1fr;gap:8px}
  .hstats{grid-template-columns:repeat(2,1fr);gap:22px 24px}
  .inq-row{grid-template-columns:1fr}
  /* Below 16px iOS zooms the page on focus and never zooms back out. */
  .inq input,.inq select,.inq textarea{font-size:16px;padding:12px 13px}
  .stepsplit{grid-template-columns:1fr;gap:0}
  .stepside{position:static;margin-bottom:clamp(28px,4vw,40px)}
}

/* ═══ the solutions index ═════════════════════════════════════════════════
   Twenty-two identical white cards saying "See the page" is a list, and a list is
   what a buyer scrolls past. Each group gets a number, a reason for existing and a
   count; each capability gets a drawn mark so the card is a thing rather than a row. */
.sgroups{display:grid;gap:clamp(40px,4.5vw,64px)}
.sgroup{scroll-margin-top:90px}

.sg-head{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:0 18px;
  align-items:start;padding-bottom:18px;margin-bottom:22px;
  border-bottom:1px solid var(--rule)}
.sg-n{font-family:'JetBrains Mono',monospace;font-size:12px;letter-spacing:.1em;
  color:var(--red);font-weight:500;padding-top:6px}
/* A solutions group is a top-level section of that page, so it is an h2 — it was an h3
   only because of how it looks, which left the page outline jumping straight from the
   h1. The selector carries both so the appearance is unchanged. */
.sg-head h3,.sg-head .sg-h{font-family:Fraunces,Georgia,serif;font-size:clamp(22px,2.4vw,28px);
  font-weight:600;letter-spacing:-.025em;margin-bottom:7px}
.sg-head p{font-size:15px;line-height:1.6;color:var(--ink-3);max-width:29em}
.sg-c{font-family:Fraunces,Georgia,serif;font-size:30px;font-weight:600;line-height:1;
  color:var(--rule-f);letter-spacing:-.03em;padding-top:2px}

.scards{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}
.scard{position:relative;display:grid;grid-template-rows:auto auto 1fr;gap:0;
  padding:22px 22px 24px;border-radius:var(--r);background:var(--panel);
  border:1px solid var(--rule);overflow:hidden;
  transition:transform .2s var(--ease),box-shadow .2s var(--ease),border-color .2s}
/* The accent arrives from the left edge on hover rather than sitting there all the
   time: twenty-two permanent red rails would be twenty-two things shouting at once. */
.scard::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;
  background:var(--red);transform:scaleY(0);transform-origin:top;
  transition:transform .22s var(--ease)}
.scard:hover{transform:translateY(-3px);box-shadow:var(--shadow);border-color:var(--rule-f)}
.scard:hover::before{transform:scaleY(1)}
.scard:focus-visible{outline:2px solid var(--red);outline-offset:2px}
.sc-mk{display:flex;align-items:center;justify-content:center;width:38px;height:38px;
  border-radius:10px;background:var(--sunk);color:var(--ink-2);margin-bottom:14px;
  transition:background .2s,color .2s}
.scard:hover .sc-mk{background:var(--red-bg);color:var(--red)}
.sc-n{display:block;font-family:Fraunces,Georgia,serif;font-size:19px;font-weight:600;
  letter-spacing:-.02em;color:var(--ink);margin-bottom:6px}
.sc-b{display:block;font-size:14.4px;line-height:1.55;color:var(--ink-3)}
/* An arrow that is there when it is wanted. The card is the link; it does not need a
   line of text telling you so twenty-two times. */
.sc-go{position:absolute;right:20px;top:26px;width:9px;height:9px;
  border-right:1.6px solid var(--red);border-top:1.6px solid var(--red);
  transform:rotate(45deg) translate(-3px,3px);opacity:0;
  transition:opacity .2s var(--ease),transform .2s var(--ease)}
.scard:hover .sc-go{opacity:1;transform:rotate(45deg) translate(0,0)}

@media(max-width:1000px){.scards{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:700px){
  .scards{grid-template-columns:minmax(0,1fr)}
  .sg-head{grid-template-columns:auto minmax(0,1fr);gap:0 14px}
  .sg-c{display:none}
  .scard{padding:18px 18px 20px}
  .sc-go{opacity:1;transform:rotate(45deg)}
}

/* The quote sits on the floor of a refusal card whatever the paragraph above runs to. */
.ref-card{display:flex;flex-direction:column}
.ref-card .ref-said{margin-top:auto}

/* The relief line the problem section never used to deliver. */
.probl-out{margin-top:18px;font-size:clamp(17px,1.35vw,19.5px);line-height:1.55;
  color:var(--ink);font-weight:550;border-left:3px solid var(--red);padding-left:16px}
.dark .probl-out{color:#fff}


/* Six figures read as three pairs, not as a smear of numbers. */
.statband.six{grid-template-columns:repeat(3,1fr)}
@media(max-width:900px){.statband.six{grid-template-columns:repeat(2,1fr)}}
@media(max-width:520px){.statband,.statband.six{grid-template-columns:1fr}}


/* ── the brochure, offered ────────────────────────────────────────────────── */
.broch{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:0 16px;
  align-items:center;padding:16px 18px;border:1px solid var(--rule);border-radius:var(--r);
  background:var(--panel);color:inherit;margin-top:22px;
  transition:border-color .16s var(--ease),box-shadow .16s var(--ease),transform .16s var(--ease)}
.broch:hover{border-color:var(--red);box-shadow:var(--shadow);transform:translateY(-2px)}
.broch:focus-visible{outline:2px solid var(--red);outline-offset:2px}
.br-mk{display:flex;align-items:center;justify-content:center;width:44px;height:44px;
  border-radius:11px;background:var(--red-bg);color:var(--red);flex:none}
.br-t{min-width:0}
.br-t b{display:block;font-size:15.5px;font-weight:600;letter-spacing:-.012em}
.br-t i{display:block;font-style:normal;font-size:13px;color:var(--ink-4);margin-top:2px}
.br-go{font-size:14px;font-weight:500;color:var(--red);white-space:nowrap}
.br-go::after{content:"\00A0\2193"}
.dark .broch{background:var(--night-2);border-color:rgba(255,255,255,.1)}
.dark .br-t i{color:#7A8194}
@media(max-width:560px){
  .broch{grid-template-columns:auto minmax(0,1fr);row-gap:10px}
  .br-go{grid-column:2;text-align:left}
}


.brochs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
.brochs .broch{margin-top:0}
@media(max-width:760px){.brochs{grid-template-columns:minmax(0,1fr)}}


/* A row that changes pace: words across the top, the points in columns under them. */
.frow.wide{grid-template-columns:minmax(0,1fr)}
.frow.wide .fwords{max-width:none}
.frow.wide p{max-width:30em}
.ticks.cols{grid-template-columns:repeat(3,minmax(0,1fr));gap:12px 30px;margin-top:22px}
@media(max-width:900px){.ticks.cols{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:620px){.ticks.cols{grid-template-columns:minmax(0,1fr)}}


/* The grid is darker ink on a light ground and light ink on a dark one. */
.dark .wrap,.phero.dark .wrap,.ctaband .wrap{--grid:rgba(255,255,255,.05)}
.cream .wrap{--grid:rgba(16,18,24,.05)}

/* ── the joins ────────────────────────────────────────────────────────────
   A page of full-width bands stacked on flat horizontal lines reads as a stack of
   bands. One angled cut where the ground changes gives the page a direction — the
   same angle every time, because a second one would be decoration rather than a
   system.

   On its own element, never on ::before: .phero.dark already uses both of its
   pseudo-elements for the light behind the hero, and clipping one of those to a
   triangle quietly cut the glow in half. */
.cut{position:relative;height:clamp(30px,3.6vw,62px);margin:0;padding:0;border:0;
  pointer-events:none}
.cut::after{content:"";position:absolute;inset:-1px 0 -1px 0;
  clip-path:polygon(0 100%,100% 0,100% 100%)}
.cut-dark::after{background:var(--night)}
.cut-cream::after{background:var(--cream)}
.cut-panel::after{background:var(--panel)}
.cut-sunk::after{background:var(--sunk)}
/* The band below a cut starts its content clear of the angle. */
.cut + section > .wrap{padding-top:clamp(6px,1vw,18px)}


/* ── the office ───────────────────────────────────────────────────────────
   The photograph earns its place by being a photograph: no duotone, no filter, no
   pattern over it. The only treatment is a scrim at the foot so a caption can sit on
   it, and a red bloom behind it that picks up the signage rather than competing. */
/* The photograph emerges from the ground rather than sitting on it. A hard-edged card
   with a drop shadow reads as pasted on; a mask that dissolves the foot and the outer
   edge into the section reads as part of the page. The signage and the entrance stay
   well clear of the fade — they are the reason the photograph is here. */
.office{position:relative;margin:0;isolation:isolate}
.office img{border-radius:var(--r-l);
  -webkit-mask-image:linear-gradient(to bottom, #000 0%, #000 78%, rgba(0,0,0,.35) 94%,
    transparent 100%),
    linear-gradient(to right, rgba(0,0,0,.55) 0%, #000 12%, #000 100%);
  mask-image:linear-gradient(to bottom, #000 0%, #000 78%, rgba(0,0,0,.35) 94%,
    transparent 100%),
    linear-gradient(to right, rgba(0,0,0,.55) 0%, #000 12%, #000 100%);
  -webkit-mask-composite:source-in;mask-composite:intersect}
/* A light section is not dark enough to dissolve into, so there the photograph keeps a
   clean edge and a shadow instead. */
.cream .office img,.light .office img{-webkit-mask-image:none;mask-image:none;
  box-shadow:0 26px 60px rgba(16,20,28,.20)}
/* The bloom stays inside the element's own width. Reaching 10% past each edge looked
   right and put 15px of horizontal scroll on the whole page at 390 — a decorative glow
   is never worth a scrollbar. The vertical overhang is harmless and does the work. */
.office::before{content:"";position:absolute;inset:-16% 0 auto 0;height:74%;z-index:-1;
  border-radius:50%;pointer-events:none;
  background:radial-gradient(closest-side,rgba(213,3,12,.40),rgba(213,3,12,0) 74%)}
.office img{display:block;width:100%;object-fit:cover;object-position:50% 58%}
/* Under the photograph, not on it. Once the foot of the image fades into the ground
   there is nothing solid left to sit a caption on, and a scrim heavy enough to fix that
   undoes the fade. */
.office figcaption{margin-top:14px;
  font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.11em;
  text-transform:uppercase;color:var(--ink-4)}
.dark .office figcaption{color:#7A8194}

/* Words beside it, the photograph carrying its own column. */
/* The photograph is portrait, so it gets a narrow column and most of its height —
   cropped to the middle it lost both the signage and the entrance, which are the two
   things in the frame that say "this is a real company at a real address". */
.officesplit{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,.7fr);
  gap:clamp(30px,4.5vw,66px);align-items:center}
.officesplit .office img{max-height:560px}
.officesplit > .shead{margin-bottom:0}
@media(max-width:900px){
  .officesplit{grid-template-columns:minmax(0,1fr)}
  .officesplit .office img{max-height:340px}
  /* On a phone the About hero gave the photograph its full portrait height — 928px, so
     the reader never sees the building, only a wall of glass. */
  .phero-aside > .office img{max-height:clamp(300px,58vw,380px)}
  .office img{object-position:50% 58%}
}


/* ── something long, folded ───────────────────────────────────────────────
   A component taller than the screen cannot be read as one thing — the reader scrolls
   through something they can never hold in their head. Where the detail is genuinely
   optional it folds, and the summary says exactly what is inside so folding it is not
   hiding it. On a desktop there is room, so it is open. */
.fold{margin-top:20px;border-top:1px solid var(--rule-2)}
.fold > summary{display:flex;align-items:baseline;gap:10px;cursor:pointer;list-style:none;
  padding:14px 30px 14px 0;position:relative;
  font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.11em;
  text-transform:uppercase;color:var(--ink-3)}
.fold > summary::-webkit-details-marker{display:none}
.fold > summary i{font-style:normal;color:var(--ink-4);margin-left:auto;padding-right:4px}
.fold > summary::after{content:"";position:absolute;right:6px;top:18px;width:8px;height:8px;
  border-right:1.6px solid var(--ink-4);border-bottom:1.6px solid var(--ink-4);
  transform:rotate(45deg);transition:transform .18s var(--ease)}
.fold[open] > summary::after{transform:rotate(-135deg);top:21px}
.fold > summary:hover{color:var(--ink)}
@media(min-width:860px){
  /* Room to show it, so show it — and the summary becomes a heading rather than a control. */
  .fold > summary{cursor:default;pointer-events:none}
  .fold > summary::after{display:none}
}



/* ── a dark card, never a dark band ───────────────────────────────────────
   The console-style widgets — the assistant answering, the refusals — were built
   for a dark ground and are the only things on the site that genuinely need one.
   Given a whole section they put a full-bleed black slab across the page and a hard
   border at each end of it. Given a card they do the same job for the eye and the
   page underneath stays one continuous surface. */
.darkcard{background:var(--night);color:#fff;border-radius:var(--r-l);
  position:relative;overflow:hidden;isolation:isolate;
  padding:clamp(24px,3.4vw,44px) clamp(20px,3vw,40px);
  box-shadow:0 1px 2px rgba(16,18,22,.06), 0 18px 44px rgba(16,18,22,.14),
             0 48px 90px rgba(16,18,22,.10)}
/* The same composed field as the hero used to have, at card scale, so the widget
   inside has something to sit on rather than floating on flat black. */
.darkcard-field{position:absolute;inset:0;pointer-events:none;z-index:0;
  background:
    radial-gradient(60% 70% at 84% 12%, rgba(213,3,12,.34), rgba(213,3,12,0) 70%),
    radial-gradient(56% 66% at 6% 92%, rgba(30,58,138,.30), rgba(30,58,138,0) 72%)}
.darkcard-in{position:relative;z-index:1}
.darkcard .shead{margin-bottom:22px}
.darkcard > .darkcard-in > *:last-child{margin-bottom:0}
@media(max-width:700px){
  .darkcard{border-radius:var(--r);padding:22px 16px}
}
/* A console dropped into a feature row's visual slot has a fraction of the width a
   section gives it, and the card's own padding then eats what is left. */
.fvis .darkcard,.feat-vis .darkcard{padding:18px 16px;border-radius:var(--r)}


/* ═══ the visuals ═════════════════════════════════════════════════════════
   Each one is the argument rather than a picture of it, and each reads with the
   script off: bars carry their widths inline, tables carry their figures.

   A COMPONENT THAT PAINTS A BACKGROUND MUST PAINT ITS INK. Every one of these
   can sit inside a dark section, and a light card that inherits #fff from its
   section renders white figures on a white surface — which is exactly how an
   entire dashboard of numbers went missing while every label around it showed.
   The rule below is why each surface sets color explicitly. ═══════════════ */
.appwin,.calc,.alloc,.fcast,.cmp-wrap,.pipeline,.cap-out,.cap-doc{color:var(--ink)}
.appwin h1,.appwin h2,.appwin h3,.calc h1,.calc h2,.calc h3{color:var(--ink)}

/* ── the cost calculator ──────────────────────────────────────────────── */
.calc{border:1px solid var(--rule);border-radius:var(--r-l);background:var(--panel);
  overflow:hidden;box-shadow:var(--shadow)}
.calc-head{padding:22px 26px 20px;border-bottom:1px solid var(--rule);background:var(--cream)}
.calc-k{font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.13em;
  text-transform:uppercase;color:var(--ink-4);margin-bottom:12px}
.shapes{display:flex;gap:7px;flex-wrap:wrap}
/* On a phone these wrap to seven rows and push every figure below the fold — the
   reader scrolls past a full screen of buttons to reach the thing they came for. One
   swipeable row instead, which is the standard mobile pattern for exactly this and
   costs 44px rather than 520. */
@media(max-width:700px){
  .shapes{flex-wrap:nowrap;overflow-x:auto;scroll-snap-type:x proximity;
    -webkit-overflow-scrolling:touch;scrollbar-width:none;
    padding-bottom:2px;margin-right:-16px;padding-right:16px;
    -webkit-mask-image:linear-gradient(90deg,#000 88%,transparent 100%);
    mask-image:linear-gradient(90deg,#000 88%,transparent 100%)}
  .shapes::-webkit-scrollbar{display:none}
  .shape{flex:none;scroll-snap-align:start}
}
.shape{font:inherit;font-size:13.5px;padding:8px 14px;border-radius:999px;cursor:pointer;
  border:1px solid var(--rule-f);background:var(--panel);color:var(--ink-2);
  transition:border-color .14s,background .14s,color .14s}
.shape:hover{border-color:var(--ink-4);color:var(--ink)}
.shape.on{background:var(--red);border-color:var(--red);color:#fff;font-weight:500}
.calc-body{padding:26px}
.calc-who{font-size:14px;color:var(--ink-4);margin-bottom:22px}

.tco{display:grid;gap:14px}
.tco-row{display:grid;grid-template-columns:150px 1fr 118px;gap:16px;align-items:center}
.tco-k{font-size:14.5px;font-weight:600;line-height:1.25}
.tco-k span{display:block;font-size:11px;font-weight:500;letter-spacing:.05em;
  text-transform:uppercase;color:var(--ink-4);margin-top:4px}
.tco-track{height:42px;background:var(--sunk);border-radius:7px;display:flex;overflow:hidden}
.tco-seg{display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;
  color:#fff;font-variant-numeric:tabular-nums;border-right:1px solid rgba(255,255,255,.28);
  transition:width .55s var(--ease);white-space:nowrap;min-width:0;overflow:hidden}
.tco-seg:last-child{border-right:0}
.t1{background:#8E1219;width:48.6%} .t2{background:#B01720;width:25.7%} .t3{background:var(--red);width:25.7%}
.u1{background:#2F6B52;width:18.6%} .u2{background:#38795C;width:9.4%} .u3{background:#46866A;width:9.4%}
.tco-tot{text-align:right;font-size:19px;font-weight:700;letter-spacing:-.022em;
  font-variant-numeric:tabular-nums;line-height:1.1}
.tco-tot span{display:block;font-size:10.5px;font-weight:500;letter-spacing:.09em;
  text-transform:uppercase;color:var(--ink-4);margin-top:4px}
.tco-tot.them{color:var(--red)} .tco-tot.us{color:var(--ok)}
.tco-legend{display:flex;gap:16px;align-items:center;font-size:12.5px;color:var(--ink-4);
  flex-wrap:wrap;margin-top:4px}
.tco-legend .sw{width:11px;height:11px;border-radius:3px;display:inline-block;margin-right:6px;
  vertical-align:-1px}
.sw.y1{background:#8E1219}.sw.y2{background:#B01720}.sw.y3{background:var(--red)}
.tco-note{margin-left:auto}

.calc-gap{background:var(--red-bg);border:1px solid var(--red-ln);border-radius:var(--r);
  padding:16px 20px;margin:24px 0 26px}
.calc-gap .ck{font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.13em;
  text-transform:uppercase;color:var(--red-d);font-weight:500;margin-bottom:5px}
.calc-gap p{font-size:15.5px;line-height:1.6;color:var(--ink-1)}
.calc-gap strong{font-weight:700;color:var(--red-d)}

table.bill,table.cmp{width:100%;border-collapse:collapse;font-size:14.5px}
table.bill caption,table.cmp caption{text-align:left;font-family:'JetBrains Mono',monospace;
  font-size:10.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-4);
  padding-bottom:10px}
table.bill th,table.cmp th{text-align:left;font-size:11px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ink-4);font-weight:600;padding:0 0 10px;
  border-bottom:1px solid var(--rule)}
table.bill td,table.cmp td{padding:12px 0;border-bottom:1px solid var(--rule-2);
  vertical-align:top;line-height:1.5}
table.bill td:first-child,table.cmp td:first-child{font-weight:600;padding-right:22px;width:30%}
table.bill td.them,table.cmp td.them{color:var(--ink-3);padding-right:22px;width:35%}
table.bill td.us,table.cmp td.us{color:var(--ok);font-weight:550}
.bill-note{font-size:13px;color:var(--ink-4);margin-top:14px;line-height:1.6;font-style:italic}

.cmp-wrap{border:1px solid var(--rule);border-radius:var(--r-l);overflow:hidden;background:var(--panel)}
table.cmp{font-size:15px}
table.cmp th,table.cmp td{padding-left:22px;padding-right:22px}
table.cmp th{padding-top:18px;padding-bottom:12px;background:var(--cream)}
table.cmp th.usc{color:var(--red);background:var(--red-bg)}
table.cmp td.us{background:var(--red-bg);color:var(--ink-1);font-weight:600}
table.cmp tbody tr:last-child td{border-bottom:0}

/* ── the six-year chart ───────────────────────────────────────────────── */
/* Room for the labels, which sit ABOVE their bars and are centred on a 26px column —
   so a figure like P11.5M hangs about twelve pixels past each side of its own bar, and
   the outermost two overran the card. Invisible while the chart was filling to zero
   height; the moment the bars appeared, so did the overhang. */
.forever{display:grid;grid-template-columns:repeat(6,1fr);gap:12px;align-items:end;
  padding:20px 16px 0}
.fy-pair{display:flex;align-items:flex-end;justify-content:center;gap:6px;height:180px}
.fy-b{width:26px;border-radius:5px 5px 0 0;position:relative;transition:height .6s var(--ease)}
.fy-b.them{background:var(--red)} .fy-b.us{background:var(--ok)}
.fy-b span{position:absolute;bottom:calc(100% + 6px);left:50%;transform:translateX(-50%);
  font-size:11px;font-weight:650;white-space:nowrap;font-variant-numeric:tabular-nums}
.fy-b.them span{color:var(--red)} .fy-b.us span{color:var(--ok)}
.fy-k{text-align:center;font-size:11.5px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--ink-4);margin-top:12px;padding-top:12px;border-top:1px solid var(--rule)}
.fy-legend{grid-column:1/-1;display:flex;gap:8px;align-items:center;font-size:13px;
  color:var(--ink-4);margin-top:18px;flex-wrap:wrap}
.fy-legend .sw{width:11px;height:11px;border-radius:3px;display:inline-block;margin-right:5px}
.fy-legend .sw.them{background:var(--red)}
.fy-legend .sw.us{background:var(--ok);margin-left:14px}
.fy-gap{margin-left:auto}.fy-gap b{color:var(--ink)}
/* The three-year chart now lives inside a dark card, where near-black ink is the one
   colour that cannot be read. */
.dark .fy-gap b{color:#fff}

/* ── application window ───────────────────────────────────────────────── */
.appwin{border:1px solid var(--rule);border-radius:var(--r-l);overflow:hidden;
  background:var(--panel);box-shadow:var(--shadow)}
.appbar{display:flex;align-items:center;gap:12px;padding:12px 16px;background:var(--cream);
  border-bottom:1px solid var(--rule)}
.dots{display:flex;gap:6px}.dots i{width:9px;height:9px;border-radius:50%;background:var(--rule-f)}
.apptitle{font-size:11.5px;letter-spacing:.11em;text-transform:uppercase;color:var(--ink-4);
  font-weight:500}
.appbody{padding:20px}
/* A ten-character peso figure needs about 130px before it touches the cell it is in.
   118 was the width of the label, not of the number underneath it — so "₱62.40/kg" sat
   against the divider and "84,300 kg" broke onto two lines. */
/* Four figures in a three-column auto-fit leaves one on a row of its own with two grey
   holes beside it — which is what "the trading position, today" looked like on every
   industry page. The count decides the columns. */
.kpis{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1px;
  background:var(--rule-2);border:1px solid var(--rule-2);border-radius:9px;overflow:hidden;
  margin-bottom:18px}
.kpis.k3{grid-template-columns:repeat(3,minmax(0,1fr))}
@media(min-width:760px){.kpis.k4{grid-template-columns:repeat(4,minmax(0,1fr))}}
@media(max-width:480px){.kpis,.kpis.k3,.kpis.k4{grid-template-columns:repeat(2,minmax(0,1fr))}}
.kpi{background:var(--panel);padding:14px 15px 15px}
/* A two-line label pushed its own figure down and broke the row of baselines.
   The floor is two lines' worth, so every figure in a board starts level. */
.kl{font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-4);
  font-weight:500;margin-bottom:7px;min-height:2.4em;display:flex;align-items:flex-start}
/* The figure shrinks with the window rather than wrapping. A money figure that wraps is
   read as two numbers for the half-second before the eye corrects. */
.kv{font-family:Fraunces,Georgia,serif;font-size:clamp(17px,1.55vw,23px);font-weight:600;
  letter-spacing:-.025em;line-height:1.05;font-variant-numeric:tabular-nums;
  white-space:nowrap;overflow-wrap:normal}
.kv .u{font-size:.66em;font-weight:500;letter-spacing:0;margin-left:2px;color:var(--ink-3)}
.kd{font-size:12px;margin-top:6px;color:var(--ink-4)}
.kd.up{color:var(--ok)}.kd.down{color:var(--red)}
table.applist{width:100%;border-collapse:collapse;font-size:13.8px}
table.applist td{padding:10px 0;border-top:1px solid var(--rule-2)}
table.applist tr:first-child td{border-top:0}
table.applist td.sub{color:var(--ink-4);font-size:12.8px}
table.applist td.n{text-align:right;font-variant-numeric:tabular-nums;font-weight:600}
table.applist td:last-child{text-align:right;width:1%;white-space:nowrap}
.pill{display:inline-block;padding:3px 9px;border-radius:999px;font-size:11px;font-weight:600;
  letter-spacing:.02em}
.pill.ok{background:var(--ok-bg);color:var(--ok)}
.pill.hold{background:var(--hold-bg);color:var(--hold)}
.pill.stop{background:var(--red-bg);color:var(--red-d)}
.appfoot{margin-top:16px;padding-top:14px;border-top:1px solid var(--rule-2);font-size:13px;
  color:var(--ink-3);line-height:1.55}

/* ── pipeline ─────────────────────────────────────────────────────────── */
/* ── the pipeline, run rather than listed ─────────────────────────────────
   One track, four stations. The rail draws left to right, each station lights as
   the rail reaches it, and a marker travels the whole way once. Everything is
   readable before any of it moves, and with prefers-reduced-motion the finished
   state is what you get. */
.pipeline{position:relative;padding:8px 0 4px;--n:4}
.prail{position:absolute;left:calc(100% / var(--n) / 2);right:calc(100% / var(--n) / 2);
  top:25px;height:2px;border-radius:2px;background:var(--rule-f)}
.pfill{position:absolute;inset:0;border-radius:2px;transform-origin:left;transform:scaleX(0);
  background:linear-gradient(90deg,var(--red),var(--red-l));
  transition:transform 1.5s cubic-bezier(.32,.72,.3,1)}
.dark .prail{background:rgba(255,255,255,.14)}
/* The marker. It runs the track once and then stops on the last station rather than
   looping, because a thing that never finishes reads as a spinner. */
.pdot{position:absolute;top:50%;left:0;width:9px;height:9px;margin:-4.5px 0 0 -4.5px;
  border-radius:50%;background:#fff;box-shadow:0 0 0 3px var(--red),0 0 16px rgba(213,3,12,.7);
  opacity:0;transition:left 1.5s cubic-bezier(.32,.72,.3,1),opacity .3s}
.pipeline[data-lit] .pfill{transform:scaleX(1)}
.pipeline[data-lit] .pdot{left:100%;opacity:1}

.psteps{position:relative;list-style:none;display:grid;
  grid-template-columns:repeat(var(--n),minmax(0,1fr));gap:0}
.pstep{position:relative;text-align:center;padding:0 12px}
.pnode{display:flex;align-items:center;justify-content:center;width:34px;height:34px;
  margin:9px auto 14px;border-radius:50%;background:var(--panel);
  border:2px solid var(--rule-f);position:relative;z-index:2;
  transition:border-color .3s var(--ease),background .3s var(--ease),transform .3s var(--ease)}
.dark .pnode{background:var(--night-2);border-color:rgba(255,255,255,.18)}
.pnum{font-family:'JetBrains Mono',monospace;font-size:12.5px;font-weight:500;
  color:var(--ink-4);transition:color .3s var(--ease)}
.pipeline[data-lit] .pnode{transition-delay:calc(var(--i) * .34s + .18s)}
.pipeline[data-lit] .pnum{transition-delay:calc(var(--i) * .34s + .18s)}
.pipeline[data-lit] .pstep .pnode{border-color:var(--red);background:var(--red);
  transform:scale(1.06)}
.pipeline[data-lit] .pstep .pnum{color:#fff}
.pn{display:block;font-size:15px;font-weight:600;letter-spacing:-.012em;margin-bottom:5px;
  opacity:.45;transition:opacity .35s var(--ease)}
.pd{display:block;font-size:13px;color:var(--ink-4);line-height:1.5;max-width:18em;
  margin:0 auto;opacity:.45;transition:opacity .35s var(--ease)}
.dark .pd{color:#9AA0AC}
.pipeline[data-lit] .pn,.pipeline[data-lit] .pd{opacity:1;
  transition-delay:calc(var(--i) * .34s + .3s)}

/* Below the point where four stations fit, the track turns and runs down the page —
   still one line through four stations, not four cards with an orphan on the end. */
@media(max-width:760px){
  .prail{left:17px;right:auto;top:26px;bottom:26px;width:2px;height:auto}
  .pfill{transform-origin:top;transform:scaleY(0)}
  .pipeline[data-lit] .pfill{transform:scaleY(1)}
  .pdot{left:50%;top:0}
  .pipeline[data-lit] .pdot{left:50%;top:100%}
  .psteps{grid-template-columns:minmax(0,1fr);gap:4px}
  .pstep{display:grid;grid-template-columns:34px minmax(0,1fr);gap:0 14px;
    text-align:left;padding:7px 0}
  .pnode{margin:0}
  .pn{grid-column:2;margin-top:6px}
  .pd{grid-column:2;max-width:none;margin:0}
}
.pnote{font-size:13.5px;color:var(--ink-4);margin-top:12px;font-style:italic}

/* ── capture ──────────────────────────────────────────────────────────── */
.capture{display:grid;grid-template-columns:1fr 1fr;gap:18px}
.cap-doc{position:relative;background:var(--cream);border:1px solid var(--rule);
  border-radius:10px;padding:16px 18px;overflow:hidden;font-family:'JetBrains Mono',monospace;
  font-size:11px;line-height:1.95;color:var(--ink-2)}
.cl.hd{font-weight:600;color:var(--ink)}
.cl.sm{font-size:11px;color:var(--ink-4)}
.cl.sep{border-top:1px dashed var(--rule-f);margin:7px 0}
.cl.row{display:flex;justify-content:space-between;gap:10px}
.cl.tot{font-weight:600;color:var(--ink)}
.cl .v{padding:0 3px;margin:0 -3px;border-radius:2px;transition:background .3s,color .3s}
.capture[data-lit] .cl .v{background:rgba(213,3,12,.12);color:var(--red-d);font-weight:600}
.cap-scan{position:absolute;left:0;right:0;top:-3px;height:3px;background:var(--red);
  box-shadow:0 0 20px 5px rgba(213,3,12,.45);opacity:0}
.capture[data-lit] .cap-scan{animation:capsweep 1.3s cubic-bezier(.4,0,.2,1) forwards}
@keyframes capsweep{0%{opacity:1;top:-3px}90%{opacity:1}100%{opacity:0;top:100%}}
.cap-out{border:1px solid var(--rule);border-radius:10px;padding:16px 18px;background:var(--panel)}
.cap-k{font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-4);
  font-weight:500;margin-bottom:12px}
.cap-field{display:flex;align-items:baseline;gap:10px;padding:7px 0;
  border-bottom:1px solid var(--rule-2);font-size:13.4px;opacity:0;transform:translateX(8px);
  transition:opacity .35s var(--ease),transform .35s var(--ease)}
.capture[data-lit] .cap-field{opacity:1;transform:none}
.capture[data-lit] .cap-field[data-f="1"]{transition-delay:.5s}
.capture[data-lit] .cap-field[data-f="2"]{transition-delay:.65s}
.capture[data-lit] .cap-field[data-f="3"]{transition-delay:.8s}
.capture[data-lit] .cap-field[data-f="4"]{transition-delay:.95s}
.capture[data-lit] .cap-field[data-f="5"]{transition-delay:1.1s}
.cap-field span{color:var(--ink-4);width:52px;flex:none}
.cap-field b{font-variant-numeric:tabular-nums;font-weight:600;margin-left:auto}
.cap-field i{font-style:normal;font-size:11px;color:var(--ok);flex:none;width:80px;text-align:right}
.cap-done{margin-top:14px;font-size:13px;color:var(--ok);font-weight:550;opacity:0;
  transition:opacity .4s var(--ease) 1.3s}
.capture[data-lit] .cap-done{opacity:1}

/* ── the assistant ────────────────────────────────────────────────────── */
.aistage{display:grid;grid-template-columns:78px 1fr;gap:20px;align-items:start;
  background:var(--night-2);border:1px solid rgba(255,255,255,.1);border-radius:var(--r-l);
  padding:24px}
.ai-orb{position:relative;width:78px;height:78px}
.ai-orb span{position:absolute;inset:0;border-radius:50%;border:1.5px solid var(--amber);
  opacity:0}
.aistage[data-lit] .ai-orb span{animation:ripple 2.6s var(--ease) infinite}
.aistage[data-lit] .ai-orb span:nth-child(2){animation-delay:.85s}
.aistage[data-lit] .ai-orb span:nth-child(3){animation-delay:1.7s}
@keyframes ripple{0%{transform:scale(.45);opacity:.85}100%{transform:scale(1);opacity:0}}
.ai-orb::after{content:"";position:absolute;inset:26px;border-radius:50%;background:var(--amber);
  box-shadow:0 0 22px 5px rgba(245,185,46,.4)}
.ai-q{font-family:Fraunces,Georgia,serif;font-size:19px;font-weight:600;color:#fff;
  letter-spacing:-.018em;line-height:1.3;margin-bottom:12px}
.ai-a{font-size:15px;line-height:1.62;color:#B7BCC6;margin-bottom:14px}
.ai-a b,.ai-a strong{color:#fff;font-weight:600}
.ai-src{display:flex;gap:12px;align-items:center;flex-wrap:wrap;font-size:12.5px}
.ai-src .chk{background:rgba(15,123,90,.22);color:#6FCFA6;padding:4px 10px;border-radius:999px;
  font-weight:600}
.ai-m{color:#8E92A0}

/* ── allocation ───────────────────────────────────────────────────────── */
.alloc{border:1px solid var(--rule);border-radius:var(--r-l);padding:22px;background:var(--panel)}
.as-top{display:flex;justify-content:space-between;align-items:baseline;gap:14px;
  padding-bottom:14px;border-bottom:1px solid var(--rule)}
.as-k{font-size:13.5px;color:var(--ink-3)}
.as-t{font-family:Fraunces,Georgia,serif;font-size:22px;font-weight:600;letter-spacing:-.025em;
  font-variant-numeric:tabular-nums}
.as-arrow{height:22px;position:relative}
.as-arrow::after{content:"";position:absolute;left:50%;top:4px;width:1px;height:14px;
  background:var(--rule-f)}
.asrow{display:grid;grid-template-columns:168px 1fr 104px;gap:14px;align-items:center;
  padding:7px 0;font-size:13.6px}
.asn{color:var(--ink-2)}
.astrack{height:9px;background:var(--sunk);border-radius:5px;overflow:hidden}
.astrack i{display:block;height:100%;width:0;background:var(--red);border-radius:5px;
  transition:width .7s var(--ease)}
.alloc[data-lit] .astrack i{width:var(--w)}
.asv{text-align:right;font-variant-numeric:tabular-nums;font-weight:600}
.as-proof{margin-top:16px;padding-top:14px;border-top:1px solid var(--rule);font-size:13px;
  color:var(--ink-3);display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.as-proof .chk{background:var(--ok-bg);color:var(--ok);padding:4px 10px;border-radius:999px;
  font-weight:600;font-size:12px}

/* ── forecast ─────────────────────────────────────────────────────────── */
.fcast{border:1px solid var(--rule);border-radius:var(--r-l);padding:20px 22px 18px;
  background:var(--panel)}
.fcast svg{width:100%;height:150px;display:block;overflow:visible}
.fline{fill:none;stroke:var(--ink-2);stroke-width:2;stroke-linejoin:round;stroke-linecap:round;
  stroke-dasharray:1400;stroke-dashoffset:1400}
.fcast[data-lit] .fline{animation:draw 1.1s var(--ease) forwards}
.fline.ahead{stroke:var(--red);stroke-dasharray:5 4;stroke-dashoffset:0;opacity:0}
.fcast[data-lit] .fline.ahead{animation:fadein .5s var(--ease) 1s forwards}
.fband{opacity:0}
.fcast[data-lit] .fband{animation:fadein .6s var(--ease) 1.15s forwards}
@keyframes draw{to{stroke-dashoffset:0}}
@keyframes fadein{to{opacity:1}}
.fkeys{display:flex;gap:18px;align-items:center;font-size:12.5px;color:var(--ink-4);
  margin-top:14px;flex-wrap:wrap}
.fkeys i{display:inline-block;width:14px;height:2.5px;border-radius:2px;margin-right:6px;
  vertical-align:3px}
.fkeys i.k1{background:var(--ink-2)}
.fkeys i.k2{background:var(--red)}
.facc{margin-left:auto;color:var(--ok);font-weight:600}

/* Never wider than what holds it. A nowrap cell inside gave the whole hero grid a
   min-content of 450px on a 390px phone, and every block above it inherited the burst. */
.appwin{max-width:100%}

@media(max-width:560px){
  /* The window becomes a list of rows: what it is on the left, what it says on the right. */
  table.applist,table.applist tbody,table.applist td{display:block;width:auto}
  table.applist tr{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:1px 12px;
    padding:11px 0;border-top:1px solid var(--rule-2);align-items:center}
  table.applist tr:first-child{border-top:0}
  table.applist td{padding:0;border-top:0}
  table.applist td:nth-child(1){grid-column:1;grid-row:1}
  table.applist td.sub{grid-column:1;grid-row:2}
  table.applist td.n{grid-column:2;grid-row:1;text-align:right}
  table.applist td:last-child{grid-column:2;grid-row:2;text-align:right;width:auto}
  .fy-b span{font-size:10.5px}
}

@media(max-width:820px){
  .tco-row{grid-template-columns:1fr;gap:8px}
  .tco-tot{text-align:left}
  /* Three segments sharing a 340px track printed their figures on top of one
     another. The track still carries the proportion; the total carries the number. */
  .tco-seg span{display:none}
  .tco-track{height:30px}
  .capture{grid-template-columns:1fr}
  /* The receipt is a facsimile, but once it is full width it is also something a
     reader tries to read. */
  .cap-paper .cl,.cap-paper .cl.sm{font-size:11.5px}
  .asrow{grid-template-columns:1fr;gap:5px}
  .asv{text-align:left}
  .aistage{grid-template-columns:1fr}
  .forever{gap:7px}.fy-b{width:16px}.fy-b span{font-size:10.5px}
  table.cmp td:first-child,table.cmp td.them{width:auto}
}

/* ── the two comparison tables on a phone ─────────────────────────────────
   Three columns of prose inside 350px either clip or shrink to four characters
   a line. Each row becomes a small block instead: what you are billed for,
   then what each side charges for it, each under its own label. */
@media(max-width:640px){
  table.bill,table.cmp,table.bill tbody,table.cmp tbody,
  table.bill tr,table.cmp tr,table.bill td,table.cmp td{display:block;width:auto}
  table.bill thead,table.cmp thead{display:none}
  table.bill tr,table.cmp tr{padding:16px 0;border-bottom:1px solid var(--rule-2)}
  table.cmp tr{padding:16px 20px}
  table.bill tr:last-child,table.cmp tr:last-child{border-bottom:0}
  table.bill td,table.cmp td{padding:0;border-bottom:0;width:auto}
  /* The desktop column widths are percentages, and a block element still obeys a
     percentage width — every cell stayed in its old 30%/35% track once stacked. */
  table.bill td:first-child,table.cmp td:first-child,
  table.bill td.them,table.cmp td.them,
  table.bill td.us,table.cmp td.us{width:auto}
  table.bill caption,table.cmp caption{display:block;width:auto}
  table.bill td:first-child,table.cmp td:first-child{font-size:16px;margin-bottom:10px}
  table.bill td[data-l],table.cmp td[data-l]{padding:9px 12px;border-radius:8px;
    background:var(--sunk);margin-bottom:8px}
  table.cmp td.us,table.bill td.us{background:var(--red-bg);margin-bottom:0}
  table.bill td[data-l]::before,table.cmp td[data-l]::before{content:attr(data-l);display:block;
    font-family:'JetBrains Mono',monospace;font-size:9.5px;letter-spacing:.12em;
    text-transform:uppercase;color:var(--ink-4);font-weight:500;margin-bottom:3px}
  table.cmp td.us::before{color:var(--red)}
}

/* ═══ the assistant, playable ═════════════════════════════════════════════
   The one section that has to feel like the product rather than a page about it.
   Deep ground, one light source behind the answer, and nothing moving that is not
   saying something: the tools arrive because they are being called, the figure
   counts because it is being read. */
.asklive{position:relative;border-radius:18px;padding:0;overflow:hidden;
  background:linear-gradient(168deg,#141926 0%,#0C0F17 52%,#11141C 100%);
  border:1px solid rgba(255,255,255,.1);
  box-shadow:0 30px 80px rgba(0,0,0,.45),inset 0 1px 0 rgba(255,255,255,.06);
  color:#E8EBF1}
/* The light behind it. Two lobes, red and a cold blue, so the dark has depth
   rather than being flat black with a card on it. */
.asklive::before{content:"";position:absolute;inset:-40% -20% auto -20%;height:80%;
  pointer-events:none;
  background:radial-gradient(48% 60% at 26% 34%,rgba(213,3,12,.30),transparent 70%),
             radial-gradient(44% 52% at 78% 18%,rgba(60,110,235,.22),transparent 72%)}
.asklive > *{position:relative;z-index:2}

.ask-head{display:flex;align-items:center;gap:10px;padding:13px 18px;
  border-bottom:1px solid rgba(255,255,255,.08);background:rgba(255,255,255,.03)}
.ask-dot{width:9px;height:9px;border-radius:50%;background:var(--red-l);flex:none;
  box-shadow:0 0 0 0 rgba(255,107,116,.55);animation:askpulse 2.6s var(--ease) infinite}
@keyframes askpulse{0%{box-shadow:0 0 0 0 rgba(255,107,116,.5)}
  70%{box-shadow:0 0 0 9px rgba(255,107,116,0)}100%{box-shadow:0 0 0 0 rgba(255,107,116,0)}}
.ask-title{font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.1em;
  text-transform:uppercase;color:#9AA2B4}
.ask-badge{margin-left:auto;font-family:'JetBrains Mono',monospace;font-size:10.5px;
  letter-spacing:.09em;color:var(--red-p);border:1px solid rgba(255,107,116,.3);
  border-radius:999px;padding:3px 9px;white-space:nowrap}

.ask-chips{display:flex;flex-wrap:wrap;gap:7px;padding:15px 18px 3px}
.ask-chip{font:inherit;font-size:13px;line-height:1.35;text-align:left;cursor:pointer;
  color:#B9C0CE;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.1);
  border-radius:9px;padding:8px 12px;transition:background .15s,border-color .15s,color .15s}
.ask-chip:hover{background:rgba(255,255,255,.1);color:#fff}
.ask-chip.on{background:var(--red);border-color:var(--red);color:#fff;font-weight:500}
.ask-chip:focus-visible{outline:2px solid var(--red-p);outline-offset:2px}

.ask-stage{padding:18px 18px 4px;min-height:196px}
.asklive .ask-q{font-family:Fraunces,Georgia,serif;font-size:clamp(18px,1.9vw,22px);font-weight:600;
  letter-spacing:-.02em;line-height:1.3;color:#fff;margin-bottom:12px}
.asklive .ask-q::before{content:"\201C"} .asklive .ask-q::after{content:"\201D"}

/* Each tool arrives as it is called. They are named, because "it used AI" is not a
   provenance and "it read v_vat_return" is. */
.ask-tools{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:13px;min-height:24px}
/* These used to be database view names set in mono — `site_profit_after_allocation` —
   which is accurate and is a developer's screen. They are words now, so they are set
   like words. */
.ask-tool{font-size:12px;letter-spacing:.01em;
  color:#9FE8CB;background:rgba(48,196,140,.09);border:1px solid rgba(48,196,140,.22);
  border-radius:999px;padding:4px 11px;opacity:0;transform:translateY(5px);
  animation:asktool .34s var(--ease) forwards}
@keyframes asktool{to{opacity:1;transform:none}}
.ask-tool.wait{color:#9AA2B4;background:rgba(255,255,255,.05);
  border-color:rgba(255,255,255,.12)}

/* Scoped to .asklive on purpose. The hero-scene kit in css_scenes.py also has an
   assistant card and also calls its parts .ask-q, .ask-v and .ask-u — but its card is
   white, so its colours are near-black. It loads after this file, so its rules were
   winning here and the console's answer figure rendered in --ink on a near-black
   ground: present, styled, and invisible. Same class name, two components, no warning
   from anything. */
.asklive .ask-v{font-family:Fraunces,Georgia,serif;font-size:clamp(30px,3.6vw,44px);
  font-weight:600;letter-spacing:-.03em;line-height:1;color:#fff;
  font-variant-numeric:tabular-nums;margin:2px 0 8px}
.asklive .ask-u{font-size:14.5px;line-height:1.5;color:#B7BCC6;max-width:22em}
.ask-a b{color:#fff;font-weight:600}
.ask-a code{font-family:'JetBrains Mono',monospace;font-size:13px;color:var(--red-p);
  background:rgba(213,3,12,.14);border-radius:4px;padding:1px 5px}
.ask-cite{margin:14px 0 0;display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.ask-cite .chk{font-size:11.5px;color:#8FE3C0;background:rgba(48,196,140,.1);
  border:1px solid rgba(48,196,140,.26);border-radius:999px;padding:4px 11px}
.asklive[data-refused] .ask-cite .chk{color:#FFC7A8;background:rgba(255,150,90,.1);
  border-color:rgba(255,150,90,.28)}
.asklive[data-thinking] .ask-a,.asklive[data-thinking] .ask-cite{opacity:.35}
.ask-a,.ask-cite{transition:opacity .2s var(--ease)}

.ask-own{display:flex;gap:8px;margin:16px 18px 0;padding-top:15px;
  border-top:1px solid rgba(255,255,255,.08)}
.ask-own input{flex:1;min-width:0;font:inherit;font-size:14.5px;color:#fff;
  background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.12);
  border-radius:9px;padding:10px 13px}
.ask-own input::placeholder{color:#7A8194}
.ask-own input:focus{outline:0;border-color:var(--red-l);
  box-shadow:0 0 0 3px rgba(213,3,12,.18)}
.ask-go{font:inherit;font-size:17px;line-height:1;cursor:pointer;color:#fff;
  background:var(--red);border:1px solid var(--red);border-radius:9px;
  padding:0 16px;flex:none}
.ask-go:hover{background:var(--red-d);border-color:var(--red-d)}
.ask-foot{font-size:12.5px;line-height:1.55;color:#7A8194;padding:12px 18px 17px;
  max-width:33em}
.ask-foot.said{color:#FFC7A8}

@media(max-width:600px){
  .ask-chips{padding:12px 14px 2px;gap:6px}
  /* Six chips one per line was 300px of buttons before the answer began. */
  .ask-chip{font-size:12px;line-height:1.3;padding:8px 10px;flex:1 1 calc(50% - 3px);
    min-width:0}
  .ask-stage{padding:13px 14px 2px;min-height:0}
  .asklive .ask-q{font-size:16px;margin-bottom:9px}
  .ask-a{font-size:14.5px;line-height:1.55}
  .ask-tools{margin-bottom:10px;min-height:0}
  .ask-cite{margin-top:11px}
  .ask-head,.ask-own,.ask-foot{padding-left:14px;padding-right:14px}
  .ask-own{margin-left:14px;margin-right:14px;margin-top:12px;padding-top:12px}
  .ask-foot{padding-top:10px;padding-bottom:14px;font-size:12px}
}


/* ── what it refuses ──────────────────────────────────────────────────────
   The trust argument, and the only page on the site where the heading is a
   negative on purpose. */
/* auto-fit, not a fixed three. A viewport media query cannot see that this grid is
   sitting in a 400px visual slot on a 1440px screen, so three columns became three
   ribbons of two words a line. The floor makes the grid answer to its CONTAINER. */
.refusals{display:grid;gap:16px;
  grid-template-columns:repeat(auto-fit,minmax(min(236px,100%),1fr))}
.ref-card{position:relative;padding:26px 24px 24px;border-radius:14px;
  background:linear-gradient(180deg,rgba(255,255,255,.05),rgba(255,255,255,.02));
  border:1px solid rgba(255,255,255,.1)}
.ref-no{font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--red-p);margin-bottom:11px}
.ref-card h4{color:#fff;font-size:18px;letter-spacing:-.015em;margin-bottom:9px}
.ref-card p{font-size:14.5px;line-height:1.62;color:#9AA0AC;margin-bottom:15px}
/* Its own words, set as its own words. */
.ref-said{margin:0;padding:13px 15px;border-radius:10px;border:0;
  border-left:2px solid var(--red-l);background:rgba(255,255,255,.04);
  font-size:13.5px;line-height:1.58;color:#C3C9D6;font-style:normal}

/* A block of cards after a visual needs air, or the two read as one shape whose
   top half happens to be dark. */
.after-viz{margin-top:clamp(28px,3.5vw,44px)}


/* ── the archipelago ──────────────────────────────────────────────────────
   The one graphic the home page is allowed to spend its weight on. */
.mapfig{margin:0;position:relative;
  --map-ink:rgba(255,255,255,.32);--map-accent:#FF6B74;--map-label:#B7BCC6;
  --map-ground:#0B0D12}
/* The country is tall and narrow. Given a wide box it draws small in the middle of a lot
   of nothing, so the box is the shape of the subject. */
.mapcv{display:block;width:100%;height:clamp(420px,52vw,640px)}
.mapcap{margin-top:16px;font-size:13px;color:#7A8194;line-height:1.55;max-width:24em}
.cream .mapfig,.light .mapfig{--map-ink:rgba(16,18,24,.26);--map-accent:#D5030C;
  --map-label:#3D4657;--map-ground:#F7F5F1}
.cream .mapcap{color:var(--ink-4)}

/* Words on the left, the country on the right, the way a page of this weight should
   carry its one graphic. */
.mapsplit{display:grid;grid-template-columns:minmax(0,.86fr) minmax(0,1.14fr);
  gap:clamp(30px,4vw,60px);align-items:center}
.mapsplit > .shead{margin-bottom:0}
@media(max-width:900px){
  .mapsplit{grid-template-columns:minmax(0,1fr)}
  .mapcv{height:clamp(340px,74vw,460px)}
}


/* ═══ the capability visuals ══════════════════════════════════════════════
   Six archetypes, each a different kind of thing to look at. They share a shell so
   they sit together on a page, and share nothing else — the whole point is that no
   two capability pages show the same picture.

   Every one is finished before it moves: widths are inline, figures are in the
   markup, and [data-lit] only releases what is already correct. */
.vz{border:1px solid var(--rule);border-radius:var(--r-l);background:var(--panel);
  padding:18px 20px 20px;color:var(--ink);overflow:hidden}
.dark .vz{background:var(--night-2);border-color:rgba(255,255,255,.1);color:#E8EBF1}
.vz-note{font-size:13px;color:var(--ink-4);margin-top:12px;line-height:1.55;font-style:italic}
.dark .vz-note{color:#7A8194}

/* ── post: a document becoming entries that balance ───────────────────────── */
.vz-post .po-src{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.po-k{font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.11em;
  text-transform:uppercase;color:var(--ink-4)}
.po-t{font-size:15px;font-weight:600}
.po-arrow{height:26px;position:relative;margin:6px 0 10px}
.po-arrow i{position:absolute;left:11px;top:0;bottom:0;width:1px;background:var(--rule-f);
  transform-origin:top;transform:scaleY(0);transition:transform .5s var(--ease)}
[data-lit].vz-post .po-arrow i{transform:scaleY(1)}
.po-head,.po-row,.po-foot{display:grid;grid-template-columns:minmax(0,1fr) 7.5rem 7.5rem;
  gap:10px;align-items:baseline}
.po-head{font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ink-4);padding-bottom:7px;
  border-bottom:1px solid var(--rule)}
.po-head span+span,.po-row span+span,.po-foot span+span{text-align:right}
.po-row{padding:9px 0;border-bottom:1px solid var(--rule-2);font-size:14px;
  opacity:0;transform:translateY(6px);transition:opacity .34s var(--ease),transform .34s var(--ease)}
[data-lit].vz-post .po-row{opacity:1;transform:none;transition-delay:calc(.35s + var(--i) * .1s)}
.po-a{font-weight:500}
.po-d,.po-c{font-variant-numeric:tabular-nums;color:var(--ink-3)}
.po-foot{padding-top:11px;font-size:14px;font-weight:600;font-variant-numeric:tabular-nums;
  opacity:0;transition:opacity .3s var(--ease) .95s}
[data-lit].vz-post .po-foot{opacity:1}
.po-foot.ok span:first-child{color:var(--ok)}
.po-foot.ok span:first-child::before{content:"\2713\00a0"}

/* ── ladder: buckets filling ──────────────────────────────────────────────── */
.vz-ladder .ld-top{display:flex;justify-content:space-between;align-items:baseline;gap:14px;
  padding-bottom:12px;margin-bottom:6px;border-bottom:1px solid var(--rule)}
.ld-h{font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.11em;
  text-transform:uppercase;color:var(--ink-4)}
.ld-tot{font-family:Fraunces,Georgia,serif;font-size:20px;font-weight:600;letter-spacing:-.02em}
.ld-row{display:grid;grid-template-columns:minmax(0,9rem) minmax(0,1fr) auto;gap:14px;
  align-items:center;padding:9px 0}
.ld-k{font-size:13.5px;font-weight:500;min-width:0}
.ld-k i{display:block;font-style:normal;font-size:11.5px;color:var(--ink-4);margin-top:1px}
.ld-track{height:9px;border-radius:5px;background:var(--sunk);overflow:hidden}
.dark .ld-track{background:rgba(255,255,255,.07)}
.ld-track b{display:block;height:100%;width:var(--w);border-radius:5px;background:var(--ok);
  transform-origin:left;transform:scaleX(0);
  transition:transform .7s cubic-bezier(.32,.72,.3,1)}
.ld-track b.stop{background:var(--red)}
[data-lit].vz-ladder .ld-track b{transform:scaleX(1);transition-delay:calc(var(--i) * .12s)}
.ld-v{font-size:13.5px;font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}

/* ── match: sources lining up, and the one that does not ──────────────────── */
.vz-match .mt-head,.vz-match .mt-row{display:grid;
  grid-template-columns:minmax(0,1.25fr) repeat(var(--c,3),minmax(0,1fr)) 26px;
  gap:12px;align-items:center}
.mt-head{font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ink-4);padding-bottom:8px;
  border-bottom:1px solid var(--rule)}
.mt-head span:not(:first-child):not(:last-child){text-align:right}
.mt-row{padding:11px 0;border-bottom:1px solid var(--rule-2);font-size:13.8px;
  opacity:0;transform:translateY(5px);
  transition:opacity .3s var(--ease),transform .3s var(--ease)}
[data-lit].vz-match .mt-row{opacity:1;transform:none;transition-delay:calc(var(--i) * .12s)}
.mt-k{font-weight:500}
.mt-row span:not(.mt-k):not(.mt-s){text-align:right;font-variant-numeric:tabular-nums;
  color:var(--ink-3)}
/* The tick lands after the row has settled, which is the moment the match happens. */
.mt-s{width:18px;height:18px;border-radius:50%;justify-self:end;position:relative;
  transform:scale(.4);opacity:0;transition:transform .26s var(--ease),opacity .26s}
[data-lit].vz-match .mt-s{transform:scale(1);opacity:1;
  transition-delay:calc(var(--i) * .12s + .3s)}
.mt-row.ok .mt-s{background:var(--ok-bg)}
.mt-row.hold .mt-s{background:var(--hold-bg)}
.mt-row.stop .mt-s{background:var(--red-bg)}
.mt-s::after{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font-size:11px;font-weight:700}
.mt-row.ok .mt-s::after{content:"\2713";color:var(--ok)}
.mt-row.hold .mt-s::after{content:"!";color:var(--hold)}
.mt-row.stop .mt-s::after{content:"\00d7";color:var(--red)}
.mt-row.stop{background:var(--red-bg);margin:0 -20px;padding-left:20px;padding-right:20px}
.dark .mt-row.stop{background:rgba(213,3,12,.1)}

/* ── curve: a quantity over time, drawn ───────────────────────────────────── */
.vz-curve .cv-top{display:flex;justify-content:space-between;align-items:baseline;gap:16px;
  margin-bottom:14px}
.cv-h{font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.11em;
  text-transform:uppercase;color:var(--ink-4)}
.cv-v{font-family:Fraunces,Georgia,serif;font-size:26px;font-weight:600;letter-spacing:-.025em;
  text-align:right;line-height:1.05}
.cv-v i{display:block;font-family:Inter,sans-serif;font-style:normal;font-size:12px;
  font-weight:500;color:var(--ink-4);letter-spacing:0;margin-top:3px}
.cv-plot{position:relative}
.cv-plot svg{display:block;width:100%;height:132px;overflow:visible}
.cv-line{fill:none;stroke:var(--red);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;
  vector-effect:non-scaling-stroke;
  stroke-dasharray:1000;stroke-dashoffset:1000;
  transition:stroke-dashoffset 1.5s cubic-bezier(.32,.72,.3,1)}
[data-lit].vz-curve .cv-line{stroke-dashoffset:0}
.cv-ghost{fill:none;stroke:var(--ink-faint);stroke-width:1.4;stroke-dasharray:4 4;
  vector-effect:non-scaling-stroke;opacity:0;transition:opacity .4s var(--ease) .5s}
[data-lit].vz-curve .cv-ghost{opacity:.7}
.cv-area{fill:var(--red-bg);opacity:0;transition:opacity .6s var(--ease) .8s}
/* --red-bg is a pale tint meant for white. On the dark ground it reads as a solid
   block and swallows the line it is supposed to sit under. */
.dark .cv-area{fill:rgba(213,3,12,.20)}
.dark .cv-ghost{stroke:rgba(255,255,255,.34)}
.dark .cv-mk circle{fill:var(--night-2);stroke:var(--red-l)}
.dark .cv-mk line{stroke:var(--red-l)}
.dark .cv-line{stroke:var(--red-l)}
.dark .cv-lab{color:var(--red-p)}
[data-lit].vz-curve .cv-area{opacity:1}
.cv-mk line{stroke:var(--red);stroke-width:1;stroke-dasharray:2 3;vector-effect:non-scaling-stroke}
.cv-mk circle{fill:#fff;stroke:var(--red);stroke-width:2;vector-effect:non-scaling-stroke}
.cv-mk{opacity:0;transition:opacity .3s var(--ease) 1.45s}
[data-lit].vz-curve .cv-mk{opacity:1}
.cv-lab{position:absolute;left:var(--x);top:-2px;transform:translateX(-50%);
  max-width:100%;
  font-family:'JetBrains Mono',monospace;font-size:10.5px;color:var(--red);white-space:nowrap;
  opacity:0;transition:opacity .3s var(--ease) 1.55s}
[data-lit].vz-curve .cv-lab{opacity:1}
.cv-lab.end{transform:translateX(-100%)}
.cv-lab.start{transform:none}

/* ── board: a matrix, lit cell by cell ────────────────────────────────────── */
.vz-board .bd-top{font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.11em;
  text-transform:uppercase;color:var(--ink-4);margin-bottom:13px}
.bd-head,.bd-row{display:grid;
  grid-template-columns:minmax(0,1.9fr) repeat(var(--c,4),minmax(0,1fr));gap:7px;
  align-items:center}
.bd-head{font-size:10.5px;color:var(--ink-4);padding-bottom:8px;line-height:1.3}
.bd-head span:not(:first-child){text-align:center}
.bd-row{padding:4px 0}
/* Wraps rather than truncates. "See the payroll reg…" is not a permission, and an
   ellipsis in a matrix is the reader being told the answer is none of their business. */
.bd-k{font-size:13.2px;font-weight:500;min-width:0;line-height:1.3;overflow-wrap:anywhere}
.bd-c{height:26px;border-radius:6px;background:var(--sunk);position:relative;
  opacity:0;transform:scale(.88);
  transition:opacity .22s var(--ease),transform .22s var(--ease)}
.dark .bd-c{background:rgba(255,255,255,.06)}
[data-lit].vz-board .bd-c{opacity:1;transform:none;
  transition-delay:calc(var(--i) * .09s + var(--j) * .045s)}
.bd-c.y{background:var(--ok-bg)} .bd-c.p{background:var(--hold-bg)}
.bd-c.n{background:var(--red-bg)}
.bd-c::after{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font-size:12px;font-weight:700}
.bd-c.y::after{content:"\2713";color:var(--ok)}
.bd-c.p::after{content:"\00b7\00b7";color:var(--hold);letter-spacing:1px}
.bd-c.n::after{content:"\00d7";color:var(--red)}

/* ── stream: rows arriving the way they actually arrive ───────────────────── */
.vz-stream .sr-top{display:flex;align-items:center;gap:9px;
  font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.11em;
  text-transform:uppercase;color:var(--ink-4);padding-bottom:11px;
  border-bottom:1px solid var(--rule)}
.sr-live{width:7px;height:7px;border-radius:50%;background:var(--ok);flex:none;
  box-shadow:0 0 0 0 var(--ok);animation:srpulse 2.4s var(--ease) infinite}
@keyframes srpulse{0%{box-shadow:0 0 0 0 rgba(20,138,94,.45)}
  70%{box-shadow:0 0 0 7px rgba(20,138,94,0)}100%{box-shadow:0 0 0 0 rgba(20,138,94,0)}}
.sr-row{display:grid;grid-template-columns:4.6rem minmax(0,1fr) auto;gap:12px;
  align-items:center;padding:10px 0;border-bottom:1px solid var(--rule-2);
  opacity:0;transform:translateX(-8px);
  transition:opacity .3s var(--ease),transform .3s var(--ease)}
[data-lit].vz-stream .sr-row{opacity:1;transform:none;transition-delay:calc(var(--i) * .15s)}
.sr-t{font-family:'JetBrains Mono',monospace;font-size:11.5px;color:var(--ink-4);
  font-variant-numeric:tabular-nums}
.sr-w{font-size:13.8px;font-weight:500;min-width:0}
.sr-w i{display:block;font-style:normal;font-size:12px;font-weight:400;color:var(--ink-4);
  margin-top:1px}
.sr-v{font-size:13.8px;font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}
.sr-row.ok .sr-v{color:var(--ok)} .sr-row.stop .sr-v{color:var(--red)}
.sr-row.hold .sr-v{color:var(--hold)}
.sr-foot{padding-top:12px;font-size:12.5px;color:var(--ink-4)}

@media(max-width:620px){
  .po-head,.po-row,.po-foot{grid-template-columns:minmax(0,1fr) 5.4rem 5.4rem;gap:7px;
    font-size:13px}
  .ld-row{grid-template-columns:minmax(0,7rem) minmax(0,1fr) auto;gap:9px}
  .vz-match .mt-head,.vz-match .mt-row{grid-template-columns:minmax(0,1.3fr)
    repeat(var(--c,3),minmax(0,1fr)) 20px;gap:7px;font-size:12.5px}
  .bd-head,.bd-row{gap:5px}
  .bd-k{font-size:12.2px}
  .sr-row{grid-template-columns:3.8rem minmax(0,1fr) auto;gap:9px}
}


/* ── the wiring ───────────────────────────────────────────────────────────
   One question fanning out across the modules it touches. Each line draws, the row
   count it came back with ticks up behind it, and the one that returns nothing does
   so because that session may not see it — which is the argument, not a caveat. */
.wiring{position:relative;border-radius:16px;padding:24px 26px 22px;
  background:linear-gradient(170deg,rgba(255,255,255,.055),rgba(255,255,255,.02));
  border:1px solid rgba(255,255,255,.1)}
.wr-q{font-family:Fraunces,Georgia,serif;font-size:clamp(17px,1.7vw,21px);font-weight:600;
  letter-spacing:-.02em;color:#fff;line-height:1.35;margin-bottom:20px}
.wr-k{display:block;font-family:'JetBrains Mono',monospace;font-size:10.5px;
  letter-spacing:.12em;text-transform:uppercase;color:var(--red-p);font-weight:500;
  margin-bottom:7px}
.wr-rows{list-style:none;display:grid;gap:2px}
.wr-row{display:grid;grid-template-columns:minmax(0,1fr) 5.4rem minmax(48px,1fr) 8.4rem;
  gap:0 14px;align-items:center;padding:10px 0;
  border-top:1px solid rgba(255,255,255,.07)}
.wr-row:first-child{border-top:0}
.wr-n{font-size:14px;font-weight:500;color:#E8EBF1;min-width:0}
.wr-t{font-family:'JetBrains Mono',monospace;font-size:11px;color:#7A8194;
  text-align:right;white-space:nowrap}
/* The line is the call. It draws toward the answer, once. */
.wr-line{position:relative;height:2px;border-radius:2px;background:rgba(255,255,255,.08);
  overflow:hidden}
.wr-line i{position:absolute;inset:0;border-radius:2px;transform-origin:left;
  transform:scaleX(0);background:linear-gradient(90deg,var(--red),var(--red-l));
  transition:transform .55s cubic-bezier(.32,.72,.3,1)}
[data-lit].wiring .wr-line i{transform:scaleX(1);transition-delay:calc(var(--i) * .16s)}
.wr-row.refused .wr-line i{background:rgba(255,150,90,.5)}
.wr-v{font-size:13px;font-weight:600;font-variant-numeric:tabular-nums;text-align:right;
  color:#8FE3C0;white-space:nowrap;opacity:0;transform:translateX(-5px);
  transition:opacity .3s var(--ease),transform .3s var(--ease)}
[data-lit].wiring .wr-v{opacity:1;transform:none;
  transition-delay:calc(var(--i) * .16s + .45s)}
.wr-row.refused .wr-v{color:#FFC7A8;font-weight:500}
.wr-out{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;margin-top:18px;
  padding-top:16px;border-top:1px solid rgba(255,255,255,.1);
  opacity:0;transition:opacity .4s var(--ease) 1.25s}
[data-lit].wiring .wr-out{opacity:1}
.wr-sum{font-family:Fraunces,Georgia,serif;font-size:24px;font-weight:600;color:#fff;
  letter-spacing:-.025em}
.wr-note{font-size:13px;color:#7A8194;line-height:1.5}
@media(max-width:640px){
  .wr-row{grid-template-columns:minmax(0,1fr) auto;gap:2px 10px}
  .wr-t{grid-column:2;text-align:right}
  .wr-line{grid-column:1 / -1;margin:6px 0 2px}
  .wr-v{grid-column:1 / -1;text-align:left}
}


/* ── the hero graphic ─────────────────────────────────────────────────────
   Bigger than a panel and not inside one: it bleeds past the wrap on the right so it
   reads as part of the page rather than an illustration placed on it. The answer card
   sits over the lower left of the country, where the dot field is sparse. */
.heromap{position:relative;margin:0;
  --map-ink:rgba(255,255,255,.34);--map-accent:#FF6B74;--map-label:#B7BCC6;
  --map-ground:#0B0D12}
.heromap .mapcv{display:block;width:100%;height:clamp(420px,42vw,620px)}
/* Past the right edge of the column, the way a hero graphic should sit. */
@media(min-width:1100px){
  .phero-aside > .heromap{margin-right:calc((100vw - min(100vw, 1240px)) / -2 - 32px);
    margin-left:-4%}
  .phero-aside > .heromap .mapcv{width:100%}
}
/* The card is the product, so it is the product's surface: white, crisp, and casting a
   real shadow onto the field behind it. A translucent grey rectangle on a dark ground is
   another layer of the same plane; a light card in front of a coloured field is the thing
   that makes a hero read as expensive. */
.hm-card{position:absolute;left:-2%;bottom:7%;max-width:min(360px,88%);
  padding:17px 19px 16px;border-radius:15px;
  background:#fff;border:0;
  box-shadow:0 2px 4px rgba(6,8,12,.18), 0 18px 34px rgba(6,8,12,.36),
             0 44px 80px rgba(6,8,12,.42);
  display:grid;gap:9px}
.hm-q{font-size:13px;line-height:1.45;color:var(--ink-3)}
.hm-q::before{content:"\201C"} .hm-q::after{content:"\201D"}
.hm-a{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}
.hm-a b{font-family:Fraunces,Georgia,serif;font-size:clamp(26px,2.8vw,34px);font-weight:600;
  letter-spacing:-.03em;line-height:1;color:var(--ink)}
.hm-a i{font-style:normal;font-size:13.5px;color:var(--ink-3)}
.hm-src{font-family:'JetBrains Mono',monospace;font-size:10.5px;letter-spacing:.06em;
  color:var(--ok);background:var(--ok-bg);border:1px solid var(--ok-ln);
  border-radius:999px;padding:4px 10px;justify-self:start}
.hm-src::before{content:"\2713\00a0"}
/* Each answer swaps rather than cuts. */
.hm-card[data-swap] .hm-q,.hm-card[data-swap] .hm-a,.hm-card[data-swap] .hm-src{
  opacity:0;transform:translateY(4px)}
.hm-q,.hm-a,.hm-src{transition:opacity .28s var(--ease),transform .28s var(--ease)}
/* On a phone the country was 350px wide inside the content padding — a diagram in a box,
   floating in a hero one and a half screens tall. It bleeds to both edges and takes the
   height it needs, and the answer sits on it rather than under it. */
@media(max-width:900px){
  .phero-aside > .heromap{margin-left:-20px;margin-right:-20px}
  /* Tall enough that the country fills the width — it is portrait, so a square box
     leaves a third of the canvas empty on each side — and tall enough that Mindanao
     still reads above the card sitting over the foot of it. */
  .heromap .mapcv{height:clamp(470px,134vw,600px)}
  .hm-card{left:16px;right:16px;bottom:14px;max-width:none}
  .hm-a b{font-size:clamp(22px,7vw,28px)}
}
@media(max-width:400px){
  .phero-aside > .heromap{margin-left:-20px;margin-right:-20px}
}


/* ── the checklist ────────────────────────────────────────────────────────
   A page that tells a buyer to interrogate every vendor should hand them the list. */
.vz-check .ck-top{margin-bottom:16px}
.ck-k{display:block;font-family:'JetBrains Mono',monospace;font-size:10.5px;
  letter-spacing:.12em;text-transform:uppercase;color:var(--red);font-weight:500;
  margin-bottom:7px}
.vz-check .ck-top{font-family:Fraunces,Georgia,serif;font-size:19px;font-weight:600;
  letter-spacing:-.02em}
.ck-rows{list-style:none;display:grid;gap:0}
.ck-row{display:grid;grid-template-columns:20px minmax(0,1fr);gap:4px 12px;
  padding:11px 0;border-top:1px solid var(--rule-2);align-items:start;
  opacity:0;transform:translateY(5px);
  transition:opacity .3s var(--ease),transform .3s var(--ease)}
.ck-row:first-child{border-top:0}
[data-lit].vz-check .ck-row{opacity:1;transform:none;transition-delay:calc(var(--i) * .08s)}
.ck-box{width:16px;height:16px;border-radius:4px;border:1.5px solid var(--rule-f);
  margin-top:2px}
.ck-q{font-size:14px;font-weight:550;line-height:1.4;color:var(--ink)}
.ck-w{grid-column:2;font-size:12.5px;color:var(--ink-4);line-height:1.5}
.dark .vz-check .ck-q{color:#E8EBF1} .dark .vz-check .ck-w{color:#7A8194}
.dark .ck-box{border-color:rgba(255,255,255,.22)}


/* ── a decision, not a chart ──────────────────────────────────────────────
   Consequence first, in the terms the owner carries: how many, by when, what it
   costs. Then the system's own reasoning in plain English, then the numbers it used.
   A tolerance percentage on a line chart is a fact about the model; this is a fact
   about the business. */
.vz-decide{padding:0;overflow:hidden}
.dc-alert{display:grid;grid-template-columns:auto minmax(0,1fr);gap:0 11px;
  align-items:start;padding:16px 20px;background:var(--red-bg);
  border-bottom:1px solid var(--rule-2)}
.dark .vz-decide .dc-alert{background:rgba(213,3,12,.12);
  border-bottom-color:rgba(255,255,255,.08)}
.dc-dot{width:9px;height:9px;border-radius:50%;background:var(--red);margin-top:5px;
  box-shadow:0 0 0 0 rgba(213,3,12,.5);animation:dcpulse 2.4s var(--ease) infinite}
@keyframes dcpulse{0%{box-shadow:0 0 0 0 rgba(213,3,12,.45)}
  70%{box-shadow:0 0 0 9px rgba(213,3,12,0)}100%{box-shadow:0 0 0 0 rgba(213,3,12,0)}}
.dc-alert b{display:block;font-size:15px;font-weight:600;line-height:1.4;color:var(--red-d)}
.dark .vz-decide .dc-alert b{color:#FFA3A8}
.dc-alert span span,.dc-alert div span{display:block;font-size:13px;color:var(--ink-3);
  margin-top:3px;line-height:1.5}
.dark .vz-decide .dc-alert div span{color:#B7BCC6}

.dc-why{padding:15px 20px 14px;border-bottom:1px solid var(--rule-2);
  font-size:13.6px;line-height:1.62;color:var(--ink-2)}
.dark .vz-decide .dc-why{color:#9AA0AC;border-bottom-color:rgba(255,255,255,.08)}
.dc-k{display:block;font-family:'JetBrains Mono',monospace;font-size:10.5px;
  letter-spacing:.12em;text-transform:uppercase;color:var(--ink-4);margin-bottom:6px}
.dc-why b{color:var(--ink);font-weight:600}
.dark .vz-decide .dc-why b{color:#fff}

.dc-facts{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1px;
  background:var(--rule-2)}
.dark .vz-decide .dc-facts{background:rgba(255,255,255,.08)}
.dc-fact{background:var(--panel);padding:13px 15px 14px;
  opacity:0;transform:translateY(5px);
  transition:opacity .3s var(--ease),transform .3s var(--ease)}
.dark .vz-decide .dc-fact{background:var(--night-2)}
[data-lit].vz-decide .dc-fact{opacity:1;transform:none;
  transition-delay:calc(var(--i) * .09s + .2s)}
.dc-fl{display:block;font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;
  color:var(--ink-4);margin-bottom:5px}
.dc-fv{display:block;font-family:Fraunces,Georgia,serif;font-size:19px;font-weight:600;
  letter-spacing:-.02em;line-height:1.1;white-space:nowrap}
.dc-fs{display:block;font-size:11.5px;color:var(--ink-4);margin-top:3px;line-height:1.4}

/* The range. Eighty per cent of outcomes fall in here — which is a more honest thing
   to show than a single number the model cannot actually promise. */
.dc-band{padding:15px 20px 16px;border-top:1px solid var(--rule-2)}
.dark .vz-decide .dc-band{border-top-color:rgba(255,255,255,.08)}
.dc-bt{display:flex;justify-content:space-between;gap:10px;font-size:10.5px;
  letter-spacing:.09em;text-transform:uppercase;color:var(--ink-4);margin-bottom:9px}
.dc-bt b{display:block;font-family:Fraunces,Georgia,serif;font-size:17px;font-weight:600;
  letter-spacing:-.02em;color:var(--ink);margin-top:3px;text-transform:none}
.dark .vz-decide .dc-bt b{color:#E8EBF1}
.dc-bt .mid{text-align:center;color:var(--red)} .dc-bt .mid b{color:var(--red)}
.dc-bt span:last-child{text-align:right}
.dc-track{position:relative;height:7px;border-radius:5px;
  background:linear-gradient(90deg,var(--red-bg),color-mix(in srgb,var(--red) 38%,transparent),
    var(--red-bg))}
.dc-track i{position:absolute;top:-4px;left:var(--p);width:2px;height:15px;
  background:var(--red);border-radius:2px;transform:scaleY(0);transform-origin:center;
  transition:transform .4s var(--ease) .55s}
[data-lit].vz-decide .dc-track i{transform:scaleY(1)}
.dc-bu{font-size:11.5px;color:var(--ink-4);margin-top:8px}

.dc-act{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:13px 20px 15px;
  border-top:1px solid var(--rule-2);background:var(--sunk)}
.dark .vz-decide .dc-act{background:rgba(255,255,255,.03);
  border-top-color:rgba(255,255,255,.08)}
.dc-go{font-size:13px;font-weight:600;color:#fff;background:var(--red);
  border-radius:7px;padding:7px 13px}
.dc-note{font-size:12.5px;color:var(--ink-4);line-height:1.5;flex:1 1 14rem;min-width:0}

@media(max-width:620px){
  .dc-facts{grid-template-columns:repeat(2,minmax(0,1fr))}
  .dc-fv{font-size:17px}
}


/* The line that says what the thing underneath it means. Without it a visual is a fact
   about the data; with it, it is a fact about the business. */
.vz-lead{margin:-2px 0 16px;padding-bottom:14px;border-bottom:1px solid var(--rule-2)}
.dark .vz-lead{border-bottom-color:rgba(255,255,255,.09)}
.vz-lead b{display:block;font-size:15px;font-weight:600;line-height:1.42;color:var(--ink);
  letter-spacing:-.012em}
.dark .vz-lead b{color:#fff}
.vz-lead span{display:block;font-size:13px;color:var(--ink-3);line-height:1.55;margin-top:4px}
.dark .vz-lead span{color:#9AA0AC}


/* The calculator on a phone: the same argument, without a screen and a half of padding
   between each part of it. */
@media(max-width:600px){
  .calc-head{padding:16px 16px 14px}
  .calc-body{padding:16px}
  .shapes{gap:6px}
  .shape{font-size:12.5px;padding:7px 11px}
  .tco{gap:10px}
  .tco-legend{gap:10px;font-size:11.5px}
  .tco-note{margin-left:0;flex-basis:100%}
  .calc-gap{padding:13px 15px;margin:14px 0}
  .calc-gap p{font-size:14px;line-height:1.55}
  .bill-note{font-size:12px;margin-top:10px}
  /* And the decision card, which was four pixels over a screen. */
  .vz-decide .dc-alert{padding:14px 16px}
  .vz-decide .dc-why{padding:13px 16px 12px;font-size:13px}
  .vz-decide .dc-fact{padding:11px 13px 12px}
  .vz-decide .dc-band{padding:13px 16px 14px}
  .vz-decide .dc-act{padding:11px 16px 13px}
}



/* ── the globe ────────────────────────────────────────────────────────────
   The ocean is empty on purpose. Stripe's globes have no sphere, no graticule and
   no coastline: the land IS the dots, and everything else is the page showing
   through. Drawing a filled sphere behind this would cost the single thing that
   makes it read as expensive. */
.heroglobe{position:relative;margin:0;display:block}
/* A little shorter, so the figure band clears the fold on a laptop. The country loses
   about twenty pixels of height and keeps every dot. */
.heroglobe .globecv{display:block;width:100%;
  height:clamp(400px,40vw,576px)}

/* Past the right edge of the column. A hero graphic that stops politely at the
   content gutter reads as an illustration dropped onto the page; one that runs off
   it reads as a window onto something bigger. */
@media(min-width:1100px){
  .phero-aside > .heroglobe{margin-right:calc((100vw - min(100vw, 1240px)) / -2 - 32px);
    margin-left:-6%}
}

/* The card on a light ground: a real but much softer shadow, and a hairline, because
   white-on-near-white needs an edge that white-on-dark does not. */
/* White on near-white needs a real edge and a real shadow or the card has no
   presence at all — on a dark ground the contrast did that work for free. */
.heroglobe .hm-card{
  box-shadow:0 1px 2px rgba(16,18,22,.05), 0 12px 28px rgba(16,18,22,.10),
             0 36px 68px rgba(16,18,22,.12);
  border:1px solid var(--rule)}

/* ── the answer slot ──────────────────────────────────────────────────────
   One cell, two states. The thinking line and the answer are stacked on top of each
   other rather than placed in sequence, so the card is exactly one height from the
   moment it appears: no reserved void under a question, and no jump when the figure
   lands. */
.hm-slot{display:grid;grid-template-areas:"slot";align-items:start}
.hm-slot > *{grid-area:slot}
.hm-ans{display:grid;gap:9px;align-content:start}
/* The two states cross-fade in SEQUENCE, not together. Overlapped, the thinking line
   sat on top of the figure — "Reading 1,204 rows…" printed straight through
   "P612,480" — because both occupy the same cell. The line leaves first, quickly; the
   figure arrives after it has gone. */
.hm-think{display:grid;gap:9px;align-content:start;padding-top:2px;
  transition:opacity .13s var(--ease)}
.hm-th-t{font-size:13px;color:var(--ink-4);font-style:italic}
/* The skeleton: a shape the size of the figure that is coming, sweeping slowly. It is
   what turns "nothing here yet" into "this is being worked out". */
.hm-sk{display:block;border-radius:7px;
  background:linear-gradient(100deg,#EFF1F4 8%,#E3E6EB 26%,#EFF1F4 44%);
  background-size:260% 100%;animation:hmskim 1.25s linear infinite}
.hm-sk-v{height:30px;width:58%;max-width:190px}
.hm-sk-s{height:19px;width:150px;border-radius:999px}
@keyframes hmskim{from{background-position:140% 0}to{background-position:-60% 0}}
@media(prefers-reduced-motion:reduce){.hm-sk{animation:none}}
.heroglobe .hm-card:not(.pending) .hm-think{opacity:0;pointer-events:none;
  transition:opacity .12s var(--ease)}
/* Delayed on the way in as well as on the way out. Without this, going INTO the
   thinking state faded the line up while the figure was still fading down, and the two
   crossed. Each state waits for the other to leave. */
.heroglobe .hm-card.pending .hm-think{opacity:1;transition:opacity .13s var(--ease) .18s}
/* During the swap the question is fading out too, so the thinking line must arrive
   AT ONCE rather than inheriting the delay from the rule above — otherwise all three
   are invisible together for 130ms and the card blinks empty. Equal specificity means
   source order decides the opacity, but the transition has to be restated or the
   delayed one carries over. The 100ms is measured: the figure falls below legibility
   at 90ms, and with no delay at all the line rose through it while it was still at
   0.63. The question is still fading over 280ms, so nothing is ever blank. */
.heroglobe .hm-card[data-swap] .hm-think{opacity:1;
  transition:opacity .16s var(--ease) .1s}

/* And the answer is HIDDEN while the rows are still arriving. Without this the figure
   sat in the same cell at full opacity the whole time and the thinking line printed
   straight through it. The delay on the way back in is what keeps the two from ever
   being legible at once. */
.hm-ans{transition:opacity .3s var(--ease) .2s, transform .3s var(--ease) .2s}
.heroglobe .hm-card.pending .hm-ans{opacity:0;transform:translateY(5px);
  transition:opacity .1s var(--ease), transform .1s var(--ease)}
@media(prefers-reduced-motion:reduce){
  .heroglobe .hm-card.pending .hm-ans{opacity:1;transform:none}
  .hm-think{display:none}
}

.globe-cap{margin-top:14px;font-family:'JetBrains Mono',monospace;font-size:11px;
  letter-spacing:.1em;text-transform:uppercase;color:var(--ink-4)}

/* ── on a phone ───────────────────────────────────────────────────────────
   Measured off Stripe: their hero graphic is 640px wide inside a 390px viewport and
   the document still does not scroll sideways. They do not shrink the graphic to fit
   — they let it overflow and clip it. Shrinking a dashboard to 340px is what makes a
   site look cheap; cropping it looks like a window onto a real surface.
   So: the globe bleeds to both edges and takes the height it needs, and the card sits
   ON it rather than under it. Text never does this — only graphics. */
@media(max-width:900px){
  .phero-aside > .heroglobe{margin-left:-28px;margin-right:-28px}
  .heroglobe .globecv{height:clamp(430px,116vw,560px)}
  .heroglobe .hm-card{left:20px;right:20px;bottom:10px;max-width:none}
}
@media(prefers-reduced-motion:reduce){
  .heroglobe .hm-q,.heroglobe .hm-a,.heroglobe .hm-src{transition:none}
}


/* ═══ hero scenes ═════════════════════════════════════════════════════════ */

/* ── the composition, corrected against Stripe ────────────────────────────
   The first build stacked the front card ON the back surface, absolutely
   positioned over its left side. On the retail page that hid the entire branch
   NAME column, so the reader saw "…arry", "18.4%", "losing" and could not tell
   what any row was. A picture whose subject is obscured by the thing in front of
   it says nothing, however well drawn both halves are.

   Measured off stripe.com/use-cases/ai: their assistant card spans x838–1235 and
   their dashboard x1255–1950. They do not overlap AT ALL — they sit side by side
   with a 20px gap, and the depth comes from different vertical offsets and
   different shadows, not from one covering the other.

   So: a two-column grid. The surfaces sit beside each other with a small, deliberate
   overlap that lands on the back surface's own border and padding, never on its
   content. Depth comes from vertical offset, shadow weight and z-order. Both titles
   stay readable, which is the whole point of having two of them. */
.scene{position:relative;margin:0;display:grid;gap:20px;align-items:center;
  grid-template-columns:minmax(0,272px) minmax(0,1fr);
  padding:12px 0 30px}
.scene > *{grid-row:1}
.scene *{min-width:0}

.sf{background:var(--panel);border:1px solid var(--rule);border-radius:var(--r);
  overflow:hidden}
/* Behind, and lower: the surface that is complete and still. */
.sf-back{grid-column:2;z-index:1;position:relative;
  box-shadow:0 1px 2px rgba(16,18,22,.04), 0 6px 18px rgba(16,18,22,.06)}
/* In front, and lifted: the surface that assembles. A 26px overlap still clipped
   nineteen pixels off every branch NAME, because a window's first column starts
   thirteen pixels inside its own border. Stripe leave a 20px GAP and take the depth
   from vertical offset and shadow weight instead — which cannot cover anything,
   ever, at any width. */
.sf-front{grid-column:1;z-index:2;position:relative;
  box-shadow:0 2px 6px rgba(16,18,22,.07), 0 16px 34px rgba(16,18,22,.13),
             0 40px 70px rgba(16,18,22,.10)}

/* The three variants change the vertical relationship, so eight pages built from
   one kit still open on eight different compositions. */
.scene--offset .sf-front{transform:translateY(14px)}
.scene--offset .sf-back{transform:translateY(-12px)}
.scene--rise .sf-front{transform:translateY(-18px)}
.scene--rise .sf-back{transform:translateY(16px)}
/* No mirror. Putting the still surface on the LEFT meant bleeding it off the left
   edge of the viewport, which took its first column — the row NAMES — with it: the
   hotel page showed "of 86 avail…" and "commissi…" with nothing to say what they
   belonged to. A window running off the RIGHT edge reads as continuing; one running
   off the left reads as broken. So `corner` keeps the arrangement and changes the
   rhythm, which is what actually distinguishes these at a glance anyway. */
.scene--corner .sf-front{transform:translateY(-6px)}
.scene--corner .sf-back{transform:translateY(20px)}

/* Past the right edge of the column, like the globe and like Stripe's own hero
   dashboard — so the back surface has a real width to be cropped from rather than
   being squeezed into whatever the column leaves over. */
@media(min-width:1100px){
  /* Past the right edge of the column — but only so far. Derived purely from the
     viewport, the bleed is -132px at 1440 and -377px at 1930, so on a wide monitor the
     window ran all the way into the screen border and sliced a status pill in half.
     A graphic that touches the edge of the display reads as a mistake whatever the
     intent behind it. max() of two negatives takes the less negative, so this is a
     floor: a generous crop where space is tight, and a real right-hand margin on a
     big screen. Measured off Stripe, whose own hero dashboard stops 36-104px short of
     the viewport edge on a desktop — they do not full-bleed there either. The `- 4px` rather than the gutter's full
     32px is what leaves a consistent 28px of page to the right at EVERY width — at
     1280 the viewport is barely wider than the wrap, and the old figure put the
     window hard against the screen edge again. */
  .phero-aside > .scene .sf-back{
    margin-right:max(calc((100vw - min(100vw, 1240px)) / -2 - 4px), -104px)}
}

/* ── window chrome ──────────────────────────────────────────────────────── */
.sf-bar{display:flex;align-items:center;gap:10px;padding:9px 13px;
  border-bottom:1px solid var(--rule-2);background:var(--sunk)}
.sf-dots{display:flex;gap:5px}
.sf-dots i{width:8px;height:8px;border-radius:50%;background:#D6D8DC;display:block}
.sf-title{font-size:11.5px;color:var(--ink-4);font-weight:500;letter-spacing:-.005em;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sf-tag{margin-left:auto;font-family:'JetBrains Mono',monospace;font-size:9.5px;
  letter-spacing:.08em;text-transform:uppercase;color:var(--ink-4);flex:none}

/* ── a list of real rows ────────────────────────────────────────────────── */
.sf-rows{width:100%;border-collapse:collapse;font-size:12px}
.sf-rows td{padding:8px 13px;border-bottom:1px solid var(--rule-2);
  color:var(--ink-2);white-space:nowrap}
.sf-rows tr:last-child td{border-bottom:0}
.sf-rows .n{text-align:right;font-variant-numeric:tabular-nums;color:var(--ink);
  font-weight:500}
.sf-rows .sub{color:var(--ink-4);font-size:11px;
  overflow:hidden;text-overflow:ellipsis;max-width:0;width:38%}
.sf-rows tr.lit td{background:var(--red-bg)}
.sf-rows tr.lit .n{color:var(--red-d)}

/* ── the pill ───────────────────────────────────────────────────────────── */
.sf-pill{display:inline-block;font-family:'JetBrains Mono',monospace;font-size:9.5px;
  letter-spacing:.05em;padding:2px 7px;border-radius:999px;border:1px solid;
  white-space:nowrap}
.sf-pill.ok{color:var(--ok);background:var(--ok-bg);border-color:var(--ok-ln)}
.sf-pill.hold{color:var(--hold);background:var(--hold-bg);border-color:var(--hold-ln)}
.sf-pill.stop{color:var(--red-d);background:var(--red-bg);border-color:var(--red-ln)}

/* ── printed paper ──────────────────────────────────────────────────────────
   An official receipt, a delivery receipt, a payslip. These are the documents a
   Philippine business actually hands over, so they are drawn as paper and not as
   UI: mono throughout, centred header, a torn foot. The torn edge is a mask, so
   it works on any background without a matching cut-out. */
/* No torn-edge mask. The first build cut one with `mask-repeat:repeat-x`, which tiles
   the scallop across the top ten pixels and masks away everything below it — so the
   receipt rendered as a five-pixel sliver and the hero looked like it had one surface.
   A document reads as paper from its type, its centred header and its dashed rules;
   the deckle edge was never carrying it. */
.pap{background:#FFFEFB;border:1px solid var(--rule);border-radius:4px;
  font-family:'JetBrains Mono',ui-monospace,monospace;font-size:10.5px;
  line-height:1.62;color:var(--ink-1);padding:14px 15px 15px;
  box-shadow:0 2px 6px rgba(16,18,22,.08), 0 16px 34px rgba(16,18,22,.14),
             0 40px 70px rgba(16,18,22,.10)}
.pap-h{text-align:center;border-bottom:1px dashed var(--rule-f);padding-bottom:8px;
  margin-bottom:8px}
.pap-h b{display:block;font-weight:600;letter-spacing:.04em;font-size:11px}
.pap-h span{display:block;color:var(--ink-4);font-size:9.5px;letter-spacing:.03em}
/* Label left, figure right, and the figure never moves. A long label wraps under
   itself rather than pushing the amount onto a second line — an amount that drifts
   off its own row is the fastest way a printed document stops looking printed. */
.pap-l{display:flex;justify-content:space-between;gap:10px;align-items:baseline}
.pap-l > span:first-child{min-width:0}
.pap-l span:last-child{font-variant-numeric:tabular-nums;flex:none}
.pap-l.dim{color:var(--ink-4)}
.pap-l.red span:last-child{color:var(--red-d)}
.pap-rule{border-top:1px dashed var(--rule-f);margin:8px 0}
.pap-tot{display:flex;justify-content:space-between;gap:10px;font-weight:600;
  font-size:12.5px;border-top:1px solid var(--ink-1);margin-top:8px;padding-top:7px}
.pap-tot span:last-child{font-variant-numeric:tabular-nums}
.pap-f{text-align:center;color:var(--ink-4);font-size:9px;letter-spacing:.05em;
  margin-top:9px;text-transform:uppercase}

/* ── the assistant card ─────────────────────────────────────────────────────
   Stripe's AI page animates exactly this and nothing else on the screen: the
   dashboard behind stays perfectly still while one card thinks, answers, and
   offers the action. */
.ask{background:var(--panel);border:1px solid var(--rule);border-radius:var(--r);
  overflow:hidden}
/* Scoped under .ask, the card's own root. The assistant console in css_viz.py has the
   same parts with the same names on a dark ground; unscoped, whichever file loaded last
   decided what colour both of them were. */
.ask .ask-h{display:flex;align-items:center;gap:8px;padding:10px 13px;
  border-bottom:1px solid var(--rule-2)}
.ask-h b{font-size:11.5px;font-weight:600;color:var(--red)}
.ask .ask-mk{width:17px;height:17px;border-radius:5px;background:var(--red);flex:none;
  display:grid;place-items:center}
.ask .ask-mk::before{content:"";width:7px;height:7px;border-radius:2px;background:#fff}
.ask .ask-b{padding:12px 13px;display:grid;gap:9px}
.ask .ask-q{font-size:12px;color:var(--ink-3);line-height:1.45}
.ask .ask-v{font-family:Fraunces,Georgia,serif;font-size:clamp(22px,2.4vw,28px);
  font-weight:600;letter-spacing:-.03em;line-height:1;color:var(--ink);
  font-variant-numeric:tabular-nums}
.ask .ask-u{font-size:11.5px;color:var(--ink-3)}
.ask .ask-src{font-family:'JetBrains Mono',monospace;font-size:9.5px;letter-spacing:.05em;
  color:var(--ok);background:var(--ok-bg);border:1px solid var(--ok-ln);
  border-radius:999px;padding:3px 9px;justify-self:start}
.ask .ask-src::before{content:"\2713\00a0"}

/* ── the staged reveal ──────────────────────────────────────────────────────
   Nothing is hidden until the script says so. A page whose hero is parked at
   opacity 0 waiting for an observer is a blank hero to anybody whose script
   failed, and a blank thumbnail to everybody. */
.js-stage [data-step]{opacity:0;transform:translateY(7px);
  transition:opacity .42s var(--ease), transform .42s var(--ease)}
.js-stage [data-step].on{opacity:1;transform:none}
/* The thinking line, shown only while the answer is still coming. */
.ask .ask-think{font-size:12px;color:var(--ink-4)}
.js-stage .ask .ask-think{opacity:1;transform:none}
.js-stage .ask-think.off{opacity:0;transition:opacity .3s var(--ease)}
@media(prefers-reduced-motion:reduce){
  .js-stage [data-step]{opacity:1;transform:none;transition:none}
  .ask .ask-think{display:none}
}

/* ── on a phone ─────────────────────────────────────────────────────────────
   The two surfaces STACK rather than overlap. Overlapping needs room either side
   of the front card for the surface behind to keep reading; in a 334px column the
   card covers almost all of it, so the composition collapses to one thing anyway —
   and on the payroll page the payslip landed on top of the "See what it costs"
   button, which is a good deal worse than looking flat.

   What is kept from Stripe is the crop: their hero dashboard is 640px wide inside a
   390px viewport and the document still does not scroll sideways. The back surface
   keeps a real width and runs off the right edge, because a register squeezed to
   334px is what makes a site look cheap. The front card stays fully on screen — it
   carries the point, and it is the one thing here that must be read whole. */
@media(max-width:900px){
  .scene{display:flex;flex-direction:column;align-items:flex-start;gap:11px;
    padding:0 0 4px}
  /* Six rows of a register under a full receipt is 550px of hero graphic on a phone —
     two separate boxes rather than one composition, and it pushes the first real
     section a screen and a half down. Four rows says the same thing: the list
     continues, which is the point of cropping it. */
  .scene .sf-back .sf-rows tr:nth-child(n+5){display:none}
  /* The desktop variants offset each surface vertically to give them depth. Stacked,
     those transforms just push the front card down into the one below it — a 15px
     overlap at every width under 900. Depth is the column layout's job, not the
     stack's. */
  .scene .sf-front,.scene .sf-back,
  .scene--offset .sf-front,.scene--offset .sf-back,
  .scene--rise .sf-front,.scene--rise .sf-back,
  .scene--corner .sf-front,.scene--corner .sf-back{transform:none}
  .scene .sf-front{position:static;order:1;width:100%;max-width:336px}
  .scene .sf-back{order:2;margin:0;width:124%;max-width:none;flex:none}
  /* The graphic may bleed. Nothing else on the page does, and the document never
     scrolls sideways — which the mobile guard checks separately. */
  .scene{overflow:visible}

  /* 9px is a decorative size on a desktop card and an unreadable one in the hand.
     Nothing in a hero graphic goes under 10.5px on a phone. */
  .sf-tag,.sf-pill,.pap-h span,.pap-f,.ask .ask-src{font-size:10.5px}
  .pap{font-size:11px}
  .sf-rows td{padding:8px 12px;font-size:12px}
}
@media(max-width:400px){
  .scene .sf-back{width:132%}
  .scene .sf-front{max-width:none}
}
@media(prefers-reduced-motion:reduce){
  .js-stage [data-step]{opacity:1;transform:none;transition:none}
  .ask .ask-think{display:none}
}
