/* lastping.dev components. Loaded on every page after tokens.css; it uses
   the tokens there and carries no colour of its own (no raw hex, rgb, hsl
   or named colour). It is the only component sheet: there is no other
   stylesheet underneath it.

   TWO SCOPES.
   1. The reset, nav, menus, drawer, footer, skip link and the theme
      utilities are NOT scoped; they set every property they rely on.
   2. Everything else is scoped under body.v2.

   LAYOUT CONTRACT for page bodies:
     <section class="lp-section [lp-section--panel]">
       <div class="lp-wrap"> <div class="lp-section-head"><h2/><p class="lede"/></div> COMPONENT </div>
     </section>
   .hero and .cta-band are sections themselves (they carry their own
   padding) and hold an .lp-wrap.

   CONTRAST RULES (measured):
   - Body and secondary text is --fg or --fg-muted, never --fg-subtle.
     --fg-subtle is held to --bg in the console and falls under 4.5:1 on
     --bg-panel in light, so it is used here only for non-text marks
     (breadcrumb separators).
   - --border and --border-strong are hairlines (decoration). A boundary that
     is the only sign of a control uses --border-control.

   MOTION: transitions and keyframes live only in the
   prefers-reduced-motion: no-preference block at the end. No scroll reveal.
   One exception: the home hero's heartbeat board (.hb) runs by default and
   its own reduce block stops it on a still frame. */

/* Reset (unscoped) */

*, *::before, *::after { box-sizing: border-box; }
html { scroll-behavior: smooth; }
img, svg { display: block; max-width: 100%; }
/* break-word, not anywhere: anywhere collapses a chip's min-content width
   inside flex and grid and splits a token mid-word with room to spare. */
code { overflow-wrap: break-word; }

/* Brand motion: the line writes LP, a beat runs along it, the last ping
   lights and sends one ring. It plays once on load on marks generated with
   `animate` (.lp-anim; the home nav), only without reduced motion (the
   keyframes are in the motion block at the end); otherwise the still mark. */
.lp-anim .lp-line { stroke-dasharray: 1; stroke-dashoffset: 0; }
.lp-anim .lp-beat { stroke-dasharray: .12 1; stroke-dashoffset: 1.12; opacity: 0; }

/* Shared container and utilities (unscoped) */

.lp-wrap {
  width: min(1200px, 100% - 48px);
  margin-inline: auto;
}
@media (max-width: 479px) {
  .lp-wrap { width: calc(100% - 32px); }
}

/* Show one of a pair (a light and a dark screenshot, the toggle's two
   icons) by the active theme. Use on img, picture, span or svg. */
.lp-dark-only { display: none !important; }
[data-theme="dark"] .lp-light-only { display: none !important; }
[data-theme="dark"] .lp-dark-only { display: revert !important; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme]) .lp-light-only { display: none !important; }
  :root:not([data-theme]) .lp-dark-only { display: revert !important; }
}

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

.lp-skip {
  position: absolute;
  left: 16px;
  top: -100px;
  z-index: 100;
  padding: 13px 16px;
  border-radius: 8px;
  background: var(--accent);
  color: var(--accent-fg);
  font: 600 15px/1.2 var(--font-sans);
  text-decoration: none;
}
.lp-skip:focus { top: 12px; }

/* One focus ring for every interactive element in the shared chrome. */
.lp-skip:focus-visible,
.lp-nav :focus-visible,
.lp-drawer :focus-visible,
.lp-footer :focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
}

/* Nav (unscoped) */
/* <header class="lp-nav">
     <div class="lp-wrap lp-nav-bar">
       <a class="lp-nav-brand" href="/">mark + <span class="lp-word">LastPing</span></a>
       <nav class="lp-nav-links" aria-label="Main">
         <div class="lp-nav-item">
           <button class="lp-nav-trigger" aria-expanded="false" aria-controls="lp-menu-product">Product <svg class="lp-nav-chevron"/></button>
           <div class="lp-menu" id="lp-menu-product" hidden>…</div>
         </div>
         <a class="lp-nav-link" href="/agents/">Agents</a>
       </nav>
       <div class="lp-nav-actions">
         <button class="lp-theme-toggle">…</button>
         <span class="lp-nav-auth" data-auth="signed-out">
           <a class="lp-nav-signin" href="…/auth/login">Sign in</a> <a class="lp-nav-cta" href="…/auth/login?mode=signup">Start free</a>
         </span>
         (signed in, nav.js hides the span and inserts here:
          <a class="lp-nav-cta" data-auth="signed-in" href="https://app.lastping.dev/app">Open console</a>)
         <button class="lp-nav-burger" aria-expanded="false" aria-controls="lp-drawer">…</button>
       </div>
     </div>
     <div class="lp-drawer" id="lp-drawer" hidden>…</div>
   </header>
   The drawer may sit inside the header: the frosted backdrop is drawn on
   .lp-nav::before, not on .lp-nav itself, because backdrop-filter on an
   element makes it the containing block for position: fixed descendants and
   the drawer would then be laid out inside the 56 px bar. */

.lp-nav {
  position: sticky;
  top: 0;
  z-index: 50;
  border-bottom: 1px solid var(--border);
  color: var(--fg);
  font-family: var(--font-sans);
  font-size: 14px;
  line-height: 1.4;
}
.lp-nav::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: var(--bg);
  background: color-mix(in srgb, var(--bg) 90%, transparent);
  -webkit-backdrop-filter: blur(12px) saturate(1.3);
  backdrop-filter: blur(12px) saturate(1.3);
  pointer-events: none;
}
.lp-nav-bar {
  display: flex;
  align-items: center;
  gap: 8px;
  height: 56px;
}
.lp-nav-brand {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  margin-right: 20px;
  color: var(--fg);
  text-decoration: none;
  flex-shrink: 0;
}
.lp-nav-brand:hover { text-decoration: none; }
.lp-nav .lp-word,
.lp-footer .lp-word,
.lp-drawer .lp-word {
  font-family: var(--font-sans);
  font-size: 16px;
  font-weight: 600;
  letter-spacing: -0.02em;
  line-height: 1;
  color: var(--fg);
}

.lp-nav-links {
  display: flex;
  align-items: center;
  gap: 2px;
  min-width: 0;
}
.lp-nav-item { position: static; }

.lp-nav-link,
.lp-nav-trigger,
.lp-nav-signin {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-height: 36px;
  padding: 0 10px;
  margin: 0;
  border: 0;
  border-radius: 8px;
  background: transparent;
  color: var(--fg-muted);
  font: 500 14px/1 var(--font-sans);
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
}
.lp-nav-link:hover,
.lp-nav-trigger:hover,
.lp-nav-signin:hover {
  color: var(--fg);
  background: var(--bg-panel);
  text-decoration: none;
}
.lp-nav-link[aria-current="page"],
.lp-nav-trigger[aria-expanded="true"] {
  color: var(--fg);
}
.lp-nav-trigger[aria-expanded="true"] { background: var(--bg-panel); }
.lp-nav-link[aria-current="page"] {
  text-decoration: underline;
  text-decoration-color: var(--accent);
  text-decoration-thickness: 2px;
  text-underline-offset: 7px;
}
.lp-nav-chevron {
  display: inline-block;
  width: 12px;
  height: 12px;
  flex-shrink: 0;
}
.lp-nav-trigger[aria-expanded="true"] .lp-nav-chevron { transform: rotate(180deg); }

.lp-nav-actions {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-left: auto;
}
.lp-nav-auth {
  display: inline-flex;
  align-items: center;
  gap: 8px;
}
.lp-nav-auth[hidden] { display: none !important; }
/* nav.js hides a signed-out group and inserts a signed-in one beside it. */
[data-auth][hidden] { display: none !important; }
.lp-nav-cta {
  display: inline-flex;
  flex-shrink: 0;
  align-items: center;
  justify-content: center;
  min-height: 36px;
  padding: 0 14px;
  border: 1px solid var(--accent);
  border-radius: 8px;
  background: var(--accent);
  color: var(--accent-fg);
  font: 600 14px/1 var(--font-sans);
  text-decoration: none;
  white-space: nowrap;
}
.lp-nav-cta:hover {
  background: color-mix(in srgb, var(--accent) 86%, var(--fg));
  color: var(--accent-fg);
  text-decoration: none;
}

.lp-theme-toggle,
.lp-nav-burger {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  padding: 0;
  margin: 0;
  border: 1px solid var(--border-control);
  border-radius: 8px;
  background: transparent;
  color: var(--fg);
  cursor: pointer;
}
.lp-theme-toggle:hover,
.lp-nav-burger:hover { background: var(--bg-panel); }
.lp-theme-toggle svg,
.lp-nav-burger svg { display: block; width: 17px; height: 17px; }
.lp-nav-burger { display: none; width: 44px; height: 44px; }

/* Menus (unscoped) */
/* Closed with the hidden attribute (nav.js toggles it); the
   !important below makes hidden win over every display set here. */
