/* ==========================================================================
   Slotwise marketing site — hand-written CSS, no build step.
   Palette inherits apps/web/src/styles/tokens.css (same RGB triplets, same
   names) so the site stays a visual match for the real product; a few
   brand-only extensions (deeper indigo band, lighter tints) are added below
   and clearly separated. --sw-muted is intentionally darker than the app's
   token (slate-600, not slate-500) — marketing body copy needs the AA
   contrast margin more than dense app chrome does.

   Contents, in file order. The order is the cascade: a later section can win over an
   earlier one, so move a rule between sections only after checking computed styles.
     Tokens ............................ fallback font; colour, type, space, shadow, motion, stacking
     Reset + base ...................... [hidden], headings and the small heading, prose links,
                                         small print, focus, forced-colour icons, anchors, sections
     Buttons + pills
     Nav ............................... sticky bar; the drawer below 860px
     Home hero ......................... the copy beside the board demo from 1024px
     Product tour ...................... the chaptered film on the dark band
     Problem strip ..................... spreadsheet illustration and sourced facts
     Point list ........................ .pillar-list, on every page
     Industries ........................ the home page's four boards
     Dark band ......................... the tour's and the partner form's indigo ground
     Final call to action + footer
     Formula ........................... the calc-transparency <pre>
     Hierarchy flow .................... TPM page: mechanic, promo type, scheduled promotion
     Angle cards ....................... TPM page: manufacturers and retailers
     Breadcrumb + sub-page hero
     Pricing: plans and value .......... tier cards, pilot, calculator, tables, commitment, FAQ
     Mid-band density .................. 900-1279px rhythm
     Screenshot figure ................. .shot and its caption: the hero's no-JS fallback,
                                         the problem illustration's caption
     Product visual frame .............. .shot-frame: a film still in a browser-window chrome,
                                         every page
     Board demo ........................ hero and concept boards (assets/js/board-demo.js)
     Pricing: hero and plans bar ....... H1, billing toggle, compare plans
     Home: loop to trust ............... loop, chapters, split pattern, forecast, AI, fit tiles, trust
     Mobile action bar ................. every page, below 860px
     Partner pages ..................... design partners, rostering, maintenance
     Trade promotion page .............. verticals/trade-promotion-management.html
   ========================================================================== */

/* ==========================================================================
   Tokens
   ========================================================================== */

/* Metric-matched stand-in for Archivo while the web font loads (display=swap): a local
   Arial scaled to Archivo's measured widths (400: 98.2%, 800 vs Arial Bold: 101.7%) and
   given its ascent/descent, so text wraps the same before and after the swap and the
   stacked hero doesn't reflow. */
@font-face {
  font-family: 'Archivo Fallback';
  src: local('Arial'), local('ArialMT'), local('Liberation Sans'), local('Helvetica');
  font-weight: 100 549;
  size-adjust: 98.2%;
  ascent-override: 88%;
  descent-override: 21%;
  line-gap-override: 0%;
}
@font-face {
  font-family: 'Archivo Fallback';
  src: local('Arial Bold'), local('Arial-BoldMT'), local('Liberation Sans Bold'), local('Helvetica Bold');
  font-weight: 550 900;
  size-adjust: 101.7%;
  ascent-override: 88%;
  descent-override: 21%;
  line-gap-override: 0%;
}

:root {
  /* ---- color: shared with the product (apps/web/src/styles/tokens.css) --- */
  --sw-accent: 79 70 229;          /* indigo-600 */
  --sw-canvas: 248 250 252;        /* slate-50 */
  --sw-surface: 255 255 255;       /* white */
  --sw-hairline: 226 232 240;      /* slate-200 */
  --sw-grid: 241 245 249;          /* slate-100 */
  --sw-grid-strong: 203 213 225;   /* slate-300 */
  --sw-ink: 15 23 42;              /* slate-900 */
  --sw-muted: 71 85 105;           /* slate-600 (AA-safe variant of the app's slate-500) */
  --sw-faint: 148 163 184;         /* slate-400 */
  --sw-status-draft: 148 163 184;
  --sw-status-planned: 14 165 233; /* sky-500 */
  --sw-status-approved: 5 150 105; /* emerald-600 */
  --sw-tone-good: 16 185 129;      /* emerald-500 */
  --sw-tone-warn: 245 158 11;      /* amber-500 */
  --sw-tone-bad: 244 63 94;        /* rose-500 */

  /* ---- color: brand-only extensions (same indigo hue, wider ramp) -------- */
  --sw-accent-700: 67 56 202;
  --sw-accent-800: 55 48 163;
  --sw-accent-900: 49 46 129;
  --sw-accent-950: 30 27 75;
  --sw-accent-light: 238 242 255;
  --sw-accent-200: 199 210 254;
  --sw-accent-925: 35 30 100;      /* the dark band's far corner */

  /* ---- color: status shades (the tone hues at the weights text and tints need) */
  --sw-tone-good-200: 167 243 208; /* on dark */
  --sw-tone-good-400: 52 211 153;  /* on dark */
  --sw-tone-good-700: 4 120 87;    /* text on light and on good tints */
  --sw-tone-warn-700: 180 83 9;
  --sw-tone-warn-800: 146 64 14;   /* text on warn tints */
  --sw-tone-bad-100: 255 228 230;  /* bad tint */
  --sw-tone-bad-600: 225 29 72;    /* invalid field edge */
  --sw-tone-bad-700: 190 18 60;    /* error text */
  --sw-tone-bad-800: 159 18 57;    /* text on the bad tint */

  /* ---- type ---------------------------------------------------------- */
  --font-sans: 'Archivo', 'Archivo Fallback', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --font-mono: 'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;

  --fs-xs: 0.8125rem;              /* small print: captions, sources, notes (never below 13px) */
  --fs-sm: clamp(0.875rem, 0.84rem + 0.15vw, 0.9375rem);
  --fs-base: 1rem;
  --fs-md: clamp(1.125rem, 1.06rem + 0.3vw, 1.25rem);
  --fs-lg: clamp(1.375rem, 1.25rem + 0.6vw, 1.75rem);
  --fs-xl: clamp(1.75rem, 1.45rem + 1.4vw, 2.5rem);
  --fs-2xl: clamp(2.125rem, 1.6rem + 2.4vw, 3.25rem);
  --fs-3xl: clamp(2.5rem, 1.7rem + 3.8vw, 4.5rem);

  /* ---- space / radius / shadow ---------------------------------------- */
  --space-1: 0.25rem;
  --space-2: 0.5rem;
  --space-3: 0.75rem;
  --space-4: 1rem;
  --space-5: 1.5rem;
  --space-6: 2rem;
  --space-7: 3rem;
  --space-8: 4rem;
  --space-9: 6rem;
  --space-10: 8rem;

  --radius-sm: 6px;
  --radius-md: 10px;
  --radius-lg: 16px;
  --radius-xl: 24px;
  --radius-full: 999px;

  --shadow-sm: 0 1px 2px rgb(15 23 42 / 0.06);
  --shadow-md: 0 1px 2px rgb(15 23 42 / 0.06), 0 4px 12px -4px rgb(15 23 42 / 0.12);
  --shadow-lg: 0 1px 2px rgb(15 23 42 / 0.06), 0 8px 24px -8px rgb(15 23 42 / 0.16);
  --shadow-lg-up: 0 -1px 2px rgb(15 23 42 / 0.06), 0 -8px 24px -8px rgb(15 23 42 / 0.16); /* a bar docked at the bottom */

  --ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
  --dur-fast: 150ms;
  --dur-base: 320ms;
  --dur-slow: 640ms;

  --z-mobile-cta: 80;              /* under the scrim and the header */
  --z-scrim: 90;                   /* under the header, so the drawer and its toggle stay live */
  --z-sticky: 100;
  --z-mobile-menu: 200;            /* inside the header's stacking context */
  --z-skip-link: 999;

  --container-w: 1240px;
}

/* ==========================================================================
   Reset + base
   ========================================================================== */

*, *::before, *::after { box-sizing: border-box; }
* { margin: 0; }
html { -webkit-text-size-adjust: 100%; }
@media (prefers-reduced-motion: no-preference) {
  html { scroll-behavior: smooth; }
}

body {
  font-family: var(--font-sans);
  font-size: var(--fs-base);
  line-height: 1.55;
  color: rgb(var(--sw-ink));
  background: rgb(var(--sw-surface));
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

img, picture, svg { display: block; max-width: 100%; }
img { height: auto; }

a { color: inherit; text-decoration: none; }

button, input, textarea { font: inherit; color: inherit; }

ul, ol { list-style: none; padding: 0; }

/* hidden means hidden, whatever display a component gives the element */
[hidden] { display: none !important; }

h1, h2, h3, h4 {
  font-weight: 800;
  letter-spacing: -0.03em;
  line-height: 1.08;
  text-wrap: balance;
}

/* Section headings sit a clear step below every page's H1, including the home hero's
   (32px at 1024 beside the demo, 44.8px from ~1380): 28px up to ~1050, 38px from ~1380.
   Headings carry their own gap to the lead beneath them. */
h2 { font-size: clamp(1.75rem, 3.06vw - 0.255rem, 2.375rem); margin-bottom: var(--space-4); }
h3 { font-size: clamp(1.25rem, 1.1rem + 0.45vw, 1.5rem); }
/* The small heading, one step below h3: the title of a step, a tile, a list item or a panel,
   whatever its level in the outline. One definition; each place sets only its spacing. */
h4,
.flow-step h3, .tpm-prices h3, .fit-tile h3, .fit-list h3, .ai-steps h3, .step h3, .ask-get h3, .tpm-next-list h3,
.pilot-band h2, .pains dt, .program-name {
  font-size: var(--fs-md);
  font-weight: 700;
  letter-spacing: -0.01em;
  line-height: 1.3;
}

p { text-wrap: pretty; }

/* Links inside running text are underlined, not told apart by colour alone (WCAG 1.4.1).
   Prose links only: plain-text links with no class, outside any <nav>. A link with its
   own class, or with element children (a bar, a card, a chip), is a component and keeps
   its own style. Zero specificity beyond the element, so component rules still win. */
:where(main :is(p, li, dd, figcaption)) a:where(:not([class], :has(> *), nav a)) {
  color: rgb(var(--sw-accent-700));
  font-weight: 600;
  text-decoration: underline;
  text-decoration-color: rgb(var(--sw-accent) / 0.45);
  text-underline-offset: 0.2em;
  transition: text-decoration-color var(--dur-fast) var(--ease-out-expo);
}
:where(main :is(p, li, dd, figcaption)) a:where(:not([class], :has(> *), nav a)):hover { text-decoration-color: currentColor; }
/* On the dark band (not in the white form panel that sits on it): the band's lavender, underlined
   in lavender, since the indigo underline above disappears on the band. */
.band-dark :where(p, li) a:where(:not([class], :has(> *), nav a, .pf a)) { color: rgb(var(--sw-accent-200)); text-decoration-color: rgb(var(--sw-accent-200) / 0.55); }
.band-dark :where(p, li) a:where(:not([class], :has(> *), nav a, .pf a)):hover { text-decoration-color: currentColor; }

/* Small print: captions, sources, notes and hints. One size and colour; each place adds its own
   spacing and measure, and the three on dark surfaces (the tour note, the calculator notes) their colour. */
.small-print { font-size: var(--fs-xs); line-height: 1.45; color: rgb(var(--sw-muted)); }

::selection { background: rgb(var(--sw-accent-200)); color: rgb(var(--sw-accent-950)); }

.lead {
  font-size: var(--fs-md);
  color: rgb(var(--sw-muted));
}

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

/* Each page's icons live once, as <symbol>s in one hidden <svg class="svg-defs">; every icon is a <use>. */
.svg-defs { position: absolute; width: 0; height: 0; overflow: hidden; }

.skip-link {
  position: absolute;
  left: var(--space-4);
  top: 0;
  background: rgb(var(--sw-ink));
  color: rgb(var(--sw-surface));
  padding: var(--space-3) var(--space-4);
  border-radius: var(--radius-sm);
  z-index: var(--z-skip-link);
  /* transform-based hide (not `top`) so the box is fully off-screen regardless
     of its exact rendered height — a fixed `top` offset left a sub-pixel
     sliver showing at rest */
  transform: translateY(-110%);
  transition: transform var(--dur-fast) var(--ease-out-expo);
}
.skip-link:focus { transform: translateY(var(--space-4)); }

/* Forced colours (Windows contrast themes) keep a colour set on an <svg> itself, so a brand-coloured
   icon (a tick, a ring, an arrow) could vanish against the theme. Every icon takes its parent's
   theme colour instead; !important because each icon's own colour rule is more specific. */
@media (forced-colors: active) {
  svg { color: inherit !important; }
}

:focus-visible {
  outline: 2px solid rgb(var(--sw-accent));
  outline-offset: 2px;
}

/* Anchor targets land clear of the sticky nav (about 85px; 77px on phones) instead of under it. */
[id] { scroll-margin-top: 96px; }
/* Full sections carry their own large padding-top; landing them 96px below the nav
   stacked that padding on top and produced a tall dead band. 48px lets the section's
   own padding provide the breathing room: min section pad 56px -> first content sits
   ~20px clear of the nav at every width. */
section[id] { scroll-margin-top: 48px; }

.container {
  width: 100%;
  max-width: var(--container-w);
  margin-inline: auto;
  padding-inline: clamp(1.25rem, 4vw, 2.5rem);
}

.section {
  padding-block: clamp(3.5rem, 7vw, 6.5rem);
}
.section--alt { background: rgb(var(--sw-canvas)); }
.section--tight { padding-block: clamp(2.5rem, 5vw, 4rem); }
.section--split { padding-block: clamp(3rem, 6vw, 5rem); }

.section-head {
  margin-bottom: clamp(2rem, 4vw, 3.5rem);
}

.mono {
  font-family: var(--font-mono);
  font-feature-settings: "tnum" 1, "zero" 1;
}

/* ==========================================================================
   Buttons + pills
   ========================================================================== */

.btn {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: 0.85rem 1.5rem;
  border-radius: var(--radius-md);
  font-weight: 700;
  font-size: var(--fs-sm);
  border: 1px solid transparent;
  cursor: pointer;
  transition: transform var(--dur-fast) var(--ease-out-expo), box-shadow var(--dur-fast) var(--ease-out-expo), background-color var(--dur-fast) var(--ease-out-expo), border-color var(--dur-fast) var(--ease-out-expo);
}
.btn:hover { transform: translateY(-1px); }
.btn:active { transform: translateY(0); }

.btn-primary {
  background: rgb(var(--sw-accent));
  color: rgb(var(--sw-surface));
  box-shadow: var(--shadow-sm);
}
.btn-primary:hover { background: rgb(var(--sw-accent-700)); box-shadow: var(--shadow-md); }

.btn-ghost {
  background: transparent;
  color: rgb(var(--sw-ink));
  border-color: rgb(var(--sw-grid-strong));
}
.btn-ghost:hover { border-color: rgb(var(--sw-accent)); color: rgb(var(--sw-accent-700)); }

.btn-on-dark {
  background: rgb(var(--sw-surface));
  color: rgb(var(--sw-accent-900));
}
.btn-on-dark:hover { background: rgb(var(--sw-accent-light)); }

.btn-ghost-on-dark {
  background: transparent;
  color: rgb(var(--sw-surface));
  border-color: rgb(255 255 255 / 0.35);
}
.btn-ghost-on-dark:hover { border-color: rgb(255 255 255 / 0.8); }

.btn-lg { padding: 1rem 1.75rem; font-size: var(--fs-base); }
.btn-glyph { width: 0.85em; height: 0.85em; flex: none; }

.btn .mono { font-size: max(0.85em, var(--fs-xs)); font-weight: 500; color: rgb(var(--sw-muted)); } /* e.g. the tour's length */

.cta-row { display: flex; flex-wrap: wrap; gap: var(--space-4); align-items: center; }
/* phones: a page's opening actions stack full width */
@media (max-width: 559.98px) {
  :is(.hero, .page-hero) .cta-row .btn { flex: 1 1 100%; justify-content: center; }
}

.pill {
  display: inline-flex;
  align-items: center;
  gap: 0.35em;
  padding: 0.2em 0.65em;
  border-radius: var(--radius-full);
  font-size: var(--fs-sm);
  font-weight: 700;
  line-height: 1.6;
  /* chips never wrap internally — "Most popular" broke to two lines in narrow tier cards */
  white-space: nowrap;
  /* sized to its label in any parent: a definite width is never stretched by a flex column
     or a grid cell, and (unlike align-self) leaves a flex row's vertical alignment alone */
  width: fit-content;
}
.pill-dot { width: 0.5em; height: 0.5em; border-radius: 50%; background: currentColor; flex: none; }
/* forced colours drop background colours, which erased the filled "live" dot while the hollow
   future ring (a border) stayed: the dot takes the pill's theme text colour instead */
@media (forced-colors: active) { .pill-dot { forced-color-adjust: preserve-parent-color; } }
.pill-good { background: rgb(var(--sw-tone-good) / 0.14); color: rgb(var(--sw-tone-good-700)); }
.pill-neutral { background: rgb(var(--sw-grid)); color: rgb(var(--sw-muted)); }
.pill-accent { background: rgb(var(--sw-accent-light)); color: rgb(var(--sw-accent-700)); }
/* future state: outlined, with a hollow ring (the filled dot of .pill-good is live) */
.pill-future { background: rgb(var(--sw-surface)); color: rgb(var(--sw-accent-700)); border: 1px solid rgb(var(--sw-accent) / 0.4); }
.pill-future .pill-dot { background: none; border: 1.5px solid currentColor; }

/* ==========================================================================
   Nav
   ========================================================================== */

.site-nav {
  position: sticky;
  top: 0;
  z-index: var(--z-sticky);
  background: rgb(var(--sw-surface));
  border-bottom: 1px solid rgb(var(--sw-hairline));
  /* the closed phone drawer waits translated past the right edge; clip (not hidden: no
     scroll container, so sticky and the downward drawer are untouched) keeps it from
     widening the page */
  overflow-x: clip;
}
/* Opaque on purpose: at 0.88 alpha, bright content scrolled beneath the bar (the
   product tour's controls, the screenshots) smeared through it. Never put
   backdrop-filter on .site-nav itself: it would become the containing block for
   the position:fixed mobile menu and trap it inside the header box. */

.nav-inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
  padding-block: var(--space-4);
}

.brand-mark {
  font-size: 1.375rem;
  font-weight: 800;
  letter-spacing: -0.03em;
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
}
.brand-mark svg { width: 24px; height: 24px; }

