/* The public site in theme v2, "Mint Signal" (SITE-THEME-V2 2026-11-06; the owner: "this is the design and it is perfect; this stays").
   Every public page loads /static/shared/css/theme-a.css (the tokens, light and dark, Plus Jakarta Sans), the shared sheets of the
   parts the app reuses (network-bg.css, cookie-notice.css, and pricing-section.css where plans show), then this file. Contract:
   - Light by default, dark through the system or the header's switch (data-theme on <html>, theme-boot.js before the first paint).
     The ground lives on <html> and <body> stays clear, so the network (shared/js/network-bg.js) runs behind every section; cards and
     panels keep their own surface. Reading pages (body.read, docs, help, legal, changelog) get the calm network.
   - Calm and flat at rest: hairline edges, the theme's radii (cards 22 px, controls near pills), one mint primary action per screen,
     black words on the mint. Hover answers a fine pointer only: a mint edge that follows the cursor across neighbouring cards, a 2 px
     lift, a sheen across buttons, a gentle tilt with a glare on the app screenshot (site/js/site.js). Touch keeps the press states.
   - Only transform and opacity move, every duration is a motion token, nothing moves under prefers-reduced-motion
     (tests/test_web_motion.py). One focus ring, never removed. No style attribute; every url is a same-origin /static/ path.
   - Colour means state only where a state is named, always with a glyph or a word: up is the mint, down from both regions red, down
     from one region pink (--partial), warnings the lamp's yellow, planned work the sky.
   - The owner's 21st picks, each under its licence (C:/pw/21st-map/owner-picks-2026-11-06.md): ported when MIT (wensity button,
     aymanch-03 pricing section, dhxwhy team-lanyard-rail), rebuilt clean-room otherwise (ruixen.ui text-reveal FAQs, avanishverma4
     bento-grid-01, jahed spotlight-card, vaib215 stagger-testimonials); each block below names its source. */

/* ==== the wordmark's own 5 KB cut of Archivo (the words of every page are the theme's Plus Jakarta Sans, from theme-a.css) ==== */

/* ==== the motion module: the numbers of shared/js/motion.js, so the shared components that read these names (Ask Beam's beam.css, the
   charts, the app's activation.css on how-it-works) move the same way on this site ==== */
:root {
  --dur-press: 100ms; --dur-state: 180ms; --dur-enter: 320ms; --dur-move: 180ms; --dur-scene: 900ms; --dur-shimmer: 1200ms;
  --ease-standard: cubic-bezier(0.2, 0, 0, 1); --ease-enter: cubic-bezier(0.05, 0.7, 0.1, 1); --ease-exit: cubic-bezier(0.3, 0, 1, 1);
  --move-xs: 2px; --move-sm: 4px; --move-md: 8px; --move-lg: 24px; --press-scale: 0.97; --enter-scale: 0.98; --pop-scale: 0.6; --grow-from: 0;
  --busy-delay: 400ms; --busy-turn: 800ms; --stagger: 70ms;
}
:root[data-motion="calm"] { --dur-move: 0ms; --dur-scene: 0ms; --dur-shimmer: 0ms; --move-xs: 0px; --move-sm: 0px; --move-md: 0px; --move-lg: 0px;
  --press-scale: 1; --enter-scale: 1; --pop-scale: 1; --grow-from: 1; }
:root[data-motion="off"] { --dur-press: 0ms; --dur-state: 0ms; --dur-enter: 0ms; --dur-move: 0ms; --dur-scene: 0ms; --dur-shimmer: 0ms; --stagger: 0ms;
  --move-xs: 0px; --move-sm: 0px; --move-md: 0px; --move-lg: 0px; --press-scale: 1; --enter-scale: 1; --pop-scale: 1; --grow-from: 1; }
@media (prefers-reduced-motion: reduce) {
  :root:not([data-motion]) { --dur-press: 0ms; --dur-state: 0ms; --dur-enter: 0ms; --dur-move: 0ms; --dur-scene: 0ms; --dur-shimmer: 0ms; --stagger: 0ms;
    --move-xs: 0px; --move-sm: 0px; --move-md: 0px; --move-lg: 0px; --press-scale: 1; --enter-scale: 1; --pop-scale: 1; --grow-from: 1; }
}
@keyframes lx-fade { from { opacity: 0; } }
@keyframes lx-rise { from { opacity: 0; transform: translateY(var(--move-sm)); } }
@keyframes lx-rise-lg { from { opacity: 0; transform: translateY(var(--move-lg)); } }
@keyframes lx-drop { from { opacity: 0; transform: translateY(calc(-1 * var(--move-md))); } }
@keyframes lx-pop { from { opacity: 0; transform: scale(var(--enter-scale)); } }
@keyframes lx-draw { from { transform: scaleX(var(--grow-from)); } }
@keyframes lx-draw-y { from { transform: scaleY(var(--grow-from)); } }
@keyframes lx-stop { from { opacity: 0; transform: scale(var(--pop-scale)); } }
@keyframes mi-rise { from { opacity: 0; transform: translateY(var(--move-sm)); } }
@keyframes mi-rise-md { from { opacity: 0; transform: translateY(var(--move-md)); } }
@keyframes mi-spin { to { transform: rotate(1turn); } }
@keyframes mi-fade { from { opacity: 0; } }

/* ==== the names the shared components read (Ask Beam's beam.css, the app's activation.css) and the site's own, on theme v2 ==== */
:root {
  --space-1: var(--a-sp-1); --space-2: var(--a-sp-2); --space-3: var(--a-sp-3); --space-4: var(--a-sp-4); --space-5: var(--a-sp-5);
  --space-6: var(--a-sp-6); --space-7: var(--a-sp-7);
  --text-xs: var(--a-t-xs); --text-sm: var(--a-t-sm); --text-md: var(--a-t-md); --text-lg: var(--a-t-lg); --text-xl: var(--a-t-xl); --text-2xl: 2rem;
  --font: var(--a-font); --mono: var(--a-mono);
  --ink: var(--foreground); --ink-2: var(--muted-foreground); --ink-3: var(--muted-foreground); --link: var(--primary-ink); --focus: var(--ring);
  --surface: var(--card); --fog: var(--muted); --rule: var(--border); --rule-strong: var(--field-edge); --control-edge: var(--field-edge);
  --night: var(--muted); --night-2: var(--card); --night-3: var(--muted); --on-night: var(--foreground); --on-night-2: var(--muted-foreground);
  --lamp: var(--primary); --lamp-soft: var(--primary-hover); --on-lamp: var(--primary-foreground);
  --steady: var(--ok-ink); --steady-bg: var(--ok-bg); --regional: var(--partial-ink); --regional-bg: var(--partial-bg);
  --down: var(--fail-ink); --down-bg: var(--fail-bg); --unknown: var(--neutral-ink); --unknown-bg: var(--neutral-bg);
  --planned: var(--info-ink); --planned-bg: var(--info-bg);
  --radius-control: var(--radius-md); --radius-card: var(--radius-lg); --r-pill: var(--radius-full, 999px);
  --control-h: 44px; --control-h-sm: 36px;
  --on-fail: #ffffff;   /* text on the filled Down block: white on the theme's red */
  /* the site's surfaces, flat at rest: one fill and a 1 px edge */
  --s-tile: var(--card);
  --s-edge: inset 0 0 0 1px var(--border);
  --s-edge-hover: inset 0 0 0 1px var(--field-edge);
  --s-panel: 0 0 0 1px var(--border);
  --s-glass: var(--card);
  --s-glass-hover: var(--hover);
  --s-glass-low: var(--card);
  --s-glass-faint: var(--card);
  --s-edge-line: color-mix(in srgb, var(--foreground) 16%, transparent);   /* a control's edge (wensity "button": the ink at 16 %) */
  --s-edge-line-soft: var(--border);
  --s-edge-line-strong: var(--field-edge);
  --s-bar-line: var(--border);
  --s-menu-bg: var(--popover);
  --s-lock-bg: color-mix(in srgb, var(--card) 94%, transparent);
  --s-notice-bg: var(--secondary);
  --s-panel-solid: var(--card);
  --s-code-bg: var(--muted); --s-code-ink: var(--foreground); --s-code-key: var(--info-ink); --s-code-str: var(--ok-ink);
  --s-mask: #000;
  --s-shadow-ink: #000;
  --s-scrollbar: var(--field-edge);
  --s-lamp-track: var(--ok-bg);
  --s-tip-bg: var(--foreground); --s-tip-ink: var(--background); --s-tip-ink-2: color-mix(in srgb, var(--background) 72%, var(--foreground));
  --s-zone-ok: var(--ok-bg); --s-zone-warn: var(--warn-bg); --s-zone-fail: var(--fail-bg);
  --s-zone-edge: var(--card);
  --s-on-lamp-2: var(--secondary-foreground);
  --s-avatar-top: var(--secondary);
  --s-print-paper: #fff; --s-print-ink: #000;
  --s-lv-ok-track: var(--ok-bg); --s-lv-warn-track: var(--warn-bg); --s-lv-fail-track: var(--fail-bg); --s-lv-none-track: var(--muted); --s-lv-grid: var(--border);
  --s-lv-surface: var(--card); --s-lv-ok: var(--ok); --s-lv-warn: var(--warn); --s-lv-fail: var(--fail);
  --s-logo-tile: var(--muted); --s-logo-ink: var(--foreground);
  --gutter: 24px; --sec-y: var(--a-section); --measure: var(--a-measure);
  --shadow-card: var(--shadow-md); --shadow-lift: var(--shadow-lg); --lift: var(--shadow-lg);
  /* the pointer's answer: the lift's shadow, the buttons' sheen, the screenshot's glare (the light itself: shared/css/v2/glow.css) */
  --lift-shadow: 0 1px 2px rgba(0, 0, 0, 0.04), 0 14px 28px -14px rgba(0, 0, 0, 0.22);
  --sheen: rgba(255, 255, 255, 0.6); --sheen-soft: color-mix(in srgb, var(--foreground) 6%, transparent); --glare: rgba(255, 255, 255, 0.3);
  --tile-bg: var(--secondary); --tile-ink: var(--primary-ink); --tile-edge: color-mix(in srgb, var(--primary-strong) 18%, transparent);
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) { --lift-shadow: 0 1px 2px rgba(0, 0, 0, 0.5), 0 18px 36px -16px rgba(0, 0, 0, 0.9); --glare: rgba(255, 255, 255, 0.08);
    --tile-bg: color-mix(in srgb, var(--primary) 10%, transparent); }
}
:root[data-theme="dark"] { --lift-shadow: 0 1px 2px rgba(0, 0, 0, 0.5), 0 18px 36px -16px rgba(0, 0, 0, 0.9); --glare: rgba(255, 255, 255, 0.08);
  --tile-bg: color-mix(in srgb, var(--primary) 10%, transparent); }

/* ==== base ==================================================================================================================== */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; scroll-padding-top: calc(var(--a-bar-h) + 16px); background: var(--background); overflow-x: clip; }
body { margin: 0; min-height: 100vh; min-height: 100dvh; background: transparent; color: var(--foreground); font-family: var(--a-font); font-size: var(--a-t-md);
  line-height: var(--a-lh-body); font-weight: 400; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
  font-synthesis-weight: none; overflow-x: clip; scrollbar-color: var(--s-scrollbar) var(--background); }
img, svg, video { display: block; max-width: 100%; height: auto; }
h1, h2, h3, h4 { margin: 0; font-weight: 600; line-height: 1.12; letter-spacing: -0.02em; text-wrap: balance; }
h1 { font-size: clamp(2.25rem, 1.4rem + 2.6vw, 3.5rem); line-height: 1.06; letter-spacing: -0.035em; }
/* the words a headline turns on, in the mint (owner 2026-11-09: "a bit of colour everywhere"): --primary-ink is the mint on the night and
   #0a7a47 on white (5.3:1); one span a headline, never a gradient */
.lit { color: var(--primary-ink); }
h2 { font-size: clamp(1.75rem, 1.15rem + 1.7vw, 2.5rem); letter-spacing: -0.03em; }
h3 { font-size: var(--a-t-lg); line-height: 1.3; letter-spacing: -0.01em; }
h4 { font-size: var(--a-t-md); }
p, li, dd, figcaption { text-wrap: pretty; }
p, ul, ol, dl, dd, figure, blockquote { margin: 0; }
ul, ol { padding: 0; }
ul[class], ol[class], nav ul, nav ol, .mega ul, .crumbs ol { list-style: none; margin: 0; padding: 0; }
a { color: var(--primary-ink); text-decoration-line: underline; text-decoration-thickness: 1px; text-underline-offset: 0.22em;
  text-decoration-color: color-mix(in srgb, currentColor 40%, transparent); }
@media (hover: hover) { a:hover { text-decoration-color: currentColor; } }
strong, b { font-weight: 650; }
code, kbd, samp, pre { font-family: var(--a-mono); font-size: 0.9em; }
time, .num, td, th, .tabular { font-variant-numeric: tabular-nums; }
hr { border: 0; height: 1px; background: var(--border); margin: var(--a-sp-7) 0; }
::selection { background: var(--primary); color: var(--primary-foreground); }
::placeholder { color: var(--muted-foreground); opacity: 1; }
:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }
[hidden] { display: none !important; }
.wrap { width: min(1200px, 100% - 48px); margin-inline: auto; }
.visually-hidden, .sr-only { position: absolute !important; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
.skip-link { position: absolute; left: 16px; top: -96px; z-index: 100; padding: var(--a-sp-3) var(--a-sp-4); border-radius: var(--radius-md); background: var(--foreground);
  color: var(--background); font-weight: 600; text-decoration: none; }
.skip-link:focus-visible { top: 12px; }
.icon { width: 20px; height: 20px; flex: none; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.icon-sm { width: 16px; height: 16px; }
.glyph { width: 15px; height: 15px; flex: none; }
.mark { width: 22px; height: 22px; flex: none; }
.lede { max-width: 36em; color: var(--muted-foreground); font-size: var(--a-t-read); line-height: 1.6; }
.lede b, .lede strong { color: var(--foreground); }
.note { color: var(--muted-foreground); font-size: var(--a-t-sm); }
.fine { color: var(--muted-foreground); font-size: var(--a-t-xs); }
.k-tag, .tag { display: inline-flex; align-items: center; color: var(--muted-foreground); font-size: var(--a-t-xs); font-weight: 600; white-space: nowrap; }
.soon-tag { display: inline-flex; align-items: center; min-height: 22px; padding: 0 9px; border-radius: var(--radius-full, 999px); background: var(--muted);
  color: var(--muted-foreground); box-shadow: inset 0 0 0 1px var(--border); font-size: var(--a-t-2xs); font-weight: 600; white-space: nowrap; }
/* New (2026-11-11): written only by the source (config/features.toml `since`, api/web_features.is_new), never typed in a page */
.new-tag { display: inline-flex; align-items: center; min-height: 22px; padding: 0 9px; border-radius: var(--radius-full, 999px); background: var(--primary);
  color: var(--primary-foreground); font-size: var(--a-t-2xs); font-weight: 600; white-space: nowrap; }
.plan-tag { display: inline-flex; align-items: center; min-height: 22px; padding: 0 9px; border-radius: var(--radius-full, 999px); background: var(--ok-bg);
  color: var(--ok-ink); font-size: var(--a-t-2xs); font-weight: 600; white-space: nowrap; }

/* ==== buttons: the theme's, with wensity "button" (MIT, port): a 1 px edge, a 0.97 press, and a sheen that crosses it under a fine
   pointer. No decorative arrow on any button or link (owner, 2026-11-04). Since 2026-11-11 (premium direction, decision 5) the lamp
   is the glossy emerald and the second action the glossy neutral: a fill that rises to a deeper top, a lighter 1 px edge and a soft
   shadow in the fill's colour, all from the --gloss-* tokens of shared/css/v2/accents.css (the app's buttons read the same tokens). ==== */
.btn { position: relative; isolation: isolate; overflow: hidden; display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  min-height: var(--control-h); padding: 0 20px; border: 1px solid var(--s-edge-line); border-radius: var(--radius-md); background: transparent; color: var(--foreground);
  font: inherit; font-weight: 600; font-size: var(--a-t-sm); line-height: 1.1; text-align: center; text-decoration: none; cursor: pointer; white-space: nowrap;
  transition: transform var(--motion-fast) var(--motion-ease-out); }
@media (hover: hover) { .btn:hover { background: color-mix(in srgb, var(--foreground) 4%, transparent); text-decoration: none; } }
.btn:active { transform: scale(var(--press-scale)); }
.btn-lamp { background: var(--gloss-primary-bg); color: var(--gloss-primary-ink); border-color: var(--gloss-primary-edge); box-shadow: var(--gloss-primary-shadow); }
@media (hover: hover) { .btn-lamp:hover { background: var(--gloss-primary-bg-hover); } }
.btn-ghost, .btn-line { background: var(--gloss-neutral-bg); color: var(--gloss-neutral-ink); border-color: var(--gloss-neutral-edge); box-shadow: var(--gloss-neutral-shadow); }
@media (hover: hover) { .btn-ghost:hover, .btn-line:hover { background: var(--gloss-neutral-bg-hover); } }
.btn-sm { min-height: var(--control-h-sm); padding: 0 14px; font-size: var(--a-t-ui); }
.btn-lg { min-height: 48px; padding: 0 24px; font-size: var(--text-base); }
.btn .icon { width: 18px; height: 18px; }
.btn::after { content: ""; position: absolute; inset: 0; z-index: -1; pointer-events: none; transform: translateX(-110%);
  background: linear-gradient(105deg, transparent 30%, var(--sheen-soft) 50%, transparent 70%); }
.btn-lamp::after { background: linear-gradient(105deg, transparent 30%, var(--sheen) 50%, transparent 70%); }
@media (hover: hover) and (pointer: fine) { .btn:hover::after { transform: translateX(110%); transition: transform var(--motion-sheet) var(--motion-ease-out); } }
.btn-label { display: inline; }
.btn.is-busy { cursor: progress; }
.btn.is-busy .btn-label::after { content: ""; display: inline-block; width: 14px; height: 14px; margin-left: var(--a-sp-2); vertical-align: -2px; border-radius: 50%;
  box-shadow: inset 0 0 0 2px currentColor; opacity: 0.6; }
:root[data-motion="full"] .btn.is-busy .btn-label::after { animation: mi-spin var(--busy-turn) linear infinite; box-shadow: none; box-sizing: border-box;
  border: 2px solid currentColor; border-top-color: transparent; }
.btn-link { display: inline-flex; align-items: center; gap: 6px; min-height: 44px; color: var(--primary-ink); font-weight: 600; text-decoration: underline;
  text-decoration-color: color-mix(in srgb, currentColor 35%, transparent); }
@media (hover: hover) { .btn-link:hover { text-decoration-color: currentColor; } }
.btn-link .icon { display: none; }   /* the old arrow after a link: decorative, so not shown (owner, 2026-11-04) */
.actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--a-sp-3); }

/* ==== fields (the theme's: the edge at 3:1, the ring on focus) ==== */
.label { display: block; margin-bottom: var(--a-sp-2); color: var(--foreground); font-weight: 600; }
.input, .select, .textarea { width: 100%; min-height: 46px; padding: 0 var(--a-sp-4); border: 1px solid var(--field-edge); border-radius: var(--radius-md);
  background: var(--field-bg); color: var(--foreground); font: inherit; font-size: var(--a-t-md); }
.textarea { min-height: 150px; padding-block: 14px; line-height: 1.5; resize: vertical; }
.input:focus-visible, .select:focus-visible, .textarea:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }
.input[aria-invalid="true"], .textarea[aria-invalid="true"], .select[aria-invalid="true"] { border-color: var(--fail); box-shadow: inset 0 0 0 1px var(--fail); }
.hint { margin-top: var(--a-sp-2); color: var(--muted-foreground); font-size: var(--a-t-sm); }
.field-error:not([hidden]) { display: flex; gap: 6px; margin-top: var(--a-sp-2); color: var(--fail-ink); font-weight: 600; font-size: var(--a-t-sm);
  animation: lx-rise var(--dur-state) var(--ease-standard) both; }
.field { display: grid; gap: 0; }
.field + .field { margin-top: 18px; }
.check-row { display: flex; gap: 10px; align-items: flex-start; }
.check-row input { width: 20px; height: 20px; margin-top: 2px; accent-color: var(--primary-strong); }

/* ==== the notice bar: the state of the build said once, slim, above the bar (web_chrome / web_launch draw it) ==== */
.notice-bar { position: relative; z-index: 31; background: var(--s-notice-bg); color: var(--secondary-foreground); font-size: var(--a-t-xs); }
.notice-bar .wrap { display: flex; justify-content: center; }
.notice-bar p { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 4px 10px; min-height: 32px; padding: 4px 0; text-align: center; }
.notice-bar a { color: inherit; font-weight: 600; }

/* ==== the bar: the wordmark, the main links with the Features mega menu, the theme switch, sign in and Start free ==================== */
.bar { position: sticky; top: 0; z-index: 30; }
/* its ground is a layer of its own (a backdrop filter on the bar itself would become the box its fixed menu sheet is placed in);
   clear over the home's first screen until the page scrolls (site.js marks .is-scrolled) */
.bar::before { content: ""; position: absolute; inset: 0; z-index: -1; background: var(--a-bar-bg); -webkit-backdrop-filter: saturate(1.4) blur(12px);
  backdrop-filter: saturate(1.4) blur(12px); box-shadow: 0 1px 0 var(--s-bar-line); transition: opacity var(--motion-base) var(--motion-ease-out); }
.landing .bar:not(.is-scrolled)::before { opacity: 0; }
.bar-in { display: flex; align-items: center; gap: 24px; height: var(--a-bar-h); }
.wordmark { display: inline-flex; align-items: center; gap: 10px; min-height: 44px; color: var(--foreground); text-decoration: none; font-family: var(--a-font-mark);
  font-weight: 800; font-size: var(--a-t-read); letter-spacing: -0.02em; line-height: 1; }
@media (hover: hover) { .wordmark:hover { text-decoration: none; } }
.wordmark :is(svg, .mark-img) { flex: none; }
.mark-img { display: block; width: 28px; height: 28px; }   /* the mark by file (img/mark.svg), so a new logo needs no edit here */
.foot-brand .mark-img { width: 34px; height: 34px; }
.nav { display: flex; align-items: center; gap: 2px; }
.nav-link, .nav-item > summary { display: inline-flex; align-items: center; gap: 6px; min-height: 40px; padding: 0 12px; border-radius: var(--radius-md);
  color: var(--muted-foreground); font-weight: 500; font-size: var(--a-t-ui); text-decoration: none; cursor: pointer; white-space: nowrap; }
.nav-item[open] > summary { color: var(--foreground); background: var(--hover); text-decoration: none; }
@media (hover: hover) { .nav-link:hover, .nav-item > summary:hover { color: var(--foreground); background: var(--hover); text-decoration: none; } }
.nav-link[aria-current], .nav-item.is-current > summary, .nav-link.is-current { color: var(--foreground); }
.nav-link[aria-current], .nav-link.is-current { text-decoration: underline; text-decoration-color: var(--primary-strong); text-decoration-thickness: 2px; text-underline-offset: 7px; }
.nav-item { position: static; }
.nav-item > summary { list-style: none; }
.nav-item > summary::-webkit-details-marker { display: none; }
.chev { width: 14px; height: 14px; transition: transform var(--motion-base) var(--motion-ease-out); }
.nav-item[open] > summary .chev, .acc[open] > summary .chev { transform: rotate(180deg); }
.bar-actions { margin-left: auto; display: flex; align-items: center; gap: 8px; }
.menu-toggle { display: none; align-items: center; gap: var(--a-sp-2); min-height: 44px; padding: 0 14px; border: 1px solid var(--s-edge-line); border-radius: var(--radius-md);
  background: transparent; color: var(--foreground); font: inherit; font-weight: 600; font-size: var(--a-t-ui); cursor: pointer; }
.menu-toggle .icon { width: 18px; height: 18px; }
/* the theme switch (ncdai "theme-switcher-1", clean-room, as the app's): three icons in a pill, the chosen one raised */
.theme-switch { display: inline-flex; gap: 2px; padding: 3px; border-radius: var(--radius-full, 999px); border: 1px solid var(--border); background: var(--background); }
.theme-switch button { width: 30px; height: 30px; display: grid; place-items: center; padding: 0; border: 0; border-radius: var(--radius-full, 999px); background: none;
  color: var(--muted-foreground); cursor: pointer; }
.theme-switch button .icon { width: 16px; height: 16px; transition: transform var(--motion-slow) var(--motion-ease-out); }
.theme-switch button[aria-checked="true"] { background: var(--muted); color: var(--foreground); box-shadow: inset 0 0 0 1px var(--border); }
@media (hover: hover) { .theme-switch button:not([aria-checked="true"]):hover { color: var(--foreground); background: var(--hover); } }
@media (hover: hover) and (pointer: fine) {
  .theme-switch [data-theme-set="light"]:hover .icon { transform: rotate(45deg); }
  .theme-switch [data-theme-set="dark"]:hover .icon { transform: rotate(-18deg); }
}
.menu-theme { display: flex; align-items: center; justify-content: space-between; min-height: 56px; padding: 0 var(--a-sp-3); font-weight: 600; font-size: var(--a-t-lg); }

/* the mega menu: one panel under the bar, the features in five groups, each with its icon and a line; Coming soon marked */
.mega { position: absolute; left: 0; right: 0; margin-inline: auto; top: calc(100% - 4px); z-index: 40; width: min(1200px, 100% - 48px); padding: 20px;
  transform-origin: 50% 0;
  border-radius: var(--radius-xl); border: 1px solid var(--border); background: var(--s-menu-bg); box-shadow: var(--shadow-xl); }
.mega-grid { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: var(--a-sp-2) 18px; }
.mega-h { margin: 2px 10px 10px; color: var(--muted-foreground); font-size: var(--a-t-xs); font-weight: 600; line-height: 1.4; }
.mega-group ul { display: grid; gap: 2px; }
.mega-item { display: grid; grid-template-columns: 34px minmax(0, 1fr); gap: 2px 10px; align-items: start; padding: var(--a-sp-2) 10px; border-radius: 14px;
  color: var(--foreground); text-decoration: none; }
@media (hover: hover) { a.mega-item:hover { background: var(--hover); text-decoration: none; } }
.mega-ico { grid-row: span 2; display: grid; place-items: center; width: 34px; height: 34px; border-radius: 10px; background: var(--tile-bg); color: var(--tile-ink);
  box-shadow: inset 0 0 0 1px var(--tile-edge); }
.mega-ico .icon { width: 18px; height: 18px; }
.mega-name { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; font-weight: 600; font-size: var(--a-t-ui); line-height: 1.25; padding-top: 1px; }
.mega-line { display: -webkit-box; overflow: hidden; color: var(--muted-foreground); font-size: var(--a-t-xs); line-height: 1.4; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.mega-item.is-soon { color: var(--muted-foreground); }
.mega-item.is-soon .mega-ico { background: var(--muted); color: var(--muted-foreground); box-shadow: inset 0 0 0 1px var(--border); }
.mega-foot { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px 20px; margin-top: var(--a-sp-4); padding: 14px 10px 0;
  border-top: 1px solid var(--border); color: var(--muted-foreground); font-size: var(--a-t-sm); }
.mega-sm { left: auto; right: auto; width: 420px; margin-left: -120px; padding: var(--a-sp-3); }
.mega-sm ul { display: grid; gap: 2px; }
.mega-sm .mega-item { grid-template-columns: minmax(0, 1fr); }
.nav-uses { position: relative; }
.nav-uses .mega-sm { top: calc(100% + 10px); left: 0; margin-left: 0; }

/* the menu sheet under 1100 px: every link, the features as an accordion (native details), the theme, sign in and Start free */
.menu-sheet { position: fixed; inset: var(--sheet-top, var(--a-bar-h)) 0 0 0; z-index: 39; overflow-y: auto; overscroll-behavior: contain; padding: var(--a-sp-3) var(--a-sp-4) 40px;
  background: var(--background); }
.menu-sheet nav { display: grid; gap: 2px; max-width: 560px; margin-inline: auto; }
.menu-sheet a:not(.btn), .acc > summary { display: flex; align-items: center; justify-content: space-between; gap: var(--a-sp-3); min-height: 52px; padding: 0 var(--a-sp-3);
  border-radius: var(--radius-md); color: var(--foreground); font-weight: 600; font-size: var(--a-t-lg); text-decoration: none; cursor: pointer; }
@media (hover: hover) { .menu-sheet a:not(.btn):hover, .acc > summary:hover { background: var(--hover); } }
.menu-sheet a[aria-current] { color: var(--primary-ink); }
.acc > summary { list-style: none; }
.acc > summary::-webkit-details-marker { display: none; }
.acc-body { display: grid; gap: 14px; padding: var(--a-sp-1) var(--a-sp-1) 14px; }
.acc[open] > .acc-body { animation: lx-rise var(--motion-base) var(--motion-ease-out) both; }
.acc-h { margin: 6px var(--a-sp-2) 0; color: var(--muted-foreground); font-size: var(--a-t-xs); font-weight: 600; }
.acc-body ul { display: grid; gap: 0; }
.menu-sheet .acc-body a:not(.btn) { justify-content: flex-start; min-height: 46px; font-size: var(--a-t-md); font-weight: 500; }
.menu-sheet .acc-body .mega-ico { width: 30px; height: 30px; }
.menu-sheet .acc-body .is-soon { display: flex; align-items: center; gap: var(--a-sp-3); min-height: 46px; padding: 0 var(--a-sp-3); color: var(--muted-foreground); font-weight: 500; }
.menu-sheet .btn { width: 100%; margin-top: var(--a-sp-3); min-height: 52px; }
.menu-open { overflow: hidden; }

/* ==== the footer: on the page's own ground, so the network shows through it ==== */
.foot { margin-top: var(--a-section); padding: 64px 0 var(--a-sp-7); border-top: 1px solid var(--border); color: var(--muted-foreground); font-size: var(--a-t-sm); }
.foot-top { display: grid; grid-template-columns: minmax(0, 1.4fr) repeat(4, minmax(0, 1fr)); gap: var(--a-sp-6); }
.foot-brand .wordmark { font-size: var(--a-t-read); }
.foot-tag { margin-top: 14px; max-width: 24em; color: var(--muted-foreground); line-height: 1.6; }
.foot h2 { margin-bottom: var(--a-sp-3); color: var(--foreground); font-size: var(--a-t-xs); font-weight: 600; letter-spacing: 0; }
@media (max-width: 640px) { .foot h2 { white-space: nowrap; } }
.foot ul { display: grid; gap: 2px; margin: 0; padding: 0; list-style: none; }
.foot-legal { margin-top: 40px; }
.foot-legal ul { display: flex; flex-wrap: wrap; gap: 0 22px; }
.foot a { display: inline-flex; align-items: center; min-height: 32px; color: var(--muted-foreground); text-decoration: none; }
@media (hover: hover) { .foot a:hover { color: var(--foreground); text-decoration: underline; } }
.foot-btn { display: inline-flex; align-items: center; min-height: 32px; padding: 0; border: 0; background: none; color: var(--muted-foreground);
  font: inherit; cursor: pointer; }   /* the feedback popover's opener (shared/js/feedback.js), a link to the eye */
@media (hover: hover) { .foot-btn:hover { color: var(--foreground); text-decoration: underline; } }
.foot-base { display: flex; flex-wrap: wrap; gap: var(--a-sp-2) var(--a-sp-5); margin-top: var(--a-sp-7); padding-top: var(--a-sp-5); border-top: 1px solid var(--border);
  color: var(--muted-foreground); font-size: var(--a-t-xs); }
.foot-social { margin-top: 20px; }
.foot-social h2 { margin: 0 0 var(--a-sp-2); }
.foot-social ul { display: flex; flex-wrap: wrap; gap: 6px; }
.foot-social a { display: inline-grid; place-items: center; width: 44px; height: 44px; min-height: 44px; border-radius: var(--radius-full, 999px);
  color: var(--muted-foreground); background: var(--card); border: 1px solid var(--border); }
.foot-social a:focus-visible { color: var(--primary-ink); border-color: var(--primary-strong); text-decoration: none; }
@media (hover: hover) { .foot-social a:hover { color: var(--primary-ink); border-color: var(--primary-strong); text-decoration: none; } }
.foot-social svg { width: 20px; height: 20px; fill: currentColor; }

/* ==== sections: one rhythm; a head (headline and lead) and a body; every ground clear, so the network shows ======================== */
.sec { position: relative; padding-block: var(--a-section); }
/* one gap between sections (F-polish 2026-11-10, the sweep): the second ground (.tone-2) is transparent since theme v2, so it no longer
   needs its own top and bottom room; it kept both and every tone-2 section sat between two 240 px gaps on 36 pages */
.sec + .sec, .sec + .close, .flow + .close { padding-top: 0; }
.tone-2, .chapter-light { background: transparent; color: var(--foreground); }
.sec-head { display: grid; gap: 16px; max-width: 46rem; margin-bottom: 48px; }
.sec-head.is-split { grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); gap: 40px; align-items: end; max-width: none; }
.sec-head.is-center { margin-inline: auto; text-align: center; justify-items: center; }
.sec-head h2 { max-width: 18em; }
.sec-lead { max-width: 36em; color: var(--muted-foreground); font-size: var(--a-t-md); line-height: 1.6; }
.sec-head.is-center .sec-lead { margin-inline: auto; }
.sec-more { margin-top: var(--a-sp-6); }