.lp-menu[hidden],
.lp-drawer[hidden] { display: none !important; }

.lp-menu {
  position: absolute;
  left: 0;
  right: 0;
  top: 100%;
  display: block;
  padding: 24px 0 28px;
  background: var(--bg);
  border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
  box-shadow: var(--shadow-overlay);
  color: var(--fg);
  font-family: var(--font-sans);
}
.lp-menu-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 24px 32px;
}
.lp-menu--wide .lp-menu-grid { grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); }
.lp-menu-head {
  margin: 0 0 8px;
  font: 600 13px/1.3 var(--font-sans);
  letter-spacing: 0;
  color: var(--fg-muted);
}
.lp-menu-link {
  display: block;
  margin: 0 -10px;
  padding: 8px 10px;
  border-radius: 8px;
  color: var(--fg);
  text-decoration: none;
}
.lp-menu-link:hover { background: var(--bg-panel); text-decoration: none; }
.lp-menu-title {
  display: block;
  font: 500 14px/1.35 var(--font-sans);
  color: var(--fg);
}
.lp-menu-desc {
  display: block;
  margin-top: 2px;
  font: 400 13px/1.4 var(--font-sans);
  color: var(--fg-muted);
}
.lp-menu-list {
  list-style: none;
  margin: 0;
  padding: 0;
}
.lp-menu-list a {
  display: block;
  padding: 5px 0;
  color: var(--fg);
  font: 400 14px/1.4 var(--font-sans);
  text-decoration: none;
}
.lp-menu-list a:hover { color: var(--accent); text-decoration: underline; text-underline-offset: 3px; }
.lp-menu-feature {
  padding: 18px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg-panel);
}
.lp-menu-feature .lp-menu-link:hover { background: var(--bg-raised); }
.lp-menu-foot {
  display: flex;
  flex-wrap: wrap;
  gap: 8px 24px;
  margin-top: 20px;
  padding-top: 16px;
  border-top: 1px solid var(--border);
  font: 500 14px/1.4 var(--font-sans);
}
.lp-menu-foot a { color: var(--accent); text-decoration: none; }
.lp-menu-foot a:hover { text-decoration: underline; text-underline-offset: 3px; }

/* Drawer (unscoped, phones and small tablets) */
.lp-drawer {
  position: fixed;
  inset: 57px 0 0 0;
  z-index: 49;
  display: block;
  overflow-y: auto;
  overscroll-behavior: contain;
  padding: 8px 24px 40px;
  background: var(--bg);
  color: var(--fg);
  font-family: var(--font-sans);
}
html.lp-drawer-open { overflow: hidden; }
.lp-drawer-section {
  padding: 12px 0;
  border-bottom: 1px solid var(--border);
}
.lp-drawer-title {
  margin: 8px 0 4px;
  font: 600 13px/1.3 var(--font-sans);
  color: var(--fg-muted);
}
.lp-drawer-link {
  display: flex;
  align-items: center;
  min-height: 44px;
  color: var(--fg);
  font: 500 16px/1.3 var(--font-sans);
  text-decoration: none;
}
.lp-drawer-link:hover { color: var(--accent); text-decoration: none; }
.lp-drawer-link[aria-current="page"] { color: var(--accent); }
.lp-drawer-actions {
  display: grid;
  gap: 12px;
  margin-top: 24px;
}
.lp-drawer-actions .lp-nav-cta,
.lp-drawer-actions .lp-nav-signin {
  justify-content: center;
  min-height: 46px;
  font-size: 15px;
}
.lp-drawer-actions .lp-nav-signin { border: 1px solid var(--border-control); color: var(--fg); }
/* Top of the drawer: its own close button, in thumb reach, inside the focus
   trap (the burger above it sits outside the dialog). */
.lp-drawer-head {
  position: sticky;
  top: -8px;
  z-index: 1;
  background: var(--bg);
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 4px 0 8px;
  border-bottom: 1px solid var(--border);
}
.lp-drawer-head .lp-drawer-title { margin: 0; }
.lp-drawer-close {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  padding: 0;
  margin: 0;
  border: 1px solid var(--border-control);
  border-radius: 8px;
  background: transparent;
  color: var(--fg);
  cursor: pointer;
}
.lp-drawer-close:hover { background: var(--bg-panel); }
.lp-drawer-close svg { display: block; width: 18px; height: 18px; }
/* The 42 guides fold into one disclosure per group. */
.lp-drawer-group > summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  min-height: 44px;
  color: var(--fg);
  font: 500 16px/1.3 var(--font-sans);
  list-style: none;
  cursor: pointer;
}
.lp-drawer-group > summary::-webkit-details-marker { display: none; }
.lp-drawer-group > summary::after {
  content: "";
  width: 8px;
  height: 8px;
  margin-right: 6px;
  border-right: 2px solid var(--fg-muted);
  border-bottom: 2px solid var(--fg-muted);
  transform: rotate(45deg);
}
.lp-drawer-group[open] > summary::after { transform: rotate(-135deg); }
.lp-drawer-group .lp-drawer-link { padding-left: 16px; font-size: 15px; }

@media (max-width: 959px) {
  .lp-nav-links,
  .lp-nav-actions .lp-nav-signin { display: none; }
  .lp-nav-burger { display: inline-flex; }
  .lp-menu { display: none !important; }
  /* Touch: every control in the bar is a 44 px target. */
  .lp-nav-brand { min-height: 44px; }
  .lp-nav-cta { min-height: 44px; }
  .lp-theme-toggle { width: 44px; height: 44px; }
}
@media (min-width: 960px) {
  .lp-drawer { display: none !important; }
}
/* Phones: the bar holds brand, toggle, one CTA and the burger. The CTA is
   either "Start free" (inside .lp-nav-auth) or nav.js's "Open console" (a
   direct child of .lp-nav-actions), so these are descendant selectors that
   reach both. Tightened so the longer "Open console" still fits at 360 px (325 of 328 px, measured); below 360 the CTA goes;
   the drawer repeats the CTA, so hiding it on the narrowest screens loses
   nothing. */
@media (max-width: 479px) {
  .lp-nav-brand { margin-right: 8px; }
  .lp-nav-actions { gap: 6px; }
  .lp-nav-actions .lp-nav-cta { padding: 0 12px; font-size: 14px; }
}
@media (max-width: 359px) {
  .lp-nav-actions .lp-nav-cta { display: none; }
}

/* Footer (unscoped) */
.lp-footer {
  padding: 48px 0 28px;
  background: var(--bg-panel);
  border-top: 1px solid var(--border);
  color: var(--fg-muted);
  font: 400 14px/1.55 var(--font-sans);
}
.lp-footer-grid {
  display: grid;
  grid-template-columns: 1.4fr repeat(4, minmax(0, 1fr));
  gap: 32px;
}
.lp-footer-brand p {
  max-width: 30ch;
  margin: 12px 0 0;
  color: var(--fg-muted);
  font-size: 14px;
}
.lp-footer-brand a { color: var(--fg); text-decoration: none; }
.lp-footer-head {
  margin: 0 0 10px;
  font: 600 13px/1.3 var(--font-sans);
  letter-spacing: 0;
  color: var(--fg);
}
.lp-footer ul {
  list-style: none;
  margin: 0;
  padding: 0;
}
.lp-footer li { margin: 0; }
.lp-footer-col a {
  display: inline-block;
  padding: 3px 0;
  color: var(--fg-muted);
  font-size: 14px;
  text-decoration: none;
}
.lp-footer-col a:hover,
.lp-footer-bottom a:hover {
  color: var(--fg);
  text-decoration: underline;
  text-underline-offset: 3px;
}
.lp-footer-status {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin-top: 14px;
  color: var(--fg);
  font-size: 13px;
  text-decoration: none;
}
.lp-footer-status:hover { text-decoration: underline; text-underline-offset: 3px; }
.lp-status-dot {
  display: inline-block;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--up);
  flex-shrink: 0;
}
.lp-footer-bottom {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 12px 24px;
  margin-top: 36px;
  padding-top: 20px;
  border-top: 1px solid var(--border);
  font-size: 13px;
  color: var(--fg-muted);
}
.lp-footer-bottom a { color: var(--fg-muted); text-decoration: none; }
.lp-footer-bottom ul { display: flex; flex-wrap: wrap; gap: 4px 20px; }

@media (max-width: 899px) {
  .lp-footer-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .lp-footer-brand { grid-column: 1 / -1; }
}
@media (max-width: 479px) {
  .lp-footer { padding-top: 40px; }
  .lp-footer-col a,
  .lp-footer-bottom a,
  .lp-footer-status,
  .lp-footer-brand .lp-nav-brand {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
    padding: 0;
  }
}

/* body.v2 base */
/* Element rules sit under :where(body.v2), which adds no specificity: they
   tie with the reset's element rules (and win, loading later) while ANY
   class rule, the unscoped nav and footer classes included, out-ranks them.
   Written as body.v2 a, the base link colour beat .lp-nav-cta and turned
   the button's label accent-on-accent. */