.nav-links {
  display: flex;
  align-items: center;
  gap: var(--space-7);
}
.nav-links a:not(.btn) {
  font-weight: 600;
  font-size: var(--fs-sm);
  color: rgb(var(--sw-muted));
  transition: color var(--dur-fast) var(--ease-out-expo);
}
.nav-links a:not(.btn):hover { color: rgb(var(--sw-ink)); }
.nav-links a { white-space: nowrap; }
@media (min-width: 860px) and (max-width: 1099.98px) {
  .nav-links { gap: var(--space-5); } /* just above the drawer breakpoint the full row still fits */
}
/* the page you're on: ink, with the accent underline */
.nav-links a[aria-current="page"]:not(.btn) {
  color: rgb(var(--sw-ink));
  text-decoration: underline;
  text-decoration-color: rgb(var(--sw-accent));
  text-decoration-thickness: 2px;
  text-underline-offset: 0.5em;
}

.nav-toggle {
  display: none;
  width: 44px; height: 44px;
  border: 1px solid rgb(var(--sw-hairline));
  border-radius: var(--radius-sm);
  background: rgb(var(--sw-surface));
  align-items: center;
  justify-content: center;
  cursor: pointer;
}
.nav-toggle svg { width: 20px; height: 20px; }
.nav-toggle .icon-close { display: none; }
.nav-toggle[aria-expanded="true"] .icon-menu { display: none; }
.nav-toggle[aria-expanded="true"] .icon-close { display: block; }

/* Phones and tablets: the links become a drawer that opens BELOW the sticky header (its
   containing block), so the logo and the Close button are never covered. Closed, it is
   visibility:hidden — its links drop out of the tab order and its shadow can't show at
   the viewport's edge. */
@media (max-width: 859.98px) {
  .nav-toggle { display: inline-flex; }
  .nav-links {
    position: absolute;
    top: calc(100% + 1px); /* below the header's hairline, which stays unbroken */
    right: 0;
    z-index: var(--z-mobile-menu);
    width: min(22rem, 100%);
    height: calc(100vh - 100% - 1px);
    height: calc(100dvh - 100% - 1px);
    overflow-y: auto;
    overscroll-behavior: contain;
    flex-direction: column;
    align-items: stretch;
    justify-content: flex-start;
    gap: var(--space-1);
    padding: var(--space-5) var(--space-5) var(--space-6);
    background: rgb(var(--sw-surface));
    border-left: 1px solid rgb(var(--sw-hairline));
    box-shadow: var(--shadow-lg);
    transform: translateX(100%);
    visibility: hidden;
    transition: transform var(--dur-base) var(--ease-out-expo), visibility 0s linear var(--dur-base);
  }
  .nav-links[data-open="true"] {
    transform: translateX(0);
    visibility: visible;
    transition: transform var(--dur-base) var(--ease-out-expo);
  }
  .nav-links a:not(.btn) { padding-block: var(--space-2); font-size: var(--fs-lg); color: rgb(var(--sw-ink)); }
  .nav-links a[aria-current="page"]:not(.btn) { text-underline-offset: 0.3em; }
  .nav-links .btn { margin-top: var(--space-5); justify-content: center; }
}
/* Without JavaScript the toggle can't open anything: no drawer, the links wrap under the logo. */
@media (max-width: 859.98px) and (scripting: none) {
  .nav-toggle { display: none; }
  .nav-inner { flex-wrap: wrap; }
  .nav-links {
    position: static; width: auto; height: auto; overflow: visible;
    flex-direction: row; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-5);
    padding: 0; border: 0; box-shadow: none; transform: none; visibility: visible;
  }
  .nav-links a:not(.btn) { font-size: var(--fs-sm); }
  .nav-links .btn { margin-top: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .nav-links, .nav-links[data-open="true"] { transition: none; }
}

.nav-scrim {
  display: none;
  position: fixed;
  inset: 0;
  background: rgb(var(--sw-ink) / 0.4);
  /* Below the header's stacking context (100): the menu panel and toggle live
     inside that context, so a scrim above 100 would dim AND click-block them. */
  z-index: var(--z-scrim);
}
.nav-scrim[data-open="true"] { display: block; }

/* ==========================================================================
   Home hero: the copy, and beside it (>= 1024px) the working board demo, which
   the Board demo section draws. Stacked, copy first, below 1024px.
   ========================================================================== */

.hero { padding-block: clamp(2.5rem, 5vw, 4rem) clamp(3.5rem, 6vw, 5.5rem); }

.hero .hero-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(2.25rem, 4.5vw, 4rem);
  align-items: center;
}

.hero-copy h1 {
  font-size: var(--fs-3xl);
  margin-bottom: var(--space-5);
}
.hero-copy .lead { font-size: var(--fs-md); margin-bottom: var(--space-6); }
/* Three claims, each led by its own "·". The list starts one separator-width to the left and
   clips that strip, so the claim that starts a line loses its dot: a wrapped line never ends or
   starts on a stray separator. A claim longer than the column wraps inside itself. */
.hero-trust {
  --sep: 1.25em;
  display: flex;
  flex-wrap: wrap;
  margin: var(--space-5) 0 0 calc(-1 * var(--sep));
  max-width: calc(46ch + var(--sep));
  clip-path: inset(0 0 0 var(--sep));
  font-size: var(--fs-sm);
  color: rgb(var(--sw-muted));
}
.hero-trust li::before {
  content: "\00B7";
  content: "\00B7" / "";
  display: inline-block;
  width: var(--sep);
  text-align: center;
}

/* min-width:0 so the grid item never floors at its content's width */
.hero-demo { min-width: 0; }

@media (min-width: 1024px) {
  /* The demo takes the wider column: ten week columns and the readout stay legible. */
  .hero .hero-grid { grid-template-columns: minmax(0, 1fr) minmax(36rem, 1.4fr); }
  /* Three lines in the copy column; the .hero-keep phrases never split, so it always
     reads "Plan every / retailer's promotions / on one board". */
  .hero-copy h1 { font-size: clamp(2rem, 3.6vw - 0.3rem, 2.8rem); }
  .hero-keep { white-space: nowrap; }
}

/* ==========================================================================
   Product tour: the chaptered film under the hero, on the dark band.
   JS (main.js) adds the play control, the cut switch and the live chapters;
   without it the <video controls> and the chapter links still work.
   ========================================================================== */

.tour :focus-visible { outline-color: rgb(var(--sw-accent-200)); }

/* One stage width for everything in the band: the full container, but never
   taller than the viewport can show, so short laptop screens get a smaller,
   whole film rather than one you have to scroll to watch. */
.tour-head,
.tour-player,
.tour-chapters,
.tour-note {
  width: min(100%, calc((100vh - 14.5rem) * 16 / 9));
  width: min(100%, calc((100svh - 14.5rem) * 16 / 9));
  margin-inline: auto;
}

.tour-head {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: var(--space-5) var(--space-6);
  margin-bottom: clamp(1.75rem, 3vw, 2.5rem);
}
.tour-intro { flex: 1 1 40rem; min-width: 0; }

.tour-cuts {
  display: inline-flex;
  gap: 2px;
  padding: 3px;
  border-radius: var(--radius-md);
  border: 1px solid rgb(255 255 255 / 0.14);
  background: rgb(255 255 255 / 0.06);
}
.tour-cut {
  display: inline-flex;
  align-items: baseline;
  gap: 0.5em;
  padding: 0.5rem 0.9rem;
  border: 0;
  border-radius: 7px;
  background: transparent;
  color: rgb(var(--sw-accent-200));
  font-size: var(--fs-sm);
  font-weight: 700;
  white-space: nowrap;
  cursor: pointer;
  transition: background-color var(--dur-fast) var(--ease-out-expo), color var(--dur-fast) var(--ease-out-expo);
}
.tour-cut .mono { font-size: 0.8em; font-weight: 500; }
@media (pointer: coarse) { .tour-cut { min-height: 44px; align-items: center; } }
.tour-cut:hover { color: rgb(var(--sw-surface)); background: rgb(255 255 255 / 0.07); }
.tour-cut[aria-pressed="true"] { background: rgb(var(--sw-surface)); color: rgb(var(--sw-accent-950)); }
.tour-cut[aria-pressed="true"] .mono { color: rgb(var(--sw-accent-700)); }

/* --- the film frame ------------------------------------------------------- */
.tour-player {
  position: relative;
  aspect-ratio: 16 / 9;
  scroll-margin-top: 96px; /* JS scrolls the film to just under the sticky nav, leaving the first chapter row in view */
  border-radius: var(--radius-lg);
  overflow: hidden;
  background: rgb(var(--sw-accent-950));
  outline: 1px solid rgb(var(--sw-accent-200) / 0.22);
  box-shadow: 0 2px 6px rgb(10 8 40 / 0.35), 0 40px 80px -32px rgb(10 8 40 / 0.85);
}
.tour-video {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
}
/* The frame clips overflow, so the video's focus ring is drawn on the frame, out on
   the dark band where it always contrasts. Fullscreen (phones) drops the frame styling. */
.tour-video:focus-visible { outline: none; }
.tour-player:has(.tour-video:focus-visible) { outline: 2px solid rgb(var(--sw-accent-200)); outline-offset: 3px; }
.tour-player:fullscreen { border-radius: 0; outline: none; box-shadow: none; }
.tour-player[data-state="idle"] .tour-video { cursor: pointer; }

.tour-play {
  position: absolute;
  left: 50%;
  top: 50%;
  translate: -50% -50%;
  width: max-content; /* left:50% alone caps the shrink-to-fit width at half the frame */
  display: inline-flex;
  align-items: center;
  gap: var(--space-4);
  padding: 0.5rem 1.5rem 0.5rem 0.5rem;
  border: 1px solid rgb(255 255 255 / 0.14);
  border-radius: var(--radius-full);
  background: rgb(var(--sw-accent-950) / 0.92);
  color: rgb(var(--sw-surface));
  box-shadow: 0 2px 6px rgb(10 8 40 / 0.3), 0 24px 48px -16px rgb(10 8 40 / 0.7);
  cursor: pointer;
  transition: scale var(--dur-fast) var(--ease-out-expo), background-color var(--dur-fast) var(--ease-out-expo);
}
.tour-play:hover,
.tour-player[data-state="idle"]:hover .tour-play { scale: 1.04; background: rgb(var(--sw-accent-950)); }
.tour-play:active { scale: 1; }
/* two-tone ring: white against the pill, indigo against the (light) poster */
.tour-play:focus-visible {
  outline: 2px solid rgb(var(--sw-accent));
  outline-offset: 2px;
  box-shadow: 0 0 0 2px rgb(var(--sw-surface)), 0 2px 6px rgb(10 8 40 / 0.3), 0 24px 48px -16px rgb(10 8 40 / 0.7);
}
.tour-play-disc {
  position: relative;
  flex: none;
  display: grid;
  place-items: center;
  width: 3.5rem;
  height: 3.5rem;
  border-radius: 50%;
  background: rgb(var(--sw-accent));
}
.tour-play-icon { width: 1.5rem; height: 1.5rem; translate: 2px 0; }
.tour-play-spin {
  position: absolute;
  inset: -5px;
  border-radius: 50%;
  border: 2px solid transparent;
  border-top-color: rgb(var(--sw-accent-200));
  border-right-color: rgb(var(--sw-accent-200));
  opacity: 0;
}
.tour-play-text { display: flex; flex-direction: column; align-items: flex-start; gap: 0.1rem; line-height: 1.2; }
.tour-play-text > span:first-child { font-size: var(--fs-md); font-weight: 800; letter-spacing: -0.01em; }
.tour-play-text .mono { font-size: 0.8rem; color: rgb(var(--sw-accent-200)); }

.tour-player[data-state="loading"] .tour-play { cursor: progress; }
.tour-player[data-state="loading"] .tour-play-spin { opacity: 1; }

.tour-end {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  gap: var(--space-5);
  padding: clamp(1.25rem, 4vw, 3rem);
  text-align: center;
  background: linear-gradient(155deg, rgb(var(--sw-accent-950)), rgb(var(--sw-accent-900)));
}
.tour-end-title {
  font-size: var(--fs-xl);
  font-weight: 800;
  letter-spacing: -0.03em;
  line-height: 1.1;
  color: rgb(var(--sw-surface));
  text-wrap: balance;
}
.tour-end-actions { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--space-3); }

.tour-error {
  position: absolute;
  left: 50%;
  top: 50%;
  translate: -50% -50%;
  width: max-content;
  max-width: calc(100% - 2rem);
  padding: var(--space-3) var(--space-4);
  border-radius: var(--radius-md);
  background: rgb(var(--sw-accent-950) / 0.94);
  color: rgb(var(--sw-surface));
  font-size: var(--fs-sm);
  text-align: center;
}

/* --- chapters: each chip is drawn like a promotion bar on the board (pastel fill,
   accent leading edge, label and mono time on it). The current chip's bar is revealed
   left to right under the playhead; played chips keep a quieter full bar. ------------- */
.tour-chapters {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(8.75rem, 1fr));
  gap: var(--space-2);
  margin-top: var(--space-5);
}
.tour-ch {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  height: 100%;
  padding: 0.65rem 0.8rem 0.75rem;
  border-radius: var(--radius-sm);
  border: 1px solid rgb(255 255 255 / 0.1);
  background: rgb(255 255 255 / 0.04);
  color: rgb(var(--sw-surface));
  transition: background-color var(--dur-fast) var(--ease-out-expo), border-color var(--dur-fast) var(--ease-out-expo), color var(--dur-fast) var(--ease-out-expo);
}
.tour-ch:hover { background: rgb(255 255 255 / 0.09); border-color: rgb(255 255 255 / 0.24); }
.tour-ch-time { font-size: var(--fs-xs); line-height: 1.3; color: rgb(var(--sw-accent-200)); }
.tour-ch-name { font-size: 0.875rem; font-weight: 700; line-height: 1.25; }
.tour-ch-bar { position: absolute; inset: 0; z-index: -1; pointer-events: none; }
.tour-ch-bar > span {
  position: absolute;
  inset: 0;
  /* clip, not scale, so the leading edge keeps its width while the bar grows */
  clip-path: inset(0 calc(100% - var(--p, 0) * 100%) 0 0);
}
.tour-ch[data-past] .tour-ch-bar > span {
  clip-path: none;
  background: rgb(var(--sw-accent-200) / 0.1);
  box-shadow: inset 3px 0 0 rgb(var(--sw-accent-200) / 0.5);
}
.tour-ch[aria-current] {
  background: rgb(var(--sw-surface));
  border-color: rgb(var(--sw-surface));
  color: rgb(var(--sw-accent-950));
  box-shadow: 0 8px 24px -10px rgb(10 8 40 / 0.6);
}
.tour-ch[aria-current] .tour-ch-time { color: rgb(var(--sw-accent-700)); }
.tour-ch[aria-current] .tour-ch-bar > span {
  background: rgb(var(--sw-accent-200));
  box-shadow: inset 3px 0 0 rgb(var(--sw-accent));
}

.tour-note { margin-top: var(--space-5); color: rgb(var(--sw-accent-200)); }
.tour-note > span { display: block; }

/* Phones: six chapters, then a disclosure for the rest (JS sets data-collapsible; without
   it all fourteen show). */
.tour-more {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  margin-top: var(--space-2);
  padding: 0.5rem 0.9rem;
  border: 1px solid rgb(255 255 255 / 0.24);
  border-radius: var(--radius-sm);
  background: transparent;
  color: rgb(var(--sw-surface));
  font-size: var(--fs-sm);
  font-weight: 700;
  cursor: pointer;
}
.tour-more:hover { border-color: rgb(255 255 255 / 0.6); }
.tour-chapters[data-collapsible]:not([data-expanded]) > li:nth-child(n+7) { display: none; }

/* One row of seven (six for the short cut) only where the film is wide enough to hold it:
   on a short laptop screen the film shrinks to fit the height, and the auto-fill grid above
   wraps the chips under it instead of running them past its right edge. */
@media (min-width: 1024px) and (min-height: 720px) {
  .tour-chapters { grid-template-columns: repeat(7, minmax(0, 1fr)); }
  .tour-chapters[data-count="6"] { grid-template-columns: repeat(6, minmax(0, 1fr)); }
}
@media (max-width: 559.98px) {
  .tour-chapters { grid-template-columns: 1fr 1fr; }
  .tour-play { gap: var(--space-3); padding: 0.4rem 1.1rem 0.4rem 0.4rem; }
  .tour-play-disc { width: 2.75rem; height: 2.75rem; }
  .tour-play-icon { width: 1.2rem; height: 1.2rem; }
  .tour-play-text > span:first-child { font-size: var(--fs-base); }
  .tour-ch { padding: 0.55rem 0.7rem 0.6rem; }
  .tour-end { gap: var(--space-3); }
  .tour-end-title { font-size: var(--fs-md); }
  .tour-end .btn { padding: 0.55rem 0.9rem; font-size: var(--fs-xs); }
}
@media (prefers-reduced-motion: no-preference) {
  .tour-player[data-state="loading"] .tour-play-spin { animation: tour-spin 0.9s linear infinite; }
  .tour-end:not([hidden]) { animation: tour-fade var(--dur-base) var(--ease-out-expo); }
}
@keyframes tour-spin { to { rotate: 1turn; } }
@keyframes tour-fade { from { opacity: 0; } }

/* ==========================================================================
   Problem strip
   ========================================================================== */

.problem-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(2.5rem, 5vw, 4rem);
  align-items: center;
}
.problem-grid > * { min-width: 0; }
@media (min-width: 960px) {
  .problem-grid { grid-template-columns: 0.95fr 1.05fr; }
}

/* The sourced facts: three ruled sentences, the figure set in the heading weight (not a
   giant number), each source printed beneath it. */