/* the head of an inner page: the crumbs, the headline, a lede and the actions */
.page-head { position: relative; isolation: isolate; padding: var(--a-sp-8) 0 64px; }
.page-head h1 { max-width: 18em; margin-top: 16px; }
.page-head .lede { margin-top: 20px; }
.page-head .actions { margin-top: 28px; }
.page-head.is-center { text-align: center; }
.page-head.is-center h1, .page-head.is-center .lede { margin-inline: auto; }
.page-head.is-center .actions, .page-head.is-center .crumbs ol { justify-content: center; }
.crumbs ol { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; color: var(--muted-foreground); font-size: var(--a-t-xs); font-weight: 500; }
.crumbs li + li::before { content: "/"; margin-right: 6px; color: var(--muted-foreground); }
.crumbs a { color: var(--muted-foreground); text-decoration: none; }
@media (hover: hover) { .crumbs a:hover { color: var(--foreground); text-decoration: underline; } }
.crumbs [aria-current] { color: var(--foreground); }
.page-meta { margin-top: 16px; color: var(--muted-foreground); font-size: var(--a-t-xs); }

/* ==== the parts of a section rise once as they come in (the shared line script marks them; visible without it, never in print) ==== */
@media screen {
  .js:root[data-motion="full"] [data-r]:not(.in) { opacity: 0; transform: translateY(28px); }
}


/* ==== the old home's parts other pages still show (the example console's head, lanes, pills, toasts, tiles, the free check's box) ==== */
.check-box { display: flex; gap: var(--a-sp-2); padding: var(--a-sp-2); border-radius: 18px; background: var(--s-glass);
  box-shadow: inset 0 0 0 1px var(--s-edge-line-soft); }
.check-box:focus-within { box-shadow: inset 0 0 0 2px var(--a-lamp); }
.check-box .input { flex: 1; min-width: 0; min-height: 54px; padding-inline: 14px; border-radius: 12px; background: transparent; box-shadow: none; font-size: var(--a-t-read); }
.check-box .input:focus-visible { outline-offset: 0; }
.check-box .btn { min-height: 54px; padding-inline: 22px; }
.scan-live { min-height: 1.55em; margin-top: var(--a-sp-2); color: var(--a-ink-2); font-size: var(--a-t-sm); }
.facts { display: flex; flex-wrap: wrap; gap: 6px 22px; margin-top: 18px; }
.facts li { color: var(--a-ink-2); font-size: var(--a-t-sm); font-weight: var(--a-w-label); }
.k-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 10px; }
.k-title { color: var(--a-ink-2); font-size: var(--a-t-xs); font-weight: var(--a-w-label); }
.k-sub { color: var(--a-ink-2); font-size: var(--a-t-xs); }
.pill:not(.hero-pill) { display: inline-flex; align-items: center; gap: 6px; min-height: 26px; padding: 2px 10px 0; border-radius: var(--a-r-pill); font-size: var(--a-t-2xs);
  font-weight: var(--a-w-head); white-space: nowrap; }
.pill i { width: 7px; height: 7px; border-radius: 50%; background: currentColor; }
.pill.is-down { background: var(--a-fail-strong); color: var(--on-fail); }
.pill.is-ok { background: var(--a-ok-bg); color: var(--a-ok-ink); }
.pill.is-warn { background: var(--a-warn-bg); color: var(--a-warn-ink); }
.rows .host { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: var(--a-w-strong); }
.days { display: block; width: 100%; height: 38px; margin-top: 10px; }
.day-ok { fill: var(--a-ok); }
.lanes { display: grid; gap: 6px; }
.lane { display: grid; grid-template-columns: 40px repeat(14, minmax(0, 1fr)); gap: 3px; align-items: center; color: var(--a-ink-2); font-size: var(--a-t-2xs); font-weight: var(--a-w-head); }
.lane i { height: 14px; border-radius: 3px; background: var(--a-ok); }
.lane i.x { background: var(--a-fail); }
.evid { display: grid; gap: var(--a-sp-1); margin-top: 10px; color: var(--a-ink-2); font-size: var(--a-t-2xs); }
.evid b { color: var(--a-ink); }
.toast { display: grid; grid-template-columns: 34px minmax(0, 1fr); gap: 2px var(--a-sp-3); align-items: start; }
.toast .ico { grid-row: span 2; display: grid; place-items: start center; width: 34px; padding-top: 2px; }
.toast b { font-size: var(--a-t-xs); }
.toast span { color: var(--a-ink-2); font-size: var(--a-t-xs); }
/* the time stamp follows the .toast in the markup (`<div class="toast">…</div><time>`): QA-FINAL 2026-11-04 found `.toast time`
   matching nothing, so the stamp sat as a big line under the words; it sits small in the card's top right corner, beside the title
   (F-polish 2026-11-10, the sweep: this comment had lost its first line on 2026-11-06, which made the rule below part of a selector
   that never matched, so the stamp was a big line under the words again on every feature page) */
.toast time, .toast + time { position: absolute; top: 14px; right: 16px; color: var(--a-ink-3); font-size: var(--a-t-2xs); font-variant-numeric: tabular-nums; }
.card:has(> .toast + time) > .toast { padding-right: 40px; }
.tile { grid-column: span 4; position: relative; display: flex; flex-direction: column; gap: var(--a-sp-3); min-width: 0; padding: var(--a-sp-5); border-radius: var(--radius-xl);
  background: var(--s-tile); box-shadow: var(--s-edge); }
@media (hover: hover) { .tile:hover { box-shadow: var(--s-edge-hover); } }
.tile.w8 { grid-column: span 8; }
.tile h3 { font-size: var(--a-t-title); font-weight: var(--a-w-head); }
.tile h3 a { color: inherit; text-decoration: none; }
.tile h3 a::after { content: ""; position: absolute; inset: 0; border-radius: var(--radius-xl); }
@media (hover: hover) { .tile h3 a:hover { text-decoration: underline; text-decoration-color: var(--a-lamp); text-decoration-thickness: 2px; } }
.tile h3 a:focus-visible::after { outline: 3px solid var(--a-focus); outline-offset: 3px; }
.tile > p { color: var(--a-ink-2); font-size: var(--a-t-sm); line-height: 1.5; max-width: 36em; }
.tile .fv-slot { margin-top: auto; }
.lanes-lg .lane { grid-template-columns: 70px repeat(14, minmax(0, 1fr)); font-size: var(--a-t-xs); }
.lanes-lg .lane i { height: 24px; border-radius: 5px; }
.verdict { display: flex; align-items: center; gap: var(--a-sp-3); margin-top: 18px; padding: 14px var(--a-sp-4); border-radius: 14px; background: var(--a-fail-bg); color: var(--a-fail-ink);
  font-weight: var(--a-w-head); }

/* ==== charts (shared/js/charts.js, the one chart system): direction A's series on the night. Region A is s1, region B s2; status keeps
   its own colours and never colours a series; text never wears a series colour. A chart that shows two series carries its legend. ==== */
:root {
  --viz-1: var(--series-1); --viz-2: var(--series-2); --viz-3: var(--series-3);
  --viz-o1: var(--primary-strong); --viz-o2: var(--series-2); --viz-o3: var(--chart-4); --viz-o4: var(--chart-5); --viz-rest: var(--muted-foreground);
  --viz-ok: var(--ok); --viz-warn: var(--warn); --viz-fail: var(--fail); --viz-none: var(--neutral); --viz-planned: var(--info); --viz-info: var(--info);
  --viz-ok-track: var(--ok-bg); --viz-warn-track: var(--warn-bg); --viz-fail-track: var(--fail-bg);
  --viz-none-track: var(--neutral-bg); --viz-track: var(--muted); --viz-grid: var(--border);
  --viz-axis: var(--muted-foreground); --viz-surface: var(--card); --viz-text: var(--foreground); --viz-text-2: var(--muted-foreground);
}
.viz { margin: 0; display: grid; gap: var(--a-sp-3); min-width: 0; color: var(--viz-text); }
.viz > * { min-width: 0; }
.viz-cap { display: grid; gap: 2px; }
.viz-title { display: flex; flex-wrap: wrap; align-items: center; gap: var(--a-sp-2); font-weight: var(--a-w-strong); font-size: var(--a-t-md); line-height: 1.3; }
.viz-sub { color: var(--viz-text-2); font-size: var(--a-t-sm); }
.viz-example { color: var(--a-ink-3); font-size: var(--a-t-xs); font-weight: var(--a-w-label); }
.viz-body { display: flex; flex-wrap: wrap; align-items: center; gap: var(--a-sp-4) var(--a-sp-5); }
.viz-svg { display: block; width: 100%; height: auto; overflow: visible; }
.viz-ring-svg { width: 132px; flex: none; }
.viz-ring-track { stroke: var(--viz-track); }
.viz-ring-value { fill: var(--viz-text); font-family: var(--a-font); font-size: var(--a-t-figure-sm); font-weight: var(--a-w-display); letter-spacing: -0.02em; }
.viz-ring-label { fill: var(--viz-text-2); font-family: var(--a-font); font-size: var(--a-t-3xs); font-weight: var(--a-w-label); }
.viz-arc { stroke-linecap: butt; }
.tone-ok.viz-arc { stroke: var(--viz-ok); } .tone-warn.viz-arc { stroke: var(--viz-warn); } .tone-fail.viz-arc { stroke: var(--viz-fail); }
.tone-none.viz-arc { stroke: var(--viz-none); } .tone-info.viz-arc { stroke: var(--viz-info); }
.viz-legend { display: flex; flex-wrap: wrap; gap: var(--a-sp-2) var(--a-sp-4); margin: 0; padding: 0; list-style: none; font-size: var(--a-t-sm); }
.viz-body .viz-legend { display: grid; gap: 6px; flex: 1 1 10rem; }
.viz-legend li { display: inline-flex; align-items: center; gap: var(--a-sp-2); min-height: 24px; }
.viz-key { flex: none; width: 10px; height: 10px; border-radius: 3px; background: var(--viz-none); }
.viz-key-line { width: 14px; height: 3px; }
.viz-legend-line .viz-key { width: 16px; height: 3px; }
.viz-key-label { color: var(--viz-text-2); }
.viz-key-value { padding-left: 2px; color: var(--viz-text); font-variant-numeric: tabular-nums; }
.viz-body .viz-key-value { margin-left: auto; padding-left: var(--a-sp-3); }
.viz-key.tone-ok { background: var(--viz-ok); } .viz-key.tone-warn { background: var(--viz-warn); } .viz-key.tone-fail { background: var(--viz-fail); }
.viz-key.tone-info { background: var(--viz-info); } .viz-key.tone-planned { background: var(--viz-planned); }
.viz-key.tone-none { background: repeating-linear-gradient(45deg, var(--viz-none) 0 2px, var(--viz-none-track) 2px 4px); }
.viz-key.s1, .viz-seg.s1 { background: var(--viz-1); } .viz-key.s2, .viz-seg.s2 { background: var(--viz-2); } .viz-key.s3 { background: var(--viz-3); }
.viz-key.o1, .viz-seg.o1 { background: var(--viz-o1); } .viz-key.o2, .viz-seg.o2 { background: var(--viz-o2); }
.viz-key.o3, .viz-seg.o3 { background: var(--viz-o3); } .viz-key.o4, .viz-seg.o4 { background: var(--viz-o4); }
.viz-key.rest, .viz-seg.rest { background: var(--viz-rest); }
.viz-figure { display: flex; align-items: baseline; flex-wrap: wrap; gap: var(--a-sp-1) var(--a-sp-2); margin: 0; }
.viz-big { font-size: var(--a-t-figure); font-weight: var(--a-w-display); line-height: 1.05; letter-spacing: -0.02em; }
.viz-unit { color: var(--viz-text-2); font-size: var(--a-t-sm); }
.viz-stackbar { display: flex; gap: 2px; height: 18px; }
.viz-seg { flex: 0 1 var(--w, 0%); min-width: 3px; background: var(--viz-rest); }
.viz-seg:first-child { border-radius: 4px 0 0 4px; } .viz-seg:last-child { border-radius: 0 4px 4px 0; }
.viz-meter-track { position: relative; height: 12px; margin-block: var(--a-sp-2) var(--a-sp-5); border-radius: var(--a-r-pill); background: var(--viz-none-track); }
.viz-meter-track.tone-ok { background: var(--viz-ok-track); } .viz-meter-track.tone-warn { background: var(--viz-warn-track); }
.viz-meter-track.tone-fail { background: var(--viz-fail-track); }
.viz-meter-fill { position: absolute; inset: 0; border-radius: var(--a-r-pill); background: var(--viz-none); transform-origin: left center; transform: scaleX(var(--fill, 0)); }
.tone-ok > .viz-meter-fill { background: var(--viz-ok); } .tone-warn > .viz-meter-fill { background: var(--viz-warn); } .tone-fail > .viz-meter-fill { background: var(--viz-fail); }
.viz-meter-mark { position: absolute; top: -4px; bottom: -4px; left: var(--at); width: 2px; }
.viz-meter-mark::before { content: ""; position: absolute; inset: 0; border-radius: 1px; background: var(--viz-text); }
.viz-meter-mark-label { position: absolute; top: calc(100% + 2px); left: 50%; transform: translateX(-50%); color: var(--viz-text-2); font-size: var(--a-t-2xs); white-space: nowrap; }
.viz-scale { display: flex; justify-content: space-between; margin: 0; color: var(--viz-axis); font-size: var(--a-t-2xs); font-variant-numeric: tabular-nums; }
.viz-means { margin: 0; color: var(--viz-text-2); font-size: var(--a-t-sm); line-height: 1.5; }
.viz-means strong { color: var(--viz-text); }
.viz-data { font-size: var(--a-t-sm); }
.viz-data summary { display: inline-flex; align-items: center; min-height: 32px; color: var(--a-lamp-ink); font-weight: var(--a-w-label); cursor: pointer; }
.viz-table-wrap { overflow: auto; max-height: 16rem; }
.viz-table { border-collapse: collapse; min-width: 100%; font-variant-numeric: tabular-nums; }
.viz-table th, .viz-table td { padding: var(--a-sp-1) var(--a-sp-3) var(--a-sp-1) 0; border-bottom: 1px solid var(--a-line); text-align: left; white-space: nowrap; }
.viz-table thead th { color: var(--viz-text-2); font-size: var(--a-t-xs); font-weight: var(--a-w-label); }
.viz-plot { position: relative; }
.viz-plot .viz-svg:focus-visible { outline: 3px solid var(--a-focus); outline-offset: 4px; }
.viz-grid line { stroke: var(--viz-grid); stroke-width: 1; shape-rendering: crispEdges; }
.viz-axis text { fill: var(--viz-axis); font-family: var(--a-font); font-size: calc(var(--a-t-2xs) * var(--viz-u, 1)); font-variant-numeric: tabular-nums; }
.viz-line { stroke-width: 2.2; stroke-linejoin: round; stroke-linecap: round; stroke: var(--viz-1); }
.viz-line.s2 { stroke: var(--viz-2); } .viz-line.s3 { stroke: var(--viz-3); }
.viz-area { fill: var(--viz-1); opacity: 0.14; } .viz-area.s2 { fill: var(--viz-2); }
.viz-cross { stroke: var(--viz-axis); stroke-width: 1; }
.viz-dot { fill: var(--viz-1); stroke: var(--viz-surface); stroke-width: 2; } .viz-dot.s2 { fill: var(--viz-2); } .viz-dot.s3 { fill: var(--viz-3); }
.viz-spark { display: inline-block; vertical-align: middle; overflow: visible; }
.viz-spark .viz-line { stroke-width: 1.75; } .viz-spark.s2 .viz-line { stroke: var(--viz-2); } .viz-spark .viz-dot { stroke-width: 1.5; } .viz-spark.s2 .viz-dot { fill: var(--viz-2); }
.viz-day.tone-ok { fill: var(--viz-ok); } .viz-day.tone-warn { fill: var(--viz-warn); } .viz-day.tone-fail { fill: var(--viz-fail); } .viz-day.tone-planned { fill: var(--viz-planned); }
.viz-day.is-read { stroke: var(--viz-text); stroke-width: 1.5; }
.viz-hatch-bg { fill: var(--viz-none-track); } .viz-hatch-line { stroke: var(--viz-none); stroke-width: 1.5; }
.viz-days-svg { height: 64px; }
.viz-tip { position: absolute; top: 0; left: 0; z-index: 2; display: grid; gap: 2px; min-width: 9rem; padding: var(--a-sp-2) var(--a-sp-3); border-radius: 10px; background: var(--s-tip-bg); color: var(--s-tip-ink);
  box-shadow: var(--a-shadow-pop); font-size: var(--a-t-sm); pointer-events: none; transform: translateX(calc(var(--tx, 0px) + 14px)); }
.viz-tip.flip { transform: translateX(calc(var(--tx, 0px) - 100% - 14px)); }
.viz-tip[hidden] { display: none; }
.viz-tip-when { color: var(--s-tip-ink-2); font-size: var(--a-t-xs); font-weight: var(--a-w-label); }
.viz-tip-row { display: flex; align-items: center; gap: 6px; }
.viz-tip-row strong { font-variant-numeric: tabular-nums; }
.viz-zone { display: grid; gap: 6px; }
.viz-zone-head { display: flex; justify-content: space-between; gap: var(--a-sp-2); font-size: var(--a-t-xs); }
.viz-zone-title { color: var(--viz-text-2); }
.viz-zone-value { font-weight: var(--a-w-strong); font-variant-numeric: tabular-nums; }
.viz-zone-word { color: var(--viz-text-2); font-weight: var(--a-w-label); }
.viz-zone-track { position: relative; display: flex; gap: 3px; height: 8px; }
.viz-zone-part { border-radius: 3px; }
.viz-zone-part.tone-ok { background: var(--s-zone-ok); } .viz-zone-part.tone-warn { background: var(--s-zone-warn); } .viz-zone-part.tone-fail { background: var(--s-zone-fail); }
.viz-zone-mark { position: absolute; top: -4px; left: var(--at); width: 4px; height: 16px; margin-left: -2px; border-radius: 2px; background: var(--viz-text); box-shadow: 0 0 0 2px var(--s-zone-edge); }
.viz-end { fill: var(--viz-text); font-family: var(--a-font); font-size: var(--a-t-2xs); font-weight: var(--a-w-strong); }
.viz-end-name { fill: var(--viz-text-2); font-family: var(--a-font); font-size: var(--a-t-3xs); }
.viz-end-value { fill: var(--viz-text); font-family: var(--a-font); font-size: var(--a-t-2xs); font-weight: var(--a-w-strong); font-variant-numeric: tabular-nums; }
.viz-marks line { stroke: var(--viz-axis); stroke-dasharray: 2 3; }
.viz-grid-top { stroke: var(--viz-grid); }
.viz-strip { display: block; width: 100%; height: 34px; }
.viz-mini { display: block; width: 100%; height: auto; }
@keyframes viz-turn { from { opacity: 0; transform: rotate(-40deg) scale(var(--enter-scale)); } }
.viz-ring-arcs.viz-in { transform-box: view-box; transform-origin: 60px 60px; animation: viz-turn var(--dur-scene) var(--ease-enter) both; }
.viz-stackbar.viz-in .viz-seg { transform-origin: left center; animation: lx-draw var(--dur-scene) var(--ease-enter) both; animation-delay: calc(var(--stagger) * var(--i, 0)); }
.viz-meter-fill.viz-in { animation: lx-draw var(--dur-scene) var(--ease-enter) both; }
.viz-clip { transform-box: fill-box; transform-origin: left center; animation: lx-draw var(--dur-scene) var(--ease-enter) both; }
.viz-grow { transform-box: fill-box; transform-origin: center bottom; animation: lx-draw-y var(--dur-scene) var(--ease-enter) both; }
@media (forced-colors: active) { .viz-seg, .viz-meter-fill, .viz-key { forced-color-adjust: none; } }

/* ==== the feature visuals (site/js/feature-visuals.js): one small picture per feature, example data, glass on the night ======== */
.fv-slot { display: grid; gap: var(--a-sp-3); min-width: 0; }
.fv-slot:empty { display: none; }
.js .fv-slot:empty { display: block; min-height: var(--fv-h, 120px); }
.js .fv-slot[data-fv~="uptime"] { --fv-h: 440px; }
.js .fv-slot[data-fv="ssl"], .js .fv-slot[data-fv="domain"] { --fv-h: 200px; }
.js .fv-slot[data-fv="dns"], .js .fv-slot[data-fv="why"], .js .fv-slot[data-fv="alerts"] { --fv-h: 190px; }
.js .fv-slot[data-fv="status"], .js .fv-slot[data-fv="vitals"], .js .fv-slot[data-fv="report"] { --fv-h: 170px; }
/* the picture in the head of a feature or segment page is above the fold: its slot keeps the height of the picture it will hold before
   and after the module draws it, so nothing on the first screen moves (Lighthouse 2026-11-04: CLS 0.52 on a phone when the home's
   tile heights were reserved here; measured heights of each picture at 375, 768, 1100 and 1440 px, rounded up) */
.fp-visual .fv-slot, .fp-visual .fv-slot:empty { display: grid; align-content: center; min-height: var(--fp-h, 0px); }
@media (scripting: none) { .fp-visual .fv-slot:empty { display: none; } }   /* no script, no picture: no empty room either */
.fp-visual .fv-slot[data-fv="uptime"] { --fp-h: 186px; } .fp-visual .fv-slot[data-fv="ssl"] { --fp-h: 182px; }
.fp-visual .fv-slot[data-fv="domain"] { --fp-h: 206px; } .fp-visual .fv-slot[data-fv="dns"] { --fp-h: 146px; }
.fp-visual .fv-slot[data-fv="heartbeat"] { --fp-h: 144px; } .fp-visual .fv-slot[data-fv="alerts"] { --fp-h: 240px; }
.fp-visual .fv-slot[data-fv="why"] { --fp-h: 172px; } .fp-visual .fv-slot[data-fv="status"] { --fp-h: 244px; }
.fp-visual .fv-slot[data-fv="report"] { --fp-h: 156px; } .fp-visual .fv-slot[data-fv="portal"] { --fp-h: 232px; }
.fp-visual .fv-slot[data-fv="security"] { --fp-h: 230px; }
@media (max-width: 640px) {
  .fp-visual .fv-slot[data-fv="uptime"] { --fp-h: 178px; } .fp-visual .fv-slot[data-fv="ssl"] { --fp-h: 174px; }
  .fp-visual .fv-slot[data-fv="domain"] { --fp-h: 200px; } .fp-visual .fv-slot[data-fv="dns"] { --fp-h: 184px; }
  .fp-visual .fv-slot[data-fv="heartbeat"] { --fp-h: 148px; } .fp-visual .fv-slot[data-fv="alerts"] { --fp-h: 302px; }
  .fp-visual .fv-slot[data-fv="why"] { --fp-h: 288px; } .fp-visual .fv-slot[data-fv="status"] { --fp-h: 246px; }
  .fp-visual .fv-slot[data-fv="report"] { --fp-h: 174px; } .fp-visual .fv-slot[data-fv="portal"] { --fp-h: 308px; }
  .fp-visual .fv-slot[data-fv="security"] { --fp-h: 234px; }
}
/* the picture sits in its card under a rule, never in a second card of its own (SITE-NOSLOP 2026-11-05: card in card) */
.fv { position: relative; display: grid; gap: 10px; min-width: 0; margin: var(--a-sp-2) 0 0; padding: 0; color: var(--a-ink);
  font-size: var(--a-t-sm); line-height: 1.35; container-type: inline-size; }
.fv-cap { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 6px 10px; }
.fv-title { color: var(--a-ink-2); font-size: var(--a-t-xs); font-weight: var(--a-w-label); }
.fv-tag { color: var(--a-ink-3); font-size: var(--a-t-xs); font-weight: var(--a-w-label); }
.fv .icon { width: 16px; height: 16px; flex: none; }
.fv .glyph { width: 14px; height: 14px; flex: none; }
.fv p, .fv ol, .fv ul, .fv dl { margin: 0; }
.fv ol, .fv ul { padding: 0; list-style: none; }
.fv-note, .fv-alert { display: flex; align-items: center; gap: var(--a-sp-2); color: var(--a-ink-2); font-size: var(--a-t-xs); font-weight: var(--a-w-label); }
.fv-alert b { color: var(--a-fail-ink); }
.fv-pill { display: inline-flex; align-items: center; min-height: 22px; padding: 2px 9px 0; border-radius: var(--a-r-pill); background: var(--a-warn-bg); color: var(--a-warn-ink);
  font-size: var(--a-t-3xs); font-weight: var(--a-w-head); white-space: nowrap; }
.fv-pill.is-ok, .is-ok > .fv-pill { background: var(--a-ok-bg); color: var(--a-ok-ink); }
.fv-key { display: inline-block; width: 10px; height: 10px; flex: none; border-radius: 3px; background: var(--viz-ok); }
.fv-key.tone-warn { background: var(--viz-warn); } .fv-key.tone-fail { background: var(--viz-fail); } .fv-key.tone-planned { background: var(--viz-planned); }
.fv-keys { display: flex; flex-wrap: wrap; gap: var(--a-sp-1) 14px; color: var(--a-ink-2); font-size: var(--a-t-xs); }
.fv-keys li { display: inline-flex; align-items: center; gap: 6px; }
.fv-big { display: flex; align-items: baseline; flex-wrap: wrap; gap: var(--a-sp-1) 10px; }
.fv-big strong { font-size: clamp(1.75rem, 2.6vw, 2.25rem); font-weight: var(--a-w-display); line-height: 1; letter-spacing: -0.03em; font-variant-numeric: tabular-nums; }
.fv-big span, .fv-scale { color: var(--a-ink-2); font-size: var(--a-t-xs); }
.fv-scale { display: flex; justify-content: space-between; margin-top: calc(-1 * var(--a-sp-1)); font-variant-numeric: tabular-nums; }
.fv .viz-strip { height: 34px; }
.fv .viz { gap: 6px; }
.fv .viz-cap { display: none; }
.fv .viz-big { font-size: clamp(1.75rem, 2.6vw, 2.25rem); }
.fv .viz-meter-track { margin-block: 6px 22px; height: 10px; }
.fv-meter--domain .viz-figure { display: none; }
.fv-countdown { display: flex; align-items: baseline; gap: 10px; }
.fv-count { display: inline-block; min-width: var(--count-w, 2ch); font-size: clamp(2.25rem, 3.4vw, 2.875rem); font-weight: var(--a-w-display); line-height: 1; letter-spacing: -0.03em;
  font-variant-numeric: tabular-nums; text-align: right; }
