
html[data-theme="dark"]{
  --bg:#141419; --bg2:#1A1A21; --pan:#1F1F27; --pan2:#26262B; --hair:#2C2C36; --line:#3B3B49;
  --tx:#EAF0F8; --mut:#8C99B2; --mut2:#8390A8;
  --red:#B4232A; --red2:#E2838A; --redS:rgba(180,35,42,.13);
  --cy:#2FA8C6; --cy2:#7FDFF2; --cyS:rgba(47,168,198,.12);
  --yk:#F0C14B; --ykd:#F0C14B; --ykS:rgba(240,193,75,.14);
 --grn:#2F8E62; --grnd:#7FCFA5; --grnS:rgba(47,142,98,.14);
  --gridl:rgba(140,153,178,.05); --barbg:rgba(20,20,25,.88); --sheetbg:rgba(16,16,20,.97);
  --chipbg:rgba(20,20,25,.78); --cardsh:0 18px 44px rgba(0,0,0,.4); 

  
  color-scheme:dark;
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}
body{background:var(--bg);color:var(--tx);font:16px/1.6 var(--sans);overflow-x:hidden}
body::before{content:'';position:fixed;inset:0;z-index:0;pointer-events:none;background-image:linear-gradient(var(--gridl) 1px,transparent 1px),linear-gradient(90deg,var(--gridl) 1px,transparent 1px);background-size:52px 52px}
body::after{content:'';position:fixed;inset:0;z-index:0;pointer-events:none;background:radial-gradient(620px 480px at 8% -8%,rgba(180,35,42,.1),transparent 60%),radial-gradient(680px 540px at 96% 108%,rgba(47,168,198,.08),transparent 60%)}
img{display:block;max-width:100%}a{color:inherit}button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
::selection{background:var(--yk);color:#1A1405}
:focus-visible{outline:2px solid var(--yk);outline-offset:3px;border-radius:4px}
.skip{position:fixed;left:12px;top:-60px;z-index:200;background:var(--yk);color:#1A1405;padding:10px 16px;font:600 12px var(--mono);letter-spacing:.1em}
.skip:focus{top:12px}
/* 160, not 120: the menu sheet is 150 and covers the whole viewport, so a header
   below it put the burger — the only close control the sheet has — underneath the
   overlay. The sheet is 97% opaque, so the X still bled through faintly and looked
   like a dim close icon, but every tap landed on .menu instead of the button and
   the menu could not be closed at all. The menu's own padding-top:90px already
   reserved this strip, so the header was always meant to sit above it. Still
   below .scrim (180) and .drawer (190), so opening a brief still dims the header. */
.bar{position:fixed;top:0;left:0;right:0;z-index:160;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 24px;border-bottom:1px solid transparent;transition:background .35s var(--ease),border-color .35s,padding .35s}
.bar.solid{background:var(--barbg);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border-bottom-color:var(--hair);padding:10px 24px}
.brand{display:flex;align-items:center;gap:12px;text-decoration:none}
.brandmark{position:relative;display:block;width:40px;height:40px;flex:none}
.brandmark::before{content:'';position:absolute;inset:0;background:var(--line);clip-path:var(--hex)}
.brandmark img{position:absolute;left:1px;top:1px;width:calc(100% - 2px);height:calc(100% - 2px);object-fit:cover;object-position:center 18%;clip-path:var(--hex)}
.bt b{display:block;font:700 17px/1.1 var(--disp);letter-spacing:.1em;text-transform:uppercase}
.bt span{font:600 9.5px var(--mono);letter-spacing:.16em;color:var(--mut);text-transform:uppercase}
.nav{display:flex;gap:2px}
.nav a{position:relative;padding:10px 11px;text-decoration:none;font:600 11.5px var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--mut)}
.nav a i{font-style:normal;color:var(--mut2);margin-right:5px;font-size:10px}
.nav a::after{content:'';position:absolute;left:11px;right:11px;bottom:4px;height:2px;background:var(--grad);transform:scaleX(0);transform-origin:left;transition:transform .3s var(--ease)}
.nav a.on,.nav a:hover{color:var(--tx)}
.nav a.on::after{transform:scaleX(1)}
.nav a[data-v="finance"].on::after{background:var(--yk)}
.bar-r{display:flex;align-items:center;gap:10px}
.crumb{font:600 10.5px var(--mono);letter-spacing:.14em;color:var(--mut);text-transform:uppercase;white-space:nowrap}
.crumb b{color:var(--ykd)}
.burger{display:none;width:44px;height:44px;flex-direction:column;align-items:center;justify-content:center;gap:5px;border:1px solid var(--line)}
.burger i{width:18px;height:2px;background:var(--tx);transition:.3s}
.burger.x i:nth-child(1){transform:translateY(7px) rotate(45deg)}
.burger.x i:nth-child(2){opacity:0}
.burger.x i:nth-child(3){transform:translateY(-7px) rotate(-45deg)}
.btn{position:relative;display:inline-flex;align-items:center;justify-content:center;gap:9px;min-height:46px;padding:12px 22px;font:700 13px var(--mono);letter-spacing:.12em;text-transform:uppercase;text-decoration:none;cursor:pointer;transition:transform .25s var(--ease),box-shadow .25s;clip-path:polygon(10px 0,100% 0,100% calc(100% - 10px),calc(100% - 10px) 100%,0 100%,0 10px)}
.btn:hover{transform:translateY(-2px)}
.btn-g{background:var(--grad);color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.25);box-shadow:0 8px 26px rgba(180,35,42,.22)}
.btn-o{border:1px solid var(--cy);color:var(--cy);background:var(--cyS)}
.btn-r{border:1px solid var(--red);color:var(--red2);background:var(--redS)}
.btn-y{border:1px solid var(--yk);color:var(--ykd);background:var(--ykS)}
.btn-n{border:1px solid var(--line);color:var(--tx);background:var(--pan)}
.menu{position:fixed;inset:0;z-index:150;background:var(--sheetbg);display:none;flex-direction:column;justify-content:center;padding:90px 30px 40px}
.menu.on{display:flex}
.menu .mh{font:600 11px var(--mono);letter-spacing:.2em;color:var(--mut);text-transform:uppercase;margin-bottom:22px}
.mnl{display:flex;align-items:baseline;gap:16px;padding:15px 0;border-bottom:1px solid var(--hair);text-decoration:none;font:700 28px var(--disp);letter-spacing:.05em;text-transform:uppercase}
.mnl i{font:600 12px var(--mono);color:var(--ykd);font-style:normal}
.mnl small{margin-left:auto;font:600 10px var(--mono);color:var(--mut2);letter-spacing:.14em}
main{position:relative;z-index:1}
.view{display:none}.view.on{display:block;animation:vin .5s var(--ease)}
@keyframes vin{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
.sec{max-width:var(--max);margin:0 auto;padding:80px 24px}
.sec.tight{padding-top:48px}
.kicker{display:inline-flex;align-items:center;gap:9px;font:600 11.5px var(--mono);letter-spacing:.2em;text-transform:uppercase;color:var(--cy);margin-bottom:16px}
.kicker::before{content:'';width:26px;height:1px;background:var(--grad)}
.kicker.r{color:var(--red2)}.kicker.y{color:var(--ykd)}
.h2{font:700 clamp(30px,4.6vw,52px)/1.05 var(--disp);letter-spacing:.03em;text-transform:uppercase;margin-bottom:16px}
.h2 em{font-style:normal;color:var(--cy)}.h2 em.r{color:var(--red2)}.h2 em.y{color:var(--ykd)}
.lede{max-width:640px;color:var(--mut);font-size:1.06rem}
.rv{opacity:0;transform:translateY(20px);transition:opacity .7s var(--ease),transform .7s var(--ease);transition-delay:var(--d,0ms)}
.rv.in{opacity:1;transform:none}
.cut{clip-path:polygon(14px 0,100% 0,100% calc(100% - 14px),calc(100% - 14px) 100%,0 100%,0 14px)}
/* hero */
.hero2{max-width:var(--max);margin:0 auto;padding:126px 24px 56px;display:grid;grid-template-columns:1.08fr .92fr;gap:48px;align-items:center;min-height:88vh}
.eyebrow{display:inline-flex;align-items:center;gap:8px;font:600 11px var(--mono);letter-spacing:.16em;text-transform:uppercase;color:var(--mut);border:1px solid var(--line);background:var(--pan);padding:8px 14px;margin-bottom:22px}
.eyebrow u{text-decoration:none;color:var(--ykd)}
.h1{font:700 clamp(38px,4.9vw,66px)/1.03 var(--disp);letter-spacing:.015em;text-transform:uppercase;margin-bottom:20px}
.h1 .ln{display:block;overflow:hidden}
.h1 .ln span{display:inline-block;transform:translateY(110%);animation:lup .8s var(--ease) forwards;animation-delay:var(--d,0ms)}
@keyframes lup{to{transform:none}}
.h1 .ac{color:var(--cy)}.h1 .ar{color:var(--red2)}.h1 .ay{color:var(--ykd)}
.sub{max-width:560px;color:var(--mut);font-size:1.08rem;margin-bottom:28px}.sub b{color:var(--tx);font-weight:600}
.cta-row{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:28px}
.pchips{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px;max-width:560px}
.pchip{display:flex;align-items:center;gap:9px;border:1px solid var(--hair);background:var(--pan);padding:10px 13px;font:600 11.5px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--mut)}
.pchip u{text-decoration:none;color:var(--cy)}.pchip:nth-child(even) u{color:var(--red2)}
.pcard{position:relative;justify-self:center;width:min(400px,100%);background:var(--pan);border:1px solid var(--line);padding:14px;clip-path:polygon(18px 0,100% 0,100% calc(100% - 18px),calc(100% - 18px) 100%,0 100%,0 18px)}
.cnr{position:absolute;width:22px;height:22px;border:2px solid var(--cy);z-index:3;pointer-events:none}
.cnr.tl{top:-2px;left:-2px;border-right:0;border-bottom:0}.cnr.tr{top:-2px;right:-2px;border-left:0;border-bottom:0;border-color:var(--red)}
.cnr.bl{bottom:-2px;left:-2px;border-right:0;border-top:0;border-color:var(--red)}.cnr.br{bottom:-2px;right:-2px;border-left:0;border-top:0}
.pc-tag{position:absolute;top:24px;left:24px;z-index:2;font:600 10px var(--mono);letter-spacing:.18em;color:var(--cy);background:var(--chipbg);border:1px solid var(--line);padding:5px 9px;text-transform:uppercase}
.pc-id{position:absolute;top:24px;right:24px;z-index:2;font:600 10px var(--mono);letter-spacing:.14em;color:var(--yk);background:var(--chipbg);border:1px solid var(--line);padding:5px 9px}
.pc-frame{position:relative;aspect-ratio:4/5;overflow:hidden;background:var(--pan2)}
.pslide{position:absolute;inset:0;opacity:0;transition:opacity 1s var(--ease)}.pslide.on{opacity:1}
.pslide img{width:100%;height:100%;object-fit:cover;object-position:top}
.pc-scan{position:absolute;inset:0;z-index:2;pointer-events:none;background:linear-gradient(to top,rgba(20,20,25,.94) 0%,rgba(20,20,25,.86) 26%,rgba(20,20,25,.25) 48%,transparent 68%)}
.pc-meta{position:absolute;left:0;right:0;bottom:0;z-index:3;padding:16px 18px 14px}
.pc-meta>b{display:block;font:700 22px var(--disp);letter-spacing:.08em;text-transform:uppercase;color:#fff}
.pc-meta>span{font:600 10px var(--mono);letter-spacing:.16em;color:var(--cy);text-transform:uppercase}
.pdots{position:absolute;right:14px;bottom:152px;z-index:4;display:flex;flex-direction:column;gap:7px}
.pdots button{width:22px;height:22px;display:grid;place-items:center}
.pdots button::after{content:'';width:6px;height:6px;background:var(--mut2);transform:rotate(45deg)}
.pdots button.on::after{background:var(--yk);box-shadow:0 0 8px rgba(240,193,75,.8)}
.stats{padding:16px 6px 6px;display:grid;gap:11px}
.stat{display:grid;grid-template-columns:1fr auto;align-items:center;gap:10px;font:600 10.5px var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--mut)}
.stat b{color:var(--cy);text-align:right}.stat:nth-child(2) b{color:var(--red2)}.stat:nth-child(3) b{color:var(--ykd)}