.stat-list {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--space-5) var(--space-6);
  margin-top: clamp(2.5rem, 5vw, 3.5rem);
}
@media (min-width: 720px) {
  .stat-list { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
.stat-item {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  gap: var(--space-3);
  padding-top: var(--space-4);
  border-top: 1px solid rgb(var(--sw-grid-strong));
}
.stat-item p:first-child { font-size: var(--fs-md); line-height: 1.4; color: rgb(var(--sw-ink)); }
.stat-item strong { font-weight: 800; letter-spacing: -0.02em; font-variant-numeric: tabular-nums lining-nums; }

.problem-mock { margin: 0; }

/* mock spreadsheet illustration */
.spreadsheet-mock {
  border: 1px solid rgb(var(--sw-hairline));
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-md);
  background: rgb(var(--sw-hairline));
}
.spreadsheet-mock .row {
  display: grid;
  grid-template-columns: 1.2fr 1fr 1fr 1fr;
  gap: 1px;
  background: rgb(var(--sw-hairline));
}
.spreadsheet-mock .cell {
  background: rgb(var(--sw-surface));
  padding: 0.65rem 0.75rem;
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  color: rgb(var(--sw-muted));
  display: flex;
  align-items: center;
  gap: 0.35rem;
}
.spreadsheet-mock .row--head .cell {
  background: rgb(var(--sw-ink));
  color: rgb(var(--sw-canvas));
  font-weight: 700;
  font-family: var(--font-sans);
  font-size: var(--fs-xs);
  letter-spacing: 0.02em;
}
.spreadsheet-mock .cell--strike { text-decoration: line-through; color: rgb(var(--sw-muted)); }
.spreadsheet-mock .cell--flag {
  background: rgb(var(--sw-tone-bad-100));
  color: rgb(var(--sw-tone-bad-800));
  font-weight: 600;
  position: relative;
}
.spreadsheet-mock .cell--warn {
  background: rgb(var(--sw-tone-warn) / 0.14);
  color: rgb(var(--sw-tone-warn-800));
  font-weight: 600;
}

/* ==========================================================================
   Point list (shared: home chapters, pricing, TPM and partner pages)
   ========================================================================== */

.pillar-list { margin-top: var(--space-5); display: flex; flex-direction: column; gap: var(--space-2); }
/* Block + absolute dot, NOT flex: with flex, a li containing "<strong>Title</strong>: text"
   splits into separate flex columns (dot | title | text), which is exactly the misaligned
   two-column mess the pricing commitment panel showed. Block flow renders identically for
   plain-text items and correctly for mixed-inline ones. */
.pillar-list li {
  position: relative;
  padding-left: calc(6px + var(--space-3));
  font-size: var(--fs-sm);
  color: rgb(var(--sw-ink));
}
.pillar-list li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.55em;
  width: 6px; height: 6px;
  border-radius: 50%;
  background: rgb(var(--sw-accent));
}

/* ==========================================================================
   Industries: four boards, one engine. The live one is inked; the open
   invitation is drawn with the product's dashed draft outline.
   ========================================================================== */

.industry-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--space-4);
}
.industry-grid > li { display: flex; min-width: 0; }
@media (min-width: 640px) {
  .industry-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 1100px) {
  .industry-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
/* In a multi-column row every card reserves two heading lines, so the status pills that follow
   the headings start at the same height across the row. */
@media (min-width: 640px) {
  .industry-card h3 { min-height: 2.2em; min-height: 2lh; }
}

.industry-card {
  flex: 1;
  border: 1px solid rgb(var(--sw-hairline));
  border-radius: var(--radius-lg);
  padding: var(--space-5) var(--space-5) var(--space-6);
  background: rgb(var(--sw-surface));
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  transition: border-color var(--dur-fast) var(--ease-out-expo), box-shadow var(--dur-fast) var(--ease-out-expo), transform var(--dur-fast) var(--ease-out-expo);
}
.industry-card p { color: rgb(var(--sw-muted)); font-size: var(--fs-sm); flex-grow: 1; }
.industry-card:hover { border-color: rgb(var(--sw-grid-strong)); box-shadow: var(--shadow-md); }

.industry-card--primary {
  background: rgb(var(--sw-ink));
  color: rgb(var(--sw-surface));
  border-color: rgb(var(--sw-ink));
}
.industry-card--primary p { color: rgb(var(--sw-grid-strong)); }
.industry-card--primary:hover { border-color: rgb(var(--sw-ink)); transform: translateY(-2px); box-shadow: var(--shadow-lg); }
.industry-card--primary .pill { background: rgb(255 255 255 / 0.1); color: rgb(var(--sw-tone-good-200)); }
.industry-card--open { background: transparent; border: 1px dashed rgb(var(--sw-grid-strong)); }
.industry-card--open:hover { border-color: rgb(var(--sw-accent)); box-shadow: none; }

/* the "go" link: a card's own link line, or a standalone link with an arrow (partner pages) */
.card-link {
  font-weight: 700;
  font-size: var(--fs-sm);
  display: inline-flex;
  align-items: center;
  gap: 0.4em;
  color: rgb(var(--sw-accent-700));
}
.industry-card--primary .card-link { color: rgb(var(--sw-accent-200)); }
.card-link svg { width: 14px; height: 14px; transition: transform var(--dur-fast) var(--ease-out-expo); }
.card-link:hover svg,
.industry-card:hover .card-link svg { transform: translateX(3px); }

/* ==========================================================================
   Dark band: the indigo ground under the product tour and the partner form
   ========================================================================== */

.band-dark {
  background: linear-gradient(155deg, rgb(var(--sw-accent-950)), rgb(var(--sw-accent-900)) 60%, rgb(var(--sw-accent-925)));
  color: rgb(var(--sw-surface));
}
.band-dark .section-head .lead,
.band-dark .lead { color: rgb(var(--sw-accent-200)); }
.band-dark h2 { color: rgb(var(--sw-surface)); }

/* ==========================================================================
   Final call to action + footer
   ========================================================================== */

.cta-band {
  text-align: center;
  padding-block: clamp(4rem, 8vw, 7rem);
}
.cta-band h2 { margin-inline: auto; }
.cta-band .lead { margin-inline: auto; text-align: center; margin-bottom: var(--space-7); }
.cta-band .cta-row { justify-content: center; }
.cta-next { margin: var(--space-5) auto 0; font-size: var(--fs-sm); color: rgb(var(--sw-muted)); } /* the plain address beside the mailto */

.site-footer {
  border-top: 1px solid rgb(var(--sw-hairline));
  padding-block: var(--space-8);
  background: rgb(var(--sw-canvas));
}
.footer-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-7);
}
@media (min-width: 720px) {
  .footer-grid { grid-template-columns: 1.4fr repeat(3, 1fr); }
}
.footer-brand p { color: rgb(var(--sw-muted)); font-size: var(--fs-sm); margin-top: var(--space-3); }
.footer-head { font-size: var(--fs-xs); color: rgb(var(--sw-ink)); margin-bottom: var(--space-3); font-weight: 700; }
.footer-col ul { display: flex; flex-direction: column; gap: var(--space-2); }
.footer-col a { font-size: var(--fs-sm); color: rgb(var(--sw-muted)); transition: color var(--dur-fast) var(--ease-out-expo); }
.footer-col a:hover { color: rgb(var(--sw-accent-700)); }
/* touch: every footer link gets a 44px-tall target */
@media (pointer: coarse) {
  .footer-col ul { gap: 0; }
  .footer-col a { display: inline-block; padding-block: 0.7rem; }
}
.footer-bottom {
  margin-top: var(--space-8);
  padding-top: var(--space-5);
  border-top: 1px solid rgb(var(--sw-hairline));
  display: flex; flex-wrap: wrap; gap: var(--space-3);
  justify-content: space-between;
  font-size: var(--fs-xs);
  color: rgb(var(--sw-muted));
}

/* ==========================================================================
   Formula: the calc-transparency <pre>
   ========================================================================== */

/* A real <pre>: the lines keep their breaks and the "=" column stays aligned. On a
   phone the block scrolls sideways inside itself (tabindex="0" in the markup lets a
   keyboard scroll it); the page never does. */
.formula {
  margin: 0;
  font-family: var(--font-mono);
  font-size: 0.875rem;
  /* Where the longest line is wider than the block (phones, and at 14px up to about 665px wide),
     it scrolls sideways. A light edge marks the side where a line continues; the ink "covers"
     scroll with the text and hide each edge once you reach it (the classic local/scroll background
     pairing), so a block that fits shows no edge at all. */
  background:
    linear-gradient(to right, rgb(var(--sw-ink)) 40%, rgb(var(--sw-ink) / 0)) left / 2.5rem 100% no-repeat local,
    linear-gradient(to left, rgb(var(--sw-ink)) 40%, rgb(var(--sw-ink) / 0)) right / 2.5rem 100% no-repeat local,
    linear-gradient(to right, rgb(var(--sw-accent-200) / 0.55), rgb(var(--sw-accent-200) / 0)) left / 1rem 100% no-repeat scroll,
    linear-gradient(to left, rgb(var(--sw-accent-200) / 0.55), rgb(var(--sw-accent-200) / 0)) right / 1rem 100% no-repeat scroll,
    rgb(var(--sw-ink));
  color: rgb(var(--sw-hairline));
  border-radius: var(--radius-md);
  padding: var(--space-5);
  overflow-x: auto;
  line-height: 1.7;
  white-space: pre;
  scrollbar-width: thin;
  scrollbar-color: rgb(255 255 255 / 0.3) transparent;
}
.formula .op { color: rgb(var(--sw-faint)); }
.formula .good { color: rgb(var(--sw-tone-good-400)); }
/* Phones: a smaller size, so the block scrolls less far. */
@media (max-width: 559.98px) {
  .formula { padding: var(--space-4); font-size: 0.75rem; }
}

/* ==========================================================================
   Hierarchy flow (TPM page: mechanic -> promo type -> scheduled promotion)
   ========================================================================== */

.flow {
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
}
.flow-step {
  border: 1px solid rgb(var(--sw-hairline));
  border-radius: var(--radius-lg);
  padding: var(--space-5) var(--space-6);
  background: rgb(var(--sw-surface));
}
.flow-step h3 { margin-bottom: var(--space-2); }
.flow-step p { color: rgb(var(--sw-muted)); font-size: var(--fs-sm); }
.flow-arrow {
  align-self: center;
  color: rgb(var(--sw-muted));
}
/* an SVG arrow points down while the steps stack, right once they sit in a row */
.flow-arrow svg { width: 1.25rem; height: 1.25rem; transform: rotate(90deg); }
@media (min-width: 860px) {
  .flow { flex-direction: row; align-items: stretch; }
  .flow-step { flex: 1; }
  .flow-arrow svg { transform: none; }
}

/* ==========================================================================
   Angle cards (TPM page: manufacturers / retailers)
   ========================================================================== */

.angle-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-5);
}
@media (min-width: 720px) {
  .angle-grid { grid-template-columns: 1fr 1fr; }
}
.angle-card {
  border-radius: var(--radius-lg);
  padding: var(--space-6);
  border: 1px solid rgb(var(--sw-hairline));
  background: rgb(var(--sw-surface));
}
.angle-card h3 { margin-bottom: var(--space-3); }
.angle-card p { color: rgb(var(--sw-muted)); font-size: var(--fs-sm); }
.angle-card .pillar-list { margin-top: var(--space-4); }

/* ==========================================================================
   Breadcrumb + sub-page hero
   ========================================================================== */

.breadcrumb {
  display: flex; align-items: center; gap: var(--space-2);
  font-size: var(--fs-sm); color: rgb(var(--sw-muted));
  margin-bottom: var(--space-6);
}
.breadcrumb a { font-weight: 600; }
.breadcrumb a:hover { color: rgb(var(--sw-accent-700)); }
/* a page's status rides in its breadcrumb row: read before the H1, never a label stacked on it */
.page-meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-4); margin-bottom: var(--space-6); }
.page-meta .breadcrumb { margin-bottom: 0; }
/* phones: the status shortens to "In design" (read in full) so it stays on the breadcrumb's line */
@media (max-width: 559.98px) {
  .meta-more { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; }
}

.page-hero { padding-block: clamp(2.5rem, 5vw, 4.5rem) clamp(3rem, 5vw, 4.5rem); }
.page-hero h1 { margin-bottom: var(--space-4); }
/* Every page but home sets its H1 on this one scale (34-52px), a clear step above the H2s. */
:is(.page-hero, .pricing-hero) h1 { font-size: var(--fs-2xl); }
.page-hero .lead { font-size: var(--fs-md); }

/* ==========================================================================
   Pricing: plans and value — tier cards, pilot, ROI calculator, tables, commitment, FAQ
   ========================================================================== */

/* --- tier cards: a pricing table IS the one honest use of cards; the featured
   tier is differentiated by elevation + a full ring, never a side stripe ---- */
.price-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-5);
  align-items: stretch;
}
@media (min-width: 680px) {
  .price-grid { grid-template-columns: repeat(2, 1fr); gap: var(--space-4); }
}

.price-card {
  display: flex;
  flex-direction: column;
  border: 1px solid rgb(var(--sw-hairline));
  border-radius: var(--radius-lg);
  padding: var(--space-5);
  background: rgb(var(--sw-surface));
}
/* four-up once the container is at its full width (--container-w), so the four-up cards are
   always the width where the badge, billing line and button labels fit on one line */
@media (min-width: 1240px) {
  .price-grid { grid-template-columns: repeat(4, 1fr); gap: var(--space-3); }
  .price-card { padding: var(--space-5) var(--space-5) var(--space-6); }
}
/* The six parts of every card (name, price, billing line, audience, features, button) share
   the grid's rows, so prices, dividers and buttons sit on one line across the cards whatever
   the badge or the copy length does. Without subgrid each card stays its own flex column. */
@supports (grid-template-rows: subgrid) {
  .price-card { display: grid; grid-row: span 6; grid-template-rows: subgrid; row-gap: 0; }
}
.price-card--featured {
  border-color: rgb(var(--sw-accent));
  box-shadow: 0 0 0 1px rgb(var(--sw-accent)), var(--shadow-md);
}

/* The badge sits on the name row; if a narrow card still wraps it, align-content keeps
   every card's name on the row's top line so the names stay level across the cards. */
.price-tier { display: flex; flex-wrap: wrap; align-items: center; align-content: flex-start; justify-content: space-between; gap: var(--space-1) var(--space-2); }
.price-tier h3 { font-size: var(--fs-lg); }
.price-tier .pill { font-size: var(--fs-xs); }

.price-amount { display: flex; align-items: baseline; gap: 0.4ch; margin-top: var(--space-3); }
/* Display prices in the heading face with tabular lining figures: a mono comma sits in a full
   cell and read "$1 , 250". Small secondary money lines keep the mono data face. */
.price-num { font-family: var(--font-sans); font-weight: 800; font-variant-numeric: tabular-nums lining-nums; font-size: clamp(2rem, 1.5rem + 1.4vw, 2.75rem); line-height: 1.1; letter-spacing: -0.02em; color: rgb(var(--sw-ink)); }
.price-num--word { letter-spacing: -0.03em; }
.price-cadence { font-size: var(--fs-sm); color: rgb(var(--sw-muted)); }
.price-bill { margin-top: var(--space-2); }
.price-bill .mono { color: rgb(var(--sw-ink)); font-weight: 600; }
.price-bill strong { color: rgb(var(--sw-accent-700)); font-weight: 700; white-space: nowrap; }
.price-for { font-size: var(--fs-sm); color: rgb(var(--sw-muted)); margin-top: var(--space-4); padding-bottom: var(--space-4); border-bottom: 1px solid rgb(var(--sw-hairline)); }

.price-features { display: flex; flex-direction: column; gap: var(--space-3); margin-top: var(--space-5); flex-grow: 1; }
.price-features li { display: flex; gap: var(--space-3); font-size: var(--fs-sm); color: rgb(var(--sw-ink)); align-items: flex-start; }
.price-features li .tick { flex: none; width: 18px; height: 18px; margin-top: 1px; color: rgb(var(--sw-status-approved)); }
/* Every tick and dash on the page is a <use> of one hidden <symbol> (.svg-defs), stroked in
   currentColor so forced-colours themes repaint it with the text colour. */
.price-features .tick,
.compare-table .tick,
.compare-table .dash { fill: none; stroke: currentColor; stroke-width: 2.5; stroke-linecap: round; stroke-linejoin: round; }
.price-features .price-inherit { color: rgb(var(--sw-muted)); font-weight: 600; }
/* flex: the button stretches to its row, so the four buttons stay the same height even where
   a longer label wraps. */
.price-cta { display: flex; margin-top: var(--space-6); }
.price-cta .btn { width: 100%; justify-content: center; text-align: center; padding-inline: var(--space-4); }

/* --- paid pilot band ------------------------------------------------------- */
.pilot-band {
  border: 1px solid rgb(var(--sw-hairline));
  border-radius: var(--radius-lg);
  background: rgb(var(--sw-canvas));
  padding: var(--space-6);
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-5);
  align-items: center;
}
@media (min-width: 820px) { .pilot-band { grid-template-columns: 1fr auto; gap: var(--space-7); } }
.pilot-band h2 { margin-bottom: var(--space-2); }
.pilot-band .price-features { margin-top: var(--space-4); }   /* what the pilot includes, ticked like a tier card */
.pilot-band p { font-size: var(--fs-sm); color: rgb(var(--sw-muted)); }
.pilot-side { display: flex; flex-direction: column; align-items: flex-start; gap: var(--space-3); }
@media (min-width: 820px) { .pilot-side { align-items: flex-end; text-align: right; } }
.pilot-band .pilot-price { font-weight: 800; font-variant-numeric: tabular-nums lining-nums; letter-spacing: -0.02em; font-size: var(--fs-lg); color: rgb(var(--sw-accent-700)); white-space: nowrap; }
.pilot-band .pilot-term { font-size: var(--fs-sm); font-weight: 400; color: rgb(var(--sw-muted)); }
.pilot-band .pilot-credit { color: rgb(var(--sw-ink)); }

/* --- ROI calculator -------------------------------------------------------- */
.calc {
  display: grid;
  grid-template-columns: 1fr;
  gap: 0;
  border: 1px solid rgb(var(--sw-hairline));
  border-radius: var(--radius-xl);
  overflow: hidden;
  box-shadow: var(--shadow-md);
  --thumb: 24px;   /* slider thumb: the WCAG target minimum; the tick labels inset by half of it */
}
@media (min-width: 900px) { .calc { grid-template-columns: 0.95fr 1.05fr; } }

.calc-input { padding: clamp(1.75rem, 4vw, 2.75rem); background: rgb(var(--sw-surface)); }
.calc-input label { display: block; font-weight: 700; font-size: var(--fs-sm); margin-bottom: var(--space-2); }
/* The two fields are boxed like every field on the site (a 1px edge in Slate Muted at 70%, about
   3.6:1 on white, full Slate Muted on hover; 6px radius; white ground; indigo focus), the mono
   figure and its $ and M inside the box, so they read as editable.
   The box is the field: pricing.js focuses the input on a press anywhere in it. Shipped inert
   (readonly) until the script runs, the box shows no edge, so it doesn't look live. */