.fv-countdown span { max-width: 9em; color: var(--a-ink-2); font-size: var(--a-t-xs); font-weight: var(--a-w-label); line-height: 1.3; }
.fv-line { position: relative; display: grid; gap: var(--a-sp-3); }
.fv-line li { position: relative; display: grid; grid-template-columns: 44px 14px minmax(0, 1fr); gap: 10px; align-items: center; font-size: var(--a-t-xs); }
.fv-line li::before { content: ""; grid-column: 2; grid-row: 1; width: 12px; height: 12px; border-radius: 50%; box-shadow: inset 0 0 0 3px var(--a-planned); }
.fv-line li:not(:last-child)::after { content: ""; position: absolute; left: 59px; top: calc(50% + 8px); width: 2px; height: calc(100% - 4px); background: var(--a-line-2); }
.fv-line time { grid-column: 1; grid-row: 1; color: var(--a-ink-3); font-weight: var(--a-w-label); font-variant-numeric: tabular-nums; }
.fv-line li > span { grid-column: 3; grid-row: 1; min-width: 0; }
.fv-line .ml-regional::before { box-shadow: inset 0 0 0 3px var(--a-warn); }
.fv-line .ml-down::before { background: var(--a-fail); box-shadow: none; }
.fv-line s { color: var(--a-fail-ink); text-decoration-thickness: 2px; font-family: var(--a-mono); font-size: var(--a-t-xs); }
.fv-line code { padding: 1px 6px; border-radius: 6px; background: var(--a-ok-bg); color: var(--a-ok-ink); font-family: var(--a-mono); font-size: var(--a-t-xs); }
.fv-hops { display: grid; gap: 6px; }
.fv-hops li { display: flex; align-items: center; gap: var(--a-sp-2); min-width: 0; padding: 6px var(--a-sp-2); border-radius: 10px; background: var(--a-surface-2); box-shadow: inset 0 0 0 1px var(--a-line); }
.fv-hops li + li { margin-left: 14px; }
.fv-hops .is-new { box-shadow: inset 0 0 0 2px var(--a-lamp); }
.fv-code { flex: none; min-width: 38px; padding: 2px 6px 1px; border-radius: 6px; background: var(--a-surface-3); font-family: var(--a-mono); font-size: var(--a-t-2xs); font-weight: var(--a-w-strong); text-align: center; }
.fv-code.is-ok { background: var(--a-ok-bg); color: var(--a-ok-ink); }
.fv-url { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: var(--a-mono); font-size: var(--a-t-xs); }
.fv-flag { margin-left: auto; padding: 2px var(--a-sp-2) 0; border-radius: var(--a-r-pill); background: var(--a-lamp); color: var(--a-on-lamp); font-size: var(--a-t-3xs); font-weight: var(--a-w-head); }
.fv-diff { display: grid; gap: 6px; }
.fv-diff code { display: block; padding: 6px 10px; border-radius: 10px; font-family: var(--a-mono); font-size: var(--a-t-xs); overflow-wrap: anywhere; }
.fv-diff .was { background: var(--a-fail-bg); color: var(--a-fail-ink); text-decoration: line-through; text-decoration-thickness: 2px; }
.fv-diff .now { background: var(--a-surface-2); box-shadow: inset 0 0 0 1px var(--a-line); color: var(--a-ink); }
.fv-ticks { display: flex; flex-wrap: wrap; gap: 6px; }
.fv-ticks li { padding: 3px 10px 2px; border-radius: var(--a-r-pill); background: var(--a-surface-3); font-size: var(--a-t-xs); font-weight: var(--a-w-strong); }
.fv-ticks .is-alert { background: var(--a-fail-strong); color: var(--on-fail); }
.fv-beat { display: block; width: 100%; height: auto; overflow: visible; }
.fv-beat-ok { fill: none; stroke: var(--viz-ok); stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.fv-beat-gap { fill: none; stroke: var(--viz-none); stroke-width: 2; stroke-dasharray: 3 5; stroke-linecap: round; }
.fv-beat-alert { fill: var(--viz-fail); transform-box: fill-box; transform-origin: center; }
.fv-beat-time { fill: var(--viz-axis); font-family: var(--a-font); font-size: var(--a-t-3xs); font-variant-numeric: tabular-nums; }
.fv-chat { display: grid; gap: var(--a-sp-2); }
.fv-q, .fv-a { max-width: 30rem; padding: 9px 13px; border-radius: 14px; line-height: 1.4; }
.fv-q { justify-self: end; background: var(--a-lamp); color: var(--a-on-lamp); border-bottom-right-radius: 4px; font-weight: var(--a-w-label); }
.fv-a { justify-self: start; background: var(--a-surface-2); color: var(--a-ink); border-bottom-left-radius: 4px; box-shadow: inset 0 0 0 1px var(--a-line); }
.fv-tool { justify-self: start; display: inline-flex; align-items: center; gap: 6px; padding: 3px 10px 2px; border-radius: var(--a-r-pill); background: var(--a-surface-2);
  color: var(--a-ink-2); box-shadow: inset 0 0 0 1px var(--a-line); font-size: var(--a-t-xs); }
.fv-tool code { padding: 0; background: none; color: var(--a-ink); font-family: var(--a-mono); }
.fv-stack { display: grid; gap: var(--a-sp-2); }
.fv-note-card { display: grid; grid-template-columns: 18px minmax(0, 1fr); gap: 2px 10px; align-items: start; padding: 10px var(--a-sp-3); border-radius: 12px; background: var(--a-surface-2);
  color: var(--a-ink); box-shadow: inset 0 0 0 1px var(--a-line); }
.fv-note-card .icon { grid-row: span 2; margin-top: 2px; color: var(--a-fail-ink); }
.fv-where { display: flex; justify-content: space-between; gap: var(--a-sp-2); font-size: var(--a-t-xs); }
.fv-where time, .fv-what { color: var(--a-ink-2); font-size: var(--a-t-xs); font-variant-numeric: tabular-nums; }
.fv-sign { display: flex; align-items: center; gap: var(--a-sp-2); padding: var(--a-sp-2) var(--a-sp-3); border-radius: 10px; background: var(--a-ok-bg); color: var(--a-ok-ink); font-weight: var(--a-w-strong); }
.fv-sign--quiet { background: var(--a-surface-3); color: var(--a-ink); }
.fv-sites { display: grid; gap: 10px; }
.fv-site { display: flex; justify-content: space-between; gap: var(--a-sp-2); margin-bottom: var(--a-sp-1); font-size: var(--a-t-xs); }
.fv-site span { color: var(--a-ink-2); font-variant-numeric: tabular-nums; }
.fv-sites .viz-strip { height: 20px; }
.fv-rows { display: grid; gap: 6px; }
.fv-rows li { display: grid; grid-template-columns: 14px minmax(0, 1fr) auto; align-items: center; gap: var(--a-sp-2); padding: 7px 10px; border-radius: 10px; background: var(--a-surface-2);
  box-shadow: inset 0 0 0 1px var(--a-line); font-size: var(--a-t-xs); }
.fv-rows b { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: var(--a-mono); font-weight: var(--a-w-label); }
.fv-rows span { color: var(--a-ink-2); white-space: nowrap; }
.fv-rows .is-down { background: var(--a-fail-bg); box-shadow: inset 0 0 0 1px var(--a-fail); }
.fv-rows .is-down .glyph { color: var(--a-fail-ink); } .fv-rows .is-regional .glyph { color: var(--a-warn-ink); } .fv-rows .is-steady .glyph { color: var(--a-ok-ink); }
.fv-kpis { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--a-sp-2); }
.fv-kpis > div { padding: 10px; border-radius: 12px; background: var(--a-surface-2); box-shadow: inset 0 0 0 1px var(--a-line); }
.fv-kpis dt { color: var(--a-ink-2); font-size: var(--a-t-2xs); font-weight: var(--a-w-label); }
.fv-kpis dd { margin: var(--a-sp-1) 0 0; font-size: var(--a-t-title); font-weight: var(--a-w-display); line-height: 1.05; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; }
.fv-kpis small { display: block; margin-top: 2px; color: var(--a-ink-2); font-size: var(--a-t-xs); font-weight: var(--a-w-label); letter-spacing: 0; }
.fv-chain { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; }
.fv-chain li { position: relative; display: grid; align-content: start; gap: 2px; padding: 9px 10px; border-radius: 12px; background: var(--a-surface-2); box-shadow: inset 0 0 0 1px var(--a-line); font-size: var(--a-t-xs); }
.fv-chain li:not(:last-child)::after { content: ""; position: absolute; top: 50%; right: -9px; width: 8px; height: 2px; background: var(--a-line-2); }
.fv-chain time { font-weight: var(--a-w-strong); font-variant-numeric: tabular-nums; }
.fv-kind { color: var(--a-ink-2); font-size: var(--a-t-2xs); font-weight: var(--a-w-label); }
.fv-chain .is-cause { background: var(--a-lamp); color: var(--a-on-lamp); box-shadow: none; }
.fv-chain .is-cause :is(.fv-kind, .fv-conf) { color: var(--s-on-lamp-2); }
.fv-ruled { display: flex; flex-wrap: wrap; gap: 6px; }
.fv-zones { display: grid; gap: var(--a-sp-3); }
.fv-findings { display: grid; gap: 6px; }
.fv-findings li { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 2px var(--a-sp-2); align-items: center; padding: 7px 10px; border-radius: 10px; background: var(--a-surface-2);
  box-shadow: inset 0 0 0 1px var(--a-line); font-size: var(--a-t-xs); }
.fv-findings li > span:last-child { grid-column: 2; color: var(--a-ink-2); }
.fv-findings--tight li { grid-template-columns: 10px minmax(0, 1fr) auto; }
.fv-findings--tight li > span:last-child { grid-column: auto; font-variant-numeric: tabular-nums; }
@container (max-width: 440px) { .fv-chain { grid-template-columns: repeat(2, minmax(0, 1fr)); } .fv-chain li:nth-child(2)::after { display: none; } .fv-kpis dd { font-size: var(--a-t-read); } }
@container (max-width: 380px) { .fv-rows li { grid-template-columns: 14px minmax(0, 1fr); row-gap: 0; } .fv-rows li > span { grid-column: 2; white-space: normal; } }
@media screen { .js:root[data-motion="full"] .fv-slot:not(.is-on) .fv { opacity: 0; transform: translateY(var(--move-lg)) scale(var(--enter-scale)); } }
.js:root[data-motion="full"] .fv-slot .fv { transition: opacity var(--dur-enter) var(--ease-enter), transform var(--dur-scene) var(--ease-enter); }
.fv-slot .fv:nth-child(2) { transition-delay: calc(var(--stagger) * 2); }
.fv-slot:not(.is-on) :is(.viz-in, .viz-clip, .viz-grow) { animation-play-state: paused; }

/* ==== the free check's result (site/js/scan.js) and the report above its rows (site/js/scan-report.js) ======================== */
.scan-home:not([hidden]) { padding-block: var(--a-sp-7) 72px; background: var(--a-ground-2); box-shadow: inset 0 1px 0 var(--a-line); }
.scan-home > .sc-wrap, .results-sec > .sc-wrap { width: min(1240px, 100% - 48px); margin-inline: auto; }
.sc-wrap { display: grid; gap: var(--a-sp-5); }
.sc-steps { display: grid; gap: var(--a-sp-2); margin: 0; padding: var(--a-sp-4) 20px; border-radius: var(--a-r-card); background: var(--a-surface-2); box-shadow: var(--a-edge); list-style: none; }
.sc-step { display: grid; grid-template-columns: 22px minmax(0, 1fr) auto; align-items: center; gap: var(--a-sp-3); color: var(--a-ink-3); font-size: var(--a-t-sm); }
.sc-step-mark { justify-self: center; width: 14px; height: 14px; border-radius: 50%; box-shadow: inset 0 0 0 2px var(--a-line-2); }
.sc-step.is-on { color: var(--a-ink); font-weight: var(--a-w-label); }
.sc-step.is-on .sc-step-mark { box-shadow: inset 0 0 0 4px var(--a-s1); animation: lx-stop var(--dur-enter) var(--ease-enter) both; }
.sc-step.is-done { color: var(--a-ink-2); }
.sc-step.is-done .sc-step-mark { background: var(--a-ok); box-shadow: none; animation: lx-stop var(--dur-enter) var(--ease-enter) both; }
.sc-step-time { color: var(--a-ink-3); font-size: var(--a-t-xs); font-variant-numeric: tabular-nums; }
.sc-sum { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: var(--a-sp-3) var(--a-sp-5); padding-bottom: var(--a-sp-4); border-bottom: 1px solid var(--a-line); }
.sc-sum-head { display: grid; gap: var(--a-sp-1); min-width: 0; }
.sc-sum h2 { font-size: var(--a-t-2xl); letter-spacing: -0.02em; overflow-wrap: anywhere; }
.sc-verdict { color: var(--a-ink-2); font-size: var(--a-t-md); font-weight: var(--a-w-label); }
.sc-counts { display: flex; flex-wrap: wrap; gap: var(--a-sp-2); list-style: none; }
.sc-count { display: inline-flex; align-items: center; min-height: 28px; padding: 3px 11px 1px; border-radius: var(--a-r-pill); font-size: var(--a-t-sm); font-weight: var(--a-w-strong); }
.sc-count.fail { background: var(--a-fail-strong); color: var(--on-fail); }
.sc-count.warn { background: var(--a-warn-bg); color: var(--a-warn-ink); }
.sc-count.ok { background: var(--a-ok-bg); color: var(--a-ok-ink); }
.sc-count.info { background: var(--a-surface-2); color: var(--a-ink-2); box-shadow: var(--a-edge); }
.sc-count.unavailable { background: var(--a-unknown-bg); color: var(--a-ink-2); }
.sc-rows-title { margin-top: var(--a-sp-4); font-size: var(--a-t-lg); }
.sc-rows { display: grid; gap: var(--a-sp-2); list-style: none; }
.sc-row { display: grid; grid-template-columns: minmax(0, 4fr) minmax(0, 7fr); gap: var(--a-sp-3) var(--a-sp-6); padding: 22px var(--a-sp-5); border-radius: var(--a-r-card); background: var(--s-tile);
  box-shadow: var(--s-edge); }
.js .sc-row.hidden-row { opacity: 0; transform: translateY(var(--move-md)); }
.sc-row.pending { opacity: 0.72; }
.sc-title h3 { font-size: var(--a-t-lg); }
.sc-state { display: inline-flex; align-items: center; gap: 7px; margin-top: var(--a-sp-2); font-weight: var(--a-w-strong); font-size: var(--a-t-sm); }
.sc-row[data-state="ok"] .sc-state { color: var(--a-ok-ink); }
.sc-row[data-state="warn"] .sc-state { color: var(--a-warn-ink); }
.sc-row[data-state="fail"] .sc-state { color: var(--a-fail-ink); }
.sc-row[data-state="unavailable"] .sc-state, .sc-row[data-state="waiting"] .sc-state { color: var(--a-ink-3); }
.sc-row[data-state="info"] .sc-state { color: var(--a-ink-2); }
.sc-head { font-weight: var(--a-w-label); }
.sc-facts { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: var(--a-sp-1) var(--a-sp-4); margin-top: var(--a-sp-3); font-size: var(--a-t-sm); }
.sc-facts div { display: contents; }
.sc-facts dt { color: var(--a-ink-2); }
.sc-facts dd { margin: 0; font-family: var(--a-mono); font-size: var(--a-t-xs); overflow-wrap: anywhere; }
.sc-why { margin-top: var(--a-sp-3); color: var(--a-ink-2); font-size: var(--a-t-sm); }
.sc-why strong { color: var(--a-ink); }
.sc-next { display: inline-flex; align-items: center; min-height: 44px; margin-top: var(--a-sp-2); font-weight: var(--a-w-label); font-size: var(--a-t-sm); }
.sc-limits { color: var(--a-ink-2); }
.sc-rows > .sc-row, .sc-counts > li { animation: lx-rise var(--dur-enter) var(--ease-enter) both; animation-delay: calc(var(--stagger) * var(--i, 0)); }
.sc-rows > .sc-row:nth-child(2) { --i: 1; } .sc-rows > .sc-row:nth-child(3) { --i: 2; } .sc-rows > .sc-row:nth-child(4) { --i: 3; }
.sc-rows > .sc-row:nth-child(5) { --i: 4; } .sc-rows > .sc-row:nth-child(6) { --i: 5; } .sc-rows > .sc-row:nth-child(n+7) { --i: 6; }
.scr { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: var(--a-sp-3); }
.scr-tile { grid-column: span 2; display: grid; align-content: start; gap: var(--a-sp-3); min-width: 0; padding: 22px; border-radius: var(--a-r-card); background: var(--s-tile); box-shadow: var(--s-edge); }
.scr-tile > * { min-width: 0; }
.scr-timing { grid-column: span 4; }
.scr-n1 .scr-tile, .scr-n2 .scr-tile { grid-column: span 3; }
.scr-n1 .scr-tile:only-child { grid-column: 1 / -1; }
.scr-hoplist { display: grid; gap: var(--a-sp-2); margin: 0; padding: 0; list-style: none; }
.scr-hop { position: relative; display: flex; align-items: center; gap: var(--a-sp-2); min-width: 0; padding-left: 22px; }
.scr-hop::before { content: ""; position: absolute; left: 4px; top: 50%; width: 10px; height: 10px; border: 2px solid var(--a-ink-2); border-radius: 50%; background: var(--a-ground); transform: translateY(-50%); }
.scr-hop:not(:last-child)::after { content: ""; position: absolute; left: 8px; top: calc(50% + 7px); width: 2px; height: calc(100% - 6px); background: var(--a-line-2); }
.scr-hop.is-final::before { border-color: var(--a-lamp); background: var(--a-lamp); }
.scr-code { flex: none; min-width: 3.2em; padding: 2px 6px 0; border-radius: 6px; background: var(--a-surface-3); color: var(--a-ink); font-family: var(--a-mono); font-size: var(--a-t-xs); font-weight: var(--a-w-label); text-align: center; }
.scr-code.is-ok { background: var(--a-ok-bg); color: var(--a-ok-ink); }
.scr-code.is-bad { background: var(--a-fail-bg); color: var(--a-fail-ink); }
.scr-url { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--a-ink-2); font-family: var(--a-mono); font-size: var(--a-t-xs); }
.scr-checklist { display: grid; gap: var(--a-sp-1); margin: 0; padding: 0; list-style: none; font-size: var(--a-t-xs); }
.scr-checklist li { display: flex; align-items: center; gap: var(--a-sp-2); min-width: 0; }
.scr-checklist code { overflow-wrap: anywhere; }
.scr-tick { flex: none; width: 10px; height: 10px; border-radius: 2px; background: var(--viz-none-track); box-shadow: inset 0 0 0 1.5px var(--viz-none); }
.scr-checklist .is-on .scr-tick { background: var(--viz-ok); box-shadow: none; }
.scr-checklist .is-off { color: var(--a-ink-2); }
/* the band of what an account adds: example data behind a blur, one card with the one button */
.lock { position: relative; isolation: isolate; overflow: hidden; margin-top: var(--a-sp-5); padding: var(--a-sp-6) var(--a-sp-5) var(--a-sp-5); border-radius: var(--radius-xl); background: var(--a-surface-2);
  color: var(--a-ink); box-shadow: var(--a-edge-2); }
.lock-head { max-width: 46rem; }
.lock-note { margin: 0; color: var(--a-ink-2); font-size: var(--a-t-sm); }
.lock-note strong { color: var(--a-ink); }
.lock-stage { position: relative; display: grid; margin-top: var(--a-sp-4); }
.lock-grid { grid-area: 1 / 1; display: grid; grid-template-columns: minmax(0, 7fr) minmax(0, 5fr); gap: var(--a-sp-3); filter: blur(5px) saturate(1.1); opacity: 0.8; user-select: none; pointer-events: none; }
.lock-tile { min-width: 0; padding: var(--a-sp-4); border-radius: var(--a-r-card); background: var(--a-surface); }
.lock-wide { grid-row: span 3; }
.lock-feed { display: grid; gap: 6px; margin: var(--a-sp-2) 0 0; padding: 0; list-style: none; font-size: var(--a-t-sm); }
.lock-feed li { display: flex; align-items: baseline; gap: var(--a-sp-3); }
.lock-feed li::before { content: ""; flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--a-ink-3); }
.lock-feed .is-down::before { background: var(--a-fail); } .lock-feed .is-look::before { background: var(--a-warn); } .lock-feed .is-up::before { background: var(--a-ok); }
.lock-feed time { color: var(--a-ink-2); font-variant-numeric: tabular-nums; }
.lock-kpis { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--a-sp-2); margin: var(--a-sp-2) 0 0; }
.lock-kpis dt { color: var(--a-ink-2); font-size: var(--a-t-xs); }
.lock-kpis dd { margin: 0; font-size: var(--a-t-lg); font-weight: var(--a-w-strong); }
.lock-card { grid-area: 1 / 1; z-index: 1; align-self: center; justify-self: center; display: grid; gap: var(--a-sp-3); width: min(30rem, 100%); margin: var(--a-sp-5) 0; padding: var(--a-sp-5) var(--a-sp-6);
  border-radius: var(--radius-xl); background: var(--s-lock-bg); box-shadow: var(--a-shadow-pop); -webkit-backdrop-filter: var(--a-glass); backdrop-filter: var(--a-glass); }
.lock-kind { display: inline-flex; align-items: center; gap: var(--a-sp-2); margin: 0; color: var(--a-lamp); font-size: var(--a-t-sm); font-weight: var(--a-w-strong); }
.lock-kind .icon { width: 18px; height: 18px; }
.lock-title { font-size: var(--a-t-xl); font-weight: var(--a-w-head); letter-spacing: -0.015em; overflow-wrap: anywhere; }
.lock-list { display: grid; gap: var(--a-sp-2); margin: 0; padding: 0; list-style: none; }
.lock-list li { display: flex; align-items: flex-start; gap: var(--a-sp-3); color: var(--a-ink); font-size: var(--a-t-sm); }
.lock-list .icon { flex: none; width: 20px; height: 20px; color: var(--a-lamp); }
.lock-tier { display: inline-block; padding: 1px 7px 0; border-radius: var(--a-r-pill); background: var(--a-surface-3); color: var(--a-ink-2); font-size: var(--a-t-xs); font-weight: var(--a-w-label); white-space: nowrap; }
.lock-actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--a-sp-3) var(--a-sp-5); margin-top: var(--a-sp-2); }
.lock-fine { margin: 0; color: var(--a-ink-2); font-size: var(--a-t-xs); }
.lock-plans, .lock-alerts, .lock-report { min-width: 0; }
@supports not (filter: blur(5px)) { .lock-grid { opacity: 0.25; } }
@media (forced-colors: active) { .lock-grid { display: none; } .lock-card { grid-area: auto; } }

/* ==== a segmented control with a sliding ink (the pricing page's Business / Individual switch is drawn by the plan cards' tabs,
   shared/css/v2/plan-cards.css, since 2026-11-11) ==================== */
.seg { position: relative; display: inline-grid; grid-auto-flow: column; grid-auto-columns: 1fr; padding: var(--a-sp-1); border-radius: var(--a-r-pill); background: var(--a-surface-2);
  box-shadow: var(--a-edge-2); }
.seg .seg-opt { position: relative; z-index: 1; min-height: 40px; padding: 2px 20px 0; border: 0; border-radius: var(--a-r-pill); background: none; color: var(--a-ink-2);
  font: inherit; font-weight: var(--a-w-head); cursor: pointer; white-space: nowrap; }
.seg-opt[aria-checked="true"] { color: var(--a-on-lamp); }
.seg-ink { position: absolute; top: 4px; bottom: 4px; left: 4px; width: calc((100% - 8px) / var(--seg-n, 2)); border-radius: var(--a-r-pill); background: var(--a-lamp);
  transform: translateX(calc(100% * var(--seg-i, 0))); transition: transform var(--dur-move) var(--ease-standard); }
.plans-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 14px; margin-top: 28px; align-items: stretch; }
.plan-cell { display: flex; min-width: 0; }
.plan { position: relative; display: flex; flex-direction: column; flex: 1; min-width: 0; padding: 26px; border-radius: var(--radius-xl); background: var(--s-glass-low);
  box-shadow: inset 0 0 0 1px var(--a-line); }
/* the recommended plan: a solid panel and the lamp's edge, no indigo wash (SITE-NOSLOP 2026-11-05) */
.plan.is-rec { background: var(--a-surface-solid); box-shadow: inset 0 0 0 2px var(--a-lamp); }
.plan-flag { position: absolute; top: 28px; right: 26px; color: var(--a-lamp-ink); font-size: var(--a-t-xs); font-weight: var(--a-w-head); }
.plan h3 { font-size: var(--a-t-lg); font-weight: var(--a-w-head); }
.plan-for { margin-top: 6px; color: var(--a-ink-2); font-size: var(--a-t-sm); }
.price { display: flex; align-items: baseline; gap: var(--a-sp-1); margin-top: 14px; }
.price .amt { font-size: clamp(2.75rem, 4vw, 3.25rem); font-weight: var(--a-w-display); line-height: 1; letter-spacing: -0.04em; font-variant-numeric: tabular-nums; }
.price .cur { font-size: var(--a-t-xl); font-weight: var(--a-w-head); }
.price .per { color: var(--a-ink-2); font-size: var(--a-t-sm); font-weight: var(--a-w-label); }
.price-alt { margin-top: var(--a-sp-2); color: var(--a-ink-2); font-size: var(--a-t-sm); }
.price-save { margin-top: var(--a-sp-1); color: var(--a-ok-ink); font-size: var(--a-t-sm); }
.vat { margin-top: var(--a-sp-1); color: var(--a-ink-3); font-size: var(--a-t-xs); font-weight: var(--a-w-strong); }
.vat-ind { color: var(--a-ink-2); font-weight: var(--a-w-text); }
.plan .feat { display: grid; gap: 9px; margin: 20px 0; font-size: var(--a-t-sm); list-style: none; }
.plan .feat li { display: grid; grid-template-columns: 18px minmax(0, 1fr); gap: 10px; color: var(--a-ink); }
.plan .feat .glyph { width: 16px; height: 16px; margin-top: 2px; color: var(--a-ok); }
.plan .feat .off { color: var(--a-ink-2); }
.plan .feat .off .glyph { color: var(--a-ink-3); }
.plan .btn { width: 100%; margin-top: auto; }
.plan .fine, .plan-fine { margin-top: var(--a-sp-2); color: var(--a-ink-2); font-size: var(--a-t-sm); }
.plans-more, .plans-note { margin-top: 18px; max-width: 70ch; color: var(--a-ink-2); font-size: var(--a-t-sm); }
.plans-more b, .plans-note b { color: var(--a-ink); }
.plans-link { margin-top: 10px; }
.test-label { color: var(--a-ink-2); font-size: var(--a-t-sm); font-weight: var(--a-w-label); }

/* ==== the team, the customers' row, the reviews (each empty until it is true) =================================================== */
.people { display: grid; grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr)); gap: var(--a-sp-6) var(--a-sp-5); margin: 0; padding: 0; list-style: none; }
.people-n4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.people-n6 { grid-template-columns: repeat(6, minmax(0, 1fr)); }
.people-n7 { display: flex; flex-wrap: wrap; justify-content: center; }   /* seven: four over three, the short row centred */
.people-n7 > .person { flex: 0 1 calc((100% - 3 * var(--a-sp-5)) / 4); min-width: 0; }
.person { display: grid; justify-items: center; align-content: start; gap: var(--a-sp-1); padding: var(--a-sp-5) var(--a-sp-3); border-radius: var(--radius-xl); background: var(--a-surface-2); box-shadow: var(--a-edge); text-align: center; }
.person-name { margin-top: var(--a-sp-3); font-size: var(--a-t-lg); font-weight: var(--a-w-head); }
.person-title { color: var(--a-ink-2); font-size: var(--a-t-sm); }
.avatar { display: grid; place-items: center; width: 112px; height: 112px; overflow: hidden; border-radius: 50%; box-shadow: 0 0 0 1px var(--a-line-2); }
.avatar img { width: 100%; height: 100%; object-fit: cover; }
.avatar-initials { background: linear-gradient(160deg, var(--s-avatar-top), var(--s-panel-solid)); color: var(--a-lamp); font-size: var(--a-t-figure-md); font-weight: var(--a-w-display); letter-spacing: -0.02em; }
.team-teaser { display: flex; flex-wrap: wrap; align-items: center; gap: var(--a-sp-3) var(--a-sp-5); }
.faces { display: flex; padding-left: 0; }
.faces li:first-child { margin-left: 0; }
.faces li { margin-left: -10px; }
.faces .avatar { width: 52px; height: 52px; box-shadow: 0 0 0 3px var(--a-ground); }
.faces .avatar-initials { font-size: var(--a-t-md); }

/* ==== questions: open answers (what people came for), two columns on wide screens ============================================== */
.faq-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 36px 56px; }
/* answers set apart by space, two columns on wide screens, not a grid of boxes (SITE-NOSLOP 2026-11-05) */
.faq-item { padding: 0; }
.faq-q { font-size: var(--a-t-lg); font-weight: var(--a-w-head); line-height: 1.3; }
.faq-a { margin-top: 10px; color: var(--a-ink-2); font-size: var(--a-t-sm); line-height: 1.6; }
.faq-a a { color: var(--a-link); }
.faq-list.is-single { grid-template-columns: minmax(0, 1fr); max-width: 52rem; }

/* ==== a feature's own page (/features/<slug>): the value in one line with its picture, how it works in three steps, what you get,
   the plans that include it (from config/plans.toml), real questions, related features, the call to action ===================== */
.fp-grid { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr); gap: 56px; align-items: center; }
.fp-head { padding-bottom: 56px; }
.fp-head h1 { font-size: clamp(2.3rem, 3.9vw, 3.5rem); line-height: 1; max-width: none; }
.fp-head + .sec { padding-top: 40px; }
/* the alert the example sent: the last row of the picture, not a second card floating over its corner (SITE-NOSLOP 2026-11-05) */
.fp-visual .fp-toast { position: relative; margin: 14px 6px 0; padding: 14px 0 0; border-radius: 0; background: none; box-shadow: inset 0 1px 0 var(--a-line);
  -webkit-backdrop-filter: none; backdrop-filter: none; }
.fp-toast time { top: 14px; right: 0; }
/* the floating card overlaps a band kept free for it, never the example's numbers, legend or caveat (QA-FINAL 2026-11-04: it
   covered them on 13 of the 17 feature pages) */
.fp-visual:has(> .fp-toast) { padding-bottom: 18px; }
/* a forced line break in a heading defeats `text-wrap: balance` (the first line caps the width), so the part after it balances on
   its own: no single word left on a heading's last line */
h1 br + .h1-2 { display: inline-block; }
/* a feature page's head is the feature's name, then what it does a size down (one colour): at 56px the whole sentence took three or
   four lines of the copy column and stood smaller than nothing around it */
.fp-copy h1 br + .h1-2 { display: block; margin-top: 0.2em; font-size: clamp(1.25rem, 2.2vw, 2rem); line-height: 1.18; letter-spacing: -0.01em; }
.fp-visual-note { position: absolute; left: 22px; bottom: -30px; margin: 0; text-align: left; }
.fp-head .facts { margin-top: 20px; }
.fp-visual { position: relative; padding: 18px; border-radius: var(--radius-xl); background: var(--a-surface); box-shadow: var(--s-panel); -webkit-backdrop-filter: var(--a-glass); backdrop-filter: var(--a-glass); }
.fp-visual .fv { margin: 0; padding: 6px; }
.fp-visual-note { color: var(--a-ink-3); font-size: var(--a-t-xs); }
.steps { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; counter-reset: step; }
.step { position: relative; display: grid; align-content: start; gap: 10px; padding: 26px; border-radius: var(--radius-xl); background: var(--s-tile); box-shadow: var(--s-edge); }
.step-n { color: var(--a-lamp-ink); font-weight: var(--a-w-display); font-size: var(--a-t-figure-sm); font-variant-numeric: tabular-nums; line-height: 1; }
.step h3 { margin-top: 6px; font-size: var(--a-t-lg); }
.step p { color: var(--a-ink-2); font-size: var(--a-t-sm); line-height: 1.55; }
.step:not(:last-child)::after { content: ""; position: absolute; top: 46px; right: -14px; width: 14px; height: 2px; background: var(--a-line-2); }
.gets { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--a-sp-6) 56px; }
.get { display: grid; grid-template-columns: 24px minmax(0, 1fr); gap: var(--a-sp-1) 14px; align-items: start; }
.get .tile-ico { grid-row: span 2; }
.get h3 { font-size: var(--a-t-md); line-height: 1.3; padding-top: 2px; }
.get p { color: var(--a-ink-2); font-size: var(--a-t-sm); line-height: 1.55; }
.avail { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 10px; }
.avail li { display: grid; align-content: start; gap: 6px; padding: 18px; border-radius: var(--a-r-card); background: var(--a-surface-2); box-shadow: var(--a-edge); }
.avail b { font-size: var(--a-t-md); font-weight: var(--a-w-head); }
.avail .avail-yes, .avail .avail-no { display: inline-flex; align-items: center; gap: 6px; font-size: var(--a-t-sm); font-weight: var(--a-w-head); }
.avail .avail-yes { color: var(--a-ok-ink); }
.avail .avail-no { color: var(--a-ink-3); }
.avail .avail-yes .glyph, .avail .avail-no .glyph { width: 14px; height: 14px; }
.avail small { color: var(--a-ink-2); font-size: var(--a-t-xs); line-height: 1.4; }
.avail li.is-on { background: var(--a-ok-bg); box-shadow: inset 0 0 0 1px var(--a-ok); }
.avail-note { margin-top: var(--a-sp-4); color: var(--a-ink-2); font-size: var(--a-t-sm); }
.cards { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; }
/* each card fills its row, so a card with a two-line sentence does not stand taller than its neighbours */
.cards > li { display: grid; }
/* the hub's Coming soon cards: two across when there are four, so none is left alone under a full row (hallmark F20) */
#soon .cards:has(> li:nth-child(4):last-child) { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.card-link { position: relative; display: grid; grid-template-columns: 24px minmax(0, 1fr); gap: var(--a-sp-1) 14px; align-content: start; padding: 22px; border-radius: var(--radius-xl);
  background: var(--s-tile); box-shadow: var(--s-edge); color: var(--a-ink); text-decoration: none; }