/* The five-brief index: the drawer's five briefs, surfaced on the hero card so
   the first thing a visitor can do is the thing they came to do.

   Baked as markup, not built by script, so the five briefs are in the HTML a
   crawler reads. The drawer is an enhancement; it is not the only way in.

   Each tab carries the same data-drawer attribute the section buttons carry,
   so the one delegated listener opens the right brief and none of this needs a
   handler of its own.

   role="group" and not role="tablist": the drawer already owns a tablist for
   these same five panels. Two tablists over one set of panels is a lie about
   how the page works.

   IT DOCKED INTO THE CAPTION. It used to be five word-buttons in a grid under
   the frame — a whole row of chrome on a card that already carries a portrait,
   three counters, a tag and an id. It now sits inside .pc-meta, under the name
   and the class line, on the same dark ground the caption sits on, and the row
   under the frame is gone.

   SYMBOLS NOW, AND THE OLD NOTE AGAINST THEM. The previous note here argued
   for words over icons on the grounds that copying the five paths out of FLOWS
   in app.js would make a second source of truth for the same five things —
   "the exact fault that made the ledgers double". That objection was right, and
   it is answered rather than ignored: the runtime check now compares each hero
   mark against the drawer mark for the same brief, character for character, so
   the two cannot drift without a red check. The word stays in the button as
   .sr text, so the accessible name is still "Sharia" and not a description of
   a drawing.

   THE CATCH-ALL HAS NO HUE. Both .hix-t and .tj resolved to --cy, so Travel
   and Other sat side by side in the same cyan. Rather than invent a fifth
   sector colour for a button that is not a sector, the base tone is now the
   neutral one: four sectors in their own colours, and the catch-all in grey.
   Hover is carried for all five by border, mark scale and the tone bar — the
   one affordance that does not depend on hue, which is also why the catch-all
   does not lose anything by having none.

   THE MARK HUES ARE LITERAL, AND HERE IS WHY. This strip sits on the photo
   caption, and the caption's ground is dark in BOTH themes: .pc-scan paints
   the same rgba(20,20,25,…) over the portrait whichever theme is on, and
   .pc-meta b is #fff for the same reason. So the five marks take the
   dark-theme hues as literals. Reading --grnd or --cy2 here would ink a mark
   in the LIGHT theme's dark green or dark teal on that black ground, which is
   close to invisible. Only the marks are literal: the border and ground stay
   on the sheet's own tokens, which is what the two chips in the corners of
   this same photo already do.

   At 30px a button clears the 24px target WCAG 2.2 asks for, and five of them
   fit the caption at any width the card takes, so the old below-400px wrap to
   three is gone with the labels that needed it. */
.hix{margin-top:11px;display:flex;gap:6px}
.hix-t{--tone:#8390A8;--toneT:#8C99B2;--toneLine:#8390A8;--toneS:rgba(20,20,25,.78);
  appearance:none;cursor:pointer;position:relative;flex:1 1 0;min-width:0;
  height:30px;padding:0;display:grid;place-items:center;
  background:var(--chipbg);border:1px solid var(--line);border-radius:0;
  color:var(--toneT);
  transition:border-color .25s var(--ease),color .25s var(--ease),background .25s var(--ease)}
/* Two classes deep so these beat the generic .s/.r/.fn/.tj tone setters, which
   are one class deep and come later in the sheet. */