.calc-revenue {
  display: flex;
  width: fit-content;
  align-items: baseline;
  gap: 0.1ch;
  padding: 0.3rem 0.85rem 0.35rem;
  margin-bottom: var(--space-2);
  border: 1px solid rgb(var(--sw-muted) / 0.7);
  border-radius: var(--radius-sm);
  background: rgb(var(--sw-surface));
  font-family: var(--font-mono);
  cursor: text;
  transition: border-color var(--dur-fast) var(--ease-out-expo);
}
.calc-revenue:hover { border-color: rgb(var(--sw-muted)); }
.calc-revenue:focus-within { outline: 2px solid rgb(var(--sw-accent)); outline-offset: 1px; border-color: rgb(var(--sw-accent)); }
.calc-revenue:has(input[readonly]) { border-color: transparent; cursor: default; }
.calc-revenue .cur { font-size: clamp(1.4rem, 1.1rem + 1vw, 1.9rem); color: rgb(var(--sw-muted)); }
.calc-revenue input {
  border: none;
  background: transparent;
  font-family: var(--font-mono);
  font-weight: 600;
  font-size: clamp(1.75rem, 1.3rem + 1.6vw, 2.5rem);
  letter-spacing: -0.02em;
  color: rgb(var(--sw-ink));
  /* wide enough for "250.0" (the budget max) — 3.2ch clipped 4-char values like 25.8;
     where field-sizing is supported the box tracks the typed value exactly, so "$" and
     "M" hug the number the way the original narrow box intended */
  width: 5.2ch;
  text-align: center;
  padding: 0;
  caret-color: rgb(var(--sw-accent));
  -moz-appearance: textfield;
}
@supports (field-sizing: content) {
  .calc-revenue input { field-sizing: content; width: auto; min-width: 2.2ch; }
}
.calc-revenue input::-webkit-outer-spin-button,
.calc-revenue input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.calc-revenue input:focus { outline: none; }   /* the box draws the focus ring */
.calc-unit { font-size: clamp(1.4rem, 1.1rem + 1vw, 1.9rem); color: rgb(var(--sw-muted)); font-family: var(--font-mono); }

/* The slider is drawn from the palette (not the browser's default) so its thumb has a known
   width (--thumb): the tick labels sit on an inner track inset by the thumb's radius, so a
   tick at value v lines up with the thumb's centre at v. --fill is set from tickLeft() in
   pricing.js. */
.calc-slider {
  -webkit-appearance: none;
  appearance: none;
  display: block;
  width: 100%;
  height: 36px;
  margin: var(--space-2) 0 0;
  background: transparent;
  cursor: pointer;
}
.calc-slider::-webkit-slider-runnable-track {
  height: 4px;
  border-radius: 2px;
  background: linear-gradient(to right, rgb(var(--sw-accent)) 0 var(--fill, 0%), rgb(var(--sw-grid-strong)) var(--fill, 0%) 100%);
}
.calc-slider::-moz-range-track { height: 4px; border-radius: 2px; background: rgb(var(--sw-grid-strong)); }
.calc-slider::-moz-range-progress { height: 4px; border-radius: 2px; background: rgb(var(--sw-accent)); }
.calc-slider::-webkit-slider-thumb {
  -webkit-appearance: none;
  appearance: none;
  box-sizing: border-box;
  width: var(--thumb);
  height: var(--thumb);
  margin-top: calc((4px - var(--thumb)) / 2);
  border-radius: 50%;
  border: 2px solid rgb(var(--sw-accent));
  background: rgb(var(--sw-surface));
  box-shadow: var(--shadow-sm);
}
.calc-slider::-moz-range-thumb {
  box-sizing: border-box;
  width: var(--thumb);
  height: var(--thumb);
  border-radius: 50%;
  border: 2px solid rgb(var(--sw-accent));
  background: rgb(var(--sw-surface));
  box-shadow: var(--shadow-sm);
}
.calc-slider:disabled { cursor: default; }   /* shipped inert until pricing.js runs */
.calc-slider:focus-visible { outline: none; }
.calc-slider:focus-visible::-webkit-slider-thumb { outline: 2px solid rgb(var(--sw-accent)); outline-offset: 2px; }
.calc-slider:focus-visible::-moz-range-thumb { outline: 2px solid rgb(var(--sw-accent)); outline-offset: 2px; }

.calc-ticks { position: relative; height: 1.75rem; margin: var(--space-1) calc(var(--thumb) / 2) 0; font-family: var(--font-mono); font-size: var(--fs-xs); color: rgb(var(--sw-muted)); }
.calc-tick { position: absolute; top: 0; padding-top: 7px; transform: translateX(-50%); white-space: nowrap; }
.calc-tick::before { content: ""; position: absolute; top: 0; left: 50%; width: 1px; height: 5px; background: rgb(var(--sw-grid-strong)); }

/* Forced colours: the slider's track, fill and tick marks are painted with backgrounds,
   which a contrast theme drops; redraw them in system colours. */
@media (forced-colors: active) {
  .calc-slider, .calc-tick::before { forced-color-adjust: none; }
  .calc-slider::-webkit-slider-runnable-track { background: linear-gradient(to right, Highlight 0 var(--fill, 0%), GrayText var(--fill, 0%) 100%); }
  .calc-slider::-moz-range-track { background: GrayText; }
  .calc-slider::-moz-range-progress { background: Highlight; }
  .calc-slider::-webkit-slider-thumb { background: Canvas; border-color: CanvasText; }
  .calc-slider::-moz-range-thumb { background: Canvas; border-color: CanvasText; }
  .calc-slider:focus-visible::-webkit-slider-thumb { outline-color: Highlight; }
  .calc-slider:focus-visible::-moz-range-thumb { outline-color: Highlight; }
  .calc-tick::before { background: CanvasText; }
}

.calc-field-gap { margin-top: var(--space-6); }
.calc-implied { margin-top: var(--space-2); text-wrap: wrap; }   /* not pretty: it split "15–25%" to keep Reset company */
.calc-warn-icon { display: none; width: 16px; height: 16px; margin-right: 0.35em; vertical-align: -3px; }
.calc-implied[data-warn] { color: rgb(var(--sw-tone-warn-800)); font-weight: 600; }
.calc-implied[data-warn] .calc-warn-icon { display: inline-block; }
.calc-implied button {
  background: none; border: none; padding: 0;
  color: rgb(var(--sw-accent-700)); font-weight: 700; font-size: inherit; font-family: inherit;
  cursor: pointer; text-decoration: underline; text-underline-offset: 0.2em;
}
.calc-implied button:hover { color: rgb(var(--sw-accent)); }
@media (pointer: coarse) { .calc-implied button { display: inline-block; padding-block: 0.75rem; } }   /* 44px target on touch */

.calc-output {
  padding: clamp(1.75rem, 4vw, 2.75rem);
  background: linear-gradient(155deg, rgb(var(--sw-accent-950)), rgb(var(--sw-accent-900)) 65%, rgb(var(--sw-accent-925)));
  color: rgb(var(--sw-surface));
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
}
/* The verifiable number leads: what Slotwise costs as a share of the spend it manages. */
.calc-share-lead, .calc-share-tail { font-size: var(--fs-sm); color: rgb(var(--sw-accent-200)); }
.calc-share { margin: var(--space-1) 0; font-family: var(--font-mono); font-weight: 600; font-size: clamp(2.5rem, 1.8rem + 3vw, 3.75rem); letter-spacing: -0.03em; line-height: 1.05; color: rgb(var(--sw-surface)); }
.calc-share[data-word] { font-family: var(--font-sans); font-weight: 800; }
.calc-line { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 0.15rem var(--space-4); padding-top: var(--space-3); border-top: 1px solid rgb(255 255 255 / 0.12); }
.calc-line .calc-label { font-size: var(--fs-sm); color: rgb(var(--sw-accent-200)); }
.calc-line .calc-val { font-family: var(--font-mono); font-weight: 600; font-size: var(--fs-base); text-align: right; white-space: nowrap; }
/* why the tier was picked (its trade-budget band) and its seats, on a line of its own under it */
.calc-line .calc-why { flex-basis: 100%; color: rgb(var(--sw-accent-200)); text-wrap: pretty; }
.calc-note { color: rgb(var(--sw-accent-200)); }
.calc-cta { margin-top: auto; padding-top: var(--space-2); }

/* --- scroll regions (compare plans, worked table): a labelled, focusable box that
   scrolls sideways on narrow screens. position: relative makes it the containing block
   of the cells' visually-hidden labels (position: absolute); without it they escape the
   clipping and widen the whole page on phones. ------------------------------- */
.table-scroll {
  position: relative;
  overflow-x: auto;
  border: 1px solid rgb(var(--sw-hairline));
  border-radius: var(--radius-lg);
  background: rgb(var(--sw-surface));
  scrollbar-width: thin;
  scrollbar-color: rgb(var(--sw-grid-strong)) transparent;
}
.table-scroll:focus-visible { outline: 2px solid rgb(var(--sw-accent)); outline-offset: 2px; }

/* --- worked value table ---------------------------------------------------- */
.value-table { width: 100%; border-collapse: collapse; font-size: var(--fs-sm); min-width: 680px; }
.value-table th, .value-table td { text-align: left; padding: var(--space-4) var(--space-5); border-bottom: 1px solid rgb(var(--sw-hairline)); }
.value-table thead th { background: rgb(var(--sw-ink)); color: rgb(var(--sw-canvas)); font-size: var(--fs-xs); line-height: 1.35; letter-spacing: 0.01em; font-weight: 700; white-space: nowrap; vertical-align: bottom; }
.value-table tbody th { font-weight: 600; white-space: nowrap; }
.value-table tbody tr:last-child > * { border-bottom: none; }
.value-table .num { text-align: right; white-space: nowrap; }
.value-table td.num { font-family: var(--font-mono); font-feature-settings: "tnum" 1; }
.value-table td.mult { font-weight: 600; color: rgb(var(--sw-accent-700)); }
.value-table tbody tr:hover { background: rgb(var(--sw-grid) / 0.6); }
.value-caption { margin-top: var(--space-3); }
.value-caption + .value-caption { margin-top: var(--space-2); }
.price-grid + .value-caption { margin-top: var(--space-5); }

/* --- the value you can verify ---------------------------------------------- */
.commitment {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--space-5);
  align-items: center;
  border-radius: var(--radius-lg);
  border: 1px solid rgb(var(--sw-status-approved) / 0.35);
  background: rgb(var(--sw-tone-good) / 0.06);
  padding: clamp(1.75rem, 4vw, 2.5rem);
}
@media (min-width: 820px) { .commitment { grid-template-columns: auto 1fr; gap: var(--space-6); } }
.commitment-seal { width: clamp(2.75rem, 2.2rem + 2vw, 3.5rem); height: auto; color: rgb(var(--sw-tone-good-700)); }
.commitment h2 { font-size: var(--fs-lg); margin-bottom: var(--space-3); }
.commitment p { font-size: var(--fs-sm); color: rgb(var(--sw-muted)); }
.commitment .commitment-quote { color: rgb(var(--sw-ink)); font-weight: 600; }
.commitment .pillar-list { margin-top: var(--space-4); }
.commitment .commitment-source { margin-top: var(--space-4); }

/* --- FAQ (native disclosure) ---------------------------------------------- */
/* Full container width, so no dead third at mid widths; the answers keep their own measure. */
.faq { display: flex; flex-direction: column; gap: var(--space-3); }
.faq details {
  border: 1px solid rgb(var(--sw-hairline));
  border-radius: var(--radius-md);
  background: rgb(var(--sw-surface));
  overflow: hidden;
}
.faq summary {
  cursor: pointer;
  list-style: none;
  padding: var(--space-4) var(--space-5);
  font-weight: 700;
  font-size: var(--fs-base);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
}
.faq summary::-webkit-details-marker { display: none; }
/* the open/close mark: a <use> of the page's i-plus symbol, stroked in currentColor so forced
   colours repaint it; it turns into a cross when the answer is open */
.faq-mark {
  flex: none;
  width: 1rem; height: 1rem;
  color: rgb(var(--sw-accent));
  fill: none; stroke: currentColor; stroke-width: 1.75; stroke-linecap: round;
  transition: transform var(--dur-fast) var(--ease-out-expo);
}
.faq details[open] .faq-mark { transform: rotate(45deg); }
.faq details[open] summary { border-bottom: 1px solid rgb(var(--sw-hairline)); }
.faq .faq-body { padding: var(--space-4) var(--space-5) var(--space-5); }
.faq .faq-body p { font-size: var(--fs-sm); color: rgb(var(--sw-muted)); } /* about 75 characters of Archivo */
.faq .faq-body p + p { margin-top: var(--space-3); }

/* ==========================================================================
   Mid-band density (900-1279px CSS - common on scaled Windows displays).
   The design was tuned at 1440+; between the 860 mobile breakpoint and ~1280
   the left-capped measures + full-size section padding read as dead space.
   Tighten rhythm and let text run a little wider; identity unchanged at 1280+.
   ========================================================================== */
@media (min-width: 900px) and (max-width: 1279.98px) {
  .section { padding-block: clamp(3rem, 5.5vw, 4.5rem); }
  .section-head { margin-bottom: clamp(1.75rem, 3vw, 2.5rem); }
}

/* ==========================================================================
   Screenshot figure: the real screen on a quiet ground, a hairline edge, and a
   small-print caption saying what it is. Home, TPM and design partner pages.
   ========================================================================== */
.shot { margin: 0; min-width: 0; }
.shot img {
  width: 100%; height: auto; display: block;
  border: 1px solid rgb(var(--sw-hairline));
  border-radius: var(--radius-md);
  background: rgb(var(--sw-canvas));
  box-shadow: var(--shadow-sm);
}
/* 60ch, not 75: ch is the width of "0", wider than Archivo's average glyph, so 60ch holds about
   70-80 characters of 13px small print (75ch held up to 101). */
.shot-caption,
.board-demo-caption { margin-top: var(--space-3); }
/* the one place ROI and margin impact are defined on the page, collapsed under the demo */
.roi-details { margin-top: var(--space-2); }
.roi-details summary { cursor: pointer; color: rgb(var(--sw-ink)); }
.roi-details p { margin-top: var(--space-2); }
/* Phones get a crop of some screens (<picture> sources, *-phone.webp): where the crop leaves out
   what the full caption points at, the caption comes in both versions. */
@media (max-width: 559.98px) { .cap-wide { display: none; } }
@media (min-width: 560px) { .cap-phone { display: none; } }

/* ==========================================================================
   Product visual frame: every product visual — a still from the tour film,
   cropped to the region that makes the section's point — sits in a browser
   window: three dots and a short label pill naming the view, never a fake
   URL. One block, used on every page; the frame's label pill is the only
   caption.
   ========================================================================== */
.shot-frame {
  width: 100%;
  max-width: 560px;
  border-radius: var(--radius-lg);
  overflow: hidden;
  background: rgb(var(--sw-surface));
  border: 1px solid rgb(var(--sw-hairline));
  box-shadow: var(--shadow-lg);
}
.shot-frame--wide { max-width: 820px; }
.shot-frame--center { margin-inline: auto; }
.shot-chrome {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  padding: 0.6rem 0.85rem;
  background: rgb(var(--sw-grid));
  border-bottom: 1px solid rgb(var(--sw-hairline));
}
.shot-dots { display: flex; gap: 6px; flex: none; }
.shot-dots span { width: 9px; height: 9px; border-radius: 50%; background: rgb(var(--sw-grid-strong)); }
.shot-label {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: rgb(var(--sw-muted));
  background: rgb(var(--sw-surface));
  border: 1px solid rgb(var(--sw-hairline));
  border-radius: var(--radius-full);
  padding: 0.25rem 0.75rem;
  white-space: nowrap;
}
.shot-frame img { width: 100%; height: auto; display: block; }

/* ==========================================================================
   Board demo: the hero and concept boards (assets/js/board-demo.js).
   Drawn with the product's own board geometry (apps/web/src/engine): 24px bars
   in 30px lanes, a 3px status rail, the bar colour at 15% fill / 35% edge,
   700-weight tone chips, the lock-hatch idiom, 1px week gridlines.
   ========================================================================== */
/* Reserved height. Until the script mounts, a ::before placeholder holds the demo's
   height; once mounted the demo keeps exactly that height at every position, so
   neither the swap nor a drag moves the page. --bd-h is the demo's height at its
   tallest position (the most notes), per config, in the container bands the demo
   lays itself out by; scripts/landing/board-demo.browser.mjs checks every stop at
   every width. Without JS the fallback shows at its own size. */
.board-demo { container: bd / inline-size; display: flex; flex-direction: column; }
.board-demo:not([data-mounted], [data-failed])::before, .board-demo-fallback, .bd {
  border: 1px solid rgb(var(--sw-hairline)); border-radius: var(--radius-md); background: rgb(var(--sw-canvas));
}
.board-demo:not([data-mounted], [data-failed])::before { content: ""; height: var(--bd-h); }
/* Phones (< 560px): formulas sit under their lines and the notes wrap more as the demo
   narrows, so the bands step up; each threshold sits ~8px wider than measured (web fonts
   loaded or not) so other engines' text metrics stay inside the reservation. */
.board-demo[data-board-demo="tpm"]::before, .bd[data-demo="tpm"] { --bd-h: 654px; }
.board-demo[data-board-demo="roster"]::before, .bd[data-demo="roster"] { --bd-h: 741px; }
.board-demo[data-board-demo="service"]::before, .bd[data-demo="service"] { --bd-h: 523px; }
@container bd (width < 442px) { .board-demo[data-board-demo="tpm"]::before, .bd[data-demo="tpm"] { --bd-h: 670px; } }
@container bd (width < 394px) { .board-demo[data-board-demo="tpm"]::before, .bd[data-demo="tpm"] { --bd-h: 686px; } }
@container bd (width < 312px) { .board-demo[data-board-demo="tpm"]::before, .bd[data-demo="tpm"] { --bd-h: 702px; } }
@container bd (width >= 560px) { .board-demo[data-board-demo="tpm"]::before, .bd[data-demo="tpm"] { --bd-h: 550px; } } /* one ledger line per readout line */
@container bd (width >= 960px) { .board-demo[data-board-demo="tpm"]::before, .bd[data-demo="tpm"] { --bd-h: 394px; } } /* readout beside the board */