@media (hover: hover) { .card-link:hover { box-shadow: var(--s-edge-hover); text-decoration: none; } }
.card-link .tile-ico { grid-row: span 2; }
.card-link b { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; font-size: var(--a-t-md); font-weight: var(--a-w-head); line-height: 1.3; padding-top: 2px; }
.card-link span:not(.tile-ico):not(.soon-tag):not(.new-tag):not(.plan-tag) { color: var(--a-ink-2); font-size: var(--a-t-sm); line-height: 1.5; }
.card-link.is-soon { background: var(--a-surface-2); box-shadow: var(--a-edge); }
.card-link.is-soon .tile-ico { color: var(--a-ink-3); }
@media (hover: hover) { div.card-link:hover { transform: none; box-shadow: var(--a-edge); } }
.guide-cards { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; }
.guide-card { position: relative; display: grid; gap: var(--a-sp-2); height: 100%; padding: 22px; border-radius: var(--radius-xl); background: var(--a-surface-2); box-shadow: var(--a-edge);
  color: var(--a-ink); text-decoration: none; }
@media (hover: hover) { .guide-card:hover { background: var(--a-surface-3); text-decoration: none; } }
.guide-card b { font-weight: var(--a-w-head); line-height: 1.3; }
.guide-card span { color: var(--a-ink-2); font-size: var(--a-t-sm); line-height: 1.5; }
.guide-card .icon { position: absolute; right: 18px; top: 22px; width: 18px; height: 18px; color: var(--a-lamp); }

.fp-card { padding: 20px 22px; }
.fp-card .lanes-lg .lane { grid-template-columns: 64px repeat(14, minmax(0, 1fr)); }
.fp-card .verdict { background: var(--a-fail-bg); color: var(--a-fail-ink); }
.fp-card .card-code { margin-top: var(--a-sp-1); }
.fp-card .k-sub { margin-top: var(--a-sp-3); }
.built-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 40px; }
.built-list li { display: grid; gap: var(--a-sp-1); padding: var(--a-sp-4) 0; border-top: 1px solid var(--a-line); }
.built-list b { color: var(--a-ink); font-weight: var(--a-w-head); }
.built-list span { color: var(--a-ink-2); font-size: var(--a-t-sm); line-height: 1.5; }
.built-list small { color: var(--a-ok-ink); font-size: var(--a-t-xs); font-weight: var(--a-w-label); }

/* the features hub: the five groups, a card per feature, Coming soon kept apart */
.hub-group + .hub-group { margin-top: 56px; }
.hub-group > h2 { margin-bottom: 18px; font-size: var(--a-t-2xl); letter-spacing: -0.02em; }
.also-list { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px var(--a-sp-5); }
.also-list li { padding: 14px 0; border-top: 1px solid var(--a-line); }
.also-list b { display: block; font-weight: var(--a-w-head); }
.also-list span { color: var(--a-ink-2); font-size: var(--a-t-sm); }

/* ==== the head of an inner page with its picture (`.page-head` + `.ph-grid`): the title and copy on the left, a glass card on the
   right; every product page, tool, comparison and the 404 share it ============================================================== */
.ph-grid { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr); grid-template-areas: "title stage" "copy stage";
  grid-template-rows: auto 1fr; gap: 22px 56px; align-items: start; }
.ph-title { grid-area: title; min-width: 0; }
.ph-copy { grid-area: copy; min-width: 0; }
.ph-stage { grid-area: stage; align-self: center; min-width: 0; }
.ph-grid.no-stage { grid-template-columns: minmax(0, 1fr); grid-template-areas: "title" "copy"; }   /* a head without a picture (the tools hub) */
.ph-grid.no-stage > * { max-width: 46rem; }
.ph-title h1 { margin-top: var(--a-sp-4); font-size: clamp(2.3rem, 4.2vw, 3.75rem); line-height: 1; max-width: 14em; }
.ph-copy .lede, .ph-copy .vs-answer { margin-top: 0; }
.ph-copy .actions { margin-top: 26px; }
.ph-copy .facts { margin-top: 18px; }
.ph-stage .card { padding: 20px 22px; }
.page-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 18px; color: var(--a-ink-3); font-size: var(--a-t-xs); }
.page-updated { color: var(--a-ink-3); font-size: var(--a-t-xs); }
.crumbs { color: var(--a-ink-3); font-size: var(--a-t-xs); font-weight: var(--a-w-label); }
.crumbs > a, .crumbs > span { color: var(--a-ink-2); }
.crumbs > a { text-decoration: none; }
@media (hover: hover) { .crumbs > a:hover { color: var(--a-ink); text-decoration: underline; } }
.page-head.is-plain { padding-bottom: 40px; }
.facts.facts-sm li { min-height: 28px; font-size: var(--a-t-xs); }
.card-links { display: grid; gap: 6px; }
.card-links a { display: flex; align-items: center; gap: var(--a-sp-3); padding: var(--a-sp-3) 14px; border-radius: 12px; background: var(--a-surface-2); color: var(--a-ink); text-decoration: none; }
@media (hover: hover) { .card-links a:hover { background: var(--a-surface-3); } }
.card-links a span { flex: 1; font-weight: var(--a-w-strong); }
.card-links a small { color: var(--a-ink-2); font-size: var(--a-t-xs); }
.card-code, .card-code pre { margin: 0; overflow: auto; border-radius: 12px; background: var(--s-code-bg); color: var(--s-code-ink); font-size: var(--a-t-xs); line-height: 1.6; }
.card-code { padding: 14px var(--a-sp-4); box-shadow: inset 0 0 0 1px var(--a-line); }
.card-code .k { color: var(--s-code-key); } .card-code .s { color: var(--s-code-str); }
.card-line, .card-duo { display: grid; gap: 10px; }
.readings { display: grid; gap: var(--a-sp-1); }
.readings li { display: grid; grid-template-columns: minmax(0, 1fr) auto auto; align-items: center; gap: var(--a-sp-3); padding: 9px 10px; border-radius: 10px; font-size: var(--a-t-sm); }
.readings li:nth-child(odd) { background: var(--a-surface-2); }
.r-name { color: var(--a-ink-2); }
.r-host { font-size: var(--a-t-sm); font-weight: var(--a-w-label); color: var(--a-ink); }
.r-val { font-weight: var(--a-w-strong); font-variant-numeric: tabular-nums; text-align: right; }
.r-st, .st { display: inline-flex; align-items: center; gap: 6px; min-height: 24px; padding: 2px 9px 0; border-radius: var(--a-r-pill); font-size: var(--a-t-2xs);
  font-weight: var(--a-w-head); white-space: nowrap; background: var(--a-surface-3); color: var(--a-ink-2); }
.r-st.ok, .st-steady, .r-st.steady { background: var(--a-ok-bg); color: var(--a-ok-ink); }
.r-st.regional, .st-regional, .r-st.warn { background: var(--a-warn-bg); color: var(--a-warn-ink); }
.r-st.down, .st-down { background: var(--a-fail-strong); color: var(--on-fail); }
.r-st.unknown, .st-unknown { background: var(--a-unknown-bg); color: var(--a-ink-2); }
.st-planned { background: var(--a-planned-bg); color: var(--a-planned-ink); }
.r-st .glyph, .st .glyph { width: 12px; height: 12px; }
.sec-note { margin-top: 14px; color: var(--a-ink-3); font-size: var(--a-t-sm); }
.split { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr); gap: 56px; align-items: start; }
.split > .sec-head { margin-bottom: 0; }
.sec-body { display: grid; gap: var(--a-sp-4); }
.short { max-width: 34em; }

/* ==== reading pages: guides, glossary, alternatives, comparisons, the API and MCP docs, the legal drafts, help answers =========== */
.rd-page, .doc-page { padding-bottom: 0; }
.rd-head { position: relative; isolation: isolate; overflow: hidden; padding: 56px 0 var(--a-sp-7); background: transparent; }
.rd-head .crumbs { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.rd-top { display: grid; grid-template-columns: minmax(0, 7fr) minmax(0, 5fr); column-gap: clamp(var(--a-sp-6), 5vw, 80px); row-gap: 14px; margin-top: 20px; }
.rd-top > * { grid-column: 1; }
.rd-top > .rd-card { grid-column: 2; grid-row: 1 / span 4; align-self: start; }
.rd-title h1, .rd-head h1 { font-size: clamp(2.2rem, 4.2vw, 3.6rem); line-height: 1.04; max-width: 20ch; }
.rd-head code { padding: 1px 6px; border-radius: 6px; background: var(--a-surface-3); color: var(--a-ink); }
.rd-answer, .vs-answer { max-width: 36em; color: var(--a-ink); font-size: var(--a-t-lg); line-height: 1.5; }
.rd-meta, .byline { color: var(--a-ink-3); font-size: var(--a-t-xs); }
.rd-label { color: var(--a-ink-2); font-size: var(--a-t-xs); font-weight: var(--a-w-label); }
.rd-card { display: grid; gap: 10px; padding: 20px 22px; border-radius: var(--radius-xl); background: var(--a-surface); box-shadow: var(--s-panel);
  -webkit-backdrop-filter: var(--a-glass); backdrop-filter: var(--a-glass); }
.rd-card ul, .rd-card ol { display: grid; gap: 6px; }
.rd-card a { color: var(--a-ink); }
.rd-body { padding: var(--a-sp-5) 0 var(--a-section); }
.doc { display: grid; grid-template-columns: 236px minmax(0, 1fr) 248px; gap: 56px; align-items: start; padding-top: var(--a-sp-6); border-top: 1px solid var(--a-line); }
.doc.doc-plain { grid-template-columns: minmax(0, 1fr) 248px; }
.doc.doc-wide { grid-template-columns: 236px minmax(0, 1fr); }
.doc-aside { position: sticky; top: calc(var(--a-bar-h) + 24px); display: grid; gap: var(--a-sp-4); }
.doc-aside .vs-cta { display: grid; gap: 10px; padding: 20px; border-radius: var(--a-r-card); background: var(--a-surface-2); box-shadow: var(--a-edge); }
.doc-aside .vs-cta .btn { width: 100%; }
.rd-aside-t { color: var(--a-ink); font-size: var(--a-t-sm); font-weight: var(--a-w-head); }
.toc { position: relative; }
.toc .toc-head, .toc h2 { margin-bottom: 10px; color: var(--a-ink-2); font-size: var(--a-t-xs); font-weight: var(--a-w-label); }
.toc-line { position: relative; }
.toc ol { position: relative; display: grid; gap: 0; padding-left: 18px; }
.toc ol::before { content: ""; position: absolute; left: 3px; top: 8px; bottom: 8px; width: 2px; border-radius: 1px; background: var(--a-line); }
.toc li { position: relative; }
.toc li::before { content: ""; position: absolute; left: -18px; top: 13px; width: 8px; height: 8px; border-radius: 50%; background: var(--a-ground);
  box-shadow: inset 0 0 0 2px var(--a-line-2); }
.toc a { display: block; padding: 7px 0 6px; color: var(--a-ink-2); font-size: var(--a-t-sm); line-height: 1.35; text-decoration: none; }
@media (hover: hover) { .toc a:hover { color: var(--a-ink); text-decoration: underline; } }
.toc li.is-here::before { background: var(--a-lamp); box-shadow: none; }
.toc li.is-passed::before { background: var(--a-ink-3); box-shadow: none; }
.toc li.is-here a { color: var(--a-ink); font-weight: var(--a-w-strong); }
.toc-progress { position: absolute; left: 3px; top: 8px; width: 2px; height: calc(100% - 16px); border-radius: 1px; background: var(--a-lamp); transform-origin: top;
  transform: scaleY(var(--read, 0)); transition: transform var(--dur-move) var(--ease-standard); }
.toc.az ol { display: flex; flex-wrap: wrap; gap: 6px; padding: 0; }
.toc.az ol::before, .toc.az li::before { display: none; }
.toc.az a { display: inline-flex; align-items: center; justify-content: center; min-width: 44px; min-height: 44px; padding: 2px 0 0; border-radius: 10px;
  background: var(--a-surface-2); color: var(--a-ink); font-weight: var(--a-w-head); box-shadow: var(--a-edge); }
/* the reading column: 68 characters at 18 px, 1.7 line height, ink-2 at 10:1 for the body and ink for headings and strong words */
.prose { max-width: var(--a-measure); color: var(--a-ink-2); font-size: var(--a-t-read); line-height: var(--a-lh-read); }
.prose > * + * { margin-top: 1em; }
.prose section + section { margin-top: 2.6em; }
.prose h2 { margin-top: 2.2em; color: var(--a-ink); font-size: var(--a-t-2xl); line-height: 1.15; letter-spacing: -0.02em; scroll-margin-top: 96px; }
.prose section > h2:first-child, .prose > h2:first-child { margin-top: 0; }
.prose h3 { margin-top: 1.8em; color: var(--a-ink); font-size: var(--a-t-xl); line-height: 1.25; scroll-margin-top: 96px; }
.prose h4 { margin-top: 1.4em; color: var(--a-ink); font-size: var(--a-t-lg); }
.prose h2 + *, .prose h3 + *, .prose h4 + * { margin-top: 0.6em; }
.prose strong, .prose b { color: var(--a-ink); }
.prose a { color: var(--a-link); }
.prose ul, .prose ol { padding-left: 1.3em; }
.prose ul { list-style: disc; } .prose ol { list-style: decimal; }
.prose ul[class], .prose ol[class] { padding-left: 0; list-style: none; }
.prose li + li { margin-top: 0.4em; }
.prose li::marker { color: var(--a-ink-3); }
.prose code { padding: 1px 6px; border-radius: 6px; background: var(--a-surface-3); color: var(--a-ink); font-size: 0.86em; }
/* a long address in running text (an inline code, a cited source) breaks inside the column instead of widening the page at 375 */
.prose :not(pre) > code, .help-prose :not(pre) > code, .vs-sources li { overflow-wrap: anywhere; }
.prose pre { max-width: 100%; overflow-x: auto; padding: var(--a-sp-4) 18px; border-radius: 14px; background: var(--s-code-bg); color: var(--s-code-ink); box-shadow: inset 0 0 0 1px var(--a-line); font-size: var(--a-t-ui);
  line-height: 1.6; }
.prose pre code { padding: 0; background: none; }
.prose blockquote { padding: 14px 18px; border-radius: 14px; background: var(--a-surface-2); box-shadow: inset 0 0 0 1px var(--a-line); color: var(--a-ink); }
.prose hr { margin: 2.4em 0; }
.prose img { border-radius: 12px; }
.prose dl { display: grid; gap: 6px; }
.prose dt { color: var(--a-ink); font-weight: var(--a-w-strong); }
.prose dd { margin: 0 0 var(--a-sp-2); }
.callout, .draft-banner { display: block; padding: 14px 18px; border-radius: 14px; background: var(--a-warn-bg); color: var(--a-warn-ink); font-size: var(--a-t-sm); line-height: 1.5; }
.callout strong, .draft-banner strong { color: inherit; }
.draft-banner { margin-top: 18px; max-width: 70ch; }
.legal-version { margin-top: 10px; color: var(--a-ink-3); font-size: var(--a-t-xs); }
.legal-facts { display: grid; gap: 0; margin: 1em 0; border-top: 1px solid var(--a-line); }
.legal-facts > div { display: grid; grid-template-columns: minmax(0, 12rem) minmax(0, 1fr); gap: var(--a-sp-1) var(--a-sp-5); padding: var(--a-sp-3) 0; border-bottom: 1px solid var(--a-line); }
.legal-facts dt { color: var(--a-ink); font-weight: var(--a-w-strong); }
.legal-facts dd { margin: 0; }
.model-form { padding: 18px 20px; border-radius: 14px; background: var(--a-surface-2); box-shadow: var(--a-edge); }
.table-wrap { overflow-x: auto; max-width: 100%; margin: 1.4em 0; border-radius: var(--a-r-card); box-shadow: var(--a-edge); }
.table-wrap table, .prose table, .vs-table, .plans-table { width: 100%; border-collapse: collapse; font-size: var(--a-t-sm); line-height: 1.45; }
.table-wrap th, .table-wrap td, .prose th, .prose td { padding: 11px 14px; border-bottom: 1px solid var(--a-line); text-align: left; vertical-align: top; }
.table-wrap thead th, .prose thead th { background: var(--a-ground-3); color: var(--a-ink); font-size: var(--a-t-xs); font-weight: var(--a-w-head); letter-spacing: 0.02em; }
.table-wrap tbody th, .prose tbody th { color: var(--a-ink); font-weight: var(--a-w-strong); }
.table-wrap td, .prose td { color: var(--a-ink-2); }
.table-wrap tr:last-child > * { border-bottom: 0; }
.src, .src-host { color: var(--a-ink-3); font-size: var(--a-t-xs); }
.src a { color: var(--a-ink-2); }
.vs-two { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
.vs-two > * { padding: 22px; border-radius: var(--radius-xl); background: var(--a-surface-2); box-shadow: var(--a-edge); }
.vs-list { display: grid; gap: var(--a-sp-2); padding-left: 0; list-style: none; }
.vs-list li { position: relative; padding-left: 22px; }
.vs-list li::before { content: ""; position: absolute; left: 4px; top: 0.72em; width: 6px; height: 6px; border-radius: 50%; background: var(--a-ink-3); }
.vs-note { color: var(--a-ink-3); font-size: var(--a-t-sm); }
.vs-sources { margin-top: 1.4em; color: var(--a-ink-3); font-size: var(--a-t-xs); }
.vs-sources a { color: var(--a-ink-2); }
.vs-wide, .prose.vs-wide { max-width: 82ch; }
.vs-cta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--a-sp-3); margin-top: 28px; }
.card-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--a-sp-3); padding: 0; list-style: none; }
.card-list a { display: grid; gap: var(--a-sp-1); height: 100%; padding: 18px 20px; border-radius: var(--a-r-card); background: var(--a-surface-2); box-shadow: var(--a-edge);
  color: var(--a-ink); text-decoration: none; }
@media (hover: hover) { .card-list a:hover { background: var(--a-surface-3); } }
.card-list span, .card-list small { color: var(--a-ink-2); font-size: var(--a-t-sm); }
.rd-cards { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; }
/* a related-page card (`<li><a>title</a><span>summary</span><span class="rd-meta">`): the item is the card and the link's ::after
   covers it, so the summary sits inside the card (QA-FINAL 2026-11-04: it hung under the card and, at 375, over the next one) */
.rd-cards > li { position: relative; display: grid; align-content: start; gap: 6px; padding: 18px 20px; border-radius: var(--a-r-card);
  background: var(--a-surface-2); box-shadow: var(--a-edge); }
@media (hover: hover) { .rd-cards > li:hover { background: var(--a-surface-3); } }
.rd-cards > li > a { display: inline; height: auto; padding: 0; border-radius: 0; background: none; box-shadow: none; font-weight: var(--a-w-label); }
@media (hover: hover) { .rd-cards > li > a:hover { background: none; } }
.rd-cards > li > a::after { content: ""; position: absolute; inset: 0; border-radius: var(--a-r-card); }
.rd-index { display: grid; gap: 28px; }
.rd-az { display: grid; gap: var(--a-sp-2); }
.rd-def { color: var(--a-ink-2); }
.rd-more .sec-head { margin-bottom: 28px; }
.rd-hub .rd-body, .hub-page .rd-body { padding-top: 0; }
.helps { color: var(--a-ink-3); font-size: var(--a-t-xs); }
.end-line { display: none; }
.notfound .page-head { min-height: 60svh; }

/* ==== the help centre and the contact page (web_help.py) ======================================================================== */
.help-hero, .help-head { position: relative; isolation: isolate; overflow: hidden; padding: 56px 0 var(--a-sp-7); }
.help-hero-in, .help-head-in, .help-body, .help-art, .contact-grid { width: min(1240px, 100% - 48px); margin-inline: auto; }
.help-hero-in { display: grid; justify-items: start; }
.help-hero h1, .help-head h1 { margin-top: var(--a-sp-4); font-size: clamp(2.2rem, 4.4vw, 3.75rem); line-height: 1.02; max-width: 18ch; }
.help-hero .vs-answer, .help-head .vs-answer { margin-top: var(--a-sp-4); color: var(--a-ink-2); max-width: 36em; }
.help-search { width: 100%; max-width: 44rem; margin-top: 28px; }
.help-search label { display: block; margin-bottom: var(--a-sp-2); color: var(--a-ink); font-weight: var(--a-w-label); }
.help-box { position: relative; }
.help-box .search-ico { position: absolute; left: 18px; top: 50%; width: 22px; height: 22px; transform: translateY(-50%); color: var(--a-ink-2); pointer-events: none; }
.help-box input { width: 100%; min-height: 60px; padding: var(--a-sp-1) 18px 0 52px; border: 0; border-radius: 16px; background: var(--s-glass); color: var(--a-ink);
  box-shadow: inset 0 0 0 1px var(--s-edge-line), 0 24px 50px -30px var(--s-shadow-ink); font: inherit; font-size: var(--a-t-lg); }
.help-box input:focus-visible { outline: 3px solid var(--a-focus); outline-offset: 2px; }
.help-box input:disabled { opacity: 0.7; background: var(--a-surface-2); cursor: not-allowed; }
.help-search .hint { color: var(--a-ink-3); }
.help-popular { display: flex; flex-wrap: wrap; align-items: center; gap: var(--a-sp-2); margin-top: var(--a-sp-4); list-style: none; padding: 0; }
.help-popular .pop-h, .pop-h { margin-right: var(--a-sp-1); color: var(--a-ink-3); font-size: var(--a-t-xs); font-weight: var(--a-w-head); }
.help-popular a { display: inline-flex; align-items: center; min-height: 36px; padding: 2px 14px 0; border-radius: var(--a-r-pill); background: var(--a-surface-2); color: var(--a-ink);
  box-shadow: var(--a-edge-2); font-size: var(--a-t-sm); font-weight: var(--a-w-label); text-decoration: none; }
@media (hover: hover) { .help-popular a:hover { background: var(--a-surface-3); } }
.help-results { display: grid; gap: var(--a-sp-1); margin-top: 10px; padding: 0; list-style: none; }
.help-results a { display: grid; gap: 2px; padding: var(--a-sp-3) 14px; border-radius: 12px; background: var(--a-surface-2); color: var(--a-ink); text-decoration: none; }
.help-results li.is-active a { background: var(--a-surface-3); }
@media (hover: hover) { .help-results a:hover { background: var(--a-surface-3); } }
.res-group { color: var(--a-ink-2); font-size: var(--a-t-xs); font-weight: var(--a-w-label); }
.help-empty { margin-top: 20px; padding: 20px; border-radius: var(--a-r-card); background: var(--a-surface-2); color: var(--a-ink-2); box-shadow: var(--a-edge); }
.help-empty-t { color: var(--a-ink); font-size: var(--a-t-lg); font-weight: var(--a-w-head); }
.help-body { padding: var(--a-sp-7) 0 var(--a-section); }
.help-topics { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 300px), 1fr)); gap: 14px; padding: 0; list-style: none; }
.topic { position: relative; display: grid; grid-template-columns: 34px minmax(0, 1fr); grid-template-rows: auto auto 1fr; column-gap: 14px; height: 100%; padding: 22px;
  border-radius: var(--radius-xl); background: var(--s-tile); box-shadow: var(--s-edge); color: var(--a-ink); text-decoration: none; }
@media (hover: hover) { .topic:hover { text-decoration: none; } }
@media (hover: hover) { .topic:hover { box-shadow: var(--s-edge-hover); } }   /* a firmer edge, not a lift; a tap never leaves it marked */
.topic-icon { grid-row: span 3; display: inline-flex; padding-top: 2px; color: var(--a-lamp-ink); }
.topic-icon .ico { width: 28px; height: 28px; }
.topic-name { font-size: var(--a-t-lg); font-weight: var(--a-w-head); line-height: 1.25; }
.topic-desc { margin-top: var(--a-sp-1); color: var(--a-ink-2); font-size: var(--a-t-sm); }
.topic-count { align-self: end; margin-top: var(--a-sp-3); color: var(--a-ink-3); font-size: var(--a-t-xs); font-weight: var(--a-w-strong); }
.help-group { margin-top: 56px; scroll-margin-top: calc(var(--a-bar-h) + 24px); }
.help-group h2 { display: flex; align-items: center; gap: var(--a-sp-3); margin-bottom: var(--a-sp-4); font-size: var(--a-t-2xl); letter-spacing: -0.02em; }
.help-stuck { margin-top: 56px; padding: 28px; border-radius: var(--radius-xl); background: var(--a-surface-2); box-shadow: var(--a-edge); }
.help-stuck h2 { font-size: var(--a-t-xl); }
.help-stuck p { margin-top: var(--a-sp-2); color: var(--a-ink-2); }
.help-cta, .help-actions { display: flex; flex-wrap: wrap; gap: var(--a-sp-3); margin-top: var(--a-sp-4); }
.help-chip { margin-top: 18px; }
.help-chip a { display: inline-flex; align-items: center; gap: var(--a-sp-2); min-height: 36px; padding: 2px 14px 0; border-radius: var(--a-r-pill); background: var(--a-surface-2); color: var(--a-ink);
  box-shadow: var(--a-edge-2); font-size: var(--a-t-sm); font-weight: var(--a-w-label); text-decoration: none; }
.help-art { display: grid; grid-template-columns: minmax(0, 1fr) 280px; gap: 56px; align-items: start; padding: var(--a-sp-6) 0 var(--a-section); border-top: 1px solid var(--a-line); }
.help-prose { max-width: var(--a-measure); color: var(--a-ink-2); font-size: var(--a-t-read); line-height: var(--a-lh-read); }
.help-prose > * + *, .help-prose section > * + * { margin-top: 1em; }
.help-prose section + section { margin-top: 2.4em; }
.help-prose h2 { color: var(--a-ink); font-size: var(--a-t-2xl); line-height: 1.15; letter-spacing: -0.02em; scroll-margin-top: 96px; }
.help-prose h3 { color: var(--a-ink); font-size: var(--a-t-xl); }
.help-prose strong, .help-prose b { color: var(--a-ink); }
.help-prose a { color: var(--a-link); }
.help-prose ul, .help-prose ol { padding-left: 1.3em; }
.help-prose ul { list-style: disc; } .help-prose ol { list-style: decimal; }
.help-prose li + li { margin-top: 0.4em; }
.help-prose code { padding: 1px 6px; border-radius: 6px; background: var(--a-surface-3); color: var(--a-ink); font-size: 0.86em; }
.help-prose pre { overflow: auto; padding: var(--a-sp-4) 18px; border-radius: 14px; background: var(--s-code-bg); color: var(--s-code-ink); box-shadow: inset 0 0 0 1px var(--a-line); font-size: var(--a-t-ui); }
.help-prose pre code { padding: 0; background: none; }
.help-prose table { width: 100%; border-collapse: collapse; font-size: var(--a-t-sm); }
.help-prose th, .help-prose td { padding: 10px var(--a-sp-3); border-bottom: 1px solid var(--a-line); text-align: left; vertical-align: top; }
.help-prose th { color: var(--a-ink); }
.help-prose ol.vs-list { position: relative; display: grid; gap: 18px; padding-left: 56px; list-style: none; counter-reset: help-step; }
.help-prose ol.vs-list::before { content: ""; position: absolute; left: 18px; top: 20px; bottom: 20px; width: 2px; background: var(--a-line-2); }
.help-prose ol.vs-list > li { position: relative; margin-top: 0; padding-left: 0; counter-increment: help-step; }
.help-prose ol.vs-list > li::before { content: counter(help-step); position: absolute; left: -56px; top: -4px; display: grid; place-items: center; width: 38px; height: 38px;
  border-radius: 12px; background: var(--a-lamp); color: var(--a-on-lamp); font-size: var(--a-t-md); font-weight: var(--a-w-display); padding-top: 3px; }
.help-side { position: sticky; top: calc(var(--a-bar-h) + 24px); display: grid; gap: var(--a-sp-1); }
.help-side .side-h { display: flex; align-items: center; gap: var(--a-sp-2); margin-bottom: 6px; padding-bottom: 10px; border-bottom: 1px solid var(--a-line); color: var(--a-ink); font-size: var(--a-t-sm);
  font-weight: var(--a-w-head); }
.help-side .side-h a { color: var(--a-ink); }
.help-side ul { padding: 0; list-style: none; }
.help-side li a { display: block; padding: var(--a-sp-2) 0 6px; color: var(--a-ink-2); font-size: var(--a-t-sm); line-height: 1.35; text-decoration: none; }
@media (hover: hover) { .help-side li a:hover { color: var(--a-ink); text-decoration: underline; } }
.help-side a[aria-current="page"] { padding-inline: 10px; border-radius: var(--a-r-sm); background: var(--a-surface-2); color: var(--a-ink);
  font-weight: var(--a-w-strong); }