.hix-t.s{--tone:#2F8E62;--toneT:#7FCFA5;--toneLine:#2F8E62}
.hix-t.r{--tone:#B4232A;--toneT:#E2838A;--toneLine:#B4232A}
.hix-t.fn{--tone:#F0C14B;--toneT:#F0C14B;--toneLine:#F0C14B}
.hix-t.tj{--tone:#2FA8C6;--toneT:#7FDFF2;--toneLine:#2FA8C6}
.hix-t svg{width:16px;height:16px;opacity:.9;transition:opacity .25s var(--ease),transform .3s var(--ease)}
/* Inside the border box, not over it: at -1px the bar overhangs the button and
   the box reports 1px of overflow, which would make the runtime check's "no tab
   overflows its own box" fail for a reason that is purely decorative. */
.hix-t::before{content:'';position:absolute;top:0;left:0;right:0;height:2px;background:var(--tone);opacity:.55;transition:opacity .25s var(--ease)}
.hix-t:hover,.hix-t:focus-visible{border-color:var(--toneLine);background:var(--toneS)}
.hix-t:hover svg,.hix-t:focus-visible svg{opacity:1;transform:scale(1.16)}
.hix-t:hover::before,.hix-t:focus-visible::before{opacity:1}
.hix-t:focus-visible{outline:2px solid var(--cy);outline-offset:2px}
/* Hidden from the eye, present to the accessible name. Not display:none, which
   would take the word away from a screen reader and leave the button unnamed. */
.sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}
/* three sectors band */
.triband{border-top:1px solid var(--hair);border-bottom:1px solid var(--hair)}
.tri-in{max-width:var(--max);margin:0 auto;display:grid;grid-template-columns:repeat(4,1fr)}
.tri{padding:28px 24px;border-right:1px solid var(--hair);position:relative}
.tri:last-child{border-right:0}
.tri::before{content:'';position:absolute;top:0;left:0;right:0;height:3px}
.tri.sc::before{background:var(--red)}.tri.vj::before{background:var(--cy)}.tri.fn::before{background:var(--yk)}
.tri small{font:600 10.5px var(--mono);letter-spacing:.18em;text-transform:uppercase;color:var(--mut)}
.tri.sc small{color:var(--red2)}.tri.vj small{color:var(--cy)}.tri.fn small{color:var(--ykd)}
.tri b{display:block;font:700 22px var(--disp);letter-spacing:.06em;text-transform:uppercase;margin:8px 0 6px}
.tri p{color:var(--mut);font-size:.92rem}
.tri a{display:inline-flex;margin-top:12px;font:700 11px var(--mono);letter-spacing:.14em;text-transform:uppercase;text-decoration:none;color:var(--tx)}
.tri a:hover{color:var(--cy)}
.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:42px}
.grid2{display:grid;grid-template-columns:repeat(2,1fr);gap:18px;margin-top:42px}
/* ---- the sector tone: one construction, four accents ------------------------

   Every card that stands for a sector carries that sector's accent as five
   custom properties, and nothing on the card is coloured by hand: the top
   rule, the logo plate, the CTA, the tag chip and the hover border all read
   the same five tokens.

   This replaces four treatments that had grown up side by side on one page — a
   .emph card, a .fn top rule, an .s logo plate and a single inline
   style="color:var(--red2)" — which is what four cards look like when four
   hands have been over them.

   --toneInk is deliberately NOT a theme token. It inks a drawn mark sitting on
   the white logo plate, and the plate is white in BOTH themes; a --ykd that is
   #F0C14B in the dark theme is an invisible gold star on white. So these are
   fixed values, chosen dark enough to read on the plate under either theme. If
   the plate ever becomes theme-aware, this reasoning goes with it.

   .card, .rcard and .vm-box share the tokens. They are three shapes — the
   ecosystem card, the contact card and the about-page map box — and the whole
   point is that the colour behaves the same in all three.

   .vm-box was the third vocabulary: its Sharia box carried a hand-written
   `.vm-box.sh` rule and its finance box a hand-written `.vm-box.fn`, while the
   SoftCodix and travel boxes were left untinted entirely — so the About page
   read as two sectors with colour and two without, and a fifth would have
   needed a fourth bespoke rule. It now reads the same tokens as everything
   else: one class per box, no new CSS to add a sector. */
.card,.rcard,.vm-box{--tone:var(--cy);--toneT:var(--cy2);--toneS:var(--cyS);--toneLine:var(--line);--toneInk:#116C84}
.s {--tone:var(--grn);--toneT:var(--grnd);--toneS:var(--grnS);--toneLine:rgba(47,142,98,.5);--toneInk:#2F8E62}
.r {--tone:var(--red);--toneT:var(--red2);--toneS:var(--redS);--toneLine:rgba(180,35,42,.5);--toneInk:#B4232A}
.fn{--tone:var(--yk); --toneT:var(--ykd); --toneS:var(--ykS); --toneLine:rgba(240,193,75,.55);--toneInk:#7D6218}
.tj{--tone:var(--cy); --toneT:var(--cy2); --toneS:var(--cyS); --toneLine:rgba(47,168,198,.5);--toneInk:#116C84}

.card{position:relative;background:var(--pan);border:1px solid var(--hair);padding:26px;transition:transform .3s var(--ease),border-color .3s,box-shadow .3s}
.card:hover{transform:translateY(-5px);border-color:var(--toneLine);box-shadow:var(--cardsh)}
.etop{position:absolute;top:0;left:0;right:0;height:2px;background:linear-gradient(90deg,var(--tone),var(--toneT));transform:scaleX(0);transform-origin:left;transition:transform .45s var(--ease)}
.card:hover .etop{transform:scaleX(1)}
.card h3{font:700 21px var(--disp);letter-spacing:.06em;text-transform:uppercase;margin:14px 0 8px}
.card p{color:var(--mut);font-size:.96rem}
.go{display:inline-flex;align-items:center;gap:8px;margin-top:18px;font:700 12px var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--cy);text-decoration:none;background:none;border:0;cursor:pointer;padding:0}
.go::after{content:'→'}
.card .go{color:var(--toneT)}
.elogo{width:46px;height:46px;display:grid;place-items:center;background:#fff;border:1px solid var(--line);padding:7px}
.elogo img{width:100%;height:100%;object-fit:contain}
.elogo svg{width:100%;height:100%;color:var(--toneInk)}
.card .elogo{border-color:var(--toneLine)}
.elogo.mw{background:var(--pan2);color:var(--cy);font:700 16px var(--disp)}

/* .houses — the ecosystem grid, where the four sectors are the subject rather
   than a way into one. All four lift and wash in their own accent.

   One of them used to be the only card on the page built this way (.emph on
   Vivid), which made the other three read as somebody else's work. The wash is
   the construction .emph used, kept for the reason recorded with it: emphasis
   cannot come from elevation in the light theme, because --pan is already
   white and white is the ceiling. It comes from the accent. */
.houses .card{border-color:var(--toneLine);background:linear-gradient(180deg,var(--toneS),transparent 58%),var(--pan);box-shadow:var(--cardsh)}

/* The tag chip is toned by its card when it sits in one, and by its own
   modifier when it is generated into a case card — see caseCard() in app.js. */
.wtag{display:inline-block;font:600 10px var(--mono);letter-spacing:.16em;text-transform:uppercase;color:var(--cy);border:1px solid var(--line);padding:4px 9px;margin-bottom:4px}
.card .wtag{color:var(--toneT);border-color:var(--toneLine)}
.wtag.r{color:var(--red2)}.wtag.y{color:var(--ykd)}.wtag.s{color:var(--grnd)}
.cline{margin-top:12px;font-size:.92rem;line-height:1.6;color:var(--mut)}
.card .cline{margin-top:14px}
.card .cline span{color:var(--cy2)}
.ctr{margin-top:38px;text-align:center}
.think{display:grid;grid-template-columns:1.25fr .75fr;gap:44px;margin-top:42px;align-items:start}
.essay p{color:var(--mut);font-size:1.1rem;max-width:60ch}.essay p+p{margin-top:18px}.essay b{color:var(--tx)}
.pq{border-left:2px solid var(--cy);padding:6px 0 6px 20px;font:600 19px/1.4 var(--disp);letter-spacing:.03em;text-transform:uppercase;color:var(--cy2)}
.seq{display:flex;flex-wrap:wrap;gap:8px;margin-top:26px;align-items:center}
.seq span{font:600 10.5px var(--mono);letter-spacing:.14em;text-transform:uppercase;border:1px solid var(--line);background:var(--pan);padding:7px 11px;color:var(--mut)}
.seq u{text-decoration:none;color:var(--mut2)}
.fcards{display:grid;gap:14px}
.fcard{display:flex;align-items:center;justify-content:space-between;gap:14px;width:100%;text-align:left;background:var(--pan);border:1px solid var(--line);padding:20px 22px;cursor:pointer;clip-path:polygon(12px 0,100% 0,100% calc(100% - 12px),calc(100% - 12px) 100%,0 100%,0 12px);transition:transform .25s var(--ease),border-color .25s}
.fcard:hover{transform:translateX(6px)}
.fcard small{display:block;font:600 10px var(--mono);letter-spacing:.16em;text-transform:uppercase;color:var(--mut);margin-bottom:4px}
.fcard b{font:700 20px var(--disp);letter-spacing:.07em;text-transform:uppercase}
.fcard.r:hover{border-color:var(--red)}.fcard.c:hover{border-color:var(--cy)}.fcard.y:hover{border-color:var(--yk)}
.fw{display:grid;grid-template-columns:1fr 1fr;gap:44px;align-items:center;margin-top:42px}
.vox{margin-top:42px;border:1px solid var(--hair);background:var(--pan);padding:38px;position:relative}
.vox::before{content:'“';position:absolute;top:6px;left:22px;font:700 84px var(--disp);color:var(--line)}
.vq{font:600 clamp(20px,2.6vw,28px)/1.4 var(--disp);letter-spacing:.02em;text-transform:uppercase;max-width:26ch}
.vattr{margin-top:18px;font:600 11.5px var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--mut)}.vattr b{color:var(--cy)}
.vnav{display:flex;align-items:center;gap:12px;margin-top:26px}
.vbtn{width:46px;height:46px;border:1px solid var(--line);background:var(--pan2);font-size:17px;clip-path:polygon(8px 0,100% 0,100% calc(100% - 8px),calc(100% - 8px) 100%,0 100%,0 8px)}
.vidx{font:600 11px var(--mono);letter-spacing:.16em;color:var(--ykd)}
.final{border:1px solid var(--line);background:linear-gradient(180deg,rgba(180,35,42,.07),rgba(47,168,198,.07)),var(--pan);text-align:center;padding:64px 30px}
.final p{color:var(--mut);max-width:52ch;margin:0 auto 30px}
.fb{display:flex;gap:13px;justify-content:center;flex-wrap:wrap}
.foot{border-top:1px solid var(--hair)}
.foot-in{max-width:var(--max);margin:0 auto;padding:26px 24px;display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;font:600 10.5px var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--mut2)}
.foot-in a{color:var(--mut);text-decoration:none;display:inline-flex;align-items:center;gap:7px}
.foot-in a:hover{color:var(--cy)}
/* The LinkedIn mark, set at the footer's own type size. Filled, not stroked —
   the glyph is a solid square with knocked-out letterforms, so a stroke would
   erase it. */
.foot-in .soc{width:13px;height:13px;flex:none;margin-top:-1px}
/* about */
.ah{max-width:var(--max);margin:0 auto;padding:170px 24px 40px}.ah .h2{font-size:clamp(38px,5.4vw,66px)}
.tl{position:relative;margin:52px 0 0 8px;padding-left:36px}
.tl::before{content:'';position:absolute;left:7px;top:6px;bottom:6px;width:2px;background:var(--hair)}
.tl::after{content:'';position:absolute;left:7px;top:6px;bottom:6px;width:2px;background:var(--grad);transform:scaleY(0);transform-origin:top;transition:transform 1.6s var(--ease) .2s}
.tl.in::after{transform:scaleY(1)}
.tlm{position:relative;padding:0 0 30px}
.tlm::before{content:'';position:absolute;left:-36px;top:5px;width:16px;height:16px;background:var(--bg);border:2px solid var(--cy);transform:rotate(45deg)}
.tlm:nth-child(even)::before{border-color:var(--red)}
.tlm b{display:block;font:700 21px var(--disp);letter-spacing:.07em;text-transform:uppercase}
.tlm span{font:600 10.5px var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--mut)}
.stgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-top:38px}
.stc{border:1px solid var(--hair);background:var(--pan);padding:20px;font-size:.95rem;color:var(--mut)}
.stc b{display:block;font:700 15px var(--disp);letter-spacing:.08em;text-transform:uppercase;color:var(--tx);margin-bottom:6px}
.stc i{font:600 10px var(--mono);color:var(--cy);font-style:normal;letter-spacing:.12em}
.vmap{margin-top:38px;display:grid;grid-template-columns:repeat(4,1fr);gap:14px}
.vm-top{grid-column:1/-1;justify-self:center;text-align:center;border:1px solid var(--line);background:var(--pan2);padding:18px 34px}
.vm-top b{font:700 19px var(--disp);letter-spacing:.08em;text-transform:uppercase;display:block}
.vm-top span{font:600 10px var(--mono);letter-spacing:.14em;color:var(--cy);text-transform:uppercase}
.vm-box{border:1px solid var(--toneLine);background:var(--pan);padding:20px}
.vm-box b{font:700 16px var(--disp);letter-spacing:.07em;text-transform:uppercase;display:block;margin-bottom:4px;color:var(--toneT)}
.vm-box p{color:var(--mut);font-size:.92rem}
/* work */
.chips{display:flex;gap:8px;flex-wrap:wrap;margin-top:30px}
.chip{position:relative;font:600 11.5px var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--mut);padding:10px 15px;border:1px solid var(--hair);background:var(--pan)}
.chip::after{content:'';position:absolute;left:12px;right:12px;bottom:-1px;height:2px;background:var(--grad);transform:scaleX(0);transition:transform .3s}
.chip.on{color:var(--tx);border-color:var(--line)}.chip.on::after{transform:scaleX(1)}
.cg{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:30px}
.ccard{background:var(--pan);border:1px solid var(--hair);overflow:hidden;transition:transform .3s,border-color .3s}
.ccard[hidden]{display:none}
.ccard:hover{transform:translateY(-5px);border-color:var(--line)}
.cthumb{position:relative;aspect-ratio:16/8.5;display:grid;place-items:center;overflow:hidden}
.cthumb.sof{background:linear-gradient(135deg,#1A0709,#2A0D10 55%,#160608)}
.cthumb.viv{background:linear-gradient(135deg,#04222B,#07303D 55%,#031820)}
.cthumb.fin{background:linear-gradient(135deg,#1A1608,#2A220C 55%,#141008)}
.cthumb img.real{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.cthumb .wm{width:64px;height:64px;background:#fff;border:1px solid var(--line);padding:10px;display:grid;place-items:center}
.cthumb .wm img{width:100%;height:100%;object-fit:contain}
.cthumb .cid{position:absolute;top:10px;left:12px;font:600 10px var(--mono);letter-spacing:.16em;color:rgba(234,240,248,.75);background:var(--chipbg);border:1px solid var(--hair);padding:4px 8px;text-transform:uppercase}
.cbody{padding:20px 22px 24px}
.cbody h3{font:700 20px var(--disp);letter-spacing:.06em;text-transform:uppercase;margin:8px 0 2px}
.roleline{display:block;margin-top:8px;color:var(--cy2);font-size:.86rem}
.eph{margin-top:56px;border:1px solid var(--hair);background:var(--pan);padding:34px;max-width:820px}
/* engage */
.fitgrid{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:38px}
.fitc{border:1px solid var(--hair);background:var(--pan);padding:20px 22px;display:flex;gap:12px;align-items:flex-start;font-size:.98rem}
.fitc u{text-decoration:none;color:var(--cy);font-size:15px}.fitc:nth-child(even) u{color:var(--red2)}
.steps{position:relative;margin:44px 0 0 8px;padding-left:36px;max-width:640px}
.steps::before{content:'';position:absolute;left:7px;top:8px;bottom:8px;width:2px;background:var(--hair)}
.steps::after{content:'';position:absolute;left:7px;top:8px;bottom:8px;width:2px;background:var(--grad);transform:scaleY(0);transform-origin:top;transition:transform 1.5s var(--ease) .2s}
.steps.in::after{transform:scaleY(1)}
.stp{position:relative;padding:0 0 26px;color:var(--mut)}
.stp::before{content:'';position:absolute;left:-34px;top:4px;width:12px;height:12px;background:var(--cy);transform:rotate(45deg)}
.stp b{color:var(--tx)}.stp i{font:600 10px var(--mono);font-style:normal;color:var(--mut2);letter-spacing:.14em;display:block;margin-bottom:2px}
.notc{border:1px solid rgba(180,35,42,.25);background:rgba(180,35,42,.05);padding:26px;margin-top:38px}
.notc ul{list-style:none;margin-top:14px;display:grid;gap:10px}
.notc li{color:var(--mut);display:flex;gap:10px}.notc li::before{content:'✕';color:var(--red);font-weight:700}
.faq{margin-top:38px;border-top:1px solid var(--hair)}
.fq{border-bottom:1px solid var(--hair)}
.fqh{width:100%;display:flex;justify-content:space-between;align-items:center;gap:14px;padding:20px 4px;text-align:left;font:700 18px var(--disp);letter-spacing:.05em;text-transform:uppercase}
.fqh span{color:var(--cy);font-size:20px;transition:transform .3s}.fq.open .fqh span{transform:rotate(45deg)}
.fqb{display:grid;grid-template-rows:0fr;transition:grid-template-rows .35s}.fq.open .fqb{grid-template-rows:1fr}
.fqb>div{overflow:hidden}.fqb p{padding:0 4px 20px;color:var(--mut);max-width:68ch}
/* finance ledger */
.ledger{margin-top:42px;border:1px solid var(--hair);background:var(--pan);overflow:hidden}
.led-h{display:grid;grid-template-columns:72px 1.15fr 1.7fr 120px;gap:12px;padding:12px 22px;font:600 10px var(--mono);letter-spacing:.16em;text-transform:uppercase;color:var(--ykd);border-bottom:1px solid var(--hair);background:repeating-linear-gradient(transparent,transparent 27px,rgba(240,193,75,.06) 27px 28px)}
.led-r{display:grid;grid-template-columns:72px 1.15fr 1.7fr 120px;gap:12px;align-items:center;padding:22px;border-bottom:1px solid var(--hair);text-align:left;width:100%;cursor:pointer;transition:background .25s}
.led-r:last-child{border-bottom:0}
.led-r:hover{background:var(--ykS)}
.led-r .n{font:700 18px var(--serif);color:var(--ykd)}
.led-r b{font:700 17px var(--disp);letter-spacing:.06em;text-transform:uppercase}
.led-r p{color:var(--mut);font-size:.9rem}
/* The §09 artefact close. Every service row now ends on the thing the buyer
   actually receives, and the ledger is the one place on the page where that
   sentence is the point rather than the tail — so it is inked in the ledger's
   own tone instead of being left to read as more description. Same two-tone
   split the ledger already uses for the ref number.

   The font is reset, not inherited. `.led-r b` above is the row-TITLE treatment
   — 17px display, letter-spaced, uppercase — and that rule reaches any `b`
   inside the row, so the first cut of this rendered the close as a second
   shouted label on its own line: "DELIVERABLE: GAP ANALYSIS REPORT." §09 asks for
   a bold clause that finishes the sentence, in sentence case, so family and size
   are handed back to the paragraph. `inherit` rather than a font stack, because
   the paragraph should decide, and the shorthand `font:` is avoided because it
   would reset line-height as a side effect. */
.led-r p b{font-family:inherit;font-size:inherit;letter-spacing:0;text-transform:none;
  font-weight:600;color:var(--ykd)}
.ledger.grn .led-r p b{color:var(--grnd)}
.led-r .op{font:600 10.5px var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--mut2);white-space:nowrap;justify-self:end}
.bio{margin-top:48px;border:1px dashed rgba(240,193,75,.35);background:linear-gradient(180deg,rgba(240,193,75,.06),transparent),var(--pan);padding:28px 26px}
.bio .who{font:600 11px var(--mono);letter-spacing:.18em;text-transform:uppercase;color:var(--ykd);margin-bottom:8px}
.bio h3{font:700 26px var(--disp);letter-spacing:.05em;text-transform:uppercase;margin-bottom:6px}
.bio .cred{font:600 12px var(--mono);letter-spacing:.08em;color:var(--mut);margin-bottom:16px}
.bio p{color:var(--mut);max-width:72ch}.bio p+p{margin-top:12px}
.bio b{color:var(--tx)}
/* contact */
.rgrid{display:grid;grid-template-columns:repeat(2,1fr);gap:18px;margin-top:42px}
.rcard{position:relative;background:var(--pan);border:1px solid var(--hair);padding:26px;text-decoration:none;display:block;text-align:left;color:inherit;cursor:pointer;transition:transform .3s,border-color .3s,box-shadow .3s}
.rcard:hover{transform:translateY(-4px);border-color:var(--toneLine);box-shadow:var(--cardsh)}
.rcard .arrw{position:absolute;top:22px;right:20px;color:var(--mut2);transition:color .25s var(--ease),transform .25s var(--ease)}
.rcard:hover .arrw{color:var(--toneT);transform:translateX(3px)}
.rcard h3{font:700 21px var(--disp);letter-spacing:.06em;text-transform:uppercase;margin:12px 0 6px}
.rcard p{color:var(--mut);font-size:.94rem}
.rcicon{width:44px;height:44px;display:grid;place-items:center;border:1px solid var(--toneLine);background:var(--pan2);color:var(--toneT)}
.rcicon svg{width:20px;height:20px;color:inherit}
.expect{margin-top:44px;max-width:720px}.expect p{color:var(--mut);font-size:1.03rem}
.calm{margin-top:56px;text-align:center;border:1px solid var(--hair);background:var(--pan);padding:44px 26px}
.calm p{color:var(--mut);max-width:48ch;margin:10px auto 0}
/* drawers */
.scrim{position:fixed;inset:0;z-index:180;background:rgba(8,8,12,.7);backdrop-filter:blur(4px);opacity:0;pointer-events:none;transition:opacity .3s}
.scrim.on{opacity:1;pointer-events:auto}
.drawer{position:fixed;top:0;right:0;bottom:0;z-index:190;width:min(460px,100%);background:var(--bg2);border-left:1px solid var(--line);transform:translateX(102%);transition:transform .45s var(--ease);display:flex;flex-direction:column}
.drawer.on{transform:none}
.drawer.theme-biz .dh{border-bottom-color:rgba(180,35,42,.35)}
.drawer.theme-biz .dq{color:var(--red2)}
.drawer.theme-travel .dh{border-bottom-color:rgba(47,168,198,.4)}
.drawer.theme-travel .dq{color:var(--cy2)}
.drawer.theme-fin .dh{border-bottom-color:rgba(240,193,75,.45)}
.drawer.theme-fin .dq{color:var(--ykd)}
.opt.um{border-left:3px solid var(--cy)}
.opt.bizc{border-left:3px solid var(--red)}
.dh{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:18px 22px;border-bottom:1px solid var(--hair)}
.dh b{font:700 17px var(--disp);letter-spacing:.1em;text-transform:uppercase}
.dh small{display:block;font:600 9.5px var(--mono);letter-spacing:.16em;color:var(--mut);text-transform:uppercase}
.dh .dx{width:40px;height:40px;border:1px solid var(--line);color:var(--mut);font-size:16px}
.db{flex:1;overflow-y:auto;padding:24px 22px 0}
.qprog{display:flex;gap:5px;margin-bottom:22px}
.qprog i{flex:1;height:4px;background:var(--hair)}.qprog i.done{background:var(--yk)}
.dq{font:700 21px/1.25 var(--disp);letter-spacing:.04em;text-transform:uppercase;margin-bottom:16px}
.opts{display:grid;gap:9px}
.opt{display:flex;gap:12px;align-items:center;width:100%;text-align:left;border:1px solid var(--hair);background:var(--pan);padding:13px 15px;font-size:.95rem}
.opt::before{content:'';width:14px;height:14px;border:1px solid var(--line);transform:rotate(45deg);flex:none}
.opt.sel{border-color:var(--cy);background:var(--cyS)}.opt.sel::before{background:var(--cy);border-color:var(--cy)}
.dres{text-align:center;padding:14px 4px}
.dres .rk{font:600 11px var(--mono);letter-spacing:.18em;text-transform:uppercase;color:var(--ykd)}
.dres h4{font:700 30px var(--disp);letter-spacing:.05em;text-transform:uppercase;margin:10px 0 6px}
.dres p{color:var(--mut);font-size:.95rem;max-width:38ch;margin:0 auto 8px}
.dres .pr{font:700 19px var(--mono);color:var(--cy2);margin:10px 0 22px}
.dact{display:flex;gap:10px;justify-content:center;flex-wrap:wrap;margin-top:8px}
.dnote{font:600 10px var(--mono);letter-spacing:.12em;color:var(--mut2);text-transform:uppercase;margin-top:18px;text-align:center}
.dchips{display:flex;flex-wrap:wrap;gap:8px}
.dchip{font:600 11px var(--mono);letter-spacing:.08em;text-transform:uppercase;border:1px solid var(--hair);background:var(--pan);color:var(--mut);padding:9px 13px}
.dchip.sel{border-color:var(--cy);color:var(--cy);background:var(--cyS)}
.dchip.ysel{border-color:var(--yk);color:var(--ykd);background:var(--ykS)}
.flds{display:grid;gap:12px}
.fld label{display:block;font:600 10px var(--mono);letter-spacing:.16em;text-transform:uppercase;color:var(--mut);margin-bottom:6px}
.fld input,.fld select,.fld textarea{width:100%;min-height:46px;border:1px solid var(--hair);background:var(--pan);color:var(--tx);padding:11px 13px;font:inherit}
.fld textarea{min-height:96px;resize:vertical}
.fld input:focus,.fld select:focus,.fld textarea:focus{outline:none;border-color:var(--yk)}
/* The consent tick is an input inside .fld, so the field rule above used to size
   it like a text box: width:100% and a 46px floor inflated a 13px native
   checkbox into a full-width slab, and .fld label dressed the sentence beside it
   as 10px uppercase mono fine print. The box now draws at its own size, and the
   row is the tap target so it can stay small. align-items:flex-start plus the
   box's own 2px nudge line it up with the first line of wrapped text instead of
   centring it against a two-line paragraph. */
.fld input[type=checkbox]{width:16px;height:16px;min-height:0;flex:none;margin:2px 0 0;padding:0;accent-color:var(--cy);cursor:pointer}
.fld label.ck{display:flex;align-items:flex-start;gap:10px;font:400 13.5px/1.5 var(--sans);letter-spacing:0;text-transform:none;color:var(--mut);margin-bottom:0;padding:2px 0;cursor:pointer}
.fld label.ck span{flex:1}
.cntrow{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.cntr{display:flex;align-items:center;justify-content:space-between;border:1px solid var(--hair);background:var(--pan);padding:8px 10px}
.cntr span{font:600 10.5px var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--mut)}
.cntr div{display:flex;align-items:center;gap:10px}
.cntr button{width:34px;height:34px;border:1px solid var(--line)}
.cntr b{min-width:20px;text-align:center}
.sumry{border:1px solid var(--hair);background:var(--pan);padding:16px;font:400 12.5px/1.8 var(--mono);color:var(--mut);white-space:pre-wrap}
.dback{margin-top:16px;font:600 11px var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--mut)}
/* The ways out of a step ride at the bottom of the panel.

   The drawer body scrolls; the controls must not. A visitor who has answered
   four questions should never have to scroll to find the button that finishes
   the job, and on a laptop-height window with a five-option question they
   otherwise would. Back, Next and Send-on-WhatsApp are now always on screen —
   which is the whole point of the drawer: it is the short path to the CTA.

   The bar bleeds past the body's 22px side padding so nothing scrolls through
   the gap beside it, and it sits under the fore-edge index (z-index 3 against
   this bar's 2), so a pulled-out tab still covers it rather than being cut.

   One bar per screen, and that took a change at the source. A step ends with
   .dnav; a result screen ends with .dact, which carries Send, Copy, Restart and
   Back together, with the "nothing is stored" note above it rather than below.
   Two sticky bars in the same panel both pin to bottom:0 and land on the same
   band, drawing over each other — so there is only ever one, whichever screen
   is up, and it is always the last thing in the panel. */
.dnav,.dact{position:sticky;bottom:0;z-index:2;margin:22px -22px 0;padding:14px 22px 24px;background:var(--bg2);border-top:1px solid var(--hair);display:flex;align-items:center;flex-wrap:wrap;gap:10px}
.dnav{justify-content:space-between}
.dact{justify-content:center}
/* Back loses its own top margin here: inside the bar it is a peer of the buttons,
   not a footer link on its own line. */
.dact .dback{margin-top:0}
.derr{margin:12px 0 0;font:600 11px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--red2)}
.dxc{padding:13px 22px;border-bottom:1px solid var(--line);background:var(--pan2)}
.dxc[hidden]{display:none}
.dxc p{margin:0 0 10px;font:600 10.5px/1.5 var(--mono);letter-spacing:.08em;color:var(--mut);text-transform:uppercase}
.dxc div{display:flex;gap:8px}
.dxc .btn{min-height:40px;padding:0 16px;font-size:11px}
.dphone{display:grid;grid-template-columns:132px 1fr;gap:9px}
.dphone select{min-width:0}

/* ---- the fore-edge index ----------------------------------------------------
   A book's thumb index, cut into the drawer's fore-edge: one tab per brief, so
   the five doors are visible from inside any one of them. They rest as a 12px
   lip and pull fully out on hover, focus, or selection — a tab that only appears
   on hover does not exist on a touch screen and cannot be found from a keyboard.

   They are buttons in a role="tablist", not links: each swaps the panel without
   leaving the page. .dix clips its own overflow, so the resting lip is flush
   with the drawer's edge rather than floating over the scrim, and the focus ring
   is drawn inside for the same reason.
   ---------------------------------------------------------------------------- */
.dix{position:absolute;left:0;top:50%;transform:translateY(-50%);z-index:3;display:flex;flex-direction:column;gap:5px;overflow:hidden}
.dix button{position:relative;display:flex;align-items:center;justify-content:center;gap:7px;width:34px;padding:14px 0;border:1px solid var(--line);border-left:0;background:var(--pan);color:var(--mut);writing-mode:vertical-rl;text-orientation:mixed;font:600 10px var(--mono);letter-spacing:.14em;text-transform:uppercase;cursor:pointer;transform:translateX(calc(-100% + 12px));transition:transform .3s var(--ease),color .25s,border-color .25s,background .25s}
.dix button svg{width:13px;height:13px;flex:none}
.dix button:focus-visible{outline:2px solid var(--cy);outline-offset:-3px}
.dix button:hover,.dix button:focus-visible{color:var(--tx);border-color:var(--cy);transform:translateX(0)}
.dix button[aria-selected="true"]{transform:translateX(0);color:var(--tx);background:var(--pan2)}
.dix button[aria-selected="true"]::before{content:'';position:absolute;left:0;top:9px;bottom:9px;width:2px;background:var(--cy)}
.drawer.theme-biz .dix button[aria-selected="true"]{color:var(--red2);border-color:var(--red)}
.drawer.theme-biz .dix button[aria-selected="true"]::before{background:var(--red)}
.drawer.theme-travel .dix button[aria-selected="true"]{color:var(--cy2);border-color:var(--cy)}
.drawer.theme-fin .dix button[aria-selected="true"]{color:var(--ykd);border-color:var(--yk)}
.drawer.theme-fin .dix button[aria-selected="true"]::before{background:var(--yk)}
.drawer.theme-shr .dix button[aria-selected="true"]{color:var(--grnd);border-color:var(--grn)}
.drawer.theme-shr .dix button[aria-selected="true"]::before{background:var(--grn)}
/* The header and the body step right so the resting lip never sits over text. */
.dh,.db{padding-left:46px}
/* Finance and business options were taking the travel cyan. */
.drawer.theme-biz .opt.sel{border-color:var(--red);background:var(--redS)}
.drawer.theme-biz .opt.sel::before{background:var(--red);border-color:var(--red)}
.drawer.theme-biz .dchip.sel{border-color:var(--red);color:var(--red2);background:var(--redS)}
.drawer.theme-fin .opt.sel{border-color:var(--yk);background:var(--ykS)}
.drawer.theme-fin .opt.sel::before{background:var(--yk);border-color:var(--yk)}
.drawer.theme-fin .dchip.sel{border-color:var(--yk);color:var(--ykd);background:var(--ykS)}
.drawer.theme-shr .dchip.sel{border-color:var(--grn);color:var(--grnd);background:var(--grnS)}

/* ---- the fifth brief, and why it wears no new colour ------------------------
   BRIEF 05 is "Anything else" — media, teaching, careers, partnership,
   suppliers, anything the four sector briefs do not cover. Its class has been
   on the drawer since the flow was written and site.css never defined it, so
   the catch-all brief opened with no theme at all: a default header rule, a
   default question colour, and a selected chip that fell back to the base
   styling. .theme-oth is that rule; build/dev/runtime-check.html is what found
   the gap, by asking the browser for every class on an element that site.css
   does not define.

   It reuses cyan rather than inventing a fifth hue. Cyan is already what this
   flow's own CTA wears — the send button is .btn-o — and the four sector
   accents are reserved for the four sectors. A brief whose whole purpose is to
   sit outside them should not borrow one of their colours. Travel wears the
   same cyan; the two are never on screen together, because the drawer shows one
   brief at a time and the index writes the selected tab's name in words. */
.drawer.theme-oth .dh{border-bottom-color:rgba(47,168,198,.35)}
.drawer.theme-oth .dq{color:var(--cy2)}
.drawer.theme-oth .dix button[aria-selected="true"]{color:var(--cy2);border-color:var(--cy)}
.drawer.theme-oth .dix button[aria-selected="true"]::before{background:var(--cy)}
.drawer.theme-oth .opt.sel{border-color:var(--cy);background:var(--cyS)}
.drawer.theme-oth .opt.sel::before{background:var(--cy);border-color:var(--cy)}
.drawer.theme-oth .dchip.sel{border-color:var(--cy);color:var(--cy2);background:var(--cyS)}
.drawer.theme-oth .qprog i.done{background:var(--cy)}
:root{
  --bg:#F4F1EA; --bg2:#ECE8DE; --pan:#FFFFFF; --pan2:#F8F5EE; --hair:#DDD6C6; --line:#CBC2AC;
  --tx:#17181D; --mut:#585751; --mut2:#6B6759;
  --red:#B4232A; --red2:#8B1418; --redS:rgba(139,20,24,.10);
  --cy:#2FA8C6; --cy2:#116C84; --cyS:rgba(47,168,198,.08);
  --yk:#F0C14B; --ykd:#7D6218; --ykS:rgba(240,193,75,.12);
  --grn:#2F8E62; --grnd:#1F6B45; --grnS:rgba(47,142,98,.08);
  --gridl:rgba(23,24,29,.06); --barbg:rgba(244,241,234,.9); --sheetbg:rgba(244,241,234,.97);
  --chipbg:rgba(23,24,29,.82); --cardsh:0 18px 44px rgba(23,24,29,.12);

  /* The brand's hexagon, written once. The mark, the theme toggle and anything
     else that wants the shape read from here, so they cannot drift apart. */
  --hex:polygon(50% 0,100% 25%,100% 75%,50% 100%,0 75%,0 25%);

  --grad:linear-gradient(92deg,var(--red) 0%,var(--cy) 100%);
  --disp:'Rajdhani','Arial Narrow',ui-sans-serif,system-ui,sans-serif;
  --sans:ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif;
  --serif:Georgia,"Times New Roman",serif;
  --mono:'JetBrains Mono',ui-monospace,Menlo,Consolas,monospace;
  --ease:cubic-bezier(.22,.61,.36,1); --max:1180px;
  color-scheme:light;
}
html:not([data-theme="dark"]) .kicker{color:var(--cy2)}
html:not([data-theme="dark"]) .kicker.r{color:var(--red)}
html:not([data-theme="dark"]) .kicker.y{color:var(--ykd)}
html:not([data-theme="dark"]) .kicker.g{color:var(--grnd)}
html:not([data-theme="dark"]) .h2 em,.h1 .ac{color:var(--cy2)}
html:not([data-theme="dark"]) .h2 em.r,.h1 .ar{color:var(--red)}
html:not([data-theme="dark"]) .btn-o{color:var(--cy2)}
html:not([data-theme="dark"]) .btn-r{color:var(--red)}
html:not([data-theme="dark"]) .go{color:var(--cy2)}
@media (max-width:1060px){
  .nav{display:none}.burger{display:flex}
  .hero2{grid-template-columns:1fr;gap:40px;min-height:0;padding-top:120px}
  .pcard{justify-self:start}
  .think,.fw,.tri-in{grid-template-columns:1fr}
  .tri{border-right:0;border-bottom:1px solid var(--hair)}
  .grid3,.cg,.vmap{grid-template-columns:repeat(2,1fr)}
  .stgrid,.rgrid{grid-template-columns:1fr 1fr}
  .led-h{display:none}
  .led-r{grid-template-columns:56px 1fr;gap:12px}
  .led-r p,.led-r .op{grid-column:2}
}
@media (max-width:640px){
  .crumb{display:none}.bar{padding:12px 16px}.bar-r .btn{display:none}
  .grid3,.cg,.rgrid,.grid2,.fitgrid,.stgrid,.vmap{grid-template-columns:1fr}
  .sec{padding:64px 18px}.ah{padding:130px 18px 30px}.hero2{padding:120px 18px 50px}
  .pchips{grid-template-columns:1fr}.drawer{width:100%}
  /* A full-width drawer leaves no fore-edge, so the index lies down across the
     top instead. Same role="tablist", same buttons, no animation — an off-screen
     tab on a screen with no hover is an invisible door. */
  .dh,.db{padding-left:22px}
  .dix{position:static;transform:none;flex-direction:row;gap:0;overflow:visible;border-bottom:1px solid var(--line);background:var(--pan2)}
  .dix button{writing-mode:horizontal-tb;flex:1 1 0;min-width:0;width:auto;padding:11px 4px;border:0;border-bottom:2px solid transparent;background:none;transform:none;font-size:9.5px;letter-spacing:.08em}
  .dix button svg{width:11px;height:11px}
  .dix button span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .dix button:hover,.dix button:focus-visible{transform:none;background:var(--pan)}
  .dix button[aria-selected="true"]{transform:none;background:none;border-bottom-color:var(--cy)}
  .dix button[aria-selected="true"]::before{display:none}
  .drawer.theme-biz .dix button[aria-selected="true"]{border-bottom-color:var(--red)}
  .drawer.theme-fin .dix button[aria-selected="true"]{border-bottom-color:var(--yk)}
  .drawer.theme-shr .dix button[aria-selected="true"]{border-bottom-color:var(--grn)}
  .dphone{grid-template-columns:108px 1fr;gap:7px}
}
/* Five tabs do not fit a phone with their glyphs. At a 345px viewport each tab
   gets 69px, and "BUSINESS" alone needs 52 of them — so with an 11px icon and a
   7px gap the word was down to 43px and the label rendered as "BUSINE…".
   "FINANCE" was short by 2 at the same width. Measured, not eyeballed: the
   labels fit from 399px up and truncate below it.
   The icon goes and the word stays, down to about 300px with 8px to spare. That
   is the same call the hero five-brief index makes and for the same reason: the
   word already says it, so the glyph is a second copy of a fact that is already
   on screen. The selected tab keeps its sector-coloured underline, so the tone
   survives the glyph. */
@media (max-width:420px){
  .dix button svg{display:none}
  .dix button{padding:11px 3px;gap:0;letter-spacing:.04em}
}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important;transition-duration:.01ms!important}
  .rv{opacity:1;transform:none}.h1 .ln span{transform:none}
  .packflow .pn{opacity:1;animation:none}
  .pfl::after{transform:scaleX(1)}
}

.packflow{margin-top:42px}
.pfl{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px}
.pn{background:var(--pan);border:1px solid var(--line);padding:18px 16px 16px;position:relative;box-shadow:var(--cardsh)}
.pn .no{font:700 22px var(--disp);letter-spacing:.08em;color:var(--red2)}
.pn h3{font:700 18px var(--disp);letter-spacing:.05em;text-transform:uppercase;margin:4px 0 8px}
.pn .pain{font-size:.82rem;color:var(--mut);min-height:3.2em}
.pn .pr{font:700 15px var(--mono);margin-top:10px;color:var(--tx)}
.pn .cap{font:600 10px var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--mut);margin-top:6px}
.pn .arr{position:absolute;right:-11px;top:50%;transform:translateY(-50%);z-index:2;width:22px;height:22px;background:var(--bg);border:1px solid var(--line);display:grid;place-items:center;font-size:11px;color:var(--red2)}
.pn:last-child .arr{display:none}
.pfl-note{margin-top:14px;font:600 11px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--mut)}

.ptbl-wrap{overflow:auto;margin-top:22px;border:1px solid var(--line)}
.ptbl{width:100%;border-collapse:collapse;font:12px/1.4 var(--sans)}
.ptbl th,.ptbl td{padding:10px 12px;border-bottom:1px solid var(--hair);text-align:left}
.ptbl th{font:600 10px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--red2);background:var(--pan2)}
.ptbl td:first-child{font:600 10px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--mut)}
@media (max-width:860px){.pfl{grid-template-columns:1fr 1fr}.pn .arr{display:none}}
@media (max-width:560px){.pfl{grid-template-columns:1fr}}

/* ================= MICRO-INTERACTION SYSTEM =================
   All hover effects gated to hover-capable pointers so they never
   stick on touch devices. Press feedback everywhere. */
@media (hover:hover) and (pointer:fine){
  .btn:active{transform:translateY(0) scale(.97)}
  .btn::before{content:'';position:absolute;inset:0;background:linear-gradient(105deg,transparent 42%,rgba(255,255,255,.30) 50%,transparent 58%);transform:translateX(-130%);transition:transform .65s var(--ease);pointer-events:none}
  .btn:hover::before{transform:translateX(130%)}
  .btn-g:hover{box-shadow:0 14px 34px rgba(180,35,42,.34)}
  .btn-o:hover{box-shadow:0 10px 26px rgba(47,168,198,.28)}
  .btn-y:hover{box-shadow:0 10px 26px rgba(240,193,75,.30)}
  .btn-r:hover{box-shadow:0 10px 26px rgba(180,35,42,.26)}
  .btn-n:hover{box-shadow:0 10px 26px rgba(23,24,29,.14)}
  .go::after{transition:transform .25s var(--ease)}
  .go:hover::after{transform:translateX(5px)}
  .nav a{transition:color .25s var(--ease)}
  .nav a:hover::after{transform:scaleX(1)}
  .mnl{transition:color .25s var(--ease),padding-left .25s var(--ease)}
  .mnl:hover{color:var(--tx);padding-left:10px}
  .chip{transition:transform .2s var(--ease),color .2s,border-color .2s}
  .chip:hover{color:var(--tx);border-color:var(--line);transform:translateY(-2px)}
  .chip:active{transform:translateY(0) scale(.96)}
  .rcard:active{transform:translateY(-1px) scale(.99)}
  .led-r .op{opacity:.6;transition:opacity .25s,color .25s,transform .25s var(--ease)}
  .led-r:hover .op{opacity:1;color:var(--ykd);transform:translateX(-4px)}
  .fqh{transition:color .25s var(--ease)}
  .fqh:hover{color:var(--cy)}
  .opt{transition:transform .2s var(--ease),border-color .2s,background .2s}
  .opt:hover{border-color:var(--line);transform:translateX(4px)}
  .opt:active{transform:translateX(4px) scale(.98)}
  .dchip{transition:transform .2s var(--ease),color .2s,border-color .2s}
  .dchip:hover{color:var(--tx);border-color:var(--line);transform:translateY(-2px)}
  .dback{transition:color .2s var(--ease)}
  .dback:hover{color:var(--tx)}
  /* The thumb index pulls out with a slight overshoot, so it reads as a physical
     tab coming off the fore-edge rather than a panel sliding. */
  .dix button{transition-timing-function:cubic-bezier(.34,1.56,.64,1)}
  .dix button svg{transition:transform .3s cubic-bezier(.34,1.56,.64,1)}
  .dix button:hover svg,.dix button:focus-visible svg{transform:scale(1.2)}
  .dx{transition:transform .3s var(--ease),color .2s}
  .dx:hover{transform:rotate(90deg);color:var(--red2)}
  .burger{transition:border-color .2s}
  .burger:hover{border-color:var(--line)}
  .pdots button::after{transition:background .2s,transform .2s var(--ease)}
  .pdots button:hover::after{background:var(--mut)}
  .foot-in a{position:relative}
  .foot-in a::after{content:'';position:absolute;left:0;right:0;bottom:-2px;height:1px;background:var(--cy);transform:scaleX(0);transform-origin:left;transition:transform .25s var(--ease)}
  .foot-in a:hover::after{transform:scaleX(1)}
/* Theme toggle (§05). Deliberately quiet: footer furniture, not a control the
   page is selling. Sized to the 44px target even though it reads as plain
   text, and the label always names the destination, never the current state. */
.tgl button{appearance:none;background:none;border:0;margin:0;padding:0;cursor:pointer;min-height:44px;min-width:44px;display:inline-flex;align-items:center;justify-content:flex-end;position:relative}
.tgl button:focus-visible{outline:2px solid var(--cy);outline-offset:3px;border-radius:2px}
  /* Operating path cards: lift, glow, badge pop, flowing arrows */
  .pn{transition:transform .3s var(--ease),border-color .3s,box-shadow .3s}
  .pn:hover{transform:translateY(-6px);border-color:var(--red);box-shadow:0 14px 36px rgba(180,35,42,.15)}
  .pn .arr{transition:transform .3s var(--ease),background .3s,color .3s,border-color .3s}
  .pn:hover .arr{transform:translateY(-50%) translateX(4px);background:var(--red);border-color:var(--red);color:#fff}
  .pn .no{display:inline-block;transition:transform .3s var(--ease)}
  .pn:hover .no{transform:scale(1.14)}
  .pfl:hover .pn .arr{animation:arrFlow 1.15s var(--ease) infinite}
  .pfl:hover .pn:nth-child(2) .arr{animation-delay:.12s}
  .pfl:hover .pn:nth-child(3) .arr{animation-delay:.24s}
  .pfl:hover .pn:nth-child(4) .arr{animation-delay:.36s}
}
@keyframes arrFlow{0%,100%{transform:translateY(-50%) translateX(0)}50%{transform:translateY(-50%) translateX(5px)}}
.pn[data-drawer]{cursor:pointer}
.pn[data-drawer]:focus-visible{outline:2px solid var(--yk);outline-offset:3px}

/* ================= OPERATING PATH — flow line + staggered entrance ================= */
.packflow{position:relative}
.pfl{position:relative}
.pfl::after{content:'';position:absolute;left:6px;right:6px;bottom:-13px;height:2px;background:var(--grad);transform:scaleX(0);transform-origin:left;transition:transform 1.1s var(--ease) .15s}
.packflow.in .pfl::after{transform:scaleX(1)}
.packflow .pn{opacity:0}
.packflow.in .pn{opacity:1;animation:pnRise .55s var(--ease) backwards}
.packflow.in .pn:nth-child(2){animation-delay:.1s}
.packflow.in .pn:nth-child(3){animation-delay:.2s}
.packflow.in .pn:nth-child(4){animation-delay:.3s}
@keyframes pnRise{from{opacity:0;transform:translateY(18px)}}

/* Mobile: vertical timeline path instead of the arrow chain */
@media (max-width:560px){
  .pfl{grid-template-columns:1fr;gap:16px}
  .pfl::after{display:none}
  .pfl::before{content:'';position:absolute;left:19px;top:10px;bottom:10px;width:2px;background:linear-gradient(180deg,var(--red),var(--cy),var(--yk));opacity:.45}
  .pn{position:relative;padding-left:48px}
  .pn::before{content:'';position:absolute;left:12px;top:22px;width:12px;height:12px;transform:rotate(45deg);background:var(--pan);border:2px solid var(--red);z-index:1}
  .pn:nth-child(2)::before{border-color:var(--cy)}
  .pn:nth-child(3)::before{border-color:var(--yk)}
  .pn:nth-child(4)::before{border-color:var(--tx)}
}

/* ================= SERVICEPACKS TABLE — card stack on mobile ================= */
@media (max-width:720px){
  .ptbl-wrap{overflow:visible;border:0;margin-top:8px}
  .ptbl,.ptbl tbody{display:block}
  .ptbl thead{display:none}
  .ptbl tr{display:block;border:1px solid var(--line);background:var(--pan);box-shadow:var(--cardsh);margin:0 0 10px;padding:12px 14px}
  .ptbl td{display:flex;justify-content:space-between;align-items:baseline;gap:12px;border-bottom:1px dashed var(--hair);padding:7px 0;font-size:12.5px}
  .ptbl td:last-child{border-bottom:0}
  .ptbl td:first-child{justify-content:flex-start;border-bottom:1px solid var(--hair);padding:2px 0 9px;font:700 14px var(--disp);letter-spacing:.06em;text-transform:uppercase;color:var(--red2)}
  .ptbl td:not(:first-child)::before{font:600 9.5px var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--mut)}
  .ptbl td:nth-child(2)::before{content:'SP1 Foundation'}
  .ptbl td:nth-child(3)::before{content:'SP2 Presence'}
  .ptbl td:nth-child(4)::before{content:'SP3 Growth Engine'}
  .ptbl td:nth-child(5)::before{content:'SP4 Partner'}
}

/* ================= SHARIA & CORPORATE CONSULTANCY ================= */
@media (max-width:1250px){.tri-in{grid-template-columns:repeat(2,1fr)}}
.h2 em.g{color:var(--grnd)}
.btn-s{border:1px solid var(--grn);color:var(--grnd);background:var(--grnS)}
.tri.shr::before{background:var(--grn)}
.tri.shr small{color:var(--grnd)}
.fcard.g:hover{border-color:var(--grn)}
.ledger.grn .led-h{color:var(--grnd)}
.ledger.grn .led-r:hover{background:var(--grnS)}
.ledger.grn .led-r .n{color:var(--grnd)}
.drawer.theme-shr .dh{border-bottom-color:rgba(47,142,98,.4)}
.drawer.theme-shr .dq{color:var(--grnd)}
.drawer.theme-shr .opt.sel{border-color:var(--grn);background:var(--grnS)}
.drawer.theme-shr .opt.sel::before{background:var(--grn);border-color:var(--grn)}
.drawer.theme-shr .qprog i.done{background:var(--grn)}
.dchip.ssel{border-color:var(--grn);color:var(--grnd);background:var(--grnS)}
.opt.shc{border-left:3px solid var(--grn)}
.indgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:14px;margin-top:42px}
.indc{border:1px solid var(--hair);background:var(--pan);padding:20px 22px;box-shadow:var(--cardsh)}
.indc b{display:block;font:700 17px var(--disp);letter-spacing:.05em;text-transform:uppercase;margin-bottom:6px}
.indc b::before{content:'◆';color:var(--grnd);font-size:11px;margin-right:9px;vertical-align:2px}
.indc p{color:var(--mut);font-size:.92rem}
.difc{border:1px solid var(--hair);background:linear-gradient(180deg,var(--grnS),transparent),var(--pan);padding:22px 24px;box-shadow:var(--cardsh)}
.difc h4{font:700 16px var(--disp);letter-spacing:.06em;text-transform:uppercase;margin-bottom:6px}
.difc h4 i{font:600 9.5px var(--mono);color:var(--grnd);font-style:normal;letter-spacing:.14em;display:block;margin-bottom:4px}
.difc p{color:var(--mut);font-size:.92rem}
.bio.grn{border:1px dashed rgba(47,142,98,.35);background:linear-gradient(180deg,rgba(47,142,98,.06),transparent),var(--pan)}
.bio.grn .who{color:var(--grnd)}
@media (max-width:640px){.indgrid{grid-template-columns:1fr}}
/* --- v4: focus, tap targets, notices, standards grid --- */
:where(a,button,input,select,textarea,[tabindex]):focus-visible{outline:2px solid var(--cy);outline-offset:3px;border-radius:2px}
.chip,.opt,.dchip,.led-r,.fqh,.btn,.go{min-height:44px}
.dx{min-width:44px;min-height:44px}
.note-i{margin-top:16px;font:500 13px/1.65 var(--sans);color:var(--mut);max-width:74ch}
.note-i b{color:var(--tx)}
.stdgrid{display:grid;grid-template-columns:repeat(2,1fr);gap:18px;margin-top:24px}
.stdc{padding:22px;border:1px solid var(--hair);background:var(--pan)}
.stdc b{display:block;font:700 11.5px var(--mono);letter-spacing:.16em;text-transform:uppercase;color:var(--grnd);margin-bottom:9px}
.stdc p{color:var(--mut);font-size:.92rem;line-height:1.6}
.ar-line{margin-top:22px;font:400 18px/1.95 Georgia,"Times New Roman",serif;color:var(--mut)}
.indc p i{font-style:italic;color:var(--grnd)}
/* ServicePack cards on /growth/. The price is the point of the page, so it gets
   its own line and a rule above it rather than being buried in the description.
   These cards carry a full deliverable list, so they get a wider track than the
   other .indgrid blocks — four narrow columns would shred a ten-item list. */