body.v2 {
  margin: 0;
  background: var(--bg);
  color: var(--fg);
  font-family: var(--font-sans);
  font-size: 16px;
  font-weight: 400;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
}
:where(body.v2) :focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
}
:where(body.v2) ::selection { background: color-mix(in srgb, var(--accent) 28%, var(--bg)); color: var(--fg); }
:where(body.v2) [id] { scroll-margin-top: 76px; }

:where(body.v2) h1, :where(body.v2) h2, :where(body.v2) h3, :where(body.v2) h4 {
  margin: 0;
  font-family: var(--font-sans);
  font-weight: 600;
  letter-spacing: -0.02em;
  color: var(--fg);
  text-wrap: balance;
}
:where(body.v2) h1 { font-size: clamp(28px, 3vw, 38px); line-height: 1.12; }
:where(body.v2) h2 { font-size: clamp(22px, 2.2vw, 28px); line-height: 1.2; }
:where(body.v2) h3 { font-size: 18px; line-height: 1.3; letter-spacing: -0.01em; }
:where(body.v2) h4 { font-size: 16px; line-height: 1.4; letter-spacing: 0; }
:where(body.v2) p { margin: 0; }
:where(body.v2) p + p { margin-top: 1em; }

:where(body.v2) a {
  color: var(--accent);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
}
:where(body.v2) a:hover { text-decoration-thickness: 2px; }

:where(body.v2) img, :where(body.v2) video { display: block; max-width: 100%; height: auto; }
:where(body.v2) hr { height: 0; margin: 36px 0; border: 0; border-top: 1px solid var(--border); }
:where(body.v2) strong, :where(body.v2) b { font-weight: 600; }

:where(body.v2) code, :where(body.v2) kbd, :where(body.v2) samp {
  font-family: var(--font-mono);
  font-size: 0.875em;
}
:where(body.v2) :not(pre) > code {
  padding: 0.12em 0.36em;
  border: 1px solid var(--border);
  border-radius: 5px;
  background: var(--bg-panel);
  color: var(--fg);
  overflow-wrap: anywhere;
}
:where(body.v2) pre {
  margin: 0;
  padding: 14px 16px;
  overflow-x: auto;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg-panel);
  color: var(--fg);
  font: 400 13px/1.65 var(--font-mono);
  tab-size: 2;
}
:where(body.v2) pre code { padding: 0; border: 0; background: none; font-size: inherit; }

/* Sections */

body.v2 .lp-section { padding-block: 48px; }
body.v2 .lp-section + .lp-section { border-top: 1px solid var(--border); }
body.v2 .lp-section--panel { background: var(--bg-panel); border-block: 1px solid var(--border); }
body.v2 .lp-section--panel + .lp-section { border-top: 0; }
body.v2 .lp-section-head { max-width: 56rem; margin-bottom: 22px; }
body.v2 .lp-section-head h2 + .lede { margin-top: 8px; }
body.v2 .lede {
  max-width: 72ch;
  color: var(--fg-muted);
  font-size: 17px;
  line-height: 1.55;
}
body.v2 .muted { color: var(--fg-muted); }

@media (max-width: 719px) {
  body.v2 .lp-section { padding-block: 32px; }
  body.v2 .lp-section-head { margin-bottom: 16px; }
  body.v2 .lede { font-size: 16px; }
}

/* Buttons */

body.v2 .btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  min-height: 40px;
  min-width: 40px;
  padding: 0 18px;
  border: 1px solid transparent;
  border-radius: 8px;
  background: transparent;
  color: var(--fg);
  font: 600 15px/1 var(--font-sans);
  letter-spacing: 0;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  box-shadow: none;
  transform: none;
  transition: none;
}
body.v2 .btn:hover { text-decoration: none; transform: none; box-shadow: none; }
body.v2 .btn-primary {
  background: var(--accent);
  border-color: var(--accent);
  color: var(--accent-fg);
}
body.v2 .btn-primary:hover {
  background: color-mix(in srgb, var(--accent) 86%, var(--fg));
  border-color: color-mix(in srgb, var(--accent) 86%, var(--fg));
  color: var(--accent-fg);
}
/* The ghost button's edge is --border-control, not --border-strong: the
   edge is what says "button" beside a filled primary, and --border-strong
   measures 1.62 on --bg (1.64 dark), under the 3:1 non-text floor;
   --border-control is 3.87 (3.93 dark) on --bg, 3.54 (3.63) on --bg-panel. */
body.v2 .btn-ghost {
  background: transparent;
  border-color: var(--border-control);
  color: var(--fg);
}
body.v2 .btn-ghost:hover {
  background: var(--bg-panel);
  border-color: var(--fg-muted);
  color: var(--fg);
}
body.v2 .btn svg { width: 17px; height: 17px; flex-shrink: 0; }
/* Phones keep the 44 px tap target and 16 px text. */
@media (max-width: 719px) {
  body.v2 .btn { min-height: 44px; min-width: 44px; font-size: 16px; }
}

/* Hero */
/* <section class="hero"><div class="lp-wrap">
     <div class="hero-text"> <p class="hero-pill"/> <h1/> <p class="hero-lede"/>
       <div class="hero-actions"> .btn.btn-primary .btn.btn-ghost </div> <p class="hero-note"/> </div>
     <div class="hero-media"> <figure class="shot">…</figure> </div>
   </div></section> */

body.v2 .hero {
  display: block;
  position: relative;
  z-index: auto;
  max-width: none;
  margin: 0;
  padding: 36px 0 0;
  grid-template-columns: none;
}
body.v2 .hero::before,
body.v2 .hero::after { content: none; }
body.v2 .hero-text { max-width: 48rem; }
body.v2 .hero-pill {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin: 0 0 16px;
  padding: 4px 11px;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: var(--bg-panel);
  color: var(--fg);
  font: 500 13px/1.3 var(--font-sans);
}
body.v2 .hero h1 {
  max-width: 20ch;
  font-size: clamp(30px, 3.6vw, 46px);
  line-height: 1.08;
  letter-spacing: -0.02em;
}
body.v2 .hero-lede {
  max-width: 40rem;
  margin-top: 14px;
  color: var(--fg-muted);
  font-size: 17px;
  line-height: 1.6;
}
body.v2 .hero-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 22px;
}
body.v2 .hero-note {
  margin-top: 14px;
  color: var(--fg-muted);
  font-size: 14px;
}
/* Set-up box: two numbered rows in one panel (install command with Copy, then
   the ask). Used in the heroes and in the /agents and /mcp connect sections. */
body.v2 .hero-setup { max-width: 36rem; margin: 20px 0 24px; }
body.v2 .hero-setup-label { margin: 0 0 8px; color: var(--fg-muted); font-size: 14px; }
/* Works with: one compact wrapping row of chips under the set-up box (home hero). */
body.v2 .hero-works { max-width: 36rem; margin: -8px 0 20px; }
body.v2 .hero-works .hero-setup-label { margin-bottom: 4px; }
body.v2 .hero-works-list { display: flex; flex-wrap: wrap; gap: 6px; margin: 0; padding: 0; list-style: none; }
body.v2 .hero-works-list a {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 3px 8px;
  border: 1px solid var(--border); border-radius: var(--radius);
  background: var(--bg-panel); color: var(--fg-muted);
  font-size: 13px; line-height: 1.4; text-decoration: none;
}
body.v2 .hero-works-list a:hover { color: var(--fg); }
body.v2 .hero-works-list svg { flex: none; }
body.v2 .hero-setup-steps {
  max-width: 36rem;
  margin: 8px 0 14px;
  padding: 4px 0;
  list-style: none;
  counter-reset: setup-step;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg-panel);
  color: var(--fg);
  font: 400 13px/1.65 var(--font-mono);
}
body.v2 .hero-setup .hero-setup-steps { margin: 0; }
body.v2 .hero-setup-steps > li {
  display: flex;
  align-items: center;
  gap: 12px;
  min-width: 0;
  padding: 10px 16px;
  counter-increment: setup-step;
}
body.v2 .hero-setup-steps > li + li { border-top: 1px solid var(--border); }
body.v2 .hero-setup-steps > li::before {
  content: counter(setup-step);
  flex: none;
  color: var(--fg-muted);
}
body.v2 .hero-setup-steps > li > pre,
body.v2 .hero-setup-steps > li > .lp-code > pre {
  flex: 1;
  min-width: 0;
  margin: 0;
  padding: 0;
  overflow-x: auto;
  border: 0;
  border-radius: 0;
  background: none;
}
body.v2 .hero-setup-steps .lp-code {
  display: flex;
  align-items: center;
  flex: 1;
  min-width: 0;
  margin: -10px -12px -10px 0;
}
body.v2 .hero-setup-steps .lp-copy { position: static; flex: none; order: 2; margin-left: 8px; border-radius: var(--radius); }
body.v2 .hero-media { margin-top: 32px; }