.help-side .side-all { display: inline-flex; align-items: center; min-height: 44px; margin-top: 10px; font-size: var(--a-t-sm); font-weight: var(--a-w-label); }
.help-report { margin-top: var(--a-sp-6); padding: 20px 22px; border-radius: var(--a-r-card); background: var(--a-surface-2); box-shadow: var(--a-edge); }
.help-done { display: grid; grid-template-columns: 40px minmax(0, 1fr); gap: 14px; padding: 22px; border-radius: var(--a-r-card); background: var(--a-ok-bg); color: var(--a-ink); }
.help-done .ico, .done-ico { width: 32px; height: 32px; color: var(--a-ok-ink); }
.done-t { color: var(--a-ink); font-size: var(--a-t-lg); font-weight: var(--a-w-head); }
.help-form { display: grid; gap: 18px; }
.hp-wrap { position: absolute !important; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
.side-card { display: grid; gap: var(--a-sp-2); padding: 22px; border-radius: var(--a-r-card); background: var(--a-surface-2); box-shadow: var(--a-edge); color: var(--a-ink-2); font-size: var(--a-t-sm); }
.side-card h2, .side-t { color: var(--a-ink); font-size: var(--a-t-md); font-weight: var(--a-w-head); }
.side-card ul.vs-list { gap: 10px; }
.content, .help-page, .help-hub, .hub-page { padding-bottom: 0; }
.rd-band { padding: 0; }
.contact-grid { display: grid; grid-template-columns: minmax(0, 7fr) minmax(0, 5fr); gap: 40px; align-items: start; padding: var(--a-sp-7) 0 var(--a-section); }
.contact-card { padding: 30px; border-radius: var(--radius-xl); background: var(--s-tile); box-shadow: var(--s-edge); }
.contact-side { display: grid; gap: 14px; }
.contact-phone .phone-link { color: var(--a-ink); font-size: var(--a-t-xl); font-weight: var(--a-w-head); letter-spacing: -0.01em; text-decoration: none; }
@media (hover: hover) { .contact-phone .phone-link:hover { text-decoration: underline; } }

/* the contact form's own fields (web_help.contact_form): the site's field look */
.help-form label { display: block; margin-bottom: var(--a-sp-2); color: var(--a-ink); font-weight: var(--a-w-label); }
.help-form input:not([type="checkbox"]):not([type="radio"]), .help-form select, .help-form textarea { width: 100%; max-width: 100%; min-height: 50px; padding: var(--a-sp-1) var(--a-sp-4) 0;
  border: 0; border-radius: var(--a-r-field); background: var(--s-glass); color: var(--a-ink); box-shadow: var(--a-edge-2); font: inherit; font-size: var(--a-t-md); }
.help-form textarea { min-height: 160px; padding-block: 14px; line-height: 1.5; resize: vertical; }
.help-form select { appearance: none; padding-right: 40px; background-image: url("/static/site/img/chevron-night.svg"); background-repeat: no-repeat; background-position: right 14px center; background-size: 14px; }
.help-form select option { background: var(--a-ground-3); color: var(--a-ink); }
.help-form :is(input, select, textarea):focus-visible { outline: 3px solid var(--a-focus); outline-offset: 2px; }
.help-form :is(input, select, textarea)[aria-invalid="true"] { box-shadow: inset 0 0 0 2px var(--a-fail); }
.help-form .field { min-width: 0; }

/* ==== the free check and the five tools ======================================================================================== */
.scan-hero { padding-bottom: var(--a-sp-8); }
.scan-hero .ph-grid { grid-template-columns: minmax(0, 1fr); grid-template-areas: "title" "copy"; justify-items: center; text-align: center; }
.scan-hero .ph-title { display: grid; justify-items: center; }
.scan-hero h1 { max-width: 16em; margin-inline: auto; }
.scan-hero .lede { margin-inline: auto; max-width: 36em; }
.scan-hero .ph-copy { width: min(44rem, 100%); }
.scan-hero .ph-stage { display: none; }
.scan-hero .facts, .scan-hero .actions { justify-content: center; }
.scan-hero .check-form { margin-inline: auto; text-align: left; }
.scan-hero .check-form .label { text-align: center; }
.scan-hero .hint, .scan-hero .scan-live, .scan-hero .field-error { text-align: center; justify-content: center; }
.check-form { width: 100%; max-width: 640px; margin-top: 28px; }
.joined { display: flex; gap: var(--a-sp-2); padding: var(--a-sp-2); border-radius: 18px; background: var(--s-glass); box-shadow: inset 0 0 0 1px var(--s-edge-line-soft), 0 24px 50px -30px var(--s-shadow-ink); }
.joined:focus-within { box-shadow: inset 0 0 0 2px var(--a-lamp), 0 24px 50px -30px var(--s-shadow-ink); }
.joined .input { flex: 1; min-width: 0; min-height: 56px; border-radius: 12px; background: transparent; box-shadow: none; font-size: var(--a-t-lg); }
.joined .input:focus-visible { outline-offset: 0; }
.joined .btn { min-height: 56px; padding-inline: var(--a-sp-5); }
.results-leg:not([hidden]) { padding: 40px 0 var(--a-sp-8); background: var(--a-ground-2); box-shadow: inset 0 1px 0 var(--a-line); }
.results-leg > .sc-wrap { width: min(1240px, 100% - 48px); margin-inline: auto; }
.tool-cards, .read-tiles { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; }
.tool-cards > li > a, .read-tile { position: relative; display: grid; gap: var(--a-sp-2); align-content: start; height: 100%; padding: 22px; border-radius: var(--radius-xl); background: var(--s-tile);
  box-shadow: var(--s-edge); color: var(--a-ink); text-decoration: none; }
/* the About page's "Where it stands" facts (premium audit 2026-11-11: they had no tile of their own and read as loose text) */
.proof-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; margin-bottom: 18px; }
.proof-card { display: grid; gap: var(--a-sp-2); align-content: start; padding: 22px; border-radius: var(--radius-xl); background: var(--s-tile); box-shadow: var(--s-edge); }
.proof-card h3 { display: flex; align-items: center; gap: 10px; font-size: var(--a-t-md); font-weight: var(--a-w-head); }
.proof-card h3 .icon { width: 20px; height: 20px; flex: none; }
.proof-card p { color: var(--a-ink-2); font-size: var(--a-t-sm); }
.stands-note { margin-bottom: 18px; }
@media (hover: hover) { .tool-cards > li > a:hover, a.read-tile:hover { box-shadow: var(--s-edge-hover); text-decoration: none; } }
.read-tile b, .tool-cards b { font-size: var(--a-t-md); font-weight: var(--a-w-head); }
.read-tile span, .read-tile p, .tool-cards span, .tool-cards p { color: var(--a-ink-2); font-size: var(--a-t-sm); line-height: 1.5; }
.tool-bento, .spec-bento { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; }
/* the last tool takes the row's whole width, so no card is left alone under a full row (hallmark F20) */
.tool-bento > :last-child:not(.bento-wide) { grid-column: 1 / -1; }
.also, .also-gaps { color: var(--a-ink-2); font-size: var(--a-t-sm); }
/* a definition list of short facts: the term with its icon on one line, the answer under it; two columns on wide screens (SITE-NOSLOP
   2026-11-05: the icons sat alone on a line above each term) */
dl.also { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 22px var(--a-sp-7); margin: 0; }
dl.also dt { display: flex; align-items: center; gap: 10px; color: var(--a-ink); font-size: var(--a-t-md); font-weight: var(--a-w-head); line-height: 1.3; }
dl.also dt :is(.icon, .glyph) { flex: none; color: var(--a-ink-2); }
dl.also dd { margin: 6px 0 0; padding-left: 30px; line-height: 1.5; }
.also-gaps { margin-top: 18px; }
ul.also, ol.also { display: grid; gap: var(--a-sp-2); }
.also li { position: relative; padding-left: 20px; }
.also li::before { content: ""; position: absolute; left: 2px; top: 0.6em; width: 8px; height: 8px; border-radius: 50%; background: var(--a-ink-3); }
.regional { color: var(--a-warn-ink); } .unknown { color: var(--a-ink-3); } .down { color: var(--a-fail-ink); } .steady { color: var(--a-ok-ink); }
/* a tool's example result, set in its card rather than in a box of its own (SITE-NOSLOP 2026-11-05: card in card); a code sample keeps
   its dark panel, which is what code looks like */
.frag { display: grid; gap: var(--a-sp-2); margin-top: auto; font-size: var(--a-t-sm); }
.frag-big { font-size: var(--a-t-figure); font-weight: var(--a-w-display); letter-spacing: -0.02em; }
.frag-code { display: block; overflow: auto; padding: var(--a-sp-3) 14px; border-radius: 10px; background: var(--s-code-bg); color: var(--s-code-ink); font-family: var(--a-mono); font-size: var(--a-t-xs); }
.frag-cert { display: grid; gap: 2px; color: var(--a-ink); font-size: var(--a-t-lg); font-weight: var(--a-w-head); }
.frag-cert b { color: var(--a-ink-2); font-size: var(--a-t-xs); font-weight: var(--a-w-label); }
.frag-note { margin-top: 10px; color: var(--a-ink-3); font-size: var(--a-t-xs); }

/* ==== the product pages' parts (how it works, use cases, about, the hub, pricing, changelog, security) ========================== */
.benefits { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--a-sp-6) var(--a-sp-7); }
/* a benefit is an icon row: the bare icon, a title and a line, under a rule (DESIGN-v2 14; SITE-NOSLOP 2026-11-05: no tinted coin, no box) */
.benefit { display: grid; grid-template-columns: 24px minmax(0, 1fr); gap: var(--a-sp-1) 14px; align-content: start; }
.benefit > .icon { grid-row: span 3; width: 22px; height: 22px; margin-top: 1px; color: var(--a-ink-2); }
.benefit b { font-size: var(--a-t-md); font-weight: var(--a-w-head); }
.benefit p { color: var(--a-ink-2); font-size: var(--a-t-sm); }
.benefit .fv-slot { margin-top: var(--a-sp-3); }
.spec-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; }
.spec-grid.two { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.spec-grid.three { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.spec { display: flex; flex-direction: column; gap: 10px; min-width: 0; padding: var(--a-sp-5); border-radius: var(--radius-xl); background: var(--s-tile); box-shadow: var(--s-edge); }
.spec h3 { font-size: var(--a-t-lg); }
.spec > p { color: var(--a-ink-2); font-size: var(--a-t-sm); line-height: 1.55; }
.spec-mark { display: grid; place-items: center; width: 24px; height: 24px; color: var(--a-ink-2); }
/* the example under a card's words: set in the card, not in a second box (SITE-NOSLOP 2026-11-05: card in card) */
.spec-frag { margin-top: auto; padding-top: 6px; font-size: var(--a-t-xs); }
/* a report's lines as a small two-column ledger: the line's name, then what the report says */
dl.spec-frag { display: grid; gap: var(--a-sp-2); margin-bottom: var(--a-sp-1); font-size: var(--a-t-sm); }
dl.spec-frag > div { display: grid; grid-template-columns: minmax(0, 7rem) minmax(0, 1fr); gap: var(--a-sp-3); }
dl.spec-frag dt { color: var(--a-ink-2); font-weight: var(--a-w-text); }
dl.spec-frag dd { margin: 0; color: var(--a-ink); }
.spec-facts { display: grid; gap: 6px; font-size: var(--a-t-sm); }
.spec > .fv-slot { margin-top: auto; }
.bento { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; }
.bento-cell { position: relative; display: flex; flex-direction: column; gap: 10px; min-width: 0; padding: 22px; border-radius: var(--radius-xl); background: var(--s-tile);
  box-shadow: var(--s-edge); }
.bento-cell > .icon { width: 22px; height: 22px; color: var(--a-ink-2); }
.bento-wide { grid-column: span 2; }
.bento-half { grid-column: span 1; }
.bento-name { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; font-size: var(--a-t-md); font-weight: var(--a-w-head); line-height: 1.3; }
.cell-lead { color: var(--a-ink-2); font-size: var(--a-t-sm); line-height: 1.5; }
.cell-link { margin-top: auto; }
.cover-state { display: inline-flex; align-items: center; min-height: 22px; padding: 2px 9px 0; border-radius: var(--a-r-pill); background: var(--a-ok-bg); color: var(--a-ok-ink); font-size: var(--a-t-2xs); font-weight: var(--a-w-head); }
.chip-row { display: flex; flex-wrap: wrap; gap: var(--a-sp-2); }
.chip-row > * { display: inline-flex; align-items: center; min-height: 30px; padding: 2px var(--a-sp-3) 0; border-radius: var(--a-r-pill); background: var(--a-surface-2); color: var(--a-ink-2);
  box-shadow: var(--a-edge); font-size: var(--a-t-xs); font-weight: var(--a-w-label); }
.chip-team { background: var(--a-tag-bg); color: var(--a-tag-ink); box-shadow: none; }
.duo { display: grid; gap: 10px; }
.duo-row { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: var(--a-sp-3); align-items: center; padding: var(--a-sp-3) 14px; border-radius: 12px; background: var(--a-surface-2);
  font-size: var(--a-t-sm); }
.duo-out { color: var(--a-ink); font-weight: var(--a-w-strong); }
.figures { display: grid; grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr)); gap: var(--a-sp-6) var(--a-sp-7); }
/* a figure set large, with no tinted wash behind it (SITE-NOSLOP 2026-11-05) */
.figures > * { display: grid; align-content: start; gap: 6px; padding: 0; }
.figures span { color: var(--a-ink-2); font-size: var(--a-t-md); }
.figures-link { margin-top: 14px; }
.tally { display: inline-block; min-width: var(--count-w, auto); font-size: clamp(2.5rem, 4.4vw, 3.75rem); font-weight: var(--a-w-display); line-height: 0.95; letter-spacing: -0.04em;
  font-variant-numeric: tabular-nums; }
.frame-stage { position: relative; margin-top: var(--a-sp-2); }
.frame { overflow: hidden; border-radius: var(--radius-xl); background: var(--a-surface-solid); box-shadow: var(--s-panel); }
.frame-bar { display: flex; align-items: center; justify-content: space-between; gap: var(--a-sp-3); padding: 10px var(--a-sp-4); background: var(--a-ground-3); box-shadow: inset 0 -1px 0 var(--a-line);
  color: var(--a-ink-2); font-size: var(--a-t-xs); }
.frame-path { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: var(--a-mono); }
.frame-shot img, .frame img { width: 100%; height: auto; }
.frame-phone { max-width: 320px; margin-inline: auto; }
.tabs { position: relative; display: flex; flex-wrap: wrap; gap: var(--a-sp-1); padding: var(--a-sp-1); border-radius: var(--a-r-pill); background: var(--a-surface-2); box-shadow: var(--a-edge); width: max-content; max-width: 100%; }
.tab { position: relative; z-index: 1; min-height: 40px; padding: 2px var(--a-sp-4) 0; border: 0; border-radius: var(--a-r-pill); background: none; color: var(--a-ink-2); font: inherit;
  font-weight: var(--a-w-head); cursor: pointer; }
.tab[aria-selected="true"] { color: var(--a-on-lamp); }
.tab-ink { position: absolute; left: 0; top: 4px; bottom: 4px; width: 1px; border-radius: var(--a-r-pill); background: var(--a-lamp); transform-origin: left center;
  transform: translateX(var(--ink-x, 0)) scaleX(var(--ink-w, 0)); transition: transform var(--dur-move) var(--ease-standard); }
.tabpanel { margin-top: 18px; }
.frame-tabs { margin-bottom: var(--a-sp-1); }
.plate { padding: 22px var(--a-sp-5); border-radius: var(--radius-xl); background: var(--a-surface-2); box-shadow: var(--a-edge); }
.instrument { padding: var(--a-sp-5); border-radius: var(--radius-xl); background: var(--a-surface); box-shadow: var(--s-panel); }
.line, .mini-line { position: relative; display: grid; gap: 14px; padding-left: 0; }
.line .stop, .mini-line li { position: relative; display: grid; grid-template-columns: 64px 16px minmax(0, 1fr); gap: var(--a-sp-1) var(--a-sp-3); align-items: start; }
.line .stop-time, .mini-line time { grid-column: 1; grid-row: 1 / span 2; color: var(--a-ink-3); font-size: var(--a-t-xs); font-weight: var(--a-w-label); font-variant-numeric: tabular-nums; padding-top: 2px; }
.line .stop-mark { grid-column: 2; grid-row: 1; width: 14px; height: 14px; margin-top: 3px; border-radius: 50%; box-shadow: inset 0 0 0 3px var(--a-planned); }
.mini-line li::before { content: ""; grid-column: 2; grid-row: 1; width: 12px; height: 12px; margin-top: 3px; border-radius: 50%; box-shadow: inset 0 0 0 3px var(--a-planned); }
.line .stop-title, .line .stop-text, .mini-line li > span { grid-column: 3; min-width: 0; }
.line .stop-title { color: var(--a-ink); font-weight: var(--a-w-strong); }
.line .stop-text { color: var(--a-ink-2); font-size: var(--a-t-sm); }
.line .stop:not(:last-child)::after, .mini-line li:not(:last-child)::after { content: ""; position: absolute; left: 82px; top: 20px; bottom: -14px; width: 2px; background: var(--a-line-2); }
.stop-regional .stop-mark, .mini-line .ml-pending::before { box-shadow: inset 0 0 0 3px var(--a-warn); }
.stop-down .stop-mark, .stop-alert .stop-mark, .mini-line .ml-down::before, .mini-line .ml-alert::before { background: var(--a-fail); box-shadow: none; }
.stop-closed .stop-mark, .mini-line .ml-closed::before { background: var(--a-ok); box-shadow: none; }
.stop-planned .stop-mark { background: var(--a-planned); box-shadow: none; }
.stop-change .stop-mark, .mini-line .ml-change::before { box-shadow: inset 0 0 0 3px var(--a-planned); }
.here { display: inline-flex; margin-bottom: var(--a-sp-1); padding: 2px var(--a-sp-2) 0; border-radius: var(--a-r-pill); background: var(--a-lamp); color: var(--a-on-lamp); font-size: var(--a-t-2xs); font-weight: var(--a-w-head); }
.steps-line { display: grid; gap: 18px; }
.glance-list { display: grid; gap: 0; }
.glance-list > div { display: grid; grid-template-columns: minmax(0, 9rem) minmax(0, 1fr); gap: var(--a-sp-3); padding: 10px 0; border-bottom: 1px solid var(--a-line); font-size: var(--a-t-sm); }
.glance-list dt { color: var(--a-ink-3); } .glance-list dd { margin: 0; color: var(--a-ink); }
.link-tiles { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; }
.link-tile { display: grid; gap: 6px; align-content: start; height: 100%; padding: 22px; border-radius: var(--radius-xl); background: var(--s-tile); box-shadow: var(--s-edge); color: var(--a-ink);
  text-decoration: none; }
@media (hover: hover) { .link-tile:hover { box-shadow: var(--s-edge-hover); text-decoration: none; } }
.link-tile span, .link-tile p { color: var(--a-ink-2); font-size: var(--a-t-sm); }
.rules-list { display: grid; gap: var(--a-sp-3); counter-reset: rule; }
.rules-list li { display: grid; grid-template-columns: 32px minmax(0, 1fr); gap: 14px; align-items: start; padding: var(--a-sp-4) 0; border-top: 1px solid var(--a-line); color: var(--a-ink-2); }
.rule-n { color: var(--a-lamp-ink); font-weight: var(--a-w-display); font-size: var(--a-t-lg); font-variant-numeric: tabular-nums; line-height: 1.3; }
.two { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.three { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.morning { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
.morning-card { padding: 22px; border-radius: var(--radius-xl); background: var(--s-tile); box-shadow: var(--s-edge); }
.morning-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: var(--a-sp-3); }
.client-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 10px; align-items: center; padding: 10px var(--a-sp-3); border-radius: 10px; background: var(--a-surface-2); }
.cause { color: var(--a-lamp-ink); font-weight: var(--a-w-strong); }
.sites { display: grid; gap: 6px; }
table.outcomes { width: 100%; border-collapse: separate; border-spacing: 0 6px; font-size: var(--a-t-sm); }
table.outcomes th { padding: 0 var(--a-sp-2) var(--a-sp-1) 0; color: var(--a-ink-2); font-size: var(--a-t-xs); font-weight: var(--a-w-label); text-align: left; }
table.outcomes td { padding: 0 var(--a-sp-2) 0 0; vertical-align: middle; }
.region-read { display: block; padding: var(--a-sp-2) 10px 6px; border-radius: 10px; background: var(--a-surface-2); color: var(--a-ink); font-size: var(--a-t-sm); }
.region-read.fail { background: var(--a-fail-bg); color: var(--a-fail-ink); } .region-read.none { color: var(--a-ink-3); }
.svc { display: flex; align-items: center; gap: var(--a-sp-2); } .svc-down { color: var(--a-fail-ink); }
.lvl { display: inline-flex; align-items: center; min-height: 22px; padding: 2px var(--a-sp-2) 0; border-radius: var(--a-r-pill); font-size: var(--a-t-2xs); font-weight: var(--a-w-head); }
.lvl-critical { background: var(--a-fail-strong); color: var(--on-fail); } .lvl-warning { background: var(--a-warn-bg); color: var(--a-warn-ink); } .lvl-notice { background: var(--a-planned-bg); color: var(--a-planned-ink); }
.radar-list { display: grid; gap: 6px; }
.paste { display: block; padding: var(--a-sp-3) 14px; border-radius: 10px; background: var(--s-code-bg); color: var(--s-code-ink); font-family: var(--a-mono); font-size: var(--a-t-xs); white-space: pre-wrap; }
.hb-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
.soon-list { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--a-sp-6) var(--a-sp-7); }
.soon-item { display: grid; gap: 10px; align-content: start; }
.soon-item h3 { font-size: var(--a-t-lg); } .soon-item p { color: var(--a-ink-2); font-size: var(--a-t-sm); }
.soon-item .icon { width: 22px; height: 22px; color: var(--a-ink-3); }
.soon-more { margin-top: 18px; }
.gaps { color: var(--a-ink-2); }
.change { color: var(--a-planned-ink); }
.marked { color: var(--a-lamp-ink); font-weight: var(--a-w-strong); }
/* what every plan has: a list of rows, the icon beside each line, in the text's own colour; not a column of lamp-yellow lines with
   dots (SITE-NOSLOP 2026-11-05: the lamp is for the one action and "you are here", never for running text) */
ul.marked { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px var(--a-sp-7); color: var(--a-ink); font-weight: var(--a-w-text); }
ul.marked li { display: grid; grid-template-columns: 24px minmax(0, 1fr); gap: var(--a-sp-3); align-items: start; line-height: 1.5; }
.trio-mark { display: block; padding-top: 1px; color: var(--a-ink-2); }
.free-line { margin-top: 14px; color: var(--a-ink-2); font-size: var(--a-t-sm); }
.line.free-line .stop { grid-template-columns: 96px 16px minmax(0, 1fr); }   /* labels such as "Paid plan ends" on one line, phone too (audit SC-15) */
.line.free-line .stop:not(:last-child)::after { left: 114px; }
.cl-list { display: grid; gap: 0; }
.cl-list > li { display: grid; grid-template-columns: 120px minmax(0, 1fr); gap: 6px var(--a-sp-5); padding: 20px 0; border-top: 1px solid var(--a-line); }
.cl-list time { color: var(--a-ink-3); font-size: var(--a-t-sm); font-weight: var(--a-w-label); font-variant-numeric: tabular-nums; }
.cl-list h3 { font-size: var(--a-t-lg); }
.cl-list p { color: var(--a-ink-2); font-size: var(--a-t-sm); }
.cl-kind { margin-left: 10px; color: var(--a-ink-3); font-size: var(--a-t-xs); font-weight: var(--a-w-label); letter-spacing: 0; }
/* the two-region demo of How it works: thirty checks per region, the alerts above, a switch between one region and two */
.rule-demo { display: grid; gap: 14px; }
.rule-top { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px; }
.switch { display: inline-flex; align-items: center; gap: 10px; min-height: 44px; padding: 0; border: 0; background: none; color: var(--a-ink); font: inherit; font-weight: var(--a-w-label); cursor: pointer; }
.switch .opt { color: var(--a-ink-2); }
.switch-track { position: relative; display: inline-block; width: 46px; height: 26px; border-radius: var(--a-r-pill); background: var(--a-surface-3); box-shadow: var(--a-edge-2); }
.switch-thumb { position: absolute; top: 3px; left: 3px; width: 20px; height: 20px; border-radius: 50%; background: var(--a-ink-2); transition: transform var(--dur-move) var(--ease-standard); }
.switch[aria-checked="true"] .switch-track { background: var(--s-lamp-track); }
.switch[aria-checked="true"] .switch-thumb { background: var(--a-lamp); transform: translateX(20px); }
.rule-tracks { display: grid; gap: 6px; }
.rule-row { display: grid; grid-template-columns: 72px repeat(30, minmax(0, 1fr)); gap: 3px; align-items: center; color: var(--a-ink-2); font-size: var(--a-t-2xs); font-weight: var(--a-w-head); }
.rule-row i { height: 18px; border-radius: 3px; background: var(--a-ok); }
.rule-row i.fail { background: var(--a-fail); }
.rule-row i.agree { box-shadow: 0 0 0 2px var(--a-lamp); }
.rule-row.alerts i { display: grid; place-items: center; height: 22px; background: none; }
.rule-row .bell { width: 16px; height: 16px; color: var(--a-fail-ink); transition: opacity var(--dur-state) var(--ease-standard), transform var(--dur-state) var(--ease-standard); }
.rule-row .bell.false { color: var(--a-warn-ink); }
.js .rule-row .bell.gone { opacity: 0; transform: scale(0.6); }
.rule-readout { padding: var(--a-sp-3) 14px; border-radius: 12px; background: var(--a-surface-2); color: var(--a-ink); font-weight: var(--a-w-strong); }
.rule-key { display: flex; flex-wrap: wrap; gap: 6px var(--a-sp-4); color: var(--a-ink-3); font-size: var(--a-t-xs); }
.rule-key span { display: inline-flex; align-items: center; gap: 6px; }
.rule-key i { display: inline-block; width: 12px; height: 12px; border-radius: 3px; }
.k-ok { background: var(--a-ok); } .k-fail { background: var(--a-fail); }
.k-bell { width: 14px; height: 14px; color: var(--a-fail-ink); } .k-bell.false { color: var(--a-warn-ink); }
.lab-long { display: inline; }
.legend-note { margin-left: 6px; color: var(--a-ink-3); font-size: var(--a-t-xs); font-weight: var(--a-w-text); }
ul.legend { display: flex; flex-wrap: wrap; gap: var(--a-sp-2) 18px; padding: 0; }
ul.legend li { display: inline-flex; align-items: center; gap: 6px; }
ul.legend .steady { color: var(--a-ok-ink); } ul.legend .regional_issue { color: var(--a-warn-ink); } ul.legend .down { color: var(--a-fail-ink); } ul.legend .data_unavailable { color: var(--a-ink-3); }

/* ==== the pricing page's generated parts (web_pricing.py): the cards, who pays, which plan fits, every limit ==================== */
.pricing-page .page-head { padding-bottom: var(--a-sp-6); }
.who-row { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 14px; margin-top: var(--a-sp-3); }
.who-label { color: var(--a-ink-2); font-size: var(--a-t-sm); font-weight: var(--a-w-label); }
/* "Which plan fits?": one row per plan, the range of sites, the plan and its price, then what it adds */
.offer-row { display: grid; grid-template-columns: minmax(0, 1fr); gap: 14px; margin-top: 18px; }   /* OFFER 2026-11-04: the money-back guarantee, sales_open only */
.offer { display: grid; align-content: start; gap: var(--a-sp-2); min-width: 0; padding: 22px var(--a-sp-5); border-radius: var(--radius-xl); background: var(--a-surface-2); box-shadow: var(--a-edge); font-size: var(--a-t-sm); }
.offer h3 { font-size: var(--a-t-md, 1.125rem); font-weight: var(--a-w-head); line-height: 1.3; }
.offer p { color: var(--a-ink-2); }
.offer-tag { justify-self: start; display: inline-flex; align-items: center; min-height: 24px; padding: 2px 10px 0; border-radius: var(--a-r-pill); background: var(--a-surface-3); color: var(--a-ink); font-size: var(--a-t-2xs); font-weight: var(--a-w-head); }
.which { display: grid; gap: 10px; }
.which > li { display: grid; grid-template-columns: minmax(8.5rem, max-content) minmax(0, 1fr) minmax(0, 1.5fr); align-items: baseline; gap: 6px 20px; padding: var(--a-sp-4) 20px;
  border-radius: var(--a-r-card); background: var(--a-surface-2); box-shadow: var(--a-edge); }
.which > li.wh-more { background: transparent; box-shadow: inset 0 0 0 1px var(--a-line); }
.wh-range { color: var(--a-ink); font-weight: var(--a-w-head); font-variant-numeric: tabular-nums; white-space: nowrap; }
.wh-plan { color: var(--a-ink-2); }
.wh-plan b { color: var(--a-ink); font-weight: var(--a-w-head); }
.wh-facts { color: var(--a-ink-2); font-size: var(--a-t-sm); }
.plans-table thead th { color: var(--a-ink); font-size: var(--a-t-sm); }
.plans-table th[scope="col"] { width: 18%; }
@media (hover: hover) { .plans-table tbody tr:hover > * { background: var(--a-surface-2); } }
.plan-table { padding: 0; }
.plan-table .table-wrap { margin-top: 0; }
.plans-top { padding-top: var(--a-sp-5); }

/* Tables at every width (PRICING-FIX 2026-11-04, from tools/layout_scan.py). On a desktop the source column of a comparison and the
   row labels keep room for their words (they were set one word per line). On a phone a comparison table becomes one block per row: its
   label, then each cell under the column name it carries in `data-label` (the stacked layout the tables were written for, lost in the
   redesign: five columns squeezed into 343 px left 70 px per cell). Other tables keep their columns and scroll inside their box. */
.vs-table :is(th, td) { min-width: 9.5rem; }
.vs-table td.src, .vs-table tbody th[scope="row"] { min-width: 10rem; }
.table-wrap td > code:only-child { white-space: nowrap; }   /* an endpoint or a name is one token: it never breaks mid-path */
.table-wrap > table:not(.vs-table):has(thead th:nth-child(5)) { min-width: 60rem; }   /* five columns and more scroll in their box */
@media (max-width: 640px) {
  .vs-table thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  .vs-table, .vs-table tbody, .vs-table tr { display: block; width: 100%; }
  .vs-table caption { display: block; padding: var(--a-sp-3) var(--a-sp-4) 0; text-align: left; }
  .vs-table tr { padding: 14px var(--a-sp-4) var(--a-sp-3); border-bottom: 1px solid var(--a-line); }
  .vs-table tr:last-child { border-bottom: 0; }
  .table-wrap .vs-table th, .table-wrap .vs-table td, .vs-table th, .vs-table td { display: block; min-width: 0; padding: 0; border: 0; }
  .vs-table tbody th[scope="row"] { margin-bottom: var(--a-sp-1); min-width: 0; color: var(--a-ink); font-size: var(--a-t-md); }
  .vs-table td { padding-top: var(--a-sp-2); }
  .vs-table td::before { content: attr(data-label); display: block; margin-bottom: 2px; color: var(--a-ink-3); font-size: var(--a-t-xs); font-weight: var(--a-w-head); }
  /* the plan table's cells are short: the plan's name and its value on one line */
  .table-wrap .vs-table.plans-table td { display: grid; grid-template-columns: minmax(0, 7.5rem) minmax(0, 1fr); gap: var(--a-sp-3); padding-top: 6px; }
  .table-wrap .vs-table.plans-table td::before { margin: 0; }
  @media (hover: hover) { .plans-table tbody tr:hover > * { background: none; } }
  .table-wrap > table:not(.vs-table) { min-width: 40rem; }
  .table-wrap > table:not(.vs-table) thead th { white-space: nowrap; }   /* each column at least as wide as its name */
  .which > li { grid-template-columns: minmax(0, 1fr); gap: var(--a-sp-1); }
  /* a row of a card list: the title over its line, the arrow at the side (the title was squeezed to one word per line) */
  .card-links a { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 2px var(--a-sp-3); }
  .card-links a > span, .card-links a > small { grid-column: 1; }
  .card-links a > :not(span):not(small) { grid-column: 2; grid-row: 1 / span 2; }
  /* a reading row of a sample card: the host over its reading, the status at the side (the reading was drawn over the host) */
  .readings li { grid-template-columns: minmax(0, 1fr) auto; gap: 2px var(--a-sp-3); }
  .readings li > .r-name { overflow-wrap: anywhere; }
  .readings li > .r-val { grid-column: 1; grid-row: 2; text-align: left; color: var(--a-ink-2); font-size: var(--a-t-xs); }
  .readings li > :last-child:not(.r-name):not(.r-val) { grid-column: 2; grid-row: 1 / span 2; }
}
/* the team at phone width: one person per row, the photo beside the name (two columns set the titles one word per line) */
@media (max-width: 480px) {
  ul.people, ul.people-n4, ul.people-n6 { grid-template-columns: minmax(0, 1fr); gap: var(--a-sp-3); }
  ul.people-n7 > .person { flex-basis: 100%; }
  .people .person { grid-template-columns: 72px minmax(0, 1fr); justify-items: start; align-items: center; gap: 2px var(--a-sp-4); padding: var(--a-sp-4); text-align: left; }
  .people .person .avatar { grid-row: 1 / span 2; width: 72px; height: 72px; }
  .people .person-name { margin-top: 0; align-self: end; }
  .people .person-title { align-self: start; }
}