#servicepacks{grid-template-columns:repeat(auto-fit,minmax(285px,1fr))}
.sp-x{list-style:none;margin:15px 0 0;display:flex;flex-direction:column;gap:7px}
.sp-x li{position:relative;padding-left:17px;font-size:.85rem;line-height:1.5;color:var(--mut)}
.sp-x li::before{content:'▸';position:absolute;left:0;top:-1px;color:var(--grnd);font-size:.8rem}
.sp-for{display:block;margin-top:15px;font:500 10px var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--mut2)}
.sp{display:block;margin-top:13px;padding-top:11px;border-top:1px solid var(--hair);font:700 15px var(--disp);letter-spacing:.05em;color:var(--red2)}
html:not([data-theme="dark"]) .sp{color:var(--red)}
.sp-q{display:block;margin-top:3px;font:500 11.5px var(--mono);letter-spacing:.04em;color:var(--mut2)}
/* Operating spec: capacity, team, cadence. Small mono because it is reference
   detail, not a claim competing with the price above it. */
.sp-spec{display:block;margin-top:7px;font:500 10.5px/1.5 var(--mono);letter-spacing:.03em;color:var(--mut2)}
.sp-spec:first-of-type{margin-top:14px}
@media (max-width:640px){.stdgrid{grid-template-columns:1fr}}
/* ================= ABOUT — INTERACTIVE OPERATING PATH ================= */
.opath{position:relative;margin:34px 0 0}
.opath-rail{position:absolute;left:12px;right:12px;top:30px;height:2px;background:var(--hair)}
.opath-rail i{display:block;height:100%;width:100%;background:var(--grad);transform:scaleX(0);transform-origin:left;transition:transform 1.6s var(--ease) .2s}
.opath.in .opath-rail i{transform:scaleX(1)}
.opath-list{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(5,1fr);gap:4px}
.ost{position:relative;padding:0 12px}
.ost-b{display:flex;flex-direction:column;align-items:flex-start;gap:0;width:100%;padding:0;background:transparent;border:0;color:inherit;text-align:left;cursor:pointer;min-height:44px}
.ost-n{font:600 10.5px var(--mono);letter-spacing:.18em;color:var(--mut);line-height:14px}
.ost-d{width:18px;height:18px;transform:rotate(45deg);background:var(--bg);border:2px solid var(--cy);margin:8px 0 16px;transition:transform .3s var(--ease),background .3s,box-shadow .3s}
.ost:nth-child(even) .ost-d{border-color:var(--red)}
.ost-t{font:700 19px/1.15 var(--disp);letter-spacing:.06em;text-transform:uppercase}
.ost-s{font:600 10px var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--mut);margin-top:5px}
.ost-p{overflow:hidden;max-height:0;opacity:0;transition:max-height .45s var(--ease),opacity .3s}
.ost-p>div{margin-top:12px;border-left:2px solid var(--cy);background:var(--pan);padding:12px 14px;color:var(--mut);font-size:.89rem;box-shadow:var(--cardsh)}
.ost.open .ost-p{max-height:320px;opacity:1}
.ost.open .ost-d{transform:rotate(45deg) scale(1.25);background:var(--cy);box-shadow:0 0 0 6px rgba(47,168,198,.16)}
.ost:nth-child(even).open .ost-d{background:var(--red);box-shadow:0 0 0 6px rgba(180,35,42,.16)}
.ost-b:focus-visible{outline:2px solid var(--cy);outline-offset:4px}
@media (hover:hover){.ost-b:hover .ost-d{transform:rotate(45deg) scale(1.18)}.ost-b:hover .ost-t{color:var(--cy)}}
@media (max-width:1060px){
  .opath-rail{display:none}
  .opath-list{grid-template-columns:1fr;gap:10px}
  .ost{padding:0;border:1px solid var(--hair);background:var(--pan)}
  .ost-b{flex-direction:row;align-items:center;flex-wrap:wrap;gap:4px 10px;padding:14px 16px;min-height:60px}
  .ost-n{order:1;color:var(--cy)}
  .ost-d{order:2;width:11px;height:11px;margin:0}
  .ost-t{order:3;flex:1 0 100%;font-size:17px}
  .ost-s{order:4;flex:1 0 100%;margin-top:2px}
  .ost-p>div{margin:0 16px 14px}
  .ost.open{border-color:var(--line)}
}
@media (min-width:1061px){.vmap{grid-template-columns:repeat(4,1fr)}}