/* roster: the readout grew to 5 lines plus the revenue-and-labour strip under the staff rows */
@container bd (width < 352px) { .board-demo[data-board-demo="roster"]::before, .bd[data-demo="roster"] { --bd-h: 757px; } }
@container bd (width < 345px) { .board-demo[data-board-demo="roster"]::before, .bd[data-demo="roster"] { --bd-h: 773px; } }
@container bd (width < 290px) { .board-demo[data-board-demo="roster"]::before, .bd[data-demo="roster"] { --bd-h: 789px; } }
@container bd (width >= 477px) { .board-demo[data-board-demo="roster"]::before, .bd[data-demo="roster"] { --bd-h: 725px; } }
@container bd (width >= 560px) { .board-demo[data-board-demo="roster"]::before, .bd[data-demo="roster"] { --bd-h: 620px; } }
@container bd (width >= 579px) { .board-demo[data-board-demo="roster"]::before, .bd[data-demo="roster"] { --bd-h: 605px; } }
@container bd (width >= 960px) { .board-demo[data-board-demo="roster"]::before, .bd[data-demo="roster"] { --bd-h: 457px; } }

/* service (round 4): a 4th crew row, the Unassigned row's own queued jobs, and the day-summary
   line grew the reservation; bands re-measured with board-demo.browser.mjs --report. */
@container bd (width < 960px) { .board-demo[data-board-demo="service"]::before, .bd[data-demo="service"] { --bd-h: 758px; } }
@container bd (width < 560px) { .board-demo[data-board-demo="service"]::before, .bd[data-demo="service"] { --bd-h: 858px; } }
@container bd (width < 442px) { .board-demo[data-board-demo="service"]::before, .bd[data-demo="service"] { --bd-h: 874px; } }
@container bd (width < 361px) { .board-demo[data-board-demo="service"]::before, .bd[data-demo="service"] { --bd-h: 889px; } }
@container bd (width < 338px) { .board-demo[data-board-demo="service"]::before, .bd[data-demo="service"] { --bd-h: 905px; } }
@container bd (width < 298px) { .board-demo[data-board-demo="service"]::before, .bd[data-demo="service"] { --bd-h: 921px; } }
@container bd (width < 297px) { .board-demo[data-board-demo="service"]::before, .bd[data-demo="service"] { --bd-h: 937px; } }
@container bd (width < 280px) { .board-demo[data-board-demo="service"]::before, .bd[data-demo="service"] { --bd-h: 940px; } }
@media (scripting: none) { /* the fallback shows at its own size; "interactive demo" would not be true */
  .board-demo:not([data-mounted], [data-failed])::before { content: none; }
  .board-demo + .board-demo-caption { display: none; }
}
@media (scripting: enabled) { /* until the demo mounts only the placeholder shows, so fallback content placed
  straight in the mount (not in <noscript>) never stacks under it; a mount that fails shows it again */
  .board-demo:not([data-mounted], [data-failed]) > :not(noscript) { display: none; }
}
.board-demo-fallback { flex: 1; display: grid; place-items: center; padding: var(--space-6); font-size: var(--fs-sm); color: rgb(var(--sw-muted)); text-align: center; }

.bd {
  --bd-lab: 9.25rem;       /* row-label column: fits "Choc Cereal 500g · LY" */
  --bd-col: 2.45rem;       /* narrowest column before the board scrolls sideways: 10 weeks fit from 560px */
  --bd-good: var(--sw-tone-good-700); /* the product's 700-weight tone chips: white text stays AA on them */
  --bd-warn: var(--sw-tone-warn-700);
  --bd-bad: var(--sw-tone-bad-700);
  flex: 1; display: flex; flex-direction: column; min-height: var(--bd-h);
  background: rgb(var(--sw-surface));
  box-shadow: var(--shadow-md);
  font-size: 12px; line-height: 16px;
  overflow: hidden;
}
.bd[data-demo="roster"], .bd[data-demo="service"] { --bd-lab: 7.5rem; } /* short names, one-day bars */
.bd[data-dragging] { cursor: grabbing; user-select: none; -webkit-user-select: none; }
.bd-i { flex: none; width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }

/* toolbar */
.bd-top {
  display: flex; align-items: center; gap: var(--space-2);
  min-height: 40px; padding: 0 var(--space-3);
  border-bottom: 1px solid rgb(var(--sw-hairline));
  background: rgb(var(--sw-canvas));
  white-space: nowrap;
}
.bd-name { flex: none; font-size: 13px; font-weight: 700; }
.bd-range { flex: none; font-family: var(--font-mono); font-size: 11px; color: rgb(var(--sw-muted)); }
.bd-hint {
  margin-left: auto; min-width: 0; display: inline-flex; align-items: center; gap: 6px;
  padding: 2px 8px 2px 6px; border-radius: var(--radius-full);
  background: rgb(var(--sw-accent-light)); color: rgb(var(--sw-accent-700));
  font-weight: 600;
}
.bd-hint > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; } /* a long hint ends in an ellipsis */

/* the board */
.bd-scroll { overflow-x: auto; overscroll-behavior-x: contain; scrollbar-width: thin; }
/* 6px gutters either side of the timeline keep an edge bar's ring and focus outline unclipped */
.bd-grid { min-width: calc(var(--bd-lab) + var(--n) * var(--bd-col) + 12px); }
.bd-r { display: flex; height: calc(var(--lanes, 1) * 30px + 8px); border-bottom: 1px solid rgb(var(--sw-grid)); }
.bd-r:last-child { border-bottom: 0; }
.bd-lab {
  position: sticky; left: 0; z-index: 3;
  flex: none; width: var(--bd-lab);
  display: flex; flex-direction: column; justify-content: center;
  padding: 0 10px;
  background: rgb(var(--sw-surface));
  border-right: 1px solid rgb(var(--sw-hairline));
  box-shadow: 2px 0 4px rgb(var(--sw-ink) / 0.05);
}
.bd-lab b, .bd-lab small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bd-lab b { font-weight: 500; }
.bd-lab small { font-family: var(--font-mono); font-size: 11px; line-height: 14px; color: rgb(var(--sw-muted)); }
/* a technician's rate line (service demo only): rarely fits the rail's width on one line, so it wraps
   there instead of ellipsis-losing the weekend rate */
.bd-lab small.bd-rate { font-size: 10px; line-height: 12px; white-space: normal; overflow: visible; text-overflow: clip; }
.bd-trk, .bd-axis { margin-inline: 6px; }
.bd-trk {
  position: relative; flex: 1 1 0; min-width: 0;
  background-image: linear-gradient(to right, rgb(var(--sw-hairline) / 0.7) 1px, transparent 1px);
  background-size: calc(100% / var(--n)) 100%;
}
/* reference rows: the product's receded tint (the sticky label needs it opaque) */
.bd-r[data-ref] { background: rgb(var(--sw-grid-strong) / 0.5); }
.bd-r[data-ref] .bd-lab { background: linear-gradient(rgb(var(--sw-grid-strong) / 0.6), rgb(var(--sw-grid-strong) / 0.6)) rgb(var(--sw-surface)); }

/* header: captions band + column keys, like the product's time axis */
.bd-hd { height: auto; border-bottom-color: rgb(var(--sw-hairline)); }
.bd-hd .bd-lab { justify-content: flex-end; padding-bottom: 9px; font-size: 13px; font-weight: 600; }
.bd-axis { flex: 1 1 0; min-width: 0; display: grid; grid-template-columns: repeat(var(--n), minmax(0, 1fr)); grid-template-rows: 20px 34px; }
.bd-cap { grid-row: 1; align-self: end; padding: 0 6px 2px; border-left: 1px solid rgb(var(--sw-grid)); font-size: 11px; color: rgb(var(--sw-muted)); white-space: nowrap; }
.bd-cap:is([data-kind="tag"], [data-kind="mark"]) { /* a window or dated change, captioned like the product's lock chip */
  align-self: center; justify-self: start; z-index: 1;
  display: inline-flex; align-items: center; gap: 3px;
  height: 17px; margin-top: 2px; padding: 0 6px; border: 0; border-radius: 3px;
  background: rgb(var(--sw-grid)); font-size: 10.5px; font-weight: 600;
}
.bd-cap[data-kind="mark"] { background: rgb(var(--sw-tone-warn) / 0.16); color: rgb(var(--sw-ink)); }
.bd-cap .bd-i { width: 11px; height: 11px; stroke-width: 2; color: rgb(var(--bd-warn)); }
.bd-key {
  grid-row: 2; display: flex; flex-direction: column; justify-content: center;
  padding: 0 6px; border-left: 1px solid rgb(var(--sw-grid));
  font-size: 11px; line-height: 14px; color: rgb(var(--sw-muted));
  white-space: nowrap; overflow: hidden;
}
.bd-key b { font-family: var(--font-mono); font-size: 11.5px; line-height: 16px; font-weight: 600; color: rgb(var(--sw-ink)); }

/* bars: product anatomy [rail][label][pill][clash glyph][tone chip]; the rail shows the status */
.bd-ev {
  --r: rgb(var(--sw-status-draft));
  position: absolute; top: calc(7px + var(--lane, 0) * 30px); height: 24px;
  display: flex; align-items: center; gap: 4px;
  margin: 0; padding: 0 3px 0 9px;
  border: 1px solid color-mix(in srgb, var(--c) 35%, transparent);
  border-radius: 5px;
  /* the 15% tint laid on white: the dated marker and gridlines never show through a bar */
  background: linear-gradient(color-mix(in srgb, var(--c) 15%, transparent), color-mix(in srgb, var(--c) 15%, transparent)) rgb(var(--sw-surface));
  box-shadow: inset 3px 0 0 var(--r), var(--ring, 0 0 #0000), var(--lift, 0 1px 2px rgb(var(--sw-ink) / 0.1));
  font: 500 12px/16px var(--font-sans); color: rgb(var(--sw-ink));
  text-align: left; white-space: nowrap;
}
.bd-ev[data-status="planned"] { --r: rgb(var(--sw-status-planned)); }
.bd-ev[data-status="approved"] { --r: rgb(var(--sw-status-approved)); }
.bd-ev[data-status="draft"] { border-style: dashed; }
.bd-ev-t { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.bd-pill {
  flex: none; display: inline-flex; align-items: center; height: 14px; padding: 0 5px;
  border: 1px solid rgb(var(--sw-hairline)); border-radius: var(--radius-full);
  background: rgb(var(--sw-surface));
  font: 500 10px/1 var(--font-mono); color: rgb(var(--sw-muted));
}
.bd-chip {
  flex: none; margin-left: auto; display: inline-flex; align-items: center;
  height: 15px; padding: 0 4px; border-radius: 3px;
  font: 500 11px/1 var(--font-mono); background: rgb(var(--bd-good)); color: rgb(var(--sw-surface));
}
.bd-chip[data-tone="warn"] { background: rgb(var(--bd-warn)); }
.bd-chip[data-tone="bad"] { background: rgb(var(--bd-bad)); }
.bd-chip[data-tone="none"] { background: rgb(var(--sw-grid-strong)); color: rgb(var(--sw-muted)); }
.bd-ev > .bd-i { display: none; width: 13px; height: 13px; color: rgb(var(--sw-tone-bad)); stroke-width: 1.8; }
.bd-ev[data-clash] { border: 1.5px solid rgb(var(--sw-tone-bad)); --lift: 0 0 0 1px rgb(var(--sw-tone-bad) / 0.35); }
.bd-ev[data-clash]:not([data-fit~="glyph"]) > .bd-i { display: block; }
.bd-ev[data-fit~="pill"] .bd-pill, .bd-ev[data-fit~="price"] .bd-chip-price, .bd-ev[data-fit~="chip"] .bd-chip, .bd-chip:empty { display: none; }
.bd-r[data-ref] .bd-ev {
  background: color-mix(in srgb, var(--c) 10%, transparent);
  border-color: color-mix(in srgb, var(--c) 25%, transparent);
  box-shadow: inset 3px 0 0 color-mix(in srgb, var(--r) 45%, transparent);
  color: rgb(var(--sw-muted));
}

/* strip row: a compact revenue/labour summary per day, under the staff rows (roster's cfg.strip) */
.bd-r.bd-strip { height: auto; padding-block: 7px; background: rgb(var(--sw-canvas)); }
.bd-strip-trk { display: grid; grid-template-columns: repeat(var(--n), minmax(0, 1fr)); }
.bd-strip-cell {
  display: flex; flex-direction: column; justify-content: center; gap: 2px;
  padding: 0 6px; border-left: 1px solid rgb(var(--sw-grid));
  font-size: 11px; line-height: 14px;
}
.bd-strip-cell b { font-family: var(--font-mono); font-size: 12px; font-weight: 600; color: rgb(var(--sw-ink)); }
.bd-strip-cell small { color: rgb(var(--sw-muted)); }
.bd-strip-cell .bd-chip { align-self: flex-start; margin-top: 1px; }

/* the one bar that moves (a slider): highlighted like a selected bar in the product */
.bd-drag { z-index: 2; cursor: grab; touch-action: none; user-select: none; -webkit-user-select: none; --ring: 0 0 0 2px rgb(var(--sw-accent)); }
.bd-drag[data-clash] { --ring: 0 0 0 2px rgb(var(--sw-tone-bad)); } /* the clash reads on the moving bar itself */
.bd-drag::after { content: ""; position: absolute; inset: -12px -4px; } /* touch target: 22px padding box + 24 = 46px (45 when outlined for a clash) */
.bd-drag:hover, .bd[data-dragging] .bd-drag { --lift: 0 8px 24px rgb(var(--sw-ink) / 0.18); }
.bd[data-dragging] .bd-drag { cursor: grabbing; }
.bd-drag:focus-visible { outline: 2px solid rgb(var(--sw-accent)); outline-offset: 3px; }
@media (prefers-reduced-motion: no-preference) {
  .bd-drag { transition: left 160ms var(--ease-out-expo), top 160ms var(--ease-out-expo), box-shadow var(--dur-fast) var(--ease-out-expo); }
}

/* hatched windows (shutdown, leave) and dated markers */
.bd-hatch {
  position: absolute; inset-block: 0;
  display: grid; place-items: center;
  background: repeating-linear-gradient(45deg, transparent 0 4px, rgb(var(--sw-muted) / 0.13) 4px 8px);
  font-size: 10.5px; font-weight: 600; color: rgb(var(--sw-muted));
}
.bd-mark { position: absolute; inset-block: 0; border-left: 1px dashed rgb(var(--bd-warn)); }

/* readout: titled like the product's drag HUD, then the working */
.bd-out { flex: 1; display: flex; flex-direction: column; padding: var(--space-3) var(--space-4) var(--space-4); border-top: 1px solid rgb(var(--sw-hairline)); }
.bd-out-h { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2) var(--space-3); min-height: 28px; }
.bd-out-t { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; font-weight: 700; }
.bd-nav { margin-left: auto; display: inline-flex; align-items: center; gap: var(--space-1); }
.bd-period {
  padding: 2px 8px; border-radius: var(--radius-full);
  background: rgb(var(--sw-accent-light)); color: rgb(var(--sw-accent-700));
  font: 600 12px/16px var(--font-mono); white-space: nowrap;
}
.bd-nb { /* always there for pointer-free use; quiet beside the period, 44px on phones (below) */
  display: inline-grid; place-items: center; width: 28px; height: 28px; padding: 0;
  border: 0; border-radius: var(--radius-sm); background: transparent; color: rgb(var(--sw-muted)); cursor: pointer;
}
.bd-nb:hover { background: rgb(var(--sw-grid)); color: rgb(var(--sw-ink)); }
.bd-nb[aria-disabled="true"] { background: transparent; color: rgb(var(--sw-faint)); cursor: default; }
.bd-lines { margin-top: var(--space-2); }
.bd-line { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: baseline; column-gap: var(--space-3); padding: 6px 0; border-top: 1px solid rgb(var(--sw-grid)); }
.bd-line dt { font-size: 13px; color: rgb(var(--sw-muted)); white-space: nowrap; } /* never wrap around a long value (e.g. "Today"'s summary) */
.bd-line dd { margin: 0; }
.bd-val { font: 600 13px/18px var(--font-mono); font-variant-numeric: tabular-nums; text-align: right; }
.bd-val .bd-chip { height: 18px; padding: 0 6px; font-size: 12px; font-weight: 600; }
.bd-f { grid-column: 1 / -1; font-family: var(--font-mono); font-size: 11.5px; line-height: 16px; color: rgb(var(--sw-muted)); }
.bd-notes { display: grid; align-content: start; gap: 4px; min-height: 36px; margin-top: var(--space-2); }
.bd-note { display: flex; align-items: flex-start; gap: 6px; font-size: 12px; line-height: 16px; }
.bd-note .bd-i { margin-top: 1px; }
.bd-note[data-kind="bad"] .bd-i { color: rgb(var(--sw-tone-bad)); }
.bd-note[data-kind="warn"] .bd-i { color: rgb(var(--bd-warn)); }
.bd-note[data-kind="good"] .bd-i { color: rgb(var(--sw-status-approved)); }
.bd-note[data-kind="hint"] { color: rgb(var(--sw-muted)); }

@container bd (560px <= width < 960px) { /* one ledger line each: label, value, working */
  .bd-line { grid-template-columns: 8rem 6rem minmax(0, 1fr); }
  .bd-f { grid-column: auto; font-size: 11px; }
}
@container bd (width >= 960px) { /* the readout beside the board: title, then the period and nudges under it */
  .bd { display: grid; grid-template-columns: minmax(0, 1fr) 19rem; grid-template-rows: auto 1fr; }
  .bd-top { grid-column: 1 / -1; }
  .bd-out { border-top: 0; border-left: 1px solid rgb(var(--sw-hairline)); }
  .bd-out-h { flex-direction: column; align-items: flex-start; }
  .bd-nav { margin-left: -6px; }
}
@container bd (width < 560px) { /* phones: the board scrolls sideways and the nudges become 44px buttons */
  .bd { --bd-lab: 7.5rem; --bd-col: 3.25rem; }
  .bd[data-demo="roster"], .bd[data-demo="service"] { --bd-lab: 6.5rem; --bd-col: 5.5rem; }
  .bd-range { display: none; }
  .bd-nav { margin-left: 0; width: 100%; justify-content: space-between; }
  .bd-nb { width: 44px; height: 44px; border: 1px solid rgb(var(--sw-hairline)); border-radius: var(--radius-md); background: rgb(var(--sw-surface)); color: rgb(var(--sw-ink)); }
  .bd-nb .bd-i { width: 18px; height: 18px; }
}
@media (forced-colors: active) { /* forced colours drop shadows and gradients: redraw what they carried */
  .bd-ev, .bd-ev[data-clash] { border-left-width: 4px; }   /* the status rail */
  .bd-ev.bd-drag { border: 2px solid Highlight; }          /* the selection ring */
  .bd-ev[data-clash] > .bd-i { display: block; }           /* every clash shows its icon, the moving bar's too */
  .bd-hatch { border-inline: 1px dashed GrayText; }        /* the hatch */
  .bd-chip { forced-color-adjust: none; }                  /* tone chips keep their own AA colours */
  .bd-nb[aria-disabled="true"] { color: GrayText; }
}

/* ==========================================================================
   Pricing: hero and plans bar — the H1, the billing toggle, compare plans
   ========================================================================== */

/* --- hero: the H1 on the sub-page scale (see .page-hero), a sentence per line - */
.pricing-hero h1 { margin-bottom: var(--space-5); }
.pricing-hero h1 > span { display: block; }   /* one balanced block per sentence: no orphaned word on phones */

/* --- the price ladder: the four prices in the hero's right column from 960px (under the lead
   below that), so the first screen shows what the H1 promises, a price even on a 1280x600
   laptop. A ruled list like the site's other lists, not another card grid: tier left, price
   right in the display face with tabular figures. Its prices swap with the billing toggle like
   the cards' (the .price-swap rules below), with no layout shift. ----------------------------- */
.price-ladder { margin-top: var(--space-6); max-width: 26rem; }
.price-ladder-cap.price-swap { display: grid; margin-bottom: var(--space-2); }
.price-ladder li {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: 0 var(--space-4);
  padding-block: var(--space-2);
  border-top: 1px solid rgb(var(--sw-grid-strong));
}
.price-ladder li:last-child { padding-bottom: 0; }
.ladder-tier { font-weight: 700; }
.ladder-price { font-size: var(--fs-lg); font-weight: 800; line-height: 1.2; letter-spacing: -0.02em; font-variant-numeric: tabular-nums lining-nums; white-space: nowrap; }
.ladder-from, .ladder-cadence { font-size: var(--fs-sm); font-weight: 400; letter-spacing: 0; color: rgb(var(--sw-muted)); }
.ladder-cadence { margin-left: 0.2ch; }
.ladder-price .price-swap { justify-items: end; }
/* Enterprise's note, on a line of its own under the figure (no room beside it in the 18rem column):
   "Tailored", and on Monthly "Tailored, annual only", as the Enterprise card says */
.price-ladder .ladder-note { flex-basis: 100%; justify-items: end; }
@media (min-width: 960px) {
  /* the ladder's column narrows toward 960 so "Value you can verify." keeps its one line */
  .pricing-hero { display: grid; grid-template-columns: minmax(0, 1fr) clamp(18rem, 30vw, 24rem); column-gap: clamp(3rem, 6vw, 6rem); }
  .pricing-hero > :not(.price-ladder) { grid-column: 1; }
  /* beside the H1 and lead, its last price level with the lead's last line. Enterprise's note
     hangs below the ladder, out of its flow, so the ladder is never taller than the H1 and lead
     (a taller ladder would stretch the hero's rows and move the lead and everything below). */
  .price-ladder { grid-column: 2; grid-row: 1 / span 2; align-self: end; margin-top: 0; }
  .price-ladder li:last-child { position: relative; }
  .price-ladder .ladder-note { position: absolute; top: 100%; right: 0; }
}

/* --- billing: two native radios drawn as a segmented control. CSS (:has) shows
   the chosen prices, so the toggle works with JS off; every price holds both
   values stacked in one grid cell, so switching never moves anything. -------- */
.billing-bar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3) var(--space-6);
  margin: var(--space-7) 0 var(--space-5);
}
.billing-toggle {
  position: relative;
  display: inline-flex;
  gap: 2px;
  padding: 3px;
  border: 1px solid rgb(var(--sw-hairline));
  border-radius: var(--radius-md);
  background: rgb(var(--sw-canvas));
}
.billing-toggle input { position: absolute; width: 1px; height: 1px; margin: 0; opacity: 0; pointer-events: none; }
.billing-toggle label {
  display: inline-flex;
  align-items: baseline;
  gap: 0.6em;
  min-height: 44px;
  padding: 0.7rem 1.1rem;
  border-radius: calc(var(--radius-md) - 3px);   /* concentric with the 3px-padded track */
  font-size: var(--fs-sm);
  font-weight: 700;
  line-height: 1.2;
  color: rgb(var(--sw-muted));
  cursor: pointer;
  transition: background-color var(--dur-fast) var(--ease-out-expo), color var(--dur-fast) var(--ease-out-expo), box-shadow var(--dur-fast) var(--ease-out-expo);
}
.billing-toggle label:hover { color: rgb(var(--sw-ink)); }
.billing-toggle input:checked + label {
  background: rgb(var(--sw-surface));
  color: rgb(var(--sw-ink));
  box-shadow: 0 0 0 1px rgb(var(--sw-hairline)), var(--shadow-sm);
}
.billing-toggle input:focus-visible + label { outline: 2px solid rgb(var(--sw-accent)); outline-offset: 2px; }
.billing-save { font-size: var(--fs-xs); font-weight: 600; color: rgb(var(--sw-accent-700)); }
/* Forced colours (Windows contrast themes) drop the chosen segment's white fill and shadow:
   mark it with the system selection colours instead. */