@media (max-width: 719px) {
  body.v2 .hero { padding: 24px 0 0; }
  body.v2 .hero-lede { font-size: 16px; }
  body.v2 .hero-actions .btn { flex: 1 1 auto; }
  body.v2 .hero-media { margin-top: 24px; }
  /* Core pages' hero notes carry content (an MCP URL, a key caveat). */
  body.v2 .core .hero-note { font-size: 16px; }
}

/* Screenshot frame */

body.v2 .shot {
  margin: 0;
  overflow: hidden;
  border: 1px solid var(--border);
  border-radius: 12px;
  background: var(--bg-panel);
  box-shadow: var(--shadow-overlay);
}
[data-theme="dark"] body.v2 .shot { box-shadow: none; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme]) body.v2 .shot { box-shadow: none; }
}
body.v2 .shot img,
body.v2 .shot picture { display: block; width: 100%; height: auto; }
body.v2 .shot figcaption {
  padding: 8px 14px;
  border-top: 1px solid var(--border);
  color: var(--fg-muted);
  font-size: 13px;
}

/* Proof strip */
/* <div class="proof"> <a class="proof-live" href="https://status…"><span class="lp-status-dot is-neutral"></span>…</a>
     <ul class="proof-facts"><li class="proof-fact"><strong>50</strong> MCP tools</li>…</ul> </div>
   Only real figures: a fact here is a count the site can source.
   The marker before the status link is neutral and still: a static page
   cannot know the live state, so it never shows green or pulses. */

body.v2 .proof {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 14px 28px;
  padding: 16px 20px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg-panel);
}
body.v2 .proof-live {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  color: var(--fg);
  font-weight: 500;
  font-size: 16px;
  text-decoration: none;
}
body.v2 .proof-live .lp-status-dot.is-neutral { background: var(--fg-muted); }
body.v2 .proof-live:hover { text-decoration: underline; text-underline-offset: 3px; }
body.v2 .proof-facts {
  display: flex;
  flex-wrap: wrap;
  gap: 8px 0;
  margin: 0 0 0 auto;
  padding: 0;
  list-style: none;
}
body.v2 .proof-fact {
  padding: 0 18px;
  border-left: 1px solid var(--border-strong);
  color: var(--fg-muted);
  font-size: 16px;
}
body.v2 .proof-fact:first-child { padding-left: 0; border-left: 0; }
body.v2 .proof-fact strong { color: var(--fg); font-weight: 600; }

@media (max-width: 719px) {
  body.v2 .proof { padding: 16px; }
  body.v2 .proof-facts { gap: 6px 20px; margin-left: 0; }
  body.v2 .proof-fact { padding: 0; border-left: 0; }
}

/* Tiles */
/* <div class="tiles"> <a class="tile" href="/monitor/cron/"> <span class="tile-icon">svg</span> <h3/> <p/> </a> … </div> */

body.v2 .tiles {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 16px;
}
body.v2 .tile {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 20px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
  color: var(--fg);
  text-decoration: none;
}
body.v2 a.tile:hover { border-color: var(--border-control); background: var(--bg-panel); }
body.v2 .tile h3 { font-size: 17px; }
body.v2 .tile h2 { font-size: 20px; letter-spacing: -0.01em; }
body.v2 .tile-more { margin-top: auto; color: var(--accent); font-weight: 500; }
body.v2 .tile p { color: var(--fg-muted); font-size: 16px; line-height: 1.55; }
body.v2 .tile-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  margin-bottom: 4px;
  border-radius: 8px;
  background: color-mix(in srgb, var(--accent) 12%, var(--bg));
  color: var(--accent);
}
body.v2 .tile-icon svg { width: 20px; height: 20px; }

@media (max-width: 1023px) {
  body.v2 .tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 559px) {
  body.v2 .tiles { grid-template-columns: minmax(0, 1fr); }
  body.v2 .tile { padding: 18px; }
}

/* Feature rows */
/* <div class="feature [feature--flip]"> <div class="feature-copy"><h2/><p/><ul class="feature-points"/></div>
     <div class="feature-media"> .shot or .code-tabs </div> </div> */

body.v2 .feature {
  display: grid;
  grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
  align-items: center;
  gap: 40px;
}
body.v2 .feature + .feature { margin-top: 48px; }
body.v2 .feature--flip .feature-copy { order: 2; }
body.v2 .feature-copy h2,
body.v2 .feature-copy h3 { margin-bottom: 10px; }
body.v2 .feature-copy p { color: var(--fg-muted); }
body.v2 .feature-copy .btn { margin-top: 22px; }
body.v2 .feature-points {
  display: grid;
  gap: 10px;
  margin: 20px 0 0;
  padding: 0;
  list-style: none;
}
body.v2 .feature-points li {
  position: relative;
  padding-left: 26px;
  color: var(--fg);
  font-size: 16px;
}
body.v2 .feature-points li::before {
  content: "";
  position: absolute;
  left: 2px;
  top: 0.62em;
  width: 10px;
  height: 6px;
  border-left: 2px solid var(--accent);
  border-bottom: 2px solid var(--accent);
  transform: translateY(-50%) rotate(-45deg);
}
body.v2 .feature-media { min-width: 0; }

@media (max-width: 899px) {
  body.v2 .feature { grid-template-columns: minmax(0, 1fr); gap: 24px; }
  body.v2 .feature--flip .feature-copy { order: 0; }
  body.v2 .feature + .feature { margin-top: 32px; }
}

/* Code tabs */
/* <div class="code-tabs"> <div class="code-tabs-list" role="tablist">
     <button class="code-tab" role="tab" aria-selected="true" aria-controls="p1">curl</button>…</div>
     <div class="code-tabs-panel" id="p1" role="tabpanel"><pre><code>…</code></pre></div>
     <div class="code-tabs-panel" id="p2" role="tabpanel" hidden>…</div> </div> */

body.v2 .code-tabs {
  overflow: hidden;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg-panel);
}
body.v2 .code-tabs-list {
  display: flex;
  gap: 4px;
  overflow-x: auto;
  padding: 0 8px;
  border-bottom: 1px solid var(--border);
  background: var(--bg);
  scrollbar-width: thin;
}
body.v2 .code-tab {
  position: relative;
  min-height: 40px;
  padding: 0 12px;
  border: 0;
  background: transparent;
  color: var(--fg-muted);
  font: 500 13.5px/1 var(--font-sans);
  white-space: nowrap;
  cursor: pointer;
}
body.v2 .code-tab:hover { color: var(--fg); }
body.v2 .code-tab[aria-selected="true"] { color: var(--fg); }
body.v2 .code-tab[aria-selected="true"]::after {
  content: "";
  position: absolute;
  left: 12px;
  right: 12px;
  bottom: -1px;
  height: 2px;
  border-radius: 2px;
  background: var(--accent);
}
body.v2 .code-tab:focus-visible { outline-offset: -2px; }
@media (max-width: 719px) {
  body.v2 .code-tab { min-height: 44px; }
}
body.v2 .code-tabs-panel[hidden],
body.v2 .code-tabs-list[hidden] { display: none; }
/* Without script every panel shows, stacked. */
body.v2 .code-tabs-panel + .code-tabs-panel { border-top: 1px solid var(--border); }
/* The panel, not the pre, scrolls: one keyboard stop per panel. */
body.v2 .code-tabs-panel { overflow-x: auto; }
body.v2 .code-tabs-panel:focus-visible { outline-offset: -2px; }
/* Copy button (nav.js adds it; no script, no button). */
body.v2 .lp-code, body.v2 .code-tabs { position: relative; }
body.v2 .lp-code { min-width: 0; }
body.v2 .lp-copy { position: absolute; top: 0; right: 0; min-height: 44px; padding: 0 14px; border: 1px solid var(--border-control); border-radius: 0 var(--radius); background: var(--bg); color: var(--fg-muted); font: 500 14px/1 var(--font-sans); cursor: pointer; }
body.v2 .lp-copy:hover { color: var(--fg); }
body.v2 .lp-copy:focus-visible { outline-offset: -2px; }
body.v2 .code-tabs .lp-copy { border-width: 0 0 0 1px; border-radius: 0; }
body.v2 .lp-has-copy > .code-tabs-list { padding-right: 88px; }
/* The button sits in a strip at the top of the pre, above the first line:
   it never covers code, however the pre scrolls. */
body.v2 .lp-code.lp-has-copy > pre { padding-top: 52px; }
body.v2 .code-tabs-panel pre {
  overflow: visible;
  width: max-content;
  min-width: 100%;
  box-sizing: border-box;
  border: 0;
  border-radius: 0;
  background: transparent;
}

/* Integrations wall */
/* <div class="wall"> <div class="wall-group"><h3/><ul><li><a class="wall-link"/></li>…</ul></div>… </div> */