/* ==========================================================================
   §ENRICH v2.0 — additive layer only
   The v1.1 sheet already carries a solid hover system inside
   @media (hover:hover) and (pointer:fine): button sheen, card lift, chip
   press, ledger opacity, nav underlines, footer links. Nothing here repeats
   or overrides those. This block adds ONLY what the sheet does not have:

     1. a focus ring that survives a bone background (contrast)
     2. inline prose links — the one control that had no affordance at all
     3. a ledger accent rail, a case-card image breath, a sector-band tint
     4. a selection edge that survives greyscale
     5. the monogram rendered mono-in-chrome from one file, following theme
     6. scroll offsets for anchor targets, and a print sheet
   ========================================================================== */

/* --- 1. Focus -----------------------------------------------------------
   The sheet rings everything cyan. Cyan #2FA8C6 on bone #F4F1EA is about
   2.4:1 — visible, but below the 3:1 non-text floor. On the light theme the
   ring switches to brand red, which measures about 6.4:1 on the same ground.
   Dark theme keeps cyan, which is 7.1:1 on charcoal. */
html:not([data-theme="dark"]) :where(a,button,input,select,textarea,[tabindex]):focus-visible{
  outline-color:var(--red);
}

/* --- 2. Inline prose links ---------------------------------------------
   A bare <a> in running body copy is the one control on the site with no
   hover affordance of its own, so it draws a two-tone rule left-to-right on
   hover and on keyboard focus: "this is clickable" reads without depending
   on colour alone. .lk is the opt-in class.

   The first version of this rule also carried `a:not([class])`, on the stated
   assumption that "every button and nav item here carries a class". That was
   false, and it cost two underlines on every nav item: a nav link carried its
   own ::after bar at 2px AND this rule's gradient at 2px, and hover grew both.
   It also overrode the nav's --mut colour with --cy2 and its font-weight to
   600, so the header read one step brighter and heavier than the sheet asks.

   The repair is not an exclusion list. Excluding .nav a / .foot-in a / .tri a
   would hold today and rot tomorrow — and would already be inert: a scan of
   every built page found that all 77 class-less anchors are controls, 64 in
   .nav, 9 in .foot-in, 4 .tri a, and not one prose link. A sixth hand-written
   band with a class-less link would silently double its underline again.

   Prose is the distinguishing context, so the rule is scoped to `p a`. A
   control not inside a <p> cannot match it however it is written; a prose
   link always is. `p a:not([class])` over plain `p a` is deliberate: a link
   in prose that carries a class — a .btn, say — has already opted out. */