@media (forced-colors: active) {
  .billing-toggle input:checked + label { forced-color-adjust: none; background: Highlight; color: HighlightText; }
  .billing-toggle input:checked + label .billing-save { color: HighlightText; }
  .billing-toggle input:focus-visible + label { outline-color: CanvasText; }
}

.plans-jump { display: flex; flex-wrap: wrap; gap: 0 var(--space-5); font-size: var(--fs-sm); }
.plans-jump a {
  padding-block: var(--space-2);
  font-weight: 600;
  color: rgb(var(--sw-muted));
  text-decoration: underline;
  text-decoration-color: rgb(var(--sw-grid-strong));
  text-underline-offset: 0.3em;
  transition: color var(--dur-fast) var(--ease-out-expo), text-decoration-color var(--dur-fast) var(--ease-out-expo);
}
.plans-jump a:hover { color: rgb(var(--sw-accent-700)); text-decoration-color: currentColor; }
@media (pointer: coarse) { .plans-jump a { padding-block: 0.75rem; } }   /* 44px targets on touch */

.price-swap { display: inline-grid; justify-items: start; }
.price-bill.price-swap { display: grid; }
.price-swap > * { grid-area: 1 / 1; }
.plans [data-when="monthly"] { visibility: hidden; opacity: 0; }
/* Separate rule: a browser without :has() drops only this one and keeps showing annual prices. */
.plans:has(#billing-monthly:checked) [data-when="annual"] { visibility: hidden; opacity: 0; }
.plans:has(#billing-monthly:checked) [data-when="monthly"] { visibility: visible; opacity: 1; }
/* Without :has() the toggle could only lie (prices stay annual), so it isn't shown at all. */
@supports not selector(:has(*)) { .billing-toggle { display: none; } }
@media (prefers-reduced-motion: no-preference) {
  .plans [data-when] { transition: opacity var(--dur-fast) var(--ease-out-expo), visibility var(--dur-fast); }
}

/* --- compare plans (in a .table-scroll region): capability names pinned on the
   left while the tiers scroll; the recommended column carries a tint. -------- */
.compare-table { width: 100%; min-width: 640px; border-collapse: separate; border-spacing: 0; font-size: var(--fs-sm); }
.compare-table .cmp-cap { width: 40%; }
.compare-table col + col { width: 15%; }
@media (max-width: 559.98px) {
  /* a narrower pinned column so two tiers fit beside it on a phone */
  .compare-table { min-width: 520px; }
  .compare-table .cmp-cap { width: 10.5rem; }
  .compare-table col + col { width: auto; }
}
.compare-table .cmp-rec { background: rgb(var(--sw-accent-light) / 0.6); }
.compare-table th,
.compare-table td { padding: 0.65rem var(--space-4); border-bottom: 1px solid rgb(var(--sw-hairline)); text-align: center; vertical-align: middle; line-height: 1.4; }
.compare-table thead th { padding-block: var(--space-4); font-size: var(--fs-base); font-weight: 800; letter-spacing: -0.01em; }
.compare-table thead th:first-child,
.compare-table tbody th[scope="row"] {
  position: sticky;
  left: 0;
  z-index: 1;
  text-align: left;
  background: rgb(var(--sw-surface));
  box-shadow: inset -1px 0 0 rgb(var(--sw-hairline));
}
.compare-table tbody th[scope="row"] { font-weight: 500; color: rgb(var(--sw-ink)); }
.compare-table .cmp-group th {
  padding-top: var(--space-5);
  padding-bottom: var(--space-2);
  text-align: left;
  font-size: var(--fs-xs);
  font-weight: 700;
  color: rgb(var(--sw-accent-700));
  background: rgb(var(--sw-canvas));
}
.compare-table .cmp-group span { position: sticky; left: var(--space-4); }
.compare-table tbody:last-child tr:last-child > * { border-bottom: 0; }
/* marks: inline SVG in currentColor (see .svg-defs), so forced colours repaint them */
.cmp-yes { color: rgb(var(--sw-status-approved)); }
.cmp-no { color: rgb(var(--sw-muted)); }
.compare-table .tick,
.compare-table .dash { display: inline-block; width: 18px; height: 18px; vertical-align: middle; }
.compare-table .dash { stroke-width: 2; }


/* ==========================================================================
   Home: loop to trust — the loop strip (also on the TPM page), chapters, stage,
   crops, forecast, AI, fit tiles, trust
   ========================================================================== */

/* --- the loop: five numbered steps on one line, joined by a connector, with a
   "Promotion runs" marker between Review and Prove and a light group label over
   steps 1-3 and 4-5. Each step links to its chapter. Below 720px it becomes a
   plain vertical list in the same order, the grouping and marker intact. ------- */
.loop-section { padding-bottom: clamp(2rem, 4vw, 3rem); }
.loop-section .section-head { margin-bottom: clamp(1.75rem, 3vw, 2.5rem); }
.loop-steps {
  position: relative;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr)) auto repeat(2, minmax(0, 1fr));
  grid-template-rows: auto auto;
  column-gap: var(--space-2);
  row-gap: var(--space-4);
}
/* the connector: one line behind every number, at the circle's own centre */
.loop-steps::before {
  content: "";
  grid-row: 2;
  grid-column: 1 / 7;
  align-self: start;
  height: 2px;
  margin-top: 1.05rem;
  background: rgb(var(--sw-grid-strong));
}
/* a thin bracket: the label sits above a rule spanning its group's columns */
.loop-group {
  grid-row: 1;
  align-self: end;
  position: relative;
  padding-bottom: 0.5rem;
  font-size: var(--fs-xs);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: rgb(var(--sw-muted));
}
.loop-group::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 1px;
  background: rgb(var(--sw-grid-strong));
}
.loop-group--before { grid-column: 1 / 4; }
.loop-group--after { grid-column: 5 / 7; }
.loop-item { grid-row: 2; display: flex; min-width: 0; }
.loop-item[data-step="1"] { grid-column: 1; }
.loop-item[data-step="2"] { grid-column: 2; }
.loop-item[data-step="3"] { grid-column: 3; }
.loop-item[data-step="4"] { grid-column: 5; }
.loop-item[data-step="5"] { grid-column: 6; }
.loop-marker {
  grid-row: 2;
  grid-column: 4;
  align-self: start;
  margin-top: 0.6rem;
  display: flex;
  justify-content: center;
}
.loop-step {
  display: flex;
  flex-direction: column;
  flex: 1;
  min-width: 0;
  gap: 0.3rem;
  color: rgb(var(--sw-ink));
}
.loop-num {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 2.1rem;
  height: 2.1rem;
  flex: none;
  border-radius: 50%;
  background: rgb(var(--sw-surface));
  border: 2px solid rgb(var(--sw-accent));
  font: 700 var(--fs-sm) var(--font-mono);
  color: rgb(var(--sw-accent-700));
  transition: background-color var(--dur-fast) var(--ease-out-expo), color var(--dur-fast) var(--ease-out-expo);
}
.loop-name { font-size: var(--fs-md); font-weight: 800; letter-spacing: -0.02em; line-height: 1.2; }
.loop-sub { font-size: var(--fs-sm); line-height: 1.35; color: rgb(var(--sw-muted)); }
.loop-step:hover .loop-num,
.loop-step:focus-visible .loop-num { background: rgb(var(--sw-accent)); color: rgb(var(--sw-surface)); }
.loop-step:focus-visible { outline: 2px solid rgb(var(--sw-accent)); outline-offset: 4px; border-radius: var(--radius-sm); }
.loop-flag {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  padding: 0.35rem 0.7rem;
  border-radius: var(--radius-full);
  background: rgb(var(--sw-ink));
  color: rgb(var(--sw-surface));
  font-size: 0.75rem;
  font-weight: 700;
  white-space: nowrap;
}
.loop-flag-i { width: 12px; height: 12px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
@media (max-width: 719.98px) {
  .loop-steps { grid-template-columns: minmax(0, 1fr); grid-template-rows: none; row-gap: var(--space-3); }
  .loop-steps::before { display: none; }
  .loop-group, .loop-marker, .loop-item[data-step] { grid-column: 1; }
  .loop-group--before { grid-row: 1; }
  .loop-item[data-step="1"] { grid-row: 2; }
  .loop-item[data-step="2"] { grid-row: 3; }
  .loop-item[data-step="3"] { grid-row: 4; }
  .loop-marker { grid-row: 5; justify-content: flex-start; margin-top: 0; }
  .loop-group--after { grid-row: 6; }
  .loop-item[data-step="4"] { grid-row: 7; }
  .loop-item[data-step="5"] { grid-row: 8; }
  .loop-step { flex-direction: row; align-items: center; gap: var(--space-3); }
}

/* --- split: one pattern for every plan-to-proof section and AI — heading, lead
   and 0-3 bullets beside a vertically centred sketch, sides alternating section by
   section via .split--reverse. One column, text first, below 900px. -------------- */
.split {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(1.75rem, 4vw, 2.75rem);
  align-items: center;
}
.split-copy { order: 1; }
/* margin, not flex: .split-visual lands on the same element as .shot-frame, whose
   own chrome+pane children must stay a block stack, not become flex-row items */
.split-visual { order: 2; margin-inline: auto; }
.split-copy .pillar-list { margin-top: var(--space-3); gap: var(--space-2); }
.split-copy .pillar-list li { font-size: var(--fs-base); }
@media (min-width: 900px) {
  .split { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: clamp(2.5rem, 5vw, 4rem); }
  .split--reverse .split-copy { order: 2; }
  .split--reverse .split-visual { order: 1; }
}

/* --- connect your AI ------------------------------------------------------------ */
.ai-steps { counter-reset: ai-step; display: grid; gap: var(--space-4); margin-top: var(--space-6); }
.ai-steps > li {
  counter-increment: ai-step;
  display: grid;
  grid-template-columns: 1.75rem minmax(0, 1fr);
  column-gap: var(--space-2);
  padding-top: var(--space-4);
  border-top: 1px solid rgb(var(--sw-grid-strong));
}
.ai-steps > li::before {
  content: counter(ai-step);
  grid-row: 1 / span 2;
  font-size: var(--fs-md);
  font-weight: 800;
  line-height: 1.25;
  font-variant-numeric: tabular-nums;
  color: rgb(var(--sw-accent-700));
}
.ai-steps p { margin-top: var(--space-1); font-size: var(--fs-sm); color: rgb(var(--sw-muted)); }
.ai-note { margin-top: var(--space-6); }
.ai-shot { width: 100%; max-width: 471px; }

/* --- fits how you work: the six capabilities as a tidy ruled grid, an icon, a
   title and one short line each. One column on a phone, two from 640px, three
   from 1024px (the same steps as .fit-grid below). ------------------------------- */
.fit-list { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-5) clamp(2rem, 4vw, 3.5rem); }
.fit-list > li { padding-top: var(--space-4); border-top: 1px solid rgb(var(--sw-grid-strong)); }
.fit-icon { width: 20px; height: 20px; margin-bottom: var(--space-3); color: rgb(var(--sw-accent)); }
.fit-list h3 { margin-bottom: var(--space-1); }
.fit-list p { font-size: var(--fs-sm); color: rgb(var(--sw-muted)); }
@media (min-width: 640px) {
  .fit-list { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 1024px) {
  .fit-list { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

/* --- plain tiles (the TPM page's clashes, trade plan and spreadsheets) ------------- */
.fit-grid { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-4); }
.fit-tile {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  min-width: 0;
  overflow: hidden;
  padding: var(--space-5);
  border: 1px solid rgb(var(--sw-hairline));
  border-radius: var(--radius-lg);
  background: rgb(var(--sw-canvas));
}
.fit-tile p { font-size: var(--fs-sm); color: rgb(var(--sw-muted)); }
@media (min-width: 640px) {
  .fit-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
/* tablets: the last tile spans the row, so no tile stands half empty */
@media (min-width: 640px) and (max-width: 1023.98px) {
  .fit-tile--import { grid-column: span 2; }
}
@media (min-width: 1024px) {
  .fit-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

/* --- trust: a short ruled band, the heading beside four plain statements -------- */
.trust { border-block: 1px solid rgb(var(--sw-hairline)); }
.trust .container { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-6) var(--space-7); }
.trust h2 { margin-bottom: 0; }
.trust-list { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-5) var(--space-6); }
.trust-list > li { padding-top: var(--space-3); border-top: 2px solid rgb(var(--sw-ink)); }
.trust-list h3 { font-size: var(--fs-base); font-weight: 700; letter-spacing: -0.01em; line-height: 1.3; }
.trust-list p { margin-top: var(--space-1); font-size: var(--fs-sm); color: rgb(var(--sw-muted)); }
@media (min-width: 640px) {
  .trust-list { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 1024px) {
  .trust .container { grid-template-columns: minmax(0, 0.8fr) minmax(0, 2.2fr); }
  .trust-list { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

/* ==========================================================================
   Mobile action bar: main.js builds it on every page ("Book a demo", or
   "Register interest" on the partner pages). Phones and tablets, after the hero,
   never over the final call to action, the form or the footer; hidden without JS.
   ========================================================================== */
.mobile-cta { display: none; }
@media (max-width: 859.98px) {
  .mobile-cta {
    position: fixed;
    inset: auto 0 0;
    z-index: var(--z-mobile-cta);
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-3);
    padding: var(--space-3) clamp(1.25rem, 4vw, 2.5rem) calc(var(--space-3) + env(safe-area-inset-bottom, 0px));
    background: rgb(var(--sw-surface));
    border-top: 1px solid rgb(var(--sw-hairline));
    box-shadow: var(--shadow-lg-up);
    transform: translateY(100%);
    visibility: hidden;
    transition: transform var(--dur-base) var(--ease-out-expo), visibility 0s linear var(--dur-base);
  }
  .mobile-cta[data-show="true"] {
    transform: none;
    visibility: visible;
    transition: transform var(--dur-base) var(--ease-out-expo);
  }
  .mobile-cta-text { min-width: 0; font-size: var(--fs-sm); font-weight: 600; line-height: 1.3; color: rgb(var(--sw-ink)); }
  .mobile-cta .btn { flex: none; min-height: 44px; padding-block: 0.6rem; }
  /* while the bar shows, keyboard focus scrolls clear of it (it hides before the footer, so the
     end of the page is never under it) */
  .has-mobile-cta { scroll-padding-bottom: 5.5rem; }
}
@media (max-width: 379.98px) {
  .mobile-cta-text { display: none; }
  .mobile-cta .btn { flex: 1; justify-content: center; }
}
@media (prefers-reduced-motion: reduce) {
  .mobile-cta,
  .mobile-cta[data-show="true"] { transition: none; }
}

/* ==========================================================================
   Partner pages: design-partners.html, verticals/rostering.html and
   verticals/maintenance-service.html — concept heroes, programs, marks, pains,
   built vs future, program steps, the register form. Status speaks the board's
   own language: live = filled (dot, tick, solid edge), future state = hollow
   (ring, dashed edge), like approved and draft bars on the product's board.
   ========================================================================== */


/* --- icons: one hidden <symbol> set per page, stroked in currentColor so
   forced-colours themes repaint them with the text ---------------------- */
.ic { flex: none; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }

/* --- concept page hero: the H1, then the lead with the actions under it (the one hero
   pattern every page shares), then the concept board -------------------------------- */
.concept-hero { padding-block: clamp(2rem, 4vw, 3.5rem) clamp(3rem, 6vw, 5rem); }
.concept-hero .page-meta { margin-bottom: var(--space-5); }
.concept-head { display: grid; gap: var(--space-5); margin-bottom: clamp(1.75rem, 3.5vw, 2.75rem); }
.concept-head h1 { margin-bottom: 0; }
.concept-intro { display: grid; gap: var(--space-6); }

/* --- design partner hero: copy beside the open programs ------------------- */
.dp-hero-grid { display: grid; gap: clamp(2.25rem, 5vw, 3rem); }
.dp-hero-copy h1 { margin-bottom: var(--space-5); }
.dp-hero-copy .lead { margin-bottom: var(--space-6); }
@media (min-width: 1024px) {
  .dp-hero-grid { grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr); column-gap: clamp(3rem, 5vw, 5rem); align-items: center; }
}

/* the programs, drawn like a board: a toolbar strip, then one row each */
.programs { border: 1px solid rgb(var(--sw-hairline)); border-radius: var(--radius-lg); background: rgb(var(--sw-surface)); box-shadow: var(--shadow-md); overflow: hidden; }
.programs .programs-h {
  padding: 0.7rem var(--space-5);
  font-size: var(--fs-xs); font-weight: 700; letter-spacing: 0; line-height: 1.4;
  background: rgb(var(--sw-canvas)); border-bottom: 1px solid rgb(var(--sw-hairline));
}
.program-list li + li { border-top: 1px solid rgb(var(--sw-hairline)); }
.program {
  display: grid; grid-template-columns: minmax(0, 1fr) auto auto; align-items: center; gap: var(--space-2) var(--space-4);
  padding: var(--space-4) var(--space-5);
  transition: background-color var(--dur-fast) var(--ease-out-expo);
}
.program:hover { background: rgb(var(--sw-canvas)); }
.program:focus-visible { outline-offset: -3px; border-radius: var(--radius-sm); }
.program-name { display: block; }
.program-desc { display: block; margin-top: 0.2rem; font-size: var(--fs-sm); color: rgb(var(--sw-muted)); }
.program-go { width: 16px; height: 16px; color: rgb(var(--sw-accent-700)); transition: transform var(--dur-fast) var(--ease-out-expo); }
.program:hover .program-go { transform: translateX(3px); }
@media (max-width: 559.98px) {
  .program { grid-template-columns: minmax(0, 1fr) auto; padding-inline: var(--space-4); }
  .program .pill { grid-row: 2; }
  .program-go { grid-column: 2; grid-row: 1 / span 2; }
}

/* --- marked lists: a tick for what exists, a dashed ring for future state */
.marks { display: grid; gap: var(--space-3); }
.marks li { display: grid; grid-template-columns: 1.125rem minmax(0, 1fr); column-gap: var(--space-3); font-size: var(--fs-sm); line-height: 1.5; color: rgb(var(--sw-muted)); }
.marks strong { color: rgb(var(--sw-ink)); font-weight: 700; }
.mark { width: 1.125rem; height: 1.125rem; margin-top: 0.1em; }
.mark--live { color: rgb(var(--sw-status-approved)); stroke-width: 2; }
.mark--future { color: rgb(var(--sw-accent)); stroke-width: 1.5; stroke-dasharray: 2.4 2.05; }

/* --- the pains a board has to answer --------------------------------------- */
.pains-grid { display: grid; gap: var(--space-6) clamp(2.5rem, 5vw, 4.5rem); }
.pains-grid .section-head { margin-bottom: 0; }
@media (min-width: 960px) { .pains-grid { grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr); align-items: start; } }
.pains > div { padding-block: var(--space-4) var(--space-5); border-top: 1px solid rgb(var(--sw-grid-strong)); }
.pains dd { margin: var(--space-2) 0 0; font-size: var(--fs-sm); color: rgb(var(--sw-muted)); }
.pains-try { display: flex; gap: var(--space-2); align-items: flex-start; padding-top: var(--space-4); border-top: 1px solid rgb(var(--sw-grid-strong)); font-size: var(--fs-sm); font-weight: 600; }
.pains-try .ic { width: 1rem; height: 1rem; margin-top: 0.2em; color: rgb(var(--sw-accent)); }

/* --- built today vs what we'd build with you: solid vs dashed --------------- */
.build-split { display: grid; gap: var(--space-5); }
/* the built list is the longer one: it takes the wider column so the two cards end level */
@media (min-width: 960px) {
  .build-split { grid-template-columns: minmax(0, 1.15fr) minmax(0, 0.85fr); align-items: stretch; }
  .build-split--even { grid-template-columns: repeat(2, minmax(0, 1fr)); } /* service boards: the two lists run level */
}
.build-col { display: flex; flex-direction: column; border-radius: var(--radius-lg); padding: clamp(1.5rem, 3vw, 2.25rem); }
.build-col--live { background: rgb(var(--sw-canvas)); border: 1px solid rgb(var(--sw-hairline)); }
.build-col--future { background: rgb(var(--sw-surface)); border: 1.5px dashed rgb(var(--sw-accent) / 0.45); }
.build-head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--space-2) var(--space-4); padding-bottom: var(--space-4); margin-bottom: var(--space-5); border-bottom: 1px solid rgb(var(--sw-hairline)); }
.build-col--future .build-head { border-bottom-style: dashed; border-bottom-color: rgb(var(--sw-grid-strong)); }
.build-head h3 { font-size: var(--fs-lg); }
.build-foot { margin-top: auto; padding-top: var(--space-5); font-size: var(--fs-sm); color: rgb(var(--sw-muted)); }
.build-foot .card-link { margin-top: var(--space-3); }

