/* 2026-09-23 legal audit: the brand green was used as TEXT (and as a fill under white
   text) below WCAG AA. --green-aa (#15803D) and --green-aa-deep (#11692F) exist for
   exactly this and are used here; the green FILLS that carry no text are untouched. */
/* ============================================================================
   home-system.css  —  the home page's spine.  Added 2026-08-06.

   WHY THIS FILE EXISTS
   index.html loads ten page-specific stylesheets (hero, outcomes, testimonial,
   home, depth, v2-fork, v2-page, v2-cards, markets-mq, security-bento). Every
   other page loads 0-2. Those ten are ten separate build sessions, each
   internally consistent and none agreeing with the others - which is why the
   page had 6 content measures, 5 button variants and 5 eyebrow greens.

   Rather than edit ten files (and risk the .v2p scoping landmine in
   v2-cards.css / v2-page.css), this loads LAST and normalises on top. Cascade
   order is the mechanism: it must stay the final stylesheet in <head>.

   Contains, in order:
     1  measures        two, not six
     2  eyebrows        one green on light, one on dark
     3  headings        one size, one colour per ground, one alignment rule
     4  buttons         btn-navy folded into the secondary look
     5  section grounds the D L D L rhythm
     6  new components  hero demo, task journey, story marks, map column
   ============================================================================ */

:root{
  --measure-wide:1280px;   /* grids, cards, columns, set-pieces */
  --measure-read:960px;    /* pure centred copy blocks           */
  --eb-light:#15803D;      /* --green-aa, 5.0:1 on white         */
  /* References the token rather than copying its hex: --green-bright was raised
     to #3ECB6E on 2026-08-07 for AA on the brighter ground, and a hardcoded
     copy here would have silently kept every home-page eyebrow on the old,
     failing value. */
  --eb-dark:var(--green-bright);   /* accent green for dark grounds */
  --h2-light:#08365D;
  --ground-lite:#F7F9FC;
}

/* ---------- 1. MEASURES ---------------------------------------------------
   Was: 920 / 960 / 1120 / 1180 / 1280 across ten sections, so the left edge
   of the page physically moved four times on the way down. Now two positions. */
.v2-problem-inner,
.v2-fork-inner,
.tlx-outcomes .wrap,
.tlx-testimonial .wrap,
.markets-mq .tlx-section-inner,
.security-bento .tlx-section-inner,
.tlx-journey .tj-inner{max-width:var(--measure-wide)}

.tlx-hero .hero-content,
.video-section .tlx-section-copy,
.cta-band .tlx-section-copy,
.faq-inner{max-width:var(--measure-read)}

/* ---------- 2. EYEBROWS ---------------------------------------------------
   Was five: #15803D, #1A8A3D, #1E9A44, #35C168 and white. --green (#1E9A44)
   is a graphics colour and fails AA as text on white, which is half of why
   they drifted. Light grounds get --green-aa; dark grounds get --green-bright. */
.v2-problem .eyebrow,
.tlx-outcomes .eyebrow,
.faq-tab{color:var(--eb-light)}

.v2-fork .eyebrow,
.tlx-journey .eyebrow,
.markets-mq .eyebrow,
.cta-band .badge-pill{color:var(--eb-dark)}

/* security is re-grounded LIGHT below, so its eyebrow takes the light green.
   --green-bright on #F7F9FC is ~2.3:1 and fails; --green-aa is 5.0:1. */
.security-bento.ground-light .eyebrow{color:var(--eb-light)}

/* the customer story is re-grounded light below, so its eyebrow flips too */
.tlx-testimonial .eyebrow{color:var(--eb-light)}
.tlx-testimonial .eyebrow .d{background:var(--eb-light)}

/* ---------- 3. HEADINGS ---------------------------------------------------
   Was: security 42px against 48px everywhere else, the FAQ heading near-black
   (#101828) against navy everywhere else, and alignment alternating
   L C L C L L L C L with no rule.

   The rule: centred on full-bleed dark set-pieces, left on content sections. */
.security-bento .hs-h2{font-size:clamp(32px,4.4vw,48px)}
.faq-title{color:var(--h2-light)}

.v2-problem h2,
.tlx-outcomes .title,
.tlx-testimonial .h2,
.markets-mq .h2,
.security-bento .hs-h2,
.faq-title{text-align:left}

.v2-fork h2,
.tlx-journey h2,
.video-section .h2,
.cta-band .h2{text-align:center}

/* light-ground headings all navy; dark-ground headings all white */
.tlx-testimonial .h2,
.security-bento .hs-h2{color:var(--h2-light)}

/* ---------- 4. BUTTONS ----------------------------------------------------
   Was five variants. btn-navy was the odd one out: a navy solid appearing
   twice on light grounds where every other light-ground action is either the
   green primary or an outline. Folded into the secondary look. */