.lk,
p a:not([class]){
  color:var(--cy2);
  font-weight:600;
  text-decoration:none;
  padding-bottom:1px;
  background-image:linear-gradient(90deg,var(--red),var(--cy));
  background-repeat:no-repeat;
  background-position:0 100%;
  background-size:0% 2px;
  transition:background-size .34s var(--ease),color .2s var(--ease);
}
.lk:hover,.lk:focus-visible,
p a:not([class]):hover,
p a:not([class]):focus-visible{
  background-size:100% 2px;
}
html:not([data-theme="dark"]) .lk:hover,
html:not([data-theme="dark"]) p a:not([class]):hover{
  color:var(--red2);
}
/* --- 3. .go — the arrow already slides; the tracking opens with it ------ */
.go{transition:color .25s var(--ease),letter-spacing .3s var(--ease)}
.go:hover,.go:focus-visible{letter-spacing:.18em}

/* --- 4. Ledger rows — an accent rail grows down the row ----------------
   The row already tints and its Inquire label already lifts. The rail marks
   which row is live at a glance, which matters most on the 14-row books
   ledger where the tint alone is faint. Colour is inherited per ledger via
   the existing .ledger.grn overrides, so Sharia runs green and Finance
   runs yolk without another rule. */
.led-r{position:relative}
.led-r::before{
  content:'';
  position:absolute;
  left:0;top:0;bottom:0;width:3px;
  background:currentColor;
  transform:scaleY(0);
  transform-origin:top;
  transition:transform .32s var(--ease);
}
.ledger .led-r{color:var(--ykd)}
.ledger.grn .led-r{color:var(--grnd)}
.led-r:hover::before,.led-r:focus-visible::before{transform:scaleY(1)}