/* --- how the program works: four numbered steps on one track --------------- */
.steps { display: grid; gap: var(--space-6); margin-bottom: clamp(2.5rem, 5vw, 3.5rem); }
.step { position: relative; padding-left: 3rem; }
.step::before { content: ""; position: absolute; left: 1rem; top: 2.5rem; bottom: calc(-1 * var(--space-6) + 0.5rem); width: 1px; background: rgb(var(--sw-grid-strong)); }
.step:last-child::before { content: none; }
.step-n {
  position: absolute; left: 0; top: 0;
  width: 2rem; height: 2rem; display: grid; place-items: center;
  border: 1px solid rgb(var(--sw-accent) / 0.5); border-radius: 50%;
  background: rgb(var(--sw-surface)); color: rgb(var(--sw-accent-700));
  font: 600 0.875rem/1 var(--font-mono);
}
.step:first-child .step-n { background: rgb(var(--sw-accent)); border-color: rgb(var(--sw-accent)); color: rgb(var(--sw-surface)); }
.step h3 { padding-top: 0.2rem; margin-bottom: var(--space-2); }
.step p { font-size: var(--fs-sm); color: rgb(var(--sw-muted)); }
@media (min-width: 900px) {
  .steps { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-5); }
  .step { padding: 3rem 0 0; }
  .step::before { left: 2.75rem; right: calc(-1 * var(--space-5) + 0.75rem); top: 1rem; bottom: auto; width: auto; height: 1px; }
}
.ask-get { display: grid; gap: var(--space-5); }
@media (min-width: 720px) { .ask-get { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-6); } }
.ask-get > div { padding-top: var(--space-5); border-top: 1px solid rgb(var(--sw-grid-strong)); }
.ask-get h3 { margin-bottom: var(--space-3); }
.ask-get .pillar-list { margin-top: 0; }
.program-more { margin-top: clamp(2rem, 4vw, 2.75rem); }

/* --- the working engine (design partner page) ------------------------------ */
.engine-marks { margin-bottom: clamp(2rem, 4vw, 3rem); gap: var(--space-3) var(--space-6); }
@media (min-width: 720px) { .engine-marks { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1024px) { .engine-marks { grid-template-columns: repeat(3, minmax(0, 1fr)); } }

/* --- register: the form on the site's dark band ----------------------------- */
.register-grid { display: grid; gap: clamp(2rem, 4vw, 3.5rem); }
@media (min-width: 1024px) { .register-grid { grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.2fr); align-items: start; } }
.register-notes { margin-top: var(--space-6); }
.register-notes li { color: rgb(var(--sw-accent-200)); }
.register-notes .mark { color: rgb(var(--sw-accent-200)); }

.pf {
  color: rgb(var(--sw-ink));
  background: rgb(var(--sw-surface));
  border-radius: var(--radius-lg);
  padding: clamp(1.25rem, 3vw, 2rem);
  box-shadow: var(--shadow-lg);
}
.pf-grid { display: grid; gap: var(--space-4); }
@media (min-width: 640px) {
  .pf-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-5) var(--space-4); }
  .pf-wide { grid-column: 1 / -1; }
}
.pf-field { display: grid; gap: 0.4rem; align-content: start; min-width: 0; }
.pf-field label { font-size: var(--fs-sm); font-weight: 700; }
.pf-opt { font-weight: 400; color: rgb(var(--sw-muted)); }
.pf-hint { margin-top: -0.15rem; }
/* A field's edge is how you find it (WCAG 1.4.11 wants 3:1): Slate Muted at 70% is about 3.6:1 on
   white, full Slate Muted on hover. The calculator's fields and the Copy details box use the same edge. */
.pf-field :is(input, select, textarea) {
  width: 100%; min-height: 2.875rem;
  padding: 0.65rem 0.85rem;
  border: 1px solid rgb(var(--sw-muted) / 0.7); border-radius: var(--radius-sm);
  background-color: rgb(var(--sw-surface));
  font: inherit; font-size: 1rem; line-height: 1.4; /* the reset's font: inherit skips select */
  caret-color: rgb(var(--sw-accent));
  transition: border-color var(--dur-fast) var(--ease-out-expo);
}
.pf-field textarea { min-height: 8.5rem; resize: vertical; }
.pf-field select {
  appearance: none; -webkit-appearance: none; padding-right: 2.5rem; cursor: pointer;
  background: rgb(var(--sw-surface)) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='m4 6 4 4 4-4' fill='none' stroke='%23475569' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat right 0.85rem center / 16px;
}
.pf-field select:has(option[value=""]:checked) { color: rgb(var(--sw-muted)); } /* nothing chosen yet */
.pf-field :is(input, select, textarea):hover, .pf-copy-text:hover { border-color: rgb(var(--sw-muted)); }
.pf-field :is(input, select, textarea):focus, .pf-copy-text:focus { outline: 2px solid rgb(var(--sw-accent)); outline-offset: 1px; border-color: rgb(var(--sw-accent)); }
.pf-field [aria-invalid="true"] { border-color: rgb(var(--sw-tone-bad-600)); }
.pf-field [aria-invalid="true"]:focus { outline-color: rgb(var(--sw-tone-bad-600)); border-color: rgb(var(--sw-tone-bad-600)); }
@media (forced-colors: active) { .pf-field select { appearance: auto; background-image: none; } }
.pf-error { display: flex; gap: 0.4rem; align-items: flex-start; font-size: var(--fs-xs); font-weight: 600; line-height: 1.4; color: rgb(var(--sw-tone-bad-700)); }
.pf-error .ic { width: 15px; height: 15px; margin-top: 0.05em; }
.pf-actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-3) var(--space-5); margin-top: var(--space-6); }
.pf-actions .ic { width: 1em; height: 1em; }
.pf-note { flex: 1 1 16rem; }
@media (max-width: 559.98px) { .pf-actions .btn { flex: 1 1 100%; justify-content: center; } }
.pf-noscript { margin-top: var(--space-4); font-size: var(--fs-sm); color: rgb(var(--sw-ink)); }
.pf-done { margin-top: var(--space-5); padding: var(--space-5); border: 1px solid rgb(var(--sw-status-approved) / 0.35); border-radius: var(--radius-md); background: rgb(var(--sw-tone-good) / 0.07); font-size: var(--fs-sm); }
.pf-done-title { display: flex; align-items: center; gap: 0.5rem; margin-bottom: var(--space-2); font-size: var(--fs-base); font-weight: 700; color: rgb(var(--sw-tone-good-700)); }
.pf-done-title .ic { width: 1.25rem; height: 1.25rem; }
.pf-done p + p { margin-top: var(--space-2); }
.pf-done-actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-3) var(--space-4); margin-top: var(--space-4); }
.pf-copy-text {
  display: block; width: 100%; min-height: 11rem; margin-top: var(--space-4); padding: 0.75rem;
  border: 1px solid rgb(var(--sw-muted) / 0.7); border-radius: var(--radius-sm);   /* the field edge: hover and focus with .pf-field above */
  background: rgb(var(--sw-surface)); font: var(--fs-xs)/1.55 var(--font-mono); resize: vertical;
  transition: border-color var(--dur-fast) var(--ease-out-expo);
}

/* ==========================================================================
   Trade promotion page (verticals/trade-promotion-management.html)
   ========================================================================== */
/* Page scope <main class="tpm">. Headings keep the site scale: the H1 from .page-hero, the
   H2s and H3s from the global type rules. */

/* --- hero: the copy, then the Coles view at full container width ------------ */
.tpm-hero .cta-row { margin-top: var(--space-6); }
.tpm-hero-shot { margin-top: clamp(2.5rem, 5vw, 3.5rem); }

/* --- spacing for the small print (a stat's source, plan notes) and the formula's afterword */
.tpm-source { margin-top: var(--space-3); }
.tpm-note { margin-top: var(--space-5); }
.tpm-after { margin-top: var(--space-5); color: rgb(var(--sw-muted)); }
.tpm-after + .tpm-after { margin-top: var(--space-3); } /* the definitions and the afterword read as one group */
.tpm .formula { margin-top: var(--space-6); }
.tpm-date { white-space: nowrap; } /* a date range never splits across two lines */

/* --- the loop: the home page's strip (.loop), introduced by one line --------- */
.tpm-loop-t { max-width: none; margin-bottom: var(--space-5); }

/* --- hierarchy: each layer ends on an example in the product's own notation -- */
.tpm .flow-step { display: flex; flex-direction: column; }
.tpm .flow-step > p:not(.tpm-eg) { margin-bottom: var(--space-4); }
.flow-step .tpm-eg { /* two classes, so it outranks .flow-step p */
  align-self: flex-start;
  margin-top: auto;
  padding: 0.3rem 0.55rem;
  border-radius: var(--radius-sm);
  background: rgb(var(--sw-accent-light));
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  line-height: 1.5;
  color: rgb(var(--sw-accent-800));
}
.tpm-prices {
  margin-top: clamp(2rem, 4vw, 2.5rem);
  padding-top: clamp(1.5rem, 3vw, 2rem);
  border-top: 1px solid rgb(var(--sw-hairline));
}
.tpm-prices h3 { margin-bottom: var(--space-3); }
.tpm-prices p { color: rgb(var(--sw-muted)); }

/* --- splits: text beside a figure shown at (or near) its own CSS width; each row
   sets --w to that width. Stacked, text first, below 960px. The figure is a real
   screenshot in the R3-1 browser frame (.shot-frame), not the old plain .shot. --- */
.tpm-split { display: grid; gap: clamp(2rem, 4vw, 3.5rem); align-items: center; }
.tpm-split > * { min-width: 0; }
.tpm-split > .shot-frame { max-width: var(--w, 32rem); }
@media (min-width: 960px) {
  .tpm-split { grid-template-columns: minmax(18rem, 1fr) minmax(0, var(--w, 32rem)); }
  .tpm-split--flip { grid-template-columns: minmax(0, var(--w, 32rem)) minmax(18rem, 1fr); }
  .tpm-split--flip > .shot-frame { order: -1; }
  .tpm-split--text { grid-template-columns: minmax(0, 1.15fr) minmax(0, 0.85fr); align-items: end; }
}
/* the formula's longest line needs ~38rem beside the panel: stack until there's room */
.tpm-split--formula { align-items: start; }
@media (min-width: 960px) and (max-width: 1179.98px) {
  .tpm-split--formula { grid-template-columns: minmax(0, 1fr); }
}

/* --- the hero's standalone figure: a film still in the frame, capped narrower
   than .shot-frame--wide so it reads as an illustration, not a wall-to-wall
   capture. ---------------------------------------------------------------- */
.shot-frame--tpm { max-width: 720px; }

/* --- AI, under review: the copy beside the home page's numbered .ai-steps --- */
.tpm-ai {
  display: grid;
  gap: var(--space-6);
  margin-top: clamp(3rem, 6vw, 4.5rem);
  padding-top: clamp(2rem, 4vw, 3rem);
  border-top: 1px solid rgb(var(--sw-hairline));
}
.tpm-ai h3 { margin-bottom: var(--space-3); }
.tpm-ai > div > p:not(.tpm-note) { color: rgb(var(--sw-muted)); }
.tpm-ai .ai-steps { margin-top: 0; }
@media (min-width: 960px) {
  .tpm-ai { grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr); }
}

/* ── round 4, lane W ── */