.btn-navy{
  background:transparent;color:var(--navy);
  border:1.5px solid rgba(11,70,120,.28);box-shadow:none}
.btn-navy:hover{background:rgba(11,70,120,.06);border-color:rgba(11,70,120,.45)}

/* ============================================================================
   5. SECTION GROUNDS — the D L D L D L D L D L rhythm
   Measured before this file: the page was the only one on the site that opened
   light, ran two near-identical light sections for its first 2,414px (11.6
   apart), and put security (1.8) next to the CTA band (4.9) so 1,631px read as
   one slab. Every step below now clears 40.
   ============================================================================ */

/* --- §1 HERO -> dark. The dot canvas is retinted through hero.js's data-dots
       hook, so this is a ground change only and hero.js is not forked. ------ */
.tlx-hero{
  background:
    radial-gradient(120% 78% at 50% 118%, rgba(30,154,68,var(--gd-glow-green)) 0%, rgba(30,154,68,0) 60%),
    radial-gradient(85% 55% at 14% -8%, rgba(19,88,146,var(--gd-glow-blue)) 0%, rgba(19,88,146,0) 62%),
    linear-gradient(var(--gd-angle),var(--gd-1) 0%,var(--gd-2) 46%,var(--gd-3) 100%);
  color:#fff}
/* hero.css paints this copy for a LIGHT ground - .l1 is --navy-deep, .l2 is
   --green, .subhead is --slate. On the new dark ground that is navy on navy.
   Selectors here match hero.css exactly (.l1/.l2/.subhead/.badge/.trust), not
   the guessed names a first pass used. */
.tlx-hero .headline .l1{color:#fff}
.tlx-hero .headline .l2{color:var(--eb-dark)}
.tlx-hero .headline .rot{color:var(--eb-dark)}
.tlx-hero .subhead{color:rgba(255,255,255,.80)}
.tlx-hero .subhead strong{color:#fff}
.tlx-hero .trust{color:rgba(255,255,255,.82)}
.tlx-hero .trust span{color:rgba(255,255,255,.82)}
.tlx-hero .trust svg{color:var(--eb-dark)}
.tlx-hero .badge{color:#fff;background:rgba(255,255,255,.08);
  border:1px solid rgba(255,255,255,.20);backdrop-filter:blur(6px)}
.tlx-hero .badge-dot{background:var(--eb-dark)}

/* .hero-top::after is an 82%-white radial halo built to lift copy off the old
   light ground. On navy it reads as fog across the headline. Inverted to a
   subtle dark vignette that does the same job in the other direction. */
.tlx-hero .hero-top::after{
  background:radial-gradient(58% 62% at 50% 42%, rgba(3,19,37,.55) 0%, rgba(3,19,37,0) 72%)}

/* --- §6 CUSTOMER STORY -> light. Forced: §5 and §7 are both dark, so a dark
       story would rebuild the slab this whole pass exists to remove. ------- */
.tlx-testimonial{
  background:linear-gradient(180deg,#FFFFFF 0%,var(--ground-lite) 100%);
  color:var(--ink,#0B2138)}
.tlx-testimonial .dots{opacity:.30}
.tlx-testimonial .lead{color:#3C4E63}
.tlx-testimonial .lead b{color:var(--h2-light)}
.tlx-testimonial .card{
  background:#fff;border:1px solid #E3E9F0;
  box-shadow:0 30px 70px -40px rgba(5,25,50,.35)}
.tlx-testimonial .viz-title{color:#5A6B80}
.tlx-testimonial .viz-cap{color:#5A6B80}
.tlx-testimonial .viz-badge{color:var(--green-aa)}
.tlx-testimonial .layer.before{background:#F1F4F8}
.tlx-testimonial .layer.after{background:linear-gradient(135deg,#EAF6EE 0%,#DFF1E6 100%)}
.tlx-testimonial .tag{color:#5A6B80}
.tlx-testimonial .tag.a{color:var(--green-aa)}
.tlx-testimonial .cluster.b .stat-num{color:#76899F}
.tlx-testimonial .cluster.a .stat-num{color:var(--green-aa)}
.tlx-testimonial .handle{background:#fff;border:1px solid #D6DEE8}
.tlx-testimonial .drag-hint{color:#5A6B80;background:rgba(255,255,255,.9)}

/* the before/after marks. Sam 2026-08-06: a struck-through TaskLogix mark on
   the $73K side, a clean one on the $161K side - the labels used to be the
   text "manual spreadsheets" / "with TaskLogix360". */
.ts-mark{display:block;margin-top:var(--sp-3);height:20px;width:auto}
.ts-mark-wrap{position:relative;display:inline-block}
.ts-mark-wrap.out .ts-mark{opacity:.42;filter:grayscale(1)}
.ts-mark-wrap.out::after{
  content:"";position:absolute;left:-4px;right:-4px;top:50%;height:2px;
  background:#C0392B;transform:rotate(-11deg);border-radius:2px}

/* --- §7 WHO WE SERVE -> dark, two columns, map on the right. Sam's call:
       same renderer, same locked config, just smaller. Sitting it in the right
       column is also what fills this section's dead top-right quadrant. ---- */
.markets-mq{
  background:
    radial-gradient(120% 78% at 50% 118%, rgba(30,154,68,var(--gd-glow-green)) 0%, rgba(30,154,68,0) 60%),
    radial-gradient(85% 55% at 14% -8%, rgba(19,88,146,var(--gd-glow-blue)) 0%, rgba(19,88,146,0) 62%),
    linear-gradient(var(--gd-angle),var(--gd-1) 0%,var(--gd-2) 46%,var(--gd-3) 100%);
  color:#fff}
.markets-mq .h2{color:#fff}
.markets-mq .ms-lede,.markets-mq .lede,.markets-mq p{color:rgba(255,255,255,.82)}
.mq-two{display:grid;grid-template-columns:1fr 1fr;gap:clamp(24px,4vw,56px);align-items:center}
/* FLIPPED 2026-08-07 per Sam: map left, copy right. Done by grid placement
   rather than by reordering the markup, so the heading still comes first in the
   DOM for screen readers and for the mobile stack below. */
.mq-two .mq-copy{min-width:0;grid-column:2;grid-row:1}
.mq-two .mq-mapcol{min-width:0;grid-column:1;grid-row:1}
.mq-two #home-map{display:block;width:100%;height:auto}
/* Breathing room under the lede. The CTA had no top margin at all, so it sat
   on the paragraph. */
.mq-two .mq-cta{margin-top:clamp(24px,3vw,36px)}
@media (max-width:900px){
  .mq-two{grid-template-columns:1fr}
  /* Back to source order when it stacks: headline, lede, CTA, then the map. */
  .mq-two .mq-copy,.mq-two .mq-mapcol{grid-column:1;grid-row:auto}
}

/* --- §8 SECURITY -> light. Inverts the bento from dark translucent panels to
       white cards. Three tiles now: the role-breakdown list came out per Sam
       ("people know how roles work"). ------------------------------------- */
.security-bento.ground-light{
  background:linear-gradient(180deg,var(--ground-lite) 0%,#FFFFFF 100%);color:var(--ink,#0B2138)}
.security-bento.ground-light .horizon{display:none}
.security-bento.ground-light .hs-lede{color:#3C4E63}
.security-bento.ground-light .hs-h2 .hl{color:var(--green-aa)}
.security-bento.ground-light .hb-grid{grid-template-columns:repeat(3,1fr)}
@media (max-width:900px){.security-bento.ground-light .hb-grid{grid-template-columns:1fr}}
.security-bento.ground-light .hb-tile{
  background:#fff;border:1px solid #E3E9F0;box-shadow:0 18px 40px -32px rgba(5,25,50,.4)}
.security-bento.ground-light .hb-tile h3{color:var(--h2-light)}
.security-bento.ground-light .hb-tile p{color:#3C4E63}
.security-bento.ground-light .hb-ic{
  background:rgba(30,154,68,.10);border:1px solid rgba(30,154,68,.24);color:var(--green-aa)}
.security-bento.ground-light .hs-link{color:var(--green-aa)}
.security-bento.ground-light .hs-link:focus-visible{outline-color:var(--green-aa)}

/* Header centred 2026-08-07 per Sam. This deliberately overrides the
   left-align that section 3 normalises every section head to — security is the
   one head on the page that now centres, so the rule is scoped, not removed.

   🔴 The auto margins are load-bearing: security-bento.css:21 gives .hb-head a
   780px max-width with NO auto margins, so it sits pinned to the left edge
   while the tile grid below runs the full 1280. text-align:center alone
   centred the words inside that left-pinned box — measurably off-centre
   (head centre 470 vs section centre 720) and it read as a mistake. */
.security-bento .hb-head{text-align:center;margin-left:auto;margin-right:auto}
.security-bento .hs-h2{text-align:center}
.security-bento .hs-lede{margin-left:auto;margin-right:auto;text-align:center}

/* 🔴 Equal-height tiles. .hb-lg carries `grid-row:span 2` while .hb-sm spanned
   a single row, so "Audit trail" only ever got row 1's height and sat visibly
   short next to "Role-based access" — grid stretches items to their ROW, and
   the two were not in the same row box. Spanning .hb-sm across the same two
   rows puts them on one row box, and the default align-items:stretch does the
   rest. (Setting a min-height instead would drift the moment the copy on
   either tile changes.) */
.security-bento.ground-light .hb-sm{grid-row:span 2}
@media (max-width:900px){
  .security-bento.ground-light .hb-sm{grid-row:auto}
}

/* --- §9 CTA -> the markets-page ground, the one Sam picked. Same three-layer
       gradient now on markets.html. ---------------------------------------- */
/* The CTA ground moved to base.css:271 on 2026-08-07 so enterprise, markets and
   qc-inspections share it. Redefining it here would just be a second copy to
   keep in sync. index.html still owns the --bleed SHAPE rules and the dots
   canvas in its inline <style>. */

/* --- §3 FORK ground (2026-08-07). Sam: "make the background a little more
       uniform with the navy, but emphasise the green sunrise effect on the
       bottom, I like it."  Two moves, not one: the top-left blue bloom (the
       blotchy corner) drops well below the shared strength and moves off the
       corner, and the bottom green goes up. Overrides depth.css's .ground-dark
       for this section only — markets-mq keeps the shared mix. ------------- */
.v2-fork.ground-dark{
  background:
    radial-gradient(125% 85% at 50% 120%, rgba(30,154,68,calc(var(--gd-glow-green) + .18)) 0%, rgba(30,154,68,0) 58%),
    radial-gradient(90% 58% at 20% -12%, rgba(35,120,196,calc(var(--gd-glow-blue) - .17)) 0%, rgba(35,120,196,0) 64%),
    linear-gradient(var(--gd-angle), var(--gd-1) 0%, var(--gd-2) 46%, var(--gd-3) 100%)}
/* The drifting beams were the other half of the blotchiness — they read as a
   bright wedge across the top-left rather than as ambient motion. */
.v2-fork .beam{opacity:.34}
.v2-fork .beam.b2{opacity:.22}

/* ============================================================================
   6. NEW COMPONENTS

   QC pass 2026-08-06: rebuilt on the 4-Point Spacing System
   (Wiki/Knowledge/4-Point Spacing System.md). Every margin, padding, gap and
   height below is a multiple of 4, taken from tokens.css's --sp-* scale. The
   first cut used hand-picked values and drifted 37 of them off the grid.

   Type ramp for this layer - 4 sizes, all at or above the 10pt / 13.33px hard
   floor. Micro-labels were 11px and 12.5px; the rulebook says rework the layout
   rather than shrink the type, so they went UP.
   ============================================================================ */
:root{
  --ht-micro:13.5px;   /* numerals, chips, status labels  */
  --ht-sm:15px;        /* captions, secondary rows        */
  --ht-base:16px;      /* body                            */
  --ht-lg:18px;        /* card and step titles            */
}

/* --- §1 hero: the visitor-driven demo -------------------------------------
   Sam's pick. Pairs with §5: the hero shows the four SURFACES (what each room
   of the product looks like), §5 shows one RECORD travelling through them. */
/* Bottom margin added 2026-08-07. `.hd` is a direct child of .tlx-hero (NOT of
   .hero-top, which is why its auto margins compute to 180px at 1440), and
   .hero-top's padding ends in 0 — so the stage's bottom edge landed on the
   section's bottom edge at 1160px exactly, with no gap at all. */
/* 🔴 width:min(1080px, 100% - 40px), NOT max-width:1080px (2026-08-07).
   .hd is a sibling of .hero-top, not a child, so it never inherited the hero's
   20px gutter — and once the viewport is narrower than 1080 the auto margins
   collapse to zero and the tab row and stage ran 0..390, flush to both edges.
   Sizing the box itself keeps the gutter at every width and still caps at 1080. */
.hd{margin:clamp(28px,4vw,44px) auto clamp(48px,6vw,88px);
    width:min(1080px, 100% - 40px)}
.hd-tabs{display:flex;gap:var(--sp-1);padding:var(--sp-1);border-radius:999px;
  width:fit-content;margin:0 auto var(--sp-5);
  background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.14)}
/* 🔴 SCOPED `.hd-tabs .hd-tab`, NOT `.hd-tab` (fixed 2026-08-07).
   hero.css:49 carries `.tlx-hero button{padding:0;font:inherit}` — specificity
   (0,1,1), which beats a bare `.hd-tab` (0,1,0) no matter that home-system.css
   loads last. Cascade ORDER does not rescue a lower specificity. The tabs had
   therefore been rendering at padding:0 and font-size:16px (inherited), which
   is why the active green pill hugged the glyphs so tightly it read as cutting
   the word off. `.hd-tabs .hd-tab` is (0,2,0) and wins.
   hero.css:290 already had to do this same dance for `.dash-tab`.
   Element-first: 40px control height (--h-btn), padding flexes around it. */
.hd-tabs .hd-tab{appearance:none;border:0;cursor:pointer;font:inherit;
  font-size:var(--ht-sm);font-weight:700;color:rgba(255,255,255,.72);
  background:transparent;border-radius:999px;min-height:var(--h-btn);
  padding:var(--sp-2) var(--sp-5);display:flex;align-items:center;
  gap:var(--sp-3);white-space:nowrap;
  transition:background .2s var(--ease),color .2s var(--ease)}
/* The step numeral is a marker, not a word — tabular so 01/02/03/04 hold one
   width, and dimmed rather than shrunk (10pt floor is a hard rule). */
.hd-tabs .hd-tab .n{font-size:var(--ht-micro);font-weight:800;opacity:1;
  color:rgba(255,255,255,.62);font-variant-numeric:tabular-nums;letter-spacing:.02em}
.hd-tabs .hd-tab[aria-selected="true"]{background:var(--green-aa);color:#fff}
/* Full white, not .72 alpha: #15803D leaves only 5.01:1 against pure white, so
   ANY alpha on the numeral drops it under 4.5 at 13.5px (measured 3.39). The
   numeral stays subordinate through size and tracking instead of through
   opacity — there is simply no contrast headroom on a green pill. */
.hd-tabs .hd-tab[aria-selected="true"] .n{color:#fff}
.hd-tabs .hd-tab:hover:not([aria-selected="true"]){background:rgba(255,255,255,.09);color:#fff}
.hd-tabs .hd-tab:hover:not([aria-selected="true"]) .n{color:rgba(255,255,255,.78)}
.hd-tabs .hd-tab:focus-visible{outline:2px solid var(--eb-dark);outline-offset:4px}
@media (max-width:860px){
  .hd-tabs{flex-wrap:wrap;border-radius:20px;max-width:100%}
  .hd-tabs .hd-tab{padding:var(--sp-2) var(--sp-4)}
}
@media (max-width:560px){
  /* Two-up rather than four-across: at 390 the four-across row forced the
     labels below the 13.33px floor to fit. */
  .hd-tabs{width:100%;display:grid;grid-template-columns:1fr 1fr}
  .hd-tabs .hd-tab{justify-content:center}
}

/* dark surface: elevation via lighter fill + faint white border, no shadow
   (4-Point Spacing System rule 5) */
.hd-stage{position:relative;border-radius:16px;overflow:hidden;
  background:linear-gradient(180deg,rgba(255,255,255,.07) 0%,rgba(255,255,255,.03) 100%);
  border:1px solid rgba(255,255,255,.14)}
.hd-chrome{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-3) var(--sp-4);
  background:rgba(4,20,38,.55);border-bottom:1px solid rgba(255,255,255,.10)}
.hd-chrome img{height:20px;width:auto}
.hd-live{margin-left:auto;display:inline-flex;align-items:center;gap:var(--sp-2);
  font-size:var(--ht-micro);font-weight:800;letter-spacing:.10em;color:rgba(255,255,255,.62)}
.hd-live i{width:8px;height:8px;border-radius:50%;background:var(--eb-dark)}
/* 🔴 Panels STACK in one grid cell instead of display:none/block (2026-08-07).
   With display:none the stage collapsed to whichever panel was open, so
   clicking Quality control — the only panel carrying photo evidence — grew the
   whole hero section and shoved the page down. Stacking makes the stage hold
   the tallest panel's height at all times, so switching tabs never reflows.
   visibility:hidden (not opacity:0) keeps the inactive panels out of the
   accessibility tree and out of tab order. */
.hd-panels{position:relative;display:grid}
.hd-panel{grid-area:1/1;padding:clamp(16px,2.4vw,24px);
  visibility:hidden;pointer-events:none}
.hd-panel[data-on="1"]{visibility:visible;pointer-events:auto;
  animation:hdIn .38s var(--ease) both}
@keyframes hdIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.hd-rows{display:flex;flex-direction:column;gap:var(--sp-2)}
/* Rows tint DOWN, not up (2026-08-07). They used rgba(255,255,255,.05), which
   on the brighter --gd-* ground lifted the row behind the green status labels
   until .v.ok measured 4.36:1 at 13.5px — under AA. Darkening the row instead
   restores the headroom and reads better anyway: the panel is recessed into
   the stage rather than floating on it. */
.hd-row{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-3) var(--sp-4);
  border-radius:12px;background:rgba(3,16,30,.34);
  border:1px solid rgba(255,255,255,.10);font-size:var(--ht-sm)}
.hd-row .k{flex:1;color:#fff;font-weight:600;min-width:0;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.hd-row .v{font-size:var(--ht-micro);font-weight:700;color:rgba(255,255,255,.66);flex-shrink:0}
.hd-row .v.ok{color:var(--eb-dark)}
.hd-row .v.warn{color:#F0B44B}
.hd-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;background:rgba(255,255,255,.3)}
.hd-dot.ok{background:var(--eb-dark)}
.hd-dot.warn{background:#F0B44B}
.hd-cap{margin:var(--sp-4) 0 0;font-size:var(--ht-sm);color:rgba(255,255,255,.62);text-align:center}
.hd-grid2{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-2)}
@media (max-width:720px){.hd-grid2{grid-template-columns:1fr}}
.hd-photo{aspect-ratio:4/3;border-radius:12px;background:rgba(255,255,255,.06);
  border:1px solid rgba(255,255,255,.10);display:flex;align-items:center;justify-content:center;
  color:rgba(255,255,255,.42);font-size:var(--ht-micro);font-weight:700;letter-spacing:.05em}

/* --- QC evidence strip (2026-08-07) --------------------------------------
   Replaces .hd-grid2/.hd-photo in the Quality control panel. Sized off the
   64px thumb, so the panel lands within a row-height of the other three and
   the stacked stage stops being driven by this one tab. */
.hd-evi{display:flex;align-items:center;gap:var(--sp-3);margin-top:var(--sp-3);
  padding:var(--sp-2) var(--sp-4);border-radius:12px;
  background:rgba(3,16,30,.34);border:1px solid rgba(255,255,255,.10)}
.hd-evi-lbl{font-size:var(--ht-micro);font-weight:800;letter-spacing:.08em;
  text-transform:uppercase;color:rgba(255,255,255,.5);flex-shrink:0}
.hd-thumb{position:relative;width:112px;height:64px;border-radius:8px;overflow:hidden;
  flex-shrink:0;border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.06)}
.hd-thumb img{width:100%;height:100%;object-fit:cover;display:block;
  filter:saturate(.85) brightness(.92)}
/* Green tick sits ON the thumb — the "this passed" signal, not decoration. */
.hd-thumb i.ok{position:absolute;right:4px;bottom:4px;width:16px;height:16px;border-radius:50%;
  background:var(--green-aa);border:1.5px solid rgba(255,255,255,.9);
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'><path d='M2.5 6.3l2.2 2.2 4.8-4.8' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/></svg>");
  background-repeat:no-repeat;background-position:center;background-size:10px 10px}
/* .70 not .55 — at 13.5px this needs 4.5:1 and .55 measured 3.9. */
.hd-evi-meta{font-size:var(--ht-micro);color:rgba(255,255,255,.70);min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
@media (max-width:560px){
  .hd-evi{flex-wrap:wrap;gap:var(--sp-2)}
  .hd-evi-meta{flex-basis:100%}
}
.hd-bar{height:8px;border-radius:4px;background:rgba(255,255,255,.12);overflow:hidden;
  flex:1;max-width:160px}
.hd-bar i{display:block;height:100%;border-radius:4px;background:var(--eb-dark)}

/* 🔴 This media block sits HERE, after every .hd-* rule, on purpose. Media
   queries add no specificity, so an identical selector declared later in the
   file wins regardless of the query — an earlier @media (max-width:560px)
   .hd-row simply lost to the .hd-row above and changed nothing.
   Rows reclaim the 40px the stage gave up to the new hero gutter: without it
   "Tower 14B · scope imported" needed 201px in a 188px slot and ellipsised,
   the exact truncation _clip.js exists to catch. Padding and gap come down;
   the 13.5px type does NOT (10pt floor: rework the layout, never the type). */
@media (max-width:560px){
  .hd-row{padding:var(--sp-3) var(--sp-2);gap:var(--sp-2)}
  .hd-evi{padding:var(--sp-2) var(--sp-2);gap:var(--sp-2)}
  .hd-panel{padding:var(--sp-3)}
}

/* --- §5 the task journey -------------------------------------------------- */
.tlx-journey{position:relative;
  background:
    radial-gradient(110% 70% at 50% 110%, rgba(30,154,68,calc(var(--gd-glow-green) - .12)) 0%, rgba(30,154,68,0) 62%),
    linear-gradient(var(--gd-angle),var(--gd-1) 0%,var(--gd-2) 46%,var(--gd-3) 100%);
  color:#fff}
/* Vertical padding pulled in 2026-08-07 (Sam: "too much margin between the top
   and bottom of the section"). 104 -> 72 at desktop; the eyebrow coming out
   already bought ~34px at the top. */
.tj-inner{margin:0 auto;padding:clamp(48px,6vw,72px) clamp(20px,5vw,64px)}
/* 56ch (~900px) forced the H2 to three lines and stacked the lede narrow under
   it. The head now runs to 1120px so the title breaks at two and the lede
   spreads with it; the lede keeps its own measure so it never runs past a
   comfortable reading length. */
.tj-head{text-align:center;max-width:min(1120px,100%);margin:0 auto clamp(32px,4vw,48px)}
/* headings >24px: letter-spacing -2..-3%, line-height 1.1-1.2 (rule 4) */
.tj-head h2{margin:0 0 var(--sp-4);font-size:clamp(30px,4.2vw,46px);font-weight:800;
  letter-spacing:-.025em;line-height:1.14;color:#fff;text-wrap:balance}
.tj-head h2 .hl{color:var(--eb-dark)}
.tj-head p{margin:0 auto;max-width:76ch;font-size:clamp(16px,1.7vw,18.5px);
  line-height:1.6;color:rgba(255,255,255,.80);text-wrap:pretty}
.tj-stage{display:grid;grid-template-columns:1fr 1.05fr;gap:clamp(24px,4vw,60px);align-items:center}
@media (max-width:900px){.tj-stage{grid-template-columns:1fr;gap:var(--sp-8)}}

.tj-rail{list-style:none;margin:0;padding:0;position:relative}
.tj-rail::before{content:"";position:absolute;left:20px;top:24px;bottom:24px;width:2px;
  background:rgba(255,255,255,.13)}
.tj-rail .fill{position:absolute;left:20px;top:24px;width:2px;background:var(--eb-dark);
  transition:height .45s var(--ease);box-shadow:0 0 12px rgba(53,193,104,.7)}
.tj-step{position:relative;display:flex;gap:var(--sp-4);padding:var(--sp-4) 0;opacity:.42;
  transition:opacity .35s var(--ease)}
.tj-step[data-on="1"]{opacity:1}
.tj-num{position:relative;z-index:1;flex-shrink:0;width:40px;height:40px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;font-size:var(--ht-micro);font-weight:800;
  background:#0A2740;border:2px solid rgba(255,255,255,.16);color:rgba(255,255,255,.62);
  transition:all .35s var(--ease)}
.tj-step[data-on="1"] .tj-num{background:var(--green-aa);border-color:var(--eb-dark);color:#fff}
.tj-step h3{margin:0 0 var(--sp-1);font-size:var(--ht-lg);font-weight:700;color:#fff;
  letter-spacing:-.01em}
.tj-step p{margin:0;font-size:var(--ht-sm);line-height:1.5;color:rgba(255,255,255,.72)}

.tj-card{background:#fff;border-radius:16px;overflow:hidden;color:#0B2138;
  box-shadow:0 44px 88px -44px rgba(0,0,0,.85)}
.tj-card-top{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-3) var(--sp-4);
  border-bottom:1px solid #E8EDF3;background:#F7F9FC}
.tj-card-top .id{font-size:var(--ht-sm);font-weight:800;color:var(--h2-light)}
/* gap is set here on purpose: hero.css's mock-era .chip rule (now inside its
   archive region) also matches this element, and its 6px gap was the one
   declaration leaking out of that block. Stating it locally makes the journey
   card independent of a stylesheet it has nothing to do with. */
.tj-card-top .chip{margin-left:auto;gap:var(--sp-2);font-size:var(--ht-micro);font-weight:800;letter-spacing:.05em;
  padding:var(--sp-1) var(--sp-2);border-radius:999px;background:#EAF6EE;color:var(--green-aa);
  transition:background .3s var(--ease),color .3s var(--ease)}
.tj-card-top .chip.pending{background:#FEF3C7;color:#B45309}
.tj-rows{padding:var(--sp-2) var(--sp-4) var(--sp-4)}
.tj-r{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-3) 0;
  border-bottom:1px solid #F0F3F7;opacity:.32;transition:opacity .4s var(--ease)}
.tj-r:last-child{border-bottom:0}
.tj-r[data-on="1"]{opacity:1}
.tj-r .tick{width:20px;height:20px;border-radius:50%;flex-shrink:0;border:2px solid #D6DEE8;
  display:flex;align-items:center;justify-content:center;transition:all .35s var(--ease)}
.tj-r[data-on="1"] .tick{background:var(--green-aa);border-color:var(--green-aa)}
.tj-r .tick svg{width:12px;height:12px;color:#fff;opacity:0;transition:opacity .3s var(--ease) .1s}
.tj-r[data-on="1"] .tick svg{opacity:1}
.tj-r .lb{flex:1;font-size:var(--ht-sm);font-weight:600;color:#0B2138;min-width:0}
/* nowrap: "Scope released" and "Work complete" were breaking onto two lines and
   pushing the rows out of alignment with each other */
.tj-r .st{font-size:var(--ht-micro);font-weight:700;color:#5A6B80;white-space:nowrap;flex-shrink:0}
@media (max-width:420px){.tj-r .st{white-space:normal;text-align:right}}
.tj-r[data-on="1"] .st{color:var(--green-aa)}
.tj-foot{padding:0 var(--sp-4) var(--sp-4)}
.tj-meter{height:8px;border-radius:4px;background:#EEF2F7;overflow:hidden}
.tj-meter i{display:block;height:100%;width:0;border-radius:4px;
  background:linear-gradient(90deg,#1E9A44,#35C168);transition:width .5s var(--ease)}
.tj-foot .cap{margin:var(--sp-2) 0 0;font-size:var(--ht-micro);color:#5A6B80;
  display:flex;justify-content:space-between}

/* --- §3 fork: the subset rail ---------------------------------------------
   Sam 2026-08-06: "the graphics in the tab containers don't provide any context
   to what somebody is clicking into." Both panels used to show a near-identical
   white status card. Now both show the SAME four-stage rail with different
   stages lit, so the tab switch reads as "this product covers less of the
   chain" at a glance - which is the entire point of the fork. */
.fr-rail{width:100%;display:flex;flex-direction:column;gap:var(--sp-2)}
.fr-step{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-3) var(--sp-4);
  border-radius:12px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.09);
  opacity:.42;transition:opacity .3s var(--ease),background .3s var(--ease)}
.fr-step.on{opacity:1;background:rgba(53,193,104,.10);border-color:rgba(53,193,104,.30)}
.fr-n{font-size:var(--ht-micro);font-weight:800;letter-spacing:.05em;
  color:rgba(255,255,255,.45);font-variant-numeric:tabular-nums;flex-shrink:0}
.fr-step.on .fr-n{color:var(--green-bright)}
/* Stage icon (2026-08-07, Sam: "add some icons ... could add some character").
   28px tile so the row still lands on the 4-point grid; it inherits the step's
   lit/unlit state rather than carrying its own colour logic. */
.fr-ic{display:inline-flex;align-items:center;justify-content:center;
  width:28px;height:28px;border-radius:8px;flex-shrink:0;
  background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.10);
  color:rgba(255,255,255,.55);transition:color .3s var(--ease),
  background .3s var(--ease),border-color .3s var(--ease)}
.fr-ic svg{width:var(--sp-4);height:var(--sp-4);display:block}
.fr-step.on .fr-ic{background:rgba(53,193,104,.14);border-color:rgba(53,193,104,.34);
  color:var(--green-bright)}
.fr-l{flex:1;font-size:var(--ht-sm);font-weight:700;color:#fff;min-width:0}
.fr-v{font-size:var(--ht-micro);font-weight:600;color:rgba(255,255,255,.55);
  white-space:nowrap;flex-shrink:0}
.fr-step.on .fr-v{color:var(--green-bright)}
.fr-note{margin:var(--sp-3) 0 0;font-size:var(--ht-micro);font-weight:600;
  color:rgba(255,255,255,.62);text-align:center}

/* reduced motion: show the finished state, no scroll choreography */
@media (prefers-reduced-motion:reduce){
  .tj-step,.tj-r{opacity:1!important}
  .tj-rail .fill{height:100%!important}
  .hd-panel[data-on="1"]{animation:none}
}

/* ============================================================================
   7. QC PASS 2026-08-06 — typography consistency
   Findings from measuring the rendered page, not from reading the CSS.
   ============================================================================ */

/* The FAQ heading ran line-height 1.50. Rule 4 of the 4-Point Spacing System
   puts headings over 24px at 1.1-1.2; every other H2 on the page measured
   1.12-1.16, so this was the only one out of band. */
.faq-title{line-height:1.15}

/* The journey H2 topped out at 46px where every other H2 is 48px. A one-off
   size is exactly the drift this pass exists to remove. */
.tj-head h2{font-size:clamp(30px,4.2vw,48px)}

/* Accent green on LIGHT grounds.
   --green #1E9A44 measures 3.65:1 on white: it clears the 3:1 large-text
   threshold at 48px, so it was not illegal, but it fails the 4.5:1 normal-text
   bar and it is a GRAPHICS colour by house rule. Security already used
   --green-aa (5.02:1). Normalised so every light-ground accent matches. */
.v2-problem h2 .glow-word-lit,
.tlx-outcomes .title .hl,
.tlx-testimonial .h2 .accent{color:var(--green-aa)}

/* Dark-ground accents stay --green-bright: #35C168 is the legible green on navy
   and is already what the hero, fork, journey and CTA band use. */
.markets-mq .h2 .hl{color:var(--eb-dark)}