/* --- 5. Case cards — the plate breathes -------------------------------- */
.ccard{transition:transform .3s var(--ease),border-color .3s var(--ease),box-shadow .3s var(--ease)}
.ccard:hover{box-shadow:var(--cardsh)}
.cthumb img,.cthumb img.real{transition:transform .6s var(--ease)}
.ccard:hover .cthumb img,.ccard:hover .cthumb img.real{transform:scale(1.055)}
.ccard h3{transition:color .25s var(--ease)}
.ccard:hover h3{color:var(--cy2)}

/* --- 6. Sector bands --------------------------------------------------- */
.tri{transition:background .3s var(--ease)}
.tri:hover{background:var(--pan2)}

/* --- 7. A chosen chip keeps an edge in greyscale -----------------------
   Selection currently reads through colour and background alone. A 3px
   inset edge on the leading side survives greyscale, low vision and the
   washed-out projector a client meeting usually runs on. */
.chip.on{box-shadow:inset 3px 0 0 0 var(--red)}
.dchip.sel{box-shadow:inset 3px 0 0 0 var(--cy)}
.dchip.ssel{box-shadow:inset 3px 0 0 0 var(--grn)}
.dchip.ysel{box-shadow:inset 3px 0 0 0 var(--yk)}

/* --- 8. The mark in chrome ---------------------------------------------
   The mark is the founder's portrait inside the brand hexagon — what the site
   shipped with, and what the client asked to have back.

   It had been replaced by the M/W monogram masked to currentColor, which hid
   the portrait outright (@supports .brandmark img{display:none}). The monogram
   is still the brand's mark: it stays on /404.html and it is what the favicon,
   the OG card and the manifest are built from. It is just not the header.

   The hexagon is drawn as two clipped layers rather than border + clip-path.
   clip-path clips the border too, so a bordered hexagon loses its top and
   bottom edges and keeps only the two vertical sides — a rectangle's outline
   with the corners sliced off. An inner layer inset by 1px gives a true 1px
   hexagon frame. --hex is defined once in :root so the mark and the theme
   toggle cannot drift apart.

   Browsers without clip-path get a plain 40px square portrait: the photograph
   still shows. The rule it replaced could only fail to a hidden image. */