/* ==== the onboarding video (web_video.py) and the sample pages' frame (demo/sample_pages.py) ================================== */
.section-head { display: grid; gap: var(--a-sp-3); max-width: 46rem; margin-bottom: 28px; }
.video-frame { overflow: hidden; border-radius: var(--radius-xl); background: var(--a-ground); box-shadow: var(--s-panel); }
.video-frame video { width: 100%; height: auto; }
.video-in { display: grid; gap: var(--a-sp-4); }
.video-transcript { margin-top: var(--a-sp-3); color: var(--a-ink-2); }
.video-transcript summary { min-height: 44px; display: inline-flex; align-items: center; color: var(--a-ink); font-weight: var(--a-w-label); cursor: pointer; }
.video-transcript-body { max-width: var(--a-measure); line-height: var(--a-lh-read); }
.sample-browser, .sample-frame { overflow: hidden; border-radius: var(--radius-xl); box-shadow: var(--s-panel); }
.demo-label { display: inline-flex; align-items: center; min-height: 26px; padding: 2px 11px 0; border-radius: var(--a-r-pill); background: var(--a-test-bg); color: var(--a-test);
  font-size: var(--a-t-xs); font-weight: var(--a-w-head); }
.report-doc { border-radius: var(--radius-xl); overflow: hidden; }

@media (max-width: 1100px) {
  .ph-grid { grid-template-columns: minmax(0, 1fr); grid-template-areas: "title" "copy" "stage"; }
  .ph-stage { max-width: 640px; }
  .doc, .doc.doc-wide { grid-template-columns: 220px minmax(0, 1fr); }
  .doc > .doc-aside.end { grid-column: 2; position: static; }
  .doc.doc-plain { grid-template-columns: minmax(0, 1fr); }
  .rd-top { grid-template-columns: minmax(0, 1fr); }
  .rd-top > .rd-card { grid-column: 1; grid-row: auto; }
  .help-body, .contact-grid { grid-template-columns: minmax(0, 1fr); }
  /* an answer page stacks too: its 280 px side list left the answer a 0 px column on a phone, the steps written over by the list
     (QA-FINAL 2026-11-04, every help answer at 375) */
  .help-art { grid-template-columns: minmax(0, 1fr); gap: 36px; }
  .help-side { position: static; }
  .split { grid-template-columns: minmax(0, 1fr); gap: var(--a-sp-6); }
  .benefits, .spec-grid, .spec-grid.three, .bento, .tool-cards, .read-tiles, .tool-bento, .spec-bento, .soon-list, .link-tiles, .help-topics, .hp-wrap, .rd-cards, .figures {
    grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .bento-wide { grid-column: span 2; }
}
@media (max-width: 960px) {
  .doc, .doc.doc-wide, .doc.doc-plain { grid-template-columns: minmax(0, 1fr); gap: 28px; }
  .doc > .doc-aside { position: static; }
  .doc > .doc-aside.end { grid-column: auto; }
  .toc a { min-height: 44px; padding-block: var(--a-sp-3) 10px; }
  .vs-two, .spec-grid.two, .morning, .hb-list, .card-list, .built-list, .ledger { grid-template-columns: minmax(0, 1fr); }
  .cl-list > li { grid-template-columns: minmax(0, 1fr); }
  .legal-facts > div, .glance-list > div { grid-template-columns: minmax(0, 1fr); }
  .rule-row { grid-template-columns: 34px repeat(30, minmax(0, 1fr)); gap: 2px; }
  .rule-row i { height: 14px; }
  .lab-long { display: none; }
}
@media (max-width: 640px) {
  .benefits, .spec-grid, .spec-grid.three, .bento, .tool-cards, .read-tiles, .tool-bento, .spec-bento, .soon-list, .link-tiles, .help-topics, .hp-wrap, .rd-cards, .figures,
  .two, .three { grid-template-columns: minmax(0, 1fr); }
  .bento-wide { grid-column: auto; }
  .ph-title h1, .rd-title h1, .rd-head h1, .help-hero h1, .help-head h1 { font-size: clamp(2rem, 9vw, 2.5rem); }
  .joined { flex-direction: column; }
  .joined .btn { width: 100%; }
  .prose { font-size: var(--a-t-md); }
  .contact-grid { width: calc(100% - 32px); }
  .contact-card { padding: 20px; }
  .line .stop, .mini-line li { grid-template-columns: 52px 16px minmax(0, 1fr); }
  .line .stop:not(:last-child)::after, .mini-line li:not(:last-child)::after { left: 70px; }
}

/* ==== responsive ================================================================================================================ */
@media (max-width: 1180px) {
  .mega-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--a-sp-4) 18px; }
  .foot-top { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .foot-brand { grid-column: 1 / -1; }
  .plans-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .avail { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 1100px) {
  .nav, .nav-item { display: none; }
  .menu-toggle { display: inline-flex; }
  .bar-actions .btn-ghost { display: none; }
  .hero-grid, .fp-grid, .sec-head.is-split, .agree-grid { grid-template-columns: minmax(0, 1fr); }
  .scene { max-width: 640px; }
  .tile, .tile.w8, .tile.w6 { grid-column: span 6; }
  .cards, .guide-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .people-n6 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .fp-visual { max-width: 640px; }
  /* stacked, the caption sits in the picture's own frame, so it never reads as a label over the next section's heading */
  .fp-visual-note { position: static; margin: var(--a-sp-3) 6px 0; }
}
@media (max-width: 960px) {
  .sc-row { grid-template-columns: minmax(0, 1fr); }
  ul.marked { grid-template-columns: minmax(0, 1fr); }
  dl.also { grid-template-columns: minmax(0, 1fr); }
  .proof-card { grid-template-columns: minmax(0, 1fr); }
  .close .wrap { grid-template-columns: minmax(0, 1fr); }
  .close .actions, .close .fine { grid-column: 1; grid-row: auto; }
  .scr { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .scr-tile, .scr-timing, .scr-n1 .scr-tile, .scr-n2 .scr-tile { grid-column: span 1; }
  .scr-timing { grid-column: 1 / -1; }
  .steps { grid-template-columns: minmax(0, 1fr); }
  .step:not(:last-child)::after { display: none; }
  .faq-list, .gets, .gets.three-up, .rv-cards { grid-template-columns: minmax(0, 1fr); }
  .also-list { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 760px) {
  .lock { padding: var(--a-sp-5) var(--a-sp-4) var(--a-sp-4); }
  .lock-grid { grid-template-columns: minmax(0, 1fr); }
  .lock-wide { grid-row: auto; }
  .lock-card { margin: var(--a-sp-3) 0; padding: var(--a-sp-5) 18px; }
  .lock-actions .btn { width: 100%; }
  .people, .people-n4, .people-n6 { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--a-sp-4) var(--a-sp-3); }
  .people-n7 > .person { flex-basis: calc((100% - var(--a-sp-3)) / 2); }   /* two by two, the seventh centred */
}
@media (max-width: 640px) {
  :root { --gutter: 16px; }
  .wrap { width: calc(100% - 32px); }
  body { font-size: 1rem; }
  .bar-in { gap: var(--a-sp-3); }
  .bar .btn { min-height: 40px; padding: 2px 13px 0; font-size: var(--a-t-ui); }
  .menu-toggle { padding-inline: 11px; }
  .menu-word { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  .wordmark { font-size: var(--a-t-md); gap: var(--a-sp-2); }
  .bar-long { display: none; }
  .hero { padding: 40px 0 72px; }
  .hero h1 { font-size: clamp(2.2rem, 10vw, 2.6rem); }
  .hero .lede { font-size: var(--a-t-read); }
  .check-box { flex-direction: column; }
  .check-box .btn { width: 100%; }
  .scene { grid-template-columns: minmax(0, 1fr); margin-top: var(--a-sp-2); }
  .rows li { grid-template-columns: minmax(0, 1fr) auto; }
  .rows svg, .rows .ms { display: none; }
  .k-big { font-size: var(--a-t-figure-sm); }
  .board-tiles { grid-template-columns: minmax(0, 1fr); }
  .tile, .tile.w8, .tile.w6, .tile.w12 { grid-column: auto; padding: 20px; }
  .tile-split { grid-template-columns: minmax(0, 1fr); }
  .proof-grid, .cards, .guide-cards, .plans-grid, .also-list, #soon .cards:has(> li:nth-child(4):last-child) { grid-template-columns: minmax(0, 1fr); }
  .figures { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .figures > :last-child:nth-child(odd) { grid-column: 1 / -1; }
  .avail { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .strip-list { gap: 34px; padding-right: 34px; }
  .strip-list li { font-size: 1rem; }
  .sec-head { margin-bottom: var(--a-sp-6); }
  .sec-lead { font-size: var(--a-t-md); }
  .close { padding: 72px 0 80px; }
  .page-head { padding: 40px 0 52px; }
  .foot-top { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .scr { grid-template-columns: minmax(0, 1fr); }
  .scr-tile { grid-column: 1 / -1; padding: var(--a-sp-4); }
  /* on a phone the card is a row under the example, inside the card: floating, it covered the example and the caveat under it */
  .fp-toast { position: relative; right: auto; bottom: auto; width: auto; margin-top: var(--a-sp-3); transform: none; }
  .fp-visual:has(> .fp-toast) { padding-bottom: 18px; }
  .step, .plan { padding: 20px; }
  .mega { display: none; }
  table.outcomes .r-st { white-space: normal; }   /* "Regional issue, no alert" wraps instead of pushing the table past its card (375 px: +48 px) */
}
/* the bar on a phone under 420 px: wordmark 105 + theme switch 102 + Start free 92 + menu 42 and their gaps need 401 px of screen, so a 375 or
   390 px phone cut the menu button's circle on every page. The theme switch gives way; the menu sheet has its own (.menu-theme). */
@media (max-width: 420px) {
  .bar-actions .theme-switch { display: none; }
}
/* touch targets: on a narrow screen or a coarse pointer every footer link (the wordmark too) and the help topic chip are 44 px tall */
@media (max-width: 960px), (pointer: coarse) {
  .foot li :is(a, .foot-btn) { min-height: 44px; }
  .foot .wordmark { min-height: 44px; }
  .rd-head .help-chip a { min-height: 44px; }
}
@media (pointer: coarse) { .seg-opt, .btn, .btn-sm, .bar .btn { min-height: 44px; } }   /* the bar's small buttons get the touch size too */
/* glass needs the blur behind it: where the browser has none, or the visitor asks for less transparency, the panels are solid */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .card, .mega, .fp-visual, .lock-card { background: var(--a-surface-solid); }
}
@media (prefers-reduced-transparency: reduce) {
  .card, .mega, .fp-visual, .lock-card, .bar::before { background: var(--a-surface-solid); -webkit-backdrop-filter: none; backdrop-filter: none; }
}
@media print {
  .bar, .notice-bar, .menu-sheet, .foot, .strips, .scene { display: none !important; }
  body, html { background: var(--s-print-paper); color: var(--s-print-ink); }
}
@media (forced-colors: active) {
  .card, .tile, .plan, .mega, .fp-visual { border: 1px solid CanvasText; }
  .btn { border: 1px solid ButtonText; }
  .btn-lamp, .btn-ghost, .btn-line { background: ButtonFace; color: ButtonText; box-shadow: none; }   /* no gloss: the system's own button */
}

/* the development build's own footer line (brand.dev_footer): never in a production build */
.dev-footer, body > p:last-of-type:not([class]) { margin: 0; padding: 10px var(--a-sp-5); background: var(--s-notice-bg); color: var(--a-ink-3); font-size: var(--a-t-xs); }

/* ==== site 2026-11-05 (D14, owner: "icons everywhere ... so it is more intuitive"): icons that read at a glance ==== */
/* the icons of the cards, the menu, the help topics, the "also" lists, the benefits, the steps and the strips: 20 px in the ink, not a
   muted grey; a Coming soon item keeps its quiet grey, it is not there yet */
.mega-ico, .tile-ico, .topic-icon, .spec-mark, dl.also dt :is(.icon, .glyph), .benefit > .icon, ul.marked li > .icon, .strip-list .icon { color: var(--a-ink); }
.mega-ico .icon, .tile-ico .icon, .topic-icon .ico, .spec-mark .icon, dl.also dt .icon, .benefit > .icon, ul.marked li > .icon { width: 20px; height: 20px; }
.mega-item.is-soon .mega-ico, .card-link.is-soon .tile-ico { color: var(--a-ink-3); }
.step h3, .stop-title { display: flex; align-items: center; gap: 10px; }
.step h3 .icon, .stop-title .icon { flex: none; width: 20px; height: 20px; color: var(--a-ink); }
/* a logo, or a channel's picture, on a light neutral tile: Slack's aubergine and the other brand colours read on the night ground,
   and a channel shown by name gets one of our stroke icons on the same tile, so a row of channels reads as one row of pictures
   (brands.svg and BRANDS.md: logos unmodified, only to show where alerts go) */
.logo-tile { display: inline-grid; place-items: center; flex: none; width: 40px; height: 40px; border-radius: 10px; background: var(--s-logo-tile); }
.logo-tile :is(.icon, .mark) { width: 24px; height: 24px; color: var(--s-logo-ink); }
.toast .ico.logo-tile { width: 32px; height: 32px; padding: 0; place-items: center; border-radius: 8px; }
.toast .ico.logo-tile .mark { width: 20px; height: 20px; }
@media print { .logo-tile { background: none; } }

/* ==== the feature pages and the pricing tables in one family (kept from D15, 2026-11-05, on the theme v2 tokens) ==== */
:root {
  --f-muted: var(--muted); --f-muted-2: var(--hover); --f-pad: clamp(64px, 8vw, 112px); --f-strip-pad: clamp(48px, 6vw, 80px);
  --f-lattice: var(--border); --f-cell: var(--card); --f-cell-hover: var(--hover); --f-frame: color-mix(in srgb, var(--muted) 70%, var(--background));
  --f-ease-out: var(--motion-ease-out); --f-dur-enter: var(--motion-sheet); --f-dur-state: var(--motion-base); --f-dur-lift: var(--motion-slow);
}
/* ---- the feature pages and the pricing page in the same family (SITE-REDESIGN 2026-11-06) ---- */
/* the close's actions and fine print sit in the centre (the old grid placed them in a right column) */
.close .actions, .close .fine { grid-column: auto; grid-row: auto; align-self: center; }

/* Hero 3 (Efferd, #11428) on a feature page: the picture in one frame, a hairline and 8 px of the frame's ground round it */
.fp-visual { padding: var(--a-sp-2); border-radius: var(--a-r-card); background: var(--f-frame); box-shadow: inset 0 0 0 1px var(--a-line), 0 48px 96px -48px var(--s-shadow-ink);
  -webkit-backdrop-filter: none; backdrop-filter: none; }
.fp-visual .fv { padding: var(--a-sp-3); }

/* How It Works Timeline (olewandowski1, #19863): the steps as one list down a 1 px line, each number in a small bordered square, its
   title and one line beside it; on a wide screen the section's head sits on the left and the steps on the right */
.steps { display: grid; grid-template-columns: minmax(0, 1fr); gap: 0; max-width: 40rem; counter-reset: step; }
.step { display: grid; grid-template-columns: 40px minmax(0, 1fr); column-gap: var(--a-sp-5); row-gap: var(--a-sp-1); align-content: start; padding: 0 0 var(--a-sp-6);
  border-radius: 0; background: none; box-shadow: none; }
.step:last-child { padding-bottom: 0; }
.step-n { grid-row: 1 / span 2; display: grid; place-items: center; width: 40px; height: 40px; border-radius: var(--a-r-xs); background: var(--f-muted);
  box-shadow: inset 0 0 0 1px var(--a-line); color: var(--a-ink); font-size: var(--a-t-sm); font-weight: 600; }
.step:not(:last-child)::after { top: 44px; bottom: 4px; left: 19.5px; right: auto; width: 1px; height: auto; background: var(--a-line); }
.step h3 { margin-top: 0; padding-top: 8px; font-size: var(--a-t-md); font-weight: 600; letter-spacing: -0.015em; }
.step h3 .icon { width: 18px; height: 18px; color: var(--a-ink-2); }
.step p { grid-column: 2; }
@media screen and (min-width: 1101px) {
  #how > .wrap:has(> .steps) { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); column-gap: var(--a-sp-8); align-items: start; }
  #how > .wrap:has(> .steps) > .sec-head { margin-bottom: 0; }
}

/* What you get, in the lattice (Efferd Grid Feature Cards' anatomy): a line icon, the title, its line; flat cells, 1 px between */
.gets { gap: 1px; padding: 1px; overflow: hidden; border-radius: var(--a-r-card); background: var(--f-lattice); }
.get { padding: var(--a-sp-5); background: var(--f-cell); }

/* which plans include it: one row of hairline cells, the plans that have it marked by a quiet ok ink, not a green panel */
.avail { gap: 1px; padding: 1px; overflow: hidden; border-radius: var(--a-r-card); background: var(--f-lattice); }
.avail li { border-radius: 0; background: var(--f-cell); box-shadow: none; }
.avail li.is-on { background: var(--f-cell); box-shadow: inset 0 2px 0 var(--a-ok); }

/* Feature Comparison Table (olewandowski1, #21218): the plan names stay in view while the rows scroll under the bar, and a group
   ("Check types") is a caption row across the table */
.plans-table thead th { position: sticky; top: var(--a-bar-h); z-index: 1; }
.plan-table .table-wrap { overflow: visible; }
.plans-table tr.grp th { padding-top: var(--a-sp-5); background: none; color: var(--a-ink); font-size: var(--a-t-sm); font-weight: 700; letter-spacing: 0; }
.plans-soon { margin-top: var(--a-sp-3); color: var(--a-ink-2); font-size: var(--a-t-sm); }
@media screen and (max-width: 960px) { .plan-table .table-wrap { overflow-x: auto; } .plans-table thead th { position: static; } }

/* Hero 3's frame (Efferd, #11428) round the picture of every page head with a stage (segments, how it works, the free check, the
   changelog): a hairline, 8 px of the frame's ground and a second hairline, drawn as rings so no page's markup changes */
.ph-stage > .card { margin: 9px; border-radius: var(--a-r-sm); box-shadow: inset 0 0 0 1px var(--a-line), 0 0 0 8px var(--f-frame), 0 0 0 9px var(--a-line),
  0 48px 96px -40px var(--s-shadow-ink); }

/* the free check's readings: hairline rows that arrive one by one on motion.js `enter` (scan.js), so no CSS transition runs on them */
.sc-row { background: none; box-shadow: inset 0 0 0 1px var(--a-line); }

/* ==== the home page (the owner's approved preview, 2026-11-06) ================================================================ */
/* the first screen: the announcement, the motto, the lede, two actions and the app itself; behind them the network's glow and grid
   (shared/css/network-bg.css), reaching up under the clear bar */
.hero { position: relative; isolation: isolate; padding-top: 80px; }
.hero > .net-hero { inset: calc(-1 * (var(--a-bar-h) + 40px)) 0 0; }
.hero-in { display: flex; flex-direction: column; align-items: center; text-align: center; }
.hero-pill { display: inline-flex; align-items: center; gap: 10px; min-height: 32px; padding: 3px 14px 3px 3px; border-radius: var(--radius-full, 999px);
  border: 1px solid var(--border); background: var(--card); color: var(--foreground); text-decoration: none; font-size: var(--a-t-xs); font-weight: 500; line-height: 1.3;
  box-shadow: var(--shadow-2xs); }
@media (hover: hover) { .hero-pill:hover { background: var(--hover); text-decoration: none; } }
.hero-pill:active { transform: scale(var(--press-scale)); }
.hero-pill .pill-tag { display: inline-flex; align-items: center; height: 24px; padding: 0 10px; border-radius: var(--radius-full, 999px); background: var(--primary);
  color: var(--primary-foreground); font-size: var(--a-t-2xs); font-weight: 600; flex: none; }
.hero h1 { margin-top: 28px; max-width: 820px; font-size: clamp(2.5rem, 1.45rem + 3.4vw, 4rem); line-height: 1.04; letter-spacing: -0.038em; }
.hero .lede { margin-top: 24px; max-width: 600px; font-size: var(--a-t-read); text-wrap: balance; }
/* the home title as dust (site/js/hero-title.js): one canvas behind the hero's content, above its glow and grid, placed and sized by the
   script round the h1 and never catching the pointer. While it shows the words the h1 keeps its box and only lets go of its colour, so
   nothing shifts and the text stays for assistive technology, for a search and for a selection. Screens only: print shows the h1. */
.hero-dust { position: absolute; z-index: -1; display: block; pointer-events: none; }
@media screen { .hero h1.is-dust, .hero h1.is-dust .lit { color: transparent; } }
@media print { .hero-dust { display: none; } }
.hero-actions { margin-top: 36px; display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; }
/* G1 request (2026-11-09): on a phone the first screen keeps "Start free" in view (a 667 px high screen too): less air above the pill,
   between the parts and under the lede */
@media (max-width: 640px) {
  .hero { padding-top: 32px; }
  .hero h1 { margin-top: 20px; }
  .hero .lede { margin-top: 16px; }
  .hero-actions { margin-top: 24px; }
}
/* a page head's two actions (pricing, the samples: `div.cta`) keep the gap the home's have (they touched, G1 request 2026-11-09) */
.cta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--a-sp-3); }
.page-head .cta { margin-top: 28px; }
.shot { margin: 72px auto 0; width: min(1200px, 100% - 48px); }
.shot-frame { position: relative; padding: 8px; border-radius: 30px; background: color-mix(in srgb, var(--muted) 70%, var(--background)); border: 1px solid var(--border);
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04), 0 24px 48px -28px rgba(0, 0, 0, 0.18);
  transform: perspective(1400px) rotateX(var(--rx, 0deg)) rotateY(var(--ry, 0deg)) translateY(var(--ty, 0px)); transition: transform var(--motion-slow) var(--motion-ease-out); }
.shot-frame::before { content: ""; position: absolute; inset: 0; z-index: -1; border-radius: inherit; pointer-events: none; opacity: 0;
  box-shadow: 0 40px 72px -36px rgba(0, 0, 0, 0.3); transition: opacity var(--motion-slow) var(--motion-ease-out); }
.shot-frame::after { content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; opacity: 0;
  background: radial-gradient(560px circle at var(--gx, 50%) var(--gy, 0%), var(--glare), transparent 45%); transition: opacity var(--motion-slow) var(--motion-ease-out); }
.shot-frame img { display: block; width: 100%; height: auto; border-radius: 22px; border: 1px solid var(--border); background: var(--background); }
.shot-dark { display: none !important; }
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .shot-light { display: none !important; } :root:not([data-theme="light"]) .shot-dark { display: block !important; } }
:root[data-theme="dark"] .shot-light { display: none !important; }
:root[data-theme="dark"] .shot-dark { display: block !important; }
.shot figcaption { margin-top: 14px; text-align: center; font-size: var(--a-t-xs); color: var(--muted-foreground); }
/* the live demo over the screenshot (site.js initDemo): framed at the screenshot's own size and scaled to it, shown once it has drawn;
   below 1024 px the screenshot stays */
.shot-demo { position: absolute; inset: 8px; overflow: hidden; border-radius: 22px; border: 1px solid var(--border); background: var(--background);
  opacity: 0; pointer-events: none; transition: opacity var(--motion-slow) var(--motion-ease-out); }
.shot-demo iframe { display: block; width: 1440px; height: 680px; border: 0; transform-origin: 0 0; transform: scale(var(--demo-s, 1)); }
.shot-frame.has-demo .shot-demo { opacity: 1; pointer-events: auto; }
@media (max-width: 1023px) { .shot-demo { display: none; } }
@media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) {
  .shot-frame:hover { --ty: -4px; }
  .shot-frame:hover::before, .shot-frame:hover::after { opacity: 1; }
  .shot-frame.has-demo:hover { --ty: 0px; }
  .shot-frame.has-demo:hover::after { opacity: 0; }   /* the demo answers the pointer itself */
}

/* ---- features: the bento (owner's pick avanishverma4 "bento-grid-01"; its page shows no licence, so it is rebuilt clean-room from a
   description of its behaviour). One component on the home, /features and the feature blocks (pulse_saas/api/web_bento.py): six columns,
   rows of about 200 px, tiles 2x2, 2x1, 2x2, 2x1, 3x1 and 3x1; two columns on a tablet, one on a phone. The tiles rise once as the grid
   comes into view, one after another (site.js arms it only below the fold); on hover the tall tiles grow a little with a deeper shadow,
   the others settle a little and the edge lights (the shared .glow-fx), all on --motion-card. Inside, each picture plays its story while it
   is on screen (site.js steps s1..s4; the end at once under reduced motion; once on touch). Transform and opacity only.
   Premium direction, 2026-11-11: a tile is the product's glow card (`.glow` in its markup: the face, the 1 px edge and the light
   are glow.css's, in the accent of the tile's subject), and the response-time tile is live (site/js/bento-live.js). ---- */
.bento { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); grid-auto-rows: minmax(200px, auto); gap: 16px; }
.bento-tile { --glow-r: var(--radius-lg); display: flex; flex-direction: column; gap: 16px; min-width: 0; grid-column: span 2; padding: 20px; color: var(--card-foreground); }
.bento-tile.is-tall { grid-row: span 2; }
.bento-tile.is-wide { grid-column: span 3; flex-direction: row; align-items: stretch; gap: 20px; }
.bento-tile.is-wide > .bt-copy { flex: 1 1 42%; align-self: center; }
.bento-tile.is-wide > .bt-vis { order: 2; flex: 1 1 58%; }
.bento-tile:nth-child(2) { --i: 1; } .bento-tile:nth-child(3) { --i: 2; } .bento-tile:nth-child(4) { --i: 3; }
.bento-tile:nth-child(5) { --i: 4; } .bento-tile:nth-child(6) { --i: 5; }
.bt-copy h3 { font-size: var(--text-base); line-height: 1.35; font-weight: 600; letter-spacing: -0.01em; }
.bt-copy h3 a { color: inherit; text-decoration: none; }
@media (hover: hover) { .bt-copy h3 a:hover { text-decoration: underline; text-decoration-color: var(--acc, var(--primary-strong)); text-decoration-thickness: 2px; text-underline-offset: 3px; } }
.bt-copy p { margin-top: 6px; font-size: var(--a-t-sm); line-height: 1.55; color: var(--muted-foreground); max-width: 56ch; }
.bt-vis { position: relative; flex: 1 1 auto; display: grid; align-content: center; gap: 10px; min-height: 112px; padding: 16px; overflow: hidden;
  border-radius: 14px; border: 1px solid var(--border); background: color-mix(in srgb, var(--muted) 55%, transparent); font-size: var(--a-t-xs); }
.bt-vis .ic { width: 14px; height: 14px; flex: none; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }

/* the stories' pause (WCAG 2.2.2): shown by site.js only while the pictures loop (Full motion, a fine pointer) */
.bento-bar { display: flex; justify-content: flex-end; margin-bottom: 12px; }
.bento-bar[hidden] { display: none; }
.bento-pause { display: inline-flex; align-items: center; gap: 8px; min-height: 32px; padding: 0 12px; border-radius: 999px; border: 1px solid var(--border);
  background: var(--card); color: var(--muted-foreground); font: inherit; font-size: var(--a-t-xs); font-weight: 500; cursor: pointer; }
@media (hover: hover) { .bento-pause:hover { color: var(--foreground); } }
.bento-pause:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }
.bento-pause .ic { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.bento-pause .i-play, .bento-pause[aria-pressed="true"] .i-pause { display: none; }
.bento-pause[aria-pressed="true"] .i-play { display: inline; }

/* the entry: armed by site.js only when the grid starts below the fold; never in print */
@keyframes bt-rise { from { opacity: 0; transform: translateY(30px); } }
.bento.is-armed:not(.is-in) .bento-tile { opacity: 0; transform: translateY(30px); }
.bento.is-in .bento-tile { animation: bt-rise var(--motion-rise) var(--motion-ease-out) backwards;
  animation-delay: calc(var(--i, 0) * var(--motion-stagger-section) * 1.4); }
@media print { .bento.is-armed:not(.is-in) .bento-tile { opacity: 1; transform: none; } }

/* the pointer: tall tiles grow, the others settle (the glow card gives the edge light, the soft fill and the grid) */
.bento-tile.glow { transition: transform var(--motion-card) var(--motion-ease-out); }
.bento-tile.is-tall.glow::after { box-shadow: 0 32px 64px -30px rgba(0, 0, 0, 0.38); }
@media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) {
  .bento-tile.glow:hover { transform: scale(0.98); }
  .bento-tile.is-tall.glow:hover { transform: scale(1.02); }
}

/* the alerts each story ends on */
.pop { position: absolute; left: 50%; bottom: 14px; z-index: 1; display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; border-radius: 999px;
  border: 1px solid var(--border); background: var(--card); font-size: var(--a-t-xs); font-weight: 600; white-space: nowrap; box-shadow: 0 10px 24px -14px rgba(0, 0, 0, 0.4);
  opacity: 0; transform: translate(-50%, 10px); transition: transform var(--motion-card) var(--motion-ease-out), opacity var(--motion-card) var(--motion-ease-out); }
.pop-fail { border-color: var(--fail-edge); background: var(--fail-bg); color: var(--fail-ink); }
.pop-warn { border-color: var(--warn-edge); background: var(--warn-bg); color: var(--warn-ink); }
.pop-cause { border-color: color-mix(in srgb, var(--primary) 50%, var(--border)); background: color-mix(in srgb, var(--primary) 16%, var(--card)); color: var(--foreground); }

/* uptime: a bar a check from each region, a sweep across, the last checks fail in both, then the alert */
.vis-uptime, .vis-why { align-content: center; justify-items: stretch; }
.vis-uptime .pop, .vis-why .pop { position: static; left: auto; justify-self: center; margin-top: 8px; transform: translateY(10px); }
.bt-uptime.s3 .pop, .bt-why.s4 .pop { opacity: 1; transform: none; }
.vis-uptime { gap: 16px; }
.bt-uptime .bars i { height: 34px; }
.up-row { display: grid; gap: 6px; }
.up-row b { font-size: var(--a-t-2xs); font-weight: 600; color: var(--muted-foreground); }
.bars { display: grid; grid-template-columns: repeat(30, minmax(0, 1fr)); gap: 3px; }
.bars i { position: relative; height: 26px; border-radius: 3px; background: var(--ok); }
.bars i::after { content: ""; position: absolute; inset: 0; border-radius: inherit; background: var(--fail); opacity: 0;
  transition: opacity var(--motion-slow) var(--motion-ease-out); }
.sweep { position: absolute; inset: 0; pointer-events: none; opacity: 0; transform: translateX(-100%);
  background: linear-gradient(90deg, transparent 70%, color-mix(in srgb, var(--primary) 30%, transparent) 97%, var(--primary-strong) 100%); }
.s1 .sweep { opacity: 1; transform: translateX(0); transition: transform var(--motion-pulse) var(--motion-ease-out), opacity var(--motion-base) var(--motion-ease-out); }
.s2 .sweep { opacity: 0; transition: opacity var(--motion-card) var(--motion-ease-out); }
.s2 .bars i:nth-last-child(-n+4)::after { opacity: 1; }
.s2 .bars i:nth-last-child(3)::after { transition-delay: calc(var(--motion-stagger-bar) * 3); }
.s2 .bars i:nth-last-child(2)::after { transition-delay: calc(var(--motion-stagger-bar) * 6); }
.s2 .bars i:nth-last-child(1)::after { transition-delay: calc(var(--motion-stagger-bar) * 9); }