body.v2 .wall {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 32px 24px;
}
body.v2 .wall-group h3 {
  margin-bottom: 10px;
  color: var(--fg-muted);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0;
}
body.v2 .wall-group ul {
  display: grid;
  gap: 2px;
  margin: 0;
  padding: 0;
  list-style: none;
}
body.v2 .wall-link {
  display: flex;
  align-items: center;
  gap: 10px;
  min-height: 40px;
  margin: 0 -10px;
  padding: 6px 10px;
  border-radius: 8px;
  color: var(--fg);
  font-size: 15.5px;
  text-decoration: none;
}
body.v2 .wall-link:hover { background: var(--bg-panel); color: var(--fg); text-decoration: none; }
body.v2 .lp-section--panel .wall-link:hover { background: var(--bg-raised); }
body.v2 .wall-link img,
body.v2 .wall-link svg { width: 20px; height: 20px; flex-shrink: 0; }

/* Compare */
/* <div class="compare"><table>…</table></div>; cells may carry
   .compare-yes / .compare-no / .compare-part next to their words. */

body.v2 .compare {
  overflow-x: auto;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
}
body.v2 .compare table {
  width: 100%;
  min-width: 560px;
  border-collapse: collapse;
  font-size: 15px;
}
body.v2 .compare th,
body.v2 .compare td {
  padding: 11px 16px;
  border-bottom: 1px solid var(--border);
  text-align: left;
  vertical-align: top;
}
body.v2 .compare tr:last-child > * { border-bottom: 0; }
body.v2 .compare code { overflow-wrap: normal; }
body.v2 .compare thead th {
  background: var(--bg-panel);
  color: var(--fg-muted);
  font-size: 13px;
  font-weight: 600;
}
body.v2 .compare tbody th { color: var(--fg); font-weight: 500; }
body.v2 .compare td { color: var(--fg-muted); }
body.v2 .compare .compare-yes { color: var(--fg); font-weight: 500; }
body.v2 .compare .compare-no { color: var(--fg-muted); }
body.v2 .compare .compare-part { color: var(--fg-muted); font-style: italic; }
/* Under 640px a .compare-stack row is a card; each cell shows its
   data-label. Roles in the HTML keep the table semantics. */
@media (max-width: 640px) {
  body.v2 .compare-stack table { min-width: 0; }
  body.v2 .compare-stack thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
  body.v2 .compare-stack tr, body.v2 .compare-stack tbody > tr > * { display: block; }
  body.v2 .compare-stack tbody tr { padding: 14px 16px; }
  body.v2 .compare-stack tr + tr { border-top: 1px solid var(--border); }
  body.v2 .compare-stack tbody > tr > * { padding: 0; border: 0; }
  body.v2 .compare-stack tbody > tr > * + * { margin-top: 8px; }
  body.v2 .compare-stack td::before { content: attr(data-label) ": "; content: attr(data-label) ": " / ""; color: var(--fg); font-weight: 600; }
}
body.v2 .compare-links {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 12px;
  margin: 24px 0 0;
  padding: 0;
  list-style: none;
}
body.v2 .compare-links a {
  display: block;
  padding: 12px 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  color: var(--fg);
  font-weight: 500;
  text-decoration: none;
}
body.v2 .compare-links a:hover { border-color: var(--border-control); background: var(--bg-panel); }

/* FAQ */
/* <div class="faq"> <details><summary>Question</summary><div class="faq-a"><p/></div></details>… </div> */

body.v2 .faq { max-width: 52rem; border-top: 1px solid var(--border); }
body.v2 .faq details { border-bottom: 1px solid var(--border); }
body.v2 .faq summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  min-height: 44px;
  padding: 14px 0;
  color: var(--fg);
  font-size: 16px;
  font-weight: 600;
  line-height: 1.4;
  letter-spacing: -0.01em;
  list-style: none;
  cursor: pointer;
}
body.v2 .faq summary::-webkit-details-marker { display: none; }
body.v2 .faq summary::after {
  content: "";
  flex-shrink: 0;
  width: 10px;
  height: 10px;
  margin-right: 4px;
  border-right: 2px solid var(--fg-muted);
  border-bottom: 2px solid var(--fg-muted);
  transform: translateY(-3px) rotate(45deg);
}
body.v2 .faq details[open] > summary::after { transform: translateY(2px) rotate(225deg); }
body.v2 .faq summary:hover { color: var(--accent); }
body.v2 .faq-a,
body.v2 .faq details > p {
  max-width: 68ch;
  padding: 0 0 16px;
  color: var(--fg-muted);
  font-size: 16px;
}

/* CTA band */
/* <section class="cta-band"><div class="lp-wrap"><h2/><p/><div class="cta-band-actions">…</div></div></section> */

body.v2 .cta-band {
  padding: 48px 0;
  background: var(--bg-panel);
  border-top: 1px solid var(--border);
  border-bottom: 0;
  text-align: center;
}
body.v2 .cta-band h2 {
  max-width: 24ch;
  margin: 0 auto;
  font-family: var(--font-sans);
  font-size: clamp(22px, 2.2vw, 28px);
  font-weight: 600;
  letter-spacing: -0.02em;
  line-height: 1.15;
  color: var(--fg);
}
body.v2 .cta-band p {
  max-width: 40rem;
  margin: 16px auto 0;
  color: var(--fg-muted);
  font-size: 16px;
  line-height: 1.6;
}
body.v2 .cta-band-actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 12px;
  margin-top: 32px;
}
@media (max-width: 719px) {
  body.v2 .cta-band { padding: 32px 0; }
  body.v2 .cta-band-actions .btn { flex: 1 1 auto; }
}

/* Guide layout */
/* <div class="lp-wrap guide">
     <nav class="guide-toc" aria-label="On this page"><p class="guide-toc-title"/><ol><li><a/></li></ol></nav>
     <article class="guide-body"> .crumbs h1 … </article>
     <aside class="guide-aside"> <div class="guide-card">…</div> </aside> </div> */

body.v2 .guide {
  display: grid;
  grid-template-columns: 200px minmax(0, 1fr) 260px;
  align-items: start;
  gap: 40px;
  padding-block: 24px 48px;
}
/* Blog posts: the article and the aside, no rail. Legal pages: the rail
   and the article, no aside. Both articles take the freed width. */
body.v2 .guide--article { grid-template-columns: minmax(0, 1fr) 260px; }
body.v2 .guide--legal { grid-template-columns: 200px minmax(0, 1fr); }
body.v2 :is(.guide--article, .guide--legal) .guide-body { max-width: 820px; }
body.v2 .guide-toc,
body.v2 .guide-aside {
  position: sticky;
  top: 88px;
  max-height: calc(100vh - 112px);
  overflow-y: auto;
}
body.v2 .guide-toc-title {
  margin: 0 0 10px;
  color: var(--fg);
  font-size: 13px;
  font-weight: 600;
}
body.v2 .guide-toc ol,
body.v2 .guide-toc ul {
  margin: 0;
  padding: 0;
  list-style: none;
  border-left: 1px solid var(--border);
}
body.v2 .guide-toc a {
  display: block;
  margin-left: -1px;
  padding: 6px 0 6px 14px;
  border-left: 2px solid transparent;
  color: var(--fg-muted);
  font-size: 13.5px;
  line-height: 1.4;
  text-decoration: none;
}
body.v2 .guide-toc a:hover { color: var(--fg); }

body.v2 .guide-body {
  max-width: 76ch;
  font-size: 16px;
  line-height: 1.6;
}
body.v2 .guide-body h1 { font-size: clamp(26px, 2.8vw, 34px); line-height: 1.15; }
body.v2 .guide-body h1 + p { margin-top: 14px; color: var(--fg-muted); font-size: 17px; line-height: 1.55; }
body.v2 .guide-body h2 { margin: 32px 0 10px; font-size: clamp(20px, 2vw, 24px); line-height: 1.25; }
body.v2 .guide-body h3 { margin: 26px 0 8px; font-size: 17px; }
body.v2 .guide-body p,
body.v2 .guide-body ul,
body.v2 .guide-body ol { margin: 0 0 16px; }
body.v2 .guide-body p + p { margin-top: 0; }
body.v2 .guide-body ul,
body.v2 .guide-body ol { padding-left: 1.4em; }
body.v2 .guide-body li { margin: 6px 0; }
body.v2 .guide-body li::marker { color: var(--fg-muted); }
body.v2 .guide-body blockquote { margin: 0 0 16px; padding: 12px 16px; border-left: 3px solid var(--accent); border-radius: 0 8px 8px 0; background: var(--bg-panel); }
body.v2 .guide-body blockquote p:last-child { margin-bottom: 0; }
body.v2 .guide-body pre,
body.v2 .guide-body .code-tabs,
body.v2 .guide-body .callout,
body.v2 .guide-body .shot,
body.v2 .guide-body .video,
body.v2 .guide-body .compare { margin: 24px 0; }
body.v2 .guide-body table { width: 100%; border-collapse: collapse; margin: 24px 0; font-size: 14px; }
body.v2 .guide-body th,
body.v2 .guide-body td { padding: 10px 12px; border-bottom: 1px solid var(--border); text-align: left; vertical-align: top; }
body.v2 .guide-body th { color: var(--fg-muted); font-weight: 600; }