.brandmark::before{background:var(--line)}
.brandmark img{object-position:center 18%}

/* The theme toggle: the same hexagon, now carrying the mark itself. mark-ink
   is the black face for the bone page, mark-bone the white face for the
   charcoal one, so the glyph is the brand at rest and the theme in passing.

   Both files are 900x573 and OPAQUE, which is worth stating because it is easy
   to get wrong from the outside: they are RGBA, but measuring the alpha channel
   through a canvas puts ink across the whole frame — x 0..899, y 0..572 — so
   the plate is a filled field, not a transparent monogram. Only the favicon is
   genuinely transparent (its ink sits at x 51..460, y 126..386 of 512).

   That is why the crop is object-fit:contain and not cover. cover takes the
   middle square of the plate, which cuts the monogram's outer wings off at the
   hexagon's vertical edges — bold, but a form sliced in half. contain fits the
   whole plate, so the monogram reads complete. The bands it leaves above and
   below cost nothing, because the plate's own field matches the page in each
   theme, and the inner layer is filled with --bg so the gap and the field agree
   either way.

   Which face shows is a CSS decision keyed off html[data-theme], not script:
   the theme is already on the element before first paint, so the right mark is
   there from the first frame with no flash and nothing to keep in sync. The
   button's aria-label still carries the state and the action, and so does its
   title, because a mark alone no longer says "switch to dark". */
.hx{position:relative;display:block;width:24px;height:24px;flex:none}
.hx::before{content:'';position:absolute;inset:0;background:var(--line);clip-path:var(--hex);transition:background .25s var(--ease)}
.hxi{position:absolute;inset:1px;background:var(--bg);clip-path:var(--hex);overflow:hidden}
.hxi img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;object-position:50% 50%}
.hx-d{display:none}
html[data-theme="dark"] .hx-l{display:none}
html[data-theme="dark"] .hx-d{display:block}
.tgl button:hover .hx::before{background:var(--cy)}

/* --- 9. Anchor targets clear the fixed header --------------------------- */
:target,h2[id],h3[id],section[id],div[id]{scroll-margin-top:100px}

/* --- 10. Print — keep the record, drop the chrome ----------------------- */
@media print{
  .bar,.menu,.drawer,.scrim,.skip,.pdots,.hix,#burger{display:none!important}
  .rv,.packflow .pn{opacity:1!important;transform:none!important}
  body{background:#fff;color:#000}
  body::before,body::after{display:none}
  a[href^="http"]::after{content:" (" attr(href) ")";font-size:10px;color:#555}
  .sec{padding:20px 0;break-inside:avoid}
}

/* --- 11. Corridor list -------------------------------------------------
   The travel page lists destinations as plain text. It was reusing .dchip,
   which is the diagnostic's selectable chip: it lifts on hover and stands
   44px tall, so a static list read as clickable controls that did nothing.
   .corr keeps the shape and drops every interactive affordance. */
.corr{
  font:600 11px var(--mono);
  letter-spacing:.08em;
  text-transform:uppercase;
  border:1px solid var(--hair);
  background:var(--pan);
  color:var(--mut);
  padding:9px 13px;
  display:inline-block;
}