/* response time, the live piece: the figure that counts, the area line read with a crosshair (shared/js/live.js, in the tile's
   indigo) under a cover that slides away, each region's own reading, the slower region. Example data, and the card says so. */
.vis-resp { align-content: start; gap: 12px; padding-bottom: 60px; }   /* the alert (34 px, 14 px from the foot) keeps the tile's 12 px gap under the readings */
.resp-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
.resp-regions { display: grid; gap: 4px; }
.resp-region { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; color: var(--muted-foreground); }
.resp-region b { min-width: 0; font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.resp-region .live-num { flex: none; color: var(--foreground); font-weight: 600; }
.spark[data-resp-chart] { height: 96px; }
.spark .live-chart { position: absolute; inset: 0 6px 0 0; min-height: 0; }   /* the newest reading's point (12 px, centred on the line's end) stays whole inside the picture, which clips */
.spark .live-chart:focus-visible { outline-offset: -2px; }   /* the picture clips what is outside it: the ring sits inside */
.resp-head .fig { flex-wrap: wrap; row-gap: 4px; }
.resp-head .fig small { flex-basis: 100%; margin-left: 0; }
.fig { display: flex; align-items: baseline; gap: 6px; color: var(--muted-foreground); opacity: 0; transform: translateY(8px);
  transition: transform var(--motion-card) var(--motion-ease-out), opacity var(--motion-card) var(--motion-ease-out); }
.fig b { font-size: var(--text-3xl); line-height: 1; font-weight: 600; letter-spacing: -0.02em; color: var(--foreground); font-variant-numeric: tabular-nums; }
.fig small { margin-left: 4px; font-size: var(--a-t-2xs); }
.spark { position: relative; display: block; height: 40px; overflow: hidden; }
.spark svg { display: block; width: 100%; height: 100%; overflow: visible; }
.spark > svg path { fill: none; stroke: var(--acc, var(--series-1)); stroke-width: 2.25; stroke-linecap: round; stroke-linejoin: round; vector-effect: non-scaling-stroke; }
.spark .cover { position: absolute; inset: -2px; background: color-mix(in srgb, var(--muted) 55%, var(--card)); transform-origin: 100% 50%;
  transition: transform var(--motion-pulse) var(--motion-ease-out); }
.s1 .fig { opacity: 1; transform: none; }
.s2 .spark .cover { transform: scaleX(0); }
.bt-resp.s3 .pop { opacity: 1; transform: translate(-50%, 0); }

/* why: three moments arrive one by one, then the likely cause */
.vis-why { gap: 14px; }
.vis-why .pop { display: grid; gap: 2px; justify-self: stretch; padding: 10px 12px; border-radius: 12px; text-align: left; white-space: normal; }
.vis-why .pop small { font-size: var(--a-t-2xs); font-weight: 500; color: var(--muted-foreground); }
.st { display: grid; grid-template-columns: 10px auto 1fr; align-items: center; gap: 10px; padding: 10px 12px; border-radius: 10px; border: 1px solid var(--border);
  background: var(--card); font-size: var(--a-t-ui); font-weight: 500; opacity: 0; transform: translateX(-12px);
  transition: transform var(--motion-card) var(--motion-ease-out), opacity var(--motion-card) var(--motion-ease-out); }
.st b { font-weight: 600; color: var(--muted-foreground); font-variant-numeric: tabular-nums; }
.st i { width: 10px; height: 10px; border-radius: 50%; }
.st .k-chg { background: var(--info); } .st .k-one { background: var(--partial); } .st .k-down { background: var(--fail); }
.s1 .st:nth-child(1), .s2 .st:nth-child(2), .s3 .st:nth-child(3) { opacity: 1; transform: none; }

/* DNS: the old value flips to the new one, "changed", then the second region's tick */
.rec { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border-radius: 10px; border: 1px solid var(--border); background: var(--card);
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: var(--a-t-xs); }
.rec > b { display: inline-grid; place-items: center; min-width: 26px; height: 22px; border-radius: 6px; background: var(--muted); font-size: var(--a-t-2xs); }
.val { display: inline-grid; overflow: hidden; }
.val > span { grid-area: 1 / 1; transition: transform var(--motion-count) var(--motion-ease-out), opacity var(--motion-count) var(--motion-ease-out); }
.val .new { opacity: 0; transform: translateY(100%); }
.s1 .val .old { opacity: 0; transform: translateY(-100%); }
.s1 .val .new { opacity: 1; transform: none; }
.chips { display: flex; flex-wrap: wrap; gap: 8px; }
.chip { display: inline-flex; align-items: center; gap: 6px; min-height: 26px; padding: 0 10px; border-radius: 999px; border: 1px solid var(--border);
  font-size: var(--a-t-2xs); font-weight: 600; opacity: 0; transform: scale(0.92);
  transition: transform var(--motion-card) var(--motion-ease-out), opacity var(--motion-card) var(--motion-ease-out); }
.chip-info { border-color: var(--info-edge); background: var(--info-bg); color: var(--info-ink); }
.chip-ok { border-color: var(--ok-edge); background: var(--ok-bg); color: var(--ok-ink); }
.s2 .chip-info, .s3 .chip { opacity: 1; transform: none; }

/* signs of an attack: a scan down the page, the three signs light in turn, then the alert */
.vis-attack { align-content: start; padding-bottom: 52px; }
.scan { position: absolute; inset: 0; pointer-events: none; opacity: 0; transform: translateY(-100%);
  background: linear-gradient(180deg, transparent 60%, color-mix(in srgb, var(--warn) 32%, transparent) 96%, var(--warn) 100%); }
.s1 .scan { opacity: 1; transform: translateY(0); transition: transform var(--motion-pulse) var(--motion-ease-out), opacity var(--motion-base) var(--motion-ease-out); }
.sigs { display: grid; gap: 8px; justify-items: start; }
.sig { position: relative; display: inline-flex; align-items: center; gap: 7px; min-height: 28px; padding: 0 11px; border-radius: 999px; border: 1px solid var(--border);
  background: var(--card); font-weight: 500; color: var(--muted-foreground); white-space: nowrap; }
.sig::after { content: ""; position: absolute; inset: -1px; border-radius: inherit; border: 1px solid var(--warn-edge); background: color-mix(in srgb, var(--warn) 14%, transparent);
  opacity: 0; transition: opacity var(--motion-card) var(--motion-ease-out); }
.s2 .sig:nth-child(1)::after, .s3 .sig:nth-child(2)::after, .s4 .sig:nth-child(3)::after { opacity: 1; }
.bt-attack.s2 .scan { opacity: 0; transition: opacity var(--motion-card) var(--motion-ease-out); }
.bt-attack.s5 .pop { opacity: 1; transform: translate(-50%, 0); }

/* SSL and domain: 30 days left becomes 14, and the alert arrives on the phone */
.vis-ssl { grid-template-columns: auto minmax(0, 1fr); align-items: center; column-gap: 18px; }
.count { display: grid; justify-items: center; gap: 2px; padding: 10px 12px; border-radius: 12px; border: 1px solid var(--border); background: var(--card);
  color: var(--muted-foreground); }
.num { display: inline-grid; overflow: hidden; }
.num > b { grid-area: 1 / 1; font-size: var(--a-t-figure-md); line-height: 1.05; font-weight: 600; letter-spacing: -0.03em; color: var(--foreground); font-variant-numeric: tabular-nums;
  transition: transform var(--motion-count) var(--motion-ease-out), opacity var(--motion-count) var(--motion-ease-out); }
.num .n14 { opacity: 0; transform: translateY(100%); }
.s1 .num .n30 { opacity: 0; transform: translateY(-100%); }
.s1 .num .n14 { opacity: 1; transform: none; color: var(--warn-ink); }
.phone { justify-self: stretch; display: grid; align-content: start; max-width: 230px; height: 112px; padding: 26px 10px 0; overflow: hidden;
  border-radius: 22px 22px 0 0; border: 1px solid var(--border); border-bottom: 0; background: var(--background); }
.notif { display: flex; align-items: center; gap: 8px; padding: 8px 10px; border-radius: 12px; border: 1px solid var(--border); background: var(--card);
  box-shadow: 0 8px 18px -12px rgba(0, 0, 0, 0.45); font-size: var(--a-t-2xs); line-height: 1.3; opacity: 0; transform: translateY(-14px);
  transition: transform var(--motion-card) var(--motion-ease-out), opacity var(--motion-card) var(--motion-ease-out); }
.notif .ic { color: var(--warn-ink); }
.notif b { display: block; font-weight: 600; }
.notif > span { white-space: nowrap; }
.s2 .notif { opacity: 1; transform: none; }

@media (max-width: 1100px) {
  .bento { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .bento-tile, .bento-tile.is-wide { grid-column: span 1; }
  .bento-tile.is-wide { grid-column: 1 / -1; }
}
@media (max-width: 640px) {
  .bento { grid-template-columns: minmax(0, 1fr); grid-auto-rows: auto; }
  .bento-tile, .bento-tile.is-tall, .bento-tile.is-wide { grid-column: auto; grid-row: auto; }
  .bento-tile.is-wide { flex-direction: column; }
  .bento-tile.is-wide > .bt-vis { order: 0; }
  .bento-tile.is-wide > .bt-vis, .bento-tile.is-wide > .bt-copy { flex: 0 0 auto; }   /* a picture keeps its height in a column (the live tile's regions were cut) */
}

/* ---- How it works on the home: three steps in one compact row (owner 2026-11-06: "smaller or gone"): a small number, a title and one
   line each, no picture; the cards answer the pointer like every card (.glow-fx) ---- */
.how-steps { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; }
.how-steps li { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: start; gap: 12px; padding: 16px 18px;
  border-radius: var(--radius-lg); border: 1px solid var(--border); background: var(--card); }
.how-n { display: grid; place-items: center; width: 26px; height: 26px; border-radius: 999px; background: var(--tile-bg); color: var(--tile-ink);
  box-shadow: inset 0 0 0 1px var(--tile-edge); font-size: var(--a-t-2xs); font-weight: 600; font-variant-numeric: tabular-nums; }
.how-steps h3 { font-size: var(--a-t-ui); font-weight: 600; line-height: 1.35; }
.how-steps p { margin-top: 2px; font-size: var(--a-t-xs); line-height: 1.5; color: var(--muted-foreground); }
@media (max-width: 900px) { .how-steps { grid-template-columns: minmax(0, 1fr); } }
/* the step badge of the feature pages' steps */
.step-n { position: relative; z-index: 1; width: 26px; height: 26px; border-radius: var(--radius-full, 999px); display: grid; place-items: center; background: var(--tile-bg); color: var(--tile-ink);
  box-shadow: inset 0 0 0 1px var(--tile-edge); font-size: var(--a-t-ui); font-weight: 600; font-variant-numeric: tabular-nums; transition: transform var(--motion-slow) var(--motion-ease-out); }

/* ---- where the alerts go (rebuilt 2026-11-11, decisions 7, 8 and 9 of the premium direction; the owner on the old strip: "not framed
   well, the marks all look the same, logos can be used, moving ones"). A map, not a row of chips: the alert (the bell, in the amber
   of "attention") and the thirteen channels are fourteen equal cells of one grid on the section's left edge, joined by a rail; the
   alert's pulse runs along the rail and each channel's mark answers as it passes. After the behaviour of dillionverma's "Animated
   Beam" (21st.dev demo 919, Magic UI, MIT: shared/NOTICE.md), rebuilt in plain CSS: its beam is an SVG gradient moved by a script;
   here the beam is a comet on a straight rail, moved with transform alone.
   - Marks: a logo only where BRANDS.md allows it (Slack, Discord, Telegram, Opsgenie: unmodified, in the brand's colour or its one-colour
     ink); every other name has its own neutral line icon, never one picture on two names. A logo never moves: its tile does.
   - A channel is the product's card (.glow): its edge lights under the pointer, in the brand's colour on a logo's tile (--acc-rgb).
   - Motion: the cells arrive in turn once (site.js arms them below the fold), then the pulse runs ONCE each time the map comes on
     screen (Full motion only: under 3 s, so it needs no pause control); nothing runs off screen, in a hidden tab or under reduced
     motion, where the map is simply drawn. Transform and opacity only.
   - Framing: the title is the section's sub-heading, the map and the small print start on the same left edge; equal gaps: 16 px
     under the title, between the cells and above the small print. The gap above the grid is the map's, not the list's: the page's
     list reset (`ul[class]`) outranks a class on the list, so a margin written on `.chans` never exists, and the rails' box is the
     grid's box (inset 0), which puts each line on its row's centre. ---- */
.chan-title { font-size: var(--a-t-lg); font-weight: 600; line-height: 1.3; letter-spacing: -0.01em; color: var(--foreground); }
.chan-map { --chan-gap: 16px; --chan-hop: 240ms; --chan-drop: 240ms; --chan-run: 2400ms; position: relative; isolation: isolate; margin: var(--a-sp-4) 0 0; }
.chans { position: relative; z-index: 1; display: grid; grid-template-columns: repeat(7, minmax(0, 1fr));
  grid-auto-rows: 1fr; gap: var(--chan-gap, 16px); }
/* the same cells outside the map (the alert-channels feature page: no alert's cell, no rail): the grid alone, with its own room
   underneath, written with the element's name because the list reset outranks a class */
ul.chans-solo { margin: 0 0 var(--a-sp-7); }
.chan { --glow-r: var(--radius-sm); display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px; min-width: 0; min-height: 108px; padding: 16px 8px 14px;
  font-size: var(--a-t-ui); font-weight: 600; line-height: 1.25; text-align: center; text-wrap: balance; }
.chan.glow { transition: transform var(--motion-card) var(--motion-ease-out); }
.chan-ico { position: relative; flex: none; display: grid; place-items: center; width: 44px; height: 44px; border-radius: 12px; background: var(--s-logo-tile); color: var(--foreground); }
.chan-ico .icon { width: 20px; height: 20px; }
.chan-ico .mark { width: 24px; height: 24px; color: var(--s-logo-ink); }
/* the alert itself: the first cell, in the amber of "attention" (a cell like the others, so the block keeps one left edge) */
.chan-src { border-radius: var(--radius-sm); background: linear-gradient(rgba(var(--acc-rgb), 0.07), rgba(var(--acc-rgb), 0.07)), var(--glow-face); box-shadow: inset 0 0 0 1px rgba(var(--acc-rgb), 0.3); }
.chan-src .chan-ico { border-radius: 50%; background: rgba(var(--acc-rgb), 0.14); box-shadow: inset 0 0 0 1px rgba(var(--acc-rgb), 0.36); color: var(--acc); }
.chan-src .chan-ico .icon { width: 22px; height: 22px; }
/* a logo's tile lights in the brand's own colour (BRANDS.md); on the night Slack's aubergine and Opsgenie's navy cannot be seen, so
   their light is the one-colour ink their logo is drawn in there */
.chan[data-brand="slack"] { --acc-rgb: 74, 21, 75; }
.chan[data-brand="discord"] { --acc-rgb: 88, 101, 242; }
.chan[data-brand="telegram"] { --acc-rgb: 38, 165, 228; }
.chan[data-brand="opsgenie"] { --acc-rgb: 23, 43, 77; }
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .chan:is([data-brand="slack"], [data-brand="opsgenie"]) { --acc-rgb: 240, 240, 240; } }
:root[data-theme="dark"] .chan:is([data-brand="slack"], [data-brand="opsgenie"]) { --acc-rgb: 240, 240, 240; }
/* the rail: behind the cells, seen in the gaps between them. On a wide screen the two rows' lines and the short drop from the alert to
   the second row; the places are the grid's own (seven columns, two equal rows, one gap) */
.chan-rails { position: absolute; inset: 0; z-index: 0; pointer-events: none; }
.rail { position: absolute; display: block; background: rgba(var(--acc-rgb), 0.38); }
.rail-a, .rail-b { left: calc((100% - 6 * var(--chan-gap)) / 14); right: calc((100% - 6 * var(--chan-gap)) / 14); height: 1px; clip-path: inset(-6px 0); }
.rail-a { top: calc((100% - var(--chan-gap)) / 4); }
.rail-b { top: calc(100% - (100% - var(--chan-gap)) / 4); }
.rail-c { left: calc((100% - 6 * var(--chan-gap)) / 14); top: calc((100% - var(--chan-gap)) / 4); width: 1px; height: calc((100% + var(--chan-gap)) / 2); clip-path: inset(0 -6px); }
/* the pulse: a comet whose head is the end of a strip as long as its rail, so moving the strip by its own length carries the head
   from the alert to the last channel */
.rail::after { content: ""; position: absolute; border-radius: 3px; opacity: 0; }
.rail-a::after, .rail-b::after { inset: -1px 0; transform: translateX(-100%);
  background: linear-gradient(90deg, transparent calc(100% - 150px), rgba(var(--acc-rgb), 0.85) calc(100% - 4px), rgb(var(--acc-rgb)) 100%); }
.rail-c::after { inset: 0 -1px; transform: translateY(-100%); background: linear-gradient(180deg, transparent calc(100% - 80px), rgb(var(--acc-rgb)) 100%); }
/* a channel's answer: a ring round its mark's tile, in the tile's accent, as the head passes behind it */
.chan-ico::after { content: ""; position: absolute; inset: -3px; border-radius: 15px; opacity: 0; pointer-events: none;
  box-shadow: 0 0 0 1.5px rgb(var(--acc-rgb)), 0 0 12px rgba(var(--acc-rgb), 0.4); }
.chan-src .chan-ico::after { inset: 0; border-radius: 50%; box-shadow: 0 0 0 1.5px rgba(var(--acc-rgb), 0.8); }
/* where each cell is on the pulse's way: --c its column from the alert, --r its row */
.chan:nth-child(2) { --c: 1; } .chan:nth-child(3) { --c: 2; } .chan:nth-child(4) { --c: 3; } .chan:nth-child(5) { --c: 4; } .chan:nth-child(6) { --c: 5; }
.chan:nth-child(7) { --c: 6; } .chan:nth-child(n+8) { --r: 1; } .chan:nth-child(9) { --c: 1; } .chan:nth-child(10) { --c: 2; } .chan:nth-child(11) { --c: 3; }
.chan:nth-child(12) { --c: 4; } .chan:nth-child(13) { --c: 5; } .chan:nth-child(14) { --c: 6; }
@keyframes chan-run-x { 0% { opacity: 1; transform: translateX(-100%); } 60% { opacity: 1; transform: translateX(0); } 68%, 100% { opacity: 0; transform: translateX(0); } }
@keyframes chan-run-y { 0% { opacity: 1; transform: translateY(-100%); } 10% { opacity: 1; transform: translateY(0); } 14%, 100% { opacity: 0; transform: translateY(0); } }
@keyframes chan-run-down { 0% { opacity: 1; transform: translateY(-100%); } 60% { opacity: 1; transform: translateY(0); } 68%, 100% { opacity: 0; transform: translateY(0); } }
@keyframes chan-hit { 0% { opacity: 0; } 4% { opacity: 1; } 30%, 100% { opacity: 0; } }
@keyframes chan-ping { 0% { opacity: 0.8; transform: scale(1); } 30%, 100% { opacity: 0; transform: scale(1.5); } }
@media screen and (prefers-reduced-motion: no-preference) {
  :root[data-motion="full"] .chan-map.is-live .rail-a::after { animation: chan-run-x var(--chan-run) linear 1 both; }
  :root[data-motion="full"] .chan-map.is-live .rail-b::after { animation: chan-run-x var(--chan-run) linear var(--chan-drop) 1 both; }
  :root[data-motion="full"] .chan-map.is-live .rail-c::after { animation: chan-run-y var(--chan-run) linear 1 both; }
  :root[data-motion="full"] .chan-map.is-live .chan .chan-ico::after { animation: chan-hit var(--chan-run) linear calc(var(--c, 0) * var(--chan-hop) + var(--r, 0) * var(--chan-drop)) 1 both; }
  :root[data-motion="full"] .chan-map.is-live .chan-src .chan-ico::after { animation: chan-ping var(--chan-run) var(--motion-ease-out) 1 both; }
  /* the entry, once: armed by site.js only when the map starts below the fold */
  .chan-map.is-armed:not(.is-in) .chan { opacity: 0; transform: translateY(16px); }
  .chan-map.is-in .chan { animation: bt-rise var(--motion-rise) var(--motion-ease-out) backwards; animation-delay: calc((var(--c, 0) + var(--r, 0)) * 45ms); }
}
@media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) { .chan.glow:hover { transform: translateY(-3px); } }
/* under 860 px: the alert on top, the channels two by two down a spine, the last one across; the pulse runs down the spine */
@media (max-width: 860px) {
  .chan-map { --chan-gap: 10px; --chan-hop: 205ms; }
  .chans { grid-template-columns: repeat(2, minmax(0, 1fr)); grid-auto-rows: auto; gap: var(--chan-gap, 10px); }
  .chan { flex-direction: row; justify-content: flex-start; gap: 12px; min-height: 60px; padding: 8px 12px 8px 8px; text-align: left; }
  .chan-src { grid-column: 1 / -1; justify-content: center; min-height: 64px; padding: 0; }
  .chan:last-child { grid-column: 1 / -1; }
  .rail-a, .rail-b { display: none; }
  .rail-c { left: calc(50% - 0.5px); top: 32px; bottom: 30px; height: auto; }
  .rail-c::after { background: linear-gradient(180deg, transparent calc(100% - 120px), rgb(var(--acc-rgb)) 100%); }
  .chan:nth-child(n+2) { --r: 0; }
  .chan:nth-child(2), .chan:nth-child(3) { --c: 1; } .chan:nth-child(4), .chan:nth-child(5) { --c: 2; } .chan:nth-child(6), .chan:nth-child(7) { --c: 3; }
  .chan:nth-child(8), .chan:nth-child(9) { --c: 4; } .chan:nth-child(10), .chan:nth-child(11) { --c: 5; } .chan:nth-child(12), .chan:nth-child(13) { --c: 6; }
  .chan:nth-child(14) { --c: 7; }
}
/* under 372 px a cell is narrower than its longest name beside a 44 px tile (measured: "Rocket.Chat" is 86 px wide, the room 77 px at
   340 px and 67 px at 320 px): a 36 px tile, tighter gaps and 13 px words (80 px, in 83 px of room at 320 px). A logo keeps its 24 px.
   A word longer than its cell would break before it ran past the edge. */
@media (max-width: 371px) {
  .chan { gap: 6px; padding: 8px 6px 8px 8px; font-size: var(--a-t-xs); overflow-wrap: anywhere; }
  .chan-ico { width: 36px; height: 36px; border-radius: 10px; }
  .chan-ico::after { border-radius: 13px; }
}
@media screen and (max-width: 860px) and (prefers-reduced-motion: no-preference) { :root[data-motion="full"] .chan-map.is-live .rail-c::after { animation-name: chan-run-down; } }
@media print { .chan-rails { display: none; } }
.logo-ink { display: none; }
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .logo-brand { display: none; } :root:not([data-theme="light"]) .logo-ink { display: inline; } }
:root[data-theme="dark"] .logo-brand { display: none; }
:root[data-theme="dark"] .logo-ink { display: inline; }
.chan-note { margin: var(--a-sp-4) 0 0; max-width: var(--a-measure); font-size: var(--a-t-sm); line-height: 1.6; }

/* ---- the team on the home: dhxwhy "team-lanyard-rail" (MIT, port, made calm: no autoplay, no physics). Badges hang from one rail on
   straps of different lengths, each turned a little; hover turns one to the front and nudges its neighbours; a click or Enter turns it
   over to the title (site.js); on a narrow screen the row is a swipe strip that snaps. Flat: no gradient. Only team.json's words. ---- */
.lanyard { position: relative; padding-top: 14px; }
.lanyard-rail { position: absolute; left: 0; right: 0; top: 10px; height: 10px; border-radius: var(--radius-full, 999px); background: var(--muted); box-shadow: inset 0 0 0 1px var(--border); }
.hangs { list-style: none; margin: 0; position: relative; display: flex; justify-content: space-between; gap: clamp(12px, 2.4vw, 36px); }   /* end to end on the rail: the first badge under the heading's edge */
.hang-item { --w: clamp(118px, 11vw, 150px); position: relative; flex: 0 1 var(--w); width: var(--w); min-width: 118px; display: flex; flex-direction: column; align-items: center;
  transform-origin: 50% 0; transform: translateX(var(--nx, 0px)) rotate(var(--rz, 0deg)); transition: transform var(--motion-sheet) var(--motion-ease-out); }
.hang-item:nth-child(6n+1) { --drop: 6px;  --ry: 9deg;   --rz: -1.6deg; }
.hang-item:nth-child(6n+2) { --drop: 20px; --ry: -10deg; --rz: 1.2deg; }
.hang-item:nth-child(6n+3) { --drop: 0px;  --ry: 7deg;   --rz: -2deg; }
.hang-item:nth-child(6n+4) { --drop: 13px; --ry: -8deg;  --rz: 1.5deg; }
.hang-item:nth-child(6n+5) { --drop: 22px; --ry: 10deg;  --rz: -1deg; }
.hang-item:nth-child(6n+6) { --drop: 4px;  --ry: -7deg;  --rz: 1.8deg; }
.strap { display: block; width: 12px; height: calc(40px + var(--drop, 0px)); background: var(--primary); border-radius: 0 0 3px 3px; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.06); }
.clip { position: relative; z-index: 2; display: block; width: 34px; height: 12px; margin-top: -2px; border-radius: 4px; background: var(--muted-foreground); box-shadow: inset 0 -2px 0 rgba(0, 0, 0, 0.18); }
.badge-card { display: block; width: 100%; aspect-ratio: 62 / 96; margin-top: -5px; padding: 0; border: 0; border-radius: 16px; background: none; color: inherit; font: inherit;
  text-align: center; cursor: pointer; perspective: 900px; }
.flipper { position: relative; display: block; width: 100%; height: 100%; transform-style: preserve-3d; transform: rotateY(var(--ry, 0deg)) scale(var(--pop, 1));
  transition: transform var(--motion-sheet) var(--motion-ease-out); }
.badge-card[aria-pressed="true"] .flipper { transform: rotateY(180deg) scale(var(--pop, 1)); }
.badge-card:focus-visible .flipper { --ry: 0deg; }
.face { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; overflow: hidden; border-radius: 16px; border: 1px solid var(--border);
  background: var(--card); box-shadow: var(--shadow-md); -webkit-backface-visibility: hidden; backface-visibility: hidden; }
.face.back { transform: rotateY(180deg); justify-content: center; gap: 8px; padding: 52px 12px 18px; }
.band { position: absolute; inset: 0 0 auto; height: 40px; background: var(--tile-bg); border-bottom: 1px solid var(--tile-edge); }
.slot { position: absolute; left: 50%; top: 13px; width: 34px; height: 8px; margin-left: -17px; border-radius: var(--radius-full, 999px); background: var(--background); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.28); }
.ph { position: relative; display: block; margin-top: 54px; width: 62%; aspect-ratio: 1; border-radius: 50%; padding: 3px; background: var(--card); box-shadow: 0 0 0 1px var(--border), 0 4px 12px rgba(0, 0, 0, 0.08); }
.ph img, .ph .avatar-initials { display: grid; place-items: center; width: 100%; height: 100%; border-radius: 50%; object-fit: cover; }
.face .nm { margin-top: 14px; padding: 0 10px; font-size: var(--a-t-ui); font-weight: 600; line-height: 1.3; color: var(--foreground); }
.face.back .nm { margin-top: 0; padding: 0; }
.face .tt { font-size: var(--a-t-xs); line-height: 1.45; color: var(--muted-foreground); }
@media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) {
  .hang-item:hover { --rz: 0deg; }
  .hang-item:hover .flipper { --ry: 0deg; --pop: 1.06; }
  .hang-item:hover + .hang-item { --nx: 10px; }
  .hang-item:has(+ .hang-item:hover) { --nx: -10px; }
}
@media (max-width: 860px) {
  .hangs { justify-content: flex-start; overflow-x: auto; scroll-snap-type: x mandatory; scrollbar-width: none; overscroll-behavior-x: contain; }
  /* as ul.hangs: the list reset ul[class] outranks .hangs. A focused badge's ring (4 px) stays inside the strip, which clips (it was cut
     by 2.5 px at the left, by 3.4 px under the lowest badge); the 6 px of room at the ends sit in the gutter, so the first badge keeps
     the heading's edge (site.js centres a badge reached by keyboard) */
  ul.hangs { margin-inline: -6px; padding: 0 6px 8px; }
  .hangs::-webkit-scrollbar { display: none; }
  .hang-item { --w: 140px; flex: none; scroll-snap-align: center; }   /* the strip scrolls; above 860 px the badges shrink to fit the rail */
}
/* seven badges or more fit end to end at 118 px only from about 1024 px: below that they are the same swipe strip (a name in a
   narrower badge was cut, 2026-11-12) */
@media (min-width: 861px) and (max-width: 1024px) {
  .hangs:has(> .hang-item:nth-child(7)) { justify-content: flex-start; overflow-x: auto; scroll-snap-type: x mandatory; scrollbar-width: none; overscroll-behavior-x: contain; }
  ul.hangs:has(> .hang-item:nth-child(7)) { margin-inline: -6px; padding: 0 6px 8px; }
  .hangs:has(> .hang-item:nth-child(7))::-webkit-scrollbar { display: none; }
  .hangs:has(> .hang-item:nth-child(7)) > .hang-item { --w: 140px; flex: none; scroll-snap-align: center; }
}

/* ---- questions: after ruixen.ui "text-reveal-faqs" (clean-room). The shared line script makes each list an accordion (a button in the
   question, .is-open on the item, the first one open); site.js splits each answer into words that fade in turn as it opens (opacity
   only, so a screen reader reads one text). Without the scripts every answer shows. ---- */
.faq-list.is-acc .faq-item { border-bottom: 1px solid var(--border); }
.faq-list.is-acc .faq-q { margin: 0; font: inherit; }
.faq-btn { position: relative; isolation: isolate; display: flex; width: 100%; align-items: center; justify-content: space-between; gap: 24px; padding: 20px 0; border: 0;
  background: none; color: var(--foreground); text-align: left; font: inherit; font-size: 1rem; font-weight: 600; line-height: 1.45; cursor: pointer; }
.faq-btn::before { content: ""; position: absolute; inset: 6px -14px; z-index: -1; border-radius: 14px; background: var(--hover); opacity: 0;
  transition: opacity var(--motion-base) var(--motion-ease-out); }
.faq-btn .icon { width: 18px; height: 18px; color: var(--muted-foreground); transition: transform var(--motion-slow) var(--motion-ease-out); }
.faq-item.is-open .faq-btn .icon { transform: rotate(180deg); }
.faq-list.is-acc .faq-item:not(.is-open) .faq-a { display: none; }
.faq-list.is-acc .faq-a { padding: 0 48px 22px 0; color: var(--muted-foreground); }
/* the words of an answer arrive in turn as it opens (ruixen.ui "text-reveal-faqs", clean-room): each rises a little as it fades in, as
   an animation, which runs when the answer appears (a transition from display: none never does); at once under reduced motion */
@keyframes faq-word { from { opacity: 0; transform: translateY(0.4em); } }
.faq-a .w { display: inline-block; }
.faq-item.is-open .faq-a .w { animation: faq-word var(--motion-sheet) var(--motion-ease-sheet) backwards;
  animation-delay: calc(var(--i, 0) * var(--motion-stagger-row)); }