/* --- home, "Promotion plans outgrew the spreadsheet": the research band. Five sourced facts,
   ruled like .stat-item; from 1024px the market context (two) sits above the evidence of waste
   (three) on one 6-column track; then the takeaway for a supplier. ---------------------- */
.stat-band-h { margin-top: clamp(2.5rem, 5vw, 3.5rem); font-size: var(--fs-md); font-weight: 700; letter-spacing: -0.01em; line-height: 1.3; }
.stat-list--band { margin-top: var(--space-4); }
@media (min-width: 720px) and (max-width: 1023.98px) {
  .stat-list--band > :last-child { grid-column: 1 / -1; } /* the fifth fact spans the row */
}
@media (min-width: 1024px) {
  .stat-list--band { grid-template-columns: repeat(6, minmax(0, 1fr)); }
  .stat-list--band > * { grid-column: span 2; }
  .stat-list--band > :nth-child(-n + 2) { grid-column: span 3; }
}
.stat-takeaway { margin-top: clamp(2rem, 4vw, 2.75rem); font-size: var(--fs-md); color: rgb(var(--sw-ink)); }

/* --- home plan-to-proof splits: a tier note under the copy ----------------- */
.split-note { margin-top: var(--space-5); }

/* --- home, "The brands behind our experience": one even row of logos in full colour
   (two up on phones, four from 640px, all eight in one row from 1100px). Each <img>'s
   width/height is its display size, balanced by eye against its neighbours. ---- */
.brand-strip {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-5) var(--space-4);
  padding-block: var(--space-5);
  border-block: 1px solid rgb(var(--sw-hairline));
}
@media (min-width: 640px) { .brand-strip { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (min-width: 1100px) { .brand-strip { grid-template-columns: repeat(8, minmax(0, 1fr)); } }
.brand-strip > li { display: flex; align-items: center; justify-content: center; min-height: 3rem; }
.brand-strip img { max-width: 100%; height: auto; }
.brand-note { margin-top: var(--space-4); }

/* --- vertical pages, "What … does for your business": a ruled list, two up from 720px.
   A hairline closes the section, since the section after it is white too. ------------ */
.benefits { border-bottom: 1px solid rgb(var(--sw-hairline)); }
.benefit-list { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-5) clamp(2rem, 4vw, 3.5rem); }
@media (min-width: 720px) { .benefit-list { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.benefit-list > li { padding-top: var(--space-4); border-top: 1px solid rgb(var(--sw-grid-strong)); }
.benefit-list h3 { font-size: var(--fs-md); font-weight: 700; letter-spacing: -0.01em; line-height: 1.3; }
.benefit-list p { margin-top: var(--space-2); color: rgb(var(--sw-muted)); }

/* ── round 4, lane V ── */
/* Excel mock (home, "Promotion plans outgrew the spreadsheet"): deliberately Excel's own
   greys and greens, never the product's tokens, so it reads as the counterexample. */
.problem-grid { grid-template-columns: 1fr; }
.xl-figure { margin: 0; max-width: 100%; }
.xl-mock {
  --xlb: #d0d7de; --xlhead: #f3f2f1; --xltxt: #24292f; --xlmuted: #616161; --xlsel: #21a366;
  position: relative;
  max-width: 100%;
  border: 1px solid var(--xlb);
  border-radius: var(--radius-md);
  overflow: hidden;
  box-shadow: var(--shadow-lg);
  background: #fff;
  color: var(--xltxt);
  font-family: var(--font-sans);
}
.xl-titlebar {
  display: flex; align-items: center; gap: 0.5rem;
  height: 2.1rem; padding: 0 0.4rem 0 0.6rem;
  background: #185c37; color: #fff;
  font-size: 0.8rem;
}
.xl-appicon {
  display: grid; place-items: center; width: 1.1rem; height: 1.1rem;
  border-radius: 3px; background: #fff; color: #185c37; font-weight: 800; font-size: 0.7rem;
}
.xl-filename { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; opacity: 0.95; }
.xl-winctl { display: flex; gap: 0.85rem; padding-right: 0.3rem; }
.xl-winctl i { display: block; width: 0.6rem; height: 1px; background: #fff; opacity: 0.85; align-self: center; }
.xl-winctl i:last-child { width: 0.55rem; height: 0.55rem; background: transparent; border: 1px solid #fff; border-radius: 1px; opacity: 0.85; }
.xl-ribbon { background: #f3f2f1; border-bottom: 1px solid var(--xlb); }
.xl-rtabs {
  display: flex; gap: 1.1rem; padding: 0.4rem 0.75rem 0.3rem;
  font-size: 0.72rem; color: var(--xlmuted); white-space: nowrap; overflow: hidden;
}
.xl-rtabs .is-on { color: #185c37; font-weight: 700; border-bottom: 2px solid #185c37; padding-bottom: 0.3rem; margin-bottom: -0.3rem; }
.xl-rgroups {
  display: flex; align-items: center; gap: 0.45rem;
  padding: 0.35rem 0.75rem 0.5rem;
  overflow: hidden; flex-wrap: nowrap; white-space: nowrap;
}
.xl-rsep { flex: none; width: 1px; height: 1.35rem; background: var(--xlb); }
.xl-rbtn, .xl-rdd {
  flex: none; display: inline-flex; align-items: center; gap: 0.2rem;
  padding: 0.2rem 0.4rem; border-radius: 3px; font-size: 0.68rem; color: var(--xltxt);
}
.xl-rdd--sz { padding-inline: 0.3rem; }
.xl-rbtn b, .xl-rdd b { font-size: 0.58rem; font-weight: 400; }
.xl-rbi { flex: none; display: inline-flex; gap: 0.32rem; padding: 0 0.2rem; font-size: 0.78rem; color: var(--xltxt); }
.xl-rbi b { font-weight: 800; }
.xl-rbi i { font-style: italic; }
.xl-rbi u { text-decoration: underline; }
.xl-rswatch {
  flex: none; display: inline-flex; align-items: center; justify-content: center;
  width: 1.05rem; height: 1.05rem; border: 1px solid var(--xlb); border-radius: 2px;
  font-size: 0.6rem; font-weight: 700; color: var(--xltxt); background: #fff;
}
.xl-rswatch--fill { background: #fff2b2; }
.xl-rswatch--font { border-bottom: 2px solid #c00; }
.xl-rborders {
  flex: none; display: inline-block; width: 1.05rem; height: 1.05rem; opacity: 0.8;
  border: 1px solid var(--xlb); border-radius: 2px;
  background-image: linear-gradient(var(--xlmuted) 1px, transparent 1px), linear-gradient(90deg, var(--xlmuted) 1px, transparent 1px);
  background-size: 50% 50%; background-repeat: repeat;
}
.xl-fbar {
  display: flex; align-items: center; gap: 0.6rem;
  height: 1.85rem; padding: 0 0.6rem;
  background: #fff; border-bottom: 1px solid var(--xlb);
  font-family: var(--font-mono); font-size: 0.72rem;
}
.xl-namebox { flex: none; width: 3.6rem; padding: 0.1rem 0.4rem; border: 1px solid var(--xlb); border-radius: 2px; color: var(--xltxt); }
.xl-fx { flex: none; color: #185c37; font-style: italic; font-weight: 700; }
.xl-fx i { font-style: italic; }
.xl-formula {
  flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  color: var(--xltxt);
}
.xl-sheetwrap { overflow: hidden; background: #fff; }
.xl-grid { border-collapse: collapse; font-size: 0.72rem; width: max-content; min-width: 100%; }
.xl-grid th, .xl-grid td {
  border: 1px solid var(--xlb); padding: 0.32rem 0.55rem; white-space: nowrap;
  text-align: left; font-weight: 400;
}
.xl-colletters th {
  background: var(--xlhead); color: var(--xlmuted); text-align: center; font-weight: 600; font-size: 0.68rem;
}
.xl-corner, .xl-rn { background: var(--xlhead); color: var(--xlmuted); text-align: center; font-weight: 600; width: 1.8rem; }
.xl-legend { font-size: 0.46rem; font-weight: 700; line-height: 1.05; color: #b45309; white-space: normal; }
.xl-hidesep { border-left: 3px double #9a9a9a; position: relative; }
.xl-banner {
  background: #2e7d4f; color: #fff; font-weight: 700; letter-spacing: 0.02em; text-align: center;
}
.xl-headrow td { background: #f3f2f1; font-weight: 700; color: var(--xltxt); }
.xl-headrow .xl-fillwarn { background: #fff2b2; }
/* AutoFilter dropdown arrows on every header cell */
.xl-headrow td:not(.xl-rn) { position: relative; padding-right: 1.05rem; }
.xl-headrow td:not(.xl-rn)::after {
  content: ""; position: absolute; top: 50%; right: 0.4rem; transform: translateY(-30%);
  border-style: solid; border-width: 3px 3px 0; border-color: var(--xlmuted) transparent transparent;
}
.xl-totrow td { font-weight: 700; }
.xl-totlabel { text-align: right; color: var(--xlmuted); font-weight: 600; }
.xl-err { color: #c00; font-weight: 700; font-family: var(--font-mono); }
.xl-comment { position: relative; }
.xl-comment::after {
  content: ""; position: absolute; top: 0; right: 0; width: 0; height: 0;
  border-style: solid; border-width: 0 7px 7px 0; border-color: transparent #d92c2c transparent transparent;
}
/* the "number stored as text" green corner triangle Excel flags on a handful of cells */
.xl-greentri { position: relative; }
.xl-greentri::before {
  content: ""; position: absolute; top: 0; left: 0; width: 0; height: 0;
  border-style: solid; border-width: 6px 6px 0 0; border-color: #1e7d32 transparent transparent transparent;
}
.xl-cancelled td { text-decoration: line-through; color: var(--xlmuted); }
.xl-toonarrow { font-family: var(--font-mono); letter-spacing: 0.05em; }
.xl-overflow { font-style: italic; color: var(--xlmuted); } /* a note that spills into the blank cells beside it */
.xl-selected-cell { position: relative; box-shadow: inset 0 0 0 2px var(--xlsel); z-index: 1; }
.xl-selected-cell::after {
  content: ""; position: absolute; right: -3px; bottom: -3px; width: 6px; height: 6px;
  background: var(--xlsel); border: 1px solid #fff;
}
.xl-fill-yellow td:not(.xl-rn) { background: #fff2b2; }
.xl-fill-orange td:not(.xl-rn) { background: #ffd8a8; }
.xl-fill-red td:not(.xl-rn) { background: #ffd2d2; }
.xl-flagnum sup {
  margin-left: 0.15em; padding: 0 0.32em; border-radius: 999px;
  background: rgb(var(--sw-tone-bad)); color: #fff; font-family: var(--font-sans); font-weight: 700; font-size: 0.6rem;
  vertical-align: 2px;
}
.xl-sticky {
  position: absolute; right: 0.9rem; bottom: 2.55rem; z-index: 1;
  padding: 0.55rem 0.75rem;
  max-width: 9rem;
  background: #fff8b0; box-shadow: 1px 3px 6px rgb(0 0 0 / 0.25);
  transform: rotate(-2deg);
  font-family: "Comic Sans MS", var(--font-sans); font-size: 0.76rem; font-weight: 700; color: #4a3f00;
  line-height: 1.3;
}
.xl-tabbar {
  display: flex; align-items: center; gap: 2px;
  padding: 0.4rem 0.6rem; background: #f3f2f1; border-top: 1px solid var(--xlb);
  font-size: 0.72rem; color: var(--xlmuted); overflow: hidden;
}
.xl-tab { flex: none; padding: 0.3rem 0.65rem; border-radius: 4px 4px 0 0; white-space: nowrap; }
.xl-tab.is-on { background: #fff; color: #185c37; font-weight: 700; box-shadow: inset 0 2px 0 #185c37; }
.xl-tab .xl-flagnum sup, .xl-tabbar .xl-flagnum sup { vertical-align: 3px; }
.xl-tabadd { flex: none; padding: 0.2rem 0.5rem; font-weight: 700; }

.xl-callouts {
  margin-top: var(--space-5);
  display: grid; gap: var(--space-3);
  list-style: none;
}
.xl-callouts li { display: flex; align-items: flex-start; gap: var(--space-3); font-size: var(--fs-sm); color: rgb(var(--sw-ink)); line-height: 1.5; }
.xl-calnum {
  flex: none; display: grid; place-items: center; width: 1.4rem; height: 1.4rem; margin-top: 0.05rem;
  border-radius: var(--radius-full);
  background: rgb(var(--sw-tone-bad-100)); color: rgb(var(--sw-tone-bad-700));
  font-family: var(--font-mono); font-size: 0.72rem; font-weight: 700;
}
@media (min-width: 720px) {
  .xl-callouts { grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: var(--space-6); }
}

/* Dispatch board demo: a split job's non-interactive echo in its second technician's row
   (assets/js/board-demo.js, cfg.split). Same bar anatomy, dashed and quieter, never focusable. */
.bd-split-echo { opacity: 0.72; border-style: dashed; pointer-events: none; }
/* ── round 4, lane V: end ── */

/* ── round 4.1 ── */
/* Two open files (home, "Promotion plans outgrew the spreadsheet"): the table workbook
   (.xl-mock--a, unchanged) and a second hand-built calendar file (.xl-mock--b) cascading
   over it, like a second window opened on the same desktop, at every width — never stacked,
   never scrolled. .xl-stage clips to the column's real width; .xl-desk is the arrangement's
   fixed natural size, and assets/js/main.js zooms it down to fit narrower viewports (never
   up), so nothing here ever needs a scrollbar. Without JS or without `zoom` support it just
   clips at natural size instead of scrolling. */
.xl-stage { width: 100%; overflow: hidden; }
.xl-desk { display: flex; flex-direction: column; gap: 0; position: relative; width: 72rem; }
.xl-mock--a { z-index: 1; align-self: flex-start; }
.xl-mock--b {
  width: 88%;
  align-self: flex-end;
  margin-top: -0.25rem; /* nibbles window A's bottom edge/shadow only — its tab strip stays fully clear */
  z-index: 2;
  box-shadow: 0 28px 50px -14px rgb(15 23 42 / 0.38), 0 2px 4px rgb(15 23 42 / 0.1);
}

/* Calendar file (.xl-mock--b): a slotting board recreated in cells. Excel's own pastel
   fills throughout, never the product's tokens — this must never read as Slotwise's board. */
.xl-freeze { border-right: 3px solid #7a7a7a; }
.xl-monthband { text-align: center; font-weight: 700; letter-spacing: 0.03em; font-size: 0.68rem; }
.xl-monthband--apr { background: #cfe2f3; color: #1c4587; }
.xl-monthband--may { background: #d9ead3; color: #274e13; }
.xl-monthband--jun { background: #fff2cc; color: #7f6000; }
.xl-weekrow td { background: #f3f2f1; font-weight: 700; }
.xl-wkhead { text-align: center; }
.xl-wkdate { display: block; font-weight: 400; color: var(--xlmuted); font-size: 0.6rem; }
.xl-rowlabel { color: var(--xlmuted); font-weight: 600; font-size: 0.66rem; }
.xl-eventcell { text-align: center; font-weight: 700; color: #cc0000; }
.xl-eventcell--pink { color: #a64d79; }
.xl-eventcell--blue { color: #1155cc; }
.xl-pagecell { text-align: center; font-style: italic; color: var(--xlmuted); }
.xl-catgroup { background: var(--xlhead); text-align: center; vertical-align: middle; font-weight: 700; }
.xl-bar { text-align: center; font-weight: 700; }
.xl-bar-blue { background: #a4c2f4; color: #1c4587; }
.xl-bar-green { background: #93c47d; color: #274e13; }
.xl-bar-amber { background: #ffd966; color: #664d00; }
.xl-bar-purple { background: #b4a7d6; color: #351c75; }
.xl-bar-teal { background: #76a5af; color: #0c343d; }
.xl-bar-plain { background: #e8e8e8; color: #666; }
.xl-bar-conflict { background: #f4cccc; color: #a30000; }
.xl-bar-orange { background: #f9cb9c; color: #7f4000; }
.xl-bar-rose { background: #ead1dc; color: #741b47; }
.xl-bar-pattern {
  color: #4d4d4d;
  background-image: repeating-linear-gradient(45deg, #e0e0e0, #e0e0e0 4px, #f5f5f5 4px, #f5f5f5 8px);
}
/* someone added a border to these two runs; the rest just carry the plain grid line */
.xl-bar-boxed { outline: 1.5px solid #444; outline-offset: -1px; }
.xl-bar-struck { text-decoration: line-through; } /* a single cancelled run inside a live row (Corn Flakes) */
/* the label runs on past its own cells and is cut off by the next run, not ellipsised */
.xl-bar-spill { max-width: 7rem; overflow: hidden; white-space: nowrap; }
/* Iced Tea's double-booking: two mechanics squeezed into one week, stacked in a split cell. */
.xl-grid td.xl-splitcell { padding: 0; }
.xl-splittop, .xl-splitbot { display: block; padding: 0.12rem 0.35rem; font-weight: 700; text-align: center; }
.xl-splittop { border-bottom: 1px solid var(--xlb); }
/* Tighter grid so all 16 weeks fit with no scroll — the safety net is assets/js/main.js's zoom. */
.xl-mock--b .xl-grid { font-size: 0.7rem; }
.xl-mock--b .xl-grid th, .xl-mock--b .xl-grid td { padding: 0.26rem 0.34rem; }
.xl-mock--b .xl-freeze { max-width: 6.6rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.xl-key {
  position: absolute; top: 7.4rem; right: 0.9rem; z-index: 1;
  padding: 0.4rem 0.55rem;
  max-width: 8rem;
  background: #fff; border: 1px solid var(--xlb);
  box-shadow: 1px 2px 5px rgb(0 0 0 / 0.18);
  font-size: 0.62rem; color: var(--xltxt);
}
.xl-key b { display: block; margin-bottom: 0.2rem; font-size: 0.58rem; letter-spacing: 0.05em; color: var(--xlmuted); }
.xl-key-row { display: flex; align-items: center; gap: 0.35rem; line-height: 1.6; white-space: nowrap; }
.xl-key-swatch { display: inline-block; flex: none; width: 0.6rem; height: 0.6rem; border: 1px solid var(--xlb); }
.xl-key-swatch--blue { background: #a4c2f4; }
.xl-key-swatch--amber { background: #ffd966; }
.xl-key-swatch--pattern { background-image: repeating-linear-gradient(45deg, #e0e0e0, #e0e0e0 3px, #f5f5f5 3px, #f5f5f5 6px); }
/* ── round 4.1: end ── */