body.v2 .guide-aside { display: grid; gap: 16px; }
body.v2 .guide-card {
  padding: 18px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg-panel);
  font-size: 14px;
}
body.v2 .guide-card h2,
body.v2 .guide-card h3 { margin: 0 0 6px; font-size: 15px; letter-spacing: -0.01em; }
body.v2 .guide-card p { color: var(--fg-muted); }
body.v2 .guide-card .btn { width: 100%; margin-top: 16px; }
body.v2 .guide-card ul { margin: 0; padding: 0; list-style: none; }
body.v2 .guide-card li a { display: block; padding: 5px 0; text-decoration: none; }
body.v2 .guide-card li a:hover { text-decoration: underline; }

/* Guides and explainers */
body.v2 .guide-head .hero-pill { margin-bottom: 12px; font-size: 13px; }
body.v2 .guide-head .lede { margin-top: 12px; font-size: 16px; }
body.v2 .guide-body .hero-actions { margin-top: 20px; }
body.v2 .guide-lede { color: var(--fg-muted); }
body.v2 .post-meta { margin-top: 16px; color: var(--fg-muted); font-size: 16px; }
body.v2 .post-meta > div { display: inline; }
body.v2 .post-meta > div + div::before,
body.v2 .post-meta div > * + *::before { content: "·"; margin-right: 5px; }
body.v2 .g-steps, body.v2 .g-stack { display: grid; gap: 20px; margin: 20px 0; }
body.v2 .g-step { display: grid; grid-template-columns: 32px minmax(0, 1fr); gap: 16px; }
body.v2 .g-step-num { display: grid; place-items: center; height: 32px; border: 1px solid var(--border-control); border-radius: 50%; color: var(--accent); font: 600 12px/1 var(--font-mono); }
body.v2 .guide-body .g-step h3 { margin: 3px 0 6px; font-size: 17px; }
body.v2 .guide-body .g-checks, body.v2 .guide-body .g-diag, body.v2 .guide-body .faq { padding: 0; list-style: none; }
body.v2 .guide-body .g-checks li { display: flex; gap: 12px; margin: 0; padding: 10px 0; border-bottom: 1px solid var(--border); }
body.v2 .g-mark { color: var(--up); }
body.v2 .guide-body .faq li { margin: 0; }
body.v2 .guide-body .faq summary { padding: 10px 0; font-size: 16px; }
body.v2 .g-kicker { display: block; color: var(--accent); font: 500 13px/1.4 var(--font-mono); }
body.v2 .guide-body .tiles { margin: 20px 0; }
body.v2 .guide-body .tile { gap: 6px; padding: 20px; }
body.v2 .guide-body .tile h3, body.v2 .guide-body .tile h4 { margin: 0; font-size: 17px; }
body.v2 .tile--featured { border-color: color-mix(in srgb, var(--accent) 50%, var(--border)); }
body.v2 .g-panel { margin: 20px 0; padding: 20px 24px; border: 1px solid var(--border); border-radius: var(--radius); background: var(--bg-panel); }
body.v2 .g-tool-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 10px; }
body.v2 .g-tool-name { font-size: 17px; font-weight: 600; }
body.v2 .g-tag { padding: 1px 8px; border: 1px solid var(--border); border-radius: 999px; color: var(--fg-muted); font-size: 13px; }
body.v2 .guide-body .g-diag-item { margin: 0; padding: 16px 0; border-bottom: 1px solid var(--border); }
body.v2 .guide-body .g-diag-head h3 { margin: 4px 0 6px; }
body.v2 .g-note { color: var(--fg-muted); font-size: 14px; }
body.v2 .callout--warn { border-color: color-mix(in srgb, var(--down) 45%, var(--border)); background: color-mix(in srgb, var(--down) 8%, var(--bg)); }
body.v2 .guide-body pre .dim { color: var(--fg-muted); }
body.v2 .guide-body .compare table { margin: 0; }
body.v2 .guide-end { margin-top: 32px; padding: 22px; border: 1px solid var(--border); border-radius: var(--radius); background: var(--bg-panel); }
body.v2 .guide-end h2 { margin: 12px 0 8px; }
body.v2 .wall--cards { grid-template-columns: repeat(3, minmax(0, 1fr)); margin-top: 32px; }
body.v2 .tile--wide { grid-column: span 2; }
body.v2 .wall--cards .wall-link { min-height: 44px; margin: 0; font-size: 16px; border: 1px solid var(--border); }
body.v2 .hub-snip { color: var(--fg-muted); font-size: 13px; overflow-wrap: anywhere; }
@media (max-width: 719px) {
  body.v2 .crumbs a, body.v2 .guide-card li a { display: inline-flex; align-items: center; min-height: 44px; }
  body.v2 .g-step { grid-template-columns: minmax(0, 1fr); gap: 8px; }
  body.v2 .g-step-num { width: 32px; }
  body.v2 .guide-body table, body.v2 .g-note, body.v2 .guide-card { font-size: 16px; }
  body.v2 .guide-end { padding: 20px; }
  body.v2 .wall--cards { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 559px) {
  body.v2 .wall--cards { grid-template-columns: minmax(0, 1fr); }
  body.v2 .tile--wide { grid-column: auto; }
}

/* Below 1100 px one column: the rail becomes the "On this page" disclosure,
   the aside stacks under the article without its start card. */
body.v2 .guide-toc-m { display: none; margin-top: 24px; border: 1px solid var(--border); border-radius: var(--radius); background: var(--bg-panel); }
body.v2 .guide-toc-m summary { display: flex; align-items: center; justify-content: space-between; min-height: 44px; padding: 0 16px; font-weight: 600; cursor: pointer; }
body.v2 .guide-toc-m summary::-webkit-details-marker { display: none; }
body.v2 .guide-toc-m summary::after { content: ""; width: 8px; height: 8px; border-right: 2px solid var(--fg-muted); border-bottom: 2px solid var(--fg-muted); transform: rotate(45deg); }
body.v2 .guide-toc-m[open] summary::after { transform: rotate(225deg); }
body.v2 .guide-body .guide-toc-m ol { margin: 0; padding: 0 16px 8px; list-style: none; }
body.v2 .guide-body .guide-toc-m li { margin: 0; }
body.v2 .guide-toc-m a { display: flex; align-items: center; min-height: 44px; text-decoration: none; }
@media (max-width: 1099px) {
  body.v2 .guide { grid-template-columns: minmax(0, 1fr); gap: 28px; padding-block: 20px 40px; }
  body.v2 .guide-toc, body.v2 .guide-card--start { display: none; }
  body.v2 .guide-toc-m { display: block; }
  body.v2 .guide-aside { position: static; max-height: none; overflow: visible; }
}

/* Breadcrumbs */
/* <nav class="crumbs" aria-label="Breadcrumb"><ol><li><a/></li>…<li aria-current="page">Here</li></ol></nav> */

body.v2 .crumbs { margin-bottom: 14px; font-size: 13px; }
body.v2 .crumbs ol {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 4px 0;
  margin: 0;
  padding: 0;
  list-style: none;
}
body.v2 .crumbs li { display: inline-flex; align-items: center; color: var(--fg-muted); }
body.v2 .crumbs li + li::before {
  content: "";
  width: 6px;
  height: 6px;
  margin: 0 10px 0 8px;
  border-top: 1.5px solid var(--fg-subtle);
  border-right: 1.5px solid var(--fg-subtle);
  transform: rotate(45deg);
}
body.v2 .crumbs a { color: var(--fg-muted); text-decoration: none; }
body.v2 .crumbs a:hover { color: var(--fg); text-decoration: underline; }
body.v2 .crumbs [aria-current="page"] { color: var(--fg); }

/* Callout */
/* <div class="callout [callout--note]"><p class="callout-title"/><p/></div> */

body.v2 .callout {
  padding: 16px 20px;
  border: 1px solid color-mix(in srgb, var(--accent) 35%, var(--border));
  border-radius: var(--radius);
  background: color-mix(in srgb, var(--accent) 7%, var(--bg));
  color: var(--fg);
  font-size: 16px;
  line-height: 1.6;
}
body.v2 .callout--note {
  border-color: var(--border);
  background: var(--bg-panel);
}
body.v2 .callout-title { margin: 0 0 4px; font-weight: 600; }
body.v2 .callout > :last-child { margin-bottom: 0; }

/* Video */
/* <figure class="video"><div class="video-frame"><iframe|video/></div><figcaption/></figure> */

body.v2 .video { margin: 0; }
body.v2 .video-frame {
  position: relative;
  overflow: hidden;
  aspect-ratio: 16 / 9;
  border: 1px solid var(--border);
  border-radius: 12px;
  background: var(--bg-panel);
}
body.v2 .video-frame iframe,
body.v2 .video-frame video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
  object-fit: cover;
}
body.v2 .video figcaption { margin-top: 8px; color: var(--fg-muted); font-size: 13px; }