@media (hover: hover) and (pointer: fine) { .faq-btn:hover::before { opacity: 1; } .faq-btn:hover .icon { color: var(--foreground); } }

/* ---- reviews: the stagger (clean-room after vaib215 "stagger-testimonials": no licence shown), filled only from web/reviews.json by
   reviews.py; nothing at all while it holds no review. The middle card is raised, upright and inked with a folded corner. ---- */
.rv-head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px 24px; margin-bottom: 24px; }
.rv-avg { font-size: var(--a-t-sm); color: var(--muted-foreground); } .rv-avg b { color: var(--foreground); font-size: var(--a-t-lg); }
.rv-sources { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 8px 20px; font-size: var(--a-t-ui); }
.rv-sources a { color: var(--primary-ink); font-weight: 500; }
.rv-cards { list-style: none; margin: 0; padding: 0 0 8px; display: flex; gap: 16px; overflow-x: auto; scroll-snap-type: x mandatory; }
.rv-cards > li { flex: none; width: min(340px, 84vw); scroll-snap-align: center; }
.rv-card { position: relative; margin: 0; height: 100%; min-height: 300px; display: flex; flex-direction: column; gap: 14px; padding: 28px; border-radius: var(--radius-lg);
  border: 1px solid var(--border); background: var(--card); color: var(--card-foreground); box-shadow: var(--shadow-sm); }
.rv-rating { display: flex; align-items: center; gap: 8px; font-size: var(--a-t-xs); color: var(--muted-foreground); }
.rv-stars { display: inline-flex; gap: 2px; }
.rv-star { width: 15px; height: 15px; color: var(--primary-strong); }
.rv-star.is-empty { color: var(--border); }
.rv-score { font-variant-numeric: tabular-nums; }
.rv-check { display: inline-flex; align-items: center; min-height: 22px; padding: 0 8px; border-radius: var(--radius-full, 999px); background: var(--ok-bg); color: var(--ok-ink); font-size: var(--a-t-2xs); font-weight: 600; }
.rv-src { flex-basis: 100%; }
.rv-quote { margin: 0; flex: 1; font-size: var(--a-t-read); line-height: 1.45; font-weight: 500; letter-spacing: -0.01em; }
.rv-quote p + p { margin-top: 8px; }
.rv-by { display: grid; gap: 2px; font-size: var(--a-t-xs); color: var(--muted-foreground); }
.rv-author { color: var(--foreground); font-weight: 600; }
.rv-check { color: var(--ok-ink); font-weight: 600; }
.rv-by a { color: inherit; }
.rv-how { margin-top: 28px; max-width: 760px; }
.rv-nav { display: none; justify-content: center; gap: 10px; margin-top: 20px; }
.rv-stage.is-stagger .rv-cards { position: relative; display: block; height: 400px; overflow: hidden; padding: 0; }
.rv-stage.is-stagger .rv-cards > li { position: absolute; left: 50%; top: 32px; width: min(340px, 78vw); height: 330px; cursor: pointer;
  transform: translateX(calc(-50% + var(--k, 0) * 62%)) translateY(var(--ky, 0px)) rotate(var(--kr, 0deg)); z-index: var(--kz, 1);
  transition: transform var(--motion-sheet) var(--motion-ease-out), opacity var(--motion-slow) var(--motion-ease-out); }
.rv-stage.is-stagger .rv-cards > li[data-k="0"] { --ky: -10px; --kr: 0deg; --kz: 5; cursor: default; }
.rv-stage.is-stagger .rv-cards > li[data-k="-1"] { --k: -1; --ky: 22px; --kr: -2.5deg; --kz: 4; }
.rv-stage.is-stagger .rv-cards > li[data-k="1"] { --k: 1; --ky: 10px; --kr: 2deg; --kz: 4; }
.rv-stage.is-stagger .rv-cards > li[data-k="-2"] { --k: -2; --ky: 6px; --kr: 3deg; --kz: 3; }
.rv-stage.is-stagger .rv-cards > li[data-k="2"] { --k: 2; --ky: 26px; --kr: -3deg; --kz: 3; }
.rv-stage.is-stagger .rv-cards > li[data-k="-3"], .rv-stage.is-stagger .rv-cards > li[data-k="3"] { --k: 0; opacity: 0; pointer-events: none; --kz: 0; }
.rv-stage.is-stagger .rv-cards > li[data-k="0"] .rv-card { background: var(--foreground); color: var(--background); border-color: var(--foreground); box-shadow: var(--lift-shadow);
  clip-path: polygon(0 0, calc(100% - 34px) 0, 100% 34px, 100% 100%, 0 100%); }
.rv-stage.is-stagger .rv-cards > li[data-k="0"] .rv-card::after { content: ""; position: absolute; top: 0; right: 0; width: 34px; height: 34px;
  background: color-mix(in srgb, var(--background) 30%, var(--foreground)); clip-path: polygon(0 0, 0 100%, 100% 100%); }
.rv-stage.is-stagger .rv-cards > li[data-k="0"] :is(.rv-rating, .rv-by) { color: color-mix(in srgb, var(--background) 72%, var(--foreground)); }
.rv-stage.is-stagger .rv-cards > li[data-k="0"] :is(.rv-author, .rv-check) { color: var(--background); }
.rv-stage.is-stagger .rv-cards > li[data-k="0"] .rv-star { color: var(--primary); }
.rv-stage.is-stagger .rv-nav { display: flex; }
@media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) { .rv-stage.is-stagger .rv-cards > li:not([data-k="0"]):hover { --ky: -4px; } }

/* ---- the closing call: one quiet card ---- */
.cta-card { padding: 80px 24px; border-radius: var(--radius-xl); border: 1px solid var(--border); background: var(--card); text-align: center; }
.cta-card h2 { max-width: 640px; margin-inline: auto; }
.cta-card > p:not(.fine) { margin: 16px auto 0; max-width: 520px; font-size: var(--a-t-md); line-height: 1.6; color: var(--muted-foreground); }
.cta-card .actions { margin-top: 32px; justify-content: center; }
.cta-card .fine { margin-top: 18px; }

/* ---- the plans' section on the site (the cards are shared/css/v2/plan-cards.css): the heading stands close to its switch, as one
   block on the section's left edge; the test-build line and the notes under the cards. ---- */
.sec-head[data-ps-intro] { margin-bottom: 28px; }
.ps-fine { margin-top: 18px; }
.ps-more, .ps-note { max-width: 72ch; margin: 18px 0 0; font-size: var(--a-t-ui); line-height: 1.6; color: var(--muted-foreground); }
.ps-note b, .ps-more b { color: var(--foreground); font-weight: 600; }
/* Ask Beam is on a page once: the launcher at the foot (audit J40, 2026-11-11: it was also a pill in the bar). The launcher's sheet
   (shared/css/beam.css) reads --r-pill, which the site never named, so it stood square beside the round Feedback button: named above. */
@media (max-width: 1100px) { .people-n6 { grid-template-columns: repeat(3, minmax(0, 1fr)); } }   /* the team, 3 by 2 */
.sec-more-also { display: block; margin-top: 8px; color: var(--muted-foreground); font-size: var(--a-t-ui); }
/* where the product stands: what works today and what is not open yet, as two lists of small labels */
.ledger { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); gap: 16px; margin-top: 24px; }
.ledger > div { padding: 20px; border-radius: var(--radius-lg); border: 1px solid var(--border); background: var(--card); }
.ledger h3 { display: flex; align-items: center; gap: 8px; font-size: var(--a-t-sm); font-weight: 600; }
.ledger .glyph { width: 16px; height: 16px; flex: none; }
.ledger .st-steady { color: var(--ok); } .ledger .st-unknown { color: var(--muted-foreground); }
.badges { display: flex; flex-wrap: wrap; gap: 8px; margin: 14px 0 0; padding: 0; list-style: none; }
.badges li { display: inline-flex; align-items: center; min-height: 28px; padding: 0 12px; border-radius: 999px; border: 1px solid var(--border); font-size: var(--a-t-xs); }
.badges .b-built { border-color: var(--ok-edge); background: var(--ok-bg); color: var(--ok-ink); }
.badges .b-planned { background: var(--muted); color: var(--muted-foreground); }

/* ==== the pointer's answer on the site's older cards (site.js marks them .glow-fx): the light is the shared glow card's
   (shared/css/v2/glow.css and shared/js/glow.js: the edge and the soft fill in the emerald, under the pointer or the finger); here the
   card also lifts 2 px over a soft shadow. Opacity and transform only, the lift for a fine pointer only, nothing under reduced motion. ==== */
.glow-fx { transition: transform var(--motion-card) var(--motion-ease-out); }
.glow-fx::after { box-shadow: var(--lift-shadow); }
@media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) {
  .glow-fx:hover { transform: translateY(-2px); }
}

/* ---- the closing call of every page (.close): one quiet card in the middle ---- */
.close { padding-block: var(--a-section); }   /* after a section, only below (site.css "one gap between sections") */
.close > .wrap { display: grid; justify-items: center; gap: 16px; padding: 72px 24px; border-radius: var(--radius-xl); border: 1px solid var(--border);
  background: var(--card); text-align: center; }
.close h2 { max-width: 18em; }
.close .wrap > p:not(.fine) { max-width: 36em; color: var(--muted-foreground); font-size: var(--a-t-md); line-height: 1.6; }
.close .actions { justify-content: center; margin-top: 12px; }

/* ---- the steps of a feature page and of How it works: spotlight cards (clean-room after jahed "spotlight-card") with our own network
   image at the top, faded into the card. The light is the shared glow card's (below, "the glow card on the site's older cards"). ---- */
.steps .step { position: relative; padding: 112px 24px 24px; border-radius: var(--radius-lg); border: 1px solid var(--border); background-color: var(--card);
  background-image: linear-gradient(to bottom, transparent, var(--card) 136px), url("/static/site/img/net/net-2.svg");
  background-repeat: no-repeat; background-size: 100% 140px, 100% 140px; background-position: top, top; }
.steps .step:nth-child(3n+1) { background-image: linear-gradient(to bottom, transparent, var(--card) 136px), url("/static/site/img/net/net-1.svg"); }
.steps .step:nth-child(3n) { background-image: linear-gradient(to bottom, transparent, var(--card) 136px), url("/static/site/img/net/net-3.svg"); }
.steps .step + .step { margin-top: 16px; }
.steps .step-n { position: absolute; left: 24px; top: 72px; }
/* a spotlight card is one column: the number sits above the title (absolute), the title and its text run the card's width. The timeline's
   40 px number column (`.step` above) put the title into 40 px, over its text, on every feature page (G1 review, 2026-11-09) */
.steps .step { grid-template-columns: minmax(0, 1fr); }
.steps .step > h3, .steps .step > p { grid-column: 1; }
/* placed in no grid area, the number's box is the card's padding box, so top: 72px is from the card's top (with the timeline's
   `grid-row: 1 / span 2` it counted from the first row, under the 112 px of padding, and sat on the step's text) */
.steps .step > .step-n { grid-area: auto; }
.steps .step:not(:last-child)::after { display: none; }   /* the timeline's 1 px line between numbers has no place in a card */

/* ==== colour roles (F-colour, owner 2026-11-09/10: "a little colour everywhere ... not too colourful, in harmony"; DESIGN.md "Colour
   roles"). The mint is the one main action, focus, "you are here" and one lit phrase per headline. A feature's, a channel's or a help
   topic's icon sits on its category's tile (theme-a.css `.cat-*`: monitoring the mint, alerts and channels the sky, security the violet;
   web_catalog.GROUP_CAT puts the class on the menu's groups, the cards and a feature page's <main>); a thing of no category keeps the
   neutral tile. A logo keeps its own colours on a neutral tile (BRANDS.md). Never a paragraph, a heading or a section's fill. ==== */
.mega-ico, .card-link .tile-ico, .get .tile-ico, .topic-icon { background: var(--cat-bg, var(--muted)); color: var(--cat-ink, var(--a-ink-2));
  box-shadow: inset 0 0 0 1px var(--cat-edge, var(--border)); }
/* the cards' and the benefits' icons stand on a 36 px tile (20 px icon), like the menu's 34 px one */
.card-link, .get { grid-template-columns: 36px minmax(0, 1fr); }
.card-link .tile-ico, .get .tile-ico { display: grid; place-items: center; width: 36px; height: 36px; border-radius: 10px; }
/* a help topic: the same tile, 34 px, its 20 px icon (it was a 28 px icon in the mint, which is for the main action only) */
.topic-icon { display: grid; place-items: center; align-self: start; width: 34px; height: 34px; padding: 0; border-radius: 10px; }
.topic-icon .ico { width: 20px; height: 20px; }
/* what is not there yet stays quiet, whatever its group: the menu, the cards and the phone's menu sheet (review COL-5) */
.mega-item.is-soon .mega-ico, .card-link.is-soon .tile-ico, .acc-body .is-soon .mega-ico {
  background: var(--muted); color: var(--a-ink-3); box-shadow: inset 0 0 0 1px var(--border); }
/* a step's icon takes its page's category; a step's number is neutral (the mint is not a decoration) */
.step h3 .icon { color: var(--cat-ink, var(--a-ink)); }
.how-n, .step-n { background: var(--muted); color: var(--a-ink); box-shadow: inset 0 0 0 1px var(--border); }
/* a channel's mark stands on the neutral tile everywhere (the home's map and the same cells on the alert-channels feature page): a logo in its own colour, a
   name without a logo with its own neutral glyph (decision 7, BRANDS.md), so the logos are the colour */
/* a logo in its own colour wherever it is clearly seen on its tile (2:1 or more), else its one-colour ink (BRANDS.md "Which version shows where"): on the
   night Discord's blurple, Telegram's blue and Zapier's orange read; Slack's aubergine, GitHub's near-black and Opsgenie's navy do not */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) use.logo-brand:is([href$="#discord"], [href$="#telegram"], [href$="#zapier"]) { display: inline; }
  :root:not([data-theme="light"]) use.logo-ink:is([href$="#discord-ink"], [href$="#telegram-ink"], [href$="#zapier-ink"]) { display: none; }
}
:root[data-theme="dark"] use.logo-brand:is([href$="#discord"], [href$="#telegram"], [href$="#zapier"]) { display: inline; }
:root[data-theme="dark"] use.logo-ink:is([href$="#discord-ink"], [href$="#telegram-ink"], [href$="#zapier-ink"]) { display: none; }
/* the hero's "New" tag is an announcement, not the main action: neutral, so the hero holds one lamp (Start free) and one lit phrase */
.hero-pill .pill-tag { background: var(--muted); color: var(--foreground); box-shadow: inset 0 0 0 1px var(--border); }

/* ==== premium direction, 2026-11-11 (the owner: "a little colour everywhere", "not framed well"; decisions 2, 3 and 8 of
   design-direction.md; audit J40, J41, J42): the site's part. The shared pieces are shared/css/v2/accents.css and glow.css. ==== */

/* ---- the network never runs through text (decision 8; J41, J42). The canvas is fixed behind every page (shared/css/network-bg.css:
   z-index -1 in the root). A block of text that stands on the bare ground gets a layer of its own between the canvas and its words:
   - below a page's first screen the layer is the ground's own colour with a soft edge, so the lines stop short of the words;
   - in a first screen (the home's hero, an inner page's head) the ground carries the glow and the grid, so there the layer blurs what
     is behind it instead of covering it;
   - the bar's blur is always there, so no line or dot crosses a label; over the home's first screen only its tint and its rule wait
     for the scroll; the footer stands on the ground's colour.
   These layers are the headed blocks' soft plates. The rule itself does not depend on this list: the network keeps clear of every
   run of text in <main> that has no surface behind it (shared/js/network-bg.js `clear`, which site.js passes), so a block that is
   not named here is clear too.
   Nothing here moves, and print draws none of it. ---- */
.landing .bar::after { content: ""; position: absolute; inset: 0; z-index: -2; pointer-events: none; -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px); }
:is(.sec-head, .sec-more, .chan-title, .chan-note, .ps-fine, .ps-note, .ps-more, .faq-side, .faq-list, .benefits, .hub-group > h2, .hero .lede, .page-head .lede, .page-head h1) { position: relative; }
:is(.sec-head, .sec-more, .chan-title, .chan-note, .ps-fine, .ps-note, .ps-more, .faq-side, .faq-list, .benefits, .hub-group > h2)::before { content: ""; position: absolute; inset: -10px -18px;
  z-index: -1; border-radius: 22px; background: var(--background); box-shadow: 0 0 16px 10px var(--background); pointer-events: none; }
:is(.hero .lede, .page-head .lede, .page-head h1)::before { content: ""; position: absolute; inset: -12px -20px; z-index: -1; border-radius: 26px; pointer-events: none;
  -webkit-backdrop-filter: blur(9px); backdrop-filter: blur(9px);
  -webkit-mask-image: radial-gradient(ellipse closest-side, #000 72%, transparent); mask-image: radial-gradient(ellipse closest-side, #000 72%, transparent); }
.foot { background: var(--background); }
@media print { .landing .bar::after, :is(.sec-head, .sec-more, .chan-title, .chan-note, .ps-fine, .ps-note, .ps-more, .faq-side, .faq-list, .benefits, .hub-group > h2, .hero .lede, .page-head .lede, .page-head h1)::before { display: none; } }

/* ---- accents: a card takes the accent of its subject (decision 2: emerald the brand and "up", indigo response time and performance,
   cyan the network, fuchsia security and change, amber attention; rose and red stay "down"). Where a card's accent comes from,
   nearest first: its own icon (the map below: an icon names a subject; pulse_saas/api/web_catalog.ICON_ACCENT is the same map and
   tests/test_site_colour_2026_11_11.py keeps the two equal), `data-accent` on it or on a parent (a feature page's <main>, the home's
   "Alerts go to"), else the emerald. One system per card: where a card has an accent its icon tile no longer reads its group's
   category (theme-a.css `.cat-*`, which the menu and the help topics keep).
   What reads the accent: the card's light (glow.css, by itself), its icon tile, a bare icon, a text link and the focus ring.
   An accent is never the only signal: the icon and the words say the same thing. ---- */
:is(.card-link, .get, .benefit, .step, .spec, .bento-cell, .link-tile, .how-steps li):has(use:is([href$="#i-pulse"], [href$="#i-heartbeat"], [href$="#i-status-pages"], [href$="#i-regions"], [href$="#i-clients"], [href$="#i-branding"], [href$="#i-beam"], [href$="#i-portfolio"])) { --acc: var(--acc-emerald); --acc-rgb: var(--acc-emerald-rgb); }
:is(.card-link, .get, .benefit, .step, .spec, .bento-cell, .link-tile, .how-steps li):has(use:is([href$="#i-gauge"], [href$="#i-reports"], [href$="#i-server"], [href$="#i-chart"], [href$="#i-chart-column"], [href$="#i-timer"])) { --acc: var(--acc-indigo); --acc-rgb: var(--acc-indigo-rgb); }
:is(.card-link, .get, .benefit, .step, .spec, .bento-cell, .link-tile, .how-steps li):has(use:is([href$="#i-dns"], [href$="#i-domain"], [href$="#i-certificate"], [href$="#i-api"], [href$="#i-api-keys"], [href$="#i-mcp"], [href$="#i-globe"], [href$="#i-code"], [href$="#i-link"])) { --acc: var(--acc-cyan); --acc-rgb: var(--acc-cyan-rgb); }
:is(.card-link, .get, .benefit, .step, .spec, .bento-cell, .link-tile, .how-steps li):has(use:is([href$="#i-site-security"], [href$="#i-security"], [href$="#i-lock"], [href$="#i-why"], [href$="#i-history"], [href$="#i-sparkle"], [href$="#i-noindex"], [href$="#i-shield-check"])) { --acc: var(--acc-fuchsia); --acc-rgb: var(--acc-fuchsia-rgb); }
:is(.card-link, .get, .benefit, .step, .spec, .bento-cell, .link-tile, .how-steps li):has(use:is([href$="#i-alerts"], [href$="#i-incident"], [href$="#i-maintenance"], [href$="#i-warning"], [href$="#i-siren"], [href$="#i-bell-ring"], [href$="#i-mail"], [href$="#i-chat"], [href$="#i-webhook"], [href$="#i-push"])) { --acc: var(--acc-amber); --acc-rgb: var(--acc-amber-rgb); }
:is(.card-link:not(.is-soon), .get) .tile-ico { background: rgba(var(--acc-rgb, var(--acc-emerald-rgb)), 0.12); color: var(--acc, var(--acc-emerald));
  box-shadow: inset 0 0 0 1px rgba(var(--acc-rgb, var(--acc-emerald-rgb)), 0.28); }
.step h3 .icon, .benefit > .icon, .spec-mark .icon { color: var(--acc, var(--acc-emerald)); }
.btn-link { color: var(--acc, var(--primary-ink)); }
:where(main) :focus-visible:not(.btn) { outline-color: var(--acc, var(--ring)); }

/* ---- the glow card on the site's older cards (decision 3). site.js marks them `.glow-fx`: the shared light on a card that keeps its
   own face and edge. Here they get the rest of the product's card: the faint grid that shows only near the pointer (the same four
   layers as `.glow::after` in glow.css; the disc that hides the grid away from the pointer is the card's own face, --glow-fx-face),
   and, when nothing may move, the accent on the edge instead of the light. A card whose face is a picture, glass or nothing keeps
   the light without the grid. ---- */
.glow-fx:not(.step, .fp-visual, .proof-card)::after { background:
    radial-gradient(380px circle at var(--glow-x) var(--glow-y), rgba(var(--acc-rgb, var(--acc-emerald-rgb)), var(--glow-spot)), transparent 65%),
    radial-gradient(220px circle at var(--glow-x) var(--glow-y), transparent, var(--glow-fx-face, var(--card)) 75%),
    linear-gradient(var(--glow-grid) 1px, transparent 1px),
    linear-gradient(90deg, var(--glow-grid) 1px, transparent 1px);
  background-size: auto, auto, 26px 26px, 26px 26px; }
:is(.guide-card, .side-card, .card-link.is-soon, .vs-two > *).glow-fx { --glow-fx-face: var(--a-surface-2); }
/* a comparison's two cards stand the competitor's first and ours second (web_content._two_cards and the pages written by hand). The
   emerald is the brand, so only our card lights in it; the competitor's lights in a quiet neutral, never our colour on their name */
.vs-two > :first-child { --acc-rgb: 113, 113, 122; }
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .vs-two > :first-child { --acc-rgb: 150, 150, 158; } }
:root[data-theme="dark"] .vs-two > :first-child { --acc-rgb: 150, 150, 158; }
/* a step's card: the shared edge and, inside, its own softer spotlight (280 px, over its picture), placed like every card's light by
   --glow-x / --glow-y on the card under the pointer: one pointer system for the page (decision 3; it was a second listener that
   wrote the pointer's place on <html> every frame). A step's ::after was the timeline's connector, so its box is set again here. */
.steps .step.glow-fx::after, .steps .step.glow-fx:not(:last-child)::after { display: block; inset: 0; width: auto; height: auto; z-index: -1; border-radius: inherit;
  background: radial-gradient(280px circle at var(--glow-x) var(--glow-y), rgba(var(--acc-rgb, var(--acc-emerald-rgb)), 0.14), transparent 70%); }
@media (prefers-reduced-motion: reduce) {
  .glow-fx::before { display: block; opacity: 1; background: rgba(var(--acc-rgb, var(--acc-emerald-rgb)), var(--glow-still)); }
}
:root[data-motion="off"] .glow-fx::before { display: block; opacity: 1; background: rgba(var(--acc-rgb, var(--acc-emerald-rgb)), var(--glow-still)); }
@media (forced-colors: active) { .glow-fx::before { display: none; } }
@media print { .glow-fx::before { display: none; } }

/* ---- the hero's announcement on a phone (J41: at 375 px it wrapped to two lines in a pill that ran from gutter to gutter). A smaller
   tag and tighter gaps under 481 px; under 372 px (360 px is the commonest Android width) also 12 px words and a tighter tag. The words
   are the page's own and are longer than a phone's line: measured in a browser on 2026-11-12 the one line is 483 px wide (435 px with
   the 12 px words, 475 px with the tighter tag), so with its two 16 px gutters it needs a 515 px screen. Under that a nowrap line ran
   past the pill and was cut at the screen's edge (360 and 375 px); there the words stand on two balanced lines in a rounded block,
   inside the gutters. ---- */
@media (max-width: 480px) {
  .hero-pill { gap: 8px; max-width: 100%; padding-right: 12px; }
  .hero-pill .pill-tag { height: 22px; padding: 0 8px; }
  .hero-pill > span:last-child { white-space: nowrap; }
}
@media (max-width: 371px) {
  .hero-pill { gap: 6px; padding-right: 10px; font-size: var(--a-t-2xs); }
  .hero-pill .pill-tag { padding: 0 6px; }
}
@media (max-width: 514px) {
  .hero-pill { border-radius: 18px; text-align: left; }
  .hero-pill > span:last-child { white-space: normal; text-wrap: balance; }
}

/* ==== THE BASE CONTROLS LAYER on the site (premium direction 2026-11-11, decision 12; saas/DESIGN.md "The base controls layer").
   The site's own controls follow the SAME 21st.dev models as the app's (shared/css/v2/controls.css holds the list; licences and how
   each was read: saas/docs/design/21st-provenance.md; tests/test_base_controls_2026_11_11.py). Only the states and the look the model
   adds are here: each control keeps its size and place from the rules above. Controls the site does not have (radio, toggle, tooltip,
   toast, pagination, skeleton, progress, stepper) have no rule: the `.toast` and `.steps` above are pictures of the product, not controls.
     button          .btn .btn-lamp .btn-ghost .btn-line .btn-sm .btn-lg        originui "Button"
     text field      .input .textarea, .help-form input and textarea            originui "Input"
     select          .select, .help-form select                                 originui "Select (Native)"
     checkbox        .check-row input                                           coss.com "Checkbox"
     tabs            .tabs .tab .tab-ink, .seg .seg-opt .seg-ink                coss.com "Tabs" (the pill list)
     table           .table-wrap table, .prose table, .help-prose table         coss.com "Table"
     badge and chip  .pill, .chip-row > *                                       serafimcloud "Status Badge"
     dropdown menu   .mega .mega-item, .menu-sheet                              coss.com "Menu"
     breadcrumb      .crumbs                                                    coss.com "Breadcrumb"
     avatar          .avatar                                                    originui "Avatar"
   Only transform and opacity move; a hover look only where a pointer hovers; the focus ring stays the site's one ring. ==== */
/* button: the model's fade when disabled (flat, the cursor says no), sat in when pressed; busy is not disabled */
.btn:disabled, .btn[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; box-shadow: none; }
.btn.is-busy, .btn[aria-busy="true"] { opacity: 1; cursor: progress; }
.btn:is(.btn-lamp, .btn-ghost, .btn-line):active:not(:disabled):not([aria-disabled="true"]) { box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.18); }
@media (forced-colors: active) { .btn { border-color: ButtonText; background: ButtonFace; color: ButtonText; box-shadow: none; } }
/* text field and select: the small lift, a firmer edge under the pointer, the edge in the ring's colour with the soft 3 px halo on
   focus, the fade when disabled, the red edge (and its halo on focus) when invalid */
.input, .select, .textarea, .help-form :is(input:not([type="checkbox"]):not([type="radio"]), select, textarea) { box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); }
@media (hover: hover) {
  :is(.input, .select, .textarea):hover:not(:disabled):not(:focus-visible) { border-color: color-mix(in srgb, var(--field-edge) 55%, var(--foreground)); }
}
.input:focus-visible, .select:focus-visible, .textarea:focus-visible { border-color: var(--ring); outline: 2px solid var(--ring); outline-offset: -1px;
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--ring) 20%, transparent); }
:is(.input, .select, .textarea):disabled, .help-form :is(input, select, textarea):disabled { opacity: 0.5; cursor: not-allowed; box-shadow: none; }
.input[aria-invalid="true"], .textarea[aria-invalid="true"], .select[aria-invalid="true"] { border-color: var(--fail); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); }
:is(.input, .select, .textarea)[aria-invalid="true"]:focus-visible { border-color: var(--fail); outline-color: var(--fail);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--fail) 20%, transparent); }
:is(.input, .select, .textarea)[aria-busy="true"] { cursor: progress; }
.select, .help-form select { cursor: pointer; }
/* checkbox: the model's box (a 4 px corner, the field's edge, the small lift), the emerald with its tick when checked */
.check-row input[type="checkbox"] { -webkit-appearance: none; appearance: none; flex: none; display: inline-grid; place-content: center; width: 20px; height: 20px;
  border: 1px solid var(--field-edge); border-radius: 5px; background: var(--field-bg); color: var(--primary-foreground); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); cursor: pointer; }
.check-row input[type="checkbox"]::before { content: ""; width: 11px; height: 6px; margin-top: -2px; border: solid currentColor; border-width: 0 0 2px 2px;
  transform: rotate(-45deg) scale(0); transition: transform var(--motion-fast) var(--motion-ease-out); }
.check-row input[type="checkbox"]:checked { border-color: var(--primary-strong); background: var(--primary); box-shadow: none; }
.check-row input[type="checkbox"]:checked::before { transform: rotate(-45deg) scale(1); }
@media (hover: hover) { .check-row input[type="checkbox"]:hover:not(:disabled):not(:checked) { border-color: color-mix(in srgb, var(--field-edge) 55%, var(--foreground)); } }
.check-row input[type="checkbox"]:active:not(:disabled) { transform: scale(0.92); }
.check-row input[type="checkbox"]:disabled { opacity: 0.64; cursor: not-allowed; box-shadow: none; }
.check-row input[type="checkbox"][aria-invalid="true"] { border-color: var(--fail); }
@media (forced-colors: active) { .check-row input[type="checkbox"] { -webkit-appearance: auto; appearance: auto; } .check-row input[type="checkbox"]::before { display: none; } }
/* tabs: the model's pill list: the quiet words take the full ink under the pointer, a press dips, the 0.64 fade (the ring on focus is the site's own) */
@media (hover: hover) { :is(.tab:not([aria-selected="true"]), .seg-opt:not([aria-checked="true"])):hover:not(:disabled) { color: var(--foreground); } }
:is(.tab, .seg-opt):active:not(:disabled) { transform: scale(0.97); }
:is(.tab, .seg-opt):is(:disabled, [aria-disabled="true"]) { opacity: 0.64; cursor: not-allowed; }
/* table: the model's row under the pointer (72 % of the quiet fill); the head and the hairlines are already its own */
@media (hover: hover) { :is(.table-wrap, .prose, .help-prose) tbody tr:hover > * { background: color-mix(in srgb, var(--muted) 72%, transparent); } }
/* badge and chip: the model's hairline edge on the neutral ones (a filled state pill keeps its fill) */
.chip-row > *:not(.chip-team) { box-shadow: inset 0 0 0 1px var(--border); }
/* dropdown menu: the model's highlighted item on the keyboard too, a press, the fade of an item that is not there yet */
a.mega-item:focus-visible { background: var(--hover); }
a.mega-item:active { background: var(--hover); }
.mega-item.is-soon { cursor: default; }
/* breadcrumb: a step under the keyboard's focus takes the full ink, as under the pointer (the ring is the site's own) */
.crumbs a:focus-visible { color: var(--foreground); }
/* avatar: the model's quiet fill behind a picture that has not arrived */
.avatar:not(.avatar-initials) { background: var(--muted); }
