
/* ══════════════════════════════════════════════════════════════════════════
   §SBD-TONE) One current value per status colour.

   The admin's six statuses each ship a light value and a dark value. Resolving
   the pair HERE, once, is what keeps every rule below mode-agnostic — the
   alternative is a `body.theme-dark` twin for all ~40 rules that touch a
   status colour, and the first one anybody forgets is a silent contrast bug.

   `.sbd-tone` is applied to whatever element carries the inline vars. The
   fallbacks are the module's own operational green, so a status row whose
   admin cleared every colour still renders as something readable rather than
   inheriting the surrounding ink.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-tone{
  --s-c:var(--stx,#0CA678);
  --s-t:var(--stx-t,#E6FCF3);
  --s-i:var(--stx-i,#08795A);

  /* ⚠️ THE PLATE PAIR HAS NO DARK TWIN, AND THAT IS THE WHOLE POINT.
     `--s-c` / `--s-i` flip to the admin's LIGHT values in dark mode because
     they are read as INK on a dark surface. An icon plate is the opposite job:
     it is an opaque saturated fill carrying a WHITE glyph, so flipping it hands
     white a bright mint or a bright amber and the glyph disappears — measured
     at 2.10-2.91:1 across the six statuses, all under the 3:1 a glyph needs.
     The plate therefore uses the light-mode pair in BOTH modes, which is
     exactly what the shared kit does with `--t-1p` ("plates are opaque and need
     no dark twin at all"). Do not add a `body.theme-dark` rule for these two. */
  --s-p1:var(--stx,#0CA678);
  --s-p2:var(--stx-i,#08795A);
}
body.theme-dark .v2x.atd.sbd .sbd-tone{
  --s-c:var(--stx-d,var(--stx,#2DD4A7));
  --s-t:var(--stx-td,var(--stx-t,rgba(12,166,120,.16)));
  --s-i:var(--stx-id,var(--stx-i,#6BE3B8));
}

/* The three history-bar tones are OURS, not the admin's: a bar is a rolled-up
   day, not a status row, and it has to stay legible next to any accent an
   admin picks. Values are the §TONE6 emerald / amber / rose ramps. */
.v2x.atd.sbd{
  /* ⚠️ MEASURED AGAINST THE WHITE CARD, NOT PICKED FROM THE RAMP. A bar IS
     the information, so it needs 3:1 as a graphical object — and the §TONE6
     display hues do not clear it on white: #10B981 is 2.54 and #F59E0B is
     2.15. Each light value is the first step toward its own dark end that
     passes (emerald 3.38, amber 3.39); rose already did at 3.67 and is
     unchanged. Dark mode needs no such shift — every tone clears 4.7 on a
     #171922 card — so the dark block below keeps the display hues. */
  --sbd-ok:#0D9F71;   --sbd-ok-2:#08795A;
  --sbd-warn:#CA7809; --sbd-warn-2:#A85B08;
  --sbd-bad:#F43F5E;  --sbd-bad-2:#B31D3C;
  /* ⚠️ THE EMPTY-TRACK TONE IS THE ONE MOST OF THIS STRIP ACTUALLY USES.
     The roll-up has written one day per monitor, so 89 of 90 cells are
     `none` — and at #D8DDE7 that measured 1.36:1 against the white card,
     i.e. invisible. The strip then read as seven coloured bars floating in
     whitespace, which looks broken rather than empty. #BDC6D8 is 1.72:1:
     plainly a track, and still far under the 3:1 the real tones carry so it
     can never be mistaken for a reading. Colour is not the only signal
     either — the legend under the strip says in words how many days were
     actually recorded. */
  --sbd-none:#BDC6D8;
  --sbd-e:cubic-bezier(.22,.61,.36,1);
}
body.theme-dark .v2x.atd.sbd{
  --sbd-ok:#34D399;   --sbd-ok-2:#0D9F71;
  --sbd-warn:#FBBF24; --sbd-warn-2:#CA7809;
  --sbd-bad:#FB7185;  --sbd-bad-2:#D22D4C;
  --sbd-none:#3A4356;   /* 1.77:1 on the dark card — matched to the light end */
}

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-PLATE) The hero's status plate — this page's answer to a product logo.

   /ai-models/{slug} opens on a logo tile; a status board has no logo to show
   and the one thing a visitor came for is the STATE. So the plate carries the
   status glyph on the status fill, at exactly the tool page's `--atd-logo`
   size, and inherits its whole responsive ramp for free.

   ⚠️ A WHITE GLYPH ON A RAW STATUS FILL IS A CONTRAST BUG. The operational
   green (#0CA678) measures 2.71:1 against white — under the 3:1 a glyph needs,
   and the amber and blue statuses are worse. The fill is therefore a diagonal
   from the status colour to its own INK value (the darker member of the pair
   the admin already ships), with a flat scrim over the top. Measured over all
   six statuses in both modes; the worst case lands at 4.6:1. Do not "clean
   this up" into a single flat `background:var(--s-c)`.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-plate{
  grid-area:logo; position:relative; align-self:start;
  width:var(--atd-logo); height:var(--atd-logo);
}
.v2x.atd.sbd .sbd-plate-tile{
  position:relative; z-index:1;
  width:100%; height:100%;
  display:inline-flex; align-items:center; justify-content:center;
  border-radius:calc(var(--atd-logo) * .214);
  color:#fff; font-size:calc(var(--atd-logo) * .40); line-height:1;
  background-image:linear-gradient(135deg, rgba(0,0,0,.10) 0%, rgba(0,0,0,.28) 100%),
                   linear-gradient(140deg, var(--s-p1,#0CA678) 0%, var(--s-p2,#08795A) 100%);
  border:1px solid rgba(255,255,255,.22);
  box-shadow:0 1px 2px rgba(15,23,42,.10), 0 18px 34px -16px rgba(15,23,42,.42);
  transition:transform .3s var(--sbd-e), box-shadow .3s ease;
}
body.theme-dark .v2x.atd.sbd .sbd-plate-tile{
  border-color:rgba(255,255,255,.14);
  box-shadow:0 1px 2px rgba(0,0,0,.55), 0 20px 38px -18px rgba(0,0,0,.85);
}

/* Halo — the same radial the tool page's logo plate uses, re-hued to the live
   status so a degraded board glows amber instead of brand blue. */
.v2x.atd.sbd .sbd-plate-halo{
  position:absolute; inset:calc(var(--atd-logo) * -.143); z-index:0;
  border-radius:calc(var(--atd-logo) * .30); pointer-events:none;
  background:radial-gradient(circle at 50% 45%,
    color-mix(in srgb, var(--s-c,#0CA678) 34%, transparent) 0%,
    transparent 68%);
  opacity:.85; transition:opacity .3s ease, transform .3s var(--sbd-e);
}
@supports not (color: color-mix(in srgb, red 50%, transparent)){
  /* No hue to mix toward: drop the glow rather than paint a fixed blue one
     around an amber plate. The plate itself is unaffected. */
  .v2x.atd.sbd .sbd-plate-halo{ display:none; }
}

/* The live ping. Two rings expanding out of the plate on a 2.6s cycle — slow
   enough to read as a heartbeat rather than an alarm. It is drawn OUTSIDE the
   tile (z-index 0, pointer-events none) so it can never sit over the glyph. */
.v2x.atd.sbd .sbd-plate-ping,
.v2x.atd.sbd .sbd-plate-ping::after{
  position:absolute; inset:0; z-index:0; pointer-events:none;
  border-radius:calc(var(--atd-logo) * .214);
  border:2px solid color-mix(in srgb, var(--s-c,#0CA678) 55%, transparent);
  content:"";
  animation:sbdPing 2.6s cubic-bezier(0,0,.2,1) infinite;
}
.v2x.atd.sbd .sbd-plate-ping::after{ animation-delay:1.3s; }
@supports not (color: color-mix(in srgb, red 50%, transparent)){
  /* The ring fades to zero anyway, so a full-alpha start reads the same.
     Reading the token keeps it the LIVE status hue instead of a fixed blue. */
  .v2x.atd.sbd .sbd-plate-ping,
  .v2x.atd.sbd .sbd-plate-ping::after{ border-color:var(--s-c,#0CA678); }
}
@keyframes sbdPing{
  0%   { transform:scale(1);    opacity:.7; }
  70%  { transform:scale(1.28); opacity:0; }
  100% { transform:scale(1.28); opacity:0; }
}

@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd .sbd-plate:hover .sbd-plate-tile{ transform:translateY(-4px) scale(1.025); }
  .v2x.atd.sbd .sbd-plate:hover .sbd-plate-halo{ opacity:1; transform:scale(1.1); }
}
@media (prefers-reduced-motion:reduce){
  .v2x.atd.sbd .sbd-plate-tile,.v2x.atd.sbd .sbd-plate-halo{ transition:none; }
  .v2x.atd.sbd .sbd-plate:hover .sbd-plate-tile,
  .v2x.atd.sbd .sbd-plate:hover .sbd-plate-halo{ transform:none; }
  .v2x.atd.sbd .sbd-plate-ping,
  .v2x.atd.sbd .sbd-plate-ping::after{ animation:none; opacity:0; }
}

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-LIVE) The "Live" eyebrow and the state badge beside the H1.

   The badge reads the status TINT, never the status fill: white-on-fill needs
   4.5:1 for a 13px label and three of the six statuses cannot give it. The
   tint/ink pair the admin already ships is measured for exactly this job.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-eyebrow{
  display:inline-flex; align-items:center; gap:8px;
  font-size:.74rem; font-weight:700; letter-spacing:.09em; text-transform:uppercase;
  color:var(--muted); margin-bottom:12px;
}
.v2x.atd.sbd .sbd-eyebrow .dot{
  width:8px; height:8px; border-radius:50%;
  /* `--s-i`, not `--s-c`: this dot sits on the bare page ground (#f6f8fc)
     with no tint under it, where the admin's mid colour is ~2.6:1. The ink
     value is the measured one in BOTH modes — it is already the light variant
     in dark mode, which is what a dark ground wants. */
  background:var(--s-i,#08795A);
  box-shadow:0 0 0 3px color-mix(in srgb, var(--s-c,#0CA678) 22%, transparent);
  animation:sbdBeat 2s ease-in-out infinite;
}
@supports not (color: color-mix(in srgb, red 50%, transparent)){
  /* The halo ring around an 8px dot; dropping it loses nothing legible. */
  .v2x.atd.sbd .sbd-eyebrow .dot{ box-shadow:none; }
}
@keyframes sbdBeat{ 0%,100%{ transform:scale(1); opacity:1; } 50%{ transform:scale(.78); opacity:.6; } }
@media (prefers-reduced-motion:reduce){ .v2x.atd.sbd .sbd-eyebrow .dot{ animation:none; } }

.v2x.atd.sbd .sbd-state{
  display:inline-flex; align-items:center; gap:7px;
  font-size:.78rem; font-weight:700; border-radius:var(--r-pill);
  padding:5px 13px;
  background:var(--s-t,#E6FCF3); color:var(--s-i,#08795A);
  border:1px solid color-mix(in srgb, var(--s-c,#0CA678) 30%, transparent);
}
@supports not (color: color-mix(in srgb, red 50%, transparent)){
  /* --line is neutral AND already has a dark twin in the ATD kit, so the
     pill keeps a correct edge whatever the status and whatever the theme. */
  .v2x.atd.sbd .sbd-state{ border-color:var(--line); }
}
.v2x.atd.sbd .sbd-state i{ font-size:.72rem; }

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-ASIDE) Hero right column — the Live Health panel.

   Same call as /ai-models/{slug}: there is no gallery to put here, so the
   column carries the one thing that earns the space. The ring is the page's
   single "wow" moment and it is drawn from real data — operational ÷ total —
   not decoration.

   Panel recipe is §SPINE-BLUE (the Tool Information card): a 150deg diagonal
   wash on a white ground with a hairline edge. NOT `.atd-info`, which carries
   the sidebar's orbit-ring hover and belongs to a card you point at.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-aside{ display:flex; flex-direction:column; gap:16px; height:100%; }
.v2x.atd.sbd .sbd-panel{
  flex:1 1 auto; padding:22px 20px; border-radius:16px;
  border:1px solid rgba(54,128,237,.22);
  background-image:linear-gradient(150deg,
    rgba(54,128,237,.075) 0%, rgba(54,128,237,0) 46%, rgba(54,128,237,.05) 100%);
  background-color:#fff;
  box-shadow:0 1px 2px rgba(15,23,42,.05), 0 14px 30px -18px rgba(15,23,42,.28);
}
body.theme-dark .v2x.atd.sbd .sbd-panel{
  border-color:rgba(54,128,237,.30);
  background-image:linear-gradient(150deg,
    rgba(54,128,237,.13) 0%, rgba(54,128,237,0) 46%, rgba(54,128,237,.08) 100%);
  background-color:#171922;
  box-shadow:0 1px 2px rgba(0,0,0,.45), 0 18px 36px -20px rgba(0,0,0,.80);
}
.v2x.atd.sbd .sbd-panel-head{ display:flex; align-items:center; gap:11px; margin-bottom:18px; }

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-RING) The health donut.

   Pure SVG + two custom properties, no chart library: this is one number and
   pulling ApexCharts in for it would cost more than the whole panel.

   `--ring-len` is 2πr for r=52 (326.73) and is written out rather than
   calculated so the dash maths stays readable; change the radius in the markup
   and this number MUST change with it or the arc silently over- or under-runs.
   The sweep animates from empty on load, which is what makes it read as a live
   reading rather than a printed figure.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-ring{
  --ring-len:326.73;
  position:relative; width:172px; height:172px; margin:0 auto 20px; flex:none;
}
.v2x.atd.sbd .sbd-ring svg{ width:100%; height:100%; transform:rotate(-90deg); overflow:visible; }
.v2x.atd.sbd .sbd-ring circle{ fill:none; stroke-linecap:round; }
.v2x.atd.sbd .sbd-ring-tr{ stroke:var(--line); stroke-width:11; }
body.theme-dark .v2x.atd.sbd .sbd-ring-tr{ stroke:#252A38; }
.v2x.atd.sbd .sbd-ring-vl{
  stroke:url(#sbdRingGrad); stroke-width:11;
  stroke-dasharray:var(--ring-len);
  stroke-dashoffset:calc(var(--ring-len) - (var(--ring-len) * var(--ring-pct,0) / 100));
  filter:drop-shadow(0 3px 8px color-mix(in srgb, var(--s-c,#0CA678) 42%, transparent));
  animation:sbdSweep 1.4s var(--sbd-e) both;
}
@supports not (color: color-mix(in srgb, red 50%, transparent)){
  .v2x.atd.sbd .sbd-ring-vl{ filter:none; }
}
@keyframes sbdSweep{ from{ stroke-dashoffset:var(--ring-len); } }

/* ⚠️ THE GRADIENT STOPS ARE COLOURED FROM CSS, NOT FROM A PRESENTATION
   ATTRIBUTE. `stop-color="var(--s-c)"` written on the <stop> element is a
   presentation ATTRIBUTE, and browser support for var() inside one is
   inconsistent — where it fails the stop falls back to black and the ring
   draws as a dark arc with no error anywhere. `stop-color` is a real CSS
   property, so setting it here is universally supported, and the custom
   properties still reach the <stop> because they inherit down from the hero
   element that carries the inline pair. */
.v2x.atd.sbd .sbd-ring-g1{ stop-color:var(--s-i,#08795A); }
.v2x.atd.sbd .sbd-ring-g2{ stop-color:var(--s-c,#0CA678); }
@media (prefers-reduced-motion:reduce){ .v2x.atd.sbd .sbd-ring-vl{ animation:none; } }

.v2x.atd.sbd .sbd-ring-mid{
  position:absolute; inset:0; display:flex; flex-direction:column;
  align-items:center; justify-content:center; gap:2px; text-align:center;
}
.v2x.atd.sbd .sbd-ring-v{
  font-size:2.5rem; font-weight:800; line-height:1; letter-spacing:-.03em;
  color:var(--ink); font-variant-numeric:tabular-nums;
}
.v2x.atd.sbd .sbd-ring-v i{ font-style:normal; font-size:1.15rem; font-weight:700; color:var(--muted); margin-inline-start:2px; }
.v2x.atd.sbd .sbd-ring-k{
  font-size:.7rem; font-weight:700; letter-spacing:.08em; text-transform:uppercase;
  color:var(--s-i,#08795A);
}
.v2x.atd.sbd .sbd-ring-sub{
  font-size:.78rem; font-weight:600; color:var(--muted); margin-top:1px;
  font-variant-numeric:tabular-nums;
}

/* Panel fact rows — a compact two-up grid under the ring. */
.v2x.atd.sbd .sbd-pfacts{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:10px; }
.v2x.atd.sbd .sbd-pf{
  display:flex; align-items:flex-start; gap:10px;
  padding:11px 12px; border-radius:12px;
  background:var(--t-bg); border:1px solid var(--t-line);
  transition:transform .3s var(--sbd-e), box-shadow .28s ease;
}
.v2x.atd.sbd .sbd-pf-ic{
  flex:0 0 auto; width:30px; height:30px; border-radius:9px;
  display:inline-flex; align-items:center; justify-content:center;
  /* --t-1p is the ramp step measured for a white GLYPH (3:1). A white LABEL on
     the same fill would need 4.5 and fail; nothing here puts text on it. */
  background:var(--t-1p); color:#fff; font-size:.82rem;
  box-shadow:0 2px 6px rgba(var(--t-rgb),.35);
}
.v2x.atd.sbd .sbd-pf-tx{ min-width:0; display:flex; flex-direction:column; gap:2px; }
.v2x.atd.sbd .sbd-pf-k{
  font-size:.66rem; font-weight:700; letter-spacing:.07em; text-transform:uppercase;
  color:var(--t-ink);
}
.v2x.atd.sbd .sbd-pf-v{
  font-size:.88rem; font-weight:700; line-height:1.35; color:var(--ink);
  overflow-wrap:anywhere; font-variant-numeric:tabular-nums;
}
@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd .sbd-pf:hover{ transform:translateY(-2px); box-shadow:0 10px 20px -12px rgba(var(--t-rgb),.55); }
}
@media (prefers-reduced-motion:reduce){
  .v2x.atd.sbd .sbd-pf{ transition:none; }
  .v2x.atd.sbd .sbd-pf:hover{ transform:none; }
}

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-BAN) The overall-status band.

   It does NOT repeat the hero. The hero answers "is it up?" in one glance;
   this band carries the admin's own headline/sub copy plus the ONE thing
   neither the hero nor the services board shows — how the fleet splits across
   states, as a single proportional bar. Same reasoning as the model page
   dropping its sidebar rating card: three copies of one number is worse than
   one copy and a new one.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-ban{
  position:relative; overflow:hidden;
  padding:24px 26px; border-radius:18px;
  border:1px solid color-mix(in srgb, var(--s-c,#0CA678) 26%, var(--line));
  background-image:linear-gradient(150deg,
    color-mix(in srgb, var(--s-c,#0CA678) 9%, transparent) 0%,
    transparent 48%,
    color-mix(in srgb, var(--s-c,#0CA678) 6%, transparent) 100%);
  background-color:#fff;
  box-shadow:0 1px 2px rgba(15,23,42,.05), 0 16px 34px -20px rgba(15,23,42,.30);
}
body.theme-dark .v2x.atd.sbd .sbd-ban{
  background-color:#171922;
  background-image:linear-gradient(150deg,
    color-mix(in srgb, var(--s-c,#2DD4A7) 15%, transparent) 0%,
    transparent 48%,
    color-mix(in srgb, var(--s-c,#2DD4A7) 9%, transparent) 100%);
  box-shadow:0 1px 2px rgba(0,0,0,.45), 0 20px 40px -22px rgba(0,0,0,.85);
}
/* color-mix is ~95% supported, but a missing border colour here would drop the
   card's whole edge, so the fallback is explicit rather than inherited. */
@supports not (color: color-mix(in srgb, red 50%, transparent)){
  .v2x.atd.sbd .sbd-ban{ border-color:var(--line); background-image:none; }
}

/* Aurora — the same soft corner light the §CTAX band uses, hued to the live
   status. Purely decorative and behind everything (z-index 0 + the content at
   1), so it can never wash out a word. */
.v2x.atd.sbd .sbd-ban-aur{
  position:absolute; inset-inline-end:-70px; top:-90px; z-index:0;
  width:290px; height:290px; border-radius:50%; pointer-events:none;
  background:radial-gradient(circle,
    color-mix(in srgb, var(--s-c,#0CA678) 26%, transparent) 0%, transparent 70%);
  filter:blur(6px);
}
@supports not (color: color-mix(in srgb, red 50%, transparent)){
  .v2x.atd.sbd .sbd-ban-aur{ display:none; }
}
.v2x.atd.sbd .sbd-ban-in{
  position:relative; z-index:1;
  display:flex; align-items:center; gap:20px; flex-wrap:wrap;
}
.v2x.atd.sbd .sbd-ban-ic{
  flex:0 0 auto; width:58px; height:58px; border-radius:16px;
  display:inline-flex; align-items:center; justify-content:center;
  font-size:1.35rem; color:#fff;
  /* Same measured recipe as §SBD-PLATE — a raw status fill cannot carry a
     white glyph on three of the six statuses. */
  background-image:linear-gradient(135deg, rgba(0,0,0,.10) 0%, rgba(0,0,0,.28) 100%),
                   linear-gradient(140deg, var(--s-p1,#0CA678) 0%, var(--s-p2,#08795A) 100%);
  box-shadow:0 8px 20px -8px color-mix(in srgb, var(--s-c,#0CA678) 60%, transparent);
}
@supports not (color: color-mix(in srgb, red 50%, transparent)){
  .v2x.atd.sbd .sbd-ban-ic{ box-shadow:0 8px 20px -8px rgba(15,23,42,.35); }
}
.v2x.atd.sbd .sbd-ban-tx{ flex:1 1 260px; min-width:0; }
.v2x.atd.sbd .sbd-ban-h{
  font-family:var(--font); font-size:1.42rem; font-weight:800; line-height:1.25;
  letter-spacing:-.02em; color:var(--ink); margin:0 0 5px;
}
.v2x.atd.sbd .sbd-ban-s{ font-size:.95rem; line-height:1.6; color:var(--muted); margin:0; }
.v2x.atd.sbd .sbd-ban-side{
  flex:0 0 auto; text-align:end; display:flex; flex-direction:column; gap:3px;
}
.v2x.atd.sbd .sbd-ban-big{
  font-size:1.7rem; font-weight:800; line-height:1; color:var(--ink);
  letter-spacing:-.03em; font-variant-numeric:tabular-nums;
}
.v2x.atd.sbd .sbd-ban-big small{ font-size:.95rem; font-weight:700; color:var(--muted); }
.v2x.atd.sbd .sbd-ban-lbl{ font-size:.76rem; font-weight:600; color:var(--muted); }

/* ── The split bar ─────────────────────────────────────────────────────────
   One track, one segment per state that actually has members. A zero-width
   segment is not rendered at all: a 0px sliver next to a legend entry reads as
   "there is one and we hid it". */
.v2x.atd.sbd .sbd-split{ position:relative; z-index:1; margin-top:20px; }
.v2x.atd.sbd .sbd-split-tr{
  display:flex; gap:3px; height:10px; border-radius:999px; overflow:hidden;
  background:var(--sbd-none);
}
.v2x.atd.sbd .sbd-split-sg{
  height:100%; border-radius:999px; min-width:6px;
  transition:flex-grow .5s var(--sbd-e), filter .2s ease;
}
/* ⚠️ THE GLOSS USED TO BE A WHITE OVERLAY AND IT COST THE SEGMENT ITS
   CONTRAST. `linear-gradient(rgba(255,255,255,.24), …)` lightened the TOP of
   the bar — the part a reader actually sees against the card — from 3.38:1 to
   2.50:1, and even a .10 overlay only reached 2.99. The depth now comes from
   running each tone's own light-to-dark ramp downward, exactly like the
   history bars, so the top of the segment is the measured light value itself. */
.v2x.atd.sbd .sbd-split-sg[data-tone="ok"]  { background-image:linear-gradient(180deg, var(--sbd-ok) 0%, var(--sbd-ok-2) 100%); }
.v2x.atd.sbd .sbd-split-sg[data-tone="warn"]{ background-image:linear-gradient(180deg, var(--sbd-warn) 0%, var(--sbd-warn-2) 100%); }
.v2x.atd.sbd .sbd-split-sg[data-tone="bad"] { background-image:linear-gradient(180deg, var(--sbd-bad) 0%, var(--sbd-bad-2) 100%); }
.v2x.atd.sbd .sbd-split-sg[data-tone="info"]{ background-image:linear-gradient(180deg, var(--accent) 0%, var(--accent-dark) 100%); }
.v2x.atd.sbd .sbd-split-lg{
  display:flex; flex-wrap:wrap; gap:8px 18px; margin-top:12px;
  font-size:.79rem; font-weight:600; color:var(--muted);
}
.v2x.atd.sbd .sbd-split-lg span{ display:inline-flex; align-items:center; gap:7px; }
.v2x.atd.sbd .sbd-split-lg i{
  width:9px; height:9px; border-radius:50%; flex:none; font-style:normal;
}
.v2x.atd.sbd .sbd-split-lg [data-tone="ok"]   i{ background:var(--sbd-ok); }
.v2x.atd.sbd .sbd-split-lg [data-tone="warn"] i{ background:var(--sbd-warn); }
.v2x.atd.sbd .sbd-split-lg [data-tone="bad"]  i{ background:var(--sbd-bad); }
.v2x.atd.sbd .sbd-split-lg [data-tone="info"] i{ background:var(--accent); }
.v2x.atd.sbd .sbd-split-lg b{ color:var(--ink); font-weight:700; font-variant-numeric:tabular-nums; }
@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd .sbd-split-tr:hover .sbd-split-sg{ filter:saturate(1.18) brightness(1.04); }
}
@media (prefers-reduced-motion:reduce){ .v2x.atd.sbd .sbd-split-sg{ transition:none; } }

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-BOARD) The services board — the page's main body.

   One card per group. The card is the SHARED sidebar-card geometry (20px
   radius, --hp-sh at rest, lift + tone border on hover) so it belongs to the
   same family as every other card on the site, and the tone cycles by POSITION
   over §TONE6 — with seven groups, six hues give an even spread where hashing
   the name would hand three of them blue.

   ⚠️ The group header is a real <button aria-expanded> when it folds, and a
   <div> when it does not. Both have to look identical, so every rule here is
   written against `.sbd-ghead` and the button reset lives in one place.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-groups{ display:flex; flex-direction:column; gap:14px; }
.v2x.atd.sbd .sbd-group{
  position:relative;
  border-radius:20px; border:1px solid var(--line); background:#fff;
  box-shadow:0 1px 2px rgba(16,24,40,.04), 0 6px 20px rgba(16,24,40,.05);
  transition:transform .22s var(--sbd-e), box-shadow .24s ease, border-color .2s ease;
}
body.theme-dark .v2x.atd.sbd .sbd-group{
  background:#171922; border-color:var(--line);
  box-shadow:0 1px 2px rgba(0,0,0,.40), 0 6px 20px rgba(0,0,0,.35);
}
@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd .sbd-group:hover{
    transform:translateY(-3px);
    border-color:var(--t-line, var(--line));
    box-shadow:0 2px 6px rgba(16,24,40,.06), 0 18px 44px rgba(16,24,40,.10);
  }
  body.theme-dark .v2x.atd.sbd .sbd-group:hover{ box-shadow:0 2px 6px rgba(0,0,0,.50), 0 18px 44px rgba(0,0,0,.45); }
  .v2x.atd.sbd .sbd-group:hover .sbd-ghead-ic{ transform:scale(1.07) rotate(-3deg); }
}
@media (prefers-reduced-motion:reduce){
  .v2x.atd.sbd .sbd-group{ transition:none; }
  .v2x.atd.sbd .sbd-group:hover{ transform:none; }
  .v2x.atd.sbd .sbd-group:hover .sbd-ghead-ic{ transform:none; }
}

.v2x.atd.sbd .sbd-ghead{
  width:100%; display:flex; align-items:center; gap:14px;
  padding:17px 20px; text-align:start;
  background:transparent; border:0; border-radius:20px 20px 0 0;
  font-family:var(--font); color:inherit;
}
.v2x.atd.sbd button.sbd-ghead{ cursor:pointer; -webkit-appearance:none; appearance:none; }
/* The shared kit rings every focusable at an 8px radius, which on a 20px
   full-width card header leaves a visibly squarer ring than the thing it is
   ringing. Restated at the card`s own radius; the colour and width stay the
   kit`s so the focus style is still one style sitewide. */
.v2x.atd.sbd button.sbd-ghead:focus-visible{ border-radius:20px 20px 0 0; }
.v2x.atd.sbd .sbd-ghead-ic{
  flex:0 0 auto; width:42px; height:42px; border-radius:13px;
  display:inline-flex; align-items:center; justify-content:center;
  font-size:1rem; color:#fff;
  background:linear-gradient(135deg, var(--t-1p,#4C8DF2), var(--t-2,#2060C0));
  box-shadow:0 4px 12px rgba(var(--t-rgb,76,141,242),.34);
  transition:transform .24s var(--sbd-e);
}
.v2x.atd.sbd .sbd-ghead-t{ flex:1 1 auto; min-width:0; display:flex; flex-direction:column; gap:2px; }
.v2x.atd.sbd .sbd-ghead-n{
  font-size:1.02rem; font-weight:700; line-height:1.35; color:var(--ink);
  margin:0; letter-spacing:-.01em;
}
.v2x.atd.sbd .sbd-ghead-d{
  font-size:.83rem; line-height:1.5; color:var(--muted); margin:0;
  /* Two lines, then ellipsis. A group blurb is a subtitle, not the content. */
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
}
.v2x.atd.sbd .sbd-ghead-side{ flex:0 0 auto; display:flex; align-items:center; gap:10px; }
.v2x.atd.sbd .sbd-caret{
  width:26px; height:26px; border-radius:8px; flex:none;
  display:inline-flex; align-items:center; justify-content:center;
  color:var(--muted); font-size:.72rem;
  background:var(--accent-soft2); border:1px solid var(--line);
  transition:transform .24s var(--sbd-e), background-color .2s ease, color .2s ease;
}
body.theme-dark .v2x.atd.sbd .sbd-caret{ background:rgba(255,255,255,.05); }
.v2x.atd.sbd .sbd-ghead[aria-expanded="true"] .sbd-caret{ transform:rotate(90deg); }
@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd button.sbd-ghead:hover .sbd-caret{
    background:var(--t-bg, var(--accent-soft)); color:var(--t-ink, var(--accent-dark)); border-color:var(--t-line, var(--line));
  }
}
@media (prefers-reduced-motion:reduce){ .v2x.atd.sbd .sbd-caret{ transition:none; } }

/* Uptime figure on the group header. Tabular so seven stacked cards line up. */
.v2x.atd.sbd .sbd-up{
  font-family:var(--mono); font-size:.82rem; font-weight:600;
  color:var(--muted); font-variant-numeric:tabular-nums; white-space:nowrap;
}
.v2x.atd.sbd .sbd-up b{ color:var(--ink); font-weight:700; }

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-PILL) The status pill.

   TINTED, never filled. White-on-fill was measured at 4.12:1 (green) and
   4.21:1 (amber) in the previous kit and needed a .24 black scrim to pass;
   the tint/ink pair the admin already ships passes at every one of the six
   statuses in both modes with no scrim at all, and it sits better beside the
   §TONE6 cards than six saturated blocks would.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-pill{
  display:inline-flex; align-items:center; gap:7px; white-space:nowrap;
  font-size:.76rem; font-weight:700; line-height:1;
  border-radius:var(--r-pill); padding:6px 12px;
  background:var(--s-t,#E6FCF3); color:var(--s-i,#08795A);
  border:1px solid color-mix(in srgb, var(--s-c,#0CA678) 30%, transparent);
  transition:box-shadow .2s ease, transform .2s var(--sbd-e);
}
@supports not (color: color-mix(in srgb, red 50%, transparent)){
  .v2x.atd.sbd .sbd-pill{ border-color:var(--line); }
}
.v2x.atd.sbd .sbd-pill .dot{
  width:7px; height:7px; border-radius:50%; flex:none;
  background:var(--s-c,#0CA678);
}
.v2x.atd.sbd .sbd-pill .dot.is-pulse{ animation:sbdBeat 2s ease-in-out infinite; }
.v2x.atd.sbd .sbd-pill .dot.is-blink{ animation:sbdBlink 1.4s steps(1,end) infinite; }
.v2x.atd.sbd .sbd-pill .dot.is-wave{ animation:sbdBeat 3.2s ease-in-out infinite; }
@keyframes sbdBlink{ 0%,49%{ opacity:1; } 50%,100%{ opacity:.25; } }
@media (prefers-reduced-motion:reduce){ .v2x.atd.sbd .sbd-pill .dot{ animation:none !important; } }
@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd .sbd-row:hover .sbd-pill{
    transform:translateY(-1px);
    box-shadow:0 6px 14px -8px color-mix(in srgb, var(--s-c,#0CA678) 65%, transparent);
  }
}

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-ROW) One service.

   A row is NOT a link — every service already lives on this page and a link
   that reloads the same page reads as broken — so the hover is a READING
   HIGHLIGHT (tinted ground, tone spine) rather than a lift. Same call as the
   §PROSCONS rows on the tool page.

   The spine is an inset inline-start bar that grows from 0 on hover. It is
   drawn with a pseudo-element rather than a border so the row's box model does
   not shift by 3px under the pointer.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-gbody{ padding:0 12px 12px; }
.v2x.atd.sbd .sbd-row{
  position:relative; display:flex; align-items:center; gap:13px;
  padding:12px 14px; border-radius:13px;
  transition:background-color .2s ease;
}
.v2x.atd.sbd .sbd-row::before{
  content:""; position:absolute; z-index:0; pointer-events:none;
  inset-block:9px; inset-inline-start:0; width:3px; border-radius:3px;
  background:var(--s-c,#0CA678); opacity:0;
  transform:scaleY(.35); transform-origin:center;
  transition:opacity .22s ease, transform .26s var(--sbd-e);
}
.v2x.atd.sbd .sbd-row.is-child{ margin-inline-start:26px; }
.v2x.atd.sbd .sbd-row.is-child::after{
  content:""; position:absolute; inset-inline-start:-14px; top:50%;
  width:9px; height:1px; background:var(--line-strong);
}
@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd .sbd-row:hover{ background:var(--accent-soft2); }
  body.theme-dark .v2x.atd.sbd .sbd-row:hover{ background:rgba(255,255,255,.045); }
  .v2x.atd.sbd .sbd-row:hover::before{ opacity:1; transform:scaleY(1); }
  .v2x.atd.sbd .sbd-row:hover .sbd-row-ic{
    color:var(--s-i,#08795A);
    background:var(--s-t,#E6FCF3);
    border-color:color-mix(in srgb, var(--s-c,#0CA678) 34%, transparent);
  }
}
@media (prefers-reduced-motion:reduce){
  .v2x.atd.sbd .sbd-row,.v2x.atd.sbd .sbd-row::before{ transition:none; }
}

.v2x.atd.sbd .sbd-row-ic{
  position:relative; z-index:1; flex:0 0 auto;
  width:36px; height:36px; border-radius:11px;
  display:inline-flex; align-items:center; justify-content:center;
  font-size:.88rem; color:var(--muted);
  background:var(--accent-soft2); border:1px solid var(--line);
  transition:color .2s ease, background-color .2s ease, border-color .2s ease;
}
body.theme-dark .v2x.atd.sbd .sbd-row-ic{ background:rgba(255,255,255,.05); }

.v2x.atd.sbd .sbd-row-main{ position:relative; z-index:1; flex:1 1 auto; min-width:0; }
.v2x.atd.sbd .sbd-row-n{
  display:flex; align-items:center; gap:8px; flex-wrap:wrap;
  font-size:.94rem; font-weight:700; line-height:1.4; color:var(--ink);
}
/* The one link on the row — an outbound "open this service". Styled through
   its own class at (0,3,0) with a :hover twin, so Tabler's global
   `a:hover{color:#c62828}` cannot reach it and no blanket neutraliser is
   needed. Same rule the rest of this page follows. */
.v2x.atd.sbd .sbd-row-n .sbd-ext{
  display:inline-flex; align-items:center; justify-content:center;
  width:22px; height:22px; border-radius:7px; flex:none;
  color:var(--muted); font-size:.62rem;
  background:transparent; border:1px solid transparent;
  transition:color .18s ease, background-color .18s ease, border-color .18s ease, transform .2s var(--sbd-e);
}
@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd .sbd-row-n .sbd-ext:hover{
    color:var(--accent-dark); background:var(--accent-soft); border-color:#d6e4fc;
    transform:translateY(-1px);
  }
  body.theme-dark .v2x.atd.sbd .sbd-row-n .sbd-ext:hover{
    color:#9CC5F9; background:rgba(54,128,237,.18); border-color:rgba(54,128,237,.34);
  }
}
.v2x.atd.sbd .sbd-row-d{
  font-size:.82rem; line-height:1.5; color:var(--muted); margin-top:2px;
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
}
.v2x.atd.sbd .sbd-row-side{
  position:relative; z-index:1; flex:0 0 auto;
  display:flex; align-items:center; gap:12px;
}
.v2x.atd.sbd .sbd-ms{
  font-family:var(--mono); font-size:.76rem; font-weight:600;
  color:var(--muted); white-space:nowrap; font-variant-numeric:tabular-nums;
}

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-BARS) The 90-day history strip.

   Bars are flex children with `flex:1 1 0` and a min-width, so the strip fits
   90 days on a desktop card and simply shows fewer, wider bars on a phone
   without any JS re-slicing the data.

   THE TOOLTIP IS THE POINT OF THIS BLOCK. A native `title` takes ~1.5s to
   appear and is unstyleable; the whole value of a history strip is pointing at
   a bar and reading the day. So each bar carries `data-tip` and paints it with
   ::after. `title` is still emitted on the wrapper for screen readers and for
   anyone with hover unavailable.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-bars-wrap{ padding:2px 14px 12px; }
.v2x.atd.sbd .sbd-bars{
  display:flex; align-items:stretch; gap:2px; height:32px;
  /* The tooltip is absolutely positioned against this box and must not be
     clipped by it — nothing here may gain `overflow:hidden`. */
  position:relative;
}
.v2x.atd.sbd .sbd-bar{
  position:relative; flex:1 1 0; min-width:3px; border-radius:3px;
  background:var(--sbd-none);
  transition:transform .18s var(--sbd-e), filter .18s ease;
}
.v2x.atd.sbd .sbd-bar[data-tone="ok"]      { background:linear-gradient(180deg, var(--sbd-ok) 0%, var(--sbd-ok-2) 100%); }
.v2x.atd.sbd .sbd-bar[data-tone="degraded"]{ background:linear-gradient(180deg, var(--sbd-warn) 0%, var(--sbd-warn-2) 100%); }
.v2x.atd.sbd .sbd-bar[data-tone="down"]    { background:linear-gradient(180deg, var(--sbd-bad) 0%, var(--sbd-bad-2) 100%); }

.v2x.atd.sbd .sbd-bar::after{
  content:attr(data-tip);
  position:absolute; z-index:6; bottom:calc(100% + 9px); inset-inline-start:50%;
  transform:translateX(-50%) translateY(4px);
  white-space:nowrap; pointer-events:none;
  font-family:var(--font); font-size:.72rem; font-weight:600; line-height:1.3;
  padding:6px 10px; border-radius:8px;
  background:#0F172A; color:#fff; border:1px solid rgba(255,255,255,.12);
  box-shadow:0 10px 22px -10px rgba(15,23,42,.55);
  opacity:0; transition:opacity .16s ease, transform .18s var(--sbd-e);
}
body.theme-dark .v2x.atd.sbd .sbd-bar::after{ background:#252A38; }
@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd .sbd-bar:hover{ transform:scaleX(1.6); filter:brightness(1.1); z-index:5; }
  .v2x.atd.sbd .sbd-bar:hover::after{ opacity:1; transform:translateX(-50%) translateY(0); }
  /* ⚠️ EDGE BANDS, NOT `:first-child`. A centred tooltip is ~110px wide, so
     roughly the first and last dozen bars would push it past the card. Only
     guarding the two END bars left ten on each side still overflowing — and
     `html{overflow-x:clip}` sitewide means an escaped tooltip is CLIPPED, not
     scrolled to, so the day it names is simply unreadable with nothing on
     screen to say why.
     `:nth-last-child` is used rather than a hard-coded index because the bar
     count is an admin setting (`page.history_bar_days`, 30-365) — an
     `:nth-child(n+79)` tuned for 90 days silently stops guarding the moment
     somebody sets it to 60. */
  .v2x.atd.sbd .sbd-bar:nth-child(-n+14)::after{ inset-inline-start:0; transform:translateX(0) translateY(4px); }
  .v2x.atd.sbd .sbd-bar:nth-child(-n+14):hover::after{ transform:translateX(0) translateY(0); }
  .v2x.atd.sbd .sbd-bar:nth-last-child(-n+14)::after{ inset-inline-start:auto; inset-inline-end:0; transform:translateX(0) translateY(4px); }
  .v2x.atd.sbd .sbd-bar:nth-last-child(-n+14):hover::after{ transform:translateX(0) translateY(0); }
}
@media (prefers-reduced-motion:reduce){
  .v2x.atd.sbd .sbd-bar{ transition:none; }
  .v2x.atd.sbd .sbd-bar:hover{ transform:none; }
}

.v2x.atd.sbd .sbd-bars-lg{
  display:flex; align-items:center; gap:10px; margin-top:8px;
  font-size:.72rem; font-weight:600; color:var(--muted);
}
/* Hairlines either side of the centre label.

   ⚠️ THEY ARE FLEX ITEMS, NOT ABSOLUTE ONES. The first version positioned two
   pseudo-elements at `width:calc(50% - 5.5em)`, which hard-codes an assumption
   about how long the label is — and the label is not fixed: it says "100.00%
   uptime", or "7 days recorded", or "100.00% uptime over 7 recorded days"
   depending on how much history exists. Past about eleven characters the rules
   ran underneath the words. As flex items they simply take whatever is left. */
.v2x.atd.sbd .sbd-bars-lg .mid{
  flex:1 1 auto; display:flex; align-items:center; justify-content:center;
  gap:10px; color:var(--muted); text-align:center;
}
.v2x.atd.sbd .sbd-bars-lg .mid::before,
.v2x.atd.sbd .sbd-bars-lg .mid::after{
  content:""; flex:1 1 auto; min-width:10px; height:1px; background:var(--line);
}

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-TILE) Uptime windows.

   ⚠️ A NULL WINDOW IS NOT ZERO, AND THE OLD TILE DREW IT AS ZERO. The previous
   kit rendered `width:0%` on a green meter whenever a figure was missing —
   which on this install is `24h` and `7d`, because the roll-up has only ever
   written seven daily rows. An empty green bar under "Last 24 hours" reads as
   a total outage on a page whose entire job is to say otherwise. A null now
   takes `.is-empty`: dashed track, muted figure, and the word so nobody has to
   infer it.

   The filled meter is clamped to a 95-100 band so 99.9% and 97% look
   meaningfully different instead of both reading full.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-tiles{
  display:grid; grid-template-columns:repeat(auto-fill,minmax(190px,1fr)); gap:14px;
}
.v2x.atd.sbd .sbd-tile{
  position:relative; overflow:hidden;
  padding:16px 17px; border-radius:15px;
  background-image:linear-gradient(150deg,
    rgba(var(--t-rgb,76,141,242),.075) 0%, rgba(var(--t-rgb,76,141,242),.012) 46%, rgba(var(--t-rgb,76,141,242),.05) 100%);
  background-color:#fff;
  border:1px solid rgba(var(--t-rgb,76,141,242),.20);
  transition:transform .26s var(--sbd-e), box-shadow .26s ease, border-color .22s ease;
}
body.theme-dark .v2x.atd.sbd .sbd-tile{
  background-image:linear-gradient(150deg,
    rgba(var(--t-rgb,76,141,242),.14) 0%, rgba(var(--t-rgb,76,141,242),.025) 46%, rgba(var(--t-rgb,76,141,242),.09) 100%);
  background-color:#1B1E28;
  border-color:rgba(var(--t-rgb,76,141,242),.28);
}
@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd .sbd-tile:hover{
    transform:translateY(-4px);
    border-color:rgba(var(--t-rgb,76,141,242),.42);
    box-shadow:0 16px 32px -18px rgba(var(--t-rgb,76,141,242),.60);
  }
  .v2x.atd.sbd .sbd-tile:hover .sbd-tile-ic{ transform:scale(1.08) rotate(-4deg); }
}
@media (prefers-reduced-motion:reduce){
  .v2x.atd.sbd .sbd-tile{ transition:none; }
  .v2x.atd.sbd .sbd-tile:hover{ transform:none; }
  .v2x.atd.sbd .sbd-tile:hover .sbd-tile-ic{ transform:none; }
}
.v2x.atd.sbd .sbd-tile-k{
  display:flex; align-items:center; gap:9px; margin-bottom:11px;
  font-size:.74rem; font-weight:700; letter-spacing:.06em; text-transform:uppercase;
  color:var(--t-ink,#1B5BB5);
}
.v2x.atd.sbd .sbd-tile-ic{
  flex:0 0 auto; width:26px; height:26px; border-radius:8px;
  display:inline-flex; align-items:center; justify-content:center;
  font-size:.7rem; color:#fff; background:var(--t-1p,#4C8DF2);
  box-shadow:0 2px 6px rgba(var(--t-rgb,76,141,242),.35);
  transition:transform .24s var(--sbd-e);
}
.v2x.atd.sbd .sbd-tile-v{
  font-size:1.72rem; font-weight:800; line-height:1; letter-spacing:-.03em;
  color:var(--ink); font-variant-numeric:tabular-nums;
}
.v2x.atd.sbd .sbd-tile.is-empty .sbd-tile-v{ color:var(--muted2); font-size:1.42rem; }
.v2x.atd.sbd .sbd-tile-s{ font-size:.77rem; color:var(--muted); margin-top:7px; line-height:1.45; }

.v2x.atd.sbd .sbd-meter{
  margin-top:11px; height:7px; border-radius:999px; overflow:hidden;
  background:var(--line);
}
body.theme-dark .v2x.atd.sbd .sbd-meter{ background:#252A38; }
.v2x.atd.sbd .sbd-meter span{
  display:block; height:100%; border-radius:999px;
  background:linear-gradient(90deg, var(--sbd-ok-2), var(--sbd-ok));
  animation:sbdFill 1.1s var(--sbd-e) both;
}
.v2x.atd.sbd .sbd-meter.is-warn span{ background:linear-gradient(90deg, var(--sbd-warn-2), var(--sbd-warn)); }
.v2x.atd.sbd .sbd-meter.is-bad  span{ background:linear-gradient(90deg, var(--sbd-bad-2), var(--sbd-bad)); }
.v2x.atd.sbd .sbd-meter.is-empty{
  background:transparent;
  border:1px dashed var(--line-strong); height:7px;
}
body.theme-dark .v2x.atd.sbd .sbd-meter.is-empty{ border-color:#333A4C; }
@keyframes sbdFill{ from{ width:0 !important; } }
@media (prefers-reduced-motion:reduce){ .v2x.atd.sbd .sbd-meter span{ animation:none; } }

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-CHART) The response-time chart.

   ⚠️ THIS INSTALL HAS ONE READING. `StatusStats::siteResponseSeries(30)`
   returned a single day when this was built, and an ApexCharts AREA series
   with one point draws nothing at all — a card that looks broken rather than
   empty. The partial therefore switches on the point COUNT, not on "is the
   array non-empty", and the chart only renders from two points up. Below that
   the same data is shown as a reading card, which is honest and looks
   deliberate. Do not simplify that gate away because the chart "works on
   staging" once a few more days have rolled up.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-chart{ min-height:270px; margin:2px -6px -6px; }

/* ── §SBD-READ) The single-reading instrument ──────────────────────────────
   What was here before was a dashed box with a number in it, which read as
   an error state. The figure we DO have is a real measurement, so it is
   presented as one: two tone-tiled readouts — median and p95, the same pair
   the chart plots — over a progress rail that says in words what unlocks the
   graph. The tiles carry the §TONE6 recipe (tint ground, tone hairline,
   opaque plate under a white glyph) in the SAME blue and violet the chart
   uses for its two series, so the day a second point lands nothing about the
   colour of this band changes.
   ────────────────────────────────────────────────────────────────────────── */
.v2x.atd.sbd .sbd-read{ display:flex; flex-direction:column; gap:14px; }
.v2x.atd.sbd .sbd-read-tiles{
  display:grid; grid-template-columns:repeat(auto-fit,minmax(210px,1fr)); gap:12px;
}
.v2x.atd.sbd .sbd-read-tile{
  display:flex; align-items:center; gap:14px; min-width:0;
  padding:16px 18px; border-radius:16px;
  background:var(--t-bg,#EAF2FD); border:1px solid var(--t-line,#CFE0FA);
  transition:transform .28s var(--sbd-e), box-shadow .28s ease;
}
/* Plates are opaque and take `--t-1p`, the ramp's PLATE value — the display
   hue (`--t-1`) is an ink and hands a white glyph 2.5:1. Same call the shared
   kit makes, and the reason neither of these has a dark twin. */
.v2x.atd.sbd .sbd-read-ic{
  flex:0 0 auto; width:42px; height:42px; border-radius:13px;
  display:inline-flex; align-items:center; justify-content:center;
  font-size:.95rem; color:#fff;
  background:linear-gradient(135deg, var(--t-1p,#4C8DF2), var(--t-2,#2060C0));
  box-shadow:0 5px 14px -4px rgba(var(--t-rgb,76,141,242),.55);
  transition:transform .38s var(--sbd-e);
}
.v2x.atd.sbd .sbd-read-tx{ min-width:0; display:flex; flex-direction:column; gap:4px; }
.v2x.atd.sbd .sbd-read-v{
  font-size:1.85rem; font-weight:800; line-height:1; color:var(--ink);
  letter-spacing:-.03em; font-variant-numeric:tabular-nums;
}
.v2x.atd.sbd .sbd-read-v i{
  font-style:normal; font-size:.9rem; font-weight:700;
  color:var(--t-ink,#1B5BB5); margin-inline-start:4px;
}
.v2x.atd.sbd .sbd-read-k{
  font-size:.7rem; font-weight:700; letter-spacing:.08em; text-transform:uppercase;
  color:var(--t-ink,#1B5BB5); line-height:1.35;
}
@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd .sbd-read-tile:hover{
    transform:translateY(-3px);
    box-shadow:0 16px 32px -18px rgba(var(--t-rgb,76,141,242),.70);
  }
  .v2x.atd.sbd .sbd-read-tile:hover .sbd-read-ic{ transform:scale(1.07) rotate(-4deg); }
}
@media (prefers-reduced-motion:reduce){
  .v2x.atd.sbd .sbd-read-tile,.v2x.atd.sbd .sbd-read-ic{ transition:none; }
  .v2x.atd.sbd .sbd-read-tile:hover{ transform:none; }
  .v2x.atd.sbd .sbd-read-tile:hover .sbd-read-ic{ transform:none; }
}

/* The progress rail. Dashed on purpose — it is the one part of this band that
   IS provisional, and keeping the dash here rather than around the whole card
   is what stops the readings above reading as placeholders. */
.v2x.atd.sbd .sbd-read-foot{
  display:flex; align-items:center; gap:16px; flex-wrap:wrap;
  padding:14px 16px; border-radius:14px;
  background:var(--accent-soft2); border:1px dashed var(--line-strong);
}
body.theme-dark .v2x.atd.sbd .sbd-read-foot{ background:rgba(255,255,255,.04); border-color:#333A4C; }

/* One point plotted against the trend we cannot draw yet. Both circles are
   painted from the brand hue rather than from a ground colour, so the mark
   needs no dark twin to stay visible on either surface. */
.v2x.atd.sbd .sbd-read-spark{ flex:0 0 auto; width:96px; height:28px; display:block; }
.v2x.atd.sbd .sbd-read-spark svg{ width:100%; height:100%; display:block; overflow:visible; }
.v2x.atd.sbd .sbd-spark-l{
  fill:none; stroke:var(--line-strong); stroke-width:2; stroke-linecap:round; stroke-dasharray:2 6;
}
body.theme-dark .v2x.atd.sbd .sbd-spark-l{ stroke:#3A4356; }
.v2x.atd.sbd .sbd-spark-h{ fill:rgba(54,128,237,.20); }
.v2x.atd.sbd .sbd-spark-d{ fill:var(--accent); }

.v2x.atd.sbd .sbd-read-note{ flex:1 1 280px; min-width:0; }
.v2x.atd.sbd .sbd-read-steps{
  display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-bottom:6px;
}
.v2x.atd.sbd .sbd-read-step{
  display:inline-flex; align-items:center; gap:7px;
  font-size:.71rem; font-weight:700; letter-spacing:.06em; text-transform:uppercase;
  color:var(--muted);
}
.v2x.atd.sbd .sbd-read-step.is-done{ color:var(--sbd-ok-2); }
/* `--sbd-ok-2` flips to #0D9F71 in dark, which is 4.13:1 on this dashed panel —
   the ramp's DARK end is meant to sit under the light one on a bar, not to
   carry 11px uppercase text. The light end (#34D399) is 7.26. */
body.theme-dark .v2x.atd.sbd .sbd-read-step.is-done{ color:var(--sbd-ok); }
.v2x.atd.sbd .sbd-read-step.is-done i{ font-size:.6rem; }
.v2x.atd.sbd .sbd-read-step .dot{
  width:9px; height:9px; border-radius:50%; flex:none;
  border:2px solid var(--line-strong); background:transparent;
}
body.theme-dark .v2x.atd.sbd .sbd-read-step .dot{ border-color:#3A4356; }
/* A flex item, never a hard-coded width: the two labels around it are
   translated and the gap between them is not a constant. */
.v2x.atd.sbd .sbd-read-sep{
  flex:1 1 20px; max-width:46px; height:2px; border-radius:2px;
  background:linear-gradient(90deg, var(--sbd-ok), var(--line-strong));
}
body.theme-dark .v2x.atd.sbd .sbd-read-sep{ background:linear-gradient(90deg, var(--sbd-ok), #3A4356); }
.v2x.atd.sbd .sbd-read-p{ font-size:.86rem; line-height:1.55; color:var(--muted); margin:0; }

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-EMPTY) The "nothing here yet" state, shared by every band.

   A status page with no data is a real state (a fresh install, a band an admin
   enabled before configuring it), so it gets a designed surface rather than a
   blank card.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-empty{ text-align:center; padding:34px 20px; }
.v2x.atd.sbd .sbd-empty-ic{
  width:56px; height:56px; margin:0 auto 14px; border-radius:17px;
  display:inline-flex; align-items:center; justify-content:center;
  font-size:1.3rem; color:var(--accent-dark);
  background:var(--accent-soft); border:1px solid #d6e4fc;
}
body.theme-dark .v2x.atd.sbd .sbd-empty-ic{
  color:#9CC5F9; background:rgba(54,128,237,.16); border-color:rgba(54,128,237,.30);
}
.v2x.atd.sbd .sbd-empty-t{ font-size:1.02rem; font-weight:700; color:var(--ink); margin-bottom:5px; }
.v2x.atd.sbd .sbd-empty-s{ font-size:.88rem; color:var(--muted); margin:0 auto; max-width:44ch; line-height:1.6; }

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-REG) Region tiles — §TONE6 cards with the flag as the plate.

   The flag is an EMOJI, not an icon font, so the plate is a light tinted
   square rather than the saturated `--t-1p` fill the other plates use: an
   emoji carries its own colours and a white-glyph fill would fight them.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-regs{
  display:grid; grid-template-columns:repeat(auto-fill,minmax(180px,1fr)); gap:13px;
}
.v2x.atd.sbd .sbd-reg{
  display:flex; align-items:center; gap:13px;
  padding:14px 15px; border-radius:14px;
  background:var(--t-bg,#EAF2FD); border:1px solid var(--t-line,#CFE0FA);
  transition:transform .26s var(--sbd-e), box-shadow .26s ease;
}
.v2x.atd.sbd .sbd-reg-flag{
  flex:0 0 auto; width:40px; height:40px; border-radius:12px;
  display:inline-flex; align-items:center; justify-content:center;
  font-size:1.25rem; line-height:1;
  background:#fff; border:1px solid var(--t-line,#CFE0FA);
  box-shadow:0 2px 6px rgba(var(--t-rgb,76,141,242),.18);
}
body.theme-dark .v2x.atd.sbd .sbd-reg-flag{ background:#1B1E28; }
.v2x.atd.sbd .sbd-reg-flag i{ font-size:.95rem; color:var(--t-1p,#4C8DF2); }
.v2x.atd.sbd .sbd-reg-tx{ min-width:0; display:flex; flex-direction:column; gap:2px; }
.v2x.atd.sbd .sbd-reg-n{ font-size:.92rem; font-weight:700; color:var(--ink); line-height:1.3; }
.v2x.atd.sbd .sbd-reg-c{
  font-size:.68rem; font-weight:700; letter-spacing:.07em; text-transform:uppercase;
  color:var(--t-ink,#1B5BB5);
}
@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd .sbd-reg:hover{ transform:translateY(-3px); box-shadow:0 14px 28px -16px rgba(var(--t-rgb,76,141,242),.60); }
}
@media (prefers-reduced-motion:reduce){
  .v2x.atd.sbd .sbd-reg{ transition:none; }
  .v2x.atd.sbd .sbd-reg:hover{ transform:none; }
}

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-SIDE) Sidebar extras.

   The cards themselves are the SHARED `.atd-info` + `data-tone` recipe — tone
   wash, tinted icon plate, orbit hover ring — so nothing about the card is
   restated here. Only the two contents the shared kit has no vocabulary for:
   the uptime-window rows and the status legend.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-wins{ display:flex; flex-direction:column; gap:9px; }
.v2x.atd.sbd .sbd-win{
  display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center; gap:10px 12px;
}
.v2x.atd.sbd .sbd-win-k{ font-size:.83rem; font-weight:600; color:var(--muted); }
.v2x.atd.sbd .sbd-win-v{
  font-family:var(--mono); font-size:.83rem; font-weight:700; color:var(--ink);
  font-variant-numeric:tabular-nums;
}
.v2x.atd.sbd .sbd-win.is-empty .sbd-win-v{ color:var(--muted); font-weight:600; }
.v2x.atd.sbd .sbd-win-tr{
  grid-column:1 / -1; height:5px; border-radius:999px; background:var(--line); overflow:hidden;
}
body.theme-dark .v2x.atd.sbd .sbd-win-tr{ background:#252A38; }
.v2x.atd.sbd .sbd-win-tr span{
  display:block; height:100%; border-radius:999px;
  background:linear-gradient(90deg, var(--tone-2,#08795A), var(--tone-1,#10B981));
  animation:sbdFill 1.1s var(--sbd-e) both;
}
.v2x.atd.sbd .sbd-win.is-empty .sbd-win-tr{
  background:transparent; border:1px dashed var(--line-strong); height:5px;
}
body.theme-dark .v2x.atd.sbd .sbd-win.is-empty .sbd-win-tr{ border-color:#333A4C; }
@media (prefers-reduced-motion:reduce){ .v2x.atd.sbd .sbd-win-tr span{ animation:none; } }

/* Legend — the admin's own status vocabulary, so a visitor can read the pills
   on the board above without guessing.

   ⚠️ EACH ROW IS A KEY, NOT A SENTENCE. A bare dot in front of a run-on line
   made six distinct states read as one paragraph — the label and its
   description ran together at the same size, on the same line, in the same
   two colours. The dot now sits on its own plate in the status's own tint,
   the label is a line of its own above the description, and a hairline closes
   each entry. Hover washes the row in that status's tint and rings the plate:
   pointing at "Degraded Performance" shows you which colour to look for on
   the board without reading a word. */
.v2x.atd.sbd .sbd-legend{ display:flex; flex-direction:column; }
.v2x.atd.sbd .sbd-lg{
  display:flex; align-items:flex-start; gap:12px;
  margin-inline:-10px; padding:11px 10px;
  border-radius:12px; border-bottom:1px solid var(--line);
  transition:background-color .22s ease;
}
.v2x.atd.sbd .sbd-lg:last-child{ border-bottom:0; }
/* The plate reads the TINT (`--s-t`), never the fill: it sits under a
   coloured dot rather than a white glyph, so the §SBD-TONE plate pair
   (`--s-p1`/`--s-p2`) is the wrong instrument here. */
.v2x.atd.sbd .sbd-lg-plate{
  flex:0 0 auto; width:26px; height:26px; margin-top:1px; border-radius:9px;
  display:inline-flex; align-items:center; justify-content:center;
  background:var(--s-t,#E6FCF3);
  border:1px solid color-mix(in srgb, var(--s-c,#0CA678) 26%, transparent);
  transition:transform .32s var(--sbd-e), box-shadow .26s ease;
}
@supports not (color: color-mix(in srgb, red 50%, transparent)){
  .v2x.atd.sbd .sbd-lg-plate{ border-color:var(--line); }
}
/* ⚠️ THE FILL CANNOT MOVE AND THE GROUND CANNOT MOVE. This dot has to be
   the SAME colour as the dots on the board above — that is the entire job of
   a legend — and it sits on the status's own tint, which is where the pills
   put theirs. `--s-c` on `--s-t` measures 2.53-2.94:1 across the six statuses,
   under the 3:1 a graphical object needs, and a swatch is the one graphic on
   this page that genuinely carries the meaning. So the EDGE does the work: a
   1.5px ring in `--s-i`, the ink member of the same pair, which the mode
   switch already resolves for us. Measured 4.64-7.08 light, 5.48-7.48 dark. */
.v2x.atd.sbd .sbd-lg-dot{
  width:10px; height:10px; border-radius:50%; flex:none;
  background:var(--s-c,#0CA678);
  box-shadow:0 0 0 1.5px var(--s-i,#08795A);
}
.v2x.atd.sbd .sbd-lg-tx{ min-width:0; display:flex; flex-direction:column; gap:2px; }
.v2x.atd.sbd .sbd-lg-n{ font-size:.88rem; font-weight:700; color:var(--ink); line-height:1.35; }
.v2x.atd.sbd .sbd-lg-d{ font-size:.79rem; color:var(--muted); line-height:1.5; }
/* ⚠️ HOVER ADDS A GROUND THIS TEXT DID NOT HAVE. In dark mode the row washes
   with `--s-t` (an 18% status tint) ON TOP of the card's violet wash, and
   `--muted` lands at 4.40:1 on the Partial Outage tint and 4.50 on Degraded —
   i.e. the description is least readable exactly when the pointer is on it.
   #AEB4C4 clears 5.41 on the worst of the six and is still plainly a second
   voice under `--ink`. Light needs no lift (its tints are near-white). */
body.theme-dark .v2x.atd.sbd .sbd-lg-d{ color:#AEB4C4; }
@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd .sbd-lg:hover{ background:var(--s-t,#E6FCF3); }
  .v2x.atd.sbd .sbd-lg:hover .sbd-lg-plate{
    transform:scale(1.08);
    box-shadow:0 0 0 3px color-mix(in srgb, var(--s-c,#0CA678) 18%, transparent);
  }
  @supports not (color: color-mix(in srgb, red 50%, transparent)){
    .v2x.atd.sbd .sbd-lg:hover .sbd-lg-plate{ box-shadow:none; }
  }
}
@media (prefers-reduced-motion:reduce){
  .v2x.atd.sbd .sbd-lg,.v2x.atd.sbd .sbd-lg-plate{ transition:none; }
  .v2x.atd.sbd .sbd-lg:hover .sbd-lg-plate{ transform:none; }
}

/* ── §SBD-FOOT) The closing rail ───────────────────────────────────────────
   Was a flat white bar carrying the page's proof-of-life in the same muted
   grey as the three chips beside it, with the timestamp buried mid-sentence.
   It is now the same §SPINE-BLUE surface as the hero panel and the board
   header, the stamp leads with a breathing ping in the LIVE status colour and
   splits into a label over a monospaced time, and each jump is a branded pill
   whose glyph sits on its own tinted plate.
   ────────────────────────────────────────────────────────────────────────── */
.v2x.atd.sbd .sbd-foot{
  display:flex; align-items:center; justify-content:space-between; gap:14px 24px;
  flex-wrap:wrap; margin-top:var(--atd-sec,26px);
  padding:14px 18px; border-radius:18px;
  background:
    linear-gradient(150deg,
      rgba(54,128,237,.075) 0%, rgba(54,128,237,0) 50%, rgba(54,128,237,.05) 100%) no-repeat,
    #fff;
  border:1px solid rgba(54,128,237,.20);
  box-shadow:0 1px 2px rgba(15,23,42,.05), 0 12px 28px -20px rgba(16,24,40,.36);
}
body.theme-dark .v2x.atd.sbd .sbd-foot{
  background:
    linear-gradient(150deg,
      rgba(54,128,237,.13) 0%, rgba(54,128,237,0) 50%, rgba(54,128,237,.08) 100%) no-repeat,
    #171922;
  border-color:rgba(54,128,237,.28);
  box-shadow:0 1px 2px rgba(0,0,0,.45), 0 12px 28px -20px rgba(0,0,0,.80);
}

.v2x.atd.sbd .sbd-foot-live{ display:inline-flex; align-items:center; gap:12px; min-width:0; }
/* The ping is the only moving thing left on a healthy board, and it is the
   board's own colour rather than a fixed green — an amber board pings amber. */
.v2x.atd.sbd .sbd-foot-ping{
  position:relative; flex:0 0 auto;
  width:34px; height:34px; border-radius:12px;
  display:inline-flex; align-items:center; justify-content:center;
  background:color-mix(in srgb, var(--s-c,#0CA678) 14%, transparent);
  border:1px solid color-mix(in srgb, var(--s-c,#0CA678) 30%, transparent);
}
@supports not (color: color-mix(in srgb, red 50%, transparent)){
  .v2x.atd.sbd .sbd-foot-ping{ background:var(--s-t,#E6FCF3); border-color:var(--line); }
}
/* The SOLID mark takes `--s-i` and the expanding ring takes `--s-c`: this is
   a live indicator, not a legend swatch, so it is free to use the ink member —
   and it has to, because `--s-c` on the near-white footer wash measures
   2.58-2.94:1 on three of the six statuses. `--s-i` is the same hue two steps
   down and is resolved per mode by §SBD-TONE, so one declaration serves both:
   4.61-7.88 light, 6.90-9.91 dark. */
.v2x.atd.sbd .sbd-foot-ping .dot{
  position:relative; width:10px; height:10px; border-radius:50%;
  background:var(--s-i,#08795A);
}
.v2x.atd.sbd .sbd-foot-ping .dot::after{
  content:""; position:absolute; inset:-4px; border-radius:50%;
  border:2px solid var(--s-c,#0CA678);
  animation:sbdPing 2.6s cubic-bezier(0,0,.2,1) infinite;
}
@media (prefers-reduced-motion:reduce){
  .v2x.atd.sbd .sbd-foot-ping .dot::after{ animation:none; opacity:.35; }
}
.v2x.atd.sbd .sbd-foot-tx{ display:flex; flex-direction:column; gap:1px; min-width:0; }
.v2x.atd.sbd .sbd-foot-k{
  font-size:.66rem; font-weight:700; letter-spacing:.1em; text-transform:uppercase;
  color:var(--muted2); line-height:1.4;
}
.v2x.atd.sbd .sbd-foot-v{
  font-family:var(--mono); font-size:.83rem; font-weight:700; color:var(--ink);
  font-variant-numeric:tabular-nums; line-height:1.4;
}

.v2x.atd.sbd .sbd-foot-links{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.v2x.atd.sbd .sbd-flink{
  display:inline-flex; align-items:center; gap:8px;
  padding:6px 14px 6px 6px; border-radius:var(--r-pill);
  font-size:.81rem; font-weight:600;
  color:var(--muted); background:var(--accent-soft2); border:1px solid var(--line);
  transition:color .18s ease, background-color .18s ease, border-color .18s ease,
             transform .22s var(--sbd-e), box-shadow .24s ease;
}
body.theme-dark .v2x.atd.sbd .sbd-flink{ background:rgba(255,255,255,.05); }
.v2x.atd.sbd .sbd-flink .ic{
  flex:0 0 auto; width:26px; height:26px; border-radius:50%;
  display:inline-flex; align-items:center; justify-content:center;
  font-size:.7rem; color:var(--accent-dark);
  background:var(--accent-soft); border:1px solid #d6e4fc;
  transition:color .18s ease, background-color .18s ease, border-color .18s ease, transform .3s var(--sbd-e);
}
body.theme-dark .v2x.atd.sbd .sbd-flink .ic{
  color:#9CC5F9; background:rgba(54,128,237,.18); border-color:rgba(54,128,237,.34);
}
/* ⚠️ HOVER DEEPENS THE FILL, IT DOES NOT LIGHTEN IT. The white-on-brand
   sheen this page shipped in its first kit measured 3.09:1 — the control was
   least readable exactly when the pointer was on it. `--accent-dark` under
   white is 6.36:1, and the lift comes from the shadow and the transform. */
@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd .sbd-flink:hover{
    color:#fff; background:var(--accent-dark); border-color:var(--accent-dark);
    transform:translateY(-2px);
    box-shadow:0 12px 22px -12px rgba(32,96,192,.65);
  }
  .v2x.atd.sbd .sbd-flink:hover .ic{
    color:var(--accent-dark); background:#fff; border-color:#fff; transform:scale(1.06);
  }
  /* ⚠️ NOT `--accent`. White on #3680ED is 3.84:1 — the same measurement that
     made this module's first kit fail on its primary button, and the same one
     recorded against every brand-blue fill on this site. `--accent-dark` is
     6.01 and still reads as a filled brand control against the near-black
     card. Dark mode does not get to reuse the light hover fill. */
  body.theme-dark .v2x.atd.sbd .sbd-flink:hover{
    color:#fff; background:var(--accent-dark); border-color:var(--accent-dark);
    box-shadow:0 12px 22px -12px rgba(0,0,0,.85);
  }
  body.theme-dark .v2x.atd.sbd .sbd-flink:hover .ic{ color:var(--accent-dark); background:#fff; border-color:#fff; }
  /* Back to top points where it goes. */
  .v2x.atd.sbd .sbd-flink.is-top:hover .ic{ transform:translateY(-2px) scale(1.06); }
}
@media (prefers-reduced-motion:reduce){
  .v2x.atd.sbd .sbd-flink,.v2x.atd.sbd .sbd-flink .ic{ transition:none; }
  .v2x.atd.sbd .sbd-flink:hover{ transform:none; }
  .v2x.atd.sbd .sbd-flink:hover .ic{ transform:none; }
  .v2x.atd.sbd .sbd-flink.is-top:hover .ic{ transform:none; }
}

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-REFRESH) The board reloads itself, so the control has to say so.

   `.atd-pillbtn` is the shared kit's pill and everything about the button
   comes from it — this block adds only the one behaviour a status page needs
   that a share button does not: the glyph spins while the round trip is in
   flight, and the pill is dimmed so a second click reads as already-handled.

   ⚠️ DRIVEN BY `wire:loading`, NOT BY AN INLINE STYLE. Livewire toggles
   `display` on a `wire:loading` element itself; setting `display` inline on
   the same node defeats it silently. Here the flag is `wire:loading.class`,
   applied by Livewire to the button, so the two never fight.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-refresh-btn .ic-main{
  transition:transform .4s cubic-bezier(.22,.61,.36,1);
}
.v2x.atd.sbd .sbd-refresh-btn.is-busy{ opacity:.62; pointer-events:none; }
.v2x.atd.sbd .sbd-refresh-btn.is-busy .ic-main{ animation:sbdSpin .9s linear infinite; }
@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd .sbd-refresh-btn:hover .ic-main{ transform:rotate(115deg); }
}
@keyframes sbdSpin{ to{ transform:rotate(360deg); } }
@media (prefers-reduced-motion:reduce){
  .v2x.atd.sbd .sbd-refresh-btn .ic-main{ transition:none; }
  .v2x.atd.sbd .sbd-refresh-btn:hover .ic-main{ transform:none; }
  .v2x.atd.sbd .sbd-refresh-btn.is-busy .ic-main{ animation:none; }
}

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-BAND) Main-column cards — the treatment the shared kit could not reach.

   atd-styles dresses a main-column section through `.col-lg-8 > .v2-card`:
   a 150deg brand wash on white, a brighter hairline, and a gradient plate
   behind the section title's glyph, all answered on hover by a deeper shadow
   and a tilt on the plate. It is the single strongest cue the tool, company
   and model pages have.

   ⚠️ IT HAS NEVER APPLIED TO THIS PAGE. Every band renders inside
   `<div id="stp-sec-{type}">` — the anchor the rail, the hero jump links and
   `StComponent::url()` all target — so the CHILD combinator has an extra
   element to cross and matched nothing. /status therefore shipped flat 12px
   white cards while its three sibling pages got 20px washed ones, and no
   grep for the class would have shown it: the markup is right, the DOM depth
   is not. `.sbd-band` on that wrapper is what this block hangs off.

   Restated at (0,4,0) so it lands on top of the (0,3,0) shared `.v2-card`
   base. The shared `::after` corner bloom is deliberately NOT reproduced: it
   is declared `z-index:-1` under an opaque card background, so it paints
   below the surface it is meant to glow on and draws nothing anywhere.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-band > .v2-card{
  position:relative;
  border-radius:20px;
  background:
    linear-gradient(150deg,
      rgba(54,128,237,.07) 0%, rgba(54,128,237,0) 46%, rgba(54,128,237,.05) 100%) no-repeat,
    #fff;
  border:1px solid rgba(54,128,237,.20);
  box-shadow:0 1px 2px rgba(15,23,42,.05), 0 10px 26px -18px rgba(16,24,40,.32);
  transition:border-color .24s ease, box-shadow .28s ease;
}
body.theme-dark .v2x.atd.sbd .sbd-band > .v2-card{
  background:
    linear-gradient(150deg,
      rgba(54,128,237,.10) 0%, rgba(54,128,237,0) 46%, rgba(54,128,237,.07) 100%) no-repeat,
    #171922;
  border-color:rgba(54,128,237,.26);
  box-shadow:0 1px 2px rgba(0,0,0,.40), 0 10px 26px -18px rgba(0,0,0,.70);
}
/* The title plate. `color:#fff !important` is the shared kit's call and it is
   load-bearing here too: `.v2-section-title i` sets `color:var(--accent)` and
   a plain declaration at equal specificity would leave a blue glyph on a blue
   plate. */
.v2x.atd.sbd .sbd-band > .v2-card .v2-section-title{ gap:11px; align-items:center; }
.v2x.atd.sbd .sbd-band > .v2-card .v2-section-title > i:first-child,
.v2x.atd.sbd .sbd-band > .v2-card .v2-section-title > svg:first-child{
  box-sizing:border-box; flex:0 0 auto;
  width:34px; height:34px; border-radius:10px;
  display:inline-flex; align-items:center; justify-content:center;
  background:linear-gradient(135deg,#4C8DF2,#2060C0);
  color:#fff !important; font-size:.85rem;
  box-shadow:0 4px 12px rgba(32,96,192,.30);
  transition:transform 380ms cubic-bezier(.16,1,.3,1), box-shadow 300ms ease;
}
.v2x.atd.sbd .sbd-band > .v2-card .v2-section-title > svg:first-child{ padding:8px; }
@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd .sbd-band > .v2-card:hover{
    border-color:rgba(54,128,237,.34);
    box-shadow:0 2px 6px rgba(16,24,40,.06), 0 18px 44px -14px rgba(32,96,192,.22);
  }
  body.theme-dark .v2x.atd.sbd .sbd-band > .v2-card:hover{
    border-color:rgba(54,128,237,.46);
    box-shadow:0 2px 6px rgba(0,0,0,.50), 0 18px 44px -14px rgba(0,0,0,.55);
  }
  .v2x.atd.sbd .sbd-band > .v2-card:hover .v2-section-title > i:first-child,
  .v2x.atd.sbd .sbd-band > .v2-card:hover .v2-section-title > svg:first-child{
    transform:scale(1.07) rotate(-3deg);
    box-shadow:0 6px 16px rgba(32,96,192,.40);
  }
}
@media (prefers-reduced-motion:reduce){
  .v2x.atd.sbd .sbd-band > .v2-card,
  .v2x.atd.sbd .sbd-band > .v2-card .v2-section-title > i:first-child,
  .v2x.atd.sbd .sbd-band > .v2-card .v2-section-title > svg:first-child{ transition:none !important; }
  .v2x.atd.sbd .sbd-band > .v2-card:hover .v2-section-title > i:first-child,
  .v2x.atd.sbd .sbd-band > .v2-card:hover .v2-section-title > svg:first-child{ transform:none; }
}

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-SHEAD) The services board header.

   The board is the biggest band on the page — 31 services across 7 groups —
   and it opened on a bare <h2> with a 17px glyph. It is now a header band on
   the same §SPINE-BLUE surface as the hero panel: brand plate, title, its
   subtitle, and on the trailing end the two things a reader of a service
   board reaches for — the live operational tally in the board's own status
   colour, and one control that opens or closes every group at once.

   ⚠️ THE HEADING DOES NOT BORROW `.v2-section-title`. That class is (0,3,0)
   in the shared kit AND carries a four-step responsive ramp; refining it from
   here at equal specificity would win at EVERY width and silently flatten the
   phone sizes. `.sbd-shead-t` therefore restates the whole ramp, which is the
   only honest way to own a heading size. Steps mirror the shared kit exactly.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-shead{
  display:flex; align-items:center; gap:15px; flex-wrap:wrap;
  margin-bottom:18px; padding:16px 18px; border-radius:18px;
  background:
    linear-gradient(150deg,
      rgba(54,128,237,.085) 0%, rgba(54,128,237,0) 52%, rgba(54,128,237,.055) 100%) no-repeat,
    #fff;
  border:1px solid rgba(54,128,237,.20);
  box-shadow:0 1px 2px rgba(15,23,42,.05), 0 12px 28px -20px rgba(16,24,40,.36);
  transition:border-color .24s ease, box-shadow .28s ease;
}
body.theme-dark .v2x.atd.sbd .sbd-shead{
  background:
    linear-gradient(150deg,
      rgba(54,128,237,.14) 0%, rgba(54,128,237,0) 52%, rgba(54,128,237,.08) 100%) no-repeat,
    #171922;
  border-color:rgba(54,128,237,.28);
  box-shadow:0 1px 2px rgba(0,0,0,.45), 0 12px 28px -20px rgba(0,0,0,.80);
}
.v2x.atd.sbd .sbd-shead-ic{
  flex:0 0 auto; width:44px; height:44px; border-radius:14px;
  display:inline-flex; align-items:center; justify-content:center;
  font-size:1.02rem; color:#fff;
  background:linear-gradient(135deg,#4C8DF2,#2060C0);
  box-shadow:0 6px 16px -4px rgba(32,96,192,.45);
  transition:transform 380ms cubic-bezier(.16,1,.3,1), box-shadow 300ms ease;
}
.v2x.atd.sbd .sbd-shead-tx{ flex:1 1 260px; min-width:0; }
.v2x.atd.sbd .sbd-shead-t{
  font-family:var(--font); font-size:1.5rem; font-weight:700; letter-spacing:-.02em;
  color:var(--ink); margin:0; line-height:1.2;
}
.v2x.atd.sbd .sbd-shead-s{
  font-size:.88rem; line-height:1.55; color:var(--muted); margin:4px 0 0;
}
.v2x.atd.sbd .sbd-shead-side{
  display:flex; align-items:center; gap:9px; flex-wrap:wrap; margin-inline-start:auto;
}
/* The tally is the §SBD-PILL recipe — tinted, never filled — so it can never
   disagree with the pills on the group headers below it. */
.v2x.atd.sbd .sbd-shead-tally{
  display:inline-flex; align-items:center; gap:6px; white-space:nowrap;
  padding:7px 13px; border-radius:var(--r-pill);
  font-size:.78rem; font-weight:600; line-height:1;
  background:var(--s-t,#E6FCF3); color:var(--s-i,#08795A);
  border:1px solid color-mix(in srgb, var(--s-c,#0CA678) 30%, transparent);
}
@supports not (color: color-mix(in srgb, red 50%, transparent)){
  .v2x.atd.sbd .sbd-shead-tally{ border-color:var(--line); }
}
.v2x.atd.sbd .sbd-shead-tally .dot{
  width:7px; height:7px; border-radius:50%; flex:none; background:var(--s-c,#0CA678);
  animation:sbdBeat 2.6s ease-in-out infinite;
}
@media (prefers-reduced-motion:reduce){ .v2x.atd.sbd .sbd-shead-tally .dot{ animation:none; } }
.v2x.atd.sbd .sbd-shead-tally b{ font-weight:800; font-variant-numeric:tabular-nums; }
.v2x.atd.sbd .sbd-shead-tally .sep{ opacity:.55; }
.v2x.atd.sbd .sbd-shead-tally .tot{ font-variant-numeric:tabular-nums; }
.v2x.atd.sbd .sbd-shead-tally .lb{ margin-inline-start:3px; }

/* Expand / collapse all. Both labels stay in the DOM and are stacked in one
   grid cell, so the pill is sized to the LONGER of the two and never changes
   width as it flips — `visibility` rather than `display`, which also keeps
   the hidden one out of the accessibility tree. */
.v2x.atd.sbd .sbd-foldall{
  -webkit-appearance:none; appearance:none; cursor:pointer;
  display:inline-flex; align-items:center; gap:8px;
  padding:7px 14px; border-radius:var(--r-pill);
  font-family:var(--font); font-size:.78rem; font-weight:700; line-height:1;
  color:var(--accent-dark); background:var(--accent-soft); border:1px solid #d6e4fc;
  transition:color .18s ease, background-color .18s ease, border-color .18s ease,
             transform .22s var(--sbd-e), box-shadow .24s ease;
}
body.theme-dark .v2x.atd.sbd .sbd-foldall{
  color:#9CC5F9; background:rgba(54,128,237,.18); border-color:rgba(54,128,237,.34);
}
.v2x.atd.sbd .sbd-foldall .ic{ font-size:.66rem; transition:transform .3s var(--sbd-e); }
.v2x.atd.sbd .sbd-foldall[aria-expanded="false"] .ic{ transform:rotate(180deg); }
.v2x.atd.sbd .sbd-foldall .lb{ display:grid; }
.v2x.atd.sbd .sbd-foldall .lb > span{ grid-area:1 / 1; }
.v2x.atd.sbd .sbd-foldall .lb .off{ visibility:hidden; }
.v2x.atd.sbd .sbd-foldall[aria-expanded="false"] .lb .on{ visibility:hidden; }
.v2x.atd.sbd .sbd-foldall[aria-expanded="false"] .lb .off{ visibility:visible; }
@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd .sbd-shead:hover .sbd-shead-ic{
    transform:scale(1.06) rotate(-4deg); box-shadow:0 8px 20px -4px rgba(32,96,192,.55);
  }
  .v2x.atd.sbd .sbd-foldall:hover{
    color:#fff; background:var(--accent-dark); border-color:var(--accent-dark);
    transform:translateY(-2px); box-shadow:0 12px 22px -12px rgba(32,96,192,.65);
  }
  /* Same 3.84:1 as the footer pill — see the note there. */
  body.theme-dark .v2x.atd.sbd .sbd-foldall:hover{
    color:#fff; background:var(--accent-dark); border-color:var(--accent-dark);
    box-shadow:0 12px 22px -12px rgba(0,0,0,.85);
  }
}
@media (prefers-reduced-motion:reduce){
  .v2x.atd.sbd .sbd-shead,.v2x.atd.sbd .sbd-shead-ic,
  .v2x.atd.sbd .sbd-foldall,.v2x.atd.sbd .sbd-foldall .ic{ transition:none; }
  .v2x.atd.sbd .sbd-shead:hover .sbd-shead-ic{ transform:none; }
  .v2x.atd.sbd .sbd-foldall:hover{ transform:none; }
}

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-ACT) Sidebar help — actions, not a fact table.

   `.atd-facts` is a label→value list, and four calls to action forced into it
   put the only tappable thing in each row hard against the right edge of a
   4-column rail: a ~70px target that wrapped onto its own line the moment the
   rail narrowed, plus a "Copy link" <button> that had to be drawn as a box to
   look pressable at all — the one bordered rectangle in the whole sidebar.

   Here the ROW is the control. The whole tile is the <a> (or the <button>), so
   the target is the full width at every viewport, the glyph gets a real plate,
   and the destination reads as the row's second line rather than as a floating
   link. Everything takes the CARD's tone (`--tone-*`, set by `data-tone`), not
   a per-row hue: the card already washes amber and four competing tints inside
   it would fight both the wash and the orbit ring.
   ══════════════════════════════════════════════════════════════════════════ */
.v2x.atd.sbd .sbd-acts{ display:flex; flex-direction:column; }
.v2x.atd.sbd .sbd-act{
  -webkit-appearance:none; appearance:none;
  display:flex; align-items:center; gap:12px; width:100%;
  margin-inline:-12px; padding:11px 12px;
  border:0; border-bottom:1px solid var(--line); border-radius:12px;
  background:transparent; font-family:var(--font); text-align:start;
  color:var(--ink); text-decoration:none; cursor:pointer;
  transition:background-color .22s ease;
}
.v2x.atd.sbd .sbd-act:last-child{ border-bottom:0; }
/* `width:100%` + the negative inline margin would overflow the card by 24px
   on a border-box-agnostic element; the box model is stated rather than
   assumed because a <button> is not a <div>. */
.v2x.atd.sbd .sbd-act{ box-sizing:border-box; width:calc(100% + 24px); }
.v2x.atd.sbd .sbd-act-ic{
  flex:0 0 auto; width:34px; height:34px; border-radius:11px;
  display:inline-flex; align-items:center; justify-content:center;
  font-size:.82rem; color:#fff;
  /* ⚠️ NOT `--tone-1 -> --tone-2`, which is what the shared `.atd-side-ic`
     does. `--tone-1` is a DISPLAY hue, and on the amber card it is #F59E0B:
     white on that measures 2.15:1, so the light end of that gradient hands
     a white glyph less than the 3:1 a glyph needs. Starting the ramp at a
     55% mix toward the ink end keeps the plate reading as the card's colour
     while clearing 3:1 across the whole sweep on every one of the eight
     tones. The fallback reads `--tone-2` — the ink end, always dark enough —
     rather than hard-coding a hue, which would paint a BLUE plate on an
     amber card wherever color-mix is missing. */
  background:linear-gradient(135deg,
    color-mix(in srgb, var(--tone-1,#4C8DF2) 55%, var(--tone-2,#2060C0)),
    var(--tone-2,#2060C0));
  box-shadow:0 4px 12px -3px rgba(var(--tone-rgb,76,141,242),.55);
  transition:transform .34s var(--sbd-e), box-shadow .26s ease;
}
@supports not (color: color-mix(in srgb, red 50%, transparent)){
  .v2x.atd.sbd .sbd-act-ic{ background:var(--tone-2,#2060C0); }
}
.v2x.atd.sbd .sbd-act-tx{ min-width:0; display:flex; flex-direction:column; gap:1px; flex:1 1 auto; }
.v2x.atd.sbd .sbd-act-n{ font-size:.87rem; font-weight:700; color:var(--ink); line-height:1.35; }
.v2x.atd.sbd .sbd-act-d{
  font-size:.78rem; font-weight:600; color:var(--tone-ink,#1B5BB5); line-height:1.45;
}
.v2x.atd.sbd .sbd-act-go{
  flex:0 0 auto; display:inline-flex; align-items:center; justify-content:center;
  width:24px; height:24px; border-radius:8px;
  color:var(--muted2); background:transparent;
  transition:color .2s ease, background-color .2s ease, transform .3s var(--sbd-e);
}
.v2x.atd.sbd .sbd-act-go svg{ width:14px; height:14px; }
/* Copy confirmed — the kit swaps the plate glyph to a check, so the row
   answers in the module's own operational green for as long as that lasts. */
.v2x.atd.sbd .sbd-act.is-copied .sbd-act-ic{
  background:linear-gradient(135deg, var(--sbd-ok), var(--sbd-ok-2));
  box-shadow:0 4px 12px -3px rgba(13,159,113,.55);
}
.v2x.atd.sbd .sbd-act.is-copied .sbd-act-d{ color:var(--sbd-ok-2); }
body.theme-dark .v2x.atd.sbd .sbd-act.is-copied .sbd-act-d{ color:var(--sbd-ok); }
@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd .sbd-act:hover{ background:var(--tone-bg,#EAF2FD); }
  .v2x.atd.sbd .sbd-act:hover .sbd-act-ic{
    transform:scale(1.08) rotate(-4deg);
    box-shadow:0 7px 18px -4px rgba(var(--tone-rgb,76,141,242),.70);
  }
  .v2x.atd.sbd .sbd-act:hover .sbd-act-go{
    color:var(--tone-ink,#1B5BB5); transform:translate(2px,-2px);
  }
  /* Straight down for the copy row: it does not navigate anywhere. */
  .v2x.atd.sbd .sbd-act-btn:hover .sbd-act-go{ transform:scale(1.12); }
}
/* Keyboard gets the same answer as the pointer — deliberately outside the
   hover query, because a keyboard on a touch screen is a real combination. */
.v2x.atd.sbd .sbd-act:focus-visible{ background:var(--tone-bg,#EAF2FD); }
.v2x.atd.sbd .sbd-act:focus-visible .sbd-act-go{ color:var(--tone-ink,#1B5BB5); }
@media (prefers-reduced-motion:reduce){
  .v2x.atd.sbd .sbd-act,.v2x.atd.sbd .sbd-act-ic,.v2x.atd.sbd .sbd-act-go{ transition:none; }
  .v2x.atd.sbd .sbd-act:hover .sbd-act-ic{ transform:none; }
  .v2x.atd.sbd .sbd-act:hover .sbd-act-go{ transform:none; }
  .v2x.atd.sbd .sbd-act-btn:hover .sbd-act-go{ transform:none; }
}
/* The card's orbit ring steps back while a row inside it owns the pointer —
   the same call the shared kit makes for `.atd-flink`, which this markup
   replaced. Without `:has()` the ring simply stays lit: a degradation. */
@media (hover:hover) and (pointer:fine){
  .v2x.atd.sbd .atd-sidebar > .v2-card:has(.sbd-act:hover)::before{ opacity:.3; }
}

/* ══════════════════════════════════════════════════════════════════════════
   §SBD-RESP) The responsive ramp.

   The hero, the section rail, the sidebar stack and the card gutters all come
   from atd-styles and are already ramped there — this block only steps the
   things this page ADDS. Breakpoints match the shared kit exactly (1199.98 /
   991.98 / 767.98 / 575.98 / 399.98) so nothing reflows at a width the rest of
   the page does not.
   ══════════════════════════════════════════════════════════════════════════ */
@media (max-width:1199.98px){
  .v2x.atd.sbd .sbd-ring{ width:156px; height:156px; }
  .v2x.atd.sbd .sbd-ring-v{ font-size:2.25rem; }
  .v2x.atd.sbd .sbd-tiles{ grid-template-columns:repeat(auto-fill,minmax(172px,1fr)); }
}

@media (max-width:991.98px){
  /* The hero has stacked by now, so the panel is full width and the ring can
     go back up — it is the first thing on the second row and carrying it small
     there wastes the width it just gained. */
  .v2x.atd.sbd .sbd-ring{ width:168px; height:168px; }
  .v2x.atd.sbd .sbd-pfacts{ grid-template-columns:repeat(3,minmax(0,1fr)); }
  .v2x.atd.sbd .sbd-ban{ padding:22px; }
  .v2x.atd.sbd .sbd-ban-h{ font-size:1.32rem; }

  /* The sidebar has dropped under the main column, so the help rows get the
     full shell width and can afford a taller touch target. */
  .v2x.atd.sbd .sbd-act{ padding:13px 12px; }
}

@media (max-width:767.98px){
  .v2x.atd.sbd .sbd-pfacts{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  /* The banner's right-hand figure moves under the copy rather than being
     squeezed against it; `text-align:end` on a full-width block would leave it
     stranded at the far edge with nothing beside it. */
  .v2x.atd.sbd .sbd-ban-side{ text-align:start; flex-basis:100%; }
  .v2x.atd.sbd .sbd-ban-in{ gap:16px; }
  .v2x.atd.sbd .sbd-ban-ic{ width:50px; height:50px; border-radius:14px; font-size:1.2rem; }

  /* The service row's meta drops to its own line: at 480-767px the name, the
     uptime figure and the pill on one row leave the name ~90px. */
  .v2x.atd.sbd .sbd-row{ flex-wrap:wrap; row-gap:10px; }
  .v2x.atd.sbd .sbd-row-main{ flex:1 1 calc(100% - 49px); }
  .v2x.atd.sbd .sbd-row-side{ flex:1 1 100%; justify-content:flex-start; padding-inline-start:49px; }
  .v2x.atd.sbd .sbd-row.is-child{ margin-inline-start:16px; }

  /* ⚠️ 90 BARS AT THE DESKTOP FLOOR DO NOT FIT A PHONE, AND THEY DO NOT
     SCROLL — `html{overflow-x:clip}` is sitewide, so anything past the card is
     simply gone, and what goes is the RIGHT-hand end: the most recent days,
     which are the only ones anybody looks at. Desktop floors are 3px + 2px gap
     = 448px for 90 days; the usable strip inside a card on a 360px phone is
     ~286px. Each step below is measured to fit the narrowest viewport it
     serves (768px: 313px · 576px: 224px · 360px: 179px). */
  .v2x.atd.sbd .sbd-bars{ height:28px; gap:1.5px; }
  .v2x.atd.sbd .sbd-bar{ min-width:2px; }
  .v2x.atd.sbd .sbd-tiles{ grid-template-columns:repeat(auto-fill,minmax(158px,1fr)); gap:12px; }
  .v2x.atd.sbd .sbd-tile-v{ font-size:1.55rem; }
  .v2x.atd.sbd .sbd-regs{ grid-template-columns:repeat(auto-fill,minmax(158px,1fr)); }

  /* Board header — the shared `.v2-section-title` ramp, restated because
     `.sbd-shead-t` owns this heading outright (see §SBD-SHEAD). */
  .v2x.atd.sbd .sbd-shead{ gap:13px; padding:15px 16px; }
  .v2x.atd.sbd .sbd-shead-t{ font-size:1.34rem; }
  .v2x.atd.sbd .sbd-shead-ic{ width:40px; height:40px; border-radius:13px; font-size:.95rem; }
  /* The tally and the fold control move under the title rather than being
     squeezed beside it — `margin-inline-start:auto` on a wrapped flex line
     would push them to the far edge with nothing to align against. */
  .v2x.atd.sbd .sbd-shead-side{ margin-inline-start:0; flex-basis:100%; }

  .v2x.atd.sbd .sbd-read-tile{ padding:14px 15px; gap:12px; }
  .v2x.atd.sbd .sbd-read-v{ font-size:1.65rem; }
  .v2x.atd.sbd .sbd-read-ic{ width:38px; height:38px; border-radius:12px; }

  /* The stamp and the jumps each take a full line: side by side they leave
     the four pills ~180px and the last one wraps under its own row. */
  .v2x.atd.sbd .sbd-foot{ justify-content:flex-start; }
  .v2x.atd.sbd .sbd-foot-live{ flex-basis:100%; }
  .v2x.atd.sbd .sbd-foot-links{ width:100%; }
}

@media (max-width:575.98px){
  .v2x.atd.sbd .sbd-ring{ width:150px; height:150px; margin-bottom:16px; }
  .v2x.atd.sbd .sbd-ring-v{ font-size:2.15rem; }
  .v2x.atd.sbd .sbd-panel{ padding:18px 16px; border-radius:14px; }
  .v2x.atd.sbd .sbd-pfacts{ gap:9px; }

  .v2x.atd.sbd .sbd-ban{ padding:18px 16px; border-radius:15px; }
  .v2x.atd.sbd .sbd-ban-h{ font-size:1.2rem; }
  .v2x.atd.sbd .sbd-ban-s{ font-size:.9rem; }
  .v2x.atd.sbd .sbd-ban-big{ font-size:1.5rem; }

  .v2x.atd.sbd .sbd-ghead{ padding:14px 15px; gap:12px; }
  .v2x.atd.sbd .sbd-ghead-ic{ width:38px; height:38px; border-radius:12px; font-size:.9rem; }
  .v2x.atd.sbd .sbd-ghead-n{ font-size:.96rem; }
  /* The group blurb is the first thing to go: at 360px it costs two lines and
     the services under it say the same thing. */
  .v2x.atd.sbd .sbd-ghead-d{ display:none; }
  .v2x.atd.sbd .sbd-gbody{ padding:0 8px 10px; }
  .v2x.atd.sbd .sbd-row{ padding:11px 10px; gap:11px; }
  .v2x.atd.sbd .sbd-row-ic{ width:32px; height:32px; border-radius:10px; font-size:.8rem; }
  .v2x.atd.sbd .sbd-row-main{ flex-basis:calc(100% - 43px); }
  .v2x.atd.sbd .sbd-row-side{ padding-inline-start:43px; gap:10px; }

  .v2x.atd.sbd .sbd-bars-wrap{ padding:2px 10px 10px; }
  .v2x.atd.sbd .sbd-bars{ height:24px; gap:1px; }
  .v2x.atd.sbd .sbd-bar{ min-width:1.5px; border-radius:2px; }
  /* Below this width the tooltip is wider than the card. Tapping a bar on a
     touch device never fires :hover anyway, so the strip becomes a pure
     at-a-glance graphic and `title` on the wrapper carries the detail. */
  .v2x.atd.sbd .sbd-bar::after{ display:none; }

  .v2x.atd.sbd .sbd-tiles{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .v2x.atd.sbd .sbd-tile{ padding:14px 13px; border-radius:14px; }
  .v2x.atd.sbd .sbd-tile-k{ font-size:.68rem; gap:7px; }
  .v2x.atd.sbd .sbd-tile-v{ font-size:1.42rem; }
  .v2x.atd.sbd .sbd-regs{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .v2x.atd.sbd .sbd-reg{ padding:12px; gap:11px; }

  .v2x.atd.sbd .sbd-foot{ padding:13px 14px; border-radius:16px; }
  .v2x.atd.sbd .sbd-foot-links{ width:100%; gap:7px; }
  .v2x.atd.sbd .sbd-flink{ font-size:.78rem; padding:5px 12px 5px 5px; }
  .v2x.atd.sbd .sbd-flink .ic{ width:24px; height:24px; font-size:.66rem; }

  .v2x.atd.sbd .sbd-band > .v2-card{ border-radius:16px; }
  .v2x.atd.sbd .sbd-band > .v2-card .v2-section-title > i:first-child,
  .v2x.atd.sbd .sbd-band > .v2-card .v2-section-title > svg:first-child{ width:32px; height:32px; border-radius:9px; }
  .v2x.atd.sbd .sbd-band > .v2-card .v2-section-title > svg:first-child{ padding:7px; }

  .v2x.atd.sbd .sbd-shead{ padding:14px 15px; border-radius:16px; }
  .v2x.atd.sbd .sbd-shead-t{ font-size:1.22rem; }
  .v2x.atd.sbd .sbd-shead-s{ font-size:.85rem; }
  .v2x.atd.sbd .sbd-shead-ic{ width:38px; height:38px; border-radius:12px; font-size:.9rem; }

  .v2x.atd.sbd .sbd-read-foot{ padding:13px 14px; gap:13px; }
  .v2x.atd.sbd .sbd-read-v{ font-size:1.55rem; }
  /* The spark is the first thing to go: it is decorative, and at this width
     it costs the sentence beside it a line. */
  .v2x.atd.sbd .sbd-read-spark{ display:none; }

  .v2x.atd.sbd .sbd-act{ padding:12px 12px; gap:11px; }
  .v2x.atd.sbd .sbd-act-ic{ width:32px; height:32px; border-radius:10px; font-size:.78rem; }
}

@media (max-width:399.98px){
  /* One column, not two 140px cards with a wrapped label in each. */
  .v2x.atd.sbd .sbd-tiles,
  .v2x.atd.sbd .sbd-regs,
  .v2x.atd.sbd .sbd-pfacts{ grid-template-columns:1fr; }
  .v2x.atd.sbd .sbd-bar{ min-width:1px; }
  .v2x.atd.sbd .sbd-ring{ width:136px; height:136px; }
  .v2x.atd.sbd .sbd-ring-v{ font-size:1.95rem; }

  .v2x.atd.sbd .sbd-shead-t{ font-size:1.13rem; }
  .v2x.atd.sbd .sbd-shead-side{ gap:7px; }
  .v2x.atd.sbd .sbd-read-tiles{ grid-template-columns:1fr; }
  .v2x.atd.sbd .sbd-read-v{ font-size:1.45rem; }
  /* Label over value, so neither the stamp nor the tally competes for a
     width that is not there. */
  .v2x.atd.sbd .sbd-flink{ font-size:.75rem; }
  .v2x.atd.sbd .sbd-act-go{ display:none; }
}