/* Home: heartbeat board behind the hero */
/* <section class="hero hero--home"><div class="lp-wrap"><div class="hero-text">
     <div class="hero-head"> <p class="hero-pill"/> <h1/>
     <div class="hb" aria-hidden="true">
       <div class="hb-row [hb-row--fail]">
         <span class="hb-tag">[<span class="hb-badge">late</span>] label</span>
         <span class="hb-line"><span class="hb-beat"><svg class="hb-strip"/></span>[<span class="hb-flat"></span>]</span>
         <span class="hb-dot"></span>[<span class="hb-alarm"></span>]
       </div>…
     </div> </div> lede, actions, note </div>
     <div class="hero-media">…</div> </div></section>
   Decorative. The --fail row flatlines on a loop (beat fades, flat line,
   red dot, "late" badge, recovery). Transform and opacity only, fixed boxes:
   no repaint of the text, no layout shift. Reduced motion stops on the
   flatlined frame (the reduce block below, the one exception to the motion
   rule). Labels are sample names, never figures.
   Always a background, never a row of its own: beside the text on wide
   screens, masked clear of it (.hero--hb-full: the whole text column, else
   .hero-head); behind the pill and headline, fainter, on narrow ones. */

body.v2 .hero--home .hero-text { max-width: none; }
body.v2 .hero--home .hero-head { position: relative; isolation: isolate; }
body.v2 .hero--home .hero-head > :not(.hb) { position: relative; z-index: 1; }
body.v2 .hero--home h1 { max-width: 16ch; }
body.v2 .hero--home .hero-lede { max-width: 34rem; }
@media (max-width: 720px) {
  body.v2 .hero--home .shot img { max-height: 560px; object-fit: cover; object-position: top; }
}
body.v2 .hb {
  position: absolute;
  z-index: 0;
  top: 50%;
  right: 0;
  width: min(760px, 62%);
  height: 320px;
  margin-top: -160px;
  display: grid;
  align-content: center;
  gap: 14px;
  pointer-events: none;
  /* Fully transparent under the text column, so the headline and lede sit
     on plain --bg and keep their measured contrast. */
  -webkit-mask-image: linear-gradient(90deg, transparent 32%, var(--fg) 62%);
  mask-image: linear-gradient(90deg, transparent 32%, var(--fg) 62%);
}
body.v2 .hb-row { position: relative; height: 66px; }
body.v2 .hb-tag {
  position: absolute;
  top: 0;
  right: 26px;
  display: flex;
  align-items: center;
  gap: 8px;
  color: var(--fg-muted);
  font: 400 13px/22px var(--font-mono);
  white-space: nowrap;
}
body.v2 .hb-badge {
  padding: 0 7px;
  border: 1px solid var(--down);
  border-radius: 5px;
  color: var(--down);
  font: 600 12px/18px var(--font-sans);
  opacity: 0;
}
body.v2 .hb-line {
  position: absolute;
  left: 0;
  right: 22px;
  top: 26px;
  height: 40px;
  overflow: hidden;
}
body.v2 .hb-beat, body.v2 .hb-flat { position: absolute; inset: 0; }
body.v2 .hb-strip {
  display: block;
  width: 1950px;
  max-width: none;
  height: 40px;
  fill: none;
  stroke: var(--accent);
  stroke-width: 1.6;
  stroke-linejoin: round;
  stroke-linecap: round;
  opacity: 0.8;
  animation: hb-run var(--hb-d, 2.4s) linear infinite;
}
body.v2 .hb-flat { top: 19px; bottom: auto; height: 1.5px; background: var(--down); opacity: 0; }
body.v2 .hb-dot, body.v2 .hb-alarm {
  position: absolute;
  right: 6px;
  top: 40px;
  width: 12px;
  height: 12px;
  border-radius: 50%;
}
body.v2 .hb-dot { background: var(--accent); opacity: 0.6; }
body.v2 .hb-alarm {
  background: var(--down);
  box-shadow: 0 0 0 5px color-mix(in srgb, var(--down) 22%, transparent);
  opacity: 0;
}
body.v2 .hb-row--fail .hb-beat { animation: hb-beat 9s ease-in-out infinite; }
body.v2 .hb-row--fail .hb-flat,
body.v2 .hb-row--fail .hb-alarm { animation: hb-down 9s ease-in-out infinite; }
body.v2 .hb-row--fail .hb-badge { animation: hb-badge 9s ease-in-out infinite; }
@keyframes hb-run { to { transform: translateX(-150px); } }
@keyframes hb-beat { 0%, 30% { opacity: 1; } 36%, 74% { opacity: 0; } 80%, 100% { opacity: 1; } }
@keyframes hb-down { 0%, 32% { opacity: 0; } 38%, 74% { opacity: 1; } 80%, 100% { opacity: 0; } }
@keyframes hb-badge {
  0%, 38% { opacity: 0; transform: translateY(4px); }
  44%, 74% { opacity: 1; transform: none; }
  80%, 100% { opacity: 0; transform: none; }
}
/* Home at full width: the board spans the whole text column, pill to note. */
@media (min-width: 1200px) {
  body.v2 .hero--hb-full .hero-text { position: relative; isolation: isolate; }
  body.v2 .hero--hb-full .hero-head { position: static; isolation: auto; }
  body.v2 .hero--hb-full .hero-text > :not(.hero-head) { position: relative; z-index: 1; }
  body.v2 .hero--hb-full .hb { top: 0; bottom: 0; height: auto; margin-top: 0; align-content: space-evenly; }
}
@media (max-width: 1199px) {
  /* Narrower than the full layout (or a zoomed desktop): behind the pill
     and headline, three lines, no labels, faint enough that large text on it
     keeps its contrast. The pill has its own opaque background. */
  body.v2 .hb {
    top: 0;
    bottom: 0;
    left: 0;
    width: auto;
    height: auto;
    margin-top: 0;
    align-content: space-evenly;
    gap: 0;
    opacity: 0.35;
    -webkit-mask-image: linear-gradient(90deg, transparent, var(--fg) 40%);
    mask-image: linear-gradient(90deg, transparent, var(--fg) 40%);
  }
  body.v2 .hb-row { height: 40px; }
  body.v2 .hb-row:nth-child(n + 4), body.v2 .hb-tag { display: none; }
  body.v2 .hb-line { top: 0; }
  body.v2 .hb-dot, body.v2 .hb-alarm { top: 14px; }
}
@media (prefers-reduced-motion: reduce) {
  body.v2 .hb * { animation: none !important; }
  body.v2 .hb-row--fail .hb-beat { opacity: 0; }
  body.v2 .hb-row--fail .hb-flat,
  body.v2 .hb-row--fail .hb-alarm,
  body.v2 .hb-row--fail .hb-badge { opacity: 1; }
}

/* Home sections */

body.v2 .home-proof { padding-block: 32px; }
body.v2 .proof-split {
  display: grid;
  grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
  align-items: center;
  gap: 40px;
}
body.v2 .proof-split h2 { margin-bottom: 10px; }
body.v2 .proof-split .proof { margin-top: 20px; }
body.v2 .proof-split .proof-facts { margin-left: 0; }
body.v2 .proof-split .proof-live { min-height: 44px; }
body.v2 .proof-links {
  display: flex;
  flex-wrap: wrap;
  gap: 4px 20px;
  margin: 18px 0 0;
  padding: 0;
  list-style: none;
  font-size: 16px;
}
body.v2 .proof-links a { display: inline-flex; align-items: center; gap: 8px; min-height: 44px; }
body.v2 .proof-shot img { object-fit: cover; object-position: top; max-height: 380px; }

body.v2 .video-split {
  display: grid;
  grid-template-columns: minmax(0, 7fr) minmax(0, 4fr);
  align-items: start;
  gap: 40px;
}
body.v2 .transcript h3 { margin: 18px 0 8px; color: var(--fg-muted); font-size: 14px; font-weight: 600; }
body.v2 .transcript ol { display: grid; gap: 10px; margin: 0; padding: 0; list-style: none; }
body.v2 .transcript li { padding-left: 14px; border-left: 2px solid var(--border-strong); color: var(--fg); font-size: 16px; line-height: 1.5; }

body.v2 .wall--home { grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 24px; }
body.v2 .wall--home .wall-link { min-height: 34px; padding: 4px 10px; font-size: 16px; }
body.v2 .compare-links span { display: block; margin-top: 4px; color: var(--fg-muted); font-size: 16px; font-weight: 400; line-height: 1.45; }

@media (max-width: 1023px) {
  body.v2 .wall--home { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 899px) {
  body.v2 .proof-split, body.v2 .video-split { grid-template-columns: minmax(0, 1fr); gap: 24px; }
  body.v2 .proof-shot img { max-height: 260px; }
}
@media (max-width: 719px) {
  body.v2 .home-proof { padding-block: 28px; }
  /* Phones: each group's links wrap as chips instead of a long column. */
  body.v2 .wall--home { grid-template-columns: minmax(0, 1fr); gap: 20px; }
  body.v2 .wall--home ul { display: flex; flex-wrap: wrap; gap: 8px; }
  body.v2 .wall--home .wall-link { min-height: 44px; margin: 0; padding: 0 12px; border: 1px solid var(--border-control); }
  body.v2 .home-sec .tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
  body.v2 .home-sec .tile { padding: 16px; gap: 6px; }
  body.v2 .home-sec .tile h3 { font-size: 16px; }
  body.v2 .home-sec .tile-icon { width: 34px; height: 34px; margin-bottom: 2px; }
  body.v2 .home-sec .compare-links { gap: 8px; }
  body.v2 .home-sec .compare-links a { padding: 12px 14px; }
}

/* Product and core pages */
/* Tiles in two or three columns; numbered steps (a real sequence); tool
   chips; connect cards; reference details. Same tokens as the home page. */

body.v2 .tiles--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
body.v2 .tiles--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
body.v2 .tile pre { font-size: 13px; padding: 12px 14px; }
body.v2 .tile ul:not(.chips) { display: grid; gap: 6px; margin: 0; padding-left: 1.2em; color: var(--fg-muted); font-size: 16px; }
body.v2 .feature--top { align-items: start; }
body.v2 .hero-facts { margin-top: 22px; }
body.v2 .hero-facts .proof-fact:first-child { padding-left: 0; }
body.v2 .sec-foot { margin-top: 24px; color: var(--fg-muted); font-size: 16px; }
body.v2 .steps { display: grid; gap: 22px; margin: 0; padding: 0; list-style: none; counter-reset: step; }
body.v2 .steps > li { position: relative; min-width: 0; padding-left: 48px; counter-increment: step; }
body.v2 .steps > li::before {
  content: counter(step);
  position: absolute;
  left: 0;
  top: 0;
  display: grid;
  place-items: center;
  width: 32px;
  height: 32px;
  border: 1px solid var(--border-control);
  border-radius: 50%;
  color: var(--accent);
  font: 600 14px/1 var(--font-sans);
}
body.v2 .steps h3 { margin-bottom: 6px; font-size: 17px; }
body.v2 .steps p { color: var(--fg-muted); }
body.v2 .steps pre, body.v2 .steps p + p { margin-top: 12px; }
body.v2 .steps pre + p, body.v2 .steps .lp-code + p { margin-top: 12px; }
body.v2 .chips { display: flex; flex-wrap: wrap; gap: 6px; margin: 0; padding: 0; list-style: none; }
body.v2 .chips code { font-size: 13px; }
body.v2 .toolset { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 16px; }
body.v2 .toolset .tile p { font-size: 16px; }
body.v2 .config-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
body.v2 .config-card {
  display: grid;
  align-content: start;
  gap: 12px;
  min-width: 0;
  padding: 18px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg);
  color: var(--fg-muted);
  font-size: 16px;
}
body.v2 .config-card ol, body.v2 .config-card ul { display: grid; gap: 6px; margin: 0; padding-left: 1.3em; }
body.v2 .config-label { color: var(--fg); font-size: 17px; }
body.v2 .config-card pre { font-size: 13px; padding: 12px 14px; }
body.v2 .ref-item { border-bottom: 1px solid var(--border); }
body.v2 .ref-item:first-of-type { border-top: 1px solid var(--border); }
body.v2 .ref-item > summary { display: flex; align-items: center; min-height: 44px; padding: 10px 0; color: var(--fg); font-weight: 600; cursor: pointer; }
body.v2 .ref-item > summary:hover { color: var(--accent); }
body.v2 .ref-item > div { padding-bottom: 20px; }
body.v2 .ref-item h4 { margin: 20px 0 8px; font-size: 16px; }

@media (max-width: 1023px) {
  body.v2 .tiles--3 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 899px) {
  body.v2 .config-grid { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 719px) {
  body.v2 .steps > li { padding-left: 0; padding-top: 44px; }
  body.v2 .config-card { padding: 16px; }
}
@media (max-width: 719px) {
  /* Phones: a tall console shot is cropped from the top, and short tiles pair up. */
  body.v2 .core .shot img { max-height: 520px; object-fit: cover; object-position: top; }
  body.v2 .core .tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
  body.v2 .core .tile { padding: 16px; gap: 6px; }
  body.v2 .core .tile h3 { font-size: 16px; }
  body.v2 .core .tile-icon { width: 34px; height: 34px; margin-bottom: 2px; }
  body.v2 .core .compare table, body.v2 .core .guide-card { font-size: 16px; }
}
@media (max-width: 559px) {
  body.v2 .tiles--2, body.v2 .tiles--3,
  body.v2 .core .tiles--2, body.v2 .core .tiles--3 { grid-template-columns: minmax(0, 1fr); }
  body.v2 .toolset { grid-template-columns: minmax(0, 1fr); }
}

/* Motion: only for visitors who have not asked for less */

@media (prefers-reduced-motion: no-preference) {
  .lp-nav-link, .lp-nav-trigger, .lp-nav-signin, .lp-nav-cta,
  .lp-theme-toggle, .lp-nav-burger, .lp-menu-link, .lp-menu-list a,
  .lp-drawer-link, .lp-footer-col a {
    transition: color 150ms ease, background-color 150ms ease, border-color 150ms ease;
  }
  .lp-nav-chevron { transition: transform 150ms ease; }
  .lp-anim .lp-line { animation: lp-draw 5s cubic-bezier(.65,0,.35,1) both; }
  .lp-anim .lp-beat { animation: lp-beat 5s cubic-bezier(.45,0,.2,1) both; }
  .lp-anim .lp-dot  { animation: lp-dot 5s ease-out both; transform-box: fill-box; transform-origin: center; }
  .lp-anim .lp-ring { animation: lp-ring 5s ease-out both; transform-box: fill-box; transform-origin: center; }
  @keyframes lp-draw { 0% { stroke-dashoffset: 1; } 40%, 100% { stroke-dashoffset: 0; } }
  @keyframes lp-beat { 0%, 40% { stroke-dashoffset: 1.12; opacity: 0; } 41% { opacity: 1; } 72% { stroke-dashoffset: 0; opacity: 1; } 76%, 100% { opacity: 0; } }
  @keyframes lp-dot  { 0%, 72% { transform: scale(0); } 78% { transform: scale(1.35); } 84%, 100% { transform: scale(1); } }
  @keyframes lp-ring { 0%, 74% { transform: scale(1); opacity: 0; } 76% { opacity: .8; } 96%, 100% { transform: scale(3.2); opacity: 0; } }
  .lp-menu:not([hidden]) { animation: lp-menu-in 160ms ease-out; }
  @keyframes lp-menu-in {
    from { opacity: 0; transform: translateY(-4px); }
    to { opacity: 1; transform: none; }
  }

  body.v2 .btn,
  body.v2 .tile,
  body.v2 .wall-link,
  body.v2 .compare-links a,
  body.v2 .code-tab,
  body.v2 .guide-toc a,
  body.v2 .faq summary {
    transition: color 150ms ease, background-color 150ms ease, border-color 150ms ease;
  }
  body.v2 .faq summary::after { transition: transform 150ms ease; }

}

/* A still frame of the home hero's board, for other pages' heroes: the
   flatlined frame the reduced-motion block shows, with no motion at all. */
body.v2 .hb--still * { animation: none !important; }
/* The 404's list of places to go next. */
body.v2 .nf-links { max-width: 76ch; font-size: 16px; line-height: 1.7; }
body.v2 .nf-links .g-checks { margin: 0 0 16px; padding: 0; list-style: none; }
body.v2 .nf-links .g-checks li { display: flex; gap: 12px; margin: 0; padding: 10px 0; border-bottom: 1px solid var(--border); }
body.v2 .nf-links .sec-foot { margin: 0 0 16px; }
/* The 404's headline is short: the board hangs from its top, not its middle. */
body.v2 .hero--nf .hb { top: 0; margin-top: 0; }
/* With the compact type the 404's hero is shorter than the full board: three
   rows, so the board ends inside the hero. */
@media (min-width: 1200px) {
  body.v2 .hero--nf .hb { height: 230px; gap: 10px; }
  body.v2 .hero--nf .hb-row:nth-child(n + 4) { display: none; }
}
body.v2 .hb--still .hb-row--fail .hb-beat { opacity: 0; }
body.v2 .hb--still .hb-row--fail :is(.hb-flat, .hb-alarm, .hb-badge) { opacity: 1; }
/* Phone: tighter row so the whole install command stays beside Copy. */
@media (max-width: 479px) {
  body.v2 .hero-setup-steps > li { gap: 6px; padding: 10px 8px 10px 10px; }
  body.v2 .hero-setup-steps, body.v2 .hero-setup-steps pre { font-size: 12px; }
  body.v2 .hero-setup-steps .lp-copy { padding: 0 6px; margin-left: 2px; }
  body.v2 .hero-setup-steps .lp-code { margin-right: -4px; }
}
