/* ============================================================================
   Agentimus — admin UI
   Aesthetic: "technical broadsheet". Warm paper, dark ink masthead, editorial
   serif headings + monospace data. Scoped under #agentimus-app so nothing
   leaks into wp-admin. No external fonts (wordpress.org rule); system stacks.
   ========================================================================= */

/* Page-level: make our admin screen full-bleed. This file loads only on the
   Agentimus page, so these wp-admin overrides never touch other screens.
   Below 960px wp-admin's `.auto-fold/.folded #wpcontent` adds a 10px LEFT padding —
   a (0,2,0) selector that out-specifies a bare `#wpcontent`, so it left an uneven gap
   on the left of our full-bleed app. Match that specificity to zero it; leave
   margin-left alone so content still clears the folded admin menu when it's shown. */
#wpcontent,
.auto-fold #wpcontent,
.folded #wpcontent { padding-left: 0; }
.wrap { margin: 0; }

/* WP core gives #wpbody-content a 65px bottom padding. That space lives inside the
   sticky readiness rail's scroll box, so at the page bottom it is *also* exactly how
   far the rail's top tucks under the sticky header — footer gap and rail tuck are one
   dial. 16px keeps the footer off the content while barely clipping the gauge. */
#wpbody-content { padding-bottom: 16px; }

/* A narrower-breakpoint core rule drops the admin footer's side padding to 20px, which
   pulls its text left of our content. Hold it at 34px — the app's content gutter
   (.ar__body's side padding) — so both footer lines land flush with the card edges. */
#wpfooter { padding-left: 34px; padding-right: 34px; color: #a7a7a7; }

/* Design tokens — defined globally rather than only on #agentimus-app. Custom
   properties are inert (they paint nothing until a property references them),
   so this leaks no visuals into wp-admin, but it DOES let UI we Teleport to
   <body> (toasts, the reset modal) read the same tokens. Visual rules below
   stay scoped to .ar-* / #agentimus-app. */
:root {
  /* Type */
  --ar-serif: "Iowan Old Style", "Palatino Linotype", Palatino, "Book Antiqua", Georgia, serif;
  --ar-mono: ui-monospace, "SF Mono", "JetBrains Mono", "Cascadia Code", Menlo, Consolas, monospace;
  --ar-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;

  /* Paper & ink */
  --ar-paper: #f3f0e7;
  --ar-surface: #fffdf7;
  --ar-surface-2: #faf6ec;
  /* Fields (inputs, textareas): in light the near-white surface already reads
     as a well against the cream cards, so the field tone IS the surface. Dark
     re-keys this — see the dark block. */
  --ar-field: var(--ar-surface);
  --ar-ink: #1b1913;
  --ar-ink-soft: #6c675a;
  --ar-ink-faint: #9a937f;
  --ar-line: #e4ddcb;
  --ar-line-strong: #d3cab2;

  /* Signal */
  --ar-accent: #146b64;
  --ar-good: #2f7a4c;
  --ar-warn: #ad7b18;
  --ar-bad: #b93c2b;
  --ar-info: #2f5f9e; /* blue — for informational actions (distinct from teal/green) */
  /* The hover pill behind text buttons. ONE colour for every such button,
     whatever colour its own text is: hover means "your cursor is here", and a
     mark that changed hue per button would read as meaning something. Mixed
     rather than a flat hex so it washes over cream cards and white panels
     alike instead of stamping a rectangle of the wrong white on one of them. */
  --ar-hover: color-mix(in srgb, #8bc34a 22%, transparent);

  /* Signal tints — the wash/tint/deep steps each signal family paints chips,
     card washes and borders with. Values are the hand-picked originals; the
     dark theme redefines the whole scale rather than each site. */
  --ar-good-wash: #eef5f0;
  --ar-good-tint: #bcdcc6;
  --ar-good-bright: #5cc08a;
  --ar-good-strong: #2f9e5e;
  --ar-good-deep: #1d7a45;
  --ar-warn-wash: #f7f1df;
  --ar-warn-tint: #e6d5a8;
  --ar-warn-bright: #f2b23a;
  --ar-warn-mid: #e0b24c;
  --ar-warn-deep: #96690f;
  /* The Worth-knowing card's gold family: ink-strength gold for its text and
     chips, and his pale gold (#ebc98a, 2026-08-11) for the card's STRUCTURE —
     ground, border, glow — where a light tone belongs. Dark overrides below. */
  --ar-note-gold: var(--ar-warn-deep);
  --ar-note-glow: #ebc98a;
  --ar-bad-wash: #f8ebe8;
  --ar-bad-tint: #e6c1b9;
  --ar-bad-mid: #e08a72;
  --ar-bad-strong: #c0392b;
  --ar-bad-deep: #8c2f22;
  --ar-info-wash: #e9eff7;
  --ar-info-tint: #c3d2e6;
  --ar-info-strong: #3a6ea5;
  --ar-info-deep: #2c5680;
  /* Accents tuned for ink-coloured surfaces (the dark score card, code blocks).
     In the dark theme those surfaces invert to cream, so these flip to the
     deep on-light values. */
  --ar-teal-on-ink: #57b6a6;
  --ar-teal-on-ink-hover: #6fc7b8;
  --ar-good-on-ink: #5cc08a;
  --ar-warn-on-ink: #e0b24c;
  --ar-bad-on-ink: #e08a72;
  /* Accent washes (hover/selected fills behind accent-bordered controls). */
  --ar-accent-wash: #f0f6f4;
  --ar-accent-soft: #e3efec;
  /* Text on a signal-coloured fill, and ink pushed past itself (the black a
     hovered ink button deepens to). Both flip with the theme. */
  --ar-on-signal: #fff;
  --ar-ink-hard: #000;
  /* What darkness is made of: scrims and shades mix from this, NOT from ink —
     ink flips to cream in the dark theme, but a scrim must always dim. */
  --ar-shade: #1b1913;
  /* The loading sheen that sweeps a skeleton. Bright over cream; in the dark
     theme it drops to a breath — a 45% white band over a night surface reads
     as a searchlight, not a shimmer. */
  --ar-skel-sheen: rgba(255, 255, 255, 0.45);

  --ar-radius: 4px;
  /* Shared height for the nav bar and the page-head below it, so the two strips
     are always exactly the same height. Change here, both follow. */
  --ar-bar-h: 72px;
  /* WP admin-bar height — the sticky header sits flush below it. 32px on desktop; 46px in
     the responsive-admin band; 0 once the bar stops being fixed (≤600px) and scrolls away. */
  --ar-adminbar: 32px;
}
@media screen and (max-width: 782px) { :root { --ar-adminbar: 46px; } }
@media screen and (max-width: 600px) { :root { --ar-adminbar: 0px; } }

/* ---- Dark theme ----------------------------------------------------------
   The palette inverts rather than restyles: paper becomes warm near-black,
   ink becomes cream, and every ink-coloured surface (the score card, the
   dark buttons, code blocks) flips to cream with dark type — same broadsheet,
   read under a desk lamp. Signals brighten one step for the dark ground; the
   tint scales derive from the signal hues against the dark surface, so they
   stay in key without a second hand-picked set. The switch is the
   data-ar-theme attribute on <html>, set by theme.js (light / dark, with
   "system" resolved there); wp-admin around the app keeps its own colors. */
:root[data-ar-theme="dark"] {
  /* His pick: the cards wear wp-admin's own sidebar charcoal, so the app and
     the admin chrome around it read as one night. Page darker in the same
     hue; raised surfaces one step up. */
  --ar-paper: #161c20;
  --ar-surface: #262d31;
  --ar-surface-2: #303940;
  /* Fields: the surface itself with ONLY its lightness raised — hue and
     saturation untouched, so the base colour genuinely stays the scheme's
     own (his formula, 2026-08-12: "slightly bright from its surface but
     same base color"; white-mixing washed the saturation and read as a
     different colour). +3.5% lightness lands on his hand-picked #2c2b2b
     under Modern. Every dialect re-keys via its own surface. */
  /* Hand-tuned like every other dark token: the surface's own hue and
     saturation, lightness +3.5 points (his formula, 2026-08-12: "slightly
     bright from its surface but same base color"). A LITERAL on purpose —
     deriving it live (color-mix washed the saturation; relative-color
     resolved against the wrong scheme's surface) kept changing the base
     colour. Each scheme dialect sets its own in schemes.css. */
  --ar-field: #2e363b;
  /* Off-white, deliberately shy of white: full-bright serif headings on black
     glare (his call) — and COOL, because the charcoal ground is cool; a warm
     cream here would clash in temperature. */
  --ar-ink: #dde0e2;
  --ar-ink-soft: #a2a8ad;
  /* Raised from #6e757b (owner, 2026-08-11): at 11-12px the faint tier was
     unreadable against the dark surfaces. Still a clear step below soft. */
  --ar-ink-faint: #8a9197;
  --ar-line: #39434a;
  --ar-line-strong: #47525a;

  /* One accent family at night: the brand's own teal, brightened for the
     charcoal — it leads everywhere an action or the chrome speaks (links,
     icon chips, the active tab, the brand ring), sits naturally beside the
     blue-charcoal ground, and keeps dark and light one brand. Green stays
     what it means: a good state. (The violet round was tried and retired —
     it read foreign against the charcoal.) */
  /* Sage green at night (his pick, 2026-08-13: #8ab685 over the lighter
     #95c290 — 4 points darker, so the accent stops weighing exactly what
     secondary ink does, and the whole night reads calmer). Green also says
     what the one-accent law already means here: --ar-good IS the accent.
     Light mode keeps its teal; Coffee keeps the teal at night too (its own
     dialect below), so the green is Fresh/Midnight/Modern's night voice. */
  --ar-accent: #8ab685;
  /* ONE accent at night. Green and the brand teal sat 22 degrees apart with
     the same weight — too close to read as a deliberate pair, too far to read
     as one colour — so "good" IS the accent here, and a verdict is carried by
     the word (PASS), the filled dot, and amber/red for anything needing you.
     A scheme block below that re-keys --ar-accent should re-key these two
     with it: they resolve the accent at :root, not at body. */
  --ar-good: var(--ar-accent);
  --ar-warn: #e0b24c;
  --ar-bad: #e08a72;
  --ar-info: #8ab0e0;
  /* The dark chrome accent: the violet the rail cards, score identity and
     section labels wear at night. Light mode has no equivalent — its chrome
     is the ink itself. */
  /* The chrome IS the good green — the same identity the light theme's score
     card has always worn. Two teal-greens side by side fought; one green
     doesn't. */
  --ar-chrome: var(--ar-accent);
  --ar-chrome-bright: #a0c99c;
  --ar-chrome-line: color-mix(in srgb, #8ab685 24%, var(--ar-line));
  --ar-hover: color-mix(in srgb, #8ab685 16%, transparent);

  --ar-good-wash: color-mix(in srgb, var(--ar-good) 10%, var(--ar-surface));
  --ar-good-tint: color-mix(in srgb, var(--ar-good) 26%, var(--ar-surface));
  --ar-good-strong: #a0c99c;
  --ar-good-deep: #b6d7b2;
  --ar-warn-wash: color-mix(in srgb, var(--ar-warn) 10%, var(--ar-surface));
  --ar-warn-tint: color-mix(in srgb, var(--ar-warn) 26%, var(--ar-surface));
  --ar-warn-deep: #eecd8d;
  /* His pick for the Worth-knowing card at night (2026-08-11): antique gold,
     one hex driving the card's text, chips, dividers, border and glow. */
  --ar-note-gold: #c2a157;
  --ar-note-glow: #c2a157;
  --ar-bad-wash: color-mix(in srgb, var(--ar-bad) 10%, var(--ar-surface));
  --ar-bad-tint: color-mix(in srgb, var(--ar-bad) 26%, var(--ar-surface));
  --ar-bad-strong: #eda28d;
  --ar-bad-deep: #f2b5a3;
  --ar-info-wash: color-mix(in srgb, var(--ar-info) 10%, var(--ar-surface));
  --ar-info-tint: color-mix(in srgb, var(--ar-info) 26%, var(--ar-surface));
  --ar-info-strong: #93b6e2;
  --ar-info-deep: #b3cbeb;
  --ar-accent-wash: color-mix(in srgb, var(--ar-accent) 12%, var(--ar-surface));
  --ar-accent-soft: color-mix(in srgb, var(--ar-accent) 20%, var(--ar-surface));

  /* The state on-ink accents (good/warn/bad) keep their light values: the
     surfaces that wear them stay dark at night. The teal ACTION pair follows
     the violet — same family as every other link. */
  --ar-teal-on-ink: #57b6a6;
  --ar-teal-on-ink-hover: #6fc7b8;

  --ar-on-signal: #14120e;
  --ar-ink-hard: #fff;
  --ar-shade: #000;
  --ar-skel-sheen: rgba(255, 255, 255, 0.05);
}
/* ---- Teleported surfaces re-ink themselves -----------------------------
   Every dialog, drawer and toast is <Teleport to="body">, because a modal
   rendered inside a panel is clipped by its ancestors' overflow. The cost is
   that it also leaves the app wrapper — so it stops inheriting our ink and
   inherits WordPress's instead (#3c434a, set on the admin body).

   In light that grey is close enough to pass unnoticed. In dark it is a
   catastrophe: his Client Decisions dialog rendered #3c434a bot names on a
   #2e2e2e chip — about 1.1:1, invisible. Backgrounds were fine throughout,
   because those are explicit vars; only `color` was left to inheritance, and
   inheritance is exactly what teleporting breaks.

   So each teleported ROOT states its ink. Anything descending from these is
   covered; anything new that teleports must be added here. The rule lives
   outside the dark block on purpose — the inheritance is wrong in both
   themes, and only the consequence differs. */
.ar-modal,
.ar-drawer,
.ar-toasts { color: var(--ar-ink); }

/* Ink-coloured surfaces hold their ground at night: background var(--ar-ink)
   would flip them cream, and a cream slab on a black page is a glare panel.
   Each becomes a quiet dark card instead. */
:root[data-ar-theme="dark"] .ar__mark,
:root[data-ar-theme="dark"] .ar-wiz__welcome-mark--brand {
  background: var(--ar-surface-2); color: var(--ar-ink);
}
:root[data-ar-theme="dark"] .ar-btn {
  background: var(--ar-surface-2); color: var(--ar-ink); border-color: var(--ar-line-strong);
}
:root[data-ar-theme="dark"] .ar-btn:hover:not(:disabled) {
  background: #3a454d; border-color: var(--ar-ink-faint); box-shadow: none;
}
:root[data-ar-theme="dark"] .ar-srcpick__btn.is-on {
  background: var(--ar-accent); color: var(--ar-on-signal);
}
:root[data-ar-theme="dark"] .ar-tags__chip { background: var(--ar-surface-2); color: var(--ar-ink); }
/* The service tray recedes GENTLY at night: full paper made a pit in the
   charcoal card, and the card-coloured fields inside drowned among borders.
   Half-way between paper and surface mirrors light's cream-wash proportion,
   so the fields pop the way the white ones do by day. */
:root[data-ar-theme="dark"] .ar-svc { background: color-mix(in srgb, var(--ar-paper) 45%, var(--ar-surface)); }
/* The nav ladder is faint -> soft -> ink; on the dark grounds the faint rung
   measures ~2.6:1 — below reading. Dark lifts the whole ladder one step:
   soft at rest, ink on hover, active unchanged (already ink). */
:root[data-ar-theme="dark"] .ar__tab { color: var(--ar-ink-soft); }
:root[data-ar-theme="dark"] .ar__tab:hover { color: var(--ar-ink); }


/* (.ar-about-priv__cell--head needs no dark block any more — it stopped being an
   inverted panel and now shares its siblings' ground and ink in both themes.) */
:root[data-ar-theme="dark"] .ar-about-snippet { background: #0d1114; color: var(--ar-ink-soft); }
/* The rail is where the violet chrome lives: card borders, section labels,
   the score identity. Content cards to the left stay neutral. */
:root[data-ar-theme="dark"] .ar-rail-card { border-color: var(--ar-chrome-line); }
:root[data-ar-theme="dark"] .ar-rail-card__label { color: var(--ar-chrome); }
:root[data-ar-theme="dark"] .ar-rail-card.ar-rail-card--readiness {
  background: var(--ar-surface); border-color: var(--ar-chrome-line);
}
/* The tier/rung text outside the readiness card is paper-tinted for the old
   ink ground — paper is near-black now, so those lines re-ink from the grays.
   (The readiness card itself no longer needs this: it names --rail-face.) */
:root[data-ar-theme="dark"] .ar-rail-tier__name { color: var(--ar-ink); }
:root[data-ar-theme="dark"] .ar-rail-tier__sub { color: var(--ar-ink-faint); }
:root[data-ar-theme="dark"] .ar-rung { color: color-mix(in srgb, var(--ar-ink) 55%, transparent); }
/* Those two base re-inks outrank the light theme's state rules by source
   order, so the states re-assert here (values unchanged from light — these
   surfaces are dark in both themes). */
:root[data-ar-theme="dark"] .ar-rung[data-state="current"] { color: var(--ar-warn-on-ink); }
:root[data-ar-theme="dark"] .ar-rung__todo { color: var(--ar-warn-on-ink); }
/* The big score numerals read as ink at night, like the gauge number —
   color belongs to words and marks; a neon number bites. */
:root[data-ar-theme="dark"] .ar-today__score-n { color: var(--ar-ink); }
/* A 0.3-alpha black shadow reads on cream but not on near-black: the stuck
   pagehead deepens to true black and gains a hairline edge (as a shadow
   layer, so nothing shifts by a pixel). */
:root[data-ar-theme="dark"] .ar__sticky.is-stuck {
  box-shadow:
    0 1px 0 var(--ar-line-strong),
    0 8px 18px -12px rgba(0, 0, 0, 0.9),
    0 2px 5px -3px rgba(0, 0, 0, 0.6);
}
:root[data-ar-theme="dark"] .ar-rail-tier[data-state="floor"] .ar-rail-tier__name { color: var(--ar-bad-on-ink); }
:root[data-ar-theme="dark"] .ar-rail-tier[data-state="local"] .ar-rail-tier__name { color: var(--ar-warn-on-ink); }
/* The brand A drew its legs in paper on the ink tile; on the dark tile they
   re-ink light (the gold crossbar needs no help). */
:root[data-ar-theme="dark"] .ar__logo-line { stroke: var(--ar-ink); }
:root[data-ar-theme="dark"] .ar-rail-tier[data-state="top"] .ar-rail-tier__name,
:root[data-ar-theme="dark"] .ar-rung[data-state="done"] { color: var(--ar-chrome); }
/* The app is transparent in light mode (it sits on wp-admin's own gray); in
   dark it must paint its own ground or the admin backdrop shines through. */
:root[data-ar-theme="dark"] #agentimus-app,
:root[data-ar-theme="dark"] #wpbody { background: var(--ar-paper); }
/* Native form controls otherwise keep wp-admin's white: repaint them from the
   tokens, and let color-scheme flip the browser-drawn parts (date-picker
   icons, select arrows, scrollbars). Checkboxes/radios/ranges stay native. */
:root[data-ar-theme="dark"] #agentimus-app,
:root[data-ar-theme="dark"] .ar-modal,
:root[data-ar-theme="dark"] .ar-drawer { color-scheme: dark; }
:root[data-ar-theme="dark"] :is(#agentimus-app, .ar-modal, .ar-drawer)
  :is(input:not([type="checkbox"]):not([type="radio"]):not([type="range"]), textarea, select) {
  /* --ar-field, not --ar-surface: surface-on-surface left every field
     distinguishable only by its border (his catch, 2026-08-12) — fields
     recess into a well near the page tone instead. */
  background-color: var(--ar-field);
  color: var(--ar-ink);
  border-color: var(--ar-line-strong);
}
/* The repaint above outranks the shared focus rule by specificity, so the
   focused border re-asserts here — accent border + accent glow, same as day. */
:root[data-ar-theme="dark"] :is(#agentimus-app, .ar-modal, .ar-drawer)
  :is(input:not([type="checkbox"]):not([type="radio"]):not([type="range"]), textarea, select):focus {
  border-color: var(--ar-accent);
}
/* The same for the LIGHT theme, which never got the twin: a key file, a doc
   link, a "view the file" all fell back to wp-admin's blue underline while the
   dark theme had been painting them in the accent since 1.35 (2026-08-15).
   :where() again — zero specificity, so the rail's own ink, the .ar-go rule and
   every other class-styled link still outrank it. Underline on hover only,
   matching the in-app links; the ↗ is what says this one leaves. */
/* Class-less only. This was written for prose links — an anchor that carries
   a class already has a dress, and repainting it here means every styled link
   in the app has to defend itself against a rule it never asked for (the
   masthead lost that fight).

   The :not() rides INSIDE :where() so it costs nothing: the selector keeps the
   plain `a` weight it has always had, which is exactly what it needs to beat
   wp-admin's own `a { color: #2271b1 }` on source order. Written as
   :where(a:not([class])) the whole thing falls to zero and core wins — a prose
   link goes admin-blue. Measured, not guessed. */
:where(#agentimus-app, .ar-modal, .ar-drawer) a:where(:not([class])) {
  color: var(--ar-accent);
  text-decoration: none;
}
:where(#agentimus-app, .ar-modal, .ar-drawer) a:where(:not([class])):hover,
:where(#agentimus-app, .ar-modal, .ar-drawer) a:where(:not([class])):focus-visible {
  color: color-mix(in srgb, var(--ar-accent) 55%, var(--ar-ink));
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
}

/* Bare anchors — prose links that carry no .ar-* class — otherwise inherit
   wp-admin's link blue, a stranger at night. :where() keeps this at element
   specificity so every class-styled link still outranks it. */
:where(:root[data-ar-theme="dark"] #agentimus-app,
       :root[data-ar-theme="dark"] .ar-modal,
       :root[data-ar-theme="dark"] .ar-drawer) a { color: var(--ar-accent); }
:where(:root[data-ar-theme="dark"] #agentimus-app,
       :root[data-ar-theme="dark"] .ar-modal,
       :root[data-ar-theme="dark"] .ar-drawer) a:hover,
:where(:root[data-ar-theme="dark"] #agentimus-app,
       :root[data-ar-theme="dark"] .ar-modal,
       :root[data-ar-theme="dark"] .ar-drawer) a:focus { color: var(--ar-chrome-bright); }

#agentimus-app {

  /* Full-bleed: wp-admin's content padding is neutralized below, so the app
     fills the admin body edge-to-edge with no left/right gap. Transparent so it
     sits on wp-admin's own background — no floating "document" panel. */
  margin: 0 0 24px;
  container-type: inline-size;
  color: var(--ar-ink);
  font-family: var(--ar-sans);
  font-size: 14px;
  line-height: 1.5;
  background: transparent;
  /* iOS WebKit inflates text inside long-prose blocks ("font boosting") unless told
     not to; the inflated nowrap/mono runs then exceed the phone's viewport and the
     whole page pans sideways. Pin the size — the layout is already responsive. */
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
}
#agentimus-app * { box-sizing: border-box; }
/* Breathing room when a tile or readiness link scrolls a target to the top. */
#agentimus-app [id^="ar-"] { scroll-margin-top: 16px; }
/* overflow-wrap only bites when a token can't fit its line at all, so desktop is
   untouched — but on a phone a long unbroken path (/.well-known/…, agentimus/…) wraps
   instead of widening its row past the viewport. */
#agentimus-app code { font-family: var(--ar-mono); font-size: 0.86em; overflow-wrap: anywhere; }

/* A jumped-to target (a readiness "fix" link, a rail rung, a dashboard tile)
   briefly rings so the eye lands on the exact control to change. */
@keyframes ar-jump-flash {
  from { box-shadow: 0 0 0 2px var(--ar-accent), 0 0 0 7px color-mix(in srgb, var(--ar-accent) 16%, transparent); }
  to   { box-shadow: 0 0 0 2px color-mix(in srgb, var(--ar-accent) 0%, transparent), 0 0 0 7px color-mix(in srgb, var(--ar-accent) 0%, transparent); }
}
#agentimus-app .ar-jump-flash { animation: ar-jump-flash 1.5s ease-out forwards; }
@media (prefers-reduced-motion: reduce) {
  #agentimus-app .ar-jump-flash { animation: none; box-shadow: 0 0 0 2px var(--ar-accent); }
}

/* Quiet privacy framing under the dashboard summary tiles. */
/* No own margins — the parent .ar-act grid's 22px gap spaces it equally above and below
   (grid gaps DON'T collapse with margins, they add, so any margin here desyncs the two). */
.ar-dash-note { margin: 0; font-size: 12.5px; line-height: 1.5; color: var(--ar-ink-faint); }
/* Privacy-fact mark: a small shield-check opens an honesty footnote. One meaning
   — "this data stays here" — and never interactive (small circles that LOOK
   clickable are the ? explainer buttons; this is a mark, not a control).
   Compose with the note's own class; the icon inherits its colour. */
.ar-privnote::before {
  content: ""; display: inline-block; width: 14px; height: 14px;
  margin-right: 7px; vertical-align: -2.5px;
  /* The version line's own gold, not the note's faint ink (his call,
     2026-08-12): the one mark that says "this stays here" earns the one
     warm accent, and stops disappearing in dark. */
  background: var(--ar-warn);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3l7 2.8v5.4c0 4.3-2.9 7.9-7 9.3-4.1-1.4-7-5-7-9.3V5.8z'/%3E%3Cpath d='M9 11.6l2.1 2.1 3.9-4.3'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3l7 2.8v5.4c0 4.3-2.9 7.9-7 9.3-4.1-1.4-7-5-7-9.3V5.8z'/%3E%3Cpath d='M9 11.6l2.1 2.1 3.9-4.3'/%3E%3C/svg%3E") center / contain no-repeat;
}

/* ---- Header bar (brand · tabs · gauge in one slim row) ------------------ */
/* The nav bar + page-head travel together and STAY at the top on scroll — wrapped in one
   sticky block so a nav row that wraps on a narrow screen can never desync from the title
   strip below it. Flush below the WP admin bar; z-index keeps it over the scrolling content
   while staying under the modals/toasts (which teleport to <body> at 100000+). */
.ar__sticky { position: sticky; top: var(--ar-adminbar); z-index: 40; transition: box-shadow 0.24s ease; }
/* Once the page is scrolled, the pinned header lifts above the content with a soft
   shadow (the pagehead's hairline stays as the crisp edge) so the two never merge.
   The .is-stuck class is toggled from App.vue on scroll. */
.ar__sticky.is-stuck { box-shadow: 0 8px 18px -12px rgba(38, 32, 24, 0.32), 0 2px 5px -3px rgba(38, 32, 24, 0.12); }
@media (prefers-reduced-motion: reduce) { .ar__sticky { transition: none; } }

.ar__bar {
  display: flex;
  align-items: stretch;
  gap: 26px;
  /* Match .ar__body's 34px so the brand mark and gauge line up with the
     content cards' left/right edges. */
  padding: 0 34px;
  min-height: var(--ar-bar-h);
  background: var(--ar-surface);
  border-bottom: 1px solid var(--ar-line);
}

/* Brand — clickable, returns to the default (Settings) tab. */
.ar__brand {
  flex: 0 0 auto;
  display: flex; align-items: center; gap: 11px; align-self: center;
  appearance: none; background: none; border: 0; margin: 0; padding: 0;
  font: inherit; color: inherit; text-align: left; cursor: pointer;
  text-decoration: none; /* it's a real <a> now — no underline on the masthead */
  transition: opacity 0.15s;
}
.ar__brand:hover { opacity: 0.82; }
/* The masthead is a link, but it is not prose: the app-wide bare-anchor hover
   was drawing a rule under the version line (his catch, 2026-08-15). Its own
   `text-decoration: none` could not win — a hover selector outranks a plain
   class — so the hover state says it itself. Fading is the whole feedback. */
.ar__brand:hover,
.ar__brand:focus-visible { text-decoration: none; color: inherit; }
/* As a real <a> the masthead inherits wp-admin's global a:focus blue ring (it
   fires on right-click too); silence that and keep OUR ring for keyboard focus.
   A logo-link isn't prose either — no text selection on click. */
.ar__brand { user-select: none; -webkit-user-select: none; }
.ar__brand:focus { outline: 0; box-shadow: none; }
.ar__brand:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 4px; border-radius: 6px; }
.ar__mark {
  display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 30px; border-radius: 8px;
  background: var(--ar-ink); color: var(--ar-paper);
  /* Framed-icon look: a gap in the bar colour, then an offset accent ring,
     so the ring reads as a clean frame rather than a muddy edge. */
  box-shadow:
    0 0 0 2px var(--ar-surface),
    0 0 0 3px var(--ar-accent),
    0 1px 5px -1px color-mix(in srgb, var(--ar-shade) 25%, transparent);
}
/* Name + version stacked, both flush-left, within the 30px mark height. The
   wordmark sets the column width; the version line is justified (spread by
   letter-spacing) to fill that exact width — so line 2 matches line 1's width. */
.ar__brandtext {
  display: inline-flex; flex-direction: column; align-items: stretch;
  justify-content: center; gap: 5px;
}
/* SVG "AR" monogram — paper strokes with a gold accent on the A's crossbar. */
.ar__logo { width: 18px; height: auto; display: block; }
.ar__logo-line { stroke: var(--ar-paper); stroke-width: 2.4; }
.ar__logo-accent { stroke: var(--ar-warn); stroke-width: 2.2; }

.ar__name {
  font-family: var(--ar-serif); font-weight: 600; font-size: 16px; line-height: 1;
  letter-spacing: -0.01em; color: var(--ar-ink);
}
.ar__ver {
  /* Same gold as the readiness gauge / 6-of-11 figure. */
  font-family: var(--ar-sans); font-size: 9px; line-height: 1; color: var(--ar-warn);
  text-align: justify;
  text-align-last: justify;
  text-justify: inter-character;
  -moz-text-align-last: justify;
}

/* The gold-gem arrow — part of the BRAND BUTTON now, so the whole masthead
   including it is one clickable unit. Two angled bars meet at a framed gold
   node pointing toward the menu; the gold echoes the version line + logo
   crossbar, the ring echoes the logo's framed mark. */
.ar__brandarrow { display: inline-flex; margin-left: 5px; }
.ar__brandarrow svg { display: block; }
.ar__sep-chev {
  stroke: var(--ar-line-strong);
  stroke-width: 1.4;
  stroke-linecap: round;
  stroke-linejoin: round;
}
/* Dark: the bars vanished into the bar's ground — they go gold-warmed (his
   call, 2026-08-12), a quieter echo of the node they point through. */
:root[data-ar-theme="dark"] .ar__sep-chev {
  stroke: color-mix(in srgb, var(--ar-warn) 55%, var(--ar-line-strong));
}
.ar__sep-ring { stroke: color-mix(in srgb, var(--ar-warn) 45%, transparent); stroke-width: 1; }
.ar__sep-node { fill: var(--ar-warn); filter: drop-shadow(0 0 2px color-mix(in srgb, var(--ar-warn) 45%, transparent)); }

/* Brand / nav break — invisible on wide screens; on narrow screens the media
   block below turns it into a full-width flex line break. */
.ar__sep { display: none; }

/* Tabs — inline in the bar, active item underlined at the bar's base. The strip
   takes the space left of the brand and scrolls horizontally when it can't fit,
   so no tab is ever clipped on narrow screens. */
.ar__tabs {
  /* `0 1 auto`, not `1 1 auto`: the nav no longer absorbs the bar's free space, so the
     More menu can sit immediately after Discovery instead of being pushed to the far
     right. .ar__review takes the slack with margin-left:auto. */
  flex: 0 1 auto; min-width: 0;
  display: flex; align-items: stretch; gap: 24px;
  overflow-x: auto; scrollbar-width: none; -ms-overflow-style: none;
}
.ar__tabs::-webkit-scrollbar { display: none; }
.ar__tab {
  appearance: none; background: none; border: 0; cursor: pointer;
  flex: 0 0 auto; white-space: nowrap;
  display: flex; align-items: center; padding: 0 2px;
  font-family: var(--ar-mono); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--ar-ink-faint);
  border-bottom: 2px solid transparent; margin-bottom: -1px;
  transition: color 0.15s;
}
.ar__tab:hover { color: var(--ar-ink-soft); }
.ar__tab.is-active { color: var(--ar-ink); border-bottom-color: var(--ar-accent); }
/* The Findings tab's open count — the findings' amber, never the bell's red
   (red means clients waiting on a verdict, amber means work worth doing).
   Inline after the label, not a corner bubble: a bar tab owns its text line,
   and the tab's flex row seats it without new layout. */
.ar__tab-count {
  margin-left: 7px; min-width: 16px; height: 16px; padding: 0 4px;
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: 999px; background: var(--ar-warn); color: var(--ar-paper);
  font-size: 10px; font-weight: 700; letter-spacing: 0;
}
/* The tab's third weight. A number means DO something; this dot means LOOK at
   something — a finding whose work is finished and waiting on a report, or one
   that has just moved. Deliberately smaller and quieter than the count: it is
   an invitation, not a debt. It never appears alongside a count, so the tab
   carries exactly one signal at a time. */
.ar__tab-dot {
  margin-left: 7px; width: 6px; height: 6px; border-radius: 999px;
  display: inline-block; background: var(--ar-ink-faint);
}
.ar__tab-dot.is-news { background: var(--ar-good); }

/* Each tab's mark — inherits the label's ink so it dims, wakes and activates
   with the text as one unit. */
.ar__tab-ic { display: inline-flex; margin-right: 7px; }
.ar__tab-ic svg { width: 13px; height: 13px; display: block; }

/* ---- Nav "Activity to review" badge + dropdown ------------------------- */
/* NOT position:relative — the queue pop positions against .ar__controls (the
   whole cluster), because the bell stopped being the rightmost control when
   the gear took that seat: anchored to the bell alone, the pop hung off the
   left edge of a phone and stopped 38px short of the content edge on desktop. */
.ar__review { flex: 0 0 auto; align-self: center; margin-left: auto; }
.ar__review-btn {
  appearance: none; cursor: pointer;
  position: relative; /* anchors the corner count bubble */
  display: inline-flex; align-items: center; gap: 6px;
  padding: 5px 9px; border-radius: 999px;
  border: 1px solid var(--ar-line-strong); background: var(--ar-surface); color: var(--ar-ink-soft);
  transition: color 0.15s ease, border-color 0.15s ease, background 0.15s ease;
}
.ar__review-btn:hover,
.ar__review.is-open .ar__review-btn { color: var(--ar-ink); border-color: var(--ar-ink-faint); background: var(--ar-surface-2); }
/* Resting state — logging on, nothing flagged: a calm anchor with a softer border
   and no red count, so a populated queue (red badge) is what draws the eye. */
.ar__review.is-quiet .ar__review-btn { border-color: var(--ar-line); }
.ar__review-btn:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; }
/* Count badges ride the CORNER of their control, out of flow — one badge
   grammar for the whole trio. Inline counts forced the bell into a pill and
   deformed the Attention circle into a blob; a corner bubble leaves every
   control a clean circle and costs the row no width at all. */
.ar__review-count {
  position: absolute; top: -5px; right: -6px; z-index: 1;
  font-family: var(--ar-mono); font-size: 10px; font-weight: 700; line-height: 1;
  min-width: 16px; height: 16px; padding: 0 4px; border-radius: 999px;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--ar-bad); color: var(--ar-paper);
  /* A paper ring so the bubble reads as sitting ABOVE the circle it overlaps —
     including the filled is-here disc — not as a bite out of its edge. */
  box-shadow: 0 0 0 2px var(--ar-paper);
}
/* ---- Loading skeletons ------------------------------------------------------
   A data screen's first paint used to be its header over a blank page while
   the fetch ran. Each screen now sketches its own real layout in quiet
   surface blocks with one slow sheen — enough to say "coming", never a
   spinner. Shapes are composed per screen from these primitives; the sheen
   stands down under prefers-reduced-motion. -------------------------------- */
.ar-skel { position: relative; overflow: hidden; border-radius: 6px; background: var(--ar-surface-2); }
.ar-skel::after {
  content: ''; position: absolute; inset: 0;
  background: linear-gradient(100deg, transparent 32%, var(--ar-skel-sheen) 50%, transparent 68%);
  transform: translateX(-100%);
  animation: ar-skel-sheen 1.7s ease-in-out infinite;
}
@keyframes ar-skel-sheen { to { transform: translateX(100%); } }
@media (prefers-reduced-motion: reduce) { .ar-skel::after { animation: none; } }
.ar-skel--title { height: 17px; width: 210px; }
.ar-skel--line { height: 12px; }
.ar-skel--tile { height: 82px; border-radius: var(--ar-radius); flex: 1 1 0; }
.ar-skel-tiles { display: flex; gap: 14px; margin: 0 0 18px; }
.ar-skel-lines { display: grid; gap: 11px; align-content: start; }
.ar-skel-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 26px; margin-top: 22px; }
.ar-skel-head { margin: 0 0 18px; display: grid; gap: 10px; }
@container (max-width: 720px) {
  .ar-skel-cols { grid-template-columns: 1fr; }
  .ar-skel-tiles { flex-wrap: wrap; }
  .ar-skel--tile { flex: 1 1 40%; }
}

/* ---- Writing assistant: quill launcher + guidance popover + drawer ---------- */
/* The quill shares the bell's chrome (.ar__review-btn). Dimmed = prerequisites
   missing — visible but quiet, per the "never hidden, say how to turn it on" rule. */
/* The quill takes the bell's old margin-left:auto job (it now sits first in the
   right-edge pair); the bell then nestles beside it with a small gap. */
.ar__assist { flex: 0 0 auto; align-self: center; position: relative; margin-left: auto; }
.ar__assist + .ar__review { margin-left: -16px; }
.ar__assist-btn.is-dim { opacity: 0.45; }
.ar__assist-btn.is-dim:hover { opacity: 0.7; }

.ar__assist-guide {
  position: absolute; top: calc(100% + 8px); right: 0; z-index: 60;
  width: 340px; max-width: calc(100cqw - 32px);
  background: var(--ar-surface); border: 1px solid var(--ar-line-strong); border-radius: var(--ar-radius);
  box-shadow: 0 14px 36px -12px color-mix(in srgb, var(--ar-shade) 45%, transparent);
  padding: 14px 16px;
}
.ar__assist-guide__title { display: block; font-size: 13px; color: var(--ar-ink); }
.ar__assist-guide__lead { margin: 6px 0 8px; font-size: 12px; color: var(--ar-ink-soft); }
.ar__assist-guide__list { list-style: none; margin: 0; padding: 0; display: grid; gap: 9px; }
.ar__assist-guide__list li { display: flex; gap: 8px; font-size: 12px; line-height: 1.5; color: var(--ar-ink-soft); }
.ar__assist-guide__list li.is-done { opacity: 0.66; }
.ar__assist-guide__mark {
  flex: 0 0 auto; width: 17px; height: 17px; margin-top: 1px; border-radius: 50%;
  display: grid; place-items: center; font-size: 10px; font-weight: 700;
  color: var(--ar-accent); background: color-mix(in srgb, var(--ar-accent) 9%, var(--ar-surface));
  border: 1px solid color-mix(in srgb, var(--ar-accent) 30%, var(--ar-surface));
}
.ar__assist-guide__foot { margin: 10px 0 0; padding-top: 9px; border-top: 1px solid var(--ar-line); font-size: 11px; color: var(--ar-ink-faint); }

/* The drawer: right panel desktop, full sheet on phones (svh — the real viewport). */
.ar-drawer { position: fixed; inset: 0; z-index: 100060; }
.ar-drawer__scrim { position: absolute; inset: 0; background: color-mix(in srgb, var(--ar-shade) 38%, transparent); }
.ar-drawer__panel {
  position: absolute; top: 0; right: 0; bottom: 0;
  width: 600px; max-width: 100vw;
  display: flex; flex-direction: column;
  background: var(--ar-surface);
  border-left: 1px solid var(--ar-line-strong);
  box-shadow: -18px 0 48px -18px color-mix(in srgb, var(--ar-shade) 50%, transparent);
  outline: none;
}
@media (max-width: 782px) {
  .ar-drawer__panel { width: 100%; border-left: 0; height: 100vh; height: 100svh; }
}
.ar-drawer-enter-active, .ar-drawer-leave-active { transition: opacity 0.18s ease; }
.ar-drawer-enter-active .ar-drawer__panel, .ar-drawer-leave-active .ar-drawer__panel { transition: transform 0.22s ease; }
.ar-drawer-enter-from, .ar-drawer-leave-to { opacity: 0; }
.ar-drawer-enter-from .ar-drawer__panel, .ar-drawer-leave-to .ar-drawer__panel { transform: translateX(100%); }

.ar-drawer__head {
  flex: 0 0 auto; display: flex; align-items: flex-start; gap: 11px;
  padding: 18px 20px 14px; border-bottom: 1px solid var(--ar-line-strong);
  background: var(--ar-surface);
}
.ar-drawer__quill {
  flex: 0 0 auto; width: 34px; height: 34px; border-radius: 10px; display: grid; place-items: center;
  color: var(--ar-accent); background: color-mix(in srgb, var(--ar-accent) 9%, var(--ar-surface));
  border: 1px solid color-mix(in srgb, var(--ar-accent) 26%, var(--ar-surface));
}
.ar-drawer__titles { min-width: 0; flex: 1; }
.ar-drawer__title { margin: 0; font-family: var(--ar-serif); font-size: 17px; font-weight: 600; color: var(--ar-ink); line-height: 1.2; }
.ar-drawer__sub { margin: 3px 0 0; font-size: 12px; color: var(--ar-ink-faint); }
/* Sits beside the close: same 30px row, so the pair reads as one corner unit. */
.ar-drawer__back {
  flex: 0 0 auto; align-self: flex-start; height: 30px;
  display: inline-flex; align-items: center;
  margin-right: 10px; white-space: nowrap;
}
.ar-drawer__close {
  flex: 0 0 auto; width: 30px; height: 30px; border-radius: 8px; display: grid; place-items: center;
  background: transparent; border: 1px solid var(--ar-line); color: var(--ar-ink-soft); cursor: pointer;
}
.ar-drawer__close:hover { border-color: var(--ar-line-strong); color: var(--ar-ink); }
.ar-drawer__body { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding: 18px 20px; }
/* Screens with a pinned foot own their bottom spacing — the foot must sit
   flush. Flex column so a SHORT outline's foot still anchors to the drawer's
   bottom edge (margin-top:auto) instead of floating mid-panel; when content
   overflows, sticky takes over and pins it exactly the same. */
.ar-drawer__body--footed { padding-bottom: 0; display: flex; flex-direction: column; }
.ar-drawer__body--footed > * { flex: 0 0 auto; }
.ar-drawer__body--footed .ar-assist__foot { margin-top: auto; padding-top: 13px; }
/* Whatever ends the scrolled content gets daylight before the pinned foot —
   flush against the foot's rule + shadow it read as clipped even fully scrolled. */
.ar-drawer__body--footed > :nth-last-child(2) { margin-bottom: 14px; }
/* A quiet, thin scrollbar with a permanently reserved gutter: on systems with
   classic (space-taking) scrollbars, content appearing/disappearing can't
   nudge the layout sideways when the bar pops in. overscroll-behavior keeps a
   wheel that reaches the list's end from chaining into the page behind. */
.ar-drawer__body {
  scrollbar-gutter: stable;
  scrollbar-width: thin;
  scrollbar-color: var(--ar-line-strong) transparent;
  overscroll-behavior: contain;
}

/* Brief */
.ar-assist__label { display: block; font-size: 12.5px; font-weight: 600; color: var(--ar-ink); margin-bottom: 7px; }
.ar-assist__prompt {
  width: 100%; resize: vertical; min-height: 120px;
  font-size: 13px; line-height: 1.55; color: var(--ar-ink);
  background: var(--ar-surface); border: 1px solid var(--ar-line-strong); border-radius: 9px;
  padding: 10px 12px;
}
.ar-assist__prompt:focus { outline: none; border-color: var(--ar-accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ar-accent) 15%, transparent); }
.ar-assist__hint { margin: 8px 0 0; font-size: 11.5px; line-height: 1.55; color: var(--ar-ink-faint); }
.ar-assist__error { margin: 10px 0 0; font-size: 11.5px; font-weight: 500; line-height: 1.55; color: var(--ar-bad); }
.ar-assist__actions { display: flex; align-items: center; gap: 10px; margin-top: 14px; }
.ar-assist__actions .ar-assist__go { margin-left: auto; display: inline-flex; align-items: center; gap: 7px; }
.ar-assist__spacer { flex: 1; }
/* Compound selector on purpose: the base .ar-spinner (26px) is declared LATER
   in this file and would win the tie — this must outrank it, or every button
   spinner inflates to 26px and bumps the button height mid-call. border-box,
   because without it the borders render OUTSIDE the 12px (16px total — taller
   than the button's text line, which is the height bump all over again). */
.ar-spinner.ar-assist__spin { box-sizing: border-box; width: 12px; height: 12px; border-width: 2px; flex: 0 0 auto; }
.ar-assist__status {
  font-size: 12px; padding: 6px 8px; border-radius: 8px;
  border: 1px solid var(--ar-line-strong); background: var(--ar-surface); color: var(--ar-ink);
}

/* The held-draft bar: a paid generation is never silently unreachable. */
.ar-assist__held {
  display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap;
  margin-top: 12px; padding: 8px 11px; border-radius: 9px;
  border: 1px solid color-mix(in srgb, var(--ar-accent) 26%, var(--ar-surface));
  background: color-mix(in srgb, var(--ar-accent) 5%, var(--ar-surface));
}
.ar-assist__heldtext { font-size: 12px; color: var(--ar-ink-soft); }

/* The outline gate: the skeleton the owner shapes before the expensive draft. */
.ar-assist__otitle { display: block; width: 100%; margin-bottom: 14px; font-family: var(--ar-serif); font-size: 14.5px; font-weight: 600; }
.ar-assist__osections { display: grid; gap: 9px; margin-bottom: 9px; }
.ar-assist__osection {
  position: relative; /* Anchors the corner remove button. */
  display: grid; gap: 6px; padding: 10px 38px 10px 10px; border-radius: 9px;
  border: 1px solid var(--ar-line); background: var(--ar-surface-2);
}
.ar-assist__osecrow { display: flex; align-items: center; gap: 8px; }
.ar-assist__onum {
  flex: 0 0 auto; font-family: var(--ar-mono); font-size: 10px; color: var(--ar-ink-faint);
  width: 16px; text-align: right;
}
.ar-assist__osecrow .ar-assist__refineinput { font-weight: 600; }
/* The note is a textarea so a full sentence stays fully visible — it grows to
   its content where the browser supports field-sizing, and falls back to two
   comfortable rows elsewhere. Never a horizontal one-line peephole. The left
   inset mirrors the number gutter, so heading and note share the exact same
   width — the remove button lives in the card's right gutter, not the row. */
.ar-drawer textarea.ar-assist__onote,
.ar-assist__onote {
  display: block; margin-left: 24px; width: calc(100% - 24px);
  font-size: 12.5px; line-height: 1.5; color: var(--ar-ink-soft);
  resize: none; field-sizing: content; min-height: 30px;
}
.ar-assist__oremove {
  position: absolute; top: 15px; right: 7px;
  display: grid; place-items: center; width: 24px; height: 24px;
  appearance: none; border: 0; border-radius: 7px; cursor: pointer;
  color: var(--ar-ink-faint); background: transparent;
}
.ar-assist__oremove:hover { color: var(--ar-bad); background: color-mix(in srgb, var(--ar-bad) 8%, transparent); }
.ar-assist__oremove:disabled { opacity: 0.5; cursor: default; }

/* Staged write: the outline screen doubles as the progress screen — a mark per
 * part, and slim dashed rows for the bookends (introduction, closing, dressing)
 * that aren't editable sections. */
.ar-assist__opart {
  display: flex; align-items: center; flex-wrap: wrap; gap: 8px;
  margin: 9px 0 0; padding: 8px 11px; border-radius: 9px;
  border: 1px dashed var(--ar-line);
}
.ar-assist__opart--lead { margin: 0 0 9px; }
.ar-assist__opartlabel { flex: 1; font-size: 12px; color: var(--ar-ink-soft); }
/* One 16px state dot: hollow while waiting, a turning ring while writing,
 * a check when landed, a cross when the part must be retried. border-box
 * everywhere — the same tie the button spinner already fights. */
.ar-assist__omark {
  box-sizing: border-box; flex: 0 0 auto;
  display: grid; place-items: center; width: 16px; height: 16px; border-radius: 50%;
}
.ar-assist__omark.is-pending { border: 1.5px dashed var(--ar-line-strong); }
.ar-assist__omark.is-busy {
  border: 2px solid var(--ar-line-strong); border-top-color: var(--ar-accent);
  animation: ar-spin 0.7s linear infinite;
}
.ar-assist__omark.is-done::after {
  content: ''; box-sizing: border-box; width: 5px; height: 9px; margin-top: -2px;
  border-right: 2px solid var(--ar-good); border-bottom: 2px solid var(--ar-good);
  transform: rotate(45deg);
}
.ar-assist__omark.is-error { color: var(--ar-bad); font-size: 14px; font-weight: 700; }
.ar-assist__omark.is-error::after { content: '×'; line-height: 1; }
@media (prefers-reduced-motion: reduce) {
  .ar-assist__omark.is-busy { animation-duration: 1.6s; }
}
/* A failed part's sentence, under its row. Inside a section card it aligns
 * with the note's inset gutter. */
.ar-assist__oparterror { flex: 1 1 100%; margin: 0; font-size: 11.5px; line-height: 1.45; color: var(--ar-bad); }
.ar-assist__oparterror--insec { margin-left: 24px; }

/* The outline screen's pinned foot: the section list scrolls, the actions
 * never leave the viewport. Bleeds over the body's padding so content slides
 * beneath it edge-to-edge (same idea as the review queue's pinned footer). */
.ar-assist__foot {
  position: sticky; bottom: 0; z-index: 4;
  margin: 16px -20px 0; padding: 11px 20px 15px;
  background: var(--ar-surface);
  border-top: 1px solid var(--ar-line-strong);
  box-shadow: 0 -12px 22px -16px color-mix(in srgb, var(--ar-shade) 40%, transparent);
}
.ar-assist__footrow { display: flex; align-items: center; gap: 13px; flex-wrap: wrap; }
.ar-assist__footrow--commit { margin-top: 10px; }
.ar-assist__footrow .ar-assist__go { display: inline-flex; align-items: center; gap: 7px; }
/* …unless it is reserving width. The rule above is more specific than
   .ar-btn--reserve, so inline-flex won and the hidden reserve text stopped being
   a stacked grid cell and became a FLEX SIBLING — sitting beside the label,
   shoving it off centre and doubling the button's width. Restated at matching
   specificity, the same way the Findings refresh does it. */
.ar-assist__footrow .ar-assist__go.ar-btn--reserve { display: inline-grid; justify-items: center; }
.ar-assist__footerror { margin: 0 0 9px; }
.ar-assist__resetlink { color: var(--ar-ink-faint); }
.ar-assist__resetlink:hover { color: var(--ar-bad); }

.ar-assist__postlist { display: grid; gap: 8px; margin-top: 12px; }
/* A row is an <a> now, so it carries link resets rather than button ones — and
   no blocked state: the list stopped refusing rows when it stopped rewriting
   them. */
.ar-assist__postitem {
  text-align: left; cursor: pointer; text-decoration: none;
  display: grid; gap: 4px; padding: 10px 12px;
  border: 1px solid var(--ar-line); border-radius: 9px; background: var(--ar-surface);
}
.ar-assist__postitem:hover { border-color: var(--ar-accent); }
.ar-assist__postitem:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; }
.ar-assist__posttitle { font-size: 13px; font-weight: 600; color: var(--ar-ink); }
.ar-assist__postmeta { display: flex; align-items: center; gap: 8px; font-size: 11px; color: var(--ar-ink-faint); }
/* Where the row goes, said once per row but only on hover/focus — every row
   goes to the same place, so saying it constantly is noise. */
.ar-assist__postgo { margin-left: auto; color: var(--ar-accent); opacity: 0; transition: opacity 0.15s ease; }
.ar-assist__postitem:hover .ar-assist__postgo,
.ar-assist__postitem:focus-visible .ar-assist__postgo { opacity: 1; }

/* Start over's confirm, wherever it's armed — the brief's action row and both
   pinned feet share these two. (The brief screen's separate dashed strip is
   gone: it lived under the buttons and duplicated the link now sitting in the
   action row beside them.) */
/* The reset confirm holds its two answers on ONE line. The row wraps by design
   — four controls on a narrow drawer need to — but a question whose "Yes, clear
   it" and "Keep it" land on different lines stops reading as a pair and becomes
   two unrelated links, one of them destructive. The PROSE gives way instead:
   it shrinks and wraps within itself, which costs nothing. */
.ar-assist__footrow--confirm { flex-wrap: nowrap; }
.ar-assist__footrow--confirm .ar-assist__resettext { flex: 1 1 auto; min-width: 0; }
.ar-assist__footrow--confirm .ar-linkbtn { flex: 0 0 auto; white-space: nowrap; }
.ar-assist__resettext { font-size: 11.5px; color: var(--ar-ink-faint); }
.ar-assist__resetdanger { color: var(--ar-bad); }

/* Preview */
.ar-assist__preview {
  border: 1px solid var(--ar-line); border-left: 3px solid var(--ar-accent);
  border-radius: 10px; background: color-mix(in srgb, var(--ar-accent) 2%, var(--ar-surface));
  padding: 14px 16px;
}
.ar-assist__ptitle { margin: 0 0 6px; font-family: var(--ar-serif); font-size: 17px; font-weight: 600; color: var(--ar-ink); line-height: 1.25; }
.ar-assist__pexcerpt { margin: 0 0 10px; font-size: 12.5px; font-style: italic; color: var(--ar-ink-soft); }
.ar-assist__pbody {
  max-height: 320px; overflow-y: auto; padding-right: 6px;
  font-size: 12.5px; line-height: 1.62; color: var(--ar-ink-soft);
}
.ar-assist__pbody h2 { font-size: 14px; color: var(--ar-ink); margin: 14px 0 6px; }
.ar-assist__pbody h3 { font-size: 13px; color: var(--ar-ink); margin: 12px 0 5px; }
.ar-assist__pbody p { margin: 0 0 9px; }
.ar-assist__pbody ul, .ar-assist__pbody ol { margin: 0 0 9px 18px; padding: 0; }
.ar-assist__pbody li { margin-bottom: 4px; }
.ar-assist__meta { display: grid; gap: 7px; margin-top: 12px; }
.ar-assist__metarow { display: flex; gap: 10px; align-items: baseline; font-size: 12px; }
.ar-assist__metakey { flex: 0 0 92px; font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.04em; text-transform: uppercase; color: var(--ar-ink-faint); }
.ar-assist__metaval { color: var(--ar-ink-soft); }
.ar-assist__chips { display: flex; flex-wrap: wrap; gap: 5px; }
.ar-assist__chip {
  font-size: 11px; padding: 1px 8px; border-radius: 999px;
  color: var(--ar-ink-soft); background: var(--ar-surface-2); border: 1px solid var(--ar-line);
}

/* Images have no drawer UI — just the one-line note about what the editor
   will hold. (The image workshop lives in the block editor now.) */
.ar-assist__imagesnote { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--ar-line); }
.ar-assist__librow { display: flex; gap: 8px; align-items: center; }

/* ---- Brief screen -------------------------------------------------------
   Two labelled fields, stacked: the content type, then the brief. Each opens
   with a head row carrying its label on the left and — on the type field — the
   way into the OTHER door on the right, so both paths are visible before
   anything is typed. */
/* The field and the way out to the other door share a row, centred on each
   other — they're alternatives, so they read as one choice, not as a heading
   with a stray link beside it. The field takes the row; the link keeps only
   the width of its own words. */
.ar-assist__typerow2 { display: flex; align-items: center; gap: 14px; }
.ar-assist__typefield { flex: 1 1 auto; min-width: 0; }
.ar-assist__editdoor { flex: 0 0 auto; }
.ar-assist__typenote { margin: 7px 0 0; font-size: 11.5px; line-height: 1.55; color: var(--ar-ink-faint); }

/* The brief's own label, sized as a section heading — it's the screen's real
   question, and the small-label treatment made it read as a form field. */
.ar-assist__section {
  display: block; margin: 20px 0 9px;
  font-size: 16px; font-weight: 600; letter-spacing: -0.01em; color: var(--ar-ink);
}

/* Starting frames. Pills rather than buttons: they type for you, they don't
   commit you to anything, and the weight should say so. */
.ar-assist__presets { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 10px; }
.ar-assist__preset {
  padding: 6px 12px; border: 1px solid var(--ar-line-strong); border-radius: 999px;
  background: var(--ar-surface); color: var(--ar-ink-soft);
  font-size: 12px; line-height: 1.2; cursor: pointer;
  transition: border-color 0.15s ease, color 0.15s ease, background 0.15s ease;
}
.ar-assist__preset:hover:not(:disabled) { border-color: var(--ar-accent); color: var(--ar-accent); background: var(--ar-surface-2); }
.ar-assist__preset:disabled { opacity: 0.5; cursor: default; }

/* Held work, as a card rather than a sentence: after a day away, "your drafted
   post" identifies nothing — the card carries the actual title. */
.ar-assist__heldcard {
  display: flex; gap: 11px; align-items: flex-start;
  margin-top: 16px; padding: 12px 13px;
  background: var(--ar-surface-2); border: 1px solid var(--ar-line); border-radius: var(--ar-radius);
}
.ar-assist__heldicon {
  flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 30px; border-radius: var(--ar-radius);
  background: var(--ar-surface); border: 1px solid var(--ar-line); color: var(--ar-accent);
}
.ar-assist__heldbody { min-width: 0; }
.ar-assist__heldlabel { margin: 0; font-size: 11.5px; color: var(--ar-ink-faint); }
.ar-assist__heldtitle {
  margin: 1px 0 3px; font-size: 13px; font-weight: 600; color: var(--ar-ink);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* ---- Input group ---------------------------------------------------------
   A label welded to its control: one border around both, the label in a shaded
   segment on the left. Reads as a single object ("Filter by type: Everything")
   instead of a caption hovering over a field, and it costs a row of height.

   Generic on purpose — any .ar-input or SelectMenu can be dropped inside.

   NOT overflow:hidden, tempting as that is for the corners: SelectMenu's popup
   is absolutely positioned inside .ar-select, so clipping the group would clip
   the open menu. The addon rounds its own left corners instead. */
.ar-inputgroup {
  display: flex;
  align-items: stretch;
  border: 1px solid var(--ar-line-strong);
  border-radius: var(--ar-radius);
  background: var(--ar-field);
}
.ar-inputgroup__addon {
  display: flex; align-items: center; flex: 0 0 auto;
  padding: 0 12px;
  border-right: 1px solid var(--ar-line);
  border-radius: calc(var(--ar-radius) - 1px) 0 0 calc(var(--ar-radius) - 1px);
  background: var(--ar-surface-2);
  font-size: 12.5px; font-weight: 600; color: var(--ar-ink-soft); white-space: nowrap;
}
.ar-inputgroup > .ar-select { flex: 1 1 auto; min-width: 0; }
/* The control gives up its own frame — the group wears it now. The id prefix is
   here to out-specify SelectMenu's scoped rules, which otherwise tie on weight
   and win or lose on build order. */
#agentimus-app .ar-inputgroup .ar-select__btn,
#agentimus-app .ar-inputgroup .ar-input {
  border: 0; border-radius: 0; background: transparent; box-shadow: none; height: 40px;
}
/* One focus ring, drawn by the group, whether the inner control is focused or
   its menu is open. */
#agentimus-app .ar-inputgroup:focus-within,
#agentimus-app .ar-inputgroup:has(.ar-select.is-open) {
  border-color: var(--ar-accent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--ar-accent) 13%, transparent);
}

/* Full width, so it lines up with the search row above it — a filter that stops
   short of the field it filters reads as an afterthought. */
.ar-assist__filtergroup { margin: 10px 0 8px; }

/* What the chosen type will do to the writing, under the field that chose it. */
.ar-assist__typenote { margin: 7px 0 0; font-size: 11.5px; line-height: 1.55; color: var(--ar-ink-faint); }

/* Refine: revise-in-place bar under the preview. */
.ar-assist__refine { display: flex; gap: 8px; margin-top: 12px; }
/* Inside the pinned foot the bar owns the top slot; the rows follow below. */
.ar-assist__foot .ar-assist__refine { margin: 0 0 11px; }
.ar-assist__foot .ar-assist__undoline { margin: -4px 0 10px; }
/* The foot's two right-edge buttons (Revise above, Update/Create below) share
   one width, so the stack reads as a single aligned column — and both wear a
   trimmer cut here than the full-size ar-btn: the foot is a toolbar, not a
   hero, and the input deserves the room. */
.ar-assist__foot .ar-assist__refinebtn,
.ar-assist__foot .ar-assist__go {
  min-width: 132px; height: 40px; padding: 0 16px; font-size: 11px;
  display: inline-flex; align-items: center; justify-content: center; gap: 7px;
}
/* The input matches the buttons' height exactly — one 40px line, no seams. */
.ar-assist__foot .ar-assist__refine .ar-assist__refineinput { height: 40px; }
/* Qualified selectors on purpose: wp-admin's forms.css styles bare
   `input[type=text]` (background, border, blue focus ring) at higher
   specificity than a lone class — without these, an <input> field and a
   <textarea> field wearing the SAME class render visibly different. */
.ar-drawer input.ar-assist__refineinput,
.ar-drawer textarea.ar-assist__refineinput,
.ar-assist__refineinput {
  box-sizing: border-box; margin: 0; /* wp-admin gives inputs `margin: 0 1px` —
  the phantom pixel that made an input and a textarea measure differently */
  flex: 1; min-width: 0; font-size: 12.5px; line-height: 1.5; color: var(--ar-ink);
  background: var(--ar-surface); border: 1px solid var(--ar-line-strong); border-radius: 9px;
  padding: 8px 11px; box-shadow: none;
}
/* Re-asserted AFTER the unified rule (same specificity — order decides):
   the note keeps its number-gutter indent, and the title must NOT flex-grow —
   it's a direct child of the footed body's flex column, and the unified rule's
   `flex: 1` would otherwise stretch it to fill the drawer. */
.ar-drawer textarea.ar-assist__onote { margin-left: 24px; }
.ar-drawer input.ar-assist__otitle { flex: 0 0 auto; }
/* Focus is a tinted border + a soft halo — visible without the chunky
   double-ring the 2px offset outline drew around rounded fields. */
.ar-drawer input.ar-assist__refineinput:focus,
.ar-drawer textarea.ar-assist__refineinput:focus,
.ar-assist__refineinput:focus { outline: none; border-color: var(--ar-accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ar-accent) 15%, transparent); }
.ar-assist__refinebtn { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 7px; font-size: 12.5px; padding: 7px 14px; }
.ar-assist__undoline { margin: 8px 0 0; font-size: 11.5px; color: var(--ar-ink-faint); }

.ar__review-pop {
  /* right:0 resolves against .ar__controls (see its position:relative) — the
     pop's right edge rides the cluster's, not the bell's. */
  position: absolute; top: calc(100% + 8px); right: 0; z-index: 60;
  width: 400px; max-width: calc(100cqw - 32px);
  /* Flex column: the list region (.ar-rev-scroll) scrolls, the footer is a fixed
     sibling below it — never sticky-pinned over content, so nothing shows through. */
  max-height: 72vh; display: flex; flex-direction: column; overflow: hidden;
  background: var(--ar-surface); border: 1px solid var(--ar-line-strong); border-radius: var(--ar-radius);
  box-shadow: 0 14px 36px -12px color-mix(in srgb, var(--ar-shade) 45%, transparent);
}
/* Fixed header block — title/count/auto-refresh + filter tabs. Mirror of .ar-rev-foot;
   raised (z-index) so its downward shadow paints over the cards scrolling beneath. */
.ar-rev-top {
  flex: 0 0 auto; position: relative; z-index: 1;
  padding: 16px 18px 12px;
  background: var(--ar-surface); border-bottom: 1px solid var(--ar-line-strong);
  box-shadow: 0 8px 14px -10px color-mix(in srgb, var(--ar-shade) 28%, transparent);
}
.ar-rev-top .ar-rev-tabs { margin: 12px 0 0; }
.ar-rev-scroll { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding: 0 18px 16px; }
.ar__review-title { font-family: var(--ar-serif); font-size: 16px; font-weight: 600; color: var(--ar-ink); }
.ar__review-lead { margin: 6px 0 12px; font-size: 12px; line-height: 1.5; color: var(--ar-ink-soft); }
.ar__review-empty { margin: 6px 0; font-size: 13px; color: var(--ar-ink-soft); }
/* Hairline between the descriptive header and the actionable list (only when there are rows). */
.ar__review-list { margin-top: 2px; padding-top: 6px; border-top: 1px solid var(--ar-line); }

/* Live-updates toggle (opt-in polling) — sits top-right of the dropdown head. */
.ar__live {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 3px 8px 3px 7px; border-radius: 999px;
  border: 1px solid var(--ar-line-strong); background: var(--ar-surface);
  font: inherit; font-size: 9.5px; font-weight: 600; letter-spacing: 0.07em; text-transform: uppercase;
  color: var(--ar-ink-soft); cursor: pointer;
  transition: border-color 0.15s ease, color 0.15s ease, background 0.15s ease;
}
.ar__live:hover { border-color: var(--ar-ink-soft); color: var(--ar-ink); }
.ar__live-dot { width: 6px; height: 6px; border-radius: 50%; border: 1.5px solid currentColor; background: transparent; }
.ar__live.is-on { border-color: color-mix(in srgb, var(--ar-good) 45%, transparent); color: var(--ar-good); background: color-mix(in srgb, var(--ar-good) 8%, transparent); }
.ar__live.is-on .ar__live-dot { border-color: var(--ar-good); background: var(--ar-good); }

/* ---- Page header (per-tab title + intro, below the nav bar) ------------- */
.ar__pagehead {
  /* Locked to the nav bar's exact height (shared token) and the content is
     vertically centred — so the title/intro never make this strip taller or
     shorter than the nav above it, whatever the per-tab text. A row now: the
     title/intro column on the left, a tools slot on the right edge that a
     panel can teleport into (the About search lives there, always in reach). */
  height: var(--ar-bar-h);
  display: flex; align-items: center; gap: 18px;
  padding: 0 34px;
  background: var(--ar-surface);
  border-bottom: 1px solid var(--ar-line);
}
.ar__pagehead-text { display: flex; flex-direction: column; justify-content: center; min-width: 0; }
.ar__pagehead-tools { margin-left: auto; flex: 0 1 auto; min-width: 0; }
.ar__pagehead-tools .ar-about-toc .ar-input { width: 230px; max-width: 30vw; }
/* #agentimus-app lifts specificity (1,1,0) above wp-admin's core .wrap h1
   (0,1,1), which would otherwise force 23px / weight 400 / 5px padding onto our
   title and inflate the page header. padding:0 explicitly drops the .wrap h1 5px. */
#agentimus-app .ar__pagehead-title {
  margin: 0; padding: 0;
  font-family: var(--ar-serif); font-weight: 600; font-size: 22px;
  line-height: 1.1; letter-spacing: -0.01em; color: var(--ar-ink);
}
.ar__pagehead-desc {
  margin: 0; font-size: 13px; line-height: 1.5; color: var(--ar-ink-soft);
  /* Keep to one line so the header height stays locked to the nav's 72px;
     truncates with an ellipsis only on very narrow viewports. */
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* Readiness rail widget — gauge + stat, lives in the side panel on every tab. */
.ar-rail-readiness { display: flex; align-items: center; gap: 15px; }
/* The gauge + tier block doubles as a quiet link to the full readiness report:
   button reset, no underline, just a faint brighten on hover. */
.ar-rail-readiness--link {
  width: 100%; margin: 0; padding: 0; border: 0; background: transparent;
  color: inherit; text-align: left; text-decoration: none; cursor: pointer;
  transition: filter 0.15s ease;
}
.ar-rail-readiness--link:hover { filter: brightness(1.08); }
.ar-rail-readiness--link:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 3px; border-radius: 8px; }
.ar-rail-gauge { position: relative; flex: 0 0 auto; width: 62px; height: 62px; }
.ar-rail-gauge svg { width: 62px; height: 62px; transform: rotate(-90deg); }
.ar-rail-gauge__track { fill: none; stroke: var(--ar-line); stroke-width: 7; }
.ar-rail-gauge__fill {
  fill: none;
  stroke: var(--ar-accent);
  stroke-width: 7;
  stroke-linecap: round;
  transition: stroke-dashoffset 1.1s cubic-bezier(0.22, 1, 0.36, 1);
}
.ar-rail-gauge__fill[data-tone="good"] { stroke: var(--ar-good); }
.ar-rail-gauge__fill[data-tone="ok"] { stroke: var(--ar-warn); }
.ar-rail-gauge__fill[data-tone="low"] { stroke: var(--ar-bad); }
.ar-rail-gauge__num {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  font-family: var(--ar-mono); font-size: 15px; font-weight: 600; color: var(--ar-ink);
}
.ar-rail-gauge__num small { font-size: 9px; opacity: 0.55; }

/* Tier badge beside the gauge: the one-word standing on the ladder. */
.ar-rail-tier { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.ar-rail-tier__name {
  font-family: var(--ar-serif); font-size: 19px; font-weight: 600; line-height: 1.05;
  color: color-mix(in srgb, var(--ar-paper) 92%, transparent);
}
.ar-rail-tier[data-state="top"] .ar-rail-tier__name { color: var(--ar-good-on-ink); }
.ar-rail-tier[data-state="floor"] .ar-rail-tier__name { color: var(--ar-bad-on-ink); }
/* Local site with search engines discouraged: a launch-day to-do, amber not red. */
.ar-rail-tier[data-state="local"] .ar-rail-tier__name { color: var(--ar-warn-on-ink); }
.ar-rail-tier__sub {
  font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase;
  color: color-mix(in srgb, var(--ar-paper) 45%, transparent);
}

/* The three-rung strip under the gauge: name + tally, with a state dot. Each row
   is a quiet link that jumps to that rung's group in the Readiness tab — no
   underline, just a subtle brighten on hover (it stays a stat panel, not a menu). */
.ar-rungs { list-style: none; margin: 12px 0 0; padding: 0; display: grid; gap: 6px; }
.ar-rung {
  font-family: var(--ar-mono); font-size: 12px; color: color-mix(in srgb, var(--ar-paper) 40%, transparent);
}
.ar-rung__btn {
  display: flex; align-items: center; gap: 9px; width: 100%;
  margin: 0; padding: 0; border: 0; background: transparent;
  font: inherit; color: inherit; text-align: left; text-decoration: none;
  cursor: pointer; transition: filter 0.15s ease;
}
.ar-rung__btn:hover { filter: brightness(1.18); }
.ar-rung__btn:focus-visible { outline: 2px solid currentColor; outline-offset: 3px; border-radius: 4px; }
/* The Optimized rung has no tab to jump to (it's per-post), so it's a plain stat row. */
.ar-rung__btn--static { cursor: default; }
.ar-rung__btn--static:hover { filter: none; }
.ar-rung__tick {
  position: relative; flex: 0 0 auto; width: 13px; height: 13px;
  border-radius: 50%; border: 1.5px solid currentColor;
}
.ar-rung__name { flex: 1; min-width: 0; }
/* A fixed right-aligned slot ("100%" wide), so the percentages hold a perfect
   column and the todo chips right-align against it without wobbling it. */
.ar-rung__count { font-size: 11px; opacity: 0.85; flex: 0 0 auto; min-width: 4ch; text-align: right; }
.ar-rung[data-state="done"] { color: var(--ar-good-on-ink); }
.ar-rung[data-state="done"] .ar-rung__tick { background: currentColor; }
.ar-rung[data-state="current"] { color: var(--ar-warn-on-ink); }
.ar-rung[data-state="current"] .ar-rung__tick::after {
  content: ""; position: absolute; inset: 3px; border-radius: 50%; background: currentColor;
}
@media (prefers-reduced-motion: reduce) { .ar-rung__btn { transition: none; } }
/* The next-step CTA: always a single centred line — clip with an ellipsis rather
   than wrap, since the check label that fills it varies in length. */
.ar-rail-next {
  /* The box is the words, not the row (his call, 2026-08-15). At width:100%
     the button spanned the card, so the tooltip fired anywhere along an empty
     line — and a pointer that far from the text has not asked for anything.
     max-content + auto margins keeps it centred; max-width:100% keeps the
     ellipsis below working when the label is long. */
  display: block; width: max-content; margin-inline: auto; text-align: center;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  /* Belt and braces with `.ar__rail > * { min-width: 0 }`: a button won't shrink past its
     own content unless told to, however roomy the box around it. */
  min-width: 0; max-width: 100%;
}
/* A per-post content gap has no in-app page to jump to, so the next-step reads as a
   plain informational line (no arrow, no link) rather than a click that goes nowhere. */
.ar-rail-next--info { margin: 11px auto 0; font-family: var(--ar-mono); font-size: 12px; color: color-mix(in srgb, var(--ar-paper) 50%, transparent); }

/* Dark variant of the Readiness rail card. Double class so it outranks the base
   .ar-rail-card background regardless of source order. Scheme-aware: on a
   non-default admin colour scheme PHP (Admin::scheme_css) re-declares --ar-ink
   on this card, the buttons and the editable chips — those dark surfaces take
   the scheme's flavour while the rest of the app keeps the designed palette. */
.ar-rail-card.ar-rail-card--readiness { background: var(--ar-ink); border-color: var(--ar-ink); }
.ar-rail-card--readiness .ar-rail-card__label { color: color-mix(in srgb, var(--rail-face) 50%, transparent); }
/* The label's gloss — dash-joined to the kicker on ONE line, masthead-and-tagline.
   Upright serif (the card's own title voice, honoured by every platform's stack),
   tracking and caps reset from the mono kicker it sits beside. */
.ar-rail-card__gloss {
  font-family: var(--ar-serif); font-style: normal; font-weight: 400;
  font-size: 12px; letter-spacing: 0; text-transform: none; white-space: nowrap;
  color: var(--ar-ink-faint);
}
/* 78%, not 52% (his call, 2026-08-15): the gloss is the line that says what
   the card IS, and at half-paper it read as disabled beside a kicker that had
   just taken the accent. */
/* 70% (his call, 2026-08-15) — the gloss and the score numeral now share one
   value, so the card's title line and its headline read as one voice. */
.ar-rail-card--readiness .ar-rail-card__gloss { color: color-mix(in srgb, var(--rail-face) 70%, transparent); }

/* Folded depth under a toggle's one-line description (Verify bot identities):
   the plain sentence stays; the methods paragraph waits behind the fold. */
.ar-toggle__more { margin: -6px 0 12px 54px; } /* 40px track + 14px gap = the toggle's text column. */
/* The summary is a block, so the linkbtn hover pill would stretch the full
   row (his catch, 2026-08-12) — shrink the box to its words and give a
   standing link the underline affordance instead, like the panel footers. */
.ar-toggle__more > summary { font-size: 12.5px; width: max-content; max-width: 100%; }
.ar-toggle__more > summary:hover,
.ar-toggle__more > summary:focus-visible {
  background: none;
  color: color-mix(in srgb, var(--ar-accent) 70%, var(--ar-ink));
}
.ar-toggle__more[open] > summary { margin-bottom: 7px; }
/* The unfolded depth sits in the same quiet inset the readiness fix-notes
   use: the raised tone, a hairline, and a reading measure — a card, not a
   loose paragraph bleeding into the section (his call, 2026-08-12). */
/* ⭐ `.ar-toggle__note` is the same box for a fold whose content is a LIST. ⛔ A
   <ul> inside <small> is invalid HTML — small is phrasing content — and the
   longest explanations on this screen are lists written as sentences, so they
   need an element that can legally hold one. */
.ar-toggle__more > small,
.ar-toggle__more > .ar-toggle__note {
  display: block;
  padding: 10px 14px;
  background: var(--ar-surface-2);
  border: 1px solid var(--ar-line);
  border-radius: 8px;
  font-size: 12.5px; line-height: 1.6; color: var(--ar-ink-soft);
}
.ar-toggle__more > small strong,
.ar-toggle__more > .ar-toggle__note strong { color: var(--ar-ink); }
.ar-toggle__note > p { margin: 0 0 8px; }
.ar-toggle__note > p:last-child { margin-bottom: 0; }
/* One line per item, so three ways of checking read as three things. */
.ar-toggle__note ul { margin: 0 0 8px; padding: 0 0 0 18px; display: grid; gap: 5px; }
.ar-toggle__note li { margin: 0; }
.ar-rail-card--readiness .ar-rail-gauge__track { stroke: color-mix(in srgb, var(--rail-face) 15%, transparent); }
/* (The gauge numeral was veiled to 62% paper here; the palette block below
   owns it now and gives it the card's full face.) */
.ar-rail-card--readiness .ar-rail-allgood { color: var(--rail-good); }
/* Brightened gauge tones for contrast on the dark card. */
.ar-rail-card--readiness .ar-rail-gauge__fill[data-tone="good"] { stroke: var(--rail-good); }
.ar-rail-card--readiness .ar-rail-gauge__fill[data-tone="ok"] { stroke: var(--ar-warn-on-ink); }
.ar-rail-card--readiness .ar-rail-gauge__fill[data-tone="low"] { stroke: var(--ar-bad-on-ink); }
.ar-rail-card--readiness .ar-rail-link { color: var(--ar-teal-on-ink); }
.ar-rail-card--readiness .ar-rail-link:hover { color: var(--ar-teal-on-ink-hover); }

/* ---- Toast (teleported to <body>, so no UI shift & viewport-fixed) ------- */
/* Self-contained: it lives outside #agentimus-app, so it can't rely on the CSS
   variables defined there — radius/font are hardcoded. */
/* Fixed top-right stack: toasts pile downward, newest at the bottom, each on its
   own dismiss timer. (top: 36px tucks into the nav-bar band below the wp-admin bar;
   right: 34px aligns with the content's right edge.) */
.ar-toasts {
  position: fixed; top: 36px; right: 34px; z-index: 100003; /* above the modal (100001), so a "copied"/"saved" toast is visible over an open dialog */
  display: flex; flex-direction: column; align-items: flex-end; gap: 10px;
  pointer-events: none;
}
.ar-toast {
  pointer-events: auto;
  display: flex;
  align-items: stretch;
  min-width: 268px;
  max-width: 400px;
  background: var(--ar-surface);
  border-radius: 8px;
  overflow: hidden;
  box-shadow: 0 14px 36px -10px color-mix(in srgb, var(--ar-shade) 42%, transparent), 0 0 0 1px color-mix(in srgb, var(--ar-shade) 6%, transparent);
  font-family: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace;
}
.ar-toast__bar { flex: 0 0 4px; background: var(--ar-ink-faint); }
.ar-toast__body { display: flex; flex-direction: column; gap: 3px; padding: 11px 15px; min-width: 0; }
.ar-toast__title {
  font-size: 11px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ar-ink);
}
.ar-toast__msg { font-size: 13px; line-height: 1.4; color: color-mix(in srgb, var(--ar-ink) 78%, var(--ar-paper)); }

.ar-toast.is-success .ar-toast__bar { background: var(--ar-good-strong); }
.ar-toast.is-success .ar-toast__title { color: var(--ar-good-deep); }
.ar-toast.is-error .ar-toast__bar { background: var(--ar-bad-strong); }
.ar-toast.is-error .ar-toast__title { color: var(--ar-bad-deep); }
.ar-toast.is-warning .ar-toast__bar { background: var(--ar-warn-mid); }
.ar-toast.is-warning .ar-toast__title { color: var(--ar-warn-deep); }
.ar-toast.is-info .ar-toast__bar { background: var(--ar-info-strong); }
.ar-toast.is-info .ar-toast__title { color: var(--ar-info-deep); }

/* Slide in from the right (right-to-left), out to the right. The leaving toast is
   taken out of flow so the survivors slide up smoothly via the move transition. */
.ar-toast-enter-active { transition: opacity 0.3s ease, transform 0.4s cubic-bezier(0.22, 1, 0.36, 1); }
.ar-toast-leave-active { transition: opacity 0.25s ease, transform 0.3s ease; position: absolute; right: 0; }
.ar-toast-move { transition: transform 0.3s ease; }
.ar-toast-enter-from, .ar-toast-leave-to { opacity: 0; transform: translateX(calc(100% + 24px)); }
@media (prefers-reduced-motion: reduce) {
  .ar-toast-enter-active, .ar-toast-leave-active, .ar-toast-move { transition: opacity 0.2s; }
  .ar-toast-enter-from, .ar-toast-leave-to { transform: none; }
}

/* ---- Body / cards ------------------------------------------------------- */
.ar__body { padding: 26px 34px; }
.ar__body.is-railed {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 286px;
  gap: 26px;
  align-items: start;
}
/* The column must be minmax(0,1fr), NOT the implied auto: an auto track sizes to its
   widest item's min-content, so ONE rigid leaf (a pre snippet, a nowrap row, a table)
   silently widens the track past a phone's viewport and the whole page pans sideways.
   minmax(0,1fr) pins the track to the container; overflow-x:clip is the backstop for
   any leaf that still can't shrink — it clips instead of panning the page (clip, unlike
   hidden, creates no scroll container, so sticky children keep working). */
.ar__main { display: grid; grid-template-columns: minmax(0, 1fr); gap: 22px; min-width: 0; overflow-x: clip; }
/* The same trap one level down: every single-column card stack re-declares its own
   grid, and each implied auto track would again size to its widest item — the About
   pre snippet proved one rigid leaf widens (then clips) EVERY sibling card on a
   phone. Pin them all. */
.ar-form, .ar-group, .ar-about, .ar-wd, .ar-act, .ar-aitraffic, .ar-preview, .ar-preview__group {
  grid-template-columns: minmax(0, 1fr);
}
/* And keep a <pre>'s intrinsic width out of ancestor sizing entirely: it can never
   wrap, so it must take its container's width and scroll inside it (the snippets all
   set overflow-x:auto). contain:inline-size zeroes its min-content contribution. */
#agentimus-app pre { min-width: 0; contain: inline-size; }
/* On wide screens the rail owns the endpoints list (the form's copy hides). */
.ar__body.is-railed .ar-card--endpoints { display: none; }

/* ---- Right rail --------------------------------------------------------- */
/* Rail sticks BELOW the now-sticky header (admin bar + the two 72px strips). It's only
   sticky above 900px (it goes static below), where the header is always exactly 144px. */
/* The rail sticks below the sticky header and flows with the page (no internal scroll
   or scrollbar) — the main column is always taller, so the whole rail stays reachable
   as you scroll. */
.ar__rail { position: sticky; top: calc(var(--ar-adminbar) + 2 * var(--ar-bar-h)); display: grid; gap: 11px; align-content: start; padding-bottom: 6px; }
/* A grid item's min-width defaults to `auto`, so it refuses to shrink below its content's
   min-content width — and a <button> ignores its own `overflow: hidden` when contributing
   to that minimum. So one long next-step label ("Next: AI Visibility is failing")
   made the readiness card WIDER than the rail column it lives in, and the dark card bled
   out over the page. The ellipsis on .ar-rail-next never got a chance to do its job.
   Letting the cards shrink to their column is what lets the label clip as intended. */
.ar__rail > * { min-width: 0; }

/* HOW LOUD THE RAIL READS (his call, 2026-08-15). One dial, inherited by every
   card in the column. On the light theme's ink card, paper at 88% is right.
   At night the same 88% of a near-white ink (#dde0e2) put this small mono type
   at 8.5:1 — technically fine, physically harsh: a column of filenames and
   rung labels glaring off a dark card. 74% lands at ~6.5:1, still well clear
   of AA for body text and no longer the brightest thing in the room. */
.ar__rail { --rail-read: 88%; }
:root[data-ar-theme="dark"] .ar__rail { --rail-read: 74%; }

.ar-rail-card {
  background: var(--ar-surface);
  border: 1px solid var(--ar-line);
  border-radius: var(--ar-radius);
  padding: 16px 18px;
}
.ar-rail-card__label {
  margin: 0 0 11px;
  font-family: var(--ar-mono);
  font-size: 10px;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  color: var(--ar-ink-faint);
}
.ar-rail-link {
  /* Margin, not padding: the 10px above the words is spacing from the rung
     list, and must not be part of what the pointer can hover. */
  appearance: none; background: none; border: 0; padding: 0; margin-top: 10px; cursor: pointer;
  font-family: var(--ar-mono); font-size: 12px; color: var(--ar-accent);
}
/* No underline-on-hover — feedback is the colour shift (brightened on the dark
   readiness card), so the next-step line reads as an affordance, not a hyperlink. */
.ar-rail-link:hover { color: var(--ar-ink-soft); }
.ar-rail-allgood { display: flex; align-items: center; justify-content: center; gap: 6px; margin: 9px 0 0; font-size: 12px; color: var(--ar-good); }
.ar-rail-allgood svg { flex: 0 0 auto; }
/* Registration status — its own compact one-line card, separate from the black card.
   Inherits .ar-rail-card (bg/border/radius) with tighter padding for a single row; the
   → is always visible. Green ✓ when valid, amber throughout when a registration breaks. */
.ar-rail-regcard {
  display: flex; align-items: center; gap: 9px; width: 100%;
  padding: 13px 18px; appearance: none; text-align: left; cursor: pointer;
  font-family: var(--ar-mono); font-size: 12.5px; color: var(--ar-ink-soft);
  transition: border-color 0.15s ease;
}
.ar-rail-regcard__icon { flex: 0 0 auto; }
.ar-rail-regcard__text { flex: 1; min-width: 0; }
.ar-rail-regcard__go { flex: 0 0 auto; color: var(--ar-ink-faint); }
.ar-rail-regcard.is-ok .ar-rail-regcard__icon { color: var(--ar-good); }
.ar-rail-regcard.is-alert { color: var(--ar-warn); }
.ar-rail-regcard.is-alert .ar-rail-regcard__icon,
.ar-rail-regcard.is-alert .ar-rail-regcard__go { color: var(--ar-warn); }
.ar-rail-regcard:hover { border-color: var(--ar-line-strong); }
.ar-rail-regcard:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; }
.ar-rail-links { margin: 0; padding: 0; list-style: none; display: grid; gap: 9px; }
.ar-rail-links a {
  display: inline-flex; align-items: center; gap: 7px;
  /* 88% ink, the same key the readiness card's rung labels are set at (his
     catch, 2026-08-15). At full ink these file names were as bright as the
     score numeral itself — the loudest thing in the rail was a list of
     filenames. One level for the whole rail. */
  font-family: var(--ar-mono); font-size: 12.5px; text-decoration: none;
  color: color-mix(in srgb, var(--ar-ink) var(--rail-read), transparent);
}
.ar-rail-links a::before { content: "↳"; color: var(--ar-accent); }
/* Every link here opens in a new tab — the ↗ answers the ↳ and says so up
   front. \FE0E pins the text glyph so no platform swaps in an emoji. */
/* Higher specificity than the app-wide outbound mark on purpose: this list
   draws its own ↗, at its own size, in its own ink. */
/* The doubled class is deliberate: this list draws its own ↗, at its own size
   and ink, and must outrank the app-wide outbound mark that comes later in
   this file — same specificity would have let source order decide. */
#agentimus-app .ar-rail-links.ar-rail-links a::after { content: "\2197\FE0E"; font-size: 10.5px; margin-left: 0; opacity: 1; vertical-align: baseline; color: var(--ar-ink-faint); transition: color 0.15s; }
.ar-rail-links a:hover { color: var(--ar-accent); }
.ar-rail-links a:hover::after { color: var(--ar-accent); }

/* Validation chip — compact at-a-glance status. The all-clear state lives here
   so it stops eating a half-empty card in the Discovery column; real issues get
   a tone + a one-click jump to the full list. */
.ar-rail-valid {
  appearance: none; width: 100%; padding: 0; border: 0; background: none; cursor: pointer;
  display: flex; align-items: center; gap: 9px; text-align: left;
}
.ar-rail-valid__check {
  display: inline-flex; align-items: center; justify-content: center;
  width: 22px; height: 22px; flex: 0 0 auto; border-radius: 50%;
  background: color-mix(in srgb, var(--ar-good) 12%, transparent); color: var(--ar-good);
}
.ar-rail-valid__text { font-size: 12.5px; color: var(--ar-ink); }
/* Arrow sits at the right edge and is the click affordance (no underline-on-hover,
   matching the rail's other links — the colour shift is the feedback). */
.ar-rail-valid__go { margin-left: auto; font-family: var(--ar-mono); font-size: 13px; color: var(--ar-ink-faint); transition: color 0.15s ease; }
.ar-rail-valid:hover .ar-rail-valid__go { color: var(--ar-accent); }
.ar-rail-valid:hover .ar-rail-valid__text { color: var(--ar-accent); }
/* Quiet maker credit BENEATH the last rail card — plain text on the page
   background (no card, no divider), dimmed, with a muted (not loud red) heart
   so it sits calmly in the restrained palette. */
.ar-rail-foot {
  display: flex; align-items: center; justify-content: center; gap: 10px;
  margin: 0 4px;
  font-size: 10px; line-height: 1.4; color: var(--ar-ink-faint);
}
/* Two short hairlines flanking the credit, each dissolving toward the outer edge. */
.ar-rail-foot::before,
.ar-rail-foot::after { content: ''; flex: 0 1 34px; height: 1px; }
.ar-rail-foot::before { background: linear-gradient(to right, transparent, currentColor); }
.ar-rail-foot::after { background: linear-gradient(to left, transparent, currentColor); }
.ar-rail-foot__text { flex: 0 0 auto; white-space: nowrap; }
.ar-rail-foot__heart { color: #d29991; }
/* Quiet self-link: reads as plain dimmed text, reveals it's a link only on
   intent (darkens + underlines on hover/focus). */
.ar-rail-foot__link {
  color: inherit; text-decoration: none; box-shadow: none;
}
.ar-rail-foot__link:hover,
.ar-rail-foot__link:focus-visible {
  color: var(--ar-ink); text-decoration: underline;
}
.ar-rail-card--validation.is-warn { border-color: color-mix(in srgb, var(--ar-warn) 45%, transparent); }
.ar-rail-card--validation.is-bad { border-color: color-mix(in srgb, var(--ar-bad) 45%, transparent); }
.ar-rail-valid__alert { padding: 0; font-size: 12.5px; line-height: 1.45; text-align: left; }
.ar-rail-card--validation.is-warn .ar-rail-valid__alert { color: var(--ar-warn); }
.ar-rail-card--validation.is-bad .ar-rail-valid__alert { color: var(--ar-bad); }
.ar-rail-card--validation .ar-rail-valid__alert:hover { color: var(--ar-ink-soft); }

.ar-btn--block { width: 100%; }
/* Stack the rail below the form when the panel gets narrow (sidebar-aware), so
   the Save block at its foot stays reachable. The rail keeps the endpoints, so
   the form's duplicate endpoints card stays hidden. */
@container (max-width: 900px) {
  .ar__body.is-railed { display: block; }
  .ar__rail { position: static; margin-top: 22px; max-height: none; overflow: visible; }
}

/* Mid widths: stack the header into two rows well before phone width. Nothing
   folds into More any more (his call: Readiness and Discovery were vanishing
   there, and a primary you cannot see is a primary you stop visiting), so one
   row stops fitting around ~1000px — the brand takes its own top row and every
   tab plus the controls share the row below. Structure only: the brand and the
   labels keep their desktop size until the ≤720 block condenses them. */
@container (max-width: 1024px) {
  .ar__bar {
    flex-wrap: wrap;
    align-items: center;
    /* Row-gap applies twice across the invisible break line → ~12px brand↔nav. */
    gap: 6px 16px;
    min-height: 0;
  }
  /* The brand→nav break becomes a full-width line break — but the CONTROLS
     jump it (his call: the circles were wrapping onto a row of their own
     below the tabs). Explicit order pulls them ahead of the break: row one is
     brand left + quill/bell/gear right (the controls' own margin-left:auto
     pins them), row two is the tab strip with More. */
  .ar__brand { order: 0; }
  .ar__controls { order: 1; }
  .ar__sep { order: 2; display: block; flex-basis: 100%; height: 0; margin: 0; }
  .ar__tabs { order: 3; }
  .ar__more { order: 4; }
  /* The quill→bell pull-in assumes the desktop bar's 26px gap (26−16 = 10px
     between the pills); this row's gap is 16px, where −16 left them TOUCHING.
     Ease it so the pair keeps the same 10px daylight here. */
  .ar__assist + .ar__review { margin-left: -6px; }
  /* Navbar row: all tabs stay on ONE line at the left, and if the viewport is
     narrower than the full strip it scrolls horizontally (scrollbar hidden)
     rather than wrapping a tab onto its own row. The bell stays pinned right. */
  .ar__tabs {
    /* `0 1 auto`, not `1 1 auto`. Growing made the strip's box stretch far past
       its last label, so More sat 16px after an EMPTY container edge and read as
       a much wider gap than the 16px between the tabs themselves. Hugging the
       content puts More the same distance from the last tab as that tab is from
       Dashboard. Shrink is still allowed, so a full strip scrolls as before. */
    flex: 0 1 auto; min-width: 0;
    flex-wrap: nowrap;
    overflow-x: auto;
    gap: 16px;
    justify-content: flex-start;
  }
  .ar__review { flex: 0 0 auto; align-self: center; }
}

/* Narrow widths: the two-row structure above holds; here the type and chrome
   condense so the whole strip fits typical small screens unscrolled. */
@container (max-width: 720px) {
  .ar__bar { padding: 11px 16px; }
  /* Condense the masthead: drop the version line and the arrow, shrink the
     mark + wordmark. */
  .ar__ver { display: none; }
  .ar__brandarrow { display: none; }
  .ar__mark { width: 26px; height: 26px; }
  .ar__logo { width: 16px; }
  .ar__name { font-size: 15px; }
  .ar__tab { letter-spacing: 0.07em; font-size: 10.5px; white-space: nowrap; }
  /* Phones: clamp the five nav labels harder so the last one (About) clears the
     bell instead of scrolling under it. Tighter tracking, smaller type, slimmer
     gaps + bar padding reclaim ~60px; the strip still scrolls below ~360px. */
  /* Slightly smaller bell so it reads as a peer of the tab labels, not a button
     looming over them. */
  .ar__review-btn { padding: 4px 7px; gap: 5px; }
  .ar__review-btn > svg:first-child { width: 13px; height: 13px; }
  /* The bell's count badge shrinks with its pill, so both
     badged controls still fit beside the quill on a phone. */
  .ar__review-count { min-width: 14px; height: 14px; font-size: 9px; padding: 0 3px; }
  /* Small screens: the nav above already wraps taller here, so the desktop
     height-lock pairing is moot — let the strip grow and show the whole
     tagline instead of ellipsis-truncating it. */
  .ar__pagehead { padding: 12px 16px; height: auto; min-height: var(--ar-bar-h); flex-wrap: wrap; row-gap: 10px; }
  .ar__pagehead-desc { white-space: normal; overflow: visible; text-overflow: clip; }
  /* The tools slot takes its own full-width row under the title (a wrapping
     flex row wraps before it shrinks — title and tools never share a line
     at phone width), and the jump menu stretches edge to edge. */
  .ar__pagehead-tools { flex: 1 1 100%; margin-left: 0; }
  .ar__pagehead-tools .ar-about-toc, .ar__pagehead-tools .ar-about-toc .ar-select { width: 100%; }
  .ar__pagehead-tools .ar-about-toc .ar-input { width: 100%; max-width: none; }
  .ar__body { padding: 20px 16px; }
}

/* Narrow phones: trim padding + the inter-tab gap floor so all five tabs + the
   bell fit one row. The labels keep their readable size — space-between (set in
   the ≤720 block) spreads them to fill the strip, so no extra type-shrinking is
   needed; the strip still scrolls below ~360px. */
@container (max-width: 460px) {
  .ar__bar { padding: 11px 12px; }
  .ar__tabs { gap: 8px; }
  .ar__tab { letter-spacing: 0.04em; }
  /* The icons would cost ~80px the all-five-tabs-on-one-row fit can't spare. */
  .ar__tab-ic { display: none; }
}

/* Mainstream small phones (~360–412): the readable size above would push ABOUT
   off the strip and scroll it under the bell. Tighten type + gap just enough that
   all five fit unscrolled here; space-between still spreads them to fill. */
@container (max-width: 430px) {
  .ar__bar { padding: 11px 8px; }
  .ar__tabs { gap: 3px; }
  .ar__tab { letter-spacing: 0; font-size: 9px; }
  .ar__review-btn { padding: 4px 6px; gap: 4px; }
  .ar__review-count { min-width: 13px; height: 13px; font-size: 8px; padding: 0 3px; }
}

.ar-card {
  position: relative;
  background: var(--ar-surface);
  border: 1px solid var(--ar-line);
  border-radius: var(--ar-radius);
  padding: 24px 26px;
}
.ar-card--muted { background: var(--ar-surface-2); }

/* The Advanced tab's closing zone (developer & maintenance): its cards wear the
   normal surface — this labeled hairline on the canvas marks the boundary. */
.ar-zonebreak { display: flex; align-items: center; gap: 12px; margin: 0; }
.ar-zonebreak span { font-family: var(--ar-mono); font-size: 9.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ar-ink-soft); white-space: nowrap; }
.ar-zonebreak::after { content: ""; flex: 1; border-top: 1px solid var(--ar-line); }

/* Once-per-release "What's new" card (plugin Dashboard only). A calm accent-tinted
   card, not an alert: the left accent bar + spark mark say "new", the grid keeps the
   highlights scannable, and the single Got-it dismiss makes it leave for good. */
.ar-whatsnew {
  margin-bottom: 18px; border-left: 3px solid var(--ar-accent);
  background: color-mix(in srgb, var(--ar-accent) 3%, var(--ar-surface));
}
.ar-whatsnew__head { display: flex; align-items: center; gap: 10px; }
.ar-whatsnew__spark {
  width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; flex: 0 0 auto;
  color: var(--ar-accent); background: color-mix(in srgb, var(--ar-accent) 9%, var(--ar-surface));
  border: 1px solid color-mix(in srgb, var(--ar-accent) 26%, var(--ar-surface));
}
.ar-whatsnew__title { margin: 0; font-family: var(--ar-serif); font-size: 18px; font-weight: 600; color: var(--ar-ink); }
.ar-whatsnew__tag {
  font-family: var(--ar-mono); font-size: 9px; font-weight: 600; letter-spacing: 0.05em; text-transform: uppercase;
  padding: 2px 7px; border-radius: 999px; color: var(--ar-accent);
  background: color-mix(in srgb, var(--ar-accent) 8%, var(--ar-surface));
  border: 1px solid color-mix(in srgb, var(--ar-accent) 28%, var(--ar-surface));
}
.ar-whatsnew__grid {
  display: grid; grid-template-columns: 1fr 1fr; gap: 14px 26px; margin-top: 16px;
}
.ar-whatsnew__itemtitle { display: block; font-size: 13.5px; color: var(--ar-ink); margin-bottom: 3px; }
.ar-whatsnew__itemtext { margin: 0; font-size: 12.5px; line-height: 1.55; color: var(--ar-ink-soft); }
.ar-whatsnew__foot { display: flex; align-items: center; justify-content: flex-end; gap: 16px; margin-top: 16px; }
.ar-whatsnew__gotit { font-size: 12.5px; padding: 7px 18px; }
@media (max-width: 720px) {
  .ar-whatsnew__grid { grid-template-columns: 1fr; }
}

/* The review ask — What's-New family: one row of words, one row of answers. */
.ar-reviewask { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 14px 24px; }
.ar-reviewask__body { display: flex; align-items: flex-start; gap: 12px; flex: 1 1 380px; }
.ar-reviewask__stars { color: var(--ar-warn-mid); font-size: 15px; letter-spacing: 2px; line-height: 1.7; white-space: nowrap; }
.ar-reviewask__title { margin: 0 0 4px; font-family: var(--ar-serif); font-size: 17px; font-weight: 600; color: var(--ar-ink); }
.ar-reviewask__text { margin: 0; font-size: 12.5px; line-height: 1.55; color: var(--ar-ink-soft); max-width: 640px; }
.ar-reviewask__actions { display: flex; align-items: center; gap: 16px; }

/* The in-admin changelog dialog body: one section per release, quiet version
   headings, readable note bullets. Rendered notes carry only server-made
   <strong>/<code>/<a> — escaped before formatting. */
.ar-chlog__entry { padding: 14px 0 4px; border-top: 1px solid var(--ar-line); }
.ar-chlog__entry:first-child { border-top: 0; padding-top: 4px; }
.ar-chlog__ver { margin: 0 0 8px; font-family: var(--ar-mono); font-size: 13px; font-weight: 700; color: var(--ar-ink); }
.ar-chlog__list { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.ar-chlog__note { font-size: 12.5px; line-height: 1.6; color: var(--ar-ink-soft); padding-left: 14px; position: relative; }
.ar-chlog__note::before { content: ''; position: absolute; left: 0; top: 0.62em; width: 5px; height: 5px; border-radius: 50%; background: var(--ar-accent); }
.ar-chlog__note strong { color: var(--ar-ink); }
.ar-chlog__note code {
  font-family: var(--ar-mono); font-size: 11.5px; padding: 0 4px; border-radius: 3px;
  background: var(--ar-surface-2); border: 1px solid var(--ar-line);
}

.ar-card__head { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
/* When the title + a row of buttons can't share a line, let the button group drop to
   its own row (labels stay on one line) rather than squeezing + wrapping mid-button. */
.ar-card__head--inline { flex-wrap: wrap; }
.ar-card__title {
  margin: 0 0 3px;
  font-family: var(--ar-serif);
  font-weight: 600;
  font-size: 19px;
  letter-spacing: -0.01em;
  color: var(--ar-ink);
}
/* The standfirst: a section's lead runs full width in the serif voice — visibly the
   section's own introduction (same family as its header), never mistakable for one
   more settings hint in the sans body. The masthead rule beneath it (a step stronger
   than the row hairlines) closes the header zone before the settings begin. */
.ar-card__lead {
  margin: 0 0 20px; padding-bottom: 14px; max-width: none;
  border-bottom: 1px solid var(--ar-line-strong);
  font-family: var(--ar-serif); font-size: 15px; line-height: 1.6;
  color: var(--ar-ink-soft);
}
/* Ruled head: when buttons share the header, the masthead rule moves from the
   lead to the head's OWN bottom edge — full card width, always below the
   buttons — and the lead keeps its tight old gap under the title. */
.ar-card__head--ruled { border-bottom: 1px solid var(--ar-line-strong); padding-bottom: 14px; margin-bottom: 20px; }
.ar-card__head--ruled .ar-card__lead { border-bottom: 0; padding-bottom: 0; margin: 0; }
/* (A full-width tinted band behind the header zone was tried and reverted: the tab strip
   already uses the secondary surface, so the panel opened as three stacked tinted strips,
   and the band's edge swallowed the masthead rule's contrast. Flat surface + rule wins.) */
/* Quiet aside that clarifies a control's scope (e.g. "advertises, not enforces").
 *
 * The BOX runs the full width of the card; the TEXT keeps an 88-character
 * reading measure. Those used to be the same thing — `max-width: 88ch` on the
 * element — which stopped a tinted, left-ruled panel at 56% of a 1188px card and
 * read as unfinished rather than as a measure. A filled box has an edge, and an
 * edge that lands nowhere looks like a mistake.
 *
 * So the measure moves into the padding: the right pad grows to eat whatever the
 * card has beyond 88ch, and `max()` floors it at the normal 12px once the card
 * is narrower than the measure — phones and half-width columns are untouched.
 * Percentage padding resolves against the containing block's inline size, which
 * for a block-level note IS the card's content width. */
.ar-card__note {
  margin: 14px 0 0; padding: 9px 12px;
  padding-right: max(12px, 100% - 88ch);
  border-left: 2px solid var(--ar-line-strong); border-radius: 0 var(--ar-radius) var(--ar-radius) 0;
  background: var(--ar-surface-2); color: var(--ar-ink-faint); font-size: 12px; line-height: 1.5;
}
.ar-card__note strong { color: var(--ar-ink-soft); font-weight: 600; }
.ar-card__note code { font-size: 11px; }
/* A note whose payload is a chip list wants the whole row, measure and all —
   chips wrap far better across the full width than inside a reading column. */
.ar-card__note--wide { padding-right: 12px; }
.ar-card__note--wide code { white-space: nowrap; }
/* Grouped panel for the AI opt-out channels published beyond robots.txt:
   a quiet inset card so the eyebrow + explainer + channel toggles read as one
   intentional unit rather than loose lines on the card. */
.ar-channels-panel {
  margin-top: 18px;
  padding: 15px 18px 16px;
  background: var(--ar-surface-2);
  border: 1px solid var(--ar-line);
  border-radius: var(--ar-radius);
}
.ar-channels-panel__head {
  display: flex; align-items: center; gap: 9px; margin-bottom: 9px;
  font-family: var(--ar-mono); font-size: 11px; font-weight: 600;
  letter-spacing: 0.08em; text-transform: uppercase; color: var(--ar-ink-soft);
}
.ar-channels-panel__head .ar-field__tag { margin: 0; }
.ar-channels-panel__lead { margin: 0; color: var(--ar-ink-soft); font-size: 13px; line-height: 1.55; }
.ar-channels-panel__note { margin: 9px 0 0; color: var(--ar-ink-faint); font-size: 12px; line-height: 1.5; }
.ar-channels-panel details { margin-top: 14px; padding-top: 13px; border-top: 1px solid var(--ar-line); }

/* Small scope chip next to a card title, e.g. "Last 30 days". */
.ar-card__tag {
  font-family: var(--ar-mono); font-size: 9.5px; letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--ar-ink-faint); border: 1px solid var(--ar-line-strong);
  padding: 2px 7px; border-radius: 999px; margin-left: 9px; vertical-align: 3px; white-space: nowrap;
}

/* Tabbed settings panel — the section nav is docked onto the top of a single
   content surface, so the tabs and the content read as one unit, not a floating
   control above separate cards. The active tab is white (the panel-body colour)
   with a top accent rule; its bottom edge drops over the tab-row border so the
   body merges seamlessly into it. */
.ar-tabpanel {
  /* Transparent shell: the masthead (tabs + headline) and each section card carry
     their own sheets, and wp-admin's real background shows in the gaps between them. */
  background: transparent;
  /* As a grid item of .ar__main, the default min-width:auto would refuse to
     shrink below the tab strip's intrinsic width — so once the tabs no longer
     fit (5+ tabs on a phone) the whole panel overflowed the viewport instead of
     the strip scrolling. min-width:0 lets it shrink to the column; the strip's
     own overflow-x:auto then scrolls, and the form body wraps to width. */
  min-width: 0;
}
/* Deliberately NOT a scroll container: overflow-x:auto here made the strip scrollable
   on BOTH axes (a trackpad swipe panned the tabs sideways, and the active tab's 1px
   overhang even let them shift vertically). The tabs share the row equally and
   compress to fit instead — the strip itself can never move. */
.ar-tabpanel__tabs {
  display: flex; gap: 0;
  background: var(--ar-surface); /* one tone with the active tab — selection reads from the accent bar and ink alone */
  border: 1px solid var(--ar-line);
  border-bottom: 1px solid var(--ar-line-strong); /* the strip's base rule must actually read */
  border-radius: var(--ar-radius) var(--ar-radius) 0 0;
}
.ar-subnav__item {
  appearance: none; cursor: pointer; background: transparent; border: 0;
  flex: 1 1 0; min-width: 0; white-space: nowrap; text-align: center;
  overflow: hidden; text-overflow: ellipsis; /* the label yields; the row never does */
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  padding: 14px 10px;
  font-family: var(--ar-mono); font-size: 11px; font-weight: 600;
  letter-spacing: 0.12em; text-transform: uppercase; color: var(--ar-ink-faint);
  transition: color 0.15s ease, background 0.15s ease;
}
/* Each tab's mark, bare before its label — inherits the label's ink, wakes to teal
   with the active tab. */
.ar-subnav__icon { display: inline-flex; flex: 0 0 auto; }
.ar-subnav__icon svg { width: 15px; height: 15px; display: block; }
.ar-subnav__item.is-active .ar-subnav__icon { color: var(--ar-accent); }
.ar-subnav__item + .ar-subnav__item { box-shadow: inset 1px 0 0 var(--ar-line); }
.ar-subnav__item:hover { color: var(--ar-ink-soft); }
.ar-subnav__item.is-active {
  color: var(--ar-ink); background: var(--ar-surface);
  box-shadow: inset 0 2px 0 0 var(--ar-accent);          /* top accent indicator */
  /* No merge trick: the strip's bottom rule runs unbroken under the active tab too —
     Heera's call (2026-07-19); the white fill + top accent already mark selection. */
}
/* The separator between tabs is a box-shadow, and the active tab's top accent
   is a box-shadow too — one property, so the active rule REPLACED the seam and
   the selected tab lost its own left edge (its neighbour still drew one, which
   is why only the right side survived). An active tab with a tab before it
   restates both shadows. */
.ar-subnav__item + .ar-subnav__item.is-active {
  box-shadow: inset 0 2px 0 0 var(--ar-accent), inset 1px 0 0 var(--ar-line);
}
.ar-subnav__item:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: -2px; }
/* On a phone, clamp the tabs further so all five labels stay whole on one row:
   smaller type, tighter tracking, slimmer padding. Anything narrower still and
   the longest labels ellipsize (see overflow above) — the row never scrolls. */
@media (max-width: 600px) {
  .ar-tabpanel__tabs .ar-subnav__item {
    padding: 12px 6px;
    font-size: 10px;
    letter-spacing: 0.02em;
  }
  .ar-tabpanel__tabs .ar-subnav__icon { display: none; } /* five labels must fit one row */
}

/* Transparent: wp-admin's real background shows between the masthead and the cards. */
.ar-tabpanel__body { min-width: 0; padding: 16px 0 0; }
/* Per-control save lock: only the switch/card the user just changed carries
   [data-busy] while ITS save is in flight — it dims and ignores further clicks,
   exactly like a button mid-action, while every other control stays live. We
   deliberately do NOT set a native [disabled] on the inputs: wp-admin's forms.css
   repaints a disabled checkbox as a bordered box (its :disabled rule out-specifies
   our hide), which leaked a stray border onto every switch.
   pointer-events must sit on the whole LABEL, not just the input: clicking a
   label-wrapped checkbox toggles it via label activation even when the input
   itself is pointer-events:none, so the card would still flip (and show its tick)
   while looking disabled. Locking the label blocks the click outright.
   Marked via a data-attribute, not a class: a `.ar-type` card carries a Vue
   `:class` (is-on) that Vue rewrites on the same change that starts the save, which
   would wipe a manually-added class — Vue leaves unknown attributes alone. */
.ar-toggle[data-busy],
.ar-type[data-busy] {
  cursor: default;
  opacity: 0.6;
  pointer-events: none;
  transition: opacity 0.12s ease;
}
/* Master-off lock: a child block whose master switch is off stays on screen — the page
   keeps its shape and the parent→child relationship stays visible — but it's `inert`
   (no mouse, no keyboard focus) and clearly asleep. Deeper dim than the busy-lock so
   "saving" and "disabled" never read as the same state. */
#agentimus-app [inert] { opacity: 0.45; }
/* A sleeping child switch also RENDERS off — teal in a disabled block reads as "this is
   still happening", and it isn't while the master is off. Presentation only: the saved
   value is untouched and shows again the moment the master turns back on. */
[inert] .ar-toggle input:checked + .ar-toggle__track,
.ar-toggle[inert] input:checked + .ar-toggle__track { background: var(--ar-line-strong); }
[inert] .ar-toggle input:checked + .ar-toggle__track::after,
.ar-toggle[inert] input:checked + .ar-toggle__track::after { transform: none; }
#agentimus-app .ar-webmcp-tools,
#agentimus-app .ar-enforce-body,
#agentimus-app .ar-card { transition: opacity 0.18s ease; }
/* The group's own headline — "Who owns this site" describes everything under the active
   tab, so it speaks in the serif voice with real ink: above the card titles in rank,
   never mistakable for one more hint. */
.ar-tabpanel__caption {
  margin: 0; padding: 13px 26px;
  /* Fluid: 18px on a desktop app column, easing to 15px on a phone (cqi = 1% of the
     app container's width, so the wp-admin sidebar is accounted for, unlike vw). */
  font-size: clamp(15px, 8px + 1.6cqi, 18px);
  font-family: var(--ar-serif); color: var(--ar-ink);
  /* Bottom half of the masthead sheet (the strip above completes the frame). */
  background: var(--ar-surface);
  border: 1px solid var(--ar-line); border-top: 0;
  border-radius: 0 0 var(--ar-radius) var(--ar-radius);
}

/* Inside the panel the cards drop their own frame and become segments of the one
   surface, divided by a hairline — so the whole thing reads as a single panel.
   Each group restarts the spec-sheet numbering (hidden groups are display:none,
   so they neither lay out nor count). */
.ar-group { display: grid; gap: 18px; counter-reset: arcard; }
/* Each section: its own complete card on wp-admin's gray — the base .ar-card look
   (surface, hairline frame, rounded corners) with real background showing in the
   gaps. (Hairlines, double rules, letterpress and slab variants were each tried on
   the way here; free-standing cards on the admin background won.) */
.ar-tabpanel .ar-card--muted { background: var(--ar-surface-2); }

/* WebMCP per-tool list, revealed under the Browser-tools master toggle. */
.ar-webmcp-tools { margin-top: 4px; margin-left: 22px; padding-top: 2px; border-top: 1px solid var(--ar-line); }
.ar-webmcp-tools__head { margin: 13px 0 0; font-size: 12px; color: var(--ar-ink-faint); }

/* MCP-server connection details, revealed under the MCP master toggle. */
.ar-mcp-connect { margin-top: 10px; padding-top: 18px; border-top: 1px solid var(--ar-line); }
.ar-mcp-connect__endpoint { display: flex; align-items: center; gap: 8px; margin: 8px 0 0; flex-wrap: wrap; }
.ar-mcp-connect__endpoint code { word-break: break-all; }

/* The connect helper: status strip, numbered steps, client picker (borrows the
   review-tabs look), the key row, and the ready-to-paste config. */

/* Status: a quiet fact bar, not a dashboard hero. The dot is the state. */
.ar-mcp-status {
  display: flex; align-items: baseline; justify-content: space-between; gap: 6px 16px;
  flex-wrap: wrap; margin: 12px 0 0; padding: 9px 12px;
  background: var(--ar-surface-2); border-radius: 9px;
}
.ar-mcp-status__state { margin: 0; font-size: 12.5px; color: var(--ar-ink-soft); display: flex; align-items: center; gap: 8px; }
.ar-mcp-status__dot { width: 8px; height: 8px; border-radius: 50%; background: var(--ar-ink-faint); flex: none; }
.ar-mcp-status__state[data-state="running"] { color: var(--ar-ink); }
.ar-mcp-status__state[data-state="running"] .ar-mcp-status__dot {
  background: var(--ar-good);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--ar-good) 18%, transparent);
}
.ar-mcp-status__state[data-state="unreachable"] .ar-mcp-status__dot { background: var(--ar-bad); }
.ar-mcp-status__state[data-state="unsaved"] .ar-mcp-status__dot { background: var(--ar-warn); }
.ar-mcp-status__last { margin: 0; font-size: 12px; color: var(--ar-ink-faint); }
.ar-mcp-status__last a { color: var(--ar-accent); text-decoration: none; white-space: nowrap; }
.ar-mcp-status__last a:hover { text-decoration: underline; }

/* Connection token — the primary connect path: one revocable secret, then a
   card per assistant. The cards stay visible (dimmed) before a token exists so
   the shape of the work is legible before the owner commits to anything. */
.ar-mcp-token__lead { margin: -4px 0 12px; }
.ar-mcp-scopes { display: flex; flex-direction: column; gap: 8px; margin-bottom: 14px; }
.ar-mcp-scope-opt {
  display: flex; gap: 10px; align-items: flex-start; padding: 10px 12px;
  border: 1px solid var(--ar-line); border-radius: var(--ar-radius);
  background: var(--ar-surface-2); cursor: pointer;
}
.ar-mcp-scope-opt.is-sel { border-color: var(--ar-accent); box-shadow: 0 0 0 1px var(--ar-accent); }
.ar-mcp-scope-opt.is-off { opacity: 0.6; cursor: default; }
.ar-mcp-scope-opt input { margin: 3px 0 0; flex: none; accent-color: var(--ar-accent); }
.ar-mcp-scope-opt__body { display: flex; flex-direction: column; gap: 2px; }
.ar-mcp-scope-opt__body strong { font-size: 12.5px; }
.ar-mcp-scope-opt__body small { font-size: 12px; color: var(--ar-ink-soft); }
.ar-mcp-token__actions { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin-top: 10px; }
.ar-mcp-token__once {
  margin: 12px 0; padding: 12px 14px; border-radius: var(--ar-radius);
  border: 1px solid var(--ar-warn); background: color-mix(in srgb, var(--ar-warn) 8%, var(--ar-surface));
}
.ar-mcp-token__row { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
.ar-mcp-token__value {
  font-family: var(--ar-mono); font-size: 12.5px; padding: 6px 10px; border-radius: var(--ar-radius);
  background: var(--ar-surface); border: 1px solid var(--ar-line-strong); word-break: break-all;
}
/* ---- MCP card: status rail, address hero, roster ---------------------- */
.ar-btn--small { padding: 7px 14px; font-size: 11px; }
.ar-mcp-eyebrow {
  font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.13em; text-transform: uppercase;
  color: var(--ar-ink-faint); margin: 0 0 8px;
}

/* One line of state: running · tools · last call · link to the log. */
.ar-mcp-rail {
  display: flex; align-items: center; gap: 9px; flex-wrap: wrap;
  padding: 10px 14px; background: var(--ar-surface-2);
  border: 1px solid var(--ar-line); border-radius: var(--ar-radius);
  font-size: 12.5px; color: var(--ar-ink-soft);
}
.ar-mcp-rail__dot { width: 8px; height: 8px; border-radius: 50%; background: var(--ar-line-strong); flex: none; }
.ar-mcp-rail[data-state="running"] .ar-mcp-rail__dot { background: var(--ar-good); }
.ar-mcp-rail[data-state="unreachable"] .ar-mcp-rail__dot { background: var(--ar-bad); }
.ar-mcp-rail[data-state="unsaved"] .ar-mcp-rail__dot { background: var(--ar-warn); }
.ar-mcp-rail strong { color: var(--ar-ink); }
.ar-mcp-rail__sep { color: var(--ar-line-strong); }
.ar-mcp-rail a { margin-left: auto; color: var(--ar-accent); text-decoration: none; white-space: nowrap; }
.ar-mcp-rail a:hover { text-decoration: underline; }

/* The address: with one-click approval this IS the setup, so it leads. */
.ar-mcp-addr { margin-top: 16px; }
.ar-mcp-addr__row { display: flex; gap: 8px; align-items: center; min-width: 0; }
.ar-mcp-addr__url {
  font-family: var(--ar-mono); font-size: 12.5px; background: var(--ar-surface-2);
  border: 1px solid var(--ar-line); border-radius: var(--ar-radius); padding: 10px 12px;
  flex: 1; min-width: 0; overflow-x: auto; white-space: nowrap;
}
.ar-mcp-addr__hint { margin-top: 9px; }

/* The roster — the loudest block: every key that opens the door. */
.ar-mcp-roster { margin-top: 22px; }
.ar-mcp-roster__head {
  font-family: var(--ar-serif); font-size: 17px; margin: 0 0 3px;
  display: flex; align-items: baseline; gap: 9px;
}
.ar-mcp-roster__count {
  font-family: var(--ar-mono); font-size: 10.5px; background: var(--ar-accent);
  color: var(--ar-paper); border-radius: 999px; padding: 1px 8px;
}
.ar-mcp-roster__count.is-zero { background: var(--ar-line-strong); color: var(--ar-ink-soft); }
.ar-mcp-roster__note { margin: 0 0 10px; }
.ar-mcp-roster__empty {
  border: 1px dashed var(--ar-line-strong); border-radius: var(--ar-radius);
  background: var(--ar-surface-2); padding: 16px; margin: 10px 0 0;
  text-align: center; font-size: 12.5px; color: var(--ar-ink-soft);
}
.ar-mcp-roster__empty strong { display: block; color: var(--ar-ink); font-size: 13.5px; margin-bottom: 2px; }

/* Setup help: one assistant at a time. */
.ar-mcp-picker { display: grid; grid-template-columns: repeat(auto-fill, minmax(148px, 1fr)); gap: 8px; margin: 10px 0 14px; }
.ar-mcp-pick {
  border: 1px solid var(--ar-line-strong); background: var(--ar-surface); color: var(--ar-ink);
  border-radius: var(--ar-radius); padding: 9px 11px; cursor: pointer; text-align: left;
  font-family: var(--ar-sans); font-size: 12.5px;
}
.ar-mcp-pick.is-on { border-color: var(--ar-accent); box-shadow: inset 0 0 0 1px var(--ar-accent); }
.ar-mcp-pick small { display: block; color: var(--ar-ink-faint); font-size: 11px; }
/* ── The edge panel (Request Log screen) ──────────────────────────────────────
   Conflicts pin ABOVE the log — same left-rule status-box grammar as the Agent
   Access states — and only exist while something actually disagrees. The edge
   cards themselves sit BELOW the log they annotate. */
.ar-edge-pins { display: grid; gap: 12px; }
.ar-edge-pin {
  padding: 14px 16px; border: 1px solid var(--ar-line); border-left-width: 3px;
  border-radius: 4px; background: var(--ar-surface-2);
}
.ar-edge-pin--warn { border-left-color: var(--ar-warn); }
.ar-edge-pin--info { border-left-color: var(--ar-info); }
.ar-edge-pin__badge {
  display: inline-block; font-family: var(--ar-mono); font-size: 9px;
  letter-spacing: 0.1em; text-transform: uppercase; padding: 2px 6px;
  border-radius: 3px; margin: 0 0 6px;
}
.ar-edge-pin--warn .ar-edge-pin__badge { color: var(--ar-warn); border: 1px solid var(--ar-warn-tint); background: var(--ar-warn-wash); }
.ar-edge-pin--info .ar-edge-pin__badge { color: var(--ar-info); border: 1px solid var(--ar-info-tint); background: var(--ar-info-wash); }
.ar-edge-pin__title { margin: 0 0 4px; font-size: 14px; font-weight: 600; color: var(--ar-ink); }
.ar-edge-pin__body { margin: 0 0 6px; font-size: 13px; line-height: 1.55; color: var(--ar-ink-soft); }
.ar-edge-pin__actions { display: flex; flex-wrap: wrap; gap: 6px 18px; align-items: baseline; }
/* The quiet exit: same link grammar as "Review", but faint — acting is the
   primary path, hiding is the deliberate second choice. */
.ar-edge-pin__hide { color: var(--ar-ink-faint); }
.ar-edge-pin__hide:hover { color: var(--ar-ink); }

/* One column that is ALLOWED to shrink. Left implicit ("auto"), the track sizes
   to its content, so the crawler table's 620px floor became every edge card's
   minimum width — and .ar__main's overflow-x:clip then cut the whole panel at
   the viewport edge on phones: lead text chopped mid-sentence, no scrollbar.
   minmax(0,1fr) pins the track to the screen, min-width:0 lets the cards obey
   it, and the wide table scrolls inside its own .ar-edge__scroll wrapper. */
.ar-edge { display: grid; grid-template-columns: minmax(0, 1fr); gap: 22px; }
.ar-edge > * { min-width: 0; }
.ar-edge__offlead { margin: 0; padding: 0; border-bottom: 0; }
/* The stat strip above ends flush; the table's heading needs its own air.
   Compound selector: .ar-ai__sub is defined LATER in this file, so a lone
   class here would lose the cascade and the heading would stay cramped. */
.ar-edge__sub.ar-ai__sub { margin: 26px 0 14px; }
.ar-edge__scroll { overflow-x: auto; }
/* The connected rail holds ONE line: fixed facts keep their width and never
   wrap; the zone name and a failure note — the only pieces of unbounded
   length — shrink behind an ellipsis instead of folding the rail. */
.ar-edge .ar-mcp-rail { flex-wrap: wrap; gap: 5px 7px; }
.ar-edge .ar-mcp-rail > * { flex: 0 0 auto; white-space: nowrap; }
.ar-edge .ar-mcp-rail .ar-edge__zone {
  flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis;
}
/* A failed poll is news, not a footnote: the warning always takes a full line
   of its own under the info line, wrapping like a sentence — never inline,
   never ellipsized. Its leading dot goes with it. */
.ar-edge .ar-mcp-rail .ar-warn { flex: 1 1 100%; white-space: normal; }
.ar-edge .ar-mcp-rail .ar-edge__sep-warn { display: none; }
.ar-edge__railbreak { display: none; }
/* Narrow containers can't hold every segment on one line — instead of letting
   the shrinkables crush to "h…", fold deliberately: identity line, action
   line, and the warning gets a full line of its own. 490 is the true limit:
   above it the healthy rail fits one line whole. */
@container (max-width: 490px) {
  .ar-edge .ar-mcp-rail .ar-edge__railbreak { display: block; flex-basis: 100%; height: 0; }
  .ar-edge .ar-mcp-rail .ar-edge__sep-upd { display: none; }
}
.ar-edge__n { text-align: right; padding-right: 26px !important; font-family: var(--ar-mono); font-size: 12.5px; font-variant-numeric: tabular-nums; }
.ar-edge__ico { display: none; }
/* Card-mode glyphs for the request tables — invisible in the wide tables. */
.ar-cardico { display: none; }
td.ar-edge__n { color: var(--ar-ink-soft); }
td.ar-edge__n.is-bad { color: var(--ar-bad); font-weight: 600; }
.ar-edge__op { color: var(--ar-ink-faint); font-size: 12px; }
.ar-edge__hot { color: var(--ar-warn); }
.ar-edge__subnote { margin: -6px 0 12px; }

/* ── Found by AI Search (Bing) — same shrink discipline as .ar-edge ─────── */
.ar-bing { display: grid; grid-template-columns: minmax(0, 1fr); gap: 22px; }
.ar-bing > * { min-width: 0; }
.ar-bing__offlead { margin: 0; padding: 0; border-bottom: 0; }
.ar-bing__sub.ar-ai__sub { margin: 26px 0 14px; }
.ar-bing__hot { color: var(--ar-warn); }
.ar-bing .ar-mcp-rail { flex-wrap: wrap; gap: 5px 7px; }
.ar-bing .ar-mcp-rail > * { flex: 0 0 auto; white-space: nowrap; }
.ar-bing .ar-mcp-rail .ar-bing__site { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.ar-bing .ar-mcp-rail .ar-warn { flex: 1 1 100%; white-space: normal; }
.ar-bing .ar-mcp-rail .ar-bing__sep-warn { display: none; }
/* The index trend: min→max scaled bars (the base is big, the moves are small —
   a zero-scaled chart would render as a flat wall). Newest bar full-ink. */
.ar-bing__trend { display: flex; align-items: flex-end; gap: 3px; height: 56px; margin: 0 0 6px; }
.ar-bing__bar {
  flex: 1 1 0; align-self: flex-end; background: var(--ar-accent); opacity: 0.82;
  border: 0; border-radius: 2px 2px 0 0; min-height: 2px; padding: 0;
  appearance: none; -webkit-appearance: none; cursor: pointer; transition: filter 0.15s ease;
}
.ar-bing__bar:last-child { opacity: 1; }
.ar-bing__bar:hover { filter: brightness(0.85); }
.ar-bing__bar.is-active { filter: brightness(0.7); opacity: 1; }
.ar-bing__bar:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; }
/* The day report's warn bars — errors and robots blocks read in the warn hue. */
.ar-act-rank__bar.ar-bing__bar--warn { background: var(--ar-warn); }
/* The Bing day report body: one full-width story. */
.ar-bing__daybody { min-width: 0; }
.ar-bing__daybody .ar-act-rank__label { flex: 0 0 200px; }
.ar-bing__cap { display: flex; justify-content: space-between; gap: 12px; font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.06em; color: var(--ar-ink-faint); }
/* Phones: 30 columns squeeze below a usable tap size, so the chart keeps its
   bars touch-wide and scrolls sideways instead — rtl scroller so it OPENS at
   the newest days, ltr inner so time still runs left → right (the dashboard
   charts' exact recipe). */
@container (max-width: 600px) {
  .ar-bing__scrollwrap { overflow-x: auto; direction: rtl; scrollbar-width: thin; padding-bottom: 4px; }
  .ar-bing__scrollwrap > * { direction: ltr; min-width: 100%; width: max-content; }
  .ar-bing__trend { gap: 4px; }
  .ar-bing__bar { min-width: 16px; }
}
/* ── In Google's Index (AI Visibility screen) ────────────────────────────────
   The Bing card's Google sibling: a watchlist of verdict rows, not a trend —
   Google's inspection API answers per URL, so the card speaks per page. */
.ar-gidx__offlead { margin: 0; padding: 0; border-bottom: 0; }
.ar-gidx .ar-mcp-rail { margin-top: 14px; }
.ar-gidx__quota { color: var(--ar-warn); }
.ar-gidx__hot { color: var(--ar-warn); }
/* One thin ratio track under the tiles: green = in, amber = out, red = check
   failed. The tiles carry the numbers; this carries the proportion at a glance. */
.ar-gidx__ratio {
  display: flex; height: 6px; margin: 10px 0 0; border-radius: 3px; overflow: hidden;
  background: var(--ar-surface-2); border: 1px solid var(--ar-line);
}
.ar-gidx__ratio-seg.is-ok { background: var(--ar-good); }
.ar-gidx__ratio-seg.is-warn { background: var(--ar-warn); }
.ar-gidx__ratio-seg.is-err { background: var(--ar-bad); }
/* The scope sentence, seated with the tiles it scopes. */
.ar-gidx__scope { margin: 8px 0 0; font-size: 12px; color: var(--ar-ink-faint); }
.ar-gidx__list { list-style: none; margin: 12px 0 0; padding: 0; }
.ar-gidx__row { padding: 12px 0; border-bottom: 1px solid var(--ar-line); }
.ar-gidx__row:last-child { border-bottom: 0; }
/* Three real columns — title | date | verdict — so every row's date and chip
   sit on the same vertical lines instead of trailing each title. */
/* One row = one line, four fixed lanes: title | date | door | chip. Fixed
   widths, not max-content — each row is its own grid, so only fixed lanes
   align ACROSS rows (max-content sized per-row is exactly the old zigzag). */
.ar-gidx__main { display: grid; grid-template-columns: minmax(0, 1fr) 150px 232px 104px; gap: 2px 16px; align-items: baseline; }
.ar-gidx__meta { display: contents; }
.ar-gidx__door { text-align: right; white-space: nowrap; }
.ar-gidx__page { display: inline-flex; align-items: baseline; gap: 8px; min-width: 0; }
/* A page title here IS a link out to the page — it has to read as one at
   rest, not only under the cursor. Ink made it identical to the prose beside
   it, so the only thing announcing the link was the pointer. */
.ar-gidx__title { font-size: 13px; color: var(--ar-accent); text-decoration: none; overflow-wrap: anywhere; }
.ar-gidx__title:hover { text-decoration: underline; }
.ar-gidx__crawl { font-size: 11px; color: var(--ar-ink-faint); white-space: nowrap; text-align: right; }
/* A fixed minimum makes every chip the same width, so both chip edges align
   down the column. */
.ar-gidx__chip {
  font-size: 11px; font-weight: 600; padding: 2px 8px; border-radius: 10px;
  border: 1px solid var(--ar-line); white-space: nowrap;
  min-width: 104px; text-align: center; justify-self: end;
}
.ar-gidx__chip.is-ok { color: var(--ar-good); border-color: color-mix(in srgb, var(--ar-good) 35%, var(--ar-line)); background: color-mix(in srgb, var(--ar-good) 8%, var(--ar-surface)); }
.ar-gidx__chip.is-warn { color: var(--ar-warn); border-color: color-mix(in srgb, var(--ar-warn) 40%, var(--ar-line)); background: color-mix(in srgb, var(--ar-warn) 9%, var(--ar-surface)); }
.ar-gidx__chip.is-err { color: var(--ar-bad); border-color: color-mix(in srgb, var(--ar-bad) 35%, var(--ar-line)); background: color-mix(in srgb, var(--ar-bad) 7%, var(--ar-surface)); }
.ar-gidx__chip.is-dim { color: var(--ar-ink-faint); }
.ar-gidx__note { margin: 4px 0 0; font-size: 12px; line-height: 1.5; grid-column: 1; min-width: 0; }
.ar-gidx__note.is-warn { color: var(--ar-warn); }
.ar-gidx__note.is-err { color: var(--ar-bad); }
/* The quiet door to Search Console — where "Request indexing" lives. */
/* No margin-left: the separator owns the spacing now that Re-check sits beside
   this, and a stray margin would push the pair off the lane's right edge. */
.ar-gidx__gsc { font-size: 11px; color: var(--ar-info); text-decoration: none; white-space: nowrap; }
.ar-gidx__gsc:hover { text-decoration: underline; }
/* Our record of the owner's own click, under the door it belongs to. Deliberately
   quiet and deliberately worded as a fact about them, not about Google: no API
   exposes whether an indexing request is pending, so this is the only claim
   anyone here can make truthfully. */
.ar-gidx__opened { display: block; margin-left: 10px; font-size: 10.5px; line-height: 1.6; color: var(--ar-ink-faint); white-space: nowrap; }
/* In the lookup box the live check sits UNDER the stored answer: the free
   answer comes first, and asking Google is the deliberate second step. */
.ar-gidx__checkrow { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin: 10px 0 0; }
.ar-gidx__checkhint { font-size: 11.5px; color: var(--ar-ink-faint); }
/* Both doors on ONE line — the reason the door lane above grew from 158px to
   232px. Stacked, this sat under the Search Console link as an orphan: a lone
   link dangling below another, adding a second line to every row in the card.
   Widening a FIXED lane is the honest fix (the width has to stay fixed or rows
   stop aligning with each other); the extra 74px comes out of the title, which
   is the only flexible lane and the one best able to give it up.

   Faint until hovered: every row has one, and a lane of live buttons would
   out-shout the verdicts beside them, which are why anyone is reading the row. */
.ar-gidx__recheck { margin-left: 0; font-size: 11px; color: var(--ar-ink-faint); text-decoration: none; }
.ar-gidx__recheck:hover:not(:disabled) { color: var(--ar-info); }
.ar-gidx__recheck:disabled { opacity: 0.55; cursor: default; }
/* The separator carries the same weight as the words it divides. */
.ar-gidx__doorsep { margin: 0 6px; font-size: 11px; color: var(--ar-line-strong); }
/* The whole-site section under the watchlist. */
.ar-gidx__siteeyebrow { margin-top: 24px; }
.ar-gidx__siteline { margin: 8px 0 0; font-size: 13px; line-height: 1.55; color: var(--ar-ink-soft); }
/* Problem groups: the state is a real heading with its count — the
   Opportunities group grammar — so rows below stop repeating it. */
.ar-gidx__group {
  margin: 18px 0 0; font-size: 13px; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.02em; color: var(--ar-ink);
}
.ar-gidx__groupcount {
  margin-left: 6px; font-weight: 600; font-size: 12px;
  color: var(--ar-warn);
}
.ar-gidx__list--grouped { margin-top: 4px; }
.ar-gidx__list--grouped .ar-gidx__row { padding: 9px 0; }
.ar-gidx__hoist { margin-top: 10px; }
.ar-gidx__gsc--cell { margin-left: 0; text-align: right; }
/* Registration health: one quiet line, amber only when the owner should act. */
.ar-gidx__sitemap { margin: 16px 0 0; font-size: 12px; color: var(--ar-ink-faint); }
.ar-gidx__sitemap.is-warn { color: var(--ar-warn); }
/* Section headers: eyebrow + the amber count pill (his crop's grammar). */
.ar-gidx__sec { display: flex; align-items: baseline; gap: 8px; margin-top: 22px; }
.ar-gidx__sec .ar-gidx__secname { margin: 0; }
.ar-gidx__seccount {
  font: 600 10.5px/1 var(--ar-mono); color: var(--ar-warn);
  background: color-mix(in srgb, var(--ar-warn) 10%, var(--ar-surface));
  border: 1px solid color-mix(in srgb, var(--ar-warn) 30%, var(--ar-line));
  border-radius: 9px; padding: 2px 7px;
}
.ar-gidx__group .ar-gidx__groupcount {
  margin-left: 6px; font: 600 10.5px/1 var(--ar-mono); color: var(--ar-warn);
  background: color-mix(in srgb, var(--ar-warn) 10%, var(--ar-surface));
  border: 1px solid color-mix(in srgb, var(--ar-warn) 30%, var(--ar-line));
  border-radius: 9px; padding: 2px 7px;
}
/* Google's exact phrase, once per group — the footnote promises "Google's
   own wording", so the plain-words heading must show its source. */
.ar-gidx__gsub { margin: 2px 0 0; font-size: 11px; color: var(--ar-ink-faint); }
/* The page lookup: stored answers only — styled like the house inputs. */
.ar-gidx__lookup { margin: 10px 0 0; display: flex; }
.ar-gidx__lookup input {
  flex: 1; min-width: 0; box-sizing: border-box; background: var(--ar-surface);
  border: 1px solid var(--ar-line-strong); border-radius: 3px 0 0 3px;
  padding: 7px 10px; font: inherit; color: var(--ar-ink);
}
.ar-gidx__lookup input:focus { outline: 2px solid var(--ar-accent); outline-offset: 1px; border-color: var(--ar-accent); }
/* The ask button rides the input's right edge as one control — a phone
   answers with a tap, not a hunt for the Enter key. The shared edge is the
   input's border; the button brings only its other three sides, so the seam
   stays 1px in every state. */
.ar-gidx__lookupbtn {
  flex: 0 0 auto; box-sizing: border-box; margin: 0;
  border: 1px solid var(--ar-line-strong); border-left: 0; border-radius: 0 3px 3px 0;
  background: var(--ar-surface-2); color: var(--ar-ink-soft);
  font: inherit; font-size: 12px; padding: 0 14px; cursor: pointer;
}
.ar-gidx__lookupbtn:hover { background: var(--ar-surface); color: var(--ar-ink); }
.ar-gidx__lookupbtn:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 1px; }
.ar-gidx__lookupbtn:disabled { cursor: default; opacity: 0.55; }
.ar-gidx__lookupmsg { margin-top: 8px; }
/* A failed Re-check, reported where the rows are — it can be clicked from any
   of them, so its error can't live inside the lookup box at the foot. */
.ar-gidx__checkerr { margin: 12px 0 0; }
.ar-gidx__lookuphint { margin: 6px 0 0; font-size: 11.5px; color: var(--ar-ink-faint); }

/* The ratio track rides INSIDE the tiles box, along its bottom edge — the
   1px grid gap above it reads as the divider, its own track fills the cell. */
.ar-wd-stats .ar-gidx__ratio {
  grid-column: 1 / -1;
  margin: 0;
  border: 0;
  border-radius: 0;
  height: 7px;
}

/* The problems-group collapsible — the Search screen's own fold, sized for
   this card: every heading carries its state's TRUE count; rows arrive only
   on demand, one stored-data page per turn. */
/* Wears the shared .ar-fold grammar (one fold for the plugin): its caret,
   its cursor, its focus ring, and the native marker suppressed — this group
   used to draw a second chevron of its own on the right while the browser's
   own triangle still showed on the left. */
.ar-gidx__grp { margin: 10px 0; }
/* An open group holds its height whatever a page carries — the rows scroll
   inside, the pagination stays pinned below the scroll. No overscroll
   containment: once the list hits its end the wheel must pass to the page,
   or the card becomes a trap the pointer has to escape from. */
.ar-gidx__scrollbox {
  max-height: 430px;
  overflow-y: auto;
  padding-right: 6px;
}
.ar-gidx__scrollbox.is-busy { opacity: 0.45; }
/* The always-open announcement list borrows the collapsibles' box, so the
   sections read as one family. */
.ar-gidx__rowsbox {
  margin-top: 10px;
  padding: 0 16px;
  border: 1px solid var(--ar-line-strong);
  border-radius: var(--ar-radius);
  background: var(--ar-surface-2);
}
/* Group-table footer: the range on the left, page controls bottom right. */
.ar-gidx__pagefoot {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 16px;
  border-top: 1px solid var(--ar-line);
  padding: 9px 0 3px;
}
.ar-gidx__range {
  font-family: var(--ar-mono);
  font-size: 11px;
  color: var(--ar-ink-faint);
  font-variant-numeric: tabular-nums;
}
.ar-gidx__pager { display: flex; align-items: center; gap: 4px; margin-left: auto; }
.ar-gidx__pager button {
  min-width: 26px;
  padding: 3px 6px;
  font-family: var(--ar-mono);
  font-size: 11.5px;
  font-variant-numeric: tabular-nums;
  color: var(--ar-info);
  background: var(--ar-surface);
  border: 1px solid var(--ar-line-strong);
  border-radius: 4px;
  cursor: pointer;
}
.ar-gidx__pager button:hover:not(:disabled):not([aria-current="page"]) { border-color: var(--ar-info); }
.ar-gidx__pager button[aria-current="page"] {
  background: var(--ar-info);
  border-color: var(--ar-info);
  color: var(--ar-surface);
  cursor: default;
}
.ar-gidx__pager button:disabled { color: var(--ar-ink-faint); cursor: default; }
.ar-gidx__pager button:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 1px; }
.ar-gidx__pgap { color: var(--ar-ink-faint); font-size: 11.5px; padding: 0 2px; }
/* Two matched cards close the section: the site-level pointers beside the
   per-page lookup. */
/* The machine facts between the rows and the lookup — a hairline sets them
   off from the rows above, and every line carries the right rail's ↳ mark:
   the same grammar LIVE ENDPOINTS uses for "a pointer to a machine's own
   record". Shared by both index cards (Google: Pages report + sitemap;
   Bing: sitemap + IndexNow). */
.ar-gidx__facts { margin-top: 18px; border-top: 1px solid var(--ar-line); padding-top: 2px; }
.ar-gidx__facts .ar-gidx__sitemap { margin-top: 10px; }
.ar-gidx__facts .ar-gidx__sitemap::before { content: "↳ "; color: var(--ar-ink-faint); }

/* The per-page question in its own full-width card, on both index cards —
   an input deserves a frame; two half-width boxes did not. A found row
   inside renders in the standard four-lane grammar; the narrow-form
   collapse died with the half-width box. */
.ar-gidx__lookupsec {
  margin-top: 18px;
  padding: 12px 16px 14px;
  border: 1px solid var(--ar-line-strong);
  border-radius: var(--ar-radius);
}
.ar-gidx__lookupsec .ar-gidx__secname { display: block; }
/* CONTAINER, not viewport: the admin menu eats ~160px, so a 760px window
   already leaves this card ~600px of room. A viewport media query kept the
   four-lane row grid alive in a container far too narrow for it. */
@container (max-width: 600px) {
  /* Tiles go 2×2 — four abreast crushed the labels into vertical shards. */
  .ar-gidx .ar-act-stats--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ar-gidx .ar-wd-stat strong { white-space: nowrap; }
  /* Rows in three lines: title, then date + verdict, then the doors.
     Every position is stated rather than left to auto-placement, because the
     doors span the full width and auto-placement never goes back for the chip —
     it would land on a fourth line of its own. Explicit rows also mean a row
     with no note simply has no fourth line.

     The doors get their own line because there are two of them now: sharing a
     max-content lane with the date crushed the 1fr title lane to nothing and
     the date printed straight through "Re-check". */
  .ar-gidx__main { grid-template-columns: minmax(0, 1fr) max-content; }
  .ar-gidx__page { grid-column: 1 / -1; grid-row: 1; }
  .ar-gidx__crawl { grid-column: 1; grid-row: 2; text-align: left; }
  .ar-gidx__chip { grid-column: 2; grid-row: 2; }
  .ar-gidx__door { grid-column: 1 / -1; grid-row: 3; text-align: left; white-space: normal; }
  .ar-gidx__opened { margin-left: 0; }
  .ar-gidx__note { grid-column: 1 / -1; grid-row: 4; }
}

/* Settings: the two setup steps breathe — the first eyebrow was hugging the
   connection rail. */
#ar-sec-bing .ar-mcp-eyebrow { margin-top: 24px; }
/* Settings: the printed-tag confirmation box. */
.ar-bing__code {
  font-family: var(--ar-mono); font-size: 12px; color: var(--ar-ink-soft);
  background: var(--ar-surface-2); border: 1px solid var(--ar-line); border-radius: 6px;
  padding: 8px 11px; margin: 8px 0 0; overflow-x: auto; white-space: nowrap;
}
/* The Settings warnings ledger — every active conflict pin, readable, minus
   the Hide action. Sits under the Disconnect button; the top hairline is PART
   of the block, so it exists only when pins do. */
.ar-cf-hiddenblk { margin: 18px 0 4px; padding-top: 16px; border-top: 1px solid var(--ar-line); }
.ar-cf-hiddenblk .ar-edge-pins { margin-top: 12px; }
.ar-cf-hiddenmark { font-size: 11.5px; color: var(--ar-ink-faint); }
.ar-edge__conduct { list-style: none; margin: 0; padding: 0; }
.ar-edge__conduct li {
  display: flex; align-items: center; gap: 10px; padding: 7px 0;
  border-bottom: 1px solid var(--ar-line); font-size: 13px;
}
.ar-edge__conduct li:last-child { border-bottom: 0; }
.ar-edge__tag {
  font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.1em;
  text-transform: uppercase; padding: 3px 9px; border-radius: 3px;
  min-width: 52px; text-align: center; flex: none;
}
.ar-edge__tag--pass { color: var(--ar-good); border: 1px solid var(--ar-good-tint); background: var(--ar-good-wash); }
.ar-edge__tag--warn { color: var(--ar-warn); border: 1px solid var(--ar-warn-tint); background: var(--ar-warn-wash); }
.ar-edge__who { color: var(--ar-ink); }
.ar-edge__what { color: var(--ar-ink-soft); font-size: 12.5px; }

/* The Cloudflare connect row (Data sources group): field + button on one line,
   button shortened to the filter-bar height so the pair reads as one control. */
.ar-cf-row { display: flex; gap: 8px; margin: 14px 0 8px; }
.ar-cf-row .ar-input { flex: 1; }
/* Choosing the downloaded file beats pasting 2 KB of JSON: one control, one
   line, and the file name confirms the right thing was picked. */
.ar-google__pick { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin: 12px 0 4px; }
.ar-google__choose { position: relative; overflow: hidden; cursor: pointer; }
.ar-google__file { position: absolute; inset: 0; opacity: 0; cursor: pointer; width: 100%; }
.ar-google__filename { font-family: var(--ar-mono); font-size: 11.5px; color: var(--ar-ink-soft); overflow-wrap: anywhere; }
.ar-google__pastelink { font-size: 12px; }
/* The paste fallback keeps its monospace shape for the rare hand-paste. */
.ar-google__key { font-family: var(--ar-mono); font-size: 11.5px; line-height: 1.5; resize: vertical; min-height: 62px; width: 100%; margin-top: 4px; }
.ar-google__connect { margin-top: 4px; }
/* Reads the pasted key back to the owner: the one address Search Console needs,
   lifted out of the JSON so nobody has to go hunting in it. */
.ar-google__found {
  margin: 10px 0 4px; padding: 12px 14px; border-radius: 8px;
  background: color-mix(in srgb, var(--ar-good) 7%, var(--ar-surface));
  border: 1px solid color-mix(in srgb, var(--ar-good) 28%, transparent);
}
.ar-google__found-lead { margin: 0; font-size: 12.5px; line-height: 1.55; color: var(--ar-ink-soft); }
/* The "this is safe and small" line, before the steps that look intimidating. */
.ar-google__reassure { margin-top: 12px; }
.ar-google__reassure strong { color: var(--ar-ink); }
.ar-google__found-lead strong { color: var(--ar-ink); }
.ar-google__found-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 7px 0; }
.ar-google__email {
  font-family: var(--ar-mono); font-size: 12px; color: var(--ar-ink);
  background: var(--ar-paper); border: 1px solid var(--ar-line); border-radius: 5px;
  padding: 4px 9px; overflow-wrap: anywhere;
}

/* ---- Search Performance (AI Visibility → beside Found by AI Search) ------ */
.ar-perf__head { display: flex; align-items: flex-start; gap: 16px; flex-wrap: wrap; }
.ar-perf__head > div:first-child { flex: 1 1 320px; min-width: 0; }
/* The engine switch sits at the head's bottom edge — just above the masthead
   rule — rather than floating top-right with dead air under it. */
.ar-perf__head .ar-srcpick { align-self: flex-end; }
/* The asking strip — one slim band under the masthead: what the button will do
   on the left, the button on the right, and the engine's refusal underneath.
   ⚠️ Search Opportunities shares .ar-perf__head and .ar-srcpick and has no
   engine to call, so it gets no strip; everything here is scoped to its own
   classes and adds nothing to that card. */
.ar-perf__strip {
  margin: 14px 0 0; padding: 9px 13px;
  display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap;
  background: var(--ar-surface-2); border: 1px solid var(--ar-line); border-radius: 8px;
}
/* The sentence that used to be a tooltip — and the seat the engine's refusal
   takes over when there is one. ⚠️ ONE line either way: the calm text and the
   refusal share this slot precisely so the strip never grows and the tiles
   below never move. */
.ar-perf__stripsay { margin: 0; flex: 1 1 320px; min-width: 0; font-size: 12.5px; line-height: 1.45; color: var(--ar-ink-soft); overflow-wrap: anywhere; }
.ar-perf__ask { flex: 0 0 auto; white-space: nowrap; }
/* The whole band answers when the news is bad, so the warning is not one lonely
   red line in an otherwise unchanged box. */
.ar-perf__strip.is-warn { border-color: var(--ar-warn-tint); background: var(--ar-warn-wash); }
.ar-perf__strip.is-warn .ar-perf__stripsay { color: var(--ar-warn); }
/* A readable measure: on a wide admin this lead ran nearly the whole card
   and the eye lost the line ends. ~72ch is the serif's comfortable width. */
.ar-perf__head .ar-card__lead { max-width: 72ch; }
/* The source picker — shared by Search Performance and Search Opportunities,
   so "whose numbers am I looking at?" is answered the same way in both rooms. */
.ar-srcpick { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.ar-srcpick__label { font-size: 12px; color: var(--ar-ink-soft); }
/* One-source state: the engine named in the switch's seat — a label, not a
   disabled-looking button. */
.ar-srcpick__solo { font-size: 12.5px; font-weight: 700; color: var(--ar-ink); }
.ar-srcpick__set { display: flex; gap: 0; border: 1px solid var(--ar-line); border-radius: 999px; overflow: hidden; }
.ar-srcpick__btn {
  appearance: none; background: var(--ar-surface); border: 0; cursor: pointer;
  font-size: 12px; color: var(--ar-ink-soft); padding: 5px 14px;
}
.ar-srcpick__btn.is-on { background: var(--ar-ink); color: var(--ar-paper); font-weight: 600; }
.ar-srcpick__btn:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: -2px; }
/* The provenance line: plain words, always visible, never a footnote. */
.ar-srcline { margin: 12px 0 0; font-size: 12.5px; color: var(--ar-ink-soft); }
.ar-srcline strong { color: var(--ar-ink); }
.ar-perf__empty { margin: 14px 0 0; font-size: 13px; color: var(--ar-ink-soft); }
.ar-perf__tiles { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin: 16px 0 0; }
.ar-perf__tile {
  background: var(--ar-surface); border: 1px solid var(--ar-line); border-radius: 8px;
  padding: 12px 14px; display: flex; flex-direction: column; gap: 3px; min-width: 0;
}
.ar-perf__label {
  font-family: var(--ar-mono); font-size: 9.5px; letter-spacing: 0.12em;
  text-transform: uppercase; color: var(--ar-ink-faint);
}
.ar-perf__num { font-size: 21px; font-weight: 650; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; }
/* One plain sentence under each figure — the difference between a number and a
   number someone understands. */
.ar-perf__hint { font-size: 11px; line-height: 1.35; color: var(--ar-ink-faint); }
.ar-perf__meta { margin: 8px 0 0; font-family: var(--ar-mono); font-size: 10.5px; color: var(--ar-ink-faint); }
.ar-perf__cols { display: grid; grid-template-columns: 1fr 1fr; gap: 22px; margin-top: 18px; }
.ar-perf__col { min-width: 0; }
.ar-perf__eyebrow {
  margin: 0 0 6px; font-family: var(--ar-mono); font-size: 10.5px;
  letter-spacing: 0.1em; text-transform: uppercase; color: var(--ar-ink);
}
.ar-perf__table { border-collapse: collapse; width: 100%; table-layout: fixed; }
.ar-perf__table th {
  text-align: right; font-family: var(--ar-mono); font-weight: 400; font-size: 9.5px;
  letter-spacing: 0.1em; text-transform: uppercase; color: var(--ar-ink-faint);
  padding: 0 0 4px 12px; border-bottom: 1px solid var(--ar-line); width: 4.6em;
}
.ar-perf__table th:first-child { text-align: left; padding-left: 0; width: auto; }
.ar-perf__table td {
  padding: 6px 0 6px 12px; border-bottom: 1px solid var(--ar-line);
  text-align: right; font-variant-numeric: tabular-nums; font-size: 12px; white-space: nowrap;
}
.ar-perf__table tr:last-child td { border-bottom: 0; }
.ar-perf__table td.ar-perf__q {
  text-align: left; padding-left: 0; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; color: var(--ar-ink);
}
.ar-perf__page { color: var(--ar-ink); text-decoration: none; }
/* Same rule as every other page title that links out: coloured at rest, not
   only once the cursor finds it. Scoped to the anchor — the untitled fallback
   beside it is a plain span and must stay ink. */
a.ar-perf__page { color: var(--ar-accent); }
.ar-perf__page:hover { text-decoration: underline; }
.ar-perf__n--dim { color: var(--ar-ink-faint); }
.ar-perf__table td.ar-perf__none { text-align: left; padding-left: 0; color: var(--ar-ink-faint); font-size: 12px; white-space: normal; }
.ar-perf__probe {
	display: inline-block;
	margin-left: 6px;
	padding: 0 5px;
	border: 1px solid var(--ar-line, #ddd);
	border-radius: 9px;
	color: var(--ar-ink-faint, #777);
	font-size: 10.5px;
	line-height: 15px;
	letter-spacing: .03em;
	text-transform: uppercase;
	vertical-align: 1px;
}
.ar-perf__foot { margin: 8px 0 0; color: var(--ar-ink-faint, #777); font-size: 12px; }
/* The two-reports notice borrows the edge-pin grammar; only the seat is ours. */
.ar-perf__pin { margin-top: 12px; }
.ar-perf__pin .ar-edge-pin__body { margin-bottom: 0; }
.ar-perf__probeline { margin-bottom: 4px; }
@container (max-width: 720px) {
  .ar-perf__tiles { grid-template-columns: 1fr 1fr; }
  .ar-perf__cols { grid-template-columns: 1fr; gap: 18px; }
}

/* ---- Search Opportunities (Readiness → sibling of Optimize) -------------- */
.ar-opp__state { margin: 4px 0 2px; }
/* The provenance line and the scope note sit tight together (both describe where
   these numbers came from); the finding below is a different kind of statement, so
   it gets real air rather than stacking into one undifferentiated block. */
.ar-opp__noise { margin: 13px 0 0; }
/* The disclosure is the audit trail for a filter that removed real numbers, so it
   wears the weight of a record: a full-width bordered card that opens in place —
   the same language as the Settings folds — not a pill floating between
   paragraphs with its contents spilling straight onto the page. */
/* THE FOLD. One disclosure grammar for the whole plugin: a filled, bordered bar
   with a solid caret, ink-coloured and semibold, that goes accent under the
   pointer. Written first for the noise list, and shared the day a fold drawn as
   a faint caret beside quiet text turned out to be unfindable — a control has to
   look like a control before anyone can learn what it opens. */
.ar-fold {
	margin: 14px 0 16px;
	padding: 0 16px;
	font-size: 12.5px;
	border: 1px solid var(--ar-line-strong);
	border-radius: var(--ar-radius);
	background: var(--ar-surface-2);
}
.ar-fold[open] { background: var(--ar-surface); padding-bottom: 13px; }
.ar-fold > summary {
	display: flex;
	align-items: center;
	gap: 9px;
	padding: 11px 0;
	color: var(--ar-ink);
	font-size: 13px;
	font-weight: 600;
	cursor: pointer;
	/* Both are needed to drop the native marker: `display` handles WebKit, the
	   list-style pair handles Firefox. We draw our own caret so it can rotate. */
	list-style: none;
	flex-wrap: wrap;
	transition: color .15s ease;
}
.ar-fold > summary::-webkit-details-marker { display: none; }
.ar-fold > summary::before {
	content: "";
	width: 0;
	height: 0;
	border-left: 5px solid currentColor;
	border-top: 4px solid transparent;
	border-bottom: 4px solid transparent;
	transition: transform .15s ease;
}
.ar-fold[open] > summary::before { transform: rotate(90deg); }
.ar-fold > summary:hover { color: var(--ar-accent); }
.ar-fold > summary:focus-visible {
	outline: 2px solid var(--ar-accent);
	outline-offset: 2px;
}
.ar-fold[open] > summary {
	border-bottom: 1px solid var(--ar-line);
	margin-bottom: 12px;
}
@media (prefers-reduced-motion: reduce) {
	.ar-fold > summary,
	.ar-fold > summary::before { transition: none; }
}

.ar-opp__noiselist .ar-opp__qwrap { margin-top: 0; }
.ar-opp__noiselist .ar-opp__queries { margin-top: 0; }
/* The dropped searches ARE operator syntax — set them in mono so the list itself
   shows why each row is here. */
.ar-opp__noiselist td.ar-opp__q { font-family: var(--ar-mono); font-size: 11px; }
.ar-opp__noisefoot {
	margin: 0;
	padding-top: 10px;
	border-top: 1px solid var(--ar-line);
	color: var(--ar-ink-soft);
	font-size: 12px;
	line-height: 1.55;
}
.ar-opp__noise code,
.ar-opp__noisefoot code {
	font-size: 0.92em;
	padding: 1px 4px;
	border-radius: 3px;
	background: var(--ar-surface-2, rgba(0, 0, 0, .05));
	white-space: nowrap;
}
/* The provenance line sits on the group's own grid row, with the switch pushed
   to the far edge so "whose numbers?" and "show the other one" read as one idea. */
/* Plain prose since the engine switch moved up into the masthead — as a flex
   row, the gap split the sentence around its own <strong>. */
.ar-opp__srcline { margin-top: 0; }
/* Sits directly under the provenance line it qualifies — tighter than the 12px
   .ar-srcline default, so the two read as one statement about these numbers. */
.ar-opp__scope { margin-top: 4px; }
.ar-opp__eyebrow {
  margin: 16px 0 2px; font-family: var(--ar-mono); font-size: 10.5px;
  letter-spacing: 0.1em; text-transform: uppercase; color: var(--ar-ink);
}
.ar-opp__why { margin-left: 8px; letter-spacing: 0.04em; text-transform: none; color: var(--ar-ink-faint); }
/* The two worklist groups are the structure of this section, so their headers
   speak a tier above the table eyebrows: a real heading plus the SAME rank pill
   the rows below carry — the header explains its group's chips before the
   reader meets them. The set-aside ledger stays on the quiet eyebrow tier on
   purpose. */
.ar-opp__grouphead { display: flex; align-items: center; gap: 9px; margin: 18px 0 0; }
.ar-opp__grouptitle {
  margin: 0; font-size: 13px; font-weight: 700; letter-spacing: 0.05em;
  text-transform: uppercase; color: var(--ar-ink);
}
.ar-opp__groupwhy { margin: 3px 0 0; font-size: 12.5px; color: var(--ar-ink-soft); }
.ar-opp__list { margin-top: 6px; }
/* The instruction under each group heading: the difference between "here is a
   problem" and "here is what to do about it". It wears a quiet card — the
   NEUTRAL surface, not the amber of the warn pills, because this is guidance,
   not a warning. */
.ar-opp__todo {
  margin: 8px 0 0; padding: 10px 14px;
  font-size: 12.5px; line-height: 1.55; color: var(--ar-ink-soft);
  background: var(--ar-surface-2); border: 1px solid var(--ar-line);
  border-radius: var(--ar-radius);
  text-align: justify; hyphens: auto; -webkit-hyphens: auto;
}
.ar-opp__todo strong { color: var(--ar-ink); }
.ar-opp__body { min-width: 0; grid-column: 2 / -1; }
.ar-opp__top { display: flex; align-items: baseline; gap: 9px; flex-wrap: wrap; }
.ar-opp__title { font-weight: 650; font-size: 13px; color: var(--ar-ink); text-decoration: none; }
/* Only the anchor takes the link colour. The same class dresses a plain
   <span> when a card has no edit_url, and colouring that too would promise a
   link that is not there — the exact fault this fixes, pointing the other way. */
a.ar-opp__title { color: var(--ar-accent); }
a.ar-opp__title:hover { text-decoration: underline; }
.ar-opp__path {
  font-family: var(--ar-mono); font-size: 10.5px; color: var(--ar-ink-soft);
  background: var(--ar-surface); border: 1px solid var(--ar-line); border-radius: 4px; padding: 1px 6px;
  max-width: 34ch; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* "This page is on the other worklist too" — amber, because it is a nudge to
   combine two visits, not a fault of its own. */
.ar-opp__alsoflag {
  font-size: 10.5px; color: var(--ar-warn); white-space: nowrap;
  background: color-mix(in srgb, var(--ar-warn) 12%, transparent);
  border: 1px solid color-mix(in srgb, var(--ar-warn) 30%, transparent);
  border-radius: 999px; padding: 1px 9px;
}
/* "Your side is done." Stated on the card itself, in the neutral ink — it is a
   status, and a status wearing a warning colour is just another thing to fix. */
/* The group's own "nothing to do" note, in the neutral ink the individual
   waiting cards use — a group with no work must not shout in the colour a
   group with work uses. */
.ar-opp__todo--waiting { color: var(--ar-ink-soft); }

.ar-opp__waiting {
  display: flex; gap: 8px; align-items: baseline; margin: 8px 0 0;
  padding: 8px 11px; border-radius: 5px;
  background: var(--ar-surface-2); border: 1px solid var(--ar-line);
  font-size: 12px; line-height: 1.5; color: var(--ar-ink-soft);
}
.ar-opp__waiting-mark { color: var(--ar-ink-faint); font-size: 11px; flex: none; }

.ar-opp__qwrap { overflow-x: auto; margin-top: 8px; }
.ar-opp__queries { border-collapse: collapse; width: 100%; min-width: 520px; }
.ar-opp__queries th {
  text-align: right; font-family: var(--ar-mono); font-weight: 400; font-size: 9.5px;
  letter-spacing: 0.1em; text-transform: uppercase; color: var(--ar-ink-faint);
  padding: 0 0 4px 16px; border-bottom: 1px solid var(--ar-line);
}
.ar-opp__queries th:first-child { text-align: left; padding-left: 0; }
.ar-opp__queries td {
  padding: 6px 0 6px 16px; border-bottom: 1px solid var(--ar-line);
  text-align: right; font-variant-numeric: tabular-nums; font-size: 12px; white-space: nowrap;
}
.ar-opp__queries tr:last-child td { border-bottom: 0; }
/* Element-qualified to outrank `.ar-opp__queries td` above (class+element beats
   a lone class) — without it the query text right-aligns with the numbers. */
/* The search column absorbs ALL the slack, so the numeric columns stay grouped at
   the right instead of being spread evenly across a wide card — on a 1900px screen
   an even split puts each figure ~400px from the label it belongs to, and the row
   stops reading as one record. */
.ar-opp__queries td.ar-opp__q,
.ar-opp__queries th:first-child { width: 100%; }
.ar-opp__queries td.ar-opp__q { text-align: left; padding-left: 0; white-space: normal; color: var(--ar-ink); }
.ar-opp__queries th:not(:first-child),
.ar-opp__queries td:not(.ar-opp__q) { white-space: nowrap; }
.ar-opp__num.is-dim { color: var(--ar-ink-faint); }
.ar-opp__num.is-low { color: var(--ar-warn); font-weight: 650; }
.ar-opp__pos {
  display: inline-block; min-width: 40px; text-align: center; border-radius: 999px;
  font-family: var(--ar-mono); font-size: 10.5px; padding: 1px 7px;
}
.ar-opp__pos.is-two { color: var(--ar-warn); background: color-mix(in srgb, var(--ar-warn) 14%, transparent); }
.ar-opp__pos.is-one { color: var(--ar-good); background: color-mix(in srgb, var(--ar-good) 14%, transparent); }
.ar-opp__more { margin: 6px 0 0; font-size: 11.5px; color: var(--ar-ink-faint); }

/* ---- Split searches (collisions): one query card per split, page rows with
   the winner chipped and the losers each holding exactly one decision. The
   share bar is proportion of the query's showings — same data as the number
   beside it, drawn so the imbalance is visible at a glance. */
.ar-clsn { margin-top: 26px; }
.ar-clsn__card {
  margin-top: 12px; padding: 13px 16px 6px;
  border: 1px solid var(--ar-line); border-radius: var(--ar-radius);
}
.ar-clsn__head {
  display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap;
  padding-bottom: 9px; border-bottom: 1px solid var(--ar-line);
}
.ar-clsn__q { font-size: 13.5px; font-weight: 600; color: var(--ar-warn); }
.ar-clsn__tot { font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-faint); }
.ar-clsn__row {
  display: flex; align-items: center; gap: 16px; padding: 11px 0;
  border-bottom: 1px solid var(--ar-line);
}
.ar-clsn__row:last-of-type { border-bottom: 0; }
.ar-clsn__main { flex: 1 1 auto; min-width: 0; }
.ar-clsn__t { font-size: 13px; color: var(--ar-accent); text-decoration: none; overflow-wrap: anywhere; }
.ar-clsn__t:hover { text-decoration: underline; }
.ar-clsn__path { display: block; margin-top: 1px; font-family: var(--ar-mono); font-size: 10.5px; color: var(--ar-ink-faint); overflow-wrap: anywhere; }
.ar-clsn__nums { flex: 0 0 auto; display: flex; gap: 18px; font-family: var(--ar-mono); font-size: 10.5px; color: var(--ar-ink-soft); text-align: right; }
.ar-clsn__nums b { display: block; font-size: 13px; color: var(--ar-ink); font-weight: 600; }
.ar-clsn__bar { flex: 0 0 auto; width: 110px; height: 5px; border-radius: 3px; background: var(--ar-surface-2); overflow: hidden; }
.ar-clsn__bar i { display: block; height: 100%; background: var(--ar-accent); opacity: 0.75; }
.ar-clsn__win {
  flex: 0 0 auto; font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--ar-good);
  border: 1px solid var(--ar-good-tint); border-radius: 999px; padding: 3px 10px;
}
.ar-clsn__acts { flex: 0 0 auto; display: flex; gap: 8px; }
.ar-clsn__act {
  font-family: var(--ar-mono); font-size: 10.5px; letter-spacing: 0.05em;
  text-transform: uppercase; color: var(--ar-ink-soft); background: none;
  border: 1px solid var(--ar-line-strong); border-radius: 5px;
  padding: 5px 11px; cursor: pointer; text-decoration: none; white-space: nowrap;
}
.ar-clsn__act:hover:not(:disabled) { color: var(--ar-accent); border-color: var(--ar-accent); }
.ar-clsn__act:disabled { opacity: 0.5; cursor: default; }
/* Narrow: the row stacks — page, numbers, then the verdict or the decision. */
@container (max-width: 720px) {
  .ar-clsn__row { flex-wrap: wrap; gap: 8px 16px; }
  .ar-clsn__main { flex-basis: 100%; }
  .ar-clsn__bar { display: none; }
}
.ar-opp__actions { display: flex; align-items: center; gap: 10px; margin-top: 9px; flex-wrap: wrap; }
/* Doorless cards (no post behind the URL) say WHY they offer no editor buttons,
   in the same quiet voice as the totals line — sits left of the Set aside. */
.ar-opp__noeditor { font-size: 11.5px; color: var(--ar-ink-faint); }
/* Plain links, not pills (his call): this is a row in a worklist, and a border
   per action dressed these as buttons when they only open the editor. */
.ar-opp__edit {
  font-size: 12px; color: var(--ar-accent); text-decoration: none;
}
.ar-opp__edit:hover { text-decoration: underline; }
/* The action most likely to move the number carries a little more weight. */
.ar-opp__edit.is-primary { font-weight: 600; }
.ar-opp__actions .ar-optcheck__restore { margin-left: auto; }
/* The Opportunities masthead's right column: workload count on top, the engine
   switch at the head's bottom edge — the same seat it holds on Search
   Performance next door. */
.ar-opp-card__side { display: flex; flex-direction: column; align-items: flex-end; justify-content: space-between; gap: 8px; align-self: stretch; }
.ar-opp-card__count { font-family: var(--ar-mono); font-size: 13px; font-weight: 600; color: var(--ar-warn); }
/* The card left the checkgroup grammar but kept its check-row lists — restore
   the flush seams the checkgroup parent used to provide. */
.ar-opp-card .ar-checks { margin-top: 0; border-top: 0; }
.ar-cf-row .ar-btn { padding: 9px 22px; }
.ar-cf-note { margin-top: 18px; }
.ar-mcp-recipe { border-left: 2px solid var(--ar-accent); padding: 2px 0 2px 14px; }
.ar-mcp-recipe__steps { margin: 0 0 10px; padding-left: 18px; font-size: 13px; color: var(--ar-ink-soft); }
.ar-mcp-recipe__steps li { margin-bottom: 4px; }
.ar-mcp-adv__aside { color: var(--ar-ink-faint); font-size: 12px; font-weight: 400; }
.ar-mcp-apppw { margin-top: 22px; }

/* Connected agents — one row per approved OAuth grant. */
.ar-grants { list-style: none; margin: 12px 0 0; padding: 0; border-top: 1px solid var(--ar-line); }
.ar-grant {
  display: flex; align-items: center; gap: 12px; min-width: 0;
  padding: 12px 2px; border-bottom: 1px solid var(--ar-line);
}
.ar-grant__dot { width: 8px; height: 8px; border-radius: 50%; background: var(--ar-good); flex: none; }
.ar-grant__dot.is-idle { background: var(--ar-line-strong); }
.ar-grant__who { min-width: 0; }
.ar-grant__who strong { font-size: 13.5px; }
.ar-grant__who small { display: block; font-size: 12px; color: var(--ar-ink-faint); }
.ar-grant__host { font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-faint); margin-left: 8px; }
/* How this key got in — the same three nouns the card's intro sentence uses:
   approval, token, application password (that one in its own section). */
.ar-grant__how {
  font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.05em; text-transform: uppercase;
  color: var(--ar-ink-faint); margin-left: 8px; border: 1px dotted var(--ar-line-strong);
  border-radius: 999px; padding: 1px 7px; white-space: nowrap;
}
/* Pills and buttons are fixed-width columns — the widest label ("Read · Write",
   "Disconnect") sets the size for every row, so both edges line up down the list. */
.ar-grant__scope {
  margin-left: auto; flex: none; font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.06em;
  text-transform: uppercase; border: 1px solid var(--ar-line-strong); border-radius: 999px;
  padding: 2px 9px; color: var(--ar-ink-faint); white-space: nowrap;
  min-width: 104px; text-align: center;
}
.ar-grant__scope.is-write { border-color: var(--ar-good); color: var(--ar-good); }
/* The shared token wears a different colour from an approved connection: one
   secret many assistants can hold is a different kind of thing. */
.ar-grant__scope.is-token { border-color: var(--ar-warn); color: var(--ar-warn); }
.ar-grant .ar-btn--small { min-width: 140px; }
@media screen and (max-width: 782px) {
  .ar-grant { flex-wrap: wrap; }
  .ar-grant__scope { margin-left: 20px; }
}

.ar-mcp-token__state { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; margin: 12px 0 2px; font-size: 12.5px; }
.ar-mcp-token__state span:not(.ar-mcp-token__dot) { color: var(--ar-ink-soft); }
.ar-mcp-token__dot { width: 8px; height: 8px; border-radius: 50%; background: var(--ar-good); flex: none; }
.ar-mcp-token__used { margin: 0; font-size: 12px; color: var(--ar-ink-faint); }
.ar-mcp-token__used a { color: var(--ar-accent); text-decoration: none; white-space: nowrap; }
.ar-mcp-token__used a:hover { text-decoration: underline; }

.ar-mcp-cards { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-top: 16px; }
@media screen and (max-width: 782px) { .ar-mcp-cards { grid-template-columns: 1fr; } }
.ar-mcp-cards.is-waiting .ar-mcp-card { opacity: 0.72; }
.ar-mcp-card {
  border: 1px solid var(--ar-line); border-radius: var(--ar-radius); background: var(--ar-surface-2);
  padding: 12px 14px; display: flex; flex-direction: column; gap: 8px; min-width: 0;
}
.ar-mcp-card.is-soon { border-style: dashed; opacity: 0.66; }
.ar-mcp-card__title { margin: 0; font-size: 13px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.ar-mcp-card__kind {
  font-size: 10px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--ar-ink-faint); border: 1px solid var(--ar-line-strong); padding: 1px 6px; border-radius: 999px;
}
.ar-mcp-card__soon { margin: 0; font-size: 12px; color: var(--ar-warn); font-weight: 600; }
.ar-mcp-card__steps { margin: 0; padding-left: 18px; font-size: 12px; color: var(--ar-ink-soft); display: flex; flex-direction: column; gap: 3px; }
.ar-mcp-card__copyrow { display: flex; gap: 8px; align-items: center; min-width: 0; margin-top: auto; }
.ar-mcp-card__code {
  font-family: var(--ar-mono); font-size: 11px; background: var(--ar-surface);
  border: 1px solid var(--ar-line); padding: 5px 8px; border-radius: var(--ar-radius);
  flex: 1; min-width: 0; overflow-x: auto; white-space: nowrap;
}
.ar-mcp-card__deeplink { text-decoration: none; }

/* Numbered steps — small circled figures, distinct from the card counters. */
.ar-mcp-step { margin-top: 18px; }
.ar-mcp-step__head { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; margin: 0 0 9px; font-size: 12.5px; font-weight: 600; color: var(--ar-ink); }
.ar-mcp-step__n {
  width: 20px; height: 20px; flex: none; display: inline-flex; align-items: center; justify-content: center;
  border-radius: 50%; border: 1px solid var(--ar-line-strong);
  font-family: var(--ar-mono); font-size: 11px; font-weight: 400; color: var(--ar-ink-soft);
}
.ar-mcp-step .ar-rev-tabs { margin-top: 0; }
.ar-mcp-step .ar-mcp-key { margin-top: 0; }

/* One primary action; the raw config a click away. */
.ar-mcp-copyrow { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.ar-mcp-copybtn { padding-left: 22px; padding-right: 22px; }

/* The live test: verdicts as a quiet list, colored marks only. */
.ar-mcp-test { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.ar-mcp-test__list { margin: 10px 0 0; padding: 0; list-style: none; display: grid; gap: 5px; }
.ar-mcp-test__list li { font-size: 12.5px; color: var(--ar-ink-soft); display: flex; gap: 8px; align-items: baseline; }
.ar-mcp-test__list li[data-state="fail"] { color: var(--ar-ink); }
.ar-mcp-test__mark { font-weight: 700; flex: none; }
.ar-mcp-test__list li[data-state="ok"] .ar-mcp-test__mark { color: var(--ar-good); }
.ar-mcp-test__list li[data-state="fail"] .ar-mcp-test__mark { color: var(--ar-bad); }

/* The raw facts, boxed — these folds hold real settings (setup recipes, the
   shared token, application passwords), so they wear the weight of settings:
   a bordered card each, not a footnote line. */
.ar-mcp-adv {
  margin-top: 12px; padding: 0 16px;
  border: 1px solid var(--ar-line-strong); border-radius: var(--ar-radius);
  background: var(--ar-surface-2);
}
.ar-mcp-adv[open] { background: var(--ar-surface); padding-bottom: 16px; }
.ar-mcp-adv summary { cursor: pointer; padding: 13px 0; font-size: 13px; font-weight: 600; color: var(--ar-ink); }
.ar-mcp-adv summary:hover { color: var(--ar-accent); }
.ar-mcp-adv[open] > summary { border-bottom: 1px solid var(--ar-line); margin-bottom: 14px; }

.ar-mcp-tabs { margin: 8px 0 0; }
.ar-mcp-key { margin-top: 10px; }
/* Two labelled paths, side by side: the normal one (mint a key) and the rare
   one (a password saved at creation). Separate columns, so the name field
   visibly belongs to "create" and not to a pasted password. */
.ar-mcp-key__paths { display: flex; gap: 14px 34px; flex-wrap: wrap; align-items: flex-start; }
.ar-mcp-key__path { flex: 1 1 320px; min-width: 280px; }
.ar-mcp-key__pathlabel {
  display: flex; align-items: center; gap: 10px;
  margin: 0 0 8px; font-family: var(--ar-mono); font-size: 10.5px; font-weight: 600;
  letter-spacing: 0.08em; text-transform: uppercase; color: var(--ar-ink-faint);
}
.ar-mcp-key__row { display: flex; align-items: stretch; gap: 8px; flex-wrap: wrap; }
/* .ar-input's width:100% (declared later) would blow each input onto its own
   line inside the flex row, so the row pins its own widths. */
.ar-mcp-key__row .ar-mcp-key__name { width: auto; flex: 1 1 170px; min-width: 140px; }
/* The row stretches everything to the tallest item (the inputs), so the button
   only needs its horizontal padding — height comes from the row. */
.ar-mcp-key__create { padding-top: 0; padding-bottom: 0; padding-left: 18px; padding-right: 18px; }
.ar-mcp-key__pastewrap { position: relative; display: inline-flex; flex: 1 1 220px; min-width: 200px; }
.ar-mcp-key__pastewrap .ar-mcp-key__paste { width: 100%; padding-right: 40px; font-family: var(--ar-mono); font-size: 12px; }
/* Icon-only copy, nested in the field's right edge; swaps to a check when done. */
.ar-mcp-key__copy {
  position: absolute; top: 50%; right: 5px; transform: translateY(-50%);
  display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 30px; padding: 0; border: 0; border-radius: 7px;
  background: transparent; color: var(--ar-ink-faint); cursor: pointer;
}
.ar-mcp-key__copy:hover { color: var(--ar-ink); background: var(--ar-surface-2); }
.ar-mcp-key__copy:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 1px; }
.ar-mcp-key__copy.is-copied { color: var(--ar-good); }
.ar-mcp-key__err { color: var(--ar-bad); }
/* The duplicate-name case: a compact amber flag beside the path label; the full
   story (why, and what to do) lives one "?" away in a small dialog. */
.ar-mcp-key__taken {
  display: inline-flex; align-items: center; gap: 6px;
  font-family: var(--ar-sans); font-size: 12px; font-weight: 600;
  letter-spacing: 0; text-transform: none; color: var(--ar-warn);
}
.ar-mcp-key__whybtn {
  display: inline-flex; align-items: center; justify-content: center;
  width: 16px; height: 16px; padding: 0; border-radius: 50%;
  border: 1px solid color-mix(in srgb, var(--ar-warn) 55%, transparent);
  background: transparent; color: var(--ar-warn);
  font-size: 10.5px; font-weight: 700; line-height: 1; cursor: pointer;
}
.ar-mcp-key__whybtn:hover { background: color-mix(in srgb, var(--ar-warn) 14%, transparent); }
.ar-mcp-key__whybtn:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 1px; }
/* Informational variant — teal, for standing facts rather than warnings. */
.ar-mcp-key__whybtn--info {
  border-color: color-mix(in srgb, var(--ar-accent) 55%, transparent);
  color: var(--ar-accent);
}
.ar-mcp-key__whybtn--info:hover { background: color-mix(in srgb, var(--ar-accent) 12%, transparent); }

/* The key-scope fact, riding the step-2 head: always visible, one glance,
   full story behind the "?". Sans and lighter than the head it sits in. */
.ar-mcp-scope {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 12px; font-weight: 400; color: var(--ar-ink-soft);
}
.ar-mcp-scope strong { font-weight: 600; color: var(--ar-ink); }
/* position:relative pins the copy button inside the dark block's top-right, so it
   stays put while the <pre> scrolls horizontally under it. */
.ar-mcp-snippet { position: relative; margin-top: 10px; }
.ar-mcp-snippet__code { margin: 0; }
.ar-mcp-snippet__copy { position: absolute; top: 8px; right: 8px; }

/* Numbered sections inside the settings form, spec-sheet style. */
.ar-form { counter-reset: arcard; display: grid; gap: 22px; }
.ar-form .ar-card { counter-increment: arcard; }
.ar-form .ar-card .ar-card__title::before {
  content: counter(arcard, decimal-leading-zero);
  margin-right: 12px;
  font-family: var(--ar-mono);
  font-size: 12px;
  font-weight: 400;
  color: var(--ar-accent);
  vertical-align: 3px;
}

/* ---- Toggles ------------------------------------------------------------ */
.ar-toggle {
  display: flex; align-items: flex-start; gap: 14px;
  padding: 13px 0; border-top: 1px solid var(--ar-line);
  /* The switch and its NAME toggle the setting; the rest of the row does not. The row is a
     <label>, so natively every pixel of it flips the checkbox — including the hint, which
     runs to two lines and which you may well be trying to select or to click a link inside.
     So the row opts out of pointer events and the two parts that should respond opt back in.
     Keyboard focus/activation and the label→input association (the screen-reader name) are
     unaffected: pointer-events is mouse/touch only. */
  cursor: default; pointer-events: none;
}
.ar-toggle:first-of-type { border-top: 0; padding-top: 2px; }
.ar-toggle input { position: absolute; opacity: 0; width: 0; height: 0; }
.ar-toggle__track {
  position: relative; flex: 0 0 auto; width: 40px; height: 22px; margin-top: 1px;
  background: var(--ar-line-strong); border-radius: 999px; transition: background 0.18s;
  pointer-events: auto; cursor: pointer; /* the one part of the row that flips it. */
}
.ar-toggle__track::after {
  content: ""; position: absolute; top: 2px; left: 2px;
  width: 18px; height: 18px; background: #fff; border-radius: 50%;
  transition: transform 0.18s; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
}
.ar-toggle input:checked + .ar-toggle__track { background: var(--ar-accent); }
.ar-toggle input:checked + .ar-toggle__track::after { transform: translateX(18px); }
.ar-toggle input:focus-visible + .ar-toggle__track { outline: 2px solid var(--ar-accent); outline-offset: 2px; }
/* Links inside a hint stay clickable; the busy-lock still disables the switch mid-save. */
.ar-toggle a { pointer-events: auto; }
.ar-toggle[data-busy] .ar-toggle__track,
.ar-toggle[data-busy] .ar-toggle__text strong { pointer-events: none; }
.ar-toggle__text { display: flex; flex-direction: column; gap: 1px; }
/* The setting's name is a second hit target for the switch beside it — a small control
   deserves a big label. The hint below stays inert, so selecting it or following a link in
   it can't flip the setting by accident. */
.ar-toggle__text strong {
  font-size: 14px; font-weight: 600;
  pointer-events: auto; cursor: pointer;
  align-self: flex-start; /* don't stretch the hit area across the row's full width. */
}
.ar-toggle__text small { color: var(--ar-ink-soft); font-size: 12px; }
/* A child switch that only exists because the switch above it is on. The indent comes
   from the wrapper (.ar-webmcp-tools / .ar-enforce-body), so depth compounds for a
   grandchild; this modifier shrinks the switch itself so the subordination reads at
   a glance. */
.ar-toggle--nested .ar-toggle__track { width: 34px; height: 19px; }
.ar-toggle--nested .ar-toggle__track::after { width: 15px; height: 15px; }
.ar-toggle--nested input:checked + .ar-toggle__track::after { transform: translateX(15px); }
.ar-toggle--nested .ar-toggle__text strong { font-size: 13px; }

/* "Check an IP" tool (AI Access) — a quiet inset utility below the verification toggles. */
.ar-ipcheck { margin: 4px 0 2px; padding: 14px 15px; border-radius: 9px; background: var(--ar-surface-2); border: 1px solid var(--ar-line); }
.ar-ipcheck__head { font-size: 13px; font-weight: 600; color: var(--ar-ink); }
.ar-ipcheck__intro { margin: 3px 0 10px; font-size: 12px; line-height: 1.5; color: var(--ar-ink-soft); }
.ar-ipcheck__row { display: flex; gap: 8px; max-width: 460px; }
.ar-ipcheck__input {
  flex: 1 1 auto; min-width: 0; font-family: var(--ar-mono); font-size: 12.5px; color: var(--ar-ink);
  padding: 7px 10px; border-radius: 7px; border: 1px solid var(--ar-line-strong); background: var(--ar-surface);
}
.ar-ipcheck__input:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 0; border-color: var(--ar-accent); }
.ar-ipcheck__btn {
  appearance: none; cursor: pointer; white-space: nowrap; font-family: var(--ar-sans); font-size: 12.5px; font-weight: 600;
  color: var(--ar-on-signal); background: var(--ar-accent); padding: 7px 15px; border-radius: 7px; border: 1px solid var(--ar-accent);
  transition: opacity 0.12s ease;
}
.ar-ipcheck__btn:hover:not(:disabled) { opacity: 0.9; }
.ar-ipcheck__btn:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; }
.ar-ipcheck__btn:disabled { opacity: 0.5; cursor: default; }
.ar-ipcheck__result { display: flex; flex-direction: column; gap: 2px; margin: 11px 0 0; font-size: 12.5px; line-height: 1.5; max-width: 560px; }
.ar-ipcheck__result strong { font-weight: 700; }
.ar-ipcheck__result span { color: var(--ar-ink-soft); }
.ar-ipcheck__result.is-ok strong { color: var(--ar-good); }
.ar-ipcheck__result.is-danger strong { color: var(--ar-bad); }
.ar-ipcheck__result.is-muted strong { color: var(--ar-ink); }

/* Exposure tab: WordPress debug posture — a subtle green line when fine, a prominent
   amber/red card when debug logging/display is left on in production. */
.ar-dbgcard { margin: 2px 0 16px; }
.ar-dbgcard.is-pass { font-size: 12.5px; color: var(--ar-good); }
.ar-dbgcard.is-warn,
.ar-dbgcard.is-fail { padding: 12px 14px; border-radius: 8px; font-size: 13px; line-height: 1.55; color: var(--ar-ink); }
.ar-dbgcard.is-warn { background: color-mix(in srgb, var(--ar-warn) 8%, transparent); border: 1px solid color-mix(in srgb, var(--ar-warn) 35%, transparent); }
.ar-dbgcard.is-fail { background: color-mix(in srgb, var(--ar-bad) 7%, transparent); border: 1px solid color-mix(in srgb, var(--ar-bad) 35%, transparent); }
.ar-dbgcard__title { display: block; margin-bottom: 5px; }
.ar-dbgcard.is-warn .ar-dbgcard__title { color: var(--ar-warn); }
.ar-dbgcard.is-fail .ar-dbgcard__title { color: var(--ar-bad); }
.ar-dbgcard__fix { margin: 0; font-size: 12.5px; color: var(--ar-ink-soft); }
.ar-dbgcard__fix a { white-space: nowrap; font-weight: 600; }
.ar-dbgcard.is-warn .ar-dbgcard__fix a { color: var(--ar-warn); }
.ar-dbgcard.is-fail .ar-dbgcard__fix a { color: var(--ar-bad); }
/* In-hint links to the standard each file/format implements (llms.txt, robots.txt,
   JSON-LD …). Kept subtle — accent + underline — so the hint still reads as a hint;
   no external-arrow glyph, which reads awkwardly on a term mid-sentence. */
.ar-spec-link {
  color: var(--ar-accent);
  text-decoration: underline;
  text-underline-offset: 2px;
  text-decoration-thickness: 1px;
}
.ar-spec-link:hover { text-decoration-thickness: 2px; }
.ar-spec-link:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; border-radius: 2px; }

/* Provider-integration row: a metadata line (type · plugin · capabilities). */
.ar-prov-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; margin-top: 2px; }
.ar-prov-meta > * { position: relative; }
.ar-prov-meta > * + *::before { content: "·"; position: absolute; left: -7px; color: var(--ar-line-strong); }
.ar-prov-meta code { font-size: 11px; }
.ar-prov { font-family: var(--ar-mono); font-size: 11px; color: var(--ar-accent); }

/* Allowed / Blocked status pill on each signal toggle. */
.ar-signal-state {
  margin-left: auto; align-self: center; flex: 0 0 auto;
  font-family: var(--ar-mono); font-size: 9.5px; letter-spacing: 0.08em; text-transform: uppercase;
  padding: 3px 9px; border-radius: 999px; border: 1px solid;
}
.ar-signal-state.is-allow { color: var(--ar-good); border-color: var(--ar-good-tint); background: var(--ar-good-wash); }
.ar-signal-state.is-block { color: var(--ar-bad); border-color: var(--ar-bad-tint); background: var(--ar-bad-wash); }

/* Crawler hard-block editor body (shown when training is Allowed, or on Customize). */
.ar-enforce-body { margin-top: 10px; margin-left: 22px; }

/* Small inline tag in a field label, e.g. "Content-Signal" / "optional". */
.ar-field__tag {
  font-family: var(--ar-mono); font-size: 9px; letter-spacing: 0.08em;
  color: var(--ar-ink-faint); border: 1px solid var(--ar-line-strong);
  padding: 1px 6px; border-radius: 999px; margin-left: 6px; vertical-align: 1px;
}

/* ---- Fields ------------------------------------------------------------- */
.ar-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; margin-top: 18px; }
/* The identity block sets its own top padding, so its leading grid stays flush. */
.ar-id-block > .ar-grid { margin-top: 0; }
.ar-field { display: flex; flex-direction: column; gap: 6px; margin-top: 18px; }
.ar-field:first-child { margin-top: 0; }
/* Grid fields sit side by side — keep their tops aligned, not stair-stepped. */
.ar-grid .ar-field { margin-top: 0; }
.ar-field > label,
.ar-field .ar-field__head > label {
  font-family: var(--ar-mono);
  font-size: 11px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ar-ink-soft);
}
.ar-field__hint { color: var(--ar-ink-soft); font-size: 12px; line-height: 1.5; margin-top: 2px; }
.ar-field--inline { flex-direction: row; align-items: center; gap: 12px; margin-top: 20px; }
.ar-field--inline label {
  font-family: var(--ar-mono); font-size: 11px; letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--ar-ink-soft);
}
/* Post-count row: the live size estimate sits beside the input as one aligned line —
   not a stray paragraph beneath — and wraps under the input on narrow screens. */
/* Compound selector on purpose: this row leads its wrapper, and the `.ar-field:first-child`
   margin reset above (0,1,1) would zero a single-class top margin — two classes out-rank it. */
.ar-field--inline.ar-field--estimate { flex-wrap: wrap; margin: 14px 0 16px; }
.ar-field--estimate .ar-field__hint { margin: 0; flex: 1 1 240px; min-width: 0; }

.ar-input {
  width: 100%; padding: 9px 11px; font-size: 14px; font-family: var(--ar-sans);
  border: 1px solid var(--ar-line-strong); border-radius: var(--ar-radius);
  background: var(--ar-field); color: var(--ar-ink);
  transition: border-color 0.15s, box-shadow 0.15s;
}
.ar-input:focus {
  outline: none; border-color: var(--ar-accent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--ar-accent) 13%, transparent);
}
/* wp-admin's forms.css paints focus with the ADMIN SCHEME's color at
   input[type=…]:focus specificity — (0,2,1), one element-tiebreak above the
   class rule right here — so the scheme, not the app, owned every focus ring.
   The id scope takes it back: the app's own accent, both themes, whatever
   scheme the profile picked. Checkbox/radio/range keep their native focus. */
#agentimus-app :is(input:not([type="checkbox"]):not([type="radio"]):not([type="range"]), textarea, select):focus,
:is(.ar-modal, .ar-drawer) :is(input:not([type="checkbox"]):not([type="radio"]):not([type="range"]), textarea, select):focus {
  outline: none; border-color: var(--ar-accent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--ar-accent) 13%, transparent);
}
/* Compact numeric inputs (counts and caps): a two-digit number doesn't need a full-height
   box. Scoped under the app id because wp-admin forms.css targets input[type=number] at
   (0,1,1) — a bare class loses that fight and the box stays at admin height. */
#agentimus-app .ar-input--sm {
  width: 96px; min-height: 0; padding: 3px 10px;
  font-size: 13px; line-height: 1.6; font-family: var(--ar-mono);
}
/* A field row that is a PEER of the toggle above it (not its sub-setting): the same
   hairline the toggle rows use marks it as its own entry. */
.ar-field--divided { border-top: 1px solid var(--ar-line); margin-top: 16px; padding-top: 16px; }
textarea.ar-input { resize: vertical; line-height: 1.55; }
/* Custom chevron so the select matches the text inputs' height exactly. */
select.ar-input {
  cursor: pointer;
  appearance: none;
  -webkit-appearance: none;
  max-width: none; /* override wp-admin's `.wp-core-ui select { max-width: 25rem }`, which otherwise caps our full-width field */
  padding-right: 34px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M2 4.5l4 4 4-4' fill='none' stroke='%236c675a' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 12px center;
}

.ar-warn { color: var(--ar-bad); }

/* Services: each service is its own compact card — two rows (name + url, then
   description), with a × in the top corner to remove. */
.ar-svc {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 10px 11px;
  margin-top: 8px;
  border: 1px solid var(--ar-line-strong);
  border-radius: var(--ar-radius);
  background: var(--ar-paper);
  box-shadow: 0 1px 3px color-mix(in srgb, var(--ar-shade) 6%, transparent);
}
.ar-svc:first-of-type { margin-top: 6px; }
.ar-svc__row { display: flex; flex-wrap: wrap; gap: 8px; }
.ar-svc__name { flex: 3 1 180px; min-width: 0; }
.ar-svc__url { flex: 1 1 150px; min-width: 0; }
/* Compact the fields so a service reads in one glance. */
.ar-svc .ar-input { padding: 6px 9px; font-size: 13px; }
/* The remove control rides the tray's corner as a small round badge — the
   bell-bubble grammar — instead of sitting inside the row, so the fields get
   the full width. Quiet until hovered; hover says what it deletes. */
.ar-svc__x {
  position: absolute;
  top: -8px;
  right: -8px;
  z-index: 1;
  width: 20px;
  height: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  font-size: 14px;
  line-height: 1;
  color: var(--ar-ink-soft);
  background: var(--ar-surface-2);
  border: 1px solid var(--ar-line-strong);
  border-radius: 999px;
  /* A surface ring so the badge reads as sitting ABOVE the tray corner it
     straddles, not as a bite out of the edge. */
  box-shadow: 0 0 0 2px var(--ar-surface);
  cursor: pointer;
  transition: background 0.15s, color 0.15s, border-color 0.15s;
}
.ar-svc__x:hover { background: var(--ar-bad); border-color: var(--ar-bad); color: var(--ar-on-signal); }
/* Plain text button, right-aligned. */
.ar-svc__add {
  display: block;
  width: fit-content;
  margin: 8px 0 0 auto;
  padding: 2px 5px;
  font-size: 13px;
  color: var(--ar-accent);
  background: transparent;
  border: 0;
  cursor: pointer;
}
.ar-signals { display: flex; flex-direction: column; }

/* Known-crawler suggestions */
.ar-suggest { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 8px; }
.ar-suggest__label {
  font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase;
  color: var(--ar-ink-faint); margin-right: 2px;
}
.ar-suggest__chip {
  appearance: none; cursor: pointer;
  font-family: var(--ar-mono); font-size: 12px;
  padding: 3px 9px; border-radius: 3px;
  background: transparent; color: var(--ar-ink-soft);
  border: 1px dashed var(--ar-line-strong);
  transition: border-color 0.15s, color 0.15s, background 0.15s;
}
.ar-suggest__chip:hover { border-style: solid; border-color: var(--ar-accent); color: var(--ar-accent); background: color-mix(in srgb, var(--ar-accent) 7%, var(--ar-surface)); }

/* Read-only enumeration of the built-in always-allowed search engines: present
   in the trust set but not editable, so they render as static muted chips —
   distinct from the dark editable chips and the dashed suggestion chips. A top
   divider sets the whole (label + chips + note) apart as one "automatic" group. */
.ar-builtin {
  display: flex; flex-wrap: wrap; align-items: center; gap: 6px;
  margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--ar-line);
}
.ar-builtin__label {
  font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase;
  color: var(--ar-ink-faint); margin-right: 2px;
}
.ar-builtin__chip {
  font-family: var(--ar-mono); font-size: 12px;
  padding: 3px 9px; border-radius: 3px;
  background: var(--ar-surface); color: var(--ar-ink-soft);
  border: 1px solid var(--ar-line);
}
.ar-builtin__note {
  flex-basis: 100%; margin-top: 8px;
  color: var(--ar-ink-soft); font-size: 12px; line-height: 1.5;
}

/* No underline anywhere: these sit inside sentences and rails where a rule
   under every one of them reads as clutter. Colour carries the affordance at
   rest; hover answers with a soft pill. The padding is carried AT REST, not
   added on hover — a button that grows under the cursor jostles the
   separators and words either side on every pass of the mouse, so the room
   is reserved once and only the fill arrives.
   Keyboard users get a real focus ring, not a text-decoration to spot. */
.ar-linkbtn {
  appearance: none; background: none; border: 0; padding: 0 5px; margin-left: 4px; cursor: pointer;
  font: inherit; color: var(--ar-accent); text-decoration: none; border-radius: 8px;
  transition: color 0.15s ease, background-color 0.15s ease;
}
/* ⛔ The pill is gone (see the one hover rule further down): a background on
   an inline control has to bleed past its own word to look deliberate, and
   that bleed paints over the sentence around it. */
.ar-linkbtn:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; }

/* One hover language across the app: these text buttons used to answer with a
   rule of their own. Same pill, same reserved room. */
.ar-tags__edit, .ar-wiz__moretypes, .ar-svc__add, .ar-rev-link {
  padding: 0 5px; border-radius: 8px;
  transition: color 0.15s ease, background-color 0.15s ease;
}
.ar-tags__edit:hover, .ar-wiz__moretypes:hover, .ar-svc__add:hover, .ar-rev-link:hover {
  background: var(--ar-hover);
}
@media (prefers-reduced-motion: reduce) {
  .ar-linkbtn, .ar-tags__edit, .ar-wiz__moretypes, .ar-svc__add, .ar-rev-link { transition: none; }
}
/* Disabled must LOOK disabled — a full-color underlined link that silently
   ignores clicks reads as broken, not busy. */
.ar-linkbtn:disabled, .ar-linkbtn:disabled:hover { color: var(--ar-ink-faint); text-decoration: none; background: none; box-shadow: none; cursor: default; opacity: 0.7; }

/* Content types — compact, scalable selectable cards */
/* Same grid as the cards below, so the search lines up to the columns. */
.ar-types-bar {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(205px, 1fr));
  gap: 9px; align-items: center; margin: 4px 0 14px;
}
.ar-types-search { grid-column: 1 / span 2; padding: 9px 13px; } /* exactly two cards wide */
.ar-types-meta { grid-column: 3 / -1; display: flex; align-items: center; justify-content: flex-end; gap: 14px; }
.ar-types-count { font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-faint); }
.ar-types-bar .ar-linkbtn { font-family: var(--ar-mono); font-size: 11px; }

/* Scroll only when the list gets long; small sites never scroll. */
.ar-types-scroll {
  max-height: 336px; overflow-y: auto; margin: 4px -4px 0; padding: 8px 4px;
  /* Fade rows in/out at the edges so scrolled cards don't visually merge into
     the filter above (or run hard against the bottom). */
  -webkit-mask-image: linear-gradient(to bottom, transparent, #000 14px, #000 calc(100% - 14px), transparent);
          mask-image: linear-gradient(to bottom, transparent, #000 14px, #000 calc(100% - 14px), transparent);
}
.ar-types-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(205px, 1fr)); gap: 9px; }
.ar-types-empty { grid-column: 1 / -1; margin: 6px 2px; font-size: 12.5px; color: var(--ar-ink-soft); }

/* Identity "compose then save" block — free text grouped as its own unit with a
   footer Save. The chip fields below it (expertise, profile URLs) autosave. */
.ar-id-block { border: 1px solid var(--ar-line); border-radius: var(--ar-radius); background: var(--ar-surface); padding: 16px 16px 0; margin: 2px 0 16px; }
.ar-id-block > .ar-field:last-of-type { margin-bottom: 0; }
.ar-id-foot { display: flex; align-items: center; gap: 14px; border-top: 1px solid var(--ar-line); margin: 14px -16px 0; padding: 12px 16px; }
.ar-id-foot__status { font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-faint); margin-right: auto; }
.ar-id-foot__status.is-dirty { color: var(--ar-accent); }
.ar-id-foot__status.is-saved { color: var(--ar-good-strong); }

.ar-type {
  position: relative;
  display: flex; align-items: center; gap: 11px;
  padding: 10px 26px 10px 14px; border: 1px solid var(--ar-line); border-radius: var(--ar-radius);
  background: var(--ar-surface); cursor: pointer; transition: border-color 0.15s, background 0.15s;
}
.ar-type:hover { border-color: var(--ar-line-strong); }
.ar-type.is-on { border-color: var(--ar-accent); background: var(--ar-accent-wash); }
.ar-type input { position: absolute; opacity: 0; width: 0; height: 0; }

/* No visible checkbox — the whole card is the control. Selected reads as the
   accent border + tint (above) plus a small corner tick. */
.ar-type__check { display: none; }
.ar-type.is-on::after {
  content: "\2713"; position: absolute; top: 8px; right: 11px; /* \2713 (not a literal ✓): encoding-proof if the CSS is ever served as latin-1. */
  font-size: 11px; line-height: 1; font-weight: 700; color: var(--ar-accent);
}
/* Mid-save, the card's corner mark becomes a spinner — the tick would otherwise
   flip instantly and claim a save that had not landed yet. Declared AFTER
   `.ar-type.is-on::after` on purpose: the two selectors have equal specificity,
   so source order is what lets the spinner win while the save is in flight. */
.ar-type[data-busy]::after {
  content: ""; position: absolute; top: 8px; right: 11px;
  width: 11px; height: 11px; border-radius: 50%;
  border: 1.5px solid var(--ar-line-strong); border-top-color: var(--ar-accent);
  animation: ar-spin 0.7s linear infinite;
}
@media (prefers-reduced-motion: reduce) {
  .ar-type[data-busy]::after { animation-duration: 1.6s; }
}
/* Dimmed less than a toggle: something is turning in there and it has to stay
   legible while it does. */
.ar-type[data-busy] { opacity: 0.82; }

/* The real <input> is visually hidden, so ring the whole card on KEYBOARD focus
   only. Using :has(:focus-visible) (not :focus-within) is deliberate: after a
   mouse click the checkbox keeps DOM focus, and :focus-within would leave the
   accent ring on a card the click just DESELECTED — making it look still-on. */
.ar-type:has(:focus-visible) { border-color: var(--ar-accent); outline: 2px solid var(--ar-accent); outline-offset: 2px; }

/* Switched on by a plugin, not by the owner. It reads as ON — because it is —
   and the DASHED border is the whole signal: same accent, drawn as something
   set from outside. A tick the owner cannot untick must not look identical to
   the ones they chose.
   Locked on the LABEL, never with a native [disabled]: wp-admin's forms.css
   repaints a disabled checkbox as a bordered box and out-specifies our hide,
   which leaks a stray tick onto the card (the same trap the busy state
   documents above).
   No extra line inside the card: one card a row taller than its neighbours
   makes the whole grid look broken, and the explanation belongs once, under the
   grid, rather than repeated on every locked card. */
/* The plugin-offered group's label. The GROUPING carries the meaning now, so the
   cards inside are drawn exactly like any other — a dashed border on every card
   in a labelled group is decoration repeating what the label already said.
   A RULE across the full width does the separating: a label alone floated in the
   gap between two grids and read as another card's caption rather than a break
   between two different kinds of thing. */
.ar-types-group {
  margin: 22px 0 10px; padding-top: 16px; border-top: 1px solid var(--ar-line);
  font-family: var(--ar-mono); font-size: 10px;
  letter-spacing: 0.09em; text-transform: uppercase; color: var(--ar-ink-faint);
}

.ar-type__body { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.ar-type__label {
  font-size: 13.5px; font-weight: 600; color: var(--ar-ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ar-type__meta { display: flex; align-items: center; gap: 6px; min-width: 0; }
.ar-type__src { font-family: var(--ar-mono); font-size: 10px; color: var(--ar-accent); white-space: nowrap; }
.ar-type__meta code {
  font-family: var(--ar-mono); font-size: 10px; color: var(--ar-ink-faint);
  background: var(--ar-surface-2); padding: 1px 5px; border-radius: 3px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* ---- The checking scope (the gear on Your Content) ---------------------- */
/* Reuses the .ar-type card wholesale — one control language for "pick some
   content types", whichever panel is asking. Only three things are new: how
   much of a type there is, why a type cannot be picked at all, and the count
   in the modal footer. */
.ar-type__n {
  font-family: var(--ar-mono); font-size: 10px; color: var(--ar-ink-faint);
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
/* Not a control, and it must not look like one: dashed, quiet, no pointer. */
.ar-type.is-locked {
  background: var(--ar-surface-2); border-style: dashed; cursor: default;
  align-items: flex-start;
}
.ar-type.is-locked .ar-type__label { color: var(--ar-ink-faint); font-weight: 500; }
.ar-type__why { font-size: 11px; line-height: 1.4; color: var(--ar-ink-faint); }
/* The footer count sits opposite the buttons — .ar-modal__actions is flex-end,
   so this is what holds it to the left rather than a second flex container. */
.ar-modal__actions .ar-types-count { margin-right: auto; }

/* ---- Tag input ---------------------------------------------------------- */
/* The field itself is a plain .ar-input and the chips flow BELOW it, so a chip list can
   never change the input's height — it stays row-aligned with the plain inputs next to it
   in a grid, however many chips there are.
   `display: contents` drops the component's own wrapper out of the layout so the input and
   the chip list become items of the surrounding .ar-field flex column. That is what lets
   `order: 1` push the chips PAST the hint text — the hint is a sibling of this component,
   not a child, so it can't be reordered from inside. Net effect: label → field → hint sit
   at exactly the same heights as a plain text field, and the chips hang below all of it.
   Where the parent isn't a flex column, `order` is inert and the chips simply follow the
   input — still correct, just not past the hint. */
.ar-tags { display: contents; }
.ar-tags__list {
  display: flex; flex-wrap: wrap; gap: 6px; align-items: center;
  margin: 8px 0 0; padding: 0; list-style: none;
}
/* Opt-in (`after-hint`): drop the chips below the hint line too. The hint is a SIBLING of
   this component, so it can only be jumped by flex `order` — which is exactly why this is
   opt-in and not the default: a field that appends anything else after its hint would have
   its chips pushed past that as well. */
.ar-tags__list--after-hint { order: 1; margin-top: 2px; }
.ar-tags__chip {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 4px 6px 4px 9px;
  background: var(--ar-ink); color: var(--ar-paper);
  border-radius: 3px; font-family: var(--ar-mono); font-size: 12px;
}
/* The chip label doubles as an "edit" button — click to pop it back into the input. */
.ar-tags__edit {
  appearance: none; border: 0; background: none; cursor: pointer; padding: 0 5px;
  color: inherit; font-family: inherit; font-size: inherit; line-height: 1.3;
}
/* The × follows the chip's own ink (currentColor), not --ar-paper — paper
   flips near-black in dark, which made every chip's × invisible at night
   (his catch, 2026-08-13; the danger button fell to the same token). */
.ar-tags__x {
  appearance: none; border: 0; background: none; cursor: pointer;
  color: color-mix(in srgb, currentColor 55%, transparent); font-size: 15px; line-height: 1; padding: 0;
}
.ar-tags__x:hover { color: currentColor; }

/* ---- Live endpoints ----------------------------------------------------- */
.ar-links { margin: 0; padding: 0; list-style: none; display: grid; gap: 8px; }
.ar-links li { position: relative; padding-left: 18px; }
.ar-links li::before { content: "↳"; position: absolute; left: 0; color: var(--ar-accent); }
.ar-links a { font-family: var(--ar-mono); font-size: 12.5px; color: var(--ar-ink); text-decoration: none; border-bottom: 1px solid var(--ar-line-strong); }
.ar-links a:hover { color: var(--ar-accent); border-bottom-color: var(--ar-accent); }
/* Same new-tab cue as the rail's endpoint links — one list, one language. */
.ar-links a::after { content: "\2197\FE0E"; margin-left: 5px; font-size: 10px; color: var(--ar-ink-faint); }
.ar-links a:hover::after { color: var(--ar-accent); }

/* ---- Actions ------------------------------------------------------------ */
.ar-btn {
  appearance: none; cursor: pointer;
  font-family: var(--ar-mono); font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase;
  padding: 12px 26px; border-radius: var(--ar-radius); white-space: nowrap;
  background: var(--ar-ink); color: var(--ar-paper); border: 1px solid var(--ar-ink);
  transition: transform 0.12s, background 0.15s, box-shadow 0.15s;
}
.ar-btn:hover:not(:disabled) { background: var(--ar-ink-hard); box-shadow: 0 6px 18px -8px color-mix(in srgb, var(--ar-shade) 70%, transparent); }
.ar-btn:active:not(:disabled) { transform: translateY(1px); }
/* A label that swaps to a longer busy form ("Refresh" → "Refreshing…") reserves
   the longer form's width up front via an invisible twin (data-reserve), so the
   swap can never shift the layout around it. The twin inherits the button's own
   type, so the reserved width is always exactly right. */
.ar-btn--reserve { display: inline-grid; justify-items: center; align-items: center; }
.ar-btn--reserve > span { grid-area: 1 / 1; }
.ar-btn--reserve::after { content: attr(data-reserve); grid-area: 1 / 1; visibility: hidden; }
.ar-btn:disabled { opacity: 0.5; cursor: default; }
/* .ar-btn worn by an ANCHOR (the drawer's "Open in editor"): wp-admin styles bare
   links globally, and its a:hover / a:visited / a:focus pseudo-classes outrank a
   lone class — the label went admin-blue on hover and visited-dark (invisible on
   the ink background) after the click. Pin every state, kill the underline. */
a.ar-btn, a.ar-btn:link, a.ar-btn:visited, a.ar-btn:hover, a.ar-btn:focus, a.ar-btn:active {
  color: var(--ar-paper); text-decoration: none; display: inline-flex; align-items: center;
}
a.ar-btn--ghost, a.ar-btn--ghost:link, a.ar-btn--ghost:visited, a.ar-btn--ghost:hover, a.ar-btn--ghost:focus, a.ar-btn--ghost:active {
  color: var(--ar-ink);
}
a.ar-btn:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; box-shadow: none; }
/* His verdict (2026-08-13, after two wrong turns): RED OUTLINE at rest, the
   FILL arrives on hover — and the fill's ink is literal white, the one color
   legible on the brick in both worlds (the old hover borrowed --ar-paper:
   cream in light, near-BLACK in dark). The dark pair below re-states both at
   the same weight as dark's generic .ar-btn repaint — a single class loses
   to it, which is how every danger button spent the night in grey. Night's
   outline speaks --ar-bad-on-ink, the salmon the theme already declared
   night-legible; the brick itself stays the fill. */
.ar-btn--danger { background: transparent; color: var(--ar-bad); border-color: var(--ar-bad); }
.ar-btn--danger:hover:not(:disabled) { background: var(--ar-bad); color: #fff; border-color: var(--ar-bad); box-shadow: 0 6px 18px -8px color-mix(in srgb, var(--ar-bad) 60%, transparent); }
:root[data-ar-theme="dark"] .ar-btn--danger { background: transparent; color: var(--ar-bad-on-ink); border-color: color-mix(in srgb, var(--ar-bad-on-ink) 65%, var(--ar-line-strong)); }
:root[data-ar-theme="dark"] .ar-btn--danger:hover:not(:disabled) { background: var(--ar-bad); color: #fff; border-color: var(--ar-bad); box-shadow: none; }

/* ---- Reset to defaults -------------------------------------------------- */
.ar-card--reset { border-color: var(--ar-line); }
.ar-reset { display: flex; align-items: center; gap: 20px; }
.ar-reset__text { flex: 1; display: flex; flex-direction: column; gap: 3px; }
.ar-reset__text strong { font-size: 14px; font-weight: 600; }
.ar-reset__text small { color: var(--ar-ink-soft); font-size: 12.5px; line-height: 1.5; }
.ar-reset .ar-btn { flex: 0 0 auto; }

/* ---- Modal (reset confirmation + preview) ------------------------------ */
/* While ANY dialog is open, the page behind it must not scroll — a stray wheel
   flick would silently lose the user's place. Every dialog here renders a
   .ar-modal node only while open (all v-if, none v-show), so :has() doubles as
   the global open-state signal: no per-dialog wiring, and future dialogs are
   covered by construction. Panels keep their own inner scrolling
   (.ar-modal__scroll) — only the document locks. The lock sits on html, not
   body: wp-admin styles html's own overflow, which stops a body-level
   overflow from ever propagating to the viewport (the page kept scrolling). */
html:has(.ar-modal) { overflow: hidden; }
/* Reserve the scrollbar gutter permanently on this screen, so hiding the
   document scrollbar during the lock can't shift the layout sideways. Overlay
   scrollbars (macOS default) are unaffected either way. */
html { scrollbar-gutter: stable; }

.ar-modal {
  position: fixed; inset: 0; z-index: 100001;
  display: flex; align-items: center; justify-content: center;
  padding: 20px;
  /* Worst-case escape hatch: should a panel ever end up taller than the screen
     anyway, the overlay itself scrolls (with margin:auto on the panel keeping both
     edges reachable) instead of clipping the Close button away. Inert otherwise. */
  overflow-y: auto;
  background: color-mix(in srgb, var(--ar-shade) 42%, transparent);
  -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px);
}
.ar-modal__panel {
  display: flex; flex-direction: column;
  margin: auto;
  /* Every height cap here is a vh/svh PAIR: on iOS, 100vh is the LARGE viewport (it
     extends under the browser's collapsed URL/tool bars), so a vh-sized panel clips
     top and bottom — with Close in the hidden part. 100svh is the small viewport
     (bars shown), which always fits; older browsers ignore it and keep the vh line.
     NOTE the small-screen media override further down — it MUST keep the same pair,
     it deliberately wins the cascade on phones (where this bug actually bit). */
  width: 100%; max-width: 560px; overflow: hidden;
  max-height: min(calc(100vh - 40px), 600px);
  max-height: min(calc(100svh - 40px), 600px);
  background: var(--ar-surface); border: 1px solid var(--ar-line-strong);
  border-radius: 10px;
  box-shadow: 0 24px 60px -20px color-mix(in srgb, var(--ar-shade) 50%, transparent);
}
.ar-modal__panel:focus { outline: none; }
/* Header + footer stay put; only the preview body scrolls, so the actions are
   always reachable on a short screen. */
.ar-modal__head { flex: 0 0 auto; padding: 24px 28px 16px; border-bottom: 1px solid var(--ar-line); }
/* Nested-flex scroll: each level needs flex + min-height:0 so the scroller gets
   a resolved height. A percentage height here would NOT resolve (the flex item's
   height is auto) and the content would overflow instead of scrolling. */
.ar-modal__body { position: relative; flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
.ar-modal__scroll { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding: 8px 28px 10px; }
/* Scroll affordance: a bottom fade + chevron, shown only while more is below. */
.ar-modal__fade {
  position: absolute; left: 0; right: 0; bottom: 0; height: 52px;
  display: flex; align-items: flex-end; justify-content: center; padding-bottom: 6px;
  pointer-events: none; opacity: 0; transition: opacity 0.18s ease;
  background: linear-gradient(to bottom, color-mix(in srgb, var(--ar-surface) 0%, transparent), var(--ar-surface) 80%);
}
.ar-modal__fade.is-visible { opacity: 1; }
/* The chevron is a real button: click to nudge the scroll body down (it also
   scrolls on its own). The fade gradient stays click-through; the button
   re-enables pointer events. Disabled = nothing more below. */
.ar-modal__fade-btn {
  pointer-events: auto; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  width: 28px; height: 28px; padding: 0; margin: 0;
  border: 0; border-radius: 999px; background: transparent;
  color: var(--ar-ink-faint); transition: color 0.15s ease, background 0.15s ease;
}
.ar-modal__fade-btn:hover { color: var(--ar-ink); background: var(--ar-surface-2); }
.ar-modal__fade-btn:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; }
.ar-modal__fade-btn:disabled { pointer-events: none; }
.ar-modal__chev { display: block; }
.ar-modal__title { margin: 0 0 8px; font-size: 19px; letter-spacing: -0.01em; color: var(--ar-ink); }
.ar-modal__lead { margin: 0; font-size: 13px; line-height: 1.55; color: var(--ar-ink-soft); }

.ar-preview { display: grid; gap: 16px; }
.ar-preview__group { display: grid; gap: 6px; }
.ar-preview__label {
  margin: 0; font-family: var(--ar-mono); font-size: 10.5px; letter-spacing: 0.12em;
  text-transform: uppercase; color: var(--ar-ink-faint);
}
.ar-preview__list { margin: 0; padding: 0; list-style: none; display: grid; gap: 0; }
.ar-preview__list li {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 7px 0; border-bottom: 1px solid var(--ar-line); font-size: 13px;
}
.ar-preview__list li:last-child { border-bottom: 0; }
.ar-preview__state {
  font-family: var(--ar-mono); font-size: 10.5px; letter-spacing: 0.06em;
  padding: 2px 8px; border-radius: 3px; border: 1px solid;
}
.ar-preview__state.is-on { color: var(--ar-good); border-color: var(--ar-good-tint); background: var(--ar-good-wash); }
.ar-preview__state.is-off { color: var(--ar-ink-soft); border-color: var(--ar-line-strong); background: var(--ar-paper); }
.ar-preview__muted { color: var(--ar-ink-soft); font-size: 12.5px; }

.ar-modal__actions {
  flex: 0 0 auto; display: flex; justify-content: flex-end; gap: 10px;
  padding: 14px 28px 18px; border-top: 1px solid var(--ar-line);
}
.ar-btn--ghost { background: transparent; color: var(--ar-ink); border-color: var(--ar-line-strong); }
.ar-btn--ghost:hover:not(:disabled) { background: var(--ar-paper); box-shadow: none; }

.ar-modal-enter-active { transition: opacity 0.2s ease; }
.ar-modal-leave-active { transition: opacity 0.16s ease; }
.ar-modal-enter-from, .ar-modal-leave-to { opacity: 0; }
.ar-modal-enter-active .ar-modal__panel { transition: transform 0.24s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.24s ease; }
.ar-modal-enter-from .ar-modal__panel { transform: translateY(10px) scale(0.98); opacity: 0; }
@media (prefers-reduced-motion: reduce) {
  .ar-modal-enter-active .ar-modal__panel { transition: none; }
  .ar-modal-enter-from .ar-modal__panel { transform: none; }
}
/* Small / short viewports: tighten the gap and let the panel use more height.
   Placed after the base rules so it wins the cascade. */
@media (max-width: 600px), (max-height: 560px) {
  .ar-modal { padding: 10px; }
  /* Same vh/svh pair as the base rule — a bare 100vh here is what originally trapped
     phone users: on iOS it overshoots the visible screen and hides the Close button. */
  .ar-modal__panel { max-height: calc(100vh - 20px); max-height: calc(100svh - 20px); }
  .ar-modal__panel--day { min-height: 0; }
}

/* ---- Confirm dialog (reusable styled replacement for window.confirm) ---- */
/* Reuses the .ar-modal shell. There's no scrolling body between head and actions,
   so drop the adjacent borders that would otherwise stack into a double rule. */
.ar-modal__panel--confirm { max-width: 440px; }
.ar-modal__panel--confirm .ar-modal__head { border-bottom: 0; padding-bottom: 4px; }
.ar-modal__panel--confirm .ar-modal__actions { border-top: 0; padding-top: 8px; }

/* ---- Onboarding wizard (reuses the modal shell) ------------------------ */
.ar-modal__panel.ar-wiz {
  max-width: 720px;
  /* Roomier than the base modal; SAME vh/svh pair discipline (iOS large-viewport
     trap) — and note this compound selector outranks the small-screen media
     override below, so the offsets here must stay viewport-safe on their own. */
  max-height: min(calc(100vh - 40px), 740px);
  max-height: min(calc(100svh - 40px), 740px);
}
/* The stepper rail: five stations, a connector line at dot height, ✓ when
   passed. House colors carry the meaning — accent = where you are, good-green
   = done, quiet lines for what's ahead. */
.ar-stepper { list-style: none; display: flex; margin: 0; padding: 0; counter-reset: none; }
.ar-stepper li {
  position: relative; flex: 1 1 0; min-width: 0;
  display: flex; flex-direction: column; align-items: center; gap: 2px; text-align: center;
}
/* Connector: from this centered dot's right edge to the next one's left edge. */
.ar-stepper li:not(:last-child)::after {
  content: ""; position: absolute; top: 13px; height: 2px;
  left: calc(50% + 20px); right: calc(-50% + 20px);
  background: var(--ar-line-strong);
}
.ar-stepper__dot {
  width: 28px; height: 28px; border-radius: 50%; margin-bottom: 6px;
  display: grid; place-items: center;
  background: var(--ar-surface); border: 2px solid var(--ar-line-strong);
  font-family: var(--ar-mono); font-size: 12px; color: var(--ar-ink-faint);
}
.ar-stepper__label { font-size: 12.5px; font-weight: 600; color: var(--ar-ink-soft); }
.ar-stepper__desc { font-size: 10.5px; color: var(--ar-ink-faint); line-height: 1.35; padding-inline: 4px; }
.ar-stepper .is-now .ar-stepper__dot { border-color: var(--ar-accent); color: var(--ar-accent); }
.ar-stepper .is-now .ar-stepper__label { color: var(--ar-ink); }
.ar-stepper .is-done .ar-stepper__dot { border-color: var(--ar-good); color: var(--ar-good); }
.ar-stepper .is-done .ar-stepper__label { color: var(--ar-good); }
@media (max-width: 600px) {
  .ar-stepper__desc { display: none; }
  .ar-stepper__label { font-size: 10px; }
}
.ar-wiz__step { display: flex; flex-direction: column; gap: 14px; }
.ar-wiz__step > * { margin: 0; }
.ar-wiz__subhead { font-family: var(--ar-mono); font-size: 10.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ar-ink-faint); }
.ar-wiz__skip { margin-right: auto; }
.ar-wiz__protect { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 7px; }
.ar-wiz__protect li { display: flex; gap: 8px; font-size: 13px; color: var(--ar-ink-soft); line-height: 1.45; }
.ar-wiz__protect li::before { content: "✓"; color: var(--ar-good); font-weight: 700; flex: 0 0 auto; }

/* Welcome screen (first run) */
.ar-wiz__welcome { text-align: center; padding: 6px 0 2px; }
.ar-wiz__welcome-mark { width: 56px; height: 56px; border-radius: 50%; background: var(--ar-surface-2); border: 1px solid var(--ar-line); display: flex; align-items: center; justify-content: center; margin: 2px auto 16px; color: var(--ar-accent); }
/* The brand variant: the header tile's ink ground so the paper/amber "A" reads.
   The size override outranks the header's 18px/16px .ar__logo rules. */
.ar-wiz__welcome-mark--brand { background: var(--ar-ink); border-color: var(--ar-ink); }
.ar-wiz__welcome-mark--brand .ar__logo { width: 26px; }
.ar-wiz__welcome-title { font-family: var(--ar-serif); font-size: 24px; font-weight: 600; margin: 0 0 10px; }
.ar-wiz__welcome-lead { color: var(--ar-ink-soft); font-size: 14px; line-height: 1.6; max-width: 46ch; margin: 0 auto 18px; }
.ar-wiz__welcome-points { list-style: none; margin: 0 auto; padding: 0; display: inline-flex; flex-direction: column; gap: 9px; text-align: left; }
.ar-wiz__welcome-points li { display: flex; gap: 10px; font-size: 13.5px; color: var(--ar-ink); }
.ar-wiz__welcome-points li::before { content: ""; flex: 0 0 auto; width: 7px; height: 7px; margin-top: 6px; border-radius: 50%; background: var(--ar-accent); }

/* Done / first-run celebration */
.ar-wiz__done { position: relative; text-align: center; padding: 10px 0 4px; }
.ar-wiz__done-check { width: 66px; height: 66px; border-radius: 50%; background: var(--ar-good); color: var(--ar-on-signal); display: flex; align-items: center; justify-content: center; margin: 4px auto 18px; animation: ar-pop 360ms cubic-bezier(0.2, 0.8, 0.2, 1.5) both; }
.ar-wiz__done-title { font-family: var(--ar-serif); font-size: 23px; font-weight: 600; margin: 0 0 9px; }
.ar-wiz__done-lead { color: var(--ar-ink-soft); font-size: 14px; line-height: 1.6; max-width: 44ch; margin: 0 auto; }
/* "Now explore" — jump-off cards to the capabilities added since first-run setup. */
.ar-wiz__explore-label {
  margin: 22px 0 8px; font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.12em;
  text-transform: uppercase; color: var(--ar-ink-faint); text-align: left;
}
.ar-wiz__explore { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.ar-wiz__explore button,
.ar-wiz__explore a {
  appearance: none; cursor: pointer; width: 100%; text-align: left;
  display: flex; flex-direction: column; gap: 2px;
  padding: 11px 14px; background: var(--ar-surface); border: 1px solid var(--ar-line);
  border-radius: var(--ar-radius); font: inherit; color: var(--ar-ink); text-decoration: none;
}
.ar-wiz__explore button:hover, .ar-wiz__explore a:hover { border-color: var(--ar-line-strong); background: var(--ar-surface-2); }
.ar-wiz__explore button:focus-visible, .ar-wiz__explore a:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; }
.ar-wiz__explore-name { font-weight: 600; font-size: 13.5px; }
.ar-wiz__explore-name::after { content: " ↗"; color: var(--ar-ink-faint); font-weight: 400; }
.ar-wiz__explore-desc { font-size: 12px; color: var(--ar-ink-soft); line-height: 1.4; }
.ar-wiz__done-btn { width: 100%; }
.ar-wiz__confetti { position: absolute; left: 0; right: 0; top: -8px; height: 1px; pointer-events: none; }
.ar-wiz__confetti span { position: absolute; top: 0; width: 8px; height: 14px; border-radius: 1px; opacity: 0; animation-name: ar-confetti; animation-timing-function: ease-in; animation-iteration-count: 1; animation-fill-mode: forwards; }
@keyframes ar-pop { 0% { transform: scale(0.4); opacity: 0; } 100% { transform: scale(1); opacity: 1; } }
@keyframes ar-confetti { 0% { transform: translateY(0) rotate(0); opacity: 1; } 100% { transform: translateY(340px) rotate(560deg); opacity: 0; } }
@media (prefers-reduced-motion: reduce) {
  .ar-wiz__done-check { animation: none; }
  .ar-wiz__confetti { display: none; }
}

.ar-wiz__moretypes { margin-top: 2px; align-self: flex-start; font-family: var(--ar-mono); font-size: 11px; text-decoration: none; }

/* The services repeater: one bordered block per service, the fields inside. */
.ar-wiz__svc { border: 1px solid var(--ar-line); border-radius: 6px; padding: 12px 14px 14px; }
.ar-wiz__svc-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 2px; }
.ar-wiz__svc .ar-field { margin-top: 12px; }
.ar-wiz__svc .ar-field:first-of-type { margin-top: 0; }
/* Centred text needs a box narrow enough to be centred IN, so this one keeps
   the measure as a width rather than as a right pad — auto margins have nothing
   to balance against a full-width block. */
.ar-wiz__centernote { max-width: 88ch; padding-right: 12px; margin-inline: auto; text-align: center; }

/* The celebration's "live right now" ticks: real, verifiable accomplishments —
   the ✓ list idiom, centered as a block, reading left like the welcome points.
   No width cap: each line's copy is sized to fit on ONE line at panel width. */
.ar-wiz__protect--live {
  display: inline-flex; text-align: left; margin: 14px auto 0;
}
.ar-wiz__protect--live a { color: var(--ar-ink); }
.ar-wiz__protect--live a:hover code { color: var(--ar-accent); }
.ar-wiz__protect--live code { font-size: 12px; }

/* ---- About: in-page search + the screens manual -------------------------- */
/* Jump-menu targets sit under two sticky bars (nav + pagehead) — without this
   margin a jump lands with its heading hidden behind them. The #agentimus-app
   prefix is load-bearing: the global `#agentimus-app [id^="ar-"]` 16px rule
   carries an id selector, so a class-only selector here would lose to it.
   NO --ar-adminbar term: WordPress already shifts the whole document with
   html { margin-top } for the admin bar, so adding it here double-counts —
   the jump lands a bar-height too low, and the scrollspy (whose reading line
   sits just under the sticky stack) then blames the PREVIOUS section. */
#agentimus-app .ar-about section[id],
#agentimus-app .ar-about .ar-about-screen[id],
#agentimus-app .ar-about .ar-about-feat[id] {
  scroll-margin-top: calc((2 * var(--ar-bar-h)) + 12px);
}
.ar-about-screen { padding: 16px 0 4px; }
.ar-about-screen + .ar-about-screen { border-top: 1px solid var(--ar-line); }
.ar-about-screen__where { font-family: var(--ar-mono); font-size: 10.5px; letter-spacing: 0.08em; color: var(--ar-ink-faint); margin-left: 8px; }
/* Full card width, justified, hyphenated at breaks — the manual reads like a
   set page, not a narrow column. */
.ar-about-screen__purpose,
.ar-about-screen__do,
.ar-about-screen__ft {
  text-align: justify;
  hyphens: auto; -webkit-hyphens: auto;
}
.ar-about-screen__purpose { margin: 6px 0 0; font-size: 13px; line-height: 1.6; color: var(--ar-ink); }
.ar-about-screen__do { margin: 8px 0 0; font-size: 12.5px; line-height: 1.6; color: var(--ar-ink-soft); }
.ar-about-screen__k { margin: 14px 0 6px; font-family: var(--ar-mono); font-size: 10.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ar-ink-faint); }
.ar-about-screen__facts { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.ar-about-screen__facts li { display: flex; gap: 10px; font-size: 12.5px; line-height: 1.55; color: var(--ar-ink-soft); }
.ar-about-screen__ico { flex: 0 0 auto; margin-top: 1px; display: inline-flex; }
.ar-about-screen__facts .is-info .ar-about-screen__ico { color: var(--ar-info); }
.ar-about-screen__facts .is-warn .ar-about-screen__ico { color: var(--ar-warn); }
.ar-about-screen__facts .is-tip .ar-about-screen__ico { color: var(--ar-accent); }
.ar-about-screen__ft { flex: 1; min-width: 0; }

/* ---- "Worth a look next" — the post-setup dashboard map ------------------ */
/* One-time guidance, not another data card: the accent rail + tinted surface
   (the What's New dress), and numbered accent chips carrying the priority. */
.ar-next {
  border-left: 3px solid var(--ar-accent);
  background: color-mix(in srgb, var(--ar-accent) 3%, var(--ar-surface));
}
.ar-next__n {
  flex: 0 0 auto; width: 24px; height: 24px; border-radius: 50%; margin-top: 1px;
  background: var(--ar-accent); color: var(--ar-paper);
  display: grid; place-items: center;
  font-family: var(--ar-mono); font-size: 11px;
}
.ar-next__head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; }
.ar-next__title { margin: 0 0 4px; font-size: 17px; letter-spacing: -0.01em; }
.ar-next__sub { margin: 0; font-size: 12.5px; line-height: 1.5; color: var(--ar-ink-soft); }
.ar-next__head .ar-linkbtn { flex: 0 0 auto; white-space: nowrap; }
.ar-next__list { list-style: none; margin: 14px 0 0; padding: 0; }
.ar-next__list li {
  display: flex; align-items: center; gap: 18px;
  padding: 13px 0; border-top: 1px solid var(--ar-line);
}
.ar-next__body { flex: 1 1 auto; min-width: 0; }
.ar-next__body strong { display: block; font-size: 13.5px; margin-bottom: 2px; }
.ar-next__body p { margin: 0; font-size: 12.5px; line-height: 1.5; color: var(--ar-ink-soft); max-width: 70ch; }
.ar-next__list .ar-btn { flex: 0 0 auto; }
/* The three actions share ONE width. Each row is its own flex line, so a button
   would otherwise be as wide as its own label and "Open Visibility" would draw a
   narrower box than the two below it. Subgrid lets every <li> share the <ol>'s
   column tracks, so the action column is sized once — to the longest label — and
   all three buttons fill it. Sized by the text rather than by a pixel number, so
   editing a label cannot silently break the alignment. Where subgrid is
   unsupported the flex layout above still stands. Wide layout only: below 640px
   the rows stack and there is no column to share. */
@supports (grid-template-columns: subgrid) {
  @media (min-width: 641px) {
    .ar-next__list { display: grid; grid-template-columns: max-content minmax(0, 1fr) max-content; }
    .ar-next__list li { grid-column: 1 / -1; display: grid; grid-template-columns: subgrid; }
  }
}
@media (max-width: 640px) {
  .ar-next__list li { flex-direction: column; align-items: flex-start; gap: 9px; }
}

/* Form-like proof states put their title in the modal's fixed head; the title
   is the head's only line, so it drops its usual bottom margin. */
.ar-wiz__proofttl { margin: 0; }

/* The empty-"about" nudge: a tip, not a problem — amber, never the error red
   (.ar-warn wears --ar-bad, which reads as "something broke"). */
.ar-wiz__tip { color: var(--ar-warn); }

/* overflow:hidden — falling confetti transforms otherwise extend the modal's
   scroll area past this now-short screen and flash a phantom scrollbar. */
.ar-wiz__done { padding: 2px 0 0; overflow: hidden; }
.ar-wiz__done .ar-wiz__done-check { width: 52px; height: 52px; margin: 2px auto 12px; }
.ar-wiz__done .ar-wiz__done-check svg { width: 26px; height: 26px; }

/* The ceremonial proof states (watching, success) have no head — they carry
   the head's top breathing room themselves, or their first line would sit 8px
   from the panel edge while every headed screen's sits 24px. */
.ar-wiz__proof { padding-top: 16px; }

/* The proof screen: assistant pick cards (the .ar-type idiom, button-flavoured). */
.ar-ask-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(205px, 1fr)); gap: 9px; }
.ar-ask {
  appearance: none; display: flex; align-items: center; gap: 12px; text-align: left; cursor: pointer;
  border: 1px solid var(--ar-line); border-radius: 6px; background: var(--ar-surface);
  padding: 13px 15px; transition: border-color 0.15s, background 0.15s; font-family: var(--ar-sans);
}
.ar-ask:hover { border-color: var(--ar-accent); background: var(--ar-accent-wash); }
.ar-ask:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; }
.ar-ask__mark {
  flex: 0 0 auto; width: 30px; height: 30px; border-radius: 50%;
  background: var(--ar-surface-2); border: 1px solid var(--ar-line);
  display: flex; align-items: center; justify-content: center; color: var(--ar-ink);
}
.ar-ask__body { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.ar-ask__name { font-size: 13.5px; font-weight: 600; color: var(--ar-ink); }
.ar-ask__name::after { content: " ↗"; color: var(--ar-ink-faint); font-weight: 400; }
.ar-ask__sub { font-size: 11.5px; color: var(--ar-ink-soft); }

/* Watching the log: one quiet pulse and an honest clock. */
.ar-watch { display: flex; flex-direction: column; align-items: center; gap: 14px; padding: 8px 0; text-align: center; }
.ar-watch__pulse { width: 14px; height: 14px; border-radius: 50%; background: var(--ar-accent); animation: ar-watch-pulse 1.4s ease-in-out infinite; }
@keyframes ar-watch-pulse {
  0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--ar-accent) 35%, transparent); }
  50% { box-shadow: 0 0 0 12px color-mix(in srgb, var(--ar-accent) 0%, transparent); }
}
@media (prefers-reduced-motion: reduce) { .ar-watch__pulse { animation: none; } }
.ar-watch__title { font-family: var(--ar-serif); font-size: 19px; font-weight: 600; margin: 0; }
.ar-watch__clock { margin: 0; font-family: var(--ar-mono); font-size: 13px; color: var(--ar-ink-faint); font-variant-numeric: tabular-nums; }
.ar-watch__lead { max-width: 44ch; }

/* The payoff: the owner's own log line (the .is-on capsule palette). */
.ar-logline {
  display: flex; align-items: center; flex-wrap: wrap; gap: 10px; text-align: left;
  margin: 18px 0 0; padding: 13px 16px;
  border: 1px solid var(--ar-good-tint); border-radius: 6px; background: var(--ar-good-wash);
}
.ar-logline__dot { width: 8px; height: 8px; border-radius: 50%; background: var(--ar-good); flex: 0 0 auto; }
.ar-logline__name { font-weight: 700; font-size: 14px; }
.ar-logline__chip { font-family: var(--ar-mono); font-size: 11px; background: var(--ar-surface); border: 1px solid var(--ar-line); border-radius: 4px; padding: 2px 8px; }
.ar-logline__net { font-size: 12px; color: var(--ar-ink-soft); }
.ar-logline__time { margin-left: auto; font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-soft); }
@media (max-width: 640px) { .ar-logline__time { margin-left: 0; flex-basis: 100%; } }

/* The honest timeout: numbered plain-words reasons, firewall first. */
.ar-reasons { margin: 6px 0 0; padding: 0; list-style: none; display: grid; gap: 12px; text-align: left; }
.ar-reasons li { display: flex; gap: 12px; font-size: 13px; line-height: 1.5; color: var(--ar-ink); }
.ar-reasons li strong { font-weight: 600; }
.ar-reasons li small { display: block; color: var(--ar-ink-soft); font-size: 12.5px; margin-top: 1px; }
.ar-reasons__n {
  flex: 0 0 auto; width: 22px; height: 22px; border-radius: 50%; margin-top: 1px;
  border: 1px solid var(--ar-line-strong); background: var(--ar-surface-2);
  display: flex; align-items: center; justify-content: center;
  font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-soft);
}

/* The optional second wow: the one-click connect card, dashed = an offer, not a step. */
.ar-connect {
  margin-top: 20px; text-align: left; border: 1px dashed var(--ar-line-strong);
  border-radius: 6px; background: var(--ar-surface-2); padding: 15px 17px;
  display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
}
.ar-connect__body { flex: 1 1 260px; display: flex; flex-direction: column; gap: 3px; }
.ar-connect__title { font-size: 13.5px; font-weight: 600; }
.ar-connect__sub { font-size: 12.5px; color: var(--ar-ink-soft); line-height: 1.5; }

/* ---- Readiness ---------------------------------------------------------- */
/* Each rung is a titled group of checks, with its own pass tally. */
/* The report is a stack of cards (header card + one card per rung group); the grid
   gap replaces the old in-card margins between groups. min-width:0 on the stack AND
   its cards for the same reason .ar-tabpanel carries it: as grid items, the default
   min-width:auto refuses to shrink below the content's intrinsic width, so on a
   phone the whole report overflowed the viewport instead of wrapping. */
.ar-readiness-stack { display: grid; gap: 18px; min-width: 0; }
.ar-readiness-stack > * { min-width: 0; }
.ar-checkgroup { margin-top: 0; }
.ar-checkgroup__head {
  position: relative;
  display: flex; align-items: center; gap: 11px;
  padding: 0 4px 11px;
}
/* A slim full-width 1px divider, colour-keyed to the rung's status (pass / warn /
   fail) so the header reads as one signal with its dot and count. */
.ar-checkgroup__head::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 1px;
  background: var(--ar-line-strong);
}
.ar-checkgroup.is-pass .ar-checkgroup__head::after { background: color-mix(in srgb, var(--ar-good) 55%, transparent); }
.ar-checkgroup.is-warn .ar-checkgroup__head::after { background: color-mix(in srgb, var(--ar-warn) 50%, transparent); }
.ar-checkgroup.is-fail .ar-checkgroup__head::after { background: color-mix(in srgb, var(--ar-bad) 50%, transparent); }
.ar-checkgroup__rung {
  flex: 0 0 auto; width: 9px; height: 9px; border-radius: 50%;
  background: var(--ar-line-strong);
}
.ar-checkgroup.is-pass .ar-checkgroup__rung { background: var(--ar-good); }
.ar-checkgroup.is-warn .ar-checkgroup__rung { background: var(--ar-warn); }
.ar-checkgroup.is-fail .ar-checkgroup__rung { background: var(--ar-bad); }
.ar-checkgroup__text { flex: 1; min-width: 0; }
.ar-checkgroup__name {
  margin: 0; font-family: var(--ar-serif); font-size: 16px; font-weight: 600; color: var(--ar-ink);
}
.ar-checkgroup__blurb { margin: 2px 0 0; font-size: 12.5px; line-height: 1.4; color: var(--ar-ink-soft); }
.ar-checkgroup__count {
  flex: 0 0 auto; font-family: var(--ar-mono); font-size: 13px; font-weight: 600; color: var(--ar-ink-soft);
}
.ar-checkgroup.is-pass .ar-checkgroup__count { color: var(--ar-good); }
.ar-checkgroup.is-warn .ar-checkgroup__count { color: var(--ar-warn); }
.ar-checkgroup.is-fail .ar-checkgroup__count { color: var(--ar-bad); }
.ar-checkgroup .ar-checks { margin-top: 0; border-top: 0; }

/* minmax(0,1fr): let the single column shrink below its content's min-content, so a
   nowrap child (e.g. an Optimize page link) truncates instead of overflowing the panel. */
.ar-checks { margin: 14px 0 0; padding: 0; list-style: none; display: grid; grid-template-columns: minmax(0, 1fr); gap: 0; border-top: 1px solid var(--ar-line); }
.ar-check {
  /* Grid, not flex: the fix note and action live at row level so the note can
     span the FULL row width (flush with the status chip), while the color rule
     still stretches every row via grid-row 1/-1. */
  display: grid; grid-template-columns: auto minmax(0, 1fr) auto;
  column-gap: 16px; align-items: start;
  padding: 15px 4px; border-bottom: 1px solid var(--ar-line);
  /* Clear the fixed WordPress admin bar when the rail's next-step link jumps here. */
  scroll-margin-top: 40px;
}
.ar-check__text { min-width: 0; display: flex; flex-direction: column; gap: 2px; }
/* The AgentReady citation chip: quiet spec ID beside the label, linking out.
   Deliberately the smallest voice on the row — a citation, not a control — so
   the border drops to the plain hairline and the size a half-point below the
   OFF chip's ink. Its v-tip carries the explanation the size can't. */
.ar-check__arid {
  display: inline-block; vertical-align: 1px; margin-left: 7px; padding: 1px 7px;
  font-family: var(--ar-mono); font-size: 9px; letter-spacing: 0.06em; font-weight: 400;
  color: var(--ar-ink-faint); border: 1px solid var(--ar-line); border-radius: 999px;
  text-decoration: none;
}
.ar-check__arid:hover { color: var(--ar-accent); border-color: var(--ar-accent); }
.ar-check__text strong { font-size: 14px; font-weight: 600; }
.ar-check__text small { color: var(--ar-ink-soft); font-size: 12.5px; }
/* The fix note: a quiet inset on the raised tone, not the page's darkest
   (paper went near-black in dark mode), and NO left border of its own —
   the row's rule already carries the status colour; a second amber bar
   nested inside it read as decoration (his call, 2026-08-12). */
.ar-check__fix {
  grid-column: 2 / -1;
  margin: 8px 0 0; padding: 8px 11px;
  font-size: 12.5px; line-height: 1.5; color: var(--ar-ink);
  background: var(--ar-surface-2); border-radius: 6px;
}
.ar-check__action {
  grid-column: 2; justify-self: start;
  align-self: flex-start; margin: 8px 0 0; padding: 0;
  background: none; border: 0; cursor: pointer;
  font-family: var(--ar-mono); font-size: 11px; letter-spacing: 0.04em;
  color: var(--ar-accent);
}
.ar-check__action:hover { text-decoration: underline; }
.ar-check__action:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 3px; border-radius: 3px; }
/* The status tag sits on the first text line even though the row is top-aligned. */
.ar-check__tag { margin-top: 1px; }
.ar-check__tag {
  flex: 0 0 auto; min-width: 64px; text-align: center;
  font-family: var(--ar-mono); font-size: 10.5px; letter-spacing: 0.1em;
  padding: 4px 10px; border-radius: 3px; border: 1px solid;
}
.ar-check__tag.is-pass { color: var(--ar-good); border-color: var(--ar-good-tint); background: var(--ar-good-wash); }
.ar-check__tag.is-warn { color: var(--ar-warn); border-color: var(--ar-warn-tint); background: var(--ar-warn-wash); }
.ar-check__tag.is-fail { color: var(--ar-bad); border-color: var(--ar-bad-tint); background: var(--ar-bad-wash); }
/* OFF — the neutral fourth state: the feature this row measures is switched off,
   so there is nothing to grade. No wash, no verdict color: faint ink on the plain
   hairline, quieter than a pass, because the row is stating a fact, not a result.
   Tokens only — the WP admin scheme dialects retint these. */
.ar-check__tag.is-off { color: var(--ar-ink-faint); border-color: var(--ar-line); background: transparent; }
/* span 3 = the max possible rows (text / fix / action) — "1 / -1" can't reach
   IMPLICIT grid rows, so it left the bar one row tall. Unused spanned rows are
   zero-height and invisible. */
.ar-check__rule { grid-row: 1 / span 3; width: 3px; align-self: stretch; border-radius: 2px; background: var(--ar-line-strong); }
.ar-check.is-pass .ar-check__rule { background: var(--ar-good); }
.ar-check.is-warn .ar-check__rule { background: var(--ar-warn); }
.ar-check.is-fail .ar-check__rule { background: var(--ar-bad); }
/* An off row's rule drops below even the neutral default — the faintest line in
   the report, matching a row that measures nothing. */
.ar-check.is-off .ar-check__rule { background: var(--ar-line); }
/* Finished, and waiting on an engine. The amber rule is a call to act, so a card
   with nothing left to do must not wear one — it drops to the neutral rule, the
   same weight as a row that has never asked for anything. */
.ar-check.is-waiting .ar-check__rule { background: var(--ar-line-strong); }

/* Two buttons in the report head (Verify live + Re-run). */
.ar-card__actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }

/* Readiness: the report-refresh sits beside the title as a ↻ icon, kept apart from the
   "open a view/test" buttons so it's never mistaken for a live check. Reuses ar-spin. */
.ar-card__titlewrap { display: flex; align-items: center; gap: 8px; min-width: 0; }
.ar-card__titlewrap .ar-card__title { margin-bottom: 0; }
/* The report-wide total beside the title — the same dot-and-count signal each rung
   card carries, summed, and coloured by the worst rung so it never over-reassures. */
.ar-readiness__total {
  display: inline-flex; align-items: center; gap: 7px;
  font-family: var(--ar-mono); font-size: 13px; font-weight: 600; color: var(--ar-ink-soft);
}
.ar-readiness__total-dot {
  width: 9px; height: 9px; border-radius: 50%; background: var(--ar-line-strong);
}
.ar-readiness__total.is-pass { color: var(--ar-good); }
.ar-readiness__total.is-warn { color: var(--ar-warn); }
.ar-readiness__total.is-fail { color: var(--ar-bad); }
.ar-readiness__total.is-pass .ar-readiness__total-dot { background: var(--ar-good); }
.ar-readiness__total.is-warn .ar-readiness__total-dot { background: var(--ar-warn); }
.ar-readiness__total.is-fail .ar-readiness__total-dot { background: var(--ar-bad); }
.ar-readiness__refresh, .ar-log__refresh {
  flex: 0 0 auto;
  display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 30px; padding: 0;
  border: 0; border-radius: 8px;
  background: transparent; color: var(--ar-ink-soft);
  cursor: pointer;
}
.ar-readiness__refresh:hover:not(:disabled), .ar-log__refresh:hover:not(:disabled) { background: var(--ar-surface-2); color: var(--ar-ink); }
.ar-readiness__refresh:focus-visible, .ar-log__refresh:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; }
.ar-readiness__refresh:disabled, .ar-log__refresh:disabled { cursor: default; opacity: 0.65; }
.ar-readiness__refresh.is-busy svg, .ar-log__refresh.is-busy svg { animation: ar-spin 0.8s linear infinite; }
@media (prefers-reduced-motion: reduce) {
  .ar-readiness__refresh.is-busy svg, .ar-log__refresh.is-busy svg { animation: none; }
}

/* Live self-check results — "what agents actually receive". */
/* Verify-live result modal. Reuses the .ar-modal shell; the title shares its head
   row with the n/n tally, and the result rows scroll in the body. */
.ar-modal__panel--live { max-width: 680px; }
.ar-live-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.ar-live-head .ar-modal__title { margin: 0; }
.ar-live__tally { flex: 0 0 auto; font-family: var(--ar-mono); font-size: 12px; font-weight: 600; color: var(--ar-good); }
.ar-live__tally.is-bad { color: var(--ar-bad); }
.ar-live__tally.is-warn { color: var(--ar-warn); }
.ar-live__list { margin: 0; padding: 0; list-style: none; display: grid; gap: 0; }
.ar-live__row {
  display: flex; flex-wrap: wrap; align-items: center; gap: 3px 10px;
  padding: 8px 2px; border-top: 1px solid var(--ar-line); font-size: 13px;
}
.ar-live__row:first-child { border-top: 0; }
.ar-live__dot { flex: 0 0 auto; width: 8px; height: 8px; border-radius: 50%; background: var(--ar-good); }
.ar-live__row.is-bad .ar-live__dot { background: var(--ar-bad); }
/* The path is the identifier — keep it readable. A min-width forces the detail + tag to
   wrap to their own line (right-aligned, below) when they can't fit beside it, rather than
   squeezing the path into a mid-word stack; overflow-wrap only kicks in if a single path
   is genuinely wider than the row. */
.ar-live__label { flex: 1 1 auto; min-width: 45%; overflow-wrap: anywhere; color: var(--ar-ink); }
.ar-live__detail { flex: 0 0 auto; margin-left: auto; font-family: var(--ar-mono); font-size: 12px; color: var(--ar-ink-soft); text-align: right; }
.ar-live__row.is-bad .ar-live__detail { color: var(--ar-bad); }
/* CDN / edge-cache warning: a shared cache served stored copies, so those fetches
   bypassed WordPress — the activity log under-counts and discovery can go stale. */
.ar-live-cache {
  margin: 0 0 14px; padding: 12px 14px;
  background: color-mix(in srgb, var(--ar-warn) 8%, transparent);
  border: 1px solid color-mix(in srgb, var(--ar-warn) 35%, transparent); border-radius: 8px;
  font-size: 12.5px; line-height: 1.55; color: var(--ar-ink);
}
.ar-live-cache__title { display: block; margin-bottom: 5px; color: var(--ar-warn); font-size: 13px; }
.ar-live-cache p { margin: 0; }
.ar-live-cache__fix { margin-top: 7px !important; }
.ar-live-cache code { font-family: var(--ar-mono); font-size: 11.5px; background: color-mix(in srgb, var(--ar-warn) 12%, transparent); padding: 1px 5px; border-radius: 4px; }
.ar-live-cache a { color: var(--ar-warn); font-weight: 600; }
/* Per-row "cached" marker + amber dot when a cache served that endpoint. */
.ar-live__cachetag {
  flex: 0 0 auto; font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.04em; text-transform: uppercase;
  color: var(--ar-warn); background: color-mix(in srgb, var(--ar-warn) 12%, transparent); padding: 1px 6px; border-radius: 999px; cursor: help;
}
.ar-live__row.is-cached .ar-live__dot { background: var(--ar-warn); }
/* Exposed-files scan: green all-clear box, red "exposed" dot/tag, muted skipped row. */
.ar-live-allclear {
  margin: 0 0 14px; padding: 12px 14px;
  background: color-mix(in srgb, var(--ar-good) 9%, transparent);
  border: 1px solid color-mix(in srgb, var(--ar-good) 35%, transparent); border-radius: 8px;
  font-size: 12.5px; line-height: 1.55; color: var(--ar-ink);
}
.ar-live-allclear strong { color: var(--ar-good); }
.ar-live__row.is-skip { opacity: 0.55; }
.ar-live__row.is-bad .ar-live__cachetag { color: var(--ar-bad); background: color-mix(in srgb, var(--ar-bad) 12%, transparent); }
.ar-live__row.is-warn .ar-live__dot { background: var(--ar-warn); }
.ar-live__row.is-warn .ar-live__detail { color: var(--ar-warn); }
/* Red variant of the alert box for a leaking (non-empty) exposed file; empty ones reuse
   the base amber .ar-live-cache. */
.ar-live-cache--bad { background: color-mix(in srgb, var(--ar-bad) 7%, transparent); border-color: color-mix(in srgb, var(--ar-bad) 35%, transparent); }
.ar-live-cache__title--bad { color: var(--ar-bad); }
.ar-live-cache--bad a { color: var(--ar-bad); }
.ar-live__foot { margin: 12px 0 0; font-size: 11.5px; line-height: 1.5; color: var(--ar-ink-faint); }
/* Loading state while the browser fetches the live endpoints (~1s). */
.ar-live__loading {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 13px; padding: 34px 0 38px;
}
.ar-live__loading-label { font-size: 12.5px; color: var(--ar-ink-soft); }
/* A clean ring spinner: faint track with one accent arc rotating. */
.ar-spinner {
  width: 26px; height: 26px; border-radius: 50%;
  border: 2.5px solid var(--ar-line-strong);
  border-top-color: var(--ar-accent);
  animation: ar-spin 0.7s linear infinite;
}
@keyframes ar-spin { to { transform: rotate(360deg); } }
/* A progress spinner is functional, not decorative — keep it turning under
   reduce-motion (a frozen ring reads as broken), just slow it right down. */
@media (prefers-reduced-motion: reduce) {
  .ar-spinner { animation-duration: 1.6s; }
}

/* ---- Discovery Hub ------------------------------------------------------ */
.ar-wd { display: grid; gap: 22px; min-width: 0; }

/* Canonical endpoint */
/* GET bar + Re-scan button on one row. */
.ar-wd-endpoint-row { display: flex; align-items: stretch; gap: 12px; margin: 4px 0 16px; }
.ar-wd-endpoint-row .ar-wd-canonical { flex: 1; min-width: 0; margin: 0; }
.ar-wd-endpoint-row .ar-btn { flex: 0 0 auto; white-space: nowrap; }

/* flex-wrap + the path's 220px basis: on a phone the label and copy button
   drop to their own line instead of squeezing the URL into a one-character
   column (iPhone, owner's catch 2026-08-11 — same fault as .ar-wd-eps). */
.ar-wd-canonical {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px;
  margin: 4px 0 16px; padding: 13px 15px;
  background: var(--ar-surface-2); border: 1px solid var(--ar-line-strong); border-radius: var(--ar-radius);
}
.ar-wd-canonical__method {
  font-family: var(--ar-mono); font-size: 10px; font-weight: 600; letter-spacing: 0.12em;
  color: var(--ar-on-signal); background: var(--ar-accent); padding: 3px 7px; border-radius: 3px;
}
.ar-wd-canonical__path { flex: 1 1 220px; min-width: 0; font-family: var(--ar-mono); font-size: 13.5px; color: var(--ar-ink); overflow-wrap: anywhere; }
.ar-wd-canonical__ext {
  display: inline-flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; margin: -4px -4px -4px 0; border-radius: 4px;
  color: var(--ar-ink-faint); font-size: 15px; text-decoration: none;
  transition: color 0.15s, background 0.15s;
}
.ar-wd-canonical__ext:hover { color: var(--ar-accent); background: color-mix(in srgb, var(--ar-accent) 8%, transparent); }
.ar-wd-canonical__ext:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 1px; }
/* Copy affordance for auth-gated agent addresses (opening them in a browser can
   only ever produce a 401 — copying into an agent's config is the real intent). */
.ar-wd-copy {
  width: auto; padding: 0 8px; border: 0; background: none; cursor: pointer;
  font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase;
}
.ar-wd-copy.is-copied { color: var(--ar-good); }
.ar-wd-altlinks { margin-bottom: 18px; }

/* Stat tiles */
.ar-wd-stats {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(108px, 1fr)); gap: 1px;
  background: var(--ar-line); border: 1px solid var(--ar-line); border-radius: var(--ar-radius); overflow: hidden;
}
.ar-wd-stat { display: flex; flex-direction: column; gap: 2px; padding: 14px 16px; background: var(--ar-surface); text-align: center; }
.ar-wd-stat strong { font-family: var(--ar-mono); font-size: 24px; font-weight: 600; }
.ar-wd-stat span { font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ar-ink-faint); }
.ar-wd-stat small { margin-top: 2px; font-size: 11px; line-height: 1.3; color: var(--ar-ink-soft); }
.ar-wd-stat.is-bad strong { color: var(--ar-bad); }
/* A clickable stat: reset the button chrome, add a quiet hover so it reads as a
   jump link to its own section. */
button.ar-wd-stat { border: 0; font: inherit; cursor: pointer; transition: background 0.12s; }
button.ar-wd-stat:hover { background: color-mix(in srgb, var(--ar-accent) 7%, var(--ar-surface)); }
button.ar-wd-stat:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: -2px; }
/* A stat count that doesn't divide evenly into a fixed grid (the Discovery hub's
   five totals) flex-fills instead, so the last row stretches to the full width
   rather than leaving an empty bordered cell. */
.ar-wd-stats--fill { display: flex; flex-wrap: wrap; }
/* Basis matches the grid's 108px min so it keeps the same per-row count as before
   (e.g. five-up when wide); flex-grow just lets a short last row fill the width. */
.ar-wd-stats--fill .ar-wd-stat { flex: 1 1 108px; }

.ar-wd-empty { margin: 8px 0 0; color: var(--ar-ink-soft); font-size: 13px; }

/* Medium container: the Readiness header carries four buttons, so shrink just those a bit
   earlier than the phone breakpoint — they stay a tidy single-line row instead of
   dominating the header. Scoped to the inline header, so buttons elsewhere are untouched. */
@container (max-width: 720px) {
  .ar-card__head--inline .ar-btn { padding: 9px 16px; font-size: 11px; }
}

/* ---- Small screens: ease the chrome down so cards aren't desktop-sized on a
   phone — titles + big stat numbers shrink a notch, buttons stop hogging the
   row, and header action rows / the Discovery endpoint stack vertically. ---- */
@container (max-width: 560px) {
  /* Card header: title/lead on its own line, action buttons below it rather than
     squeezed beside it (mainly Endpoint activity, whose long lead needs the room). */
  .ar-card__head { flex-direction: column; align-items: stretch; gap: 12px; }
  .ar-card__actions { width: 100%; }
  /* …but a header that's just a short title + a couple of buttons (Readiness
     report) stays on one row — with the smaller buttons it fits — and only wraps
     the buttons below if it truly can't. */
  .ar-card__head--inline { flex-direction: row; flex-wrap: wrap; align-items: center; gap: 10px 12px; }
  .ar-card__head--inline .ar-card__actions { width: auto; }
  /* Buttons sit nearer the text size and don't dominate. */
  .ar-btn { padding: 9px 16px; font-size: 11px; }
  /* Headings + prominent numbers ease down. */
  .ar-card__title { font-size: 16.5px; }
  .ar-wd-stat strong { font-size: 20px; }
  .ar-checkgroup__name { font-size: 15px; }
  /* Discovery endpoint: stack the URL box and Re-scan so the path keeps one line
     and the button spans the width instead of crowding it. */
  .ar-wd-endpoint-row { flex-direction: column; align-items: stretch; }
  .ar-wd-endpoint-row .ar-btn { width: 100%; }
  .ar-wd-canonical__path { font-size: 12px; }
}

/* Narrow: the rung header's tally ("21 graded · 8 set aside") never shrinks,
   so beside it the blurb was squeezed into a ~200px gutter and even the title
   wrapped mid-phrase. Give the tally its own line under the text, indented to
   clear the status dot — the header keeps its reading order, and the sentence
   gets the full width. Same rule for the set-aside header's note and its
   Restore All. */
@container (max-width: 500px) {
  .ar-checkgroup__head { flex-wrap: wrap; }
  .ar-checkgroup__count { flex: 1 0 100%; padding-left: 20px; text-align: left; }
  .ar-setaside__head { flex-wrap: wrap; }
  .ar-setaside__note { flex: 1 0 100%; }
  .ar-setaside__restoreall { margin-left: 0; }
  /* The left-out list is a TWO-column table (search + views) — it never needed
     the five-column worklist's 520px floor, which forced a sideways scroll and
     clipped its own second heading mid-word. */
  .ar-opp__noiselist .ar-opp__queries { min-width: 0; }
  .ar-opp__noiselist .ar-opp__queries th:not(:first-child) { white-space: normal; }
}

/* Readiness header carries FOUR actions — too many to sit beside the title on a
   narrow container without a ragged two-row wrap. Below this width, drop the actions
   under the title and stack them full-width: one clear, un-truncated tap target per
   row. Scoped to the Readiness header (--stack-sm), so other inline headers (which
   carry a button or two) keep their compact single-row treatment. Placed AFTER the
   560px block so it wins the equal-specificity ties at every width it covers. */
@container (max-width: 640px) {
  .ar-card__head--stack-sm { flex-direction: column; align-items: stretch; gap: 12px; }
  .ar-card__head--stack-sm .ar-card__actions { width: 100%; flex-direction: column; align-items: stretch; }
  .ar-card__head--stack-sm .ar-card__actions .ar-btn { width: 100%; }
}

/* Provider groups: Declared (always shown) and Auto-discovered (collapsible). */
.ar-wd-group { margin-top: 18px; }
/* The group heading inside a fold's summary takes the summary's own type, the
   way the Search Opportunities groups do — a heading in the outline, a summary
   line on screen. Its own uppercase style would fight the box it now sits in. */
.ar-wd-foldtitle { margin: 0; font: inherit; color: inherit; }
.ar-wd-group__title {
  margin: 0; font-size: 11px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--ar-ink-faint);
}
.ar-wd-group__toggle {
  display: flex; align-items: center; gap: 7px; width: 100%; padding: 0; border: 0; background: none;
  cursor: pointer; font: inherit; text-align: left;
  font-size: 11px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ar-ink-faint);
}
.ar-wd-group__toggle:hover { color: var(--ar-ink-soft); }
/* Disclosure carets are the SAME solid triangle the plugin's one fold draws
   (owner, 2026-08-11, second pass): a ▸ font glyph at 9px was invisible and
   at 12px still read as decoration — a glyph's ink is a fraction of its em
   box, while drawn geometry is all ink. font-size:0 swallows the glyph the
   markup still carries. Tooltip pointers and scroll hints are different
   affordances and stay as they were. */
.ar-wd-group__caret {
  display: inline-block; width: 0; height: 0; font-size: 0; flex: 0 0 auto;
  border-left: 6px solid var(--ar-ink-soft);
  border-top: 5px solid transparent; border-bottom: 5px solid transparent;
  transition: transform 0.15s ease, border-color 0.15s ease;
}
.ar-wd-group__caret.is-open { transform: rotate(90deg); border-left-color: var(--ar-accent); }
.ar-wd-group__count {
  font-family: var(--ar-mono); font-size: 10px; font-weight: 600; letter-spacing: 0;
  padding: 1px 7px; border-radius: 999px; border: 1px solid var(--ar-line-strong); color: var(--ar-ink-faint);
}
/* Tighten the list when it sits directly under a group header. */
.ar-wd-group .ar-wd-list { margin-top: 10px; }

/* Inline engine status under the "Found automatically" header: which places
   Agentimus scanned, each with a ✓/✕. Always visible, even when rows collapse. */
.ar-wd-engines {
  display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px;
  margin: 8px 0 0; font-size: 12px; color: var(--ar-ink-soft);
}
.ar-wd-engine {
  font-family: var(--ar-mono); font-size: 11px;
  padding: 1px 8px; border-radius: 999px; border: 1px solid var(--ar-line-strong);
}
.ar-wd-engine.is-on { color: var(--ar-good); border-color: var(--ar-good-tint); background: var(--ar-good-wash); }
.ar-wd-engine.is-off { color: var(--ar-bad); border-color: var(--ar-bad-tint); background: var(--ar-bad-wash); }

/* Provider rows */
.ar-wd-list { margin: 14px 0 0; padding: 0; list-style: none; display: grid; gap: 0; border-top: 1px solid var(--ar-line); }
.ar-wd-prov { display: flex; gap: 14px; padding: 16px 4px; border-bottom: 1px solid var(--ar-line); }
.ar-wd-prov__bar { flex: 0 0 auto; width: 3px; border-radius: 2px; background: var(--ar-accent); }
.ar-wd-prov__body { flex: 1; min-width: 0; }
/* The head is a row of THREE things and only the first is a button: the toggle
   takes the free width, the state and the switch keep their own. A control
   inside a button would be invalid markup, and publishing must never be a click
   that also unfolds the row.
   ⭐ THE SWITCH COLUMN IS RESERVED WHETHER OR NOT THE ROW HAS ONE. As a flex row
   the pills landed at a different x depending on whether a switch followed them,
   so no two rows' states lined up and the eye could not run down the column that
   matters most. A fixed last column costs one empty cell on the few rows the
   owner cannot switch. */
/* ⚠️⚠️ EVERY CHILD IS PLACED BY HAND, in both layouts. Left to auto-placement,
   the narrow rule only pinned the switch's ROW — so the switch took column 1 and
   the name was squeezed into what was left, one word per line, with the toggle
   floating to the right of its own switch. A grid child whose position matters
   gets both coordinates or it gets neither. */
.ar-wd-prov__head {
  display: grid; grid-template-columns: minmax(0, 1fr) auto 40px;
  align-items: center; gap: 9px 10px;
}
.ar-wd-prov__head strong { font-size: 14.5px; font-weight: 600; }
.ar-wd-prov__toggle {
  grid-column: 1; grid-row: 1;
  min-width: 0; display: block; text-align: left;
  background: none; border: 0; padding: 0; margin: 0; font: inherit; color: inherit; cursor: pointer;
}
.ar-wd-prov__head .ar-wd-state { grid-column: 2; grid-row: 1; }
.ar-wd-prov__head .ar-wd-switch { grid-column: 3; grid-row: 1; justify-self: end; }
/* A switch the owner cannot move: the same control, visibly fixed. Muted so it
   does not invite a click, but still legible as on-or-off — the state is the
   point; only the ability to change it is missing. */
.ar-wd-switch.is-fixed { cursor: default; }
.ar-wd-switch.is-fixed .ar-wd-switch__track { opacity: 0.55; }
/* Narrow: the state drops to its own line under the name, full width, rather
   than squeezing the name to nothing. The switch keeps the top-right corner —
   it is the only control here, and it must stay where a thumb expects it. */
@container (max-width: 700px) {
  .ar-wd-prov__head { grid-template-columns: minmax(0, 1fr) auto; }
  .ar-wd-prov__head .ar-wd-switch { grid-column: 2; grid-row: 1; }
  .ar-wd-prov__head .ar-wd-state { grid-column: 1 / -1; grid-row: 2; justify-self: start; }
}
.ar-wd-prov__toggle:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 3px; border-radius: 3px; }
.ar-wd-prov__name { display: flex; flex-wrap: wrap; align-items: center; gap: 9px; }
/* A caret that says the row opens, and turns when it has. Drawn in CSS rather
   than shipped as a glyph so it inherits the ink of whatever theme it lands in. */
.ar-wd-prov__caret {
  flex: 0 0 auto; width: 7px; height: 7px; border-right: 1.5px solid var(--ar-ink-faint);
  border-bottom: 1.5px solid var(--ar-ink-faint); transform: rotate(-45deg); margin-right: 2px;
}
.ar-wd-prov.is-expanded .ar-wd-prov__caret { transform: rotate(45deg); }
.ar-wd-prov__toggle:hover .ar-wd-prov__caret { border-color: var(--ar-ink); }
.ar-wd-prov__detail { margin-top: 2px; }
/* One state per row, in words. ⛔ Colour is never the only carrier — each pill
   says what it means, so it survives a colour-blind reader and a screenshot. */
.ar-wd-state {
  flex: 0 0 auto; font-size: 11.5px; padding: 2px 9px; border-radius: 999px;
  border: 1px solid var(--ar-line-strong); color: var(--ar-ink-soft); white-space: nowrap;
}
.ar-wd-state.is-open { color: var(--ar-good); border-color: var(--ar-good-tint); background: var(--ar-good-wash); }
.ar-wd-state.is-held, .ar-wd-state.is-off { color: var(--ar-warn); border-color: var(--ar-warn-tint); background: var(--ar-warn-wash); }
/* The jobs a row offers, listed inside it. Columns where there is room — 23
   names in one column is a scroll; in three or four it is a block you take in at
   once. `auto-fill` with a floor means the count follows the width, so nothing
   here needs a breakpoint of its own. */
.ar-wd-jobs {
  margin: 12px 0 2px; padding: 0; list-style: none;
  display: grid; grid-template-columns: repeat(auto-fill, minmax(232px, 1fr));
  gap: 8px; align-content: start;
}
/* ⭐ A CARD EACH, and a bordered one — his call, 2026-08-17: bare two-line text
   in a grid is a list with gaps in it, not a design. ⛔ BORDER ONLY, no fill:
   every step of separation is paid out of the legibility of what reads on it,
   and a card that always holds a sentence is exactly where that bill comes due
   (the same reason .ar-fold drops to the plain surface the moment it opens).
   The fill is spent on HOVER instead, where it earns something. */
.ar-wd-jobs li {
  display: grid; gap: 3px; align-content: start; min-width: 0;
  padding: 9px 11px; border: 1px solid var(--ar-line); border-radius: var(--ar-radius);
  font-size: 12.5px;
}
.ar-wd-jobs li:hover { border-color: var(--ar-line-strong); background: var(--ar-surface-2); }
/* ⭐ The one thing worth finding in twenty-three cards, marked in FORM as well as
   in words: a job that changes the site carries a warn-coloured edge, so "which
   of these touch my content" is answered by looking rather than by reading every
   card. The chip still says it in words — colour is never the only carrier. */
.ar-wd-jobs li.is-write { border-left: 2px solid var(--ar-warn-tint); padding-left: 10px; }
/* The name and its marker, on the card's own bottom line. */
.ar-wd-jobs__foot { display: flex; align-items: center; gap: 8px; min-width: 0; }
/* ⚠️⚠️ wp-admin styles every <code> with its own grey background and padding.
   Inside a grid or flex parent that box stretches the whole column, so all 23
   job names rendered as full-width grey bars — a list of machine names read as a
   column of disabled input fields. The mono face is what says "this is a machine
   string"; it does not need a box, and a box it did not ask for is worse than
   none. Reset explicitly rather than hoping specificity holds. */
/* ⚠️⚠️ THIS LIST GROWS EVERY TIME WE LAY OUT A `code`, and it has caught us
   twice: wp-admin puts a grey background and padding on every `<code>`, and any
   `code` that is a flex or grid item stretches that box the full width, so a
   machine string renders as a disabled-looking input field. ⛔ Adding a new
   `code` inside a flex row without adding it here is a bug you will see in a
   screenshot, not in the diff. */
.ar-wd-jobs code,
.ar-wd-eps code,
.ar-wd-addrs__list code {
  background: none; padding: 0; border-radius: 0;
  overflow-wrap: anywhere; min-width: 0;
}
/* The identifier is the SECOND thing on the card, and it looks like it: mono,
   small, faint. It is what a developer copies, not what an owner reads. */
.ar-wd-jobs code { font-size: 11px; color: var(--ar-ink-faint); }
.ar-wd-eps code { font-size: 12px; color: var(--ar-ink); }
.ar-wd-jobs__title { color: var(--ar-ink); font-size: 13px; line-height: 1.4; }
/* Pushed to the right of its own column, so the markers form a readable edge
   instead of landing wherever the name happens to end. */
.ar-wd-jobs__changes {
  flex: 0 0 auto; margin-left: auto;
  font-family: var(--ar-mono); font-size: 9.5px; letter-spacing: 0.06em;
  color: var(--ar-warn); border: 1px solid var(--ar-warn-tint); background: var(--ar-warn-wash);
  padding: 1px 6px; border-radius: 3px;
}
.ar-wd-ep__verdict { flex: 1 1 100%; font-size: 12px; color: var(--ar-ink-soft); }
/* The age sits a step behind the verdict it dates — same line where there is
   room, its own when there is not. */
.ar-wd-ep__when { color: var(--ar-ink-faint); }
/* What the verdict means for the owner — its own line, because it answers a
   different question from the finding above it. */
.ar-wd-ep__means { display: block; margin-top: 4px; color: var(--ar-ink-soft); }

/* ⭐ NOT IN YOUR PUBLIC FILES, said in form as well as in words — his call. The
   row recedes so a glance down the list separates what is live from what is not,
   without reading a single pill. ⛔ The pill itself is exempt: the row goes quiet,
   the REASON does not, or the treatment would hide the thing it is flagging.
   ⚠️ Text drops one tier only (ink → soft), never an `opacity` on the whole row:
   opacity would fade the pill and the switch with it, and a control you can still
   press must never look disabled. */
.ar-wd-prov.is-quiet .ar-wd-prov__head strong,
.ar-wd-prov.is-quiet .ar-wd-prov__desc { color: var(--ar-ink-soft); }
.ar-wd-prov.is-quiet .ar-wd-prov__bar { background: var(--ar-line-strong); }
.ar-wd-prov.is-quiet .ar-wd-type { color: var(--ar-ink-faint); border-color: var(--ar-line); background: transparent; }
.ar-wd-eps li.is-held code { color: var(--ar-ink-soft); text-decoration: line-through; }
.ar-wd-prov__doors { color: var(--ar-ink-faint); }

/* The counts ARE the filter — one segmented control, every cell the same kind of
   thing. ⛔ Never a mixed strip again: a row of identical-looking cells where only
   some respond is a screen asking a question it has no answer to. */
/* ⚠️ THE SEAM IS `--ar-line-strong` HERE, NOT `--ar-line` — and that is not a
   different style from the settings tabs, it is the same apparent contrast on a
   different ground. Those tabs draw `--ar-line` against the plain surface, where
   it reads; these cells sit on the RAISED surface, where the very same colour is
   9 points away and disappears (measured: seam rgb(57,67,74) on cells
   rgb(48,57,64)). ⭐ Match a separator to the ground it lands on, never to the
   token another component happened to use. */
.ar-wd-sum {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(132px, 1fr)); gap: 1px;
  margin: 14px 0 0; background: var(--ar-line-strong); border: 1px solid var(--ar-line-strong);
  border-radius: var(--ar-radius); overflow: hidden;
}
.ar-wd-sum__cell {
  background: var(--ar-surface-2); padding: 9px 13px; text-align: left;
  border: 0; font: inherit; color: inherit; cursor: pointer;
}
.ar-wd-sum__cell span {
  display: block; font-family: var(--ar-mono); font-size: 9.5px;
  letter-spacing: 0.09em; text-transform: uppercase; color: var(--ar-ink-faint);
}
.ar-wd-sum__cell strong {
  display: block; font-size: 15.5px; margin-top: 3px; font-variant-numeric: tabular-nums;
  color: var(--ar-ink-soft);
}
/* The number keeps its meaning in both states — green is published, amber is held
   back. Selection is carried by the GROUND and the underline, never by recolouring
   the figure, which would make the colour read as "selected" rather than "these
   are the ones nobody can see". */
.ar-wd-sum__cell strong.is-on { color: var(--ar-good); }
.ar-wd-sum__cell strong.is-held { color: var(--ar-warn); }
.ar-wd-sum__cell:hover { background: var(--ar-field); }
.ar-wd-sum__cell:hover span { color: var(--ar-ink-soft); }
/* ⭐ SELECTION IS MARKED THE WAY THIS PLUGIN MARKS SELECTION: a white fill and an
   accent along the TOP edge — his call, 2026-07-19, the same pair
   `.ar-subnav__item.is-active` wears. I had reached for a bottom underline, which
   belongs to the top-level nav (`.ar__tab`) and to nothing else. A segmented strip
   inside a card is sub-nav, and a screen with two different ways of saying
   "this one is selected" makes the reader learn the same idea twice.
   ⚠️ An inset shadow, not a border: a border would change the cell's height and
   push every unselected neighbour out of line. */
.ar-wd-sum__cell[aria-pressed="true"] {
  background: var(--ar-surface); box-shadow: inset 0 2px 0 0 var(--ar-accent);
}
.ar-wd-sum__cell[aria-pressed="true"] span { color: var(--ar-ink); }
.ar-wd-sum__cell[aria-pressed="true"] strong { color: var(--ar-ink); }
.ar-wd-sum__cell[aria-pressed="true"] strong.is-on { color: var(--ar-good); }
.ar-wd-sum__cell[aria-pressed="true"] strong.is-held { color: var(--ar-warn); }
.ar-wd-sum__cell:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: -2px; }
/* One panel per group — the panel itself is `.ar-wd-sect`, which already owns the
   border, radius, padding and top margin. ⛔ This rule sets NONE of those again:
   two single-class selectors both declaring padding is decided by which one sits
   later in the file, and a layout that depends on line numbers is a layout that
   breaks the next time someone reorders a stylesheet.
   ⭐ What is left is the part `.ar-wd-sect` has no opinion about: the heading is a
   HEADING — 15px, ink, its own weight — not the 11px faint uppercase label the
   MCP card's sub-lists wear. Those name a list inside a card; these name half of
   what the screen is about, and a header quieter than the rows beneath it cannot
   separate anything. */
.ar-wd-part__title {
  display: flex; align-items: center; gap: 4px; flex-wrap: wrap;
  margin: 0; font-size: 15px; font-weight: 650; color: var(--ar-ink);
  letter-spacing: -0.005em;
}
/* ⚠️⚠️ THE TWO CARETS MUST NOT READ ALIKE, or the screen has one gesture meaning
   two things. The SECTION's is `.ar-fold`'s own triangle at the far left of a
   bordered box — shutting it puts half the card away. A ROW's is a small chevron
   beside a name inside that box, and it only ever reveals detail about that one
   thing. Outer hides a place, inner opens a thing. */
.ar-wd-part > summary { padding: 12px 0 11px; }
/* ⭐ THE COUNT GOES TO THE RIGHT EDGE AND CARRIES THE ACCENT — his call. Sitting
   against the title it read as punctuation on the end of a sentence; at the far
   right it becomes a column, so two sections' numbers can be compared without
   reading either heading. The heading takes the free width for it to be pushed
   across. */
.ar-wd-part > summary > .ar-wd-part__title { flex: 1 1 auto; min-width: 0; }
.ar-wd-part__title .ar-wd-group__count {
  margin-left: auto; font-size: 11px;
  color: var(--ar-accent);
  border-color: color-mix(in srgb, var(--ar-accent) 30%, var(--ar-surface));
  background: color-mix(in srgb, var(--ar-accent) 9%, var(--ar-surface));
}
.ar-wd-part[open] > summary { border-bottom: 1px solid var(--ar-line); }
.ar-wd-part[open] { padding-bottom: 6px; }
/* The lead sits between the summary and the list, not hard against either. */
.ar-wd-part > .ar-card__note { margin: 12px 0 0; }
/* ⭐ The lead is a NOTICE, full width — his call. It wears `.ar-card__note--wide`,
   the plugin's own notice block, rather than a bespoke paragraph: one notice
   style on the screen, and the measure runs the whole card so the definition
   does not leave a ragged grey column beside a full-width list. */
/* The list's first row would otherwise draw a rule a hairline under the lead. */
.ar-wd-part > .ar-wd-list { margin-top: 10px; }
/* The gathered addresses, above the rows they summarise. Quieter than the rows —
   it is a recap, not the inventory — and its own rule closes it off so the first
   provider row does not read as the fifth address. */
.ar-wd-addrs { margin: 14px 0 4px; padding-bottom: 14px; border-bottom: 1px solid var(--ar-line); }
.ar-wd-addrs > .ar-wd-lhead { margin: 0 0 6px; }
/* A recap reads as a LIST, not as cards: no border, no fill, one tight line each.
   ⭐ The transport label keeps a fixed column so every URL starts at the same x —
   a ragged left edge is what makes a scannable list unscannable. */
.ar-wd-addrs__list { margin: 0; padding: 0; list-style: none; display: grid; gap: 1px; }
.ar-wd-addrs__list li {
  display: flex; align-items: center; gap: 10px; min-width: 0;
  padding: 3px 2px; border-radius: 3px;
}
.ar-wd-addrs__list li:hover { background: var(--ar-surface-2); }
.ar-wd-addrs__type {
  flex: 0 0 auto; width: 34px;
  font-family: var(--ar-mono); font-size: 9px; letter-spacing: 0.08em; color: var(--ar-ink-faint);
}
.ar-wd-addrs__list code { flex: 1 1 auto; min-width: 0; font-size: 11.5px; color: var(--ar-ink); overflow-wrap: anywhere; }
.ar-wd-addrs__src { flex: 0 0 auto; font-size: 11.5px; color: var(--ar-ink-soft); }
.ar-wd-addrs__list .ar-wd-auth { flex: 0 0 auto; }
/* The label that re-announces the rows after the recap interrupts them. Its list
   follows immediately, so it keeps its own bottom margin tight. */
.ar-wd-part > .ar-wd-lhead { margin: 16px 0 0; }
.ar-wd-part > .ar-wd-lhead + .ar-wd-list { margin-top: 6px; }
.ar-wd-type {
  font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--ar-accent); border: 1px solid color-mix(in srgb, var(--ar-accent) 28%, var(--ar-surface)); background: color-mix(in srgb, var(--ar-accent) 7%, var(--ar-surface)); padding: 2px 7px; border-radius: 3px;
}
.ar-wd-type--agent { color: var(--ar-warn); border-color: var(--ar-warn-tint); background: var(--ar-warn-wash); }
.ar-wd-ver { font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-faint); }
.ar-wd-prov__desc { margin: 7px 0 0; font-size: 13px; color: var(--ar-ink-soft); }
.ar-wd-prov__provider { margin: 6px 0 0; }
.ar-wd-prov__provider code { font-size: 11px; color: var(--ar-ink-faint); }

.ar-wd-caps { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 11px; }
.ar-wd-cap {
  font-family: var(--ar-mono); font-size: 11.5px; color: var(--ar-ink);
  background: var(--ar-surface-2); border: 1px solid var(--ar-line); padding: 3px 8px; border-radius: 3px;
}

/* Addresses wear the same card as the jobs beside them — one open row, one row
   grammar. They were bare flex lines while the jobs were cards, which read as
   two different screens stacked. */
.ar-wd-eps { margin: 12px 0 0; padding: 0; list-style: none; display: grid; gap: 8px; }
.ar-wd-eps li {
  display: flex; align-items: center; gap: 9px; flex-wrap: wrap;
  padding: 9px 11px; border: 1px solid var(--ar-line); border-radius: var(--ar-radius);
}
.ar-wd-ep__type {
  font-family: var(--ar-mono); font-size: 9.5px; letter-spacing: 0.1em; text-transform: uppercase;
  color: var(--ar-ink-faint); border: 1px solid var(--ar-line-strong); padding: 2px 6px; border-radius: 3px;
}
/* The URL claims the row's spare width and, when the badges leave it less
   than ~220px (a phone), wraps to its own full-width line — without this it
   was squeezed to a one-character-per-line column on narrow screens. */
.ar-wd-eps code { font-size: 12px; color: var(--ar-ink); flex: 1 1 220px; min-width: 0; overflow-wrap: anywhere; }
.ar-wd-auth { font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.06em; padding: 2px 7px; border-radius: 3px; border: 1px solid; }
.ar-wd-auth.is-open { color: var(--ar-good); border-color: var(--ar-good-tint); background: var(--ar-good-wash); }
.ar-wd-auth.is-locked { color: var(--ar-warn); border-color: var(--ar-warn-tint); background: var(--ar-warn-wash); }

@container (max-width: 760px) { .ar-wd-mcp { grid-template-columns: repeat(2, 1fr) !important; } }

/* MCP & tools */
.ar-wd-mcp {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 1px; margin: 14px 0 0;
  background: var(--ar-line); border: 1px solid var(--ar-line); border-radius: var(--ar-radius); overflow: hidden;
}
.ar-wd-mcp__cell { display: flex; flex-direction: column; gap: 3px; padding: 12px 14px; background: var(--ar-surface); }
.ar-wd-mcp__cell span {
  font-family: var(--ar-mono); font-size: 9.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ar-ink-faint);
}
.ar-wd-mcp__cell strong { font-family: var(--ar-mono); font-size: 13px; }
.ar-wd-mcp__cell strong.is-on { color: var(--ar-good); }
.ar-wd-mcp__cell strong.is-off { color: var(--ar-ink-faint); }
.ar-wd-mcp-endpoint { margin: 12px 0 0; }
/* Each of the three lists gets its own panel inside the card. Headings alone
   were not enough separation — the sections still read as one long column.
   BORDER ONLY, surface unchanged: every one of these always holds text, and a
   step of separation is paid out of the legibility of whatever reads on it —
   the same reason .ar-fold drops back to the plain surface when it opens. */
.ar-wd-sect {
  margin-top: 16px; padding: 0 15px 6px;
  border: 1px solid var(--ar-line); border-radius: var(--ar-radius);
}

/* A list whose length the SITE decides, not us: one capability per public
   REST post type and taxonomy, so a busy shop can push it past 60 rows. The
   card holds its height and the rows scroll inside — max-height, not height,
   so a short list still sits at its natural size instead of in a half-empty
   box. `overscroll-behavior` is deliberately NOT set: once the list reaches
   its end the wheel must pass to the page, or the card becomes a trap the
   pointer has to escape from (the lesson already learned on the index
   groups' own scrollbox). */
.ar-wd-scrollbox {
  max-height: 430px; overflow-y: auto;
  scrollbar-gutter: stable;
}
/* The air between the rows and the scrollbar. Double selector on purpose:
   `.ar-wd-tools` further down sets `padding: 0` and ties a single class on
   specificity, so a single-class padding here silently loses to it — which
   is exactly how the rows ended up flush against the thumb. */
.ar-wd-tools.ar-wd-scrollbox { padding-right: 14px; }
/* Rendered only when the box measures an actual overflow. Without it the
   capped list reads as a list that simply ended. */
.ar-wd-scrollnote {
  margin: 8px 0 0; font-size: 11.5px; color: var(--ar-ink-faint);
}
/* The header belongs to its panel now, so it sheds its free-standing spacing. */
.ar-wd-sect > .ar-wd-lhead { margin: 13px 0 2px; }
/* The list's own top rule would sit a hairline under the panel's border. */
.ar-wd-sect > .ar-wd-tools { margin-top: 0; border-top: 0; }
/* …and its last row's rule would sit a hairline above the panel's bottom. */
.ar-wd-sect > .ar-wd-tools > li:last-child { border-bottom: 0; }
.ar-wd-sect > .ar-wd-mcp-endpoint:last-of-type { margin-bottom: 8px; }

/* Names each of the three lists. Same voice as the provider groups' headers
   above, minus the caret — these do not fold. */
.ar-wd-lhead {
  display: flex; align-items: center; gap: 7px; flex-wrap: wrap;
  margin: 20px 0 10px;
  font-size: 11px; font-weight: 700; letter-spacing: 0.06em;
  text-transform: uppercase; color: var(--ar-ink-faint);
}
.ar-wd-lhead:first-of-type { margin-top: 16px; }
.ar-wd-lhead__note {
  font-family: var(--ar-mono); font-size: 10px; font-weight: 400;
  letter-spacing: 0; text-transform: none; color: var(--ar-ink-faint);
}
.ar-wd-note {
  margin: 12px 0 0; padding: 10px 13px; font-size: 12.5px; line-height: 1.45; color: var(--ar-ink-soft);
  background: var(--ar-surface-2); border-left: 2px solid var(--ar-warn); border-radius: 0 var(--ar-radius) var(--ar-radius) 0;
}
.ar-wd-tools { margin: 14px 0 0; padding: 0; list-style: none; display: grid; gap: 0; border-top: 1px solid var(--ar-line); }
.ar-wd-tool {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 12px 4px; border-bottom: 1px solid var(--ar-line);
  /* ⚠️ WRAPS, because the meta side can carry a long line. `.ar-wd-tool__meta` is
     flex: 0 0 auto, so without this the row keeps ONE line and squeezes the meta
     text into a sliver — measured on agentimus-site.test, where a capability
     declared by three shops rendered 427px tall, one word per line, overflowing
     its box. Wrapping drops the meta to its own line instead: 80px, no overflow. */
  flex-wrap: wrap;
}
/* A provider group: the row, plus the tool names it can reveal. Its own class
   rather than .ar-wd-tool, because that one is a flex ROW and this needs to be
   a column holding a row and a list. */
/* The tool groups wear the shared .ar-fold box, so they read as the same
   disclosure the provider groups do. ⚠️ This class carries NO border of its own:
   it used to draw a bottom rule for a stacked list, and leaving that as
   `border-bottom: 0` here rubbed out the FOLD's own bottom edge — an open group
   with three sides. The box belongs to .ar-fold; nothing here may touch it. */
/* A list of folds is a stack of boxes, not a ruled list. */
.ar-wd-tools--folds { border: 0; }
.ar-wd-tools--folds > li { border: 0; padding: 0; }
/* A group with no names to reveal: same box, same line, no caret and no
   pointer — it is a statement, not a control. */
.ar-fold.is-static { background: var(--ar-surface-2); }
.ar-fold__static {
  display: flex;
  align-items: center;
  gap: 9px;
  flex-wrap: wrap;
  margin: 0;
  padding: 11px 0;
  font-size: 13px;
  font-weight: 600;
  color: var(--ar-ink);
}
.ar-wd-grp__row {
  display: flex; align-items: center; gap: 10px; width: 100%;
  padding: 12px 4px; border: 0; background: none; font: inherit;
  text-align: left; cursor: pointer; color: inherit;
}
.ar-wd-grp__row.is-static { cursor: default; }
.ar-wd-grp__row:not(.is-static):hover { background: var(--ar-surface-2); }
.ar-wd-grp__row:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: -2px; }
.ar-wd-grp__row .ar-wd-tool__id { flex: 1 1 auto; }
/* The names, indented under the caret so they read as that group's contents. */
.ar-wd-grp__names {
  list-style: none; margin: 0 0 12px; padding: 0 4px 0 26px;
  display: grid; gap: 5px;
}
.ar-wd-grp__names li { display: flex; gap: 10px; align-items: baseline; min-width: 0; }
.ar-wd-grp__names code { font-size: 11.5px; color: var(--ar-ink-soft); flex: 0 0 auto; }
.ar-wd-grp__names span { font-size: 12px; color: var(--ar-ink-faint); min-width: 0; }
.ar-wd-tool__id { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.ar-wd-tool__id code { font-size: 12.5px; color: var(--ar-ink); }
.ar-wd-tool__title { font-size: 12px; color: var(--ar-ink-soft); }
.ar-wd-tool__meta { display: flex; align-items: center; gap: 7px; flex: 0 0 auto; min-width: 0; }
.ar-wd-badge {
  font-family: var(--ar-mono); font-size: 9.5px; letter-spacing: 0.06em; color: var(--ar-ink-soft);
  border: 1px solid var(--ar-line-strong); padding: 2px 7px; border-radius: 3px;
}
.ar-wd-badge--schema { color: var(--ar-accent); border-color: color-mix(in srgb, var(--ar-accent) 28%, var(--ar-surface)); background: color-mix(in srgb, var(--ar-accent) 7%, var(--ar-surface)); }
.ar-wd-cap-src { font-size: 12px; color: var(--ar-ink-soft); }

/* Addresses held back because a real anonymous request could not open them. The
   list sits UNDER the published ones and is quieter than them: it is an account
   of an absence, not a fault to alarm anyone. */
.ar-wd-reach__note { margin: 12px 0 0; font-size: 12.5px; color: var(--ar-ink-soft); }
.ar-wd-reach { margin-top: 18px; padding-top: 16px; border-top: 1px solid var(--ar-line); }
.ar-wd-reach__title { margin: 0 0 4px; font-size: 14px; font-weight: 600; color: var(--ar-ink); }
.ar-wd-reach__row { margin-top: 10px; padding: 10px 12px; border: 1px solid var(--ar-line); border-radius: 6px; background: var(--ar-surface-2); }
.ar-wd-reach__head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.ar-wd-reach__why { margin: 6px 0 0; font-size: 12.5px; color: var(--ar-ink-soft); }

.ar-card__count {
  font-family: var(--ar-mono); font-size: 12px; font-weight: 600; color: var(--ar-ink-soft);
  border: 1px solid var(--ar-line-strong); border-radius: 999px; padding: 1px 9px; margin-left: 6px; vertical-align: middle;
}

/* Rows since 2026-08-11: address · spec · served-tick · plain-words note, as
   FIXED grid columns — the note column is a constant 420px, so every row's
   badges and note share the same left edges. Flex let a long address shove
   its badges to the card edge while every other row held the column (the
   signatures-directory row, owner's catch). A long address wraps inside its
   own column instead; each cell is placed explicitly so a missing spec chip
   cannot shift its neighbours. */
.ar-wd-wk { margin: 14px 0 0; padding: 0; list-style: none; display: grid; gap: 16px; }
.ar-wd-wk li { display: grid; grid-template-columns: minmax(0, 1fr) max-content max-content 420px; gap: 4px 12px; align-items: center; }
.ar-wd-wk a { grid-column: 1; justify-self: start; min-width: 0; text-decoration: none; }
.ar-wd-wk .ar-wd-src--spec { grid-column: 2; justify-self: end; }
.ar-wd-wk .ar-wd-src.is-live, .ar-wd-wk .ar-wd-src.is-file { grid-column: 3; }
.ar-wd-wk code { font-size: 12px; color: var(--ar-ink); border-bottom: 1px solid var(--ar-line-strong); overflow-wrap: anywhere; }
.ar-wd-wk a:hover code { color: var(--ar-accent); border-bottom-color: var(--ar-accent); }
/* The inline "opens elsewhere" mark after a linked document name — shared by
   the Well-Known rows and the attachable-documents rows. Small on purpose:
   it annotates the link, it is not a target of its own. */
.ar-wd-ext { margin-left: 4px; font-size: 9px; color: var(--ar-ink-faint); vertical-align: 1px; }
a:hover > .ar-wd-ext { color: var(--ar-accent); }
/* A linked document name keeps the code chip's look; the anchor only adds
   the accent on hover, same as the Well-Known addresses. */
.ar-wd-doclink { text-decoration: none; }
.ar-wd-doclink:hover code { color: var(--ar-accent); }
.ar-wd-wk__note { grid-column: 4; margin: 0; font-size: 11.5px; line-height: 1.5; color: var(--ar-ink-faint); }
/* Narrow: the table collapses to stacked rows — address, badges, then the
   note on its own line. */
@container (max-width: 900px) {
  .ar-wd-wk li { display: flex; flex-wrap: wrap; align-items: center; }
  .ar-wd-wk a { margin-right: auto; }
  .ar-wd-wk__note { flex: 1 1 100%; max-width: 70ch; }
}
.ar-wd-src {
  flex: 0 0 auto; font-family: var(--ar-mono); font-size: 9px; letter-spacing: 0.08em;
  padding: 2px 7px; border-radius: 3px; border: 1px solid var(--ar-line-strong); color: var(--ar-ink-faint);
}
.ar-wd-src.is-file { color: var(--ar-good); border-color: var(--ar-good-tint); background: var(--ar-good-wash); }
/* The quiet "answers live" tick — good-toned but washless, so ON DISK (the
   exception an owner must act on) still reads a step louder than the rule. */
.ar-wd-src.is-live { color: var(--ar-good); border-color: var(--ar-good-tint); }
/* The standard's name beside an address — identity, so mixed case as written. */
.ar-wd-src--spec { letter-spacing: 0.02em; }
/* `is-managed` deliberately carries NO colour of its own any more. It and
   is-generated both read "AGENTIMUS" now, and two identical labels painted two
   different colours is a distinction the reader is invited to decode and can
   never resolve. `is-file` keeps its own colour because it says something an
   owner can act on: the web server is serving that one, not us. */

.ar-wd-notices { margin: 14px 0 0; padding: 0; list-style: none; display: grid; gap: 9px; }
.ar-wd-notice { display: flex; align-items: flex-start; gap: 10px; font-size: 12.5px; line-height: 1.45; }
.ar-wd-notice__tag {
  flex: 0 0 auto; font-family: var(--ar-mono); font-size: 9px; letter-spacing: 0.08em;
  padding: 2px 6px; border-radius: 3px; border: 1px solid;
}
.ar-wd-notice.is-error .ar-wd-notice__tag { color: var(--ar-bad); border-color: var(--ar-bad-tint); background: var(--ar-bad-wash); }
.ar-wd-notice.is-warning .ar-wd-notice__tag { color: var(--ar-warn); border-color: var(--ar-warn-tint); background: var(--ar-warn-wash); }

/* ---- Dashboard ---------------------------------------------------------- */
.ar-act { display: grid; gap: 22px; min-width: 0; }

/* Clickable at-a-glance summary row. Fixed 4-up (not auto-fit) so the four
   tiles always span the full width as one row; auto-fit would orphan the 4th
   tile on its own line at in-between widths. Collapses to a tidy 2×2 below. */
/* minmax(0, 1fr), not 1fr: a grid track's default min is its CONTENT, so four
   tiles that each want ~230px simply overflowed the card — the fourth one ran
   off the right edge instead of the row getting narrower. */
.ar-dash-sum { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; }
.ar-dash-tile {
  appearance: none; cursor: pointer; text-align: left;
  display: flex; align-items: center; gap: 12px;
  padding: 14px 16px; border: 1px solid var(--ar-line); border-radius: var(--ar-radius);
  background: var(--ar-surface); transition: border-color 0.15s, box-shadow 0.15s, transform 0.12s;
}
/* The tile's mark: an accent-tinted chip, quiet enough not to shout four times
   in a row; the number stays the loudest thing on the tile. */
.ar-dash-tile__ic {
  flex: 0 0 auto; width: 38px; height: 38px; border-radius: 10px;
  display: grid; place-items: center; color: var(--ar-accent);
  background: color-mix(in srgb, var(--ar-accent) 8%, var(--ar-surface));
  border: 1px solid color-mix(in srgb, var(--ar-accent) 22%, var(--ar-line));
}
.ar-dash-tile__ic svg { width: 19px; height: 19px; }
.ar-dash-tile__body { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
/* "6 PROVIDERS" — the number leads and the label rides its baseline. */
.ar-dash-tile__row { display: inline-flex; align-items: baseline; gap: 7px; }
.ar-dash-tile:hover { border-color: var(--ar-line-strong); box-shadow: 0 5px 16px -9px color-mix(in srgb, var(--ar-shade) 40%, transparent); }
/* Dark: a shadow on near-black is invisible and line→line-strong is a step
   nobody sees — the hover cue becomes a surface lift instead. */
:root[data-ar-theme="dark"] .ar-dash-tile:hover {
  background: var(--ar-surface-2);
  border-color: color-mix(in srgb, var(--ar-ink) 14%, var(--ar-line));
}
.ar-dash-tile:active { transform: translateY(1px); }
.ar-dash-tile:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; }
.ar-dash-tile__k { font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ar-ink-faint); }
.ar-dash-tile__v { font-family: var(--ar-mono); font-size: 24px; font-weight: 600; line-height: 1; color: var(--ar-ink); }
.ar-dash-tile__v[data-tone="good"] { color: var(--ar-good); }
.ar-dash-tile__v[data-tone="ok"] { color: var(--ar-warn); }
.ar-dash-tile__v[data-tone="low"] { color: var(--ar-bad); }
.ar-dash-tile__sub { font-size: 11px; color: var(--ar-ink-soft); }
.ar-act-controls { display: flex; align-items: center; gap: 16px; flex: 0 0 auto; }
/* Tiny passive "auto-refresh is on" marker, tucked beside the card title.
   Steady (no motion); mirrors the bell pill's green dot. */
.ar-act-titlerow { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; }
.ar-act-live {
  display: inline-flex; align-items: center; gap: 4px;
  font-family: var(--ar-mono); font-size: 8.5px; font-weight: 600;
  letter-spacing: 0.06em; text-transform: uppercase; color: var(--ar-good);
  position: relative; top: 1px;
}
.ar-act-live__dot { width: 5px; height: 5px; border-radius: 50%; background: var(--ar-good); flex: 0 0 auto; }
.ar-act-stats { margin-top: 4px; }
/* Each stat strip fills its row with a fixed column count matching its number of
   totals — never the generic .ar-wd-stats auto-fit, which orphaned a lone cell
   beside an empty bordered box. Endpoint activity has 4 totals, Traffic-from-AI 3. */
.ar-act-stats--4 { grid-template-columns: repeat(4, 1fr); }
.ar-act-stats--3 { grid-template-columns: repeat(3, 1fr); }
/* Narrow: the summary tiles need room, so drop them to a tidy 2×2; the 4-up stat
   strip folds to 2×2 on phones (the 3-up strip stays — three short stats fit). */
@container (max-width: 720px) { .ar-dash-sum { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@container (max-width: 430px) { .ar-dash-sum { grid-template-columns: minmax(0, 1fr); } }
@container (max-width: 480px) { .ar-act-stats--4 { grid-template-columns: repeat(2, 1fr); } }

/* Daily bars */
.ar-act-sparkwrap { position: relative; margin: 18px 0 6px; }
.ar-act-spark {
  display: flex; align-items: flex-end; gap: 3px; height: 64px; margin: 0;
}
/* Each bar is a button: click it to drill the recent feed into that day. */
.ar-act-bar {
  flex: 1 1 0; display: flex; align-items: flex-end; height: 100%;
  appearance: none; -webkit-appearance: none; padding: 0; border: 0; background: none;
  font: inherit; cursor: pointer; border-radius: 3px 3px 0 0;
}
.ar-act-bar:hover .ar-act-bar__fill { filter: brightness(0.92); }
.ar-act-bar:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; }
.ar-act-bar__fill {
  width: 100%; min-height: 2px; border-radius: 2px 2px 0 0;
  background: var(--ar-accent); transition: height 0.4s cubic-bezier(0.22, 1, 0.36, 1), filter 0.2s ease;
}
.ar-act-bar__fill.is-zero { background: var(--ar-line); }
/* The selected day's bar is highlighted (darker, richer) so it stands out —
   the other bars keep their normal colour rather than washing out. */
.ar-act-bar.is-active .ar-act-bar__fill { filter: brightness(0.7); }

/* Phones: 30 columns squeeze below a usable tap size, so the charts keep their
   bars touch-wide and scroll sideways instead. The scroller is rtl so it OPENS
   at the newest days (and a data refresh never yanks the scroll position); the
   inner chart restores ltr so time still runs left → right. Tablets and up fit
   the full month as before and never scroll. */
@media (max-width: 600px) {
  .ar-act-sparkscroll { overflow-x: auto; direction: rtl; scrollbar-width: thin; padding-bottom: 4px; }
  .ar-act-sparkscroll > * { direction: ltr; min-width: 100%; width: max-content; }
  .ar-act-spark, .ar-refspark { gap: 4px; }
  .ar-act-bar, .ar-refspark__bar { min-width: 16px; }
  /* The AI chart's buttons ARE the bars, so a quiet day is a 2px-tall target —
     an invisible full-column extension makes every day tappable to the top. */
  .ar-refspark__bar { position: relative; }
  .ar-refspark__bar:not(.is-zero)::after { content: ""; position: absolute; left: -2px; right: -2px; bottom: 0; height: 52px; }
}

/* Styled hover tooltip, floating above the bars with a downward caret. JS sets
   `left` (clamped centre) on the body and `left` on the caret (so it keeps
   pointing at the bar even when the body is clamped at an edge). */
/* left stays 0 and the whole tooltip is moved via transform, so its width is
   computed against the full chart (not the gap to the right edge) — otherwise a
   right-side bar squeezes the tooltip narrow and the text wraps weirdly. */
.ar-act-tip {
  position: absolute; bottom: calc(100% + 8px); left: 0;
  z-index: 6; pointer-events: none;
  display: grid; gap: 1px; width: max-content; max-width: 240px; padding: 8px 11px;
  background: var(--ar-ink); color: var(--ar-surface);
  border-radius: 7px; box-shadow: 0 10px 24px -10px color-mix(in srgb, var(--ar-shade) 55%, transparent);
  font-size: 12px; line-height: 1.45;
}
.ar-act-tip__date { font-family: var(--ar-mono); font-size: 10.5px; letter-spacing: 0.04em; opacity: 0.72; white-space: nowrap; }
.ar-act-tip__hits { font-weight: 600; white-space: nowrap; }
.ar-act-tip__top { opacity: 0.82; }
.ar-act-tip__caret {
  position: absolute; top: 100%; left: 0; transform: translateX(-50%);
  width: 0; height: 0;
  border-left: 6px solid transparent; border-right: 6px solid transparent;
  border-top: 6px solid var(--ar-ink);
}
.ar-tip-enter-active, .ar-tip-leave-active { transition: opacity 0.12s ease; }
.ar-tip-enter-from, .ar-tip-leave-to { opacity: 0; }
@media (prefers-reduced-motion: reduce) {
  .ar-tip-enter-active, .ar-tip-leave-active { transition: none; }
}

/* Styled hover tooltip for a long inline value (a full User-Agent) — the dark
   alternative to a native title="…". position:fixed (placed off the cell's rect in
   JS) so the scrolling request feed / day modal never clips it; same look as the
   chart tooltip above (--ar-ink on --ar-surface, soft shadow, a caret). */
.ar-act-uatip {
  position: fixed; z-index: 100002; pointer-events: none; /* teleported to <body>, above the modal (100001) */
  max-width: 360px; padding: 8px 11px;
  background: var(--ar-ink); color: var(--ar-surface);
  /* The hairline light ring is for DARK surfaces (the score rail card) — an
     ink bubble over an ink card would otherwise have no visible edge. On light
     tables it reads as part of the shadow. */
  border-radius: 7px;
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--ar-surface) 22%, transparent), 0 10px 24px -10px color-mix(in srgb, var(--ar-shade) 55%, transparent);
  font-family: var(--ar-mono); font-size: 11.5px; line-height: 1.5;
  white-space: normal; word-break: break-word;
  transform: translateY(-100%); /* anchored ABOVE: the box's bottom sits at top:y */
}
.ar-act-uatip.is-below { transform: none; } /* anchored BELOW: the box's top sits at top:y */
/* Info variant: plain prose (not a mono code value), e.g. the unverified-network hint.
   Same dark bubble + caret, readable sans font, a touch narrower for a comfortable measure. */
.ar-act-uatip--info {
  max-width: 300px;
  font-family: inherit; font-size: 12px; word-break: normal;
}
.ar-act-uatip__caret {
  position: absolute; left: 16px; top: 100%;
  width: 0; height: 0;
  border-left: 6px solid transparent; border-right: 6px solid transparent;
  border-top: 6px solid var(--ar-ink);
}
.ar-act-uatip.is-below .ar-act-uatip__caret {
  top: auto; bottom: 100%;
  border-top: 0; border-bottom: 6px solid var(--ar-ink);
}
.ar-act-uatip__ua { display: block; }
.ar-act-uatip__hint {
  display: block; margin-top: 5px;
  font-size: 9.5px; letter-spacing: 0.06em; text-transform: uppercase; opacity: 0.55;
}
/* Rail variant, hovering the DARK score card: an amber-paper bubble (the ink one
   would melt into the card), CSS-centred — `left` receives the CARD's centre and
   translateX(-50%) does the rest, so width never enters the JS and a re-render
   can't misplace it. The caret sits at the bubble's centre (the rows it
   annotates span the card). */
.ar-act-uatip--rail {
  transform: translate(-50%, -100%);
  /* width: max-content, because a fixed box's shrink-to-fit width is capped by
     the space from its `left` to the viewport edge — and `left` here is the
     card's centre, so the bubble was squeezed to half the room it had. The
     transform centres AFTER layout; max-content + max-width restores the cap
     we actually meant. */
  width: max-content;
  /* The rail cards' own surface — the bubble reads as one of them, floating;
     the amber lives in the ring and the hint line, not the fill. */
  background: var(--ar-surface); color: var(--ar-ink);
  box-shadow: 0 0 0 1px var(--ar-warn-tint), 0 10px 24px -10px color-mix(in srgb, var(--ar-shade) 45%, transparent);
  /* border-box so the card-width cap means the box's FULL width — with the
     default content-box, max-width excluded the padding and the clamp overshot. */
  box-sizing: border-box;
}
.ar-act-uatip--rail.is-below { transform: translateX(-50%); }
.ar-act-uatip--rail .ar-act-uatip__caret { left: 50%; margin-left: -6px; border-top-color: var(--ar-surface); }
.ar-act-uatip--rail.is-below .ar-act-uatip__caret { border-top-color: transparent; border-bottom-color: var(--ar-surface); }
.ar-act-uatip--rail .ar-act-uatip__hint { color: var(--ar-warn); opacity: 0.9; }

/* The Optimized rung's worklist total — the Next line only names the top issue;
   this is the honest "how much altogether", amber like every nudge. */
/* Rides the right edge, tucked against the %: the spec-sheet grammar is label
   left, values right — and the chip is metadata about the value ("80%, and 2
   things to do about it"). Deliberately MUTED, not amber: the row's state
   already carries the color, and a gold chip beside a gold name and a gold %
   turned every warn row into one solid band. This is the card's own
   secondary-text tone (what "AEO / GEO" wears), warm where #848484 is cold. */
.ar-rung__todo {
  font-style: normal; font-family: var(--ar-mono);
  font-size: 10px; letter-spacing: 0.05em;
  color: color-mix(in srgb, var(--ar-paper) 55%, transparent); white-space: nowrap;
}
/* The User-Agent cell copies its full value on click (it's shown truncated). */
.ar-act-feed__ua.is-copyable { cursor: pointer; transition: background-color 0.12s ease; }
.ar-act-feed__ua.is-copyable:hover { background: color-mix(in srgb, var(--ar-ink) 10%, var(--ar-surface)); }

/* The modal lists every hit individually (ungrouped), each with its exact time.
   Reuses the feed cell styles (agent/endpoint/UA) in its own 4-column grid; the
   modal body owns the scroll. */
/* "Optimize your content" — the fourth section on the Readiness tab (the Optimized
   rung's destination). Reuses .ar-checkgroup / .ar-check; each issue lists the pages
   that trip it as edit links, matching the rung → tab-section model of the others. */
.ar-optcheck__n { font-family: var(--ar-mono); font-size: 11px; font-weight: 400; color: var(--ar-warn); }
.ar-optcheck__head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.ar-optcheck__asided { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 2px; }
.ar-optcheck__asided .ar-optcheck__page { flex: none; max-width: 100%; }
/* Same guard as the page link above: in an align-items:flex-start column the item
   shrink-wraps its content, so this nowrap line overflowed instead of ellipsizing. */
.ar-optcheck__asided .ar-optcheck__flags { max-width: 100%; }
.ar-optcheck__flags { font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-faint); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ar-optcheck__pages { display: flex; flex-direction: column; gap: 5px; margin: 8px 0 0; }
.ar-optcheck__row { display: flex; align-items: center; gap: 12px; }
/* flex 0-grow: the link hugs its own text, so only the words hover — not the empty
   run of row beside them. shrink 1 + min-width 0 keep long titles truncating. */
.ar-optcheck__page { flex: 0 1 auto; min-width: 0; font-size: 13px; color: var(--ar-accent); text-decoration: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ar-optcheck__page:hover, .ar-optcheck__page:focus-visible { text-decoration: underline; }
.ar-optcheck__page--muted { color: var(--ar-ink-soft); }
/* "re-reading" — this page was saved after the verdict beside it was measured.
   Faint mono, the same small-caps idiom as the row's action but in ink-faint, so
   it reads as a STATE of the row and never as a second button to press. */
.ar-optcheck__pending {
  flex: 0 0 auto; font-family: var(--ar-mono); font-size: 10px;
  letter-spacing: 0.08em; text-transform: uppercase; white-space: nowrap;
  color: var(--ar-ink-faint);
}
.ar-optcheck__more { margin: 7px 0 0; font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-faint); }
/* Set-aside / set-all-aside / restore actions — one treatment for all three: a quiet
   uppercase accent label, right-pinned, no chrome. Identical padding is what keeps every
   right edge on the same vertical line, from the section header down through each row.
   Hover darkens to ink rather than underlining — these are buttons, not links. */
.ar-optcheck__aside, .ar-optcheck__restore {
  flex: 0 0 auto; margin-left: auto; appearance: none; background: none; cursor: pointer;
  border: 0; padding: 3px 4px; font-family: var(--ar-mono); font-size: 10px;
  letter-spacing: 0.08em; text-transform: uppercase; white-space: nowrap;
  color: var(--ar-accent); transition: color 0.15s ease;
}
.ar-optcheck__aside:hover, .ar-optcheck__aside:focus-visible,
.ar-optcheck__restore:hover, .ar-optcheck__restore:focus-visible { color: var(--ar-ink); }
.ar-optcheck__aside:disabled, .ar-optcheck__restore:disabled { opacity: 0.4; cursor: default; }
.ar-optcheck__clear { margin: 4px 0 0; font-size: 13px; color: var(--ar-ink-soft); }
/* Set-aside block: a quiet, dashed-off list under the issues so it reads as "parked".
   Each parked page is its own small card — title + its flags inside one boundary, the
   Restore pinned right — so the list reads as tidy rows, not interleaved lines. */
.ar-setaside { margin: 16px 0 0; padding: 14px 0 0; border-top: 1px dashed var(--ar-line); }
/* The head reads like the issue headers above it — a dark title with a warn-mono count —
   so the parked block registers as a section, not a footnote. */
.ar-setaside__head { display: flex; align-items: baseline; gap: 8px; margin: 0 0 10px; }
.ar-setaside__title { font-size: 14px; color: var(--ar-ink); }
.ar-setaside__note { font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-faint); }
/* Restore All sits on the header line, on the same right edge as every row's RESTORE. */
.ar-setaside__restoreall { margin-left: auto; }
.ar-setaside .ar-optcheck__pages { gap: 8px; }
.ar-setaside .ar-optcheck__row {
  background: var(--ar-surface-2); border: 1px solid var(--ar-line); border-radius: 6px;
  padding: 9px 12px;
}

/* Day-report modal: a wider panel; header with prev/next + a day dropdown. */
/* Fixed height, not content-sized: the day report renders in two beats (spinner,
   then the full day) and days vary from 3 rows to hundreds — content sizing made
   the dialog visibly grow on load and jump between days. One constant size. */
/* A FLOOR, not a fixed height. The body is withheld while a day loads, so a
   pure content height would collapse the dialog to its spinner and snap back
   when the rows land — that beat is what the old fixed height protected. The
   floor keeps it steady while letting a sparse day (two referrers) stop
   sitting in 600px of empty paper; the base rule's 600px cap still tops it
   out, and the small-screen block below drops the floor so a short viewport
   can never be overflowed by it. */
.ar-modal__panel--day { max-width: 720px; min-height: 420px; }
.ar-day-head { display: flex; align-items: center; justify-content: space-between; gap: 10px 12px; margin-bottom: 8px; flex-wrap: wrap; }
/* Day-switch loading: the body content is fully withheld while the day loads
   (a breakdown appearing ahead of the request rows read as inconsistent), so
   the centered ring spinner is the only thing shown. The panel's fixed height
   (see .ar-modal__panel--day) keeps the dialog the same size in both beats. */
.ar-modal__scroll.is-loading { pointer-events: none; }
.ar-day-loadover {
  position: absolute; inset: 0; z-index: 3;
  display: flex; align-items: center; justify-content: center; gap: 12px;
}
.ar-day-loadover__label {
  font-family: var(--ar-mono); font-size: 12px; letter-spacing: 0.09em;
  text-transform: uppercase; color: var(--ar-ink-soft);
}
.ar-day-head .ar-modal__title { margin: 0; }
.ar-day-nav { display: flex; align-items: center; gap: 6px; flex: 0 0 auto; }
/* The day picker is the custom SelectMenu; size its trigger to sit compactly between
   the prev/next buttons (the shared .ar-input is a touch taller by default). */
.ar-day-picker { min-width: 190px; max-width: 260px; flex: 0 1 auto; }
.ar-day-picker .ar-select__btn { height: 32px; padding: 0 10px; font-size: 12.5px; }
.ar-day-nav__btn {
  display: flex; align-items: center; justify-content: center;
  width: 30px; height: 30px; padding: 0;
  border: 1px solid var(--ar-line-strong); border-radius: 7px; background: var(--ar-surface);
  color: var(--ar-ink-soft); cursor: pointer;
  transition: color 0.15s ease, background 0.15s ease, border-color 0.15s ease;
}
.ar-day-nav__btn:hover:not(:disabled) { color: var(--ar-ink); background: var(--ar-surface-2); }
.ar-day-nav__btn:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; }
.ar-day-nav__btn:disabled { opacity: 0.4; cursor: default; }
/* The day report's two-column breakdown (by client / by endpoint), above the log. */
.ar-daybreak { display: grid; grid-template-columns: 1fr 1fr; gap: 16px 28px; }
.ar-daybreak__h {
  margin: 0 0 9px; font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--ar-ink-faint); font-weight: 600;
  display: flex; align-items: baseline; gap: 6px;
}
.ar-daybreak__n { font-size: 11px; color: var(--ar-ink-soft); letter-spacing: 0; text-transform: none; font-weight: 400; }
.ar-daylog { margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--ar-line); }
/* The top divider separates this section FROM THE BREAKDOWN ABOVE it in the
   endpoint-activity dialog. When the log is the dialog's only section (the AI
   day report), that rule would float under the header as a stray double line. */
.ar-daylog--solo { margin-top: 0; padding-top: 0; border-top: 0; }

/* ---- Client manager (Settings → AI access → "Manage client decisions") ----
   Three sections of decision rows: who (token/name + catalog identity),
   when (decision date, where recorded), and an instant undo per row. */
/* The "Manage clients" launcher sits on the right of each list's label row —
   the same dialog from both, since it manages all decisions at once. The head
   row flexes so the label keeps its place and the launcher hugs the right edge
   (Heera's placement call, 2026-07-13). */
.ar-field__head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
.ar-field__head label { margin-bottom: 0; }
.ar-field__manage { font-size: 12px; flex: 0 0 auto; }
/* Verified-bots registry manager (Settings → Bots): one compact row per entry —
   name + UA needle + method chips — built-ins toggle, customs remove. */
.ar-verreg__list { list-style: none; margin: 10px 0 0; padding: 0; display: grid; gap: 7px; }
.ar-verreg__row {
  display: flex; align-items: center; gap: 9px; min-width: 0; flex-wrap: wrap;
  padding: 7px 10px; border: 1px solid var(--ar-line); border-radius: 8px; background: var(--ar-surface);
}
.ar-verreg__row.is-off { opacity: 0.55; }
.ar-verreg__check { display: flex; align-items: center; gap: 7px; min-width: 0; cursor: pointer; }
/* Custom-drawn checkbox: the native control restyled to the design system (WP core's
   blue default was the one off-palette control left in the admin). appearance:none
   keeps the REAL input — label click, keyboard, screen readers all intact — and the
   check glyph is a clip-path box painted in palette vars, so admin color schemes
   restyle it for free (no hardcoded-color SVG). The ::before overrides WP core's own
   checked-state dashicon; focus clears core's blue box-shadow for our outline. */
.ar-verreg__check input {
  appearance: none; -webkit-appearance: none;
  width: 16px; height: 16px; margin: 0; flex: 0 0 auto;
  border: 1px solid var(--ar-line-strong); border-radius: 5px;
  background: var(--ar-surface); cursor: pointer;
  display: inline-grid; place-items: center;
  transition: background 0.12s ease, border-color 0.12s ease;
}
.ar-verreg__check input:hover { border-color: var(--ar-accent); }
.ar-verreg__check input:focus { box-shadow: none; }
.ar-verreg__check input:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 1px; }
.ar-verreg__check input:checked { background: var(--ar-accent); border-color: var(--ar-accent); }
.ar-verreg__check input:checked::before {
  content: ''; width: 10px; height: 10px; margin: 0;
  background: var(--ar-surface);
  clip-path: polygon(14% 46%, 0 62%, 38% 100%, 100% 18%, 84% 4%, 36% 68%);
}
.ar-verreg__name { font-size: 13px; font-weight: 600; color: var(--ar-ink); white-space: nowrap; }
.ar-verreg__custom {
  font-family: var(--ar-mono); font-size: 9px; font-weight: 600; letter-spacing: 0.05em; text-transform: uppercase;
  padding: 1px 5px; border-radius: 4px; color: var(--ar-accent);
  background: color-mix(in srgb, var(--ar-accent) 7%, var(--ar-surface));
  border: 1px solid color-mix(in srgb, var(--ar-accent) 28%, var(--ar-surface));
}
.ar-verreg__ua {
  font-family: var(--ar-mono); font-size: 11.5px; color: var(--ar-ink-soft);
  padding: 1px 6px; border-radius: 3px; background: var(--ar-surface-2); border: 1px solid var(--ar-line);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 180px;
}
.ar-verreg__methods { display: flex; gap: 5px; margin-left: auto; }
.ar-verreg__chip {
  font-size: 10.5px; padding: 1px 7px; border-radius: 999px; white-space: nowrap;
  color: var(--ar-ink-soft); background: var(--ar-surface-2); border: 1px solid var(--ar-line);
}
/* The IP-ranges chip is a real <button> (click copies the ranges URL) — reset the
   browser button chrome so both chip flavors render identically, and show a hand. */
button.ar-verreg__chip { appearance: none; font-family: inherit; line-height: inherit; cursor: pointer; }
.ar-verreg__chip.is-copyable:hover { border-color: var(--ar-accent); color: var(--ar-ink); }
.ar-verreg__chip.is-copyable:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 1px; }
.ar-verreg__remove { font-size: 11.5px; flex: 0 0 auto; }
.ar-verreg__add { margin-top: 10px; padding: 11px; border: 1px dashed var(--ar-line-strong); border-radius: 9px; }
.ar-verreg__grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.ar-verreg__grid input { width: 100%; }
.ar-verreg__intro { display: block; margin: 0 0 10px; }
.ar-verreg__addrow { display: flex; align-items: center; gap: 12px; margin-top: 9px; }
.ar-verreg__missing { color: var(--ar-warn); font-weight: 600; }
.ar-verreg__addbtn { margin-left: auto; } /* Button hugs the right edge, message (if any) reads on the left. */
.ar-verreg__addbtn { flex: 0 0 auto; font-size: 12.5px; padding: 6px 14px; }
@media (max-width: 640px) {
  .ar-verreg__grid { grid-template-columns: 1fr; }
  .ar-verreg__methods { margin-left: 0; }
}

.ar-cm__section { padding-top: 6px; }
.ar-cm__list { list-style: none; margin: 10px 0 0; padding: 0; display: grid; gap: 9px; }
.ar-cm__row { display: flex; align-items: baseline; gap: 10px; min-width: 0; font-size: 13px; }
.ar-cm__who { display: flex; align-items: baseline; gap: 8px; min-width: 0; flex: 0 1 auto; }
.ar-cm__token {
  font-family: var(--ar-mono); font-size: 12.5px; padding: 1px 6px; border-radius: 3px;
  background: var(--ar-surface-2); border: 1px solid var(--ar-line);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 220px;
}
.ar-cm__known { color: var(--ar-ink-soft); font-size: 12px; white-space: nowrap; }
.ar-cm__name { font-weight: 600; }
.ar-cm__name--anon { color: var(--ar-ink-soft); font-style: italic; font-weight: 400; }
.ar-cm__meta { margin-left: auto; flex: 0 0 auto; font-family: var(--ar-mono); font-size: 11.5px; color: var(--ar-ink-faint); }
.ar-cm__undo {
  appearance: none; cursor: pointer; flex: 0 0 auto;
  font-family: var(--ar-mono); font-size: 11px; letter-spacing: 0.05em; text-transform: uppercase;
  padding: 3px 9px; border-radius: 3px; background: transparent;
  color: var(--ar-ink-soft); border: 1px solid var(--ar-line-strong);
  transition: color 0.12s, border-color 0.12s;
}
.ar-cm__undo:hover:not(:disabled) { color: var(--ar-bad); border-color: var(--ar-bad); }
.ar-cm__undo:disabled { opacity: 0.55; cursor: default; }
.ar-cm__none { margin: 8px 0 0; color: var(--ar-ink-faint); font-size: 12.5px; }
.ar-cm__note { margin: 10px 0 0; color: var(--ar-ink-faint); font-size: 12px; line-height: 1.5; }
@media (max-width: 600px) {
  .ar-cm__row { flex-wrap: wrap; }
  .ar-cm__meta { margin-left: 0; width: 100%; order: 3; }
}
@media (max-width: 600px) {
  .ar-daybreak { grid-template-columns: 1fr; gap: 14px; }
}

.ar-act-log { margin: 0; padding: 0; list-style: none; }
.ar-act-log li {
  display: grid; align-items: center; gap: 10px; padding: 7px 2px;
  grid-template-columns: max-content minmax(0, max-content) minmax(0, 1fr) max-content;
  border-bottom: 1px solid var(--ar-line);
}
.ar-act-log li:last-child { border-bottom: 0; }
.ar-act-log__at {
  font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-faint);
  white-space: nowrap; text-align: right;
}
/* Loading / error / empty states live in the modal's content area, centered,
   with enough height that the panel doesn't jump in size when rows arrive. */
.ar-act-log__state {
  margin: 0; display: flex; align-items: center; justify-content: center;
  min-height: 180px; padding: 24px; text-align: center;
  font-size: 13px; color: var(--ar-ink-soft);
}
.ar-act-log__state.is-error { color: var(--ar-bad); }
.ar-act-sparkcap {
  margin: 0; font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--ar-ink-faint);
}

/* Ranked lists (top agents / by endpoint) */
.ar-act-rank { margin: 14px 0 0; padding: 0; list-style: none; display: grid; gap: 11px; }
.ar-act-rank li { display: grid; grid-template-columns: minmax(0, 1fr) 90px auto; align-items: center; gap: 12px; }
.ar-act-rank__label { font-size: 13px; color: var(--ar-ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ar-act-rank__label code { font-family: var(--ar-mono); font-size: 12px; color: var(--ar-ink); }
.ar-act-rank__track { height: 7px; background: var(--ar-surface-2); border-radius: 999px; overflow: hidden; }
.ar-act-rank__bar { display: block; height: 100%; background: var(--ar-accent); border-radius: 999px; }
.ar-act-rank__n { font-family: var(--ar-mono); font-size: 12px; color: var(--ar-ink-soft); text-align: right; min-width: 24px; }
/* Trend variant (Top clients / By endpoint only): a calm growth/down delta sits in a
   FIXED-width column between the label and the bar, so bars stay aligned row to row. Only
   real movers get a colored arrow + %; everything else is a quiet "–". The plain
   .ar-act-rank (referral lists) keeps its 3-column layout. */
.ar-act-rank--trend li { grid-template-columns: minmax(0, 1fr) 62px 90px auto; }
/* A rank row that drills somewhere: the button IS the row (it takes over the
   li's grid), styled invisibly — the hover tint on the label is the only cue,
   matching how the day-bars and summary tiles advertise themselves. */
.ar-act-rank li:has(.ar-act-rank__btn) { display: block; }
.ar-act-rank__btn {
  appearance: none; background: none; border: 0; margin: 0; padding: 0;
  font: inherit; color: inherit; text-align: left; cursor: pointer; width: 100%;
  display: grid; grid-template-columns: minmax(0, 1fr) 90px auto; align-items: center; gap: 12px;
  border-radius: 6px;
}
.ar-act-rank--trend .ar-act-rank__btn { grid-template-columns: minmax(0, 1fr) 62px 90px auto; }
.ar-act-rank__btn:hover .ar-act-rank__label,
.ar-act-rank__btn:hover .ar-act-rank__label code { color: var(--ar-accent); }
.ar-act-rank__btn:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 3px; }
.ar-act-delta { font-family: var(--ar-mono); font-size: 11px; white-space: nowrap; text-align: right; }
.ar-act-delta.is-up { color: var(--ar-good); }
/* Down is NOT red: red is this app's danger color (impostors, blocking, errors), and a
   traffic dip is information, not a fault — owners read a red ▼ as "something broke".
   Amber = "worth a glance": distinct from the up-green at a squint (plain ink wasn't —
   both sit at the same darkness at 11px), without red's alarm. */
.ar-act-delta.is-down { color: var(--ar-warn); }
.ar-act-delta.is-flat { color: var(--ar-ink-faint); }
.ar-act-more { margin: 11px 0 0; font-size: 11px; color: var(--ar-ink-faint); }
/* As a button: expand/collapse the day breakdown. Caret signals it unfolds (no underline). */
button.ar-act-more { appearance: none; background: none; border: 0; padding: 0; cursor: pointer; font-family: inherit; display: inline-flex; align-items: center; gap: 4px; transition: color 0.15s ease; }
button.ar-act-more:hover { color: var(--ar-ink); }
/* The shared drawn-triangle caret (see .ar-wd-group__caret), pointing down;
   flips when open. currentColor rides the button's own hover. */
.ar-act-more__caret {
  display: inline-block; width: 0; height: 0;
  border-top: 5px solid currentColor;
  border-left: 4px solid transparent; border-right: 4px solid transparent;
  transition: transform 0.15s ease;
}
.ar-act-more__caret.is-open { transform: rotate(180deg); }
.ar-act-more-note { margin: 4px 0 0; font-size: 10px; font-style: italic; color: var(--ar-ink-faint); }

/* ---- Traffic from AI: one consolidated report card ---------------------- */
/* Composition (sources + pages) side by side; collapses to one column when the
   app (the inline-size container) gets narrow. */
.ar-ai__cols { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px 44px; margin-top: 22px; }
@container (max-width: 760px) { .ar-ai__cols { grid-template-columns: 1fr; gap: 20px; } }
.ar-ai__col .ar-act-rank { margin-top: 0; }
/* Small section labels inside the card — distinct from the serif card title. */
.ar-ai__sub {
  margin: 0 0 12px; font-family: var(--ar-mono); font-size: 10.5px; font-weight: 600;
  letter-spacing: 0.12em; text-transform: uppercase; color: var(--ar-ink-faint);
  display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap;
}
.ar-ai__subnote {
  font-family: var(--ar-sans); font-size: 11px; font-weight: 400; letter-spacing: 0;
  text-transform: none; color: var(--ar-ink-faint);
}
.ar-ai__byday { margin-top: 24px; padding-top: 20px; border-top: 1px solid var(--ar-line); }

/* Dashboard summary: a read-only sparkline of AI-referred visits per day. Deliberately
   NOT the interactive .ar-act-spark (whose bars are buttons that open a day report) —
   this one only shows the shape of the month, and the drill-down lives on its own screen. */
.ar-refspark { display: flex; align-items: flex-end; gap: 3px; height: 52px; margin: 20px 0 6px; }
/* When the AI sparkline sits in the positioned tooltip wrapper, the wrapper owns
   the outer margin so the two charts' tooltip geometry matches. */
.ar-act-sparkwrap--ref { margin: 20px 0 6px; }
.ar-act-sparkwrap--ref .ar-refspark { margin: 0; }
/* Each bar is a real <button> — click opens that day's report, same as the
   endpoint-activity chart. Zero-days are disabled but keep their title. */
.ar-refspark__bar {
  appearance: none; border: 0; padding: 0; cursor: pointer;
  flex: 1 1 0; min-height: 2px; border-radius: 2px 2px 0 0; background: var(--ar-accent);
  transition: height 0.4s cubic-bezier(0.22, 1, 0.36, 1), filter 0.12s ease;
}
.ar-refspark__bar:hover:not(:disabled), .ar-refspark__bar.is-active { filter: brightness(0.72); }
.ar-refspark__bar:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; }
.ar-refspark__bar.is-zero { background: var(--ar-line); height: 2px !important; cursor: default; }

/* The link at the foot of a dashboard summary card, through to the screen that holds the
   same data in full. Shared by "Traffic from AI" → AI traffic and "Recent requests" →
   Request log: one pattern, because it is one relationship. */
.ar-card__more {
  display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;
  margin: 22px 0 0; padding-top: 16px; border-top: 1px solid var(--ar-line);
}
/* ⭐ ONE definition of "this link opens another screen", shared rather than
   copied — the Readiness cards point at Findings and at Visibility → Search
   with exactly this gesture, and a second copy is how two links to two screens
   start looking like two different kinds of thing. */
.ar-card__more .ar-linkbtn,
.ar-optsum .ar-linkbtn { display: inline-flex; align-items: center; gap: 4px; font-weight: 600; }
.ar-card__more .ar-linkbtn svg,
.ar-optsum .ar-linkbtn svg { transition: transform 0.18s ease; }
.ar-card__more .ar-linkbtn:hover svg,
.ar-optsum .ar-linkbtn:hover svg { transform: translateX(2px); }
@media (prefers-reduced-motion: reduce) {
  .ar-card__more .ar-linkbtn svg,
  .ar-optsum .ar-linkbtn svg { transition: none; }
}
/* The link sits on its own line under the lead, so it starts at the card's own
   left edge — ar-linkbtn's inline margin is for a link inside a sentence. */
.ar-optsum .ar-linkbtn { margin-left: 0; padding-left: 0; }
.ar-optsum .ar-linkbtn:hover { text-decoration: underline; text-underline-offset: 3px; }
.ar-card__morenote { font-size: 12px; color: var(--ar-ink-faint); }

/* AI traffic screen: the cards stack, and the report card's title carries a refresh. */
.ar-aitraffic { display: grid; gap: 20px; }
/* The filters sit inside the card, not above it, so they read as narrowing THIS report. */
.ar-aitraffic .ar-log__filters { margin: 18px 0 22px; }
/* This row has four controls, not the request log's seven, so it wraps to two lines rather
   than three or four — and a wrapped line holding only "To" would let that date field grow
   to the full card width. The shared wrap rule zeroes the date basis along with everything
   else; here it must not. A date input has one right size, whatever room is going spare. */
/* Between the wrap breakpoint and the phone one, the shared bases are cut for seven fields
   and a full User-Agent. Four fields and a short path prefix fit one line at bases this
   size, so the row stays a row until the card is genuinely too narrow for it. */
@media (max-width: 1200px) and (min-width: 783px) {
  .ar-aitraffic .ar-log__field { flex: 1 1 130px; }
  .ar-aitraffic .ar-log__field--ua { flex: 1 1 170px; }
}
/* AFTER the rules above, and matching their specificity, so it wins on source order: a date
   input has one right size, whatever room is going spare. Otherwise a wrapped line holding
   only "To" lets it grow to the full card width. */
.ar-aitraffic .ar-log__field--date { flex: 0 1 150px; }
/* Says out loud what the numbers below are a slice of — a filtered card that looks exactly
   like an unfiltered one is how a reader mistakes a subset for the whole. */
.ar-ai__filternote {
  margin: 14px 0 0; font-size: 12.5px; color: var(--ar-ink-soft);
}
.ar-ai__filternote strong { color: var(--ar-ink); }

/* ---- Traffic from AI: per-day drill-down -------------------------------- */
/* The By-Day strip's empty days: the slot stays (the rhythm of absence is
   part of the picture) but it is not a door — muted ink, no hover invite.
   Zero-scaled bars, unlike Bing's min→max: a visit count's base IS zero. */
.ar-aiday__bar.is-empty { background: var(--ar-line-strong); opacity: 0.7; cursor: default; }
.ar-aiday__bar.is-empty:hover { filter: none; }
/* The diagnostic shortlists' remainder line — the held-back rows counted out
   loud, with the Show-all door beside them. */
.ar-ai__more { margin: 8px 0 0; font-size: 11.5px; color: var(--ar-ink-faint); }
.ar-aiday__detail { margin: 0; padding: 2px 0 0; list-style: none; display: grid; gap: 9px; min-width: 0; }
/* The pairing rows live in the day-report dialog now; the --modal name is
   kept so the template reads as the Bing modal's sibling. */
.ar-aiday__detail--modal { margin: 0; }
/* Flex (not grid): a grid item defaults to justify-self:stretch, which made the
   <code> path fill its column — and wp-admin's global code background then painted
   a full-width bar. Flex items size to content, so the path stays a small chip. */
.ar-aivis { display: flex; align-items: center; gap: 8px; font-size: 12.5px; padding: 1px 0; min-width: 0; }
.ar-aivis__src { flex: 0 0 auto; font-weight: 600; color: var(--ar-ink); white-space: nowrap; }
.ar-aivis__arr { flex: 0 0 auto; color: var(--ar-ink-faint); }
.ar-aivis__path {
  flex: 0 1 auto; min-width: 0; font-family: var(--ar-mono); font-size: 11.5px; color: var(--ar-ink-soft);
  background: var(--ar-surface-2); border: 1px solid var(--ar-line); padding: 1px 6px; border-radius: 3px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* The loading / error line inside an opened day, before its rows arrive. */
.ar-aivis--muted { color: var(--ar-ink-faint); font-size: 12px; gap: 10px; }
.ar-aivis__path.is-copyable { cursor: pointer; transition: background-color 0.12s ease; }
.ar-aivis__path.is-copyable:hover { background: color-mix(in srgb, var(--ar-ink) 10%, var(--ar-surface)); }
.ar-aivis__n { margin-left: auto; flex: 0 0 auto; font-family: var(--ar-mono); font-size: 12px; color: var(--ar-ink-soft); }

/* Recent feed */
/* Capped, scrollable feed with a bottom fade cue (same pattern as the modal). */
/* Let the card and feed wrapper shrink below the table's min-width, so the scroll box (.ar-act-reqs)
   actually scrolls horizontally instead of the whole card stretching off-screen. A grid item's
   default min-width:auto refuses to shrink below its content — this overrides that down the chain. */
.ar-act .ar-card { min-width: 0; }
.ar-act-feedwrap { position: relative; margin: 14px 0 0; min-width: 0; }
/* padding-right is a gutter for the scroll thumb: macOS overlay scrollbars sit
   on top of content, so without it the bar overlaps the right-aligned time/count
   column. scrollbar-gutter keeps the layout stable for classic scrollbars too. */
/* The Requests card's scroll container owns the cap/scroll/border/gutter; the
   list inside (grouped feed OR per-day log) is just a grid. */
.ar-act-reqs { margin: 0; border-top: 1px solid var(--ar-line); max-height: 340px; overflow-y: auto; overflow-x: auto; scrollbar-gutter: stable; padding-right: 14px; }
.ar-act-reqs__empty { padding: 12px 0; }
.ar-act-feed { margin: 0; padding: 0; list-style: none; display: grid; gap: 0; }
.ar-act-feedfade {
  position: absolute; left: 0; right: 0; bottom: 0; height: 44px;
  display: flex; align-items: flex-end; justify-content: center; padding-bottom: 4px;
  pointer-events: none; opacity: 0; transition: opacity 0.18s ease;
  background: linear-gradient(to bottom, color-mix(in srgb, var(--ar-surface) 0%, transparent), var(--ar-surface) 82%);
}
.ar-act-feedfade.is-visible { opacity: 1; }
/* The chevron is a real button: click it to nudge the feed down (the list also
   scrolls on its own). pointer-events is re-enabled here because the fade
   gradient above is click-through; disabled = nothing more to scroll. */
.ar-act-feedfade__btn {
  pointer-events: auto; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; padding: 0; margin: 0;
  border: 0; border-radius: 999px; background: transparent;
  color: var(--ar-ink-faint); transition: color 0.15s ease, background 0.15s ease;
}
.ar-act-feedfade__btn:hover { color: var(--ar-ink); background: var(--ar-surface-2); }
.ar-act-feedfade__btn:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; }
.ar-act-feedfade__btn:disabled { pointer-events: none; }
.ar-act-feedfade__chev { display: block; }
.ar-act-feed li {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 2px; border-bottom: 1px solid var(--ar-line);
}
.ar-act-feed__agent { font-size: 13px; font-weight: 600; color: var(--ar-ink); flex: 0 0 auto; white-space: nowrap; }
.ar-act-feed__ep {
  font-family: var(--ar-mono); font-size: 11.5px; color: var(--ar-ink-soft);
  background: var(--ar-surface-2); padding: 2px 7px; border-radius: 3px; white-space: nowrap;
  /* Shrink + truncate a long endpoint (e.g. http-message-signatures-directory)
     so one row can never force the feed — and the whole dashboard grid — wider
     than the container at narrow widths. */
  flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis;
}
/* Endpoint + owning-network chips share ONE grid cell (this wrapper), so turning on Identify
   never changes a row's column count — the UA / count / time columns stay aligned across every
   row, with a network or without. The endpoint truncates under pressure; the short network chip
   doesn't. */
/* Endpoint + network on ONE line (never wrap — wrapping made the cell size to just the widest
   chip and stack even with room to spare). Both shrink+truncate under real pressure; the UA fills
   whatever's left. So every row keeps all its columns, and the pair only ellipses when genuinely tight. */
.ar-act-feed__loc { display: flex; align-items: center; gap: 8px; min-width: 0; }
/* "from <network>" attribution chip (opt-in Identify mode), beside the endpoint. */
.ar-act-feed__net {
  flex: 0 1 auto; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  font-family: var(--ar-mono); font-size: 11px; color: var(--ar-accent);
  background: color-mix(in srgb, var(--ar-accent) 8%, transparent); padding: 2px 7px; border-radius: 3px;
}
.ar-act-feed__net-lbl { color: var(--ar-ink-faint); }
/* An unverified network is the visitor IP's self-declared reverse-DNS (PTR) name — not
   forward-confirmed, and possibly not even a reachable domain. Strip the accent (which
   here reads as "verified") back to neutral metadata and mark it, so it never passes for
   a trusted network or a site the visitor came from. Only forward-confirmed (verdict 1)
   networks keep the teal chip. */
.ar-act-feed__net.is-unverified {
  color: var(--ar-ink-soft); background: var(--ar-surface-2); cursor: help;
}
.ar-act-feed__net-mark {
  margin-left: 3px; font-size: 9px; font-weight: 600; vertical-align: super;
  color: var(--ar-ink-faint);
}
/* UA takes the remaining space and truncates — the row never wraps. */
.ar-act-feed__ua {
  flex: 1 1 auto; min-width: 0;
  font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-faint);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ar-act-feed__ua.is-empty { font-style: italic; }
.ar-act-feed__count {
  flex: 0 0 auto; font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-soft);
  background: var(--ar-surface-2); padding: 1px 6px; border-radius: 3px;
}
.ar-act-feed__count:empty { background: none; padding: 0; } /* count=1: keep the cell, hide the pill */
.ar-act-feed__at { flex: 0 0 auto; font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-faint); }
/* Align every row's columns. Subgrid lets each <li> share the <ul>'s column
   tracks, so the agent, endpoint, count and time columns line up across rows
   (the User-Agent fills the slack). Falls back to the flex layout above where
   subgrid is unsupported. */
@supports (grid-template-columns: subgrid) {
  .ar-act-feed {
    /* Endpoint column is minmax(0, max-content) — full width when there's room,
       but able to shrink (its cell truncates) so a long endpoint can't blow the
       feed past the container and break the dashboard layout. */
    grid-template-columns: max-content minmax(0, max-content) minmax(0, 1fr) max-content max-content;
  }
  .ar-act-feed li {
    grid-column: 1 / -1;
    display: grid;
    grid-template-columns: subgrid;
    align-items: center;
  }
  .ar-act-feed__at { text-align: right; }
}

/* Recent-requests table. A real table with a header row: the "Network" column is named once in
   the header instead of repeating "from" on every row, and the whole thing scrolls HORIZONTALLY
   inside its box on narrow screens — the table's min-width forces a real scroll rather than
   crushing columns to an ellipsis. The header sticks while the body scrolls vertically. */
.ar-act-table { width: 100%; min-width: 620px; border-collapse: collapse; }
.ar-act-table th, .ar-act-table td { padding: 9px 14px 9px 0; text-align: left; vertical-align: middle; white-space: nowrap; }
/* Real first/last-column insets: row washes (spoofed rows) made the old 2px edges
   visible — text sat pressed against the tint's edge. */
.ar-act-table th:first-child, .ar-act-table td:first-child { padding-left: 10px; }
.ar-act-table thead th {
  position: sticky; top: 0; z-index: 1; background: var(--ar-surface);
  font-family: var(--ar-sans); font-size: 11.5px; font-weight: 700; letter-spacing: 0.07em;
  text-transform: uppercase; color: var(--ar-ink-faint);
  padding-top: 9px; padding-bottom: 9px; border-bottom: 1px solid var(--ar-line-strong);
}
.ar-act-table tbody td { border-bottom: 1px solid var(--ar-line); }
.ar-act-table tbody tr:last-child td { border-bottom: 0; }
.ar-act-table__agent { font-size: 13px; font-weight: 500; color: var(--ar-ink); }
.ar-act-table__at { font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-faint); }
.ar-act-table__dash { color: var(--ar-ink-faint); }
/* User-Agent column takes the slack and truncates; the custom tooltip (hover) reveals it in full. */
.ar-act-table td.ar-act-table__uacol { width: 100%; max-width: 0; overflow: hidden; text-overflow: ellipsis; }

/* ======================================================================
   Review queue (redesign) — honest, calm, inbox-style.
   Shows only real signals (verification verdict, identity, volume, novelty);
   never a fabricated trust %, ASN/IP breakdown, or "Block IP" button.
   ====================================================================== */
.ar-rev-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
.ar-rev-head__titles { display: flex; flex-direction: column; gap: 1px; }
.ar-rev-head__title { font-family: var(--ar-serif); font-size: 17px; font-weight: 600; color: var(--ar-ink); line-height: 1.15; }
.ar-rev-head__sub { font-size: 12px; color: var(--ar-ink-faint); }

/* Segmented filter tabs. */
.ar-rev-tabs { display: flex; gap: 3px; margin: 14px 0 2px; padding: 3px; background: var(--ar-surface-2); border-radius: 9px; }
.ar-rev-tab {
  flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  appearance: none; cursor: pointer; border: 0; background: none; padding: 6px 8px; border-radius: 7px;
  font-family: var(--ar-sans); font-size: 12px; font-weight: 500; color: var(--ar-ink-soft);
  transition: background 0.15s ease, color 0.15s ease;
}
.ar-rev-tab:hover { color: var(--ar-ink); }
.ar-rev-tab:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 1px; }
/* --ar-INK, never --ar-shade. In light the two hold the same value (#1b1913),
   so shade read as "the darkest text" and passed review. It isn't: shade is the
   SCRIM — the colour shadows and overlays are mixed from — and at night it goes
   to pure #000, which put black text on the dark surface this pill uses. The
   selected tab was the least readable of the three, which is precisely backwards.
   Shade belongs in the box-shadow below and nowhere else on this line. */
.ar-rev-tab.is-active { background: var(--ar-surface); color: var(--ar-ink); font-weight: 600; box-shadow: 0 1px 2px color-mix(in srgb, var(--ar-shade) 9%, transparent); }
.ar-rev-tab__n { font-size: 11px; color: var(--ar-ink-faint); font-variant-numeric: tabular-nums; }
.ar-rev-tab.is-active .ar-rev-tab__n { color: var(--ar-ink-soft); }
.ar-rev-tab.is-attention .ar-rev-tab__n { color: var(--ar-bad); }
.ar-rev-tab.is-attention.is-active { color: var(--ar-bad); }

.ar-rev-banner {
  margin: 12px 0 0; padding: 8px 11px; border-radius: 8px;
  background: var(--ar-warn-wash); font-size: 11.5px; line-height: 1.5; color: var(--ar-ink-soft);
}

/* Items — an inbox, not a wall of cards: soft border + a severity accent on the left. */
.ar-rev-list { list-style: none; margin: 12px 0 0; padding: 0; display: flex; flex-direction: column; gap: 9px; }
.ar-rev-item {
  border: 1px solid var(--ar-line); border-left: 3px solid var(--ar-line-strong);
  border-radius: 10px; background: var(--ar-surface); padding: 12px 13px;
}
.ar-rev-item.is-danger { border-left-color: var(--ar-bad); border-color: var(--ar-bad-tint); background: color-mix(in srgb, var(--ar-bad) 4%, var(--ar-surface)); }
.ar-rev-item.is-warn { border-left-color: var(--ar-warn); }
.ar-rev-item.is-ok { border-left-color: var(--ar-good); }
.ar-rev-item.is-calm { border-left-color: var(--ar-line-strong); }

.ar-rev-item__main { display: flex; gap: 11px; align-items: flex-start; }
.ar-rev-avatar {
  flex: 0 0 auto; width: 34px; height: 34px; border-radius: 9px; display: grid; place-items: center;
  background: var(--ar-surface-2); color: var(--ar-ink-soft); border: 1px solid var(--ar-line);
}
.ar-rev-avatar.is-danger { background: var(--ar-bad-wash); color: var(--ar-bad); border-color: var(--ar-bad-tint); }
.ar-rev-avatar.is-warn { background: var(--ar-warn-wash); color: var(--ar-warn); border-color: var(--ar-warn-tint); }
.ar-rev-avatar.is-ok { background: var(--ar-good-wash); color: var(--ar-good); border-color: var(--ar-good-tint); }
.ar-rev-body { min-width: 0; flex: 1; display: flex; flex-direction: column; gap: 5px; }

.ar-rev-nameline { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; }
.ar-rev-name { font-size: 14px; font-weight: 600; color: var(--ar-ink); }
.ar-rev-tag {
  font-family: var(--ar-mono); font-size: 9px; font-weight: 600; letter-spacing: 0.05em; text-transform: uppercase;
  padding: 2px 6px; border-radius: 4px; white-space: nowrap;
  color: var(--ar-ink-soft); background: var(--ar-surface-2); border: 1px solid var(--ar-line);
}
.ar-rev-tag.is-new { color: var(--ar-accent); background: color-mix(in srgb, var(--ar-accent) 7%, var(--ar-surface)); border-color: color-mix(in srgb, var(--ar-accent) 28%, var(--ar-surface)); }
.ar-rev-tag.is-heavy { color: var(--ar-warn); background: var(--ar-warn-wash); border-color: var(--ar-warn-tint); }

/* The hero: verification / identity state. */
.ar-rev-state { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-size: 12.5px; font-weight: 600; color: var(--ar-ink-soft); }
.ar-rev-state.is-danger { color: var(--ar-bad); }
.ar-rev-state.is-warn { color: var(--ar-warn); }
.ar-rev-state.is-ok { color: var(--ar-good); }
.ar-rev-state__ic { flex: 0 0 auto; }
.ar-rev-state__dot { width: 7px; height: 7px; border-radius: 50%; background: var(--ar-accent); flex: 0 0 auto; }
.ar-rev-state__by { font-weight: 400; color: var(--ar-ink-soft); }
.ar-rev-state__note { font-weight: 400; font-style: italic; font-size: 11px; color: var(--ar-ink-faint); }

.ar-rev-why { margin: 0; font-size: 12.5px; line-height: 1.5; color: var(--ar-ink-soft); }
.ar-rev-meta { font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-faint); }

.ar-rev-rec { margin-top: 2px; padding: 7px 10px; border-radius: 7px; font-size: 12px; line-height: 1.45; color: var(--ar-ink-soft); }
.ar-rev-rec strong { font-weight: 600; }
.ar-rev-rec.is-danger { background: var(--ar-bad-wash); color: var(--ar-bad-deep); }
.ar-rev-rec.is-danger strong { color: var(--ar-bad); }

/* Actions — real decisions as buttons, utilities as quiet links. */
.ar-rev-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 12px; margin-top: 4px; }
/* Why a card has NO Allow/Block: the server's reason said out loud in the button
   row — missing buttons must read as a decision, not an oversight. Soft ink with
   a leading info glyph for noticeability: it stands in for two buttons, so it
   must be read, not skimmed past. */
.ar-rev-noact { display: inline-flex; align-items: center; gap: 5px; font-size: 12px; color: var(--ar-ink-soft); }
.ar-rev-noact__ic { flex: none; }
.ar-rev-btn {
  appearance: none; cursor: pointer; white-space: nowrap;
  font-family: var(--ar-sans); font-size: 12px; font-weight: 600;
  padding: 5px 13px; border-radius: 7px; border: 1px solid var(--ar-line-strong);
  background: var(--ar-surface); color: var(--ar-ink); transition: background 0.14s ease, border-color 0.14s ease;
}
.ar-rev-btn:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; }
.ar-rev-btn:disabled { opacity: 0.5; cursor: default; }
.ar-rev-btn--allow { color: var(--ar-good); border-color: var(--ar-good-tint); }
.ar-rev-btn--allow:hover:not(:disabled) { background: var(--ar-good-wash); }
.ar-rev-btn--block { color: var(--ar-bad); border-color: var(--ar-bad-tint); }
.ar-rev-btn--block:hover:not(:disabled) { background: var(--ar-bad-wash); }
.ar-rev-link {
  appearance: none; cursor: pointer; border: 0; background: none; padding: 0 5px;
  font-family: var(--ar-sans); font-size: 12px; font-weight: 500; color: var(--ar-ink-soft);
  transition: color 0.14s ease, background-color 0.15s ease;
}
.ar-rev-link:hover { color: var(--ar-ink); }
.ar-rev-link:disabled { color: var(--ar-ink-faint); cursor: default; text-decoration: none; }
.ar-rev-link--details { color: var(--ar-info); }
/* Open is a STATE, not a hover — it holds the chip down rather than wearing a
   rule, so the app has one mark for "this button is live" in both cases. */
.ar-rev-link--details.is-on {
  color: var(--ar-info);
  background: var(--ar-hover);
}

/* Details panel — the honest evidence (verification + UA), collapsed by default. */
.ar-rev-details { margin-top: 11px; padding-top: 11px; border-top: 1px solid var(--ar-line); display: flex; flex-direction: column; gap: 8px; }
.ar-rev-kv { display: grid; grid-template-columns: 82px 1fr; gap: 10px; align-items: start; font-size: 12px; }
.ar-rev-kv__k { color: var(--ar-ink-faint); font-size: 11px; padding-top: 1px; }
.ar-rev-kv__v { color: var(--ar-ink); min-width: 0; }
.ar-rev-kv__v.is-danger { color: var(--ar-bad); font-weight: 600; }
.ar-rev-kv__v.is-ok { color: var(--ar-good); font-weight: 600; }
.ar-rev-kv__v.is-muted { color: var(--ar-ink-soft); }
.ar-rev-ua { font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-soft); word-break: break-all; background: none; padding: 0; border: 0; }
.ar-rev-ua.is-copyable { cursor: pointer; }
.ar-rev-ua.is-copyable:hover { color: var(--ar-ink); }
.ar-rev-ua.is-empty { font-style: italic; color: var(--ar-ink-faint); }
.ar-rev-network { font-family: var(--ar-mono); font-size: 11.5px; color: var(--ar-ink); word-break: break-all; }
.ar-rev-network__note { font-family: var(--ar-sans); font-size: 11px; margin-left: 5px; }
.ar-rev-network__note.is-ok { color: var(--ar-good); }
.ar-rev-network__note.is-danger { color: var(--ar-bad); }
.ar-rev-network__note.is-muted { color: var(--ar-ink-faint); }
/* Self-declared home page + what the weekly check found there. */
.ar-rev-home { font-family: var(--ar-mono); font-size: 11.5px; word-break: break-all; }
.ar-rev-home a { color: var(--ar-ink); text-decoration: underline; text-underline-offset: 2px; }
.ar-rev-home a:hover, .ar-rev-home a:focus-visible { color: var(--ar-accent); }
.ar-rev-home__note { font-family: var(--ar-sans); font-size: 11px; margin-left: 5px; }
.ar-rev-home__note.is-ok { color: var(--ar-good); }
.ar-rev-home__note.is-warn { color: var(--ar-warn); }
.ar-rev-home__note.is-muted { color: var(--ar-ink-faint); }
/* Captured flagged-client IPs — copyable mono chips. */
.ar-rev-ips { display: flex; flex-wrap: wrap; gap: 6px; }
.ar-rev-ip {
  appearance: none; cursor: pointer; font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink);
  padding: 2px 7px; border-radius: 5px; border: 1px solid var(--ar-line-strong); background: var(--ar-surface-2);
  transition: background 0.12s ease, border-color 0.12s ease;
}
.ar-rev-ip:hover { background: var(--ar-paper); border-color: var(--ar-ink-faint); }
.ar-rev-ip:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 1px; }
/* Admin "Re-check" controls (Details) — a quiet inset block, not a primary action. */
.ar-rev-recheck { display: flex; flex-direction: column; gap: 7px; padding: 9px 10px; border-radius: 7px; background: var(--ar-surface-2); border: 1px solid var(--ar-line); }
.ar-rev-recheck__row { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
.ar-rev-recheck__btn {
  appearance: none; display: inline-flex; align-items: center; gap: 5px; cursor: pointer;
  font-family: var(--ar-sans); font-size: 11.5px; font-weight: 600; color: var(--ar-accent);
  padding: 4px 9px; border-radius: 6px; border: 1px solid var(--ar-line-strong); background: var(--ar-surface);
  transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;
}
.ar-rev-recheck__btn:hover:not(:disabled) { border-color: var(--ar-accent); background: color-mix(in srgb, var(--ar-accent) 7%, var(--ar-surface)); }
.ar-rev-recheck__btn:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 1px; }
.ar-rev-recheck__btn:disabled { opacity: 0.55; cursor: default; }
.ar-rev-recheck__ago { font-size: 11px; color: var(--ar-ink-faint); }
.ar-rev-recheck__ip { display: flex; gap: 6px; }
.ar-rev-recheck__input {
  flex: 1 1 auto; min-width: 0; font-family: var(--ar-mono); font-size: 11.5px; color: var(--ar-ink);
  padding: 4px 8px; border-radius: 6px; border: 1px solid var(--ar-line-strong); background: var(--ar-surface);
}
.ar-rev-recheck__input:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 0; border-color: var(--ar-accent); }
.ar-rev-recheck__hint { margin: 0; font-size: 10.5px; line-height: 1.45; color: var(--ar-ink-faint); }
.ar-rev-recheck__result { margin: 0; font-size: 11.5px; font-weight: 600; line-height: 1.4; }
.ar-rev-recheck__result.is-ok { color: var(--ar-good); }
.ar-rev-recheck__result.is-danger { color: var(--ar-bad); }
.ar-rev-recheck__result.is-muted { color: var(--ar-ink-soft); font-weight: 500; }
.ar-rev-details__why { margin: 0; font-size: 12px; line-height: 1.55; color: var(--ar-ink-soft); }
.ar-rev-details__research { display: flex; align-items: baseline; flex-wrap: wrap; gap: 10px; }
.ar-rev-details__reslabel { font-size: 11px; color: var(--ar-ink-faint); }
.ar-rev-details__reslink { font-size: 11.5px; color: var(--ar-info); text-decoration: none; white-space: nowrap; }
.ar-rev-details__reslink:hover { text-decoration: underline; }
.ar-rev-details__note { margin: 2px 0 0; padding-top: 7px; border-top: 1px dashed var(--ar-line); font-size: 11px; font-style: italic; line-height: 1.5; color: var(--ar-ink-faint); }
.ar-rev-details__note .ar-linkbtn { font-style: normal; }

.ar-rev-empty { margin: 14px 0 4px; font-size: 13px; color: var(--ar-ink-soft); text-align: center; }

/* Pinned footer: sticky at the pop's bottom edge, so the "why New rows leave" note and
   the client-manager link never scroll away with the list. Full-bleed over the pop's
   16px/18px padding (the negative margins mirror it; the -16px bottom swallows the
   pop's own padding so rest and stuck positions are both flush — no jump), with an
   opaque surface so list items slide under it, not through it. */
.ar-rev-foot {
  flex: 0 0 auto; padding: 9px 18px 12px;
  background: var(--ar-surface); border-top: 1px solid var(--ar-line-strong);
  /* Lift it off the rows scrolling past above — the border alone gets lost against
     a card edge stopping right at it. */
  box-shadow: 0 -8px 14px -10px color-mix(in srgb, var(--ar-shade) 28%, transparent);
  display: flex; flex-direction: column; gap: 4px; align-items: flex-end;
}
.ar-rev-foot__note {
  margin: 0; align-self: stretch;
  font-size: 11px; line-height: 1.55; color: var(--ar-ink-faint);
}
.ar-rev-foot__manage { font-size: 11.5px; }

/* ---- Loading skeleton (activity first load) ---------------------------- */
.ar-skel { display: grid; gap: 14px; margin-top: 16px; }
/* CardSkeleton's variant: the primitive above paints the container as a
   visible panel, and a panel whose lead text touches its own edge reads
   broken — the card form breathes like the cards it stands in for. */
.ar-skel--card { padding: 18px 20px; }
.ar-skel__tiles { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; }
.ar-skel__box { height: 58px; border-radius: var(--ar-radius); }
.ar-skel__line { height: 13px; border-radius: 4px; }
/* The button's ghost: the house height, this screen's width, and the same
   right edge the real one will land on — so nothing slides when it arrives. */
.ar-skel__action { height: 40px; width: 150px; justify-self: end; border-radius: var(--ar-radius); }
/* A ghost the height of one dashboard big-card panel, so those cards hold
   their loaded shape while their poll is in flight instead of leaping from a
   one-line wait to a wall of panels. Heights measured off the loaded cards:
   a systems panel runs ~332px (four rows), an audience half ~298px. */
.ar-skel__panel { height: 332px; border-radius: var(--ar-radius); }
.ar-aud__split .ar-skel__panel { height: 298px; }
.ar-skel__box, .ar-skel__line, .ar-skel__panel {
  background: linear-gradient(90deg, var(--ar-surface-2) 25%, var(--ar-line) 50%, var(--ar-surface-2) 75%);
  background-size: 200% 100%;
  animation: ar-shimmer 1.3s ease-in-out infinite;
}
@keyframes ar-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
@media (prefers-reduced-motion: reduce) {
  .ar-skel__box, .ar-skel__line, .ar-skel__panel { animation: none; background: var(--ar-surface-2); }
}

/* ---- One-time load reveal (no perpetual motion) ------------------------- */
.ar__body > * { animation: ar-rise 0.5s cubic-bezier(0.22, 1, 0.36, 1) both; }
.ar__body > *:nth-child(1) { animation-delay: 0.04s; }
.ar__body > *:nth-child(2) { animation-delay: 0.10s; }
.ar__body > *:nth-child(3) { animation-delay: 0.16s; }
.ar__body > *:nth-child(4) { animation-delay: 0.22s; }
.ar__body > *:nth-child(5) { animation-delay: 0.28s; }
@keyframes ar-rise { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }


@media (prefers-reduced-motion: reduce) {
  .ar__body > *, .ar-rail-gauge__fill { animation: none !important; transition: none !important; }
}

/* Advanced / Authenticated API ------------------------------------- */
.ar-adv__toggle { width: 100%; background: none; border: 0; padding: 0; cursor: pointer; text-align: left; color: inherit; font: inherit; }
.ar-adv__toggle:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 3px; border-radius: var(--ar-radius); }
.ar-adv__chev { flex: 0 0 auto; color: var(--ar-ink-faint); transition: transform 0.18s ease; }
.ar-adv__chev.is-open { transform: rotate(180deg); }
.ar-adv__body { margin-top: 18px; border-top: 1px solid var(--ar-line); padding-top: 18px; }
.ar-adv__title { font-family: var(--ar-serif); font-size: 16px; font-weight: 600; margin: 0 0 8px; }
.ar-oauth { display: flex; gap: 8px; align-items: stretch; }
.ar-oauth .ar-input { flex: 1 1 auto; min-width: 0; } /* min-width:0 lets the field shrink below its intrinsic size on narrow screens */
.ar-oauth__check { flex: 0 0 auto; }
.ar-oauth__msg { font-size: 12.5px; line-height: 1.5; margin-top: 8px; overflow-wrap: anywhere; } /* break the long /.well-known/… token instead of overflowing */
/* The hint embeds a long, space-free URL path — let it wrap on mobile. */
.ar-adv__body .ar-field__hint, .ar-adv__body .ar-field__hint code { overflow-wrap: anywhere; }
.ar-oauth__msg.is-ok { color: var(--ar-good); }
.ar-oauth__msg.is-bad { color: var(--ar-bad); }
.ar-oauth__msg.is-info { color: var(--ar-ink-soft); }

@media (prefers-reduced-motion: reduce) {
  .ar-adv__chev { transition: none !important; }
}

/* Manage-setup block (Setup guide + Reset, grouped) ---------------- */
.ar-manage { display: flex; flex-direction: column; gap: 18px; }
.ar-manage__sep { border: 0; border-top: 1px solid var(--ar-line); margin: 0; width: 100%; }
.ar-manage .ar-btn { min-width: 160px; } /* equal-width action buttons, sized to the longer "Review setup" label */
.ar-reset__text em { font-style: normal; font-weight: 600; color: var(--ar-ink-soft); }

/* ======================================================================
   About tab — capabilities, transparency, protocol, FAQ
   ====================================================================== */
.ar-about { display: grid; gap: 22px; min-width: 0; }

/* Features list */
.ar-about-feat { margin-top: 22px; }
.ar-about-feat:first-of-type { margin-top: 6px; }
.ar-about-feat__head { margin-bottom: 8px; }
.ar-about-feat__title {
  margin: 0; font-family: var(--ar-mono); font-size: 11px; letter-spacing: 0.12em;
  text-transform: uppercase; color: var(--ar-ink);
}
.ar-about-feat__lead { margin: 3px 0 0; font-size: 12.5px; color: var(--ar-ink-faint); }
.ar-about-list { margin: 0; padding: 0; list-style: none; border-top: 1px solid var(--ar-line); }
/* The tag pill lives in the title cluster (name · where · tag), not exiled to the row's
   far edge — space-between left it orphaned across a wide dead middle. */
.ar-about-item {
  padding: 12px 2px; border-bottom: 1px solid var(--ar-line);
}
.ar-about-item__main { min-width: 0; }
.ar-about-item__top { display: flex; flex-wrap: wrap; align-items: baseline; gap: 6px 10px; }
.ar-about-item__name { font-size: 13.5px; font-weight: 600; color: var(--ar-ink); }
.ar-about-item__where {
  font-family: var(--ar-mono); font-size: 11.5px; color: var(--ar-ink-soft);
  background: var(--ar-surface-2); border: 1px solid var(--ar-line); border-radius: 3px; padding: 1px 6px;
  overflow-wrap: anywhere;
}
/* Same set-page dress as the screens manual — full card width, justified,
   hyphenated — so the two halves of the page read as one document (the old
   80ch cap left these as a narrow ragged column beside full-width intros). */
.ar-about-item__desc { margin: 4px 0 0; font-size: 12.5px; line-height: 1.5; color: var(--ar-ink-soft); text-align: justify; hyphens: auto; -webkit-hyphens: auto; }
.ar-about-tag {
  flex: 0 0 auto; font-family: var(--ar-mono); font-size: 9px; letter-spacing: 0.08em; text-transform: uppercase;
  padding: 3px 8px; border-radius: 999px; border: 1px solid var(--ar-line-strong); color: var(--ar-ink-faint);
  white-space: nowrap;
}
.ar-about-tag.is-on { color: var(--ar-good); border-color: var(--ar-good-tint); background: var(--ar-good-wash); }

/* Privacy & data */
.ar-about-priv__grid { display: grid; gap: 14px; margin-top: 4px; }
.ar-about-priv__cell {
  padding: 16px 18px; border: 1px solid var(--ar-line); border-radius: var(--ar-radius); background: var(--ar-surface-2);
}
.ar-about-priv__cell h3 { margin: 0 0 6px; font-size: 13.5px; color: var(--ar-ink); }
.ar-about-priv__cell p { margin: 0; font-size: 12.5px; line-height: 1.6; color: var(--ar-ink-soft); }
/* The lead cell used to be an INVERTED panel — ink ground, paper text — which
   dark could not follow (it has no darker ground to invert onto) and which cost
   this cell its legibility there. It is the same reading text as its siblings,
   so it now sits on the same ground in BOTH themes and takes its rank from the
   icon, the flex layout and a stronger line. That leaves no colour for a theme
   block to have to re-state, which is what went wrong before. */
.ar-about-priv__cell--head {
  display: flex; gap: 14px; align-items: flex-start; border-color: var(--ar-line-strong);
}
.ar-about-priv__icon {
  flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center;
  width: 34px; height: 34px; border-radius: 50%; color: var(--ar-good); background: color-mix(in srgb, var(--ar-good) 14%, transparent);
}
.ar-about-not { margin: 10px 0 0; padding: 0; list-style: none; display: grid; gap: 5px; }
.ar-about-not li { position: relative; padding-left: 20px; font-size: 12px; color: var(--ar-ink-soft); }
.ar-about-not li::before {
  content: "\2715"; position: absolute; left: 2px; top: 0; color: var(--ar-bad); font-size: 11px; font-weight: 700;
}
.ar-about-priv__foot { margin-top: 12px !important; font-size: 12px !important; color: var(--ar-ink-faint) !important; }

/* WP_Discovery protocol */
.ar-about-chips { display: flex; flex-wrap: wrap; gap: 7px; margin: 0 0 18px; padding: 0; list-style: none; }
.ar-about-chip {
  font-family: var(--ar-mono); font-size: 10.5px; letter-spacing: 0.03em; color: var(--ar-ink-soft);
  padding: 4px 9px; border: 1px solid var(--ar-line-strong); border-radius: 999px; background: var(--ar-surface-2);
}
.ar-about-proto__meta {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 1px; margin: 0 0 22px;
  background: var(--ar-line); border: 1px solid var(--ar-line); border-radius: var(--ar-radius); overflow: hidden;
}
.ar-about-proto__fact { display: flex; flex-direction: column; gap: 4px; padding: 13px 15px; background: var(--ar-surface); }
.ar-about-proto__k {
  font-family: var(--ar-mono); font-size: 9.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ar-ink-faint);
}
.ar-about-proto__v { font-size: 13px; color: var(--ar-ink); }
a.ar-about-proto__v { color: var(--ar-accent); text-decoration: none; }
a.ar-about-proto__v:hover { text-decoration: underline; }
.ar-about-proto__dev h3 { margin: 0 0 6px; font-size: 13.5px; color: var(--ar-ink); }
.ar-about-proto__dev p { margin: 0 0 12px; font-size: 12.5px; line-height: 1.6; color: var(--ar-ink-soft); max-width: 80ch; }
.ar-about-snippet {
  margin: 0; padding: 14px 16px; overflow-x: auto; border-radius: var(--ar-radius);
  background: var(--ar-ink); color: color-mix(in srgb, var(--ar-paper) 95%, var(--ar-ink)); font-family: var(--ar-mono); font-size: 12px; line-height: 1.55;
}
.ar-about-snippet code { color: inherit; background: none; padding: 0; border: 0; }

/* FAQ accordion */
.ar-about-faq { margin: 0; padding: 0; list-style: none; }
.ar-about-faq__item { border-bottom: 1px solid var(--ar-line); }
.ar-about-faq__item:first-child { border-top: 1px solid var(--ar-line); }
.ar-about-faq__q {
  appearance: none; width: 100%; background: none; border: 0; cursor: pointer; text-align: left;
  display: flex; align-items: center; justify-content: space-between; gap: 14px;
  padding: 14px 2px; font-size: 13.5px; font-weight: 600; color: var(--ar-ink); font-family: var(--ar-sans);
}
.ar-about-faq__q:hover { color: var(--ar-accent); }
/* Same drawn triangle as .ar-wd-group__caret — one disclosure grammar. */
.ar-about-faq__caret {
  flex: 0 0 auto; width: 0; height: 0; font-size: 0;
  border-left: 6px solid var(--ar-ink-soft);
  border-top: 5px solid transparent; border-bottom: 5px solid transparent;
  transition: transform 0.15s ease, border-color 0.15s ease;
}
.ar-about-faq__item.is-open .ar-about-faq__caret { transform: rotate(90deg); border-left-color: var(--ar-accent); }
.ar-about-faq__a { margin: 0 0 14px; padding-right: 28px; font-size: 12.5px; line-height: 1.65; color: var(--ar-ink-soft); max-width: 90ch; }

@media (prefers-reduced-motion: reduce) { .ar-about-faq__caret { transition: none; } }
@media (max-width: 600px) {
  .ar-about-proto__meta { grid-template-columns: 1fr; }
}

/* Letterpress (debossed) | separator in the admin-footer version line
   ("Agentimus - x | WordPress - y"). Surface-adaptive on purpose: a translucent white
   catch beneath the glyph plus a translucent dark lip above make it read as pressed-in
   on ANY footer surface — the white shows on the light default admin, the dark lip gives
   depth if a dark-mode scheme/plugin darkens it. No prefers-color-scheme query, because
   WP keeps the footer light even under an OS dark preference, so keying off it would
   misfire. Lives on core's #wpfooter (rendered by PHP), loaded alongside this stylesheet
   on our screen. */
#wpfooter .agentimus-footer-sep {
  color: var(--ar-ink-faint);
  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.55), 0 -1px 0 rgba(0, 0, 0, 0.28);
  margin: 0 5px;
}

/* Footer text: size + tracking so both footer lines sit evenly around the separator. */
#wpfooter p {
  font-size: 13px;
  margin: 0;
  line-height: 1.55;
  letter-spacing: 0.09em;
}

/* ---- Request log ---------------------------------------------------------
   The per-request view. Reuses .ar-act-table/.ar-act-reqs from the activity
   feed so a row looks identical in both places; only the filter bar, the
   pivot affordance and the pager are new. */

/* A grid item's default min-width:auto is its CONTENT's minimum, so a wide table
   of nowrap User-Agents blows the column open and slides under the rail. .ar__main
   already sets min-width:0 on itself; each child has to opt in too (see .ar-act). */
.ar-log { min-width: 0; }
.ar-log .ar-card__head { margin-bottom: 18px; }

/* The activity feed caps its table at 340px because it's one card among many. This is a
   page whose whole job is the table: let it run its full height and scroll the page. */
.ar-log .ar-act-reqs { max-height: none; }

/* A full User-Agent is ~120 chars and pushes the table past the column, which shoves
   "Seen" — the column you actually scan — off the right edge behind a horizontal
   scrollbar. Truncate it; the full string stays in the title attribute. */
.ar-log .ar-act-feed__ua {
  display: inline-block; max-width: 46ch; vertical-align: middle;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ar-log .ar-act-table { min-width: 0; }
.ar-log .ar-act-table td:last-child, .ar-log .ar-act-table th:last-child { text-align: right; padding-right: 10px; width: 24ch; min-width: 24ch; }

.ar-log__filters {
  padding: 14px 16px; margin-bottom: 18px;
  /* A half-step tint: full surface-2 read too heavy as a band across the card. */
  background: color-mix(in srgb, var(--ar-surface-2) 45%, var(--ar-surface));
  border: 1px solid var(--ar-line); border-radius: var(--ar-radius);
}
/* One line of controls. Every field is flex:1 with min-width:0 so they compress together
   rather than the last one wrapping alone; the User-Agent box takes the slack because it
   holds the longest value, and the two dates size to their own picker. */
.ar-log__row { display: flex; flex-wrap: nowrap; gap: 10px; align-items: flex-end; }
.ar-log__field { display: flex; flex-direction: column; gap: 5px; flex: 1 1 0; min-width: 0; }
.ar-log__field--ua { flex: 1.5 1 0; }
/* `0 1 138px` not `0 0 auto`: a rigid basis leaves sub-pixel flex remainders nowhere to go
   and the row overflows its container by a pixel. */
.ar-log__field--date { flex: 0 1 138px; }
.ar-log__label {
  font-family: var(--ar-mono); font-size: 9px; letter-spacing: 0.09em;
  text-transform: uppercase; color: var(--ar-ink-faint); white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis;
}
/* A SelectMenu trigger is a button (it grows for its caret); the others are inputs. Pin one
   height so the row's bottoms — and therefore its labels — line up. */
/* WP admin's forms.css pins `min-height: 40px` on inputs, which outranks any height we set
   on them — so the SelectMenu's <button> trigger was 38px and the inputs 40px, and the
   labels above drifted 2px out of line. Adopt core's 40 rather than fight it. */
.ar-log__field .ar-input { box-sizing: border-box; height: 40px; padding: 0 10px; font-size: 13px; }
.ar-log__field--date .ar-input { font-family: var(--ar-mono); font-size: 12px; }

/* A dropdown's trigger is as wide as its longest option ("Bytespider (ByteDance)") because
   the value is nowrap. In a flex row that intrinsic minimum props every other control open
   and the line overflows. Let the trigger shrink and ellipsis its own label instead. */
.ar-log__field .ar-select, .ar-log__field .ar-select__btn { min-width: 0; }
.ar-log__field .ar-select__value {
  display: block; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

.ar-log__actions { display: flex; gap: 10px; justify-content: flex-end; margin-top: 14px; }
.ar-log__actions .ar-btn { padding: 9px 22px; }

/* A cell that filters the log onto its own value. Styled as text, not a button —
   the affordance is the underline on hover, so the table stays a table. */
.ar-log__pivot {
  appearance: none; background: none; border: 0; padding: 0; cursor: pointer;
  font: inherit; color: inherit; text-align: left;
  border-bottom: 1px solid transparent;
}
.ar-log__pivot:hover { border-bottom-color: var(--ar-accent); }
.ar-log__pivot:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; }

/* Identity/outcome marks live in their own narrow column, so every mark starts
   at the same x down the whole table instead of drifting after each client
   name. Slim by design: one short word, hairline border, no fill — the table is
   scanned, and a row of loud chips is harder to read than a quiet column. */
.ar-log__statuscol { width: 92px; white-space: nowrap; }
.ar-log__mark {
  display: block; width: max-content; padding: 0 5px; border-radius: 3px;
  font-family: var(--ar-mono); font-size: 9.5px; line-height: 16px; letter-spacing: 0.06em;
  text-transform: uppercase; cursor: help;
}
/* One mark per row by design; a row with nothing to say shows a dash, the
   same way the Network column does, so the column never looks broken. */
/* "unchecked" / "unknown" are answers too, so they get a word like every other
   row — but the quietest one on the screen: no border, muted ink, and a dotted
   underline that says "there's more if you want it" without competing with the
   verdicts around it. */
.ar-log__mark.is-none {
  color: var(--ar-ink-soft); border: 1px solid transparent;
  border-bottom: 1px dotted var(--ar-line-strong); border-radius: 0;
  padding: 0; opacity: 0.85;
}
.ar-log__mark.is-none:hover { opacity: 1; border-bottom-color: var(--ar-accent); }
.ar-log__mark.is-verified { color: color-mix(in srgb, var(--ar-good) 80%, var(--ar-ink-soft)); border: 1px solid color-mix(in srgb, var(--ar-good) 38%, var(--ar-line)); }
.ar-log__mark.is-spoofed  { color: color-mix(in srgb, var(--ar-bad) 85%, var(--ar-ink-soft));  border: 1px solid color-mix(in srgb, var(--ar-bad) 38%, var(--ar-line)); }
/* Proof outranks inference, so a signature-backed mark gets a faint wash — still
   quiet, but distinguishable from a DNS-based verdict at a glance. */
.ar-log__mark.is-verified.is-signed { background: color-mix(in srgb, var(--ar-good) 10%, transparent); border-color: color-mix(in srgb, var(--ar-good) 50%, var(--ar-line)); }
.ar-log__mark.is-spoofed.is-signed  { background: color-mix(in srgb, var(--ar-bad) 10%, transparent);  border-color: color-mix(in srgb, var(--ar-bad) 50%, var(--ar-line)); }
/* "Refused" is an OUTCOME, not one more verification state — the only solid mark
   in the column, so it reads as different in kind, not merely in colour. */
.ar-log__mark.is-refused {
  color: var(--ar-paper); background: color-mix(in srgb, var(--ar-bad) 82%, var(--ar-ink));
  border: 1px solid transparent;
}
.ar-act-table tr.is-refused td { opacity: 0.72; }
.ar-act-table tr.is-spoofed td { background: color-mix(in srgb, var(--ar-bad) 5%, transparent); }

/* Small screens, everywhere a request table wears the --cards modifier (the
   Request Log and the dashboard's Recent Requests): each row re-stacks as a
   card in the Agent Access idiom — bordered, rounded, a quiet label in front
   of every value — instead of scrolling sideways. */
@media (max-width: 782px) {
  .ar-log .ar-act-reqs, .ar-act-reqs:has(.ar-act-table--cards) { border-top: 0; padding-right: 0; max-height: 60vh; }
  .ar-act-table.ar-act-table--cards { min-width: 0; display: block; }
  .ar-act-table.ar-act-table--cards tbody tr, .ar-act-table.ar-act-table--cards tbody td { display: block; }
  .ar-act-table.ar-act-table--cards thead { display: none; }
  .ar-act-table.ar-act-table--cards tbody { display: flex; flex-direction: column; gap: 8px; }
  /* Each row re-seats as the edge card's anatomy: identity + a right-corner
     capsule on the header line, labeled facts below, the timestamp as a
     ruled-off footer. Orders do the seating — the wide table keeps its DOM. */
  .ar-act-table.ar-act-table--cards tbody tr {
    display: flex; flex-wrap: wrap; align-items: flex-start; gap: 10px 12px;
    padding: 12px 14px; border: 1px solid var(--ar-line); border-radius: var(--ar-radius);
    background: var(--ar-surface);
  }
  .ar-act-table.ar-act-table--cards tbody td {
    display: flex; flex-direction: column; align-items: flex-start; gap: 3px;
    padding: 0; margin: 0; border: 0; white-space: normal; min-width: 0;
  }
  /* Header: the client leads and the moment sits in the right corner — no
     footer row, the corner was already paid for (his mock B). The 1px
     ::before item is both the line break after the header and the hairline
     that rules it off. */
  .ar-act-table.ar-act-table--cards tbody tr::before { content: ""; order: 3; width: 100%; height: 1px; background: var(--ar-line); }
  /* Content-width, not greedy: the status word must land right beside the
     name, and the date's auto margin claims whatever is left. */
  /* The name ELLIPSIZES rather than pushing the date off the header row — a
     wrapped, right-floating date reads as a layout accident. Full identity
     still lives in the UA box below. */
  .ar-act-table.ar-act-table--cards tbody td:first-child {
    order: 1; flex: 0 1 auto; min-width: 0; padding-left: 0;
    display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  .ar-act-table.ar-act-table--cards tbody td.ar-log__seen,
  .ar-act-table.ar-act-table--cards tbody td.ar-act-table__at {
    order: 2; flex: 0 0 auto; flex-direction: row; align-items: center; gap: 6px;
    font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-faint);
  }
  .ar-act-table.ar-act-table--cards tbody td.ar-log__seen { margin-left: auto; }
  /* Log cards carry name + status + date — at phone width that trio can never
     share a line (wrapping flex rows wrap before they shrink), and a date
     wrapped to a right-floating line reads as an accident. Rows WITH a status
     (the log) seat the date as a deliberate left byline under the name; the
     dashboard feed (no status) keeps its corner date, which fits. */
  .ar-act-table.ar-act-table--cards tbody tr:has(td.ar-log__statuscol) td.ar-log__seen {
    margin-left: 0; flex: 1 1 100%;
  }
  .ar-act-table.ar-act-table--cards tbody td[data-label="Hits"] { order: 2; margin-left: auto; flex: 0 0 auto; }
  .ar-act-table.ar-act-table--cards tbody tr:has(td[data-label="Hits"].is-empty-cell) td.ar-act-table__at { margin-left: auto; }
  /* Facts: icon-anchored slots — glyph left, label over value right, a seam
     before every slot after the first. The log leads with Status, the
     dashboard feed with Network; Endpoint takes the remaining width. */
  .ar-act-table.ar-act-table--cards tbody td[data-label="Endpoint"],
  .ar-act-table.ar-act-table--cards tbody td[data-label="Network"] {
    /* Fixed icon column + 1fr: excess width must pool AFTER the value —
       "auto auto" tracks both stretch under normal alignment and float the
       label away from its glyph. */
    display: grid; grid-template-columns: 17px minmax(0, 1fr);
    column-gap: 9px; row-gap: 4px; align-items: center; justify-items: start;
    flex: 0 1 auto; margin-left: 0; text-align: left;
  }
  .ar-act-table.ar-act-table--cards tbody td[data-label="Network"] { order: 5; }
  .ar-act-table.ar-act-table--cards tbody td[data-label="Endpoint"] { order: 6; flex: 1 1 auto; }
  .ar-act-table.ar-act-table--cards tbody tr:has(td[data-label="Network"]) td[data-label="Endpoint"] {
    border-left: 1px solid var(--ar-line); padding-left: 12px;
  }
  /* Status rides the header, right after the name: a plain verdict word in its
     own color — no capsule, no icon, no slot (his call). The td's ::before
     becomes the joining dash. */
  .ar-act-table.ar-act-table--cards tbody td.ar-log__statuscol {
    order: 1; display: flex; flex-direction: row; align-items: baseline; gap: 7px;
    flex: 0 0 auto;
  }
  .ar-act-table.ar-act-table--cards tbody td.ar-log__statuscol::before {
    content: "–"; display: block; color: var(--ar-ink-faint); font-size: 13px;
  }
  .ar-act-table.ar-act-table--cards td.ar-log__statuscol .ar-cardico { display: none; }
  .ar-act-table.ar-act-table--cards td.ar-log__statuscol .ar-log__mark {
    border: 0; background: none; padding: 0; font-size: 12px;
    letter-spacing: 0.04em; text-transform: none; line-height: inherit; cursor: default;
  }
  .ar-act-table.ar-act-table--cards td.ar-log__statuscol .ar-log__mark.is-none { color: var(--ar-warn); opacity: 1; }
  .ar-act-table.ar-act-table--cards td.ar-log__statuscol .ar-log__mark.is-refused { color: var(--ar-bad); }
  .ar-act-table.ar-act-table--cards tbody td[data-label="Endpoint"]::before,
  .ar-act-table.ar-act-table--cards tbody td[data-label="Network"]::before { grid-row: 1; grid-column: 2; }
  .ar-act-table.ar-act-table--cards .ar-cardico {
    display: block; grid-row: 1 / 3; grid-column: 1; width: 17px; height: 17px;
    fill: none; stroke: currentColor; stroke-width: 1.6; color: var(--ar-ink-soft);
    stroke-linecap: round; stroke-linejoin: round;
  }
  .ar-act-table.ar-act-table--cards td[data-label="Endpoint"] .ar-log__pivot,
  .ar-act-table.ar-act-table--cards td[data-label="Endpoint"] > .ar-act-feed__ep,
  .ar-act-table.ar-act-table--cards td[data-label="Network"] .ar-act-feed__net,
  .ar-act-table.ar-act-table--cards td[data-label="Network"] .ar-log__mark,
  .ar-act-table.ar-act-table--cards td[data-label="Network"] .ar-act-table__dash {
    grid-row: 2; grid-column: 2;
  }
  /* The network value wears the endpoint chip's dress — "unknown" included, as
     a plain quiet word: a dotted hover-underline means nothing to a thumb. */
  .ar-act-table.ar-act-table--cards td[data-label="Network"] .ar-act-feed__net,
  .ar-act-table.ar-act-table--cards td[data-label="Network"] .ar-log__mark,
  .ar-act-table.ar-act-table--cards td[data-label="Network"] .ar-act-table__dash {
    display: inline-block; font-family: var(--ar-mono); font-size: 11.5px;
    line-height: 1.6; letter-spacing: 0; text-transform: none; color: var(--ar-ink-soft);
    background: var(--ar-surface-2); padding: 2px 8px; border: 0; border-radius: 3px;
    opacity: 1; cursor: default;
  }
  /* The UA cell IS the box: label inside at the top-left, the string below —
     one object, label included. The code chip sheds its own dress for it. */
  .ar-act-table.ar-act-table--cards tbody td[data-label="User-Agent"] {
    order: 7; flex: 1 1 100%; gap: 4px; padding: 8px 10px;
    background: var(--ar-surface-2); border: 1px solid var(--ar-line); border-radius: 8px;
  }
  /* Outranks the spoofed row's td-background reset — the box stays a box. */
  .ar-act-table.ar-act-table--cards tbody tr.is-spoofed td[data-label="User-Agent"] { background: var(--ar-surface-2); }
  /* Pinned column widths and right alignment belong to the wide table — inside
     a card they squeeze values into word-per-line wraps. Undo them here. */
  .ar-act-table.ar-act-table--cards tbody td:last-child { width: auto; min-width: 0; text-align: left; padding-right: 0; }
  .ar-act-table.ar-act-table--cards tbody td.ar-act-table__uacol { width: auto; max-width: none; overflow: visible; }
  /* The edge crawler cards: identity left; a dashed TOTAL badge (glyph beside
     the big count) and the bytes pill share the top-right; a hairline rules
     off the header; the three funnel facts sit centered in equal thirds below.
     Flex + order does the seating — the bytes td renders after the facts in
     DOM (the wide table's column order), order pulls it into the header line,
     and the ::after hairline is a full-width item that forces the wrap. */
  .ar-edge .ar-act-table--cards tbody tr {
    display: flex; flex-wrap: wrap; align-items: center;
    gap: 12px 10px; padding: 14px 16px;
  }
  /* The generic card's header/facts line break sits at order 3 — here that
     seat belongs to the bytes pill, and the ::after hairline breaks the line. */
  .ar-edge .ar-act-table--cards tbody tr::before { content: none; }
  .ar-edge .ar-act-table--cards tbody tr::after {
    content: ""; order: 4; width: 100%; height: 1px; background: var(--ar-line);
  }
  .ar-edge .ar-act-table--cards tbody td { margin-top: 0; }
  .ar-edge .ar-act-table--cards tbody td.ar-edge__crawler { order: 1; flex: 1 1 120px; min-width: 0; font-weight: 500; }
  .ar-edge .ar-act-table--cards tbody td.ar-edge__crawler::before { display: none; }
  /* Identity stacks: bold name, quiet operator beneath — the joining dash is a
     wide-table word; a stack doesn't need it. */
  .ar-edge .ar-act-table--cards .ar-edge__op { display: block; margin-top: 1px; }
  .ar-edge .ar-act-table--cards .ar-edge__dash { display: none; }
  /* Hairline between the bottom fact slots, echoing the summary strip's cell
     seams. Total (header badge) neither wears nor causes one. */
  .ar-edge .ar-act-table--cards tbody td.ar-edge__n:not([data-label="Total"]) + td.ar-edge__n:not([data-label="Data"]) {
    border-left: 1px solid var(--ar-line);
  }
  .ar-edge .ar-act-table--cards tbody td.ar-edge__n {
    order: 5; flex: 1 1 0; min-width: 0;
    flex-direction: column; align-items: center; gap: 6px;
    font-size: 18px; text-align: center; padding-right: 0 !important;
  }
  /* Slot order: chip, number, label — the label renders via ::before, so order
     properties place it last. */
  .ar-edge .ar-act-table--cards .ar-edge__ico {
    display: block; order: 1; width: 30px; height: 30px; padding: 7px;
    border: 1px solid var(--ar-line); border-radius: 9px;
    background: var(--ar-surface-2); color: var(--ar-ink-soft);
    fill: none; stroke: currentColor; stroke-width: 1.7;
    stroke-linecap: round; stroke-linejoin: round;
  }
  .ar-edge .ar-act-table--cards .ar-edge__v { order: 2; }
  .ar-edge .ar-act-table--cards tbody td.ar-edge__n::before {
    order: 3; width: auto; font-family: var(--ar-mono); font-size: 9.5px;
    font-weight: 400; letter-spacing: 0.08em; text-transform: uppercase;
    color: var(--ar-ink-faint);
  }
  /* Blocked with a count: the chip and the number warm up together — the ONLY
     color in the card row, so it stays an alarm. The label keeps quiet. */
  .ar-edge .ar-act-table--cards tbody td.ar-edge__n.is-bad .ar-edge__ico {
    color: var(--ar-bad);
    border-color: color-mix(in srgb, var(--ar-bad) 28%, var(--ar-line));
    background: color-mix(in srgb, var(--ar-bad) 6%, var(--ar-surface));
  }
  /* Total is the headline, not a funnel stage: a slim dashed capsule in the
     header — glyph, count, quiet TOTAL label on one line. Slot order comes
     free: glyph 1, value 2, ::before label 3. The bytes pill is its solid
     twin — same height, same radius, so the pair reads as one family. */
  .ar-edge .ar-act-table--cards tbody td[data-label="Total"] {
    order: 2; margin-left: auto; flex: 0 0 auto;
    flex-direction: row; align-items: center; gap: 7px;
    height: 28px; padding: 0 12px; padding-right: 12px !important;
    border: 1px dashed var(--ar-line-strong); border-radius: 999px;
    font-size: 14px;
  }
  .ar-edge .ar-act-table--cards tbody td[data-label="Total"] .ar-edge__ico { display: none; }
  /* Bytes: value only, wearing the card-tag pill dress beside the badge —
     "20.5 MB" explains itself. */
  .ar-edge .ar-act-table--cards tbody td[data-label="Data"] {
    order: 3; flex: 0 0 auto;
    flex-direction: row; align-items: center; font-size: 14px; color: var(--ar-ink-soft);
    white-space: nowrap; height: 28px; padding: 0 11px; padding-right: 11px !important;
    border: 1px solid var(--ar-line); border-radius: 999px;
    background: var(--ar-surface-2);
  }
  .ar-edge .ar-act-table--cards tbody td[data-label="Data"]::before { display: none; }
  .ar-act-table.ar-act-table--cards tbody td::before {
    content: attr(data-label); flex: 0 0 auto;
    font-family: var(--ar-mono); font-size: 9.5px; letter-spacing: 0.08em;
    text-transform: uppercase; color: var(--ar-ink-faint);
  }
  /* Self-explanatory cells carry no label: the name IS the header, ×3 and a
     date read alone. Status keeps its label — his mock names every fact. */
  .ar-act-table.ar-act-table--cards tbody td:first-child::before,
  .ar-act-table.ar-act-table--cards tbody td[data-label="Hits"]::before,
  .ar-act-table.ar-act-table--cards tbody td.ar-log__seen::before,
  .ar-act-table.ar-act-table--cards tbody td.ar-act-table__at::before { display: none; }
  /* A one-hit row has nothing to say under "Hits" — drop the empty line. */
  .ar-act-table.ar-act-table--cards tbody td.is-empty-cell { display: none; }
  .ar-act-table.ar-act-table--cards tbody tr.is-spoofed td { background: none; }
  .ar-act-table.ar-act-table--cards tbody tr.is-spoofed { background: color-mix(in srgb, var(--ar-bad) 5%, var(--ar-surface)); }
  .ar-act-table.ar-act-table--cards tbody tr.is-refused { border-left: 2px solid var(--ar-warn); }
  /* Long strings wrap inside the card instead of forcing it wide. */
  /* The UA string wears a quiet code box — the card's one long string reads as
     one object, and a click still copies it (the cell's existing contract). */
  .ar-act-table.ar-act-table--cards .ar-act-feed__ua {
    white-space: normal; word-break: break-all;
    display: block; width: 100%; max-width: none; padding: 0;
    background: none; border: 0; border-radius: 0;
  }
  /* Break at word seams first, mid-word only as a last resort. */
  .ar-act-table.ar-act-table--cards .ar-act-feed__ep { white-space: normal; word-break: normal; overflow-wrap: anywhere; }
  .ar-act-table.ar-act-table--cards .ar-log__pivot { text-align: left; }
}

/* Phone-narrow containers: the fact slots can't share a line anyway, so they
   stack as clean full-width rows — a wrapped slot dragging its seam border to
   a line start read as a stray mark (iPhone-width finding). */
@container (max-width: 430px) {
  .ar-act-table.ar-act-table--cards tbody td[data-label="Endpoint"],
  .ar-act-table.ar-act-table--cards tbody td[data-label="Network"] { flex: 1 1 100%; }
  .ar-act-table.ar-act-table--cards tbody tr:has(td[data-label="Network"]) td[data-label="Endpoint"] {
    border-left: 0; padding-left: 0;
  }
}

.ar-log__seen { color: var(--ar-ink-faint); font-family: var(--ar-mono); font-size: 11px; letter-spacing: -0.02em; white-space: nowrap; cursor: help; font-variant-numeric: tabular-nums; }

.ar-log__empty, .ar-log__error {
  padding: 28px 0; color: var(--ar-ink-soft); font-size: 13px; text-align: center;
}
.ar-log__error { color: var(--ar-bad); text-align: left; }

.ar-log__foot {
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  flex-wrap: wrap; margin-top: 16px;
}
.ar-log__count { margin: 0; font-size: 13px; color: var(--ar-ink-soft); }
.ar-log__pager { display: flex; gap: 10px; }
.ar-log__pager .ar-btn { padding: 9px 18px; }

/* The rule spans the card; only the prose is measured. `max-width` on the <p> itself would
   shorten the border with it, leaving it stopping short of the right edge. */
.ar-log__note {
  margin: 14px 0 0; padding-top: 14px; border-top: 1px solid var(--ar-line);
  font-size: 12px; line-height: 1.6; color: var(--ar-ink-faint);
}
.ar-log__note > span { display: block; max-width: 90ch; }

/* Seven controls stop being readable well before the phone breakpoint — let them wrap
   into rows as soon as each would be squeezed under ~120px. */
@media (max-width: 1200px) {
  .ar-log__row { flex-wrap: wrap; gap: 12px 14px; }
  .ar-log__field { flex: 1 1 150px; }
  .ar-log__field--ua { flex: 1 1 220px; }
}
@media (max-width: 782px) {
  .ar-log__field, .ar-log__field--ua { flex: 1 1 100%; }
  .ar-log__field--date { width: 100%; }
  /* Matches the specificity of the wide-screen `.ar-aitraffic` date rule —
     without this, its 150px flex-basis beats the width above (basis outranks
     width on a flex item) and the date boxes stay narrow on phones. */
  .ar-aitraffic .ar-log__field--date { flex: 1 1 100%; }
  .ar-log__actions .ar-btn { flex: 1 1 auto; }
}

/* Phones: the SETTINGS group strip scrolls sideways with natural-width tabs —
   six labels can't share one phone row without crushing into clipped fragments
   ("ATA SOURCE"). Scrollbar hidden; the half-visible neighbour tab is the
   scroll affordance. Scoped to the --scroll modifier: written bare, this rule
   also caught the Visibility strip's THREE tabs and broke their full-width
   thirds — the row sat left-hugged over dead space (his iPhone screenshot).
   A short strip keeps the default: equal thirds, never scrolls. */
@media (max-width: 782px) {
  .ar-tabpanel__tabs--scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: none; }
  .ar-tabpanel__tabs--scroll::-webkit-scrollbar { display: none; }
  .ar-tabpanel__tabs--scroll .ar-subnav__item { flex: 0 0 auto; white-space: nowrap; }
}

/* iOS Safari auto-links emails/phones it detects inside the UA boxes (the
   underlined searchbot@… on iPhone). A UA is text, and the box is click-to-copy
   — neutralise the injected anchors so they read and behave as plain text. */
.ar-act-feed__ua a,
.ar-act-feed__ua a[x-apple-data-detectors] {
  color: inherit !important;
  text-decoration: none !important;
  pointer-events: none;
}

/* ---- "More" nav menu -----------------------------------------------------
   Holds the occasional screens (Request log, AI Visibility, About). A sibling of
   .ar__tabs rather than a child, because that nav is an overflow-x scroller and
   would clip this menu. */
.ar__more { flex: 0 0 auto; position: relative; display: flex; align-items: stretch; }
.ar__more-btn { gap: 6px; }
.ar__more-caret { display: inline-flex; align-items: center; transition: transform 0.15s; }
.ar__more.is-open .ar__more-caret { transform: rotate(180deg); }

/* The panel floats ABOVE the bar, so it sits on --ar-surface (the lightest paper), not on
   --ar-paper — which is the page background and made the menu read as a sunken box rather
   than a sheet lifted off the page. Two shadows: a tight contact edge, and a long soft cast. */
.ar__more-menu {
  /* `left` is set inline by positionMore(), which slides the panel inward when the trigger
     sits near the window edge. The value here is only the pre-measurement default. */
  position: absolute; top: calc(100% + 5px); left: -6px; z-index: 30;
  min-width: 208px; max-width: calc(100vw - 24px); padding: 5px;
  display: flex; flex-direction: column;
  background: var(--ar-surface);
  border: 1px solid var(--ar-line-strong);
  /* One step up from --ar-radius (4px): a lifted sheet is softer than a flush card. */
  border-radius: 7px;
  box-shadow: 0 1px 2px color-mix(in srgb, var(--ar-shade) 5%, transparent), 0 18px 36px -20px color-mix(in srgb, var(--ar-shade) 50%, transparent);
  animation: ar-more-in 0.13s cubic-bezier(0.22, 1, 0.36, 1);
  transform-origin: top left;
}
@keyframes ar-more-in {
  from { opacity: 0; transform: translateY(-4px); }
  to   { opacity: 1; transform: none; }
}
@media (prefers-reduced-motion: reduce) { .ar__more-menu { animation: none; } }

/* Sentence-case SANS, not the bar's mono eyebrow. Uppercase mono gives every row the same
   rectangular silhouette, so a stacked column of them has no word-shape to scan and reads
   as a pile of tags. In this design system sans is what a human reads; mono-uppercase is
   metadata. A destination name is the former. */
.ar__more-item {
  appearance: none; background: none; border: 0; cursor: pointer;
  /* Third column carries the unread badge. `auto` collapses to nothing on the items that
     don't have one, so the existing rows are untouched. */
  display: grid; grid-template-columns: 16px minmax(0, 1fr) auto; align-items: center;
  column-gap: 10px; width: 100%;
  text-align: left; white-space: nowrap;
  padding: 8px 10px; border-radius: var(--ar-radius);
  font-family: var(--ar-sans); font-size: 13.5px; font-weight: 500; letter-spacing: 0;
  text-transform: none; line-height: 1.25;
  color: var(--ar-ink-soft);
  transition: background-color 0.12s ease, color 0.12s ease;
}
@media (prefers-reduced-motion: reduce) { .ar__more-item { transition: none; } }
.ar__more-icon { grid-column: 1; color: var(--ar-ink-faint); transition: color 0.12s ease; }
.ar__more-item-label { grid-column: 2; }

.ar__more-item:hover:not(:disabled) { background: var(--ar-surface-2); color: var(--ar-ink); }
.ar__more-item:hover:not(:disabled) .ar__more-icon { color: var(--ar-ink-soft); }
.ar__more-item:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: -2px; }

/* The screen you're on. A wash of the accent at 8% plus an accent icon — no inset rail,
   which is the tab bar's idiom and the very thing that made this feel like tabs. */
.ar__more-item.is-active { background: color-mix(in srgb, var(--ar-accent) 8%, transparent); color: var(--ar-ink); }
.ar__more-item.is-active .ar__more-icon { color: var(--ar-accent); }

/* Listed but unreachable: the feature exists, it's just switched off. Greying it out
   teaches where the feature lives; hiding it leaves a hole nobody discovers. */
.ar__more-item.is-disabled { cursor: default; color: var(--ar-ink-faint); }
.ar__more-item.is-disabled .ar__more-icon { opacity: 0.55; }
.ar__more-item-note {
  grid-column: 2; margin-top: 2px;
  font-family: var(--ar-sans); font-size: 11px; font-weight: 400; letter-spacing: 0;
  color: var(--ar-ink-faint);
}

/* About is reference material, not a working screen. Full-bleed through the panel padding:
   an inset rule reads as decoration, a rule that touches both walls reads as a division. */
.ar__more-sep { height: 1px; margin: 5px -5px; background: var(--ar-line); }

/* On a narrow admin the bar gets tight: shrink the gap before anything scrolls. */
@media (max-width: 960px) {
  .ar__bar { gap: 16px; }
  .ar__tabs { gap: 16px; }
}

/* A feature named for the screen it unlocks, with the literal mechanism in a quieter
   aside beside it: "AI Visibility (Track AI citations)". */
.ar-toggle__sub {
  margin-left: 7px;
  font-weight: 400; font-size: 11px;
  color: var(--ar-ink-faint);
}

/* The Visit-log retention note: says what the Dashboard shows vs what the log keeps, and
   which data this setting deliberately does NOT govern (flagged IPs). Full-width and
   lightly tinted — it states the rule that outranks the controls above it, so it gets
   a touch more presence than a plain footnote. */
.ar-log-note {
  margin: 18px 0 0; padding: 12px 16px;
  background: color-mix(in srgb, var(--ar-accent) 6%, var(--ar-surface));
  border-left: 3px solid var(--ar-accent);
  border-radius: 0 var(--ar-radius) var(--ar-radius) 0;
  font-size: 12px; line-height: 1.65; color: var(--ar-ink-soft);
}
.ar-log-note strong { color: var(--ar-ink); font-weight: 600; }
/* The two dropdowns sit in .ar-field--inline rows; give the control a sane width so the
   "50,000 rows · ≈ 14–33 MB" label isn't crushed. */
.ar-field--inline .ar-select { flex: 0 1 320px; min-width: 0; }
/* "Keep records for" is twice the width of "Size cap", so without a reserved label column
   the two dropdowns start at different x. Fixed basis, no shrink: one column, aligned. */
.ar-field--log > label { flex: 0 0 132px; }
/* The weekly email's day+hour row: two dropdowns joined by "at". Each label+dropdown
   pair is one unbreakable flex unit (nowrap labels — "SEND IT EVERY" must never fold
   mid-phrase), so a mid-width screen wraps BETWEEN the pairs; under the admin's 782px
   mobile breakpoint each pair takes its own full line and the control stretches.
   Two-class selector on purpose: the row leads .ar-webmcp-tools, and the
   `.ar-field:first-child` margin reset would zero a single-class margin-top —
   without it the wrapper's border-top sat flush against the controls. */
.ar-field--inline.ar-field--digest { flex-wrap: wrap; margin-top: 16px; }
.ar-digest-slot { display: inline-flex; align-items: center; gap: 12px; min-width: 0; }
.ar-digest-slot > label { white-space: nowrap; }
.ar-field--digest .ar-select { flex: 0 1 180px; min-width: 140px; }
@media (max-width: 782px) {
  .ar-digest-slot { flex: 1 1 100%; }
  /* Reserved label column (the .ar-field--log trick): "SEND IT EVERY" and "AT"
     occupy the same width, so the two dropdowns align and match exactly. */
  .ar-digest-slot > label { flex: 0 0 108px; }
  .ar-field--digest .ar-select { flex: 1 1 auto; }
}

/* ---------------------------------------------------------------------------
   Agent access — who authenticated to, and ACTED on, the machine surface.

   The screen's design problem is the opposite of most: its resting state is EMPTY,
   and an empty table quietly reads as "all clear". So the state box and the limits
   footer are not decoration around the data — on most sites they ARE the content,
   and they are styled to be read, not skimmed past.
   --------------------------------------------------------------------------- */

/* Unread count, on the More menu's Agent access row. Matches the review bell's badge. */
.ar__more-item-badge {
  grid-column: 3;
  font-family: var(--ar-mono); font-size: 10px; font-weight: 700; line-height: 1;
  min-width: 16px; height: 16px; padding: 0 4px; border-radius: 999px;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--ar-bad); color: var(--ar-paper);
}

/* A dot on the "More" trigger itself: enough to say "something in here is unread"
   from any screen, without putting a number on a button that aggregates several. */
.ar__more-dot {
  width: 6px; height: 6px; border-radius: 999px;
  background: var(--ar-bad);
  display: inline-block; margin-left: 5px; vertical-align: middle;
}

/* The head sits directly above the coverage box / table now that the lead moved
   to the page header — give it the same 16px rhythm the state box carries below. */
.ar-aa .ar-card__head { margin-bottom: 16px; }
.ar-aa__error { color: var(--ar-bad); font-size: 13px; margin: 0 0 12px; }

/* The coverage box: what we can and cannot see on THIS site. */
.ar-aa__state {
  display: flex; gap: 12px; align-items: flex-start;
  padding: 14px 16px; margin: 0 0 16px;
  border: 1px solid var(--ar-line); border-left-width: 3px;
  border-radius: var(--ar-radius);
  background: var(--ar-surface-2);
}
.ar-aa__state--ok   { border-left-color: var(--ar-good); }
.ar-aa__state--warn { border-left-color: var(--ar-warn); }
.ar-aa__state--info { border-left-color: var(--ar-info); }

.ar-aa__badge {
  flex: 0 0 auto;
  font-family: var(--ar-mono); font-size: 10px; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.06em;
  padding: 3px 7px; border-radius: 999px;
  background: var(--ar-surface); border: 1px solid var(--ar-line-strong);
  color: var(--ar-ink-soft); white-space: nowrap;
}
.ar-aa__statebody { min-width: 0; }
/* The headline facts under the coverage sentence: quiet, mono, one line where
   there's room. The separator is drawn in CSS rather than typed between the
   values, so a narrow screen can stack whole facts instead of wrapping one in
   half — "last activity" and "3 days ago" must never land on separate lines. */
.ar-aa__facts { margin: 6px 0 0; display: flex; flex-wrap: wrap; gap: 2px 8px; font-family: var(--ar-mono); font-size: 11.5px; letter-spacing: -0.02em; color: var(--ar-ink-soft); }
.ar-aa__facts strong { color: var(--ar-ink); font-weight: 600; }
.ar-aa__fact { white-space: nowrap; }
.ar-aa__fact:not(:last-child)::after { content: '·'; margin-left: 8px; color: var(--ar-ink-faint); }
@media (max-width: 782px) {
  /* Stacked: one fact per line, no dangling separators. */
  .ar-aa__facts { flex-direction: column; gap: 3px; }
  .ar-aa__fact:not(:last-child)::after { content: none; }
}
.ar-aa__statebody p { margin: 4px 0 0; font-size: 13px; line-height: 1.55; color: var(--ar-ink-soft); }
.ar-aa__statetitle { margin: 0; font-family: var(--ar-sans); font-size: 14px; font-weight: 600; color: var(--ar-ink); }
/* The actionable line — the point of showing an unavailable state at all. */
.ar-aa__action { font-weight: 600; color: var(--ar-ink) !important; }

/* On a phone the four columns exceed the card: scroll the table inside its own box
   rather than letting it widen (or get clipped by) the page — columns stay reachable. */

/* The access log wears the Request Log's table dress (.ar-act-table on the same
   element), so the two logs read and behave as one family — same header band, same
   cell rhythm, same sideways scroll on narrow screens instead of crushed columns.
   Only the honest differences live below: the "What happened" column wraps its
   sentences (with a floor so the wrapper scrolls rather than the column collapsing),
   and multi-line rows align to the top. */
.ar-aa__table { width: 100%; border-collapse: collapse; margin: 0; }
/* Rows breathe: a security record read once a week is not a spreadsheet, and
   9px of vertical padding made five facts feel like one block. 16px each side —
   the critique suggested 24, which on an 80-row log is a lot of scrolling for
   air. */
.ar-aa__table td { font-size: 13px; color: var(--ar-ink-soft); border-bottom: 1px solid var(--ar-line); vertical-align: top; padding-top: 16px; padding-bottom: 16px; }
/* The count earns a shape rather than a sentence — same beige, no new colour. */
.ar-aa__uses {
  display: inline-block; font-family: var(--ar-mono); font-size: 11px;
  letter-spacing: -0.02em; color: var(--ar-ink-soft);
  background: var(--ar-surface-2); padding: 2px 8px; border-radius: 999px; white-space: nowrap;
}
.ar-aa__table td:first-child { white-space: normal; min-width: 260px; }
/* The third line, folded into a marker on the who line: same words, one hover
   away, and every row is two lines tall whatever the event. */
.ar-aa__noteicon {
  display: inline-flex; align-items: center; justify-content: center;
  flex: 0 0 auto; width: 15px; height: 15px; margin-right: 6px; padding: 0; border-radius: 50%;
  border: 1px solid var(--ar-line-strong); background: transparent; cursor: help;
  font-family: var(--ar-mono); font-size: 10px; line-height: 1; color: var(--ar-ink-soft);
  vertical-align: -2px;
}
.ar-aa__noteicon:hover, .ar-aa__noteicon:focus-visible { border-color: var(--ar-accent); color: var(--ar-accent); }
/* The one advisory that is a warning, not a note, keeps its weight. */
.ar-aa__noteicon.is-warn { border-color: color-mix(in srgb, var(--ar-warn) 55%, var(--ar-line)); color: var(--ar-warn); }
/* Unlike the Request Log, a footer sentence follows this table — keep the last row's
   rule so the table visibly ends before it. */
.ar-aa__table tbody tr:last-child td { border-bottom: 1px solid var(--ar-line); }
.ar-aa__table tr.is-unseen td { background: color-mix(in srgb, var(--ar-accent) 4.5%, transparent); }
/* Two lines, two jobs: the kind is a quiet label that repeats down the table,
   the subject is the part that varies and carries the weight. */
/* Typographically identical to the timestamp columns — same face, same 11px,
   same -0.02em tracking, same faint tone and normal weight. Only the uppercase
   remains, because that is what makes it read as a label rather than a value. */
/* LEVEL 3 — the kind, now a subtitle under the name it describes. The name is
   what varies and what you scan for; the kind repeats down the table, so it sits
   below and quieter. */
.ar-aa__kindline {
  display: block; margin-top: 2px; font-family: var(--ar-mono); font-size: 10.5px;
  letter-spacing: 0.02em; text-transform: uppercase;
  color: var(--ar-ink-faint); font-weight: 400;
}
/* ONE face for both kinds of subject — that is what fixes the mismatched
   weights (mono sits lighter than the prose face, so "the same" weight wasn't).
   No chip: in the request log those boxes are one column among five and read as
   secondary, but here the subject IS the row, and boxing every one makes the
   column read boxy while adding height for nothing. The label line above already
   says whether it names an ability or a key. */
/* LEVEL 1 — the hero. The one thing on the row that is unique to it. */
.ar-aa__what {
  display: flex; align-items: center; gap: 7px;
  font-family: var(--ar-mono); font-size: 14px; letter-spacing: -0.01em;
  font-weight: 500; color: var(--ar-ink-soft);
  overflow-wrap: anywhere; cursor: help;
}
/* A key or a spark ahead of the name: the row's family is recognisable before a
   word is read, and hovering says what the name IS and where to act on it —
   "verify-tax" alone tells an admin nothing. */
.ar-aa__whaticon { flex: 0 0 auto; color: var(--ar-ink-faint); }
.ar-aa__what:hover .ar-aa__whaticon { color: var(--ar-accent); }

/* WHO did it — quieter than the hint sentences, but always present when known. */
/* WHO has its own column now, so the row is a single line. Never truncated —
   hiding "app password (since revoked)" hides the part that matters; if a value
   is genuinely long the table scrolls, which at least keeps it readable. */
/* Marker and person on one line; the credential drops beneath. */
.ar-aa__whotop { display: flex; align-items: center; gap: 0; }
/* LEVEL 2 — metadata. */
.ar-aa__who { font-size: 12.5px; color: var(--ar-ink-soft); }
/* What the request came in WITH — the quieter half of "who", on its own line so
   the eye doesn't have to find a middot to know where the second fact starts.
   Mono, like every other machine-side value in these tables. */
.ar-aa__cred {
  display: block; margin-top: 2px; font-family: var(--ar-mono); font-size: 11px;
  letter-spacing: -0.02em; color: var(--ar-ink-faint);
}
.ar-aa__who--none { opacity: 0.6; }
.ar-aa__whocol { white-space: nowrap; }
/* Timestamps right-align, header included — a column of dates reads as a column
   when its edges line up. Scoped through .ar-act-table so it out-specifies that
   table's blanket `text-align: left` (the reason a bare .ar-aa__seencol rule did
   nothing), exactly how the request log pins its own last column.
   Same mono face, size and tone as the log's "Requested at", so a timestamp
   looks the same wherever it appears. */
/* Fixed width, in ch of the mono face, so both date columns are the SAME width
   and neither reflows when "9:39 pm" becomes "10:33 pm". tabular-nums keeps the
   digits themselves on a common grid, so the values line up down the column
   rather than shimmering row to row. */
/* 22ch is the width of a full "July 15, 2026 10:33 pm" in this face — wide
   enough that the two columns stay identical and never reflow, tight enough
   that right-aligning doesn't park a column of dead space between them (24ch
   left ~3 characters of slack on each, which read as a gap). */
.ar-act-table th.ar-aa__seencol, .ar-act-table td.ar-aa__seencol {
  text-align: right; white-space: nowrap; width: 22ch; min-width: 22ch;
  padding-right: 8px; font-variant-numeric: tabular-nums;
}
.ar-act-table td.ar-aa__seencol { color: var(--ar-ink-faint); font-family: var(--ar-mono); font-size: 11px; letter-spacing: -0.02em; }
.ar-act-table th.ar-aa__seencol:last-child, .ar-act-table td.ar-aa__seencol:last-child { padding-right: 10px; }

/* The sentence the whole feature exists to deliver: an application password keeps working
   after a password change, so an unrecognised one has to be revoked, not just noted. */
.ar-aa__hint {
  display: block; margin-top: 4px;
  font-size: 12px; line-height: 1.5; color: var(--ar-ink-faint);
}

/* "Nothing yet" — deliberately NOT a cheerful all-clear. */
.ar-aa__empty {
  padding: 22px 18px; margin: 0 0 16px;
  border: 1px dashed var(--ar-line-strong); border-radius: var(--ar-radius);
  text-align: center;
}
.ar-aa__empty h3 { margin: 0 0 6px; font-family: var(--ar-sans); font-size: 15px; font-weight: 600; color: var(--ar-ink); }
.ar-aa__empty p { margin: 0 auto; max-width: 62ch; font-size: 13px; line-height: 1.6; color: var(--ar-ink-soft); }

/* Standing blind spots, always on screen. Same job as the request log's footer note. */
/* Styled as the app's quiet aside (left bar + tint), NOT as a hairline-topped block —
   a gray paragraph opening with a hairline reads as one more table row. */
.ar-aa__limits {
  margin: 4px 0 0; padding: 10px 14px;
  border-left: 2px solid var(--ar-line-strong);
  border-radius: 0 var(--ar-radius) var(--ar-radius) 0;
  background: var(--ar-surface-2);
  font-size: 12px; line-height: 1.6; color: var(--ar-ink-faint);
}
.ar-aa__limits strong { color: var(--ar-ink-soft); }

/* "New" on a row the owner has not read. The nav badge sends them here asking "which one?" —
   a faint row tint alone is too easy to lose on a long list, so the answer is spelled out. */
/* ⚠️ A FLEX ITEM, not an inline badge — .ar-aa__what is display:flex, so this
   shrinks like any other item, and that parent's `overflow-wrap: anywhere`
   (there so a long ability name can break) then breaks the single word NEW
   into "NE / W". Seen on agentimus/read-search-opportunities, 2026-08-18.
   ⭐ The icon on the other side already carries `flex: 0 0 auto`; the fix is
   the same one, applied to the child that was missed. `nowrap` states the
   intent on its own, so a future layout change cannot re-break the word. */
.ar-aa__new {
  display: inline-block; flex: 0 0 auto; white-space: nowrap; vertical-align: 1px;
  font-family: var(--ar-mono); font-size: 9px; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.06em;
  padding: 2px 5px; border-radius: 999px;
  background: var(--ar-bad); color: var(--ar-paper);
}

/* What the VIEW is holding back — distinct from the standing blind spots in .ar-aa__limits.
   A list that stops at 100 without saying so reads as "that's everything". */
.ar-aa__more {
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  flex-wrap: wrap; margin: 0 0 16px;
}
.ar-aa__count {
  margin: 0; flex: 1 1 auto; min-width: 0;
  font-size: 12px; line-height: 1.6; color: var(--ar-ink-faint);
}
.ar-aa__count strong { color: var(--ar-ink-soft); font-weight: 600; }

/* Newer / Older — same cursor walk as the request log's pager, so the two log screens read as
   one control rather than two inventions. */
.ar-aa__pager { display: flex; gap: 8px; flex: 0 0 auto; }

/* "Not published" on a Discovery Hub row. The row is listed either way — the owner must be able
   to see (and reverse) what their site holds back — but listing it without a caveat would read
   as "this is live". */
.ar-wd-held {
  font-family: var(--ar-mono); font-size: 10px; font-weight: 600; letter-spacing: 0.04em;
  padding: 2px 7px; border-radius: 999px;
  background: var(--ar-surface-2); border: 1px solid var(--ar-line-strong);
  color: var(--ar-ink-faint); white-space: nowrap;
}
.ar-wd-prov__held {
  margin: 6px 0 0; padding: 8px 10px;
  border-left: 2px solid var(--ar-line-strong); border-radius: 0 var(--ar-radius) var(--ar-radius) 0;
  background: var(--ar-surface-2);
  font-size: 12px; line-height: 1.6; color: var(--ar-ink-faint);
}

/* A refusal or a probe: the first rows here that might mean someone is trying it on. A warn tone,
   never the word "attack" — we cannot know that, and the hit count is the honest signal. */
.ar-aa__table tr.is-refusal td { border-left: 2px solid var(--ar-warn); }
.ar-aa__table tr.is-refusal td:not(:first-child) { border-left: 0; }
.ar-aa__hint--warn { color: var(--ar-ink-soft); font-weight: 500; }

/* The default-share-image picker (Search basics): thumbnail beside its buttons.
   The thumb is a fixed square so a portrait pick can't stretch the row. */
.ar-media-pick { display: flex; align-items: center; gap: 10px; margin: 6px 0 4px; }
.ar-media-pick__thumb { width: 48px; height: 48px; object-fit: cover; border-radius: 6px; border: 1px solid var(--ar-line); }


/* ---- Agent Access: the event feed ----------------------------------------
   Cards, not table rows. These events are heterogeneous — an ability run, a key
   created, a probe turned away — and each is read on its own rather than
   compared down a column, which is the one job a table does better. Every fact
   still holds a fixed position inside the card, so the eye lands in the same
   place on every row. Same palette throughout: one beige, one ink, no new hues. */
/* Wide screens: a real table — the thead names each column once, and every row
   keeps the card's inner pieces (the disc, the eyebrow, the pill, the mono
   stamps), so nothing of the design is lost, only the repetition. */
.ar-aa__table { width: 100%; border-collapse: collapse; margin: 14px 0 16px; }
.ar-aa__thead th {
  text-align: left; font-family: var(--ar-mono); font-size: 10.5px; font-weight: 500;
  letter-spacing: 0.08em; text-transform: uppercase; color: var(--ar-ink-soft);
  padding: 0 14px 9px 0; border-bottom: 1px solid var(--ar-line-strong);
}
.ar-aa__card > td { padding: 13px 14px 13px 0; border-bottom: 1px solid var(--ar-line); vertical-align: middle; }
.ar-aa__card.is-unseen > td { background: color-mix(in srgb, var(--ar-accent) 4.5%, var(--ar-surface)); }
.ar-aa__card.is-refusal > td:first-child { box-shadow: inset 2px 0 0 var(--ar-warn); }
/* The disc and the two text lines travel together as one grid, so the 40px
   icon column survives the move into a table cell — and, below, into a card. */
.ar-aa__evwrap { display: grid; grid-template-columns: 40px minmax(0, 1fr); gap: 14px; align-items: center; }
/* The kind's glyph in a soft disc — recognisable before a word is read. */
.ar-aa__mark {
  display: inline-flex; align-items: center; justify-content: center;
  width: 34px; height: 34px; border-radius: 50%;
  background: var(--ar-surface-2); color: var(--ar-ink-soft);
}
.ar-aa__ev { min-width: 0; }
.ar-aa__whoblk { min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.ar-aa__usesblk { display: flex; justify-content: flex-start; }
/* The kind line's card-mode count (" – 2 times") — wide table hides it. */
.ar-aa__kinduses { display: none; }
.ar-aa__seenblk { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
/* On the wide table the thead already says "First seen" — the in-row label
   only returns on small screens, where the thead is gone. */
.ar-aa__seenlab { display: none; font-size: 11px; color: var(--ar-ink-soft); }
.ar-aa__seenval {
  display: flex; align-items: center; gap: 6px;
  font-family: var(--ar-mono); font-size: 11px; letter-spacing: -0.02em;
  color: var(--ar-ink); font-variant-numeric: tabular-nums; white-space: nowrap;
}
.ar-aa__lineicon { flex: 0 0 auto; color: var(--ar-ink-faint); }
/* Phones and narrow admin columns: the rows re-stack as slim cards — the
   original anatomy he preferred over the seamed-slots family: disc + kind line
   (carrying the use count: "ABILITY USED – 2 TIMES") over the subject, the
   who/via lines and the two aligned seen-rows indented to the text column. */
@media (max-width: 1100px) {
  .ar-aa__table, .ar-aa__card, .ar-aa__card > td { display: block; }
  .ar-aa__thead { display: none; }
  .ar-aa__table tbody { display: flex; flex-direction: column; gap: 8px; }
  .ar-aa__card {
    padding: 14px 16px; border: 1px solid var(--ar-line); border-radius: var(--ar-radius);
    background: var(--ar-surface);
  }
  .ar-aa__card > td { padding: 0; border: 0; background: none; min-width: 0; }
  .ar-aa__card.is-unseen { background: color-mix(in srgb, var(--ar-accent) 4.5%, var(--ar-surface)); }
  /* The card carries the unseen tint; the cells must not repeat it as patches —
     match the table-scoped base selectors' weight to silence them. */
  .ar-aa__card.is-unseen > td, .ar-aa__table tr.is-unseen td { background: none; }
  .ar-aa__table tbody tr:last-child td { border-bottom: 0; }
  .ar-aa__card.is-refusal { border-left: 2px solid var(--ar-warn); }
  .ar-aa__card.is-refusal > td:first-child { box-shadow: none; }
  .ar-aa__card.is-refusal .ar-aa__kindline { color: var(--ar-warn); }
  /* The count lives in the kind line up here; the Uses column is wide-table only. */
  .ar-aa__card > td.ar-aa__cell--uses { display: none; }
  .ar-aa__kinduses { display: inline; }
  /* Everything under the title indents to the text column, in one even rhythm. */
  .ar-aa__cell--who, .ar-aa__cell--seen { margin: 8px 0 0 54px; }
  .ar-aa__cell--seen + .ar-aa__cell--seen { margin-top: 6px; }
  /* The two seen-rows read as a pair: fixed-width labels land both dates on
     one vertical line. The dates speak the family's date voice — small mono,
     soft ink — instead of full-ink shouting. */
  .ar-aa__seenlab { display: inline-block; flex: 0 0 auto; width: 60px; }
  .ar-aa__seenblk { flex-direction: row; align-items: baseline; gap: 8px; }
  .ar-aa__seenval { color: var(--ar-ink-soft); }
}

/* ---------------------------------------------------------------------------
   Today — the front door.

   The whole screen is one card holding one list, because the point of it is
   that there IS only one list. Rank is carried by order alone; the only visual
   weight is the severity mark, so nothing shouts over the sentence next to it.
   --------------------------------------------------------------------------- */
.ar-today__card { padding: 0; overflow: hidden; }

.ar-today__head {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: 22px; flex-wrap: wrap;
  padding: 24px 26px 20px; border-bottom: 1px solid var(--ar-line);
}
.ar-today__headings { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.ar-today__title { font-family: var(--ar-serif); font-size: 24px; font-weight: 600; margin: 0; color: var(--ar-ink); }
.ar-today__sub { margin: 0; font-size: 13px; color: var(--ar-ink-soft); max-width: 62ch; }
.ar-today__meta { display: flex; align-items: center; gap: 16px; }
/* Deliberately quiet: the score answers "is my setup right", which is not the
   question this screen exists to answer. It stays available, never dominant. */
.ar-today__score { text-align: right; white-space: nowrap; }
.ar-today__score-n { display: block; font-family: var(--ar-mono); font-size: 15px; font-weight: 600; color: var(--ar-good); font-variant-numeric: tabular-nums; }
.ar-today__score-l { display: block; font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ar-ink-faint); }
.ar-today__refresh { font-size: 12px; }

.ar-today__list { list-style: none; margin: 0; padding: 0; }
.ar-today__row {
  display: grid; grid-template-columns: 18px minmax(0, 1fr) auto;
  gap: 14px; align-items: start;
  padding: 16px 26px; border-bottom: 1px solid var(--ar-line);
}
.ar-today__row:last-child { border-bottom: 0; }
.ar-today__mark { font-size: 13px; line-height: 1.7; }
.ar-today__row.is-urgent .ar-today__mark { color: var(--ar-bad); }
.ar-today__row.is-worth .ar-today__mark { color: var(--ar-warn); }
.ar-today__row.is-later .ar-today__mark { color: var(--ar-ink-faint); }
/* Waiting is not work, and must not wear a working colour. The half-filled mark
   in the faint ink reads as "under way, not by you" — the same weight as an
   optional row, because neither is asking for anything today. */
.ar-today__row.is-waiting .ar-today__mark { color: var(--ar-ink-faint); }
.ar-today__row.is-waiting .ar-today__row-title { color: var(--ar-ink-soft); font-weight: 500; }
.ar-today__main { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.ar-today__row-title { margin: 0; font-size: 14.5px; font-weight: 600; color: var(--ar-ink); }
.ar-today__why { margin: 0; font-size: 12.5px; line-height: 1.55; color: var(--ar-ink-soft); max-width: 68ch; }
.ar-today__ev { margin: 3px 0 0; display: flex; flex-wrap: wrap; gap: 6px; }
.ar-today__chip {
  font-family: var(--ar-mono); font-size: 10.5px; color: var(--ar-ink-soft);
  background: var(--ar-surface-2); border: 1px solid var(--ar-line);
  border-radius: 3px; padding: 1px 7px; font-variant-numeric: tabular-nums;
}
.ar-today__act { display: flex; align-items: flex-start; }
.ar-today__act .ar-btn { white-space: nowrap; }

/* The fence. Optional work must never share a run of rows with urgent work —
   that mixing is what makes a long list stop being read at all. */
.ar-today__divider {
  margin: 0; padding: 9px 26px;
  background: var(--ar-surface-2); border-bottom: 1px solid var(--ar-line);
  font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.09em;
  text-transform: uppercase; color: var(--ar-ink-faint);
}

/* The win. Above the work, in the good colour, and gone within the week — it is
   news, and news that stays becomes furniture. Sits inside the card's own top
   rule so it reads as part of the list rather than a banner over it. */
.ar-today__won {
  display: flex; gap: 9px; align-items: baseline; margin: 0;
  padding: 13px 26px; border-bottom: 1px solid var(--ar-line);
  background: color-mix(in srgb, var(--ar-good) 7%, transparent);
  font-size: 13px; color: var(--ar-ink);
}
.ar-today__won-mark { color: var(--ar-good); font-size: 12px; flex: none; }
.ar-today__won-main { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
/* The way out, kept quiet and last: a win should not arrive wearing a button
   that competes with the work below it. */
.ar-today__won-seen { margin-left: auto; flex: none; align-self: flex-start; font-size: 12px; }

/* Stated, not implied: with nothing open the screen must read as "checked". */
.ar-today__clear {
  display: flex; gap: 9px; align-items: baseline; margin: 0;
  padding: 14px 26px; border-top: 1px solid var(--ar-line);
  background: color-mix(in srgb, var(--ar-good) 7%, transparent);
  font-size: 12.5px; color: var(--ar-ink-soft);
}
.ar-today__clear-mark { color: var(--ar-good); font-size: 12px; }
.ar-today__clear .ar-linkbtn { margin-left: 7px; font-size: 12px; }

.ar-today__failed {
  margin: 0; padding: 12px 26px; border-top: 1px solid var(--ar-line);
  font-size: 12px; color: var(--ar-ink-faint);
}

@media (max-width: 782px) {
  .ar-today__head { padding: 20px 18px 16px; }
  .ar-today__row { grid-template-columns: 18px minmax(0, 1fr); padding: 14px 18px; }
  .ar-today__act { grid-column: 2; }
  .ar-today__divider, .ar-today__clear, .ar-today__failed { padding-left: 18px; padding-right: 18px; }
  .ar-today__won { padding-left: 18px; padding-right: 18px; }
}

/* One button width for the whole column. The labels differ in length ("Review
   them" vs "Open the worklist") and a ragged right edge down a list of five
   reads as five unrelated controls rather than one repeated affordance. The
   width is set by the longest label so nothing ever truncates. */
.ar-today__act { min-width: 196px; justify-content: flex-end; }
.ar-today__act .ar-btn { min-width: 196px; justify-content: center; text-align: center; }
@media (max-width: 782px) {
  /* Stacked under the text, the column no longer has a shared edge to align to,
     so the shared width would only push the button off the card. */
  .ar-today__act, .ar-today__act .ar-btn { min-width: 0; }
}

/* ---------------------------------------------------------------------------
   Your content — Today's second card.

   Three columns on desktop (the thing · what it's for · what to do), stacking
   on narrow. The coverage verdict carries a mark AND a word: colour alone is
   not a verdict anyone can read aloud, and the sentence under it is what makes
   the judgement checkable rather than a grade.
   --------------------------------------------------------------------------- */
.ar-work { padding: 0; overflow: hidden; margin-top: 18px; }

.ar-work__head {
  display: flex; align-items: flex-start; justify-content: space-between; gap: 20px;
  padding: 22px 26px 18px; border-bottom: 1px solid var(--ar-line); flex-wrap: wrap;
}
.ar-work__title { font-family: var(--ar-serif); font-size: 21px; font-weight: 600; margin: 0 0 4px; color: var(--ar-ink); }
.ar-work__sub { margin: 0; font-size: 13px; color: var(--ar-ink-soft); max-width: 66ch; }

/* "Check again" and the scope gear, as one group. flex:0 0 auto so the pair is
   never the thing that shrinks when the heading wraps. */
.ar-work__actions { display: flex; align-items: center; gap: 2px; flex: 0 0 auto; }
/* Icon button — the same conventions as .ar-modal__fade-btn (28px, faint ink
   lifting on hover, accent focus ring), so every round icon control in the app
   behaves identically. */
.ar-iconbtn {
  appearance: none; cursor: pointer; display: flex; align-items: center; justify-content: center;
  width: 28px; height: 28px; padding: 0; margin: 0; border: 0; border-radius: 999px;
  background: transparent; color: var(--ar-ink-faint);
  transition: color 0.15s ease, background 0.15s ease;
}
.ar-iconbtn:hover:not(:disabled) { color: var(--ar-ink); background: var(--ar-surface-2); }
.ar-iconbtn:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; }
.ar-iconbtn:disabled { opacity: 0.5; cursor: default; }

/* The scope line STATES what is being checked; the gear changes it. Deliberately
   not a link: the one thing an owner comes to this card to press is "Check
   again", and a second action beside it competed with that. */
.ar-scope {
  display: flex; align-items: baseline; gap: 6px; flex-wrap: wrap;
  margin: 0; padding: 10px 26px; border-bottom: 1px solid var(--ar-line);
  background: var(--ar-surface-2); font-size: 12.5px; color: var(--ar-ink-soft);
}
.ar-scope__k {
  font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--ar-ink-faint);
}
.ar-scope__v { color: var(--ar-ink); font-weight: 600; }
.ar-scope__n { font-family: var(--ar-mono); font-variant-numeric: tabular-nums; color: var(--ar-ink-faint); }
/* Nothing selected. Amber, not red: the owner chose this, it is not a fault —
   but it is the reason the card below is empty, so it has to carry more weight
   than the ordinary state does. */
.ar-scope.is-off { background: var(--ar-warn-wash); border-bottom-color: var(--ar-warn-tint); }
.ar-scope.is-off .ar-scope__v { color: var(--ar-warn-deep); }

.ar-work__idle { padding: 22px 26px 26px; display: flex; flex-direction: column; gap: 12px; align-items: flex-start; }
.ar-work__idle p { margin: 0; font-size: 13px; color: var(--ar-ink-soft); }

.ar-work__tabs { display: flex; gap: 6px; flex-wrap: wrap; padding: 12px 26px; border-bottom: 1px solid var(--ar-line); background: var(--ar-surface-2); }
.ar-work__tab {
  appearance: none; cursor: pointer; font: inherit; font-size: 11.5px;
  border: 1px solid var(--ar-line-strong); border-radius: 12px; padding: 3px 12px;
  background: var(--ar-surface); color: var(--ar-ink-soft);
}
.ar-work__tab.is-active { border-color: var(--ar-accent); color: var(--ar-accent); background: var(--ar-accent-soft, #e3efec); font-weight: 600; }
.ar-work__tab-n { font-family: var(--ar-mono); font-variant-numeric: tabular-nums; opacity: 0.75; }
.ar-work__tab:disabled { opacity: 0.6; cursor: default; }

/* The pager. Tokens only — the scheme dialects re-key these and a literal
   colour here would be the one thing that did not follow the theme. */
.ar-work__pager {
  display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap;
  padding: 12px 26px; border-top: 1px solid var(--ar-line);
}
.ar-work__pager-count { margin: 0; font-size: 12.5px; color: var(--ar-ink-soft); }
.ar-work__pager-nav { display: flex; align-items: center; gap: 3px; flex-wrap: wrap; }
.ar-work__pg {
  appearance: none; cursor: pointer; font: inherit; font-size: 12.5px;
  min-width: 28px; height: 28px; padding: 0 9px;
  border: 1px solid transparent; border-radius: 4px;
  background: transparent; color: var(--ar-ink-soft);
}
.ar-work__pg:hover:not(:disabled) { color: var(--ar-ink); border-color: var(--ar-line); }
.ar-work__pg.is-here { border-color: var(--ar-line-strong); background: var(--ar-surface-2); color: var(--ar-ink); font-weight: 600; }
.ar-work__pg:disabled { opacity: 0.45; cursor: default; }
.ar-work__pg-gap { color: var(--ar-ink-faint); padding: 0 2px; }

/* ── The row that opens ──────────────────────────────────────────────────
   One silhouette closed; everything known when asked for. Tokens only, so
   every scheme dialect keeps its own voice. */
/* One bordered fold per row — the same furniture the index groups wear, so the
   two screens read as one plugin and the caret is the fold's own drawn
   triangle rather than a second one of ours. */
.ar-work__fold { margin: 0 0 10px; }
/* ⚠️ A GRID, not the wrapping flex the other folds use — and this row cannot go
   back to flex. A flex line breaks on each item's HYPOTHETICAL size (its
   max-content), never on the width it would shrink to, so the moment a title
   plus its search phrase was longer than the free space the whole text block
   dropped to a second line and left the caret STRANDED ALONE on the first —
   then pushed the state pill onto a third. On a phone every row did it, because
   at that width no row's max-content ever fits. Three columns cannot break:
   `minmax(0, 1fr)` lets the middle one shrink and wrap inside itself, which is
   where wrapping belongs. (The pill's `justify-self` has always been written
   for a grid; the flex base was quietly ignoring it.) */
.ar-work__fold > summary {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: start;
  gap: 10px;
  padding: 12px 0;
  font-weight: 400;
}
/* The caret centres on the TITLE LINE, not on the summary — the summary is two
   lines tall (title, then the gist), so centring on it would float the caret
   between them. The sum is pinned rather than guessed: the fold's triangle is
   8px tall (4px top + 4px bottom border), the title line is held at 21px
   below, so (21 − 8) / 2 = 6.5px. Change one, change the other. */
.ar-work__fold > summary::before { margin-top: 6.5px; }
.ar-work__fold[open] > summary { margin-bottom: 12px; }
/* ⚠️ `min-width: 0` is the whole reason the middle column can shrink — without
   it a grid item floors at its min-content width and the row overflows sideways
   instead of wrapping. */
.ar-work__summain { min-width: 0; }
/* Narrow: the pill stops being a column of its own and takes a line under the
   text, still aligned to it. The caret keeps the title company — it is never
   alone on a line at any width, which is the whole point of the grid. */
@media (max-width: 700px) {
  .ar-work__fold > summary { grid-template-columns: auto minmax(0, 1fr); }
  .ar-work__fold > summary .ar-work__state { grid-column: 2; justify-self: start; margin-top: 6px; }
}
/* One line, aligned with the title above it. ⚠️ The focus label must NOT claim
   a full row here (as `.ar-work__forlabel` does in the opened body): on its own
   line it left the separator that follows it stranded at the head of the next
   one, reading as a dangling bullet. */
.ar-work__gist { display: flex; flex-wrap: wrap; align-items: baseline; gap: 3px 9px; margin-top: 5px; }
.ar-work__nofocus {
  font-family: var(--ar-mono); font-size: 9.5px; letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--ar-ink-faint);
}
.ar-work__sep { color: var(--ar-line-strong); }
.ar-work__eng { display: inline-flex; align-items: baseline; gap: 6px; white-space: nowrap; }
.ar-work__eng b { font-weight: 600; color: var(--ar-ink); font-size: 12px; }
.ar-work__eng-n { font-family: var(--ar-mono); font-size: 11.5px; font-variant-numeric: tabular-nums; color: var(--ar-ink-soft); }
.ar-work__eng.is-quiet b, .ar-work__eng.is-quiet .ar-work__eng-n { color: var(--ar-ink-faint); font-weight: 500; }
.ar-work__state {
  justify-self: end; white-space: nowrap; font-size: 11.5px; padding: 2px 9px; border-radius: 3px;
  border: 1px solid var(--ar-warn-tint); background: var(--ar-warn-wash); color: var(--ar-warn-deep);
}
.ar-work__state.is-clear { border-color: var(--ar-line); background: transparent; color: var(--ar-ink-faint); }

.ar-work__body { padding: 0 0 2px 15px; }
.ar-work__block { padding-top: 15px; margin-top: 15px; border-top: 1px solid var(--ar-line); }
.ar-work__block:first-child { border-top: 0; margin-top: 0; padding-top: 4px; }
.ar-work__bhead { display: flex; align-items: baseline; justify-content: space-between; gap: 14px; margin-bottom: 9px; }
.ar-work__bhead h4 {
  margin: 0; font-family: var(--ar-mono); font-size: 10px; letter-spacing: .11em;
  text-transform: uppercase; color: var(--ar-ink-faint); font-weight: 600;
}
.ar-work__bhead .ar-work__when { font-size: 11.5px; color: var(--ar-ink-faint); white-space: nowrap; }
.ar-work__qline--big .ar-work__w { font-size: 14px; }
.ar-work__verdict { display: flex; flex-wrap: wrap; align-items: baseline; gap: 7px; margin-top: 7px; }

/* The searches sit in a frame of their own: they are the engine's words, not
   ours, and a box says so without a sentence saying it. */
.ar-work__srchbox { border: 1px solid var(--ar-line); border-radius: var(--ar-radius); overflow: hidden; }
.ar-work__srch { width: 100%; border-collapse: collapse; }
.ar-work__srch td { padding: 9px 14px; font-size: 12.5px; vertical-align: baseline; border-bottom: 1px solid var(--ar-line); }
.ar-work__srch tr:last-child td { border-bottom: 0; }
.ar-work__srch-q { color: var(--ar-ink); }
.ar-work__srch-q.is-top { font-weight: 600; }
.ar-work__srch-n {
  text-align: right; width: 92px; white-space: nowrap; color: var(--ar-ink-soft);
  font-family: var(--ar-mono); font-size: 11.5px; font-variant-numeric: tabular-nums;
}
.ar-work__srch-r { width: 62px; color: var(--ar-ink); }
.ar-work__more { margin: 8px 0 0; font-size: 12px; color: var(--ar-ink-faint); }

/* An absence that names itself, in a frame beside the engine's own — same
   weight as an answer, because it IS one. The mark says which kind at a
   glance: a tick for "asked, and the answer is none", a warning for "nobody
   has asked". Skimming past one word is how the two used to blur. */
.ar-work__answer {
  display: flex; gap: 12px; align-items: flex-start;
  border: 1px solid var(--ar-line); border-radius: var(--ar-radius);
  padding: 12px 14px; font-size: 12.5px; color: var(--ar-ink-soft);
}
.ar-work__answer-mark { flex: none; margin-top: 1px; color: var(--ar-ink-faint); }
.ar-work__answer.is-none .ar-work__answer-mark { color: var(--ar-good); }
.ar-work__answer.is-unasked .ar-work__answer-mark { color: var(--ar-warn); }
.ar-work__answer.is-error .ar-work__answer-mark { color: var(--ar-bad); }
.ar-work__answer-t { min-width: 0; }
.ar-work__answer-t b { display: block; color: var(--ar-ink); font-weight: 600; margin-bottom: 3px; }
.ar-work__answer-t span { display: block; }

/* Gold: a caveat about the data in front of you, and nothing else. */
.ar-work__note {
  margin-top: 14px; font-size: 12.5px; color: var(--ar-warn-deep);
  background: var(--ar-warn-wash); border: 1px solid var(--ar-warn-tint);
  border-radius: 4px; padding: 9px 13px;
}
.ar-work__note b { font-weight: 650; }

/* Doing on the left, undoing on the right. Two verbs that read alike from a
   distance sat side by side; pushed apart, and each given its own mark, the
   destructive one can no longer be clicked by muscle memory. */
.ar-work__body .ar-work__act {
  margin-top: 16px; padding-top: 13px; border-top: 1px solid var(--ar-line);
  display: flex; justify-content: space-between; gap: 18px; align-items: center;
}
.ar-work__do, .ar-work__undo { display: inline-flex; align-items: center; gap: 7px; }
.ar-work__undo { margin-left: auto; }
.ar-work__do svg, .ar-work__undo svg { flex: none; opacity: .75; }

/* Said once, under the list — a screen of closed boxes has to admit there is
   something inside them. */
.ar-work__tip {
  display: flex; align-items: center; justify-content: center; gap: 7px;
  margin: 0; padding: 12px 26px 16px; font-size: 12px; color: var(--ar-ink-faint);
}
.ar-work__tip svg { flex: none; }

@media (max-width: 782px) {
  .ar-work__rowhead { padding-left: 18px; padding-right: 18px; }
  .ar-work__body { padding-left: 40px; padding-right: 18px; }
  .ar-work__bhead { flex-direction: column; gap: 2px; }
  .ar-work__srch-n { width: auto; }
}

/* The list's column heads — the row grid restated, so a heading can never
   drift from the column it names. */
.ar-work__cols {
  display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, 1.15fr) auto;
  gap: 20px; padding: 10px 26px 8px;
  border-bottom: 1px solid var(--ar-line);
  font-family: var(--ar-mono); font-size: 9.5px; letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--ar-ink-faint);
}
.ar-work__cols span:last-child { text-align: right; }
@media (max-width: 1080px) { .ar-work__cols { display: none; } }

/* The read button's own busy mark, at the assistant spinner's size. The mark's
   SLOT is always there — hidden when idle — because the button reserves the
   busy label's width up front (data-reserve) and a spinner appearing beside it
   would have widened the button on click, which is exactly the jump that
   pattern exists to prevent. */
.ar-work__gotext { display: inline-flex; align-items: center; gap: 9px; }
.ar-spinner.ar-work__spin {
  box-sizing: border-box; width: 13px; height: 13px; border-width: 2px; flex: 0 0 auto;
}
.ar-work__spin.is-idle { visibility: hidden; animation: none; }
/* The reserve twin has to hold the mark's room too, or the button still grows
   the moment the label swaps. */
.ar-work__go.ar-btn--reserve::after { padding-left: 22px; }

/* The folds are boxes now, so the list needs the breathing room the old
   full-bleed rows did not: a box flush against the card edge reads as a
   mistake rather than a card. */
.ar-work__list { list-style: none; margin: 0; padding: 14px 26px 4px; }
/* ⚠️ A ROW IS NO LONGER THREE COLUMNS. It was a grid of content / search /
   actions read across; it is now a FOLD that opens downward. Leaving the old
   grid here put the summary in column one and the opened body in column two,
   side by side. No border either: each fold draws its own box, and a rule
   between boxes is a second separator doing the same job. */
.ar-work__row {
  display: block; border-bottom: 0;
}
.ar-work__row:last-child { border-bottom: 0; }
.ar-work__row.is-aside { opacity: 0.62; }

.ar-work__thing { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
/* The kind, as a chip — the same rectangle grammar the edge tags wear. It
   names what a row IS on a site whose content is Products or Recipes, so it
   has to be legible at a glance without competing with the title. */
.ar-work__type {
  font-family: var(--ar-mono); font-size: 9.5px; letter-spacing: 0.09em;
  text-transform: uppercase; color: var(--ar-ink-soft);
  /* ⭐ The line colour AS A FILL. It is one step off the surface in the same
     hue family, which is exactly what a chip wants — and it moves the right way
     on its own in both themes: lighter than the fold at night, a shade deeper
     than the near-white card by day. Every scheme dialect re-keys it for free.
     ⛔ Not surface-2 (that IS the closed fold's ground, so the chip vanished
     into it) and ⛔ not paper (a plane BELOW the fold — at night that read as a
     black hole punched in the row). */
  border: 1px solid var(--ar-line-strong); border-radius: 3px;
  background: var(--ar-line); padding: 1px 6px; flex: none;
  /* ⚠️ Its own line-height, or it inherits the title's 21px and the chip grows
     past the line the caret is centred against, dragging the row out of
     alignment again. 14 + 2 padding + 2 border = 18, inside the 21px line. */
  line-height: 14px;
  align-self: center;
}
/* Kind : name, on one line. A two-word label does not earn a row of its own.
   ⚠️ The line-height is stated, not inherited: the caret beside it is centred
   against this exact number. */
.ar-work__rowtitle { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0 6px; min-width: 0; line-height: 21px; }
.ar-work__name { font-size: 14px; font-weight: 600; color: var(--ar-ink); text-decoration: none; overflow-wrap: anywhere; }
a.ar-work__name { color: var(--ar-accent); }
.ar-work__name:hover, .ar-work__name:focus-visible { color: var(--ar-accent); text-decoration: underline; text-underline-offset: 2px; }
.ar-work__flags { display: flex; gap: 5px; flex-wrap: wrap; margin-top: 2px; }
.ar-work__flag {
  font-size: 10.5px; border: 1px solid var(--ar-warn-tint); background: var(--ar-warn-wash); color: var(--ar-warn-deep);
  border-radius: 3px; padding: 1px 7px;
}
.ar-work__flag.is-more { border-style: dashed; }
.ar-work__flag.is-clear { border-color: var(--ar-good-tint); background: var(--ar-good-wash); color: var(--ar-good); }

.ar-work__for { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
/* The search this row is judged against, with a label saying whose it is.
   The phrase becomes a badge because it is a QUOTED VALUE — words somebody
   typed into Google — and reading it as running text invited it to be
   mistaken for the plugin's own description of the page. */
/* ONE shape per row (his call, 2026-08-13: the list read messy): the label
   takes its own line and the searches sit under it, whether the query is
   three words or nine. Inline-with-wrap gave a short query one silhouette and
   a long one another, so no two rows in the list repeated — the single
   loudest source of the raggedness. */
.ar-work__forline {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: 5px 7px;
  margin-top: 8px;
}

.ar-work__forlabel {
  /* The label claims the whole line; the searches wrap across the line below
     it — one shape whether the query is three words or nine. Inline, a long
     query dropped below and left the label stranded, so no two rows in the
     list repeated. */
  flex: 0 0 100%; font-family: var(--ar-mono); font-size: 9.5px;
  letter-spacing: 0.1em; text-transform: uppercase; color: var(--ar-ink-faint);
}
/* The search, read as a phrase. No pill: the words themselves carry the
   reading (his call, 2026-08-14 — the filled chips read chaotic), so the row
   shows one line of language instead of a wall of badges. */
.ar-work__qline {
  display: block; font-size: 12.5px; line-height: 1.65;
  color: var(--ar-ink); overflow-wrap: anywhere;
}
.ar-work__qmark { margin-right: 7px; font-size: 9px; color: var(--ar-ink-faint); vertical-align: 1px; }
.ar-work__qline.is-answered .ar-work__qmark { color: var(--ar-good); }
.ar-work__qline.is-scattered .ar-work__qmark { color: var(--ar-warn); }
.ar-work__qline.is-missing .ar-work__qmark { color: var(--ar-bad); }
/* Three readings, three treatments — colour never alone: weight lifts the
   words the answering passage holds, and a strike marks the ones that are not
   on the page at all. */
.ar-work__w { margin-right: 5px; }
.ar-work__w.is-passage { color: var(--ar-good); font-weight: 600; }
.ar-work__w.is-page { color: var(--ar-ink); }
/* The connective words the grader never weighs — present in the phrase
   because that is what was typed, quiet because they carry no verdict. */
.ar-work__w.is-plain { color: var(--ar-ink-soft); }
.ar-work__w.is-absent {
  color: var(--ar-ink-faint);
  text-decoration: line-through; text-decoration-thickness: 1px;
}

/* The reported-search line: quiet, because it is context for a decision the
   owner already made — not a correction shouted at them. */
.ar-work__reported {
  display: block; margin-top: 5px;
  font-size: 11.5px; line-height: 1.5; color: var(--ar-ink-faint);
}
.ar-work__reported strong { color: var(--ar-ink-soft); font-weight: 600; }
.ar-work__reported-n { font-family: var(--ar-mono); font-size: 10.5px; }

.ar-work__nums {
  font-family: var(--ar-mono); font-size: 10.5px; color: var(--ar-ink-soft);
  font-variant-numeric: tabular-nums; display: flex; gap: 8px; flex-wrap: wrap;
}
.ar-work__rank { color: var(--ar-ink); font-weight: 600; }
.ar-work__dot { color: var(--ar-ink-faint); }
.ar-work__cover { display: flex; align-items: baseline; gap: 6px; margin-top: 2px; }
.ar-work__cover-mark { font-size: 11px; }
.ar-work__cover-t { font-size: 12px; font-weight: 600; }
.ar-work__cover.is-answered .ar-work__cover-mark, .ar-work__cover.is-answered .ar-work__cover-t { color: var(--ar-good); }
.ar-work__cover.is-scattered .ar-work__cover-mark, .ar-work__cover.is-scattered .ar-work__cover-t { color: var(--ar-warn); }
.ar-work__cover.is-barely .ar-work__cover-mark, .ar-work__cover.is-barely .ar-work__cover-t { color: var(--ar-ink-soft); }
.ar-work__cover.is-missing .ar-work__cover-mark, .ar-work__cover.is-missing .ar-work__cover-t { color: var(--ar-bad); }
.ar-work__why { font-size: 11.5px; color: var(--ar-ink-soft); line-height: 1.5; }

/* ⚠️ Was a stacked column, because it used to be the row's third grid column.
   Inside the fold it is a footer strip, so the two verbs sit on ONE line with
   the whole width between them — see .ar-work__body .ar-work__act. */
.ar-work__act { display: flex; gap: 18px; align-items: center; white-space: nowrap; }
.ar-linkbtn--mute { color: var(--ar-ink-faint); }
.ar-linkbtn--mute:hover, .ar-linkbtn--mute:focus-visible { color: var(--ar-ink-soft); }

.ar-work__empty { margin: 0; padding: 26px; font-size: 13px; color: var(--ar-ink-soft); }
.ar-work__foot { margin: 0; padding: 13px 26px; border-top: 1px solid var(--ar-line); font-size: 11.5px; color: var(--ar-ink-faint); }

@media (max-width: 1080px) {
  .ar-work__row { grid-template-columns: minmax(0, 1fr); gap: 10px; padding: 14px 18px; }
  .ar-work__act { align-items: flex-start; flex-direction: row; gap: 14px; }
  .ar-work__head, .ar-work__tabs, .ar-work__foot, .ar-work__empty, .ar-work__idle { padding-left: 18px; padding-right: 18px; }
}

/* A finding with several separable facts states them as points. Prose on a
   worklist gets skimmed, and the last clause — usually what to DO — is the one
   that gets skipped. */
.ar-today__points { margin: 2px 0 0; padding: 0 0 0 15px; list-style: none; display: flex; flex-direction: column; gap: 3px; }
.ar-today__points li { position: relative; font-size: 12.5px; line-height: 1.5; color: var(--ar-ink-soft); max-width: 68ch; }
.ar-today__points li::before {
  content: '—'; position: absolute; left: -15px; color: var(--ar-ink-faint);
}

/* One WIDTH for the action column, not a minimum on the buttons.
   A min-width lets the longest label push past it — "Set up AI Visibility"
   outgrew "Open the worklist" and the column went ragged again. Fixing the
   column and filling it means every button matches whatever labels arrive. */
/* 214px, and MEASURED rather than assumed: every action label the plugin can put
   here was rendered at this button's exact type (11px mono, 0.08em tracking,
   uppercase). The widest is "Turn on robots.txt rules" at 181px against the
   192px content box this leaves — 11px of room, and the rest far more.
   ⚠️ It was 4px too narrow until 2026-08-18, for one label, in one condition:
   the button asked for a size class that did not exist (`ar-btn--sm`; the
   stylesheet has only `--small`), so it rendered at 12px instead of 11px. */
.ar-today__act { width: 214px; min-width: 0; }
.ar-today__act .ar-btn { width: 100%; min-width: 0; padding-left: 10px; padding-right: 10px; }
/* ⚠️ The safety net, because a measured width is only ever true for the labels
   that exist today IN ENGLISH — a translation of any of them can be half as long
   again, and no fixed width survives that. A fixed width plus the `nowrap` this
   inherits from .ar-btn is a promise the next label cannot be asked to keep, and
   the failure mode is the ugly one: the pill ends and the letters keep going, so
   it reads as a rendering fault rather than as a long label. Wrapping costs a
   second line and is correct for a label nobody has written yet. */
.ar-today__act .ar-btn { white-space: normal; line-height: 1.35; text-wrap: balance; }
@media (max-width: 782px) {
  .ar-today__act, .ar-today__act .ar-btn { width: auto; }
}

/* ---- The two doors out: Get Help / Report an Issue ---------------------- */
/* The facts block is STATED, NOT TYPED. No field border and no caret, because it
   is something the plugin knows about this site rather than a draft the reporter
   fills in — a version number somebody edited by hand is worse than none, since
   it gets believed. */
.ar-facts {
  margin: 0; padding: 10px 12px; border-radius: var(--ar-radius);
  background: var(--ar-surface-2); border: 1px solid var(--ar-line);
  font-family: var(--ar-mono); font-size: 11.5px; line-height: 1.6;
  color: var(--ar-ink-soft); overflow-x: auto; white-space: pre;
}
/* Amber, not red: needing an account is a condition of the destination, not a
   fault of the site — but it has to carry more weight than a hint, because
   meeting it at a sign-in wall AFTER typing is how a report gets abandoned. */
.ar-warnline {
  margin: 0; padding: 9px 12px; border-radius: var(--ar-radius);
  background: var(--ar-warn-wash); color: var(--ar-warn-deep);
  font-size: 12px; line-height: 1.5;
}
.ar-warnline strong { color: inherit; }
.ar-support { gap: 16px; }
/* What's New in its on-demand shell. The card next door has its own type scale
   for a wide grid; a dialog is one column, so the items read as a short list. */
.ar-wn__ver {
  margin: 0 0 4px; font-family: var(--ar-mono); font-size: 10.5px;
  letter-spacing: 0.08em; text-transform: uppercase; color: var(--ar-ink-faint);
}
.ar-wn__list { display: flex; flex-direction: column; gap: 16px; }
.ar-wn__item { display: flex; flex-direction: column; gap: 4px; }
.ar-wn__itemtitle {
  margin: 0; font-family: var(--ar-serif); font-size: 15px; font-weight: 600; color: var(--ar-ink);
}
.ar-wn__itemtext { margin: 0; font-size: 13px; line-height: 1.6; color: var(--ar-ink-soft); }
/* The older releases, in the same scroll rather than behind a second modal. The
   rule above it is the seam between "what this release did", written by hand,
   and "what every release did", read from the readme. */
/* The setup block on About. Its own band under the links, because "what am I
   running" is a different question from "where do I read more". */
.ar-about-setup {
  margin: 20px 0 0; padding-top: 18px; border-top: 1px solid var(--ar-line);
  display: flex; flex-direction: column; gap: 8px; align-items: flex-start;
}
.ar-about-setup__title { margin: 0; font-family: var(--ar-serif); font-size: 16px; font-weight: 600; color: var(--ar-ink); }
.ar-about-setup__lead { margin: 0; font-size: 13px; line-height: 1.55; color: var(--ar-ink-soft); max-width: 62ch; }
.ar-about-setup .ar-facts { align-self: stretch; }

.ar-wn__older { margin-top: 4px; padding-top: 14px; border-top: 1px solid var(--ar-line); }
.ar-wn__oldernote { margin: 8px 0 4px; font-size: 12px; line-height: 1.5; color: var(--ar-ink-faint); }
.ar-wn__older .ar-chlog__entry { margin-top: 14px; }
.ar-support__foot { margin-right: auto; font-size: 12px; color: var(--ar-ink-faint); }

/* The put-away control. It lives in the row's own grid rather than beside the
   action button, so a row with no action still has somewhere to put it — and it
   stays quiet until the row is hovered or it is focused, because a suggestion
   should not arrive already offering to be dismissed. */
.ar-today__hide { grid-column: 3; justify-self: end; opacity: 0; transition: opacity 0.15s ease, color 0.15s ease, background 0.15s ease; }
.ar-today__row:hover .ar-today__hide,
.ar-today__hide:focus-visible { opacity: 1; }
/* ⚠️ Touch has no hover, so the control would be unreachable on a phone —
   permanently visible there instead. */
@media (hover: none) { .ar-today__hide { opacity: 1; } }

/* The ledger. Never a hidden one: the count is always on screen, and every row
   in it can be brought back. */
.ar-today__hidden { margin: 4px 26px 16px; }
.ar-today__hiddenlist { list-style: none; margin: 8px 0 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.ar-today__hiddenlist li {
  display: flex; align-items: baseline; justify-content: space-between; gap: 14px;
  font-size: 13px; color: var(--ar-ink-soft);
}

/* Check again and the score share one line. The "Setup score" caption is gone:
   a two-line block beside a one-line control forced the head taller than either
   needed, and the number reads clearly enough next to what re-reads it. */
.ar-today__meta { align-items: baseline; gap: 14px; }
.ar-today__score-n { display: inline; }

/* Score above, its re-check directly beneath — right-aligned so both hang off
   the same edge as the action column below them. */
.ar-today__meta { flex-direction: column; align-items: flex-end; gap: 3px; }
.ar-today__meta .ar-today__refresh { font-size: 11.5px; }

/* Both the same width, set by whichever is wider. A column of max-content sized
   to its widest child, with the children stretched to fill it — so the button
   and the number it re-takes read as one control, not two things that happen to
   sit near each other. */
.ar-today__meta { align-items: stretch; width: max-content; }
.ar-today__score-n { display: block; text-align: center; }
.ar-today__meta .ar-today__refresh { width: 100%; text-align: center; }

/* The score and its re-check, exactly the same width.
   A single-column inline-grid: the column takes the width of the wider child
   and both stretch into it. Flex could not do this reliably here because
   .ar-linkbtn carries a 4px left nudge for its hover pill, which pushed the
   button off the shared edge however the widths were set — so it is zeroed.
   Uppercase mono to match the buttons below; this is a control, not prose. */
.ar-today__meta {
  display: inline-grid; grid-auto-flow: row; justify-items: stretch;
  gap: 4px; width: auto;
}
.ar-today__score-n { display: block; text-align: center; }
.ar-today__meta .ar-today__refresh {
  margin-left: 0; width: 100%; text-align: center;
  font-family: var(--ar-mono); font-size: 10.5px;
  letter-spacing: 0.08em; text-transform: uppercase;
}

/* The reserve twin is an inline-grid, which would override the full-width
   stretch this button needs to match the score above it. Keep both. */
.ar-today__meta .ar-today__refresh.ar-btn--reserve { display: grid; width: 100%; }

/* ---------------------------------------------------------------------------
   Your content — the opening state.

   A first run, not an empty panel: centred, generous, and already saying
   something true about this site. The counts come from the boot payload (no
   page is parsed for them), so the invitation is grounded in real numbers
   before the expensive read is ever asked for.
   --------------------------------------------------------------------------- */
.ar-work__intro {
  display: flex; flex-direction: column; align-items: center; text-align: center;
  gap: 14px; padding: 46px 26px 42px;
}
.ar-work__intro-mark { color: var(--ar-accent); opacity: 0.85; }
.ar-work__intro-title {
  font-family: var(--ar-serif); font-size: 22px; font-weight: 600;
  margin: 0; color: var(--ar-ink); text-wrap: balance;
}
.ar-work__intro-lead {
  margin: 0; font-size: 14px; line-height: 1.6; color: var(--ar-ink-soft);
  max-width: 54ch; text-wrap: pretty;
}

/* The numbers. Big enough to read as facts rather than captions, and separated
   by hairlines so they group as one statement about the site. */
.ar-work__stats {
  display: flex; flex-wrap: wrap; justify-content: center;
  gap: 0; margin: 4px 0 6px;
  border: 1px solid var(--ar-line); border-radius: var(--ar-radius);
  background: var(--ar-surface-2); overflow: hidden;
}
.ar-work__stat {
  display: flex; flex-direction: column; gap: 2px; align-items: center;
  padding: 12px 24px; border-left: 1px solid var(--ar-line); min-width: 132px;
}
.ar-work__stat:first-child { border-left: 0; }
.ar-work__stat-n {
  font-family: var(--ar-mono); font-size: 21px; font-weight: 600;
  color: var(--ar-ink); font-variant-numeric: tabular-nums; line-height: 1.1;
}
.ar-work__stat-l { font-size: 11px; color: var(--ar-ink-faint); letter-spacing: 0.01em; }

.ar-work__intro-note { margin: 0; font-size: 11.5px; color: var(--ar-ink-faint); max-width: 52ch; }

@media (max-width: 600px) {
  .ar-work__intro { padding: 34px 18px 30px; }
  .ar-work__stats { flex-direction: column; width: 100%; }
  .ar-work__stat { border-left: 0; border-top: 1px solid var(--ar-line); width: 100%; }
  .ar-work__stat:first-child { border-top: 0; }
}

/* ---------------------------------------------------------------------------
   Narrow screens.

   Two things went wrong once the three-column rows collapsed:

   The breakpoint is 1080px, not 782px, because the card is not the viewport:
   the right rail takes ~300px and wp-admin's own menu another ~160px, so a
   960px window leaves this card about 545px wide — already deep in the squeeze.
   Measure the container, not the screen.

   1. The action column keeps `justify-content: flex-end` from the desktop
      layout, where it aligns a column of buttons to a shared right edge. Once
      the button drops under the text that edge no longer exists, so it stranded
      itself far right with a lake of empty space beside the sentence it belongs
      to. Actions read left, under what they act on.
   2. The breakpoint sat at 782px, but the squeeze starts earlier: between about
      900px and 782px the title wraps to two lines while a 214px action column
      still holds its width. Collapse before it gets that tight.
   --------------------------------------------------------------------------- */
@media (max-width: 1080px) {
  .ar-today__row { grid-template-columns: 18px minmax(0, 1fr); padding: 15px 20px; }
  .ar-today__act {
    grid-column: 2; width: auto; justify-content: flex-start;
    margin-top: 4px;
  }
  .ar-today__act .ar-btn { width: auto; min-width: 0; padding-left: 18px; padding-right: 18px; }
  .ar-today__why, .ar-today__points li { max-width: none; }
  .ar-today__head { padding: 20px 20px 16px; }
  .ar-today__divider, .ar-today__clear, .ar-today__failed { padding-left: 20px; padding-right: 20px; }
  .ar-today__won { padding-left: 20px; padding-right: 20px; }

  /* The head's score + re-check stop hugging the right edge, which on a narrow
     column reads as a stray fragment far from the heading it belongs to. */
  .ar-today__head { flex-direction: column; align-items: flex-start; gap: 12px; }
  .ar-today__meta { justify-items: start; }
  .ar-today__score-n, .ar-today__meta .ar-today__refresh { text-align: left; }
}

/* The content rows collapse at the same width, so the two halves of Today never
   disagree about what "narrow" means. */
@media (max-width: 1080px) {
  .ar-work__head { flex-direction: column; align-items: flex-start; gap: 10px; }
  .ar-work__row { padding: 16px 20px; }
  /* Actions get a rule above them: stacked, they otherwise read as one more
     line of the description rather than the things you can do to it. */
  .ar-work__act {
    align-items: center; flex-direction: row; gap: 18px;
    padding-top: 10px; margin-top: 2px; border-top: 1px solid var(--ar-line);
    width: 100%;
  }
  .ar-work__act .ar-linkbtn { margin-left: 0; padding-left: 0; }
  .ar-work__tabs, .ar-work__foot, .ar-work__empty { padding-left: 20px; padding-right: 20px; }
}

/* BOTH controls are circles, not lozenges: each carries one 15px glyph
   and nothing else in flow — the bell's count rides the corner as an
   out-of-flow bubble, so no control needs pill room for a number.
   A lozenge around a single centred mark just reads as a pill that lost its
   text, and two badge grammars in one pair read as a glitch.

   28px is the family size the cluster settled on back when the bell's inline
   badge set it (16 badge + 10 padding + 2 border); the badge has since moved
   to the corner but the measure stays — it is the height the whole bar row
   was tuned against. 26 under 720px, same story. Fixed sizes, not
   aspect-ratio: flex sizes a flex item's main axis from content and gave a
   17px-wide oval when aspect-ratio was tried. (The Settings gear used to
   close this row; it moved into More — a screen among actions wore a
   selected state its neighbours could never have.) */
.ar__assist-btn.ar__review-btn,
.ar__theme-btn.ar__review-btn,
.ar__review > .ar__review-btn {
  padding: 0; width: 28px; height: 28px; justify-content: center;
}
@container (max-width: 720px) {
  .ar__assist-btn.ar__review-btn,
  .ar__theme-btn.ar__review-btn,
  .ar__review > .ar__review-btn { width: 26px; height: 26px; }
}
/* The assistant's button is wrapped — the wrapper anchors its guidance popover.
   Making that wrapper a flex row drops the inline line-box slack under the
   button, which would otherwise make the wrapper a couple of px taller than the
   circle inside it. Safe: the popover is position:absolute, out of flow. */
.ar__controls .ar__assist { display: flex; }

/* A folded-out primary borrows the bar's 24-grid mark inside the 16px menu, so
   it has to be scaled down to sit on the same optical line as its neighbours. */
.ar__more-icon--nav { display: inline-flex; align-items: center; justify-content: center; width: 15px; height: 15px; }
.ar__more-icon--nav svg { width: 15px; height: 15px; }

/* One gap across the whole control cluster, owned by the cluster.
   The pills used to be bar siblings pulled together with negative margins, and
   the bar's gap is not one number — 26px normally, 16px under the narrow
   container query. So a nudge tuned at one width was wrong at the other: -6px
   gave the intended 10px on a narrow window and 20px on a wide one. A wrapper
   with its own gap is immune to whatever the bar does around it. */
.ar__controls {
  display: flex; align-items: center; gap: 10px;
  flex: 0 0 auto; align-self: center; margin-left: auto;
  /* The positioning context for the bell's queue pop: right:0 inside it means
     the CLUSTER's right edge — flush with the content edge at every width,
     whichever seat the bell itself sits in. */
  position: relative;
}
/* Inside the group, every sibling nudge and auto-margin from the old flat
   arrangement has to stand down or it fights the gap. */
.ar__controls .ar__assist,
.ar__controls .ar__assist + .ar__review,
.ar__controls .ar__review { margin-left: 0; }

/* ---------------------------------------------------------------------------
   The three control pills — the quill, the bell, the gear.

   Their border was --ar-line-strong, the same warm tan as every card edge on
   the page, so the cluster dissolved into the bar rather than reading as a set
   of controls. A mild sage — the accent teal mixed down into that same tan —
   keeps them in the palette while marking them as things you press. Hex first
   for browsers without color-mix; the mix refines it where supported.
   --------------------------------------------------------------------------- */
:root {
  --ar-line-control: color-mix(in srgb, var(--ar-accent) 28%, var(--ar-line));        /* accent 28% into --ar-line */
  --ar-line-control-strong: color-mix(in srgb, var(--ar-accent) 48%, var(--ar-line)); /* accent 48%, for hover */
  --ar-line-control-soft: color-mix(in srgb, var(--ar-accent) 18%, var(--ar-line));   /* accent 18%, for a resting bell */
}
@supports (color: color-mix(in srgb, red, blue)) {
  :root {
    --ar-line-control: color-mix(in srgb, var(--ar-accent) 28%, var(--ar-line));
    --ar-line-control-strong: color-mix(in srgb, var(--ar-accent) 48%, var(--ar-line));
    --ar-line-control-soft: color-mix(in srgb, var(--ar-accent) 18%, var(--ar-line));
  }
}

.ar__review-btn { border-color: var(--ar-line-control); }
.ar__review-btn:hover,
.ar__review.is-open .ar__review-btn { border-color: var(--ar-line-control-strong); }
/* The resting bell keeps its quieter edge, one step softer than its siblings. */
.ar__review.is-quiet .ar__review-btn { border-color: var(--ar-line-control-soft); }
/* The gear on its own screen is NOT pinned here. Its active edge is the accent,
   set with the rest of that state further up (.ar__gearbtn.is-here). This section
   once forced --ar-ink on the active control — same specificity as the real rule
   but lower in the file, so it quietly outranked it and the border alone stayed
   black while the mark went teal. */
.ar-work__src { font-size: 10.5px; color: var(--ar-ink-faint); }

/* ---------------------------------------------------------------------------
   Optimize, collapsed.

   The card used to be nine complaint rows, each unfolding its own pages, with
   the set-aside ledger under them — so learning what was wrong with ONE page
   meant reading all nine and assembling the answer. Today's content worklist is
   that information one row per page, so this keeps the headline and hands over
   the working-through. The by-issue view stays behind a disclosure rather than
   being deleted: its bulk actions ("Ignore All" for a whole check) have no
   per-page equivalent.
   --------------------------------------------------------------------------- */
.ar-optsum { display: flex; flex-direction: column; align-items: flex-start; gap: 12px; padding: 4px 0 2px; }
.ar-optsum__lead { margin: 0; font-size: 14px; line-height: 1.6; color: var(--ar-ink-soft); max-width: 68ch; }

/* Set aside, folded. The count stays visible in the summary — a parked-pages
   ledger that hides its own size is how content gets excluded from a score and
   forgotten — but the list itself was the tallest thing on the card. */
.ar-setaside.ar-fold > summary .ar-setaside__title { font-size: 13px; }
/* The standalone list drew its own dashed rule and hung off the card's left
   edge; folded, the bar IS the boundary and the box owns the padding. */
.ar-setaside.ar-fold { margin: 16px 0 0; padding: 0 16px; border-top: 1px solid var(--ar-line-strong); }
.ar-setaside.ar-fold[open] { padding-bottom: 13px; }
.ar-setaside__actions { display: flex; justify-content: flex-end; margin: 0 0 8px; }

/* ---------------------------------------------------------------------------
   "Who reached your site" — the people/machines split.

   Two halves, equal weight, with a rule between them rather than a card each:
   they are two readings of ONE window, and two cards would invite the eye to
   compare them as rivals. The numbers are deliberately never summed — a fetch
   is not a visit — so there is no total row anywhere in this block.
   --------------------------------------------------------------------------- */
.ar-aud__head { margin-bottom: 16px; }
.ar-aud__wait { margin: 0; font-size: 13px; color: var(--ar-ink-faint); }

/* Two PANELS, not two columns of prose. Each audience gets a surface, a mark
   and a colour of its own, so which-is-which is legible before a number is
   read. A bare vertical rule between two identical text blocks made the card's
   whole idea — that these are different species — the one thing invisible. */
.ar-aud__split { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
/* The systems panels' own ground, not a private wash. The halves wore a
   faint amber for a while; once "What your site runs" landed above them,
   two cards of big panels in the same grammar sat on different paper —
   raised-neutral above, warm below — and the difference read as a mistake,
   not a meaning. One surface for both (2026-08-12). */
.ar-aud__half {
  min-width: 0; padding: 16px 18px 14px;
  border: 1px solid var(--ar-line); border-radius: var(--ar-radius);
  background: var(--ar-surface-2);
  display: flex; flex-direction: column;
}

.ar-aud__kind {
  margin: 0 0 8px; display: flex; align-items: center; gap: 7px;
  font-family: var(--ar-mono); font-size: 10.5px;
  letter-spacing: 0.14em; text-transform: uppercase; color: var(--ar-ink-faint);
}
.ar-aud__mark {
  display: inline-flex; align-items: center; justify-content: center;
  width: 22px; height: 22px; border-radius: 6px;
  background: var(--ar-surface); border: 1px solid var(--ar-line);
  color: var(--ar-ink-soft);
}

.ar-aud__n {
  margin: 0; font-family: var(--ar-serif); font-size: 38px; line-height: 1.03;
  font-weight: 600; color: var(--ar-ink); font-variant-numeric: tabular-nums;
}
.ar-aud__unit { margin: 2px 0 4px; font-size: 12.5px; color: var(--ar-ink-soft); }
/* The headline's second cut — sessions beside people, today beside the month.
   Same instrument as the number above it, so it belongs up here and NOT in
   the rows below, which answer a different question with a different tool. */
.ar-aud__second {
  margin: 0; font-size: 12.5px; color: var(--ar-ink-soft);
  font-variant-numeric: tabular-nums;
}
/* The fence. The rows under this caption are sources, not shares — without a
   label between them and the headline the column reads as a breakdown, and an
   owner subtracts. Set in the same mono kicker as HUMANS / MACHINES so it
   reads as structure rather than as another fact. */
.ar-aud__group {
  margin: 15px 0 6px; font-family: var(--ar-mono); font-size: 10px;
  letter-spacing: 0.1em; text-transform: uppercase; color: var(--ar-ink-faint);
}
/* Direction, in the row that carries it. Never coloured red for "down": a
   quiet month is information, not a fault, and this card does not grade. */
.ar-aud__trend {
  font-style: normal; font-family: var(--ar-mono); font-size: 11px;
  color: var(--ar-ink-faint); white-space: nowrap;
}
.ar-aud__trend::before { content: "· "; }
.ar-aud__trend.is-up { color: var(--ar-good); }

/* Both sides carry the same number of rows, so the panels end level instead of
   one trailing whitespace the other has filled. */
/* One row shape, three rows a side, separated by hairlines rather than gaps:
   a list this short reads faster as a small table than as floating lines. */
.ar-aud__rows { list-style: none; margin: 0; padding: 0; }
.ar-aud__rows li {
  display: flex; align-items: baseline; gap: 12px; font-size: 13px;
  padding: 7px 0; border-bottom: 1px solid var(--ar-line);
}
.ar-aud__rows li:first-child { border-top: 1px solid var(--ar-line); }
.ar-aud__row-n {
  flex: 0 0 auto; min-width: 3.4ch; text-align: right;
  font-family: var(--ar-mono); font-weight: 700; color: var(--ar-ink);
  font-variant-numeric: tabular-nums;
}
.ar-aud__row-l { color: var(--ar-ink-soft); min-width: 0; }
.ar-aud__rows li.is-bad .ar-aud__row-n { color: var(--ar-bad); }
.ar-aud__off { font-style: normal; color: var(--ar-ink-faint); }
.ar-aud__off::before { content: "· "; }
/* Why a visit count can exceed a people count, said on the row that raises
   the question. Same recessive weight as __off — it explains the number
   beside it, it does not compete with it. */
.ar-aud__hint { font-style: normal; color: var(--ar-ink-faint); }
.ar-aud__hint::before { content: "— "; }

/* Pinned to the bottom of its panel so the two links sit on one line. */
.ar-aud__go { margin-top: auto; padding-top: 14px; align-self: flex-start; }
/* No hover pill here. The shared .ar-linkbtn tint is right for a link sitting
   inside a sentence; standing alone at the foot of a panel it becomes a slab —
   and a tinted slab on an already-tinted surface. A footer action gets a
   link's own affordance instead: it darkens and underlines. */
.ar-aud__go:hover,
.ar-aud__go:focus-visible {
  background: none;
  color: color-mix(in srgb, var(--ar-accent) 82%, var(--ar-ink-hard));
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* "Worth knowing" — three short facts, each marked with whose half it is
   about. The column headings BOTH / HUMANS / MACHINES were three shouted
   words above three quiet sentences, and "both" is a word nobody says. The
   marks are the ones already standing at the top of each panel, so the tie is
   made without any words at all. Amber, and warmer than the panels, because a
   note about the numbers should not look like another number. */
/* The owner's sketch, exactly (2026-08-11, third and final layout): bulb +
   WORTH KNOWING in the note's own gold, a short divider bar, then two equal
   columns of chip + stacked facts with another bar between them. Everything
   gold derives from --ar-warn-deep so both themes keep their own amber. */
/* Ground = the panels' own surface-2 with a slight amber cast (his call,
   2026-08-12, same round that retired the halves' wash): the note sits on
   the same paper as the cards above it, warmed just enough to read as a
   note rather than as a separate warm room. The gold frame, chips and bulb
   keep carrying its identity; only the fill quieted. */
.ar-aud__note {
  --ar-note: color-mix(in srgb, var(--ar-note-glow) 8%, var(--ar-surface-2));
  margin-top: 14px; padding: 13px 17px 14px;
  background: var(--ar-note);
  border: 1px solid color-mix(in srgb, var(--ar-note-glow) 85%, var(--ar-line));
  border-radius: var(--ar-radius);
  display: flex; align-items: flex-start; flex-wrap: wrap; gap: 10px 16px;
}
/* Dark: the same recipe over dark's surface-2, cast with the theme's own
   note-gold so Default-neutral and Coffee each keep their temperature. */
:root[data-ar-theme="dark"] .ar-aud__note {
  --ar-note: color-mix(in srgb, var(--ar-note-gold) 8%, var(--ar-surface-2));
  border-color: color-mix(in srgb, var(--ar-note-gold) 55%, var(--ar-line));
}
.ar-aud__note-t {
  margin: 0; flex: 0 0 auto; display: flex; align-items: center; gap: 8px;
  font-family: var(--ar-mono); font-size: 10.5px; font-weight: 700;
  letter-spacing: 0.12em; text-transform: uppercase; color: var(--ar-note-gold);
}
/* The bulb, gold and LIT: a soft radial halo behind it (the sketch's glow),
   fading to nothing well before its box so it reads as light, not a chip. */
.ar-aud__note-i {
  flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center;
  width: 28px; height: 28px; margin: -5px 0;
  color: var(--ar-note-gold);
  background: radial-gradient(circle, color-mix(in srgb, var(--ar-note-glow) 30%, transparent) 0%, color-mix(in srgb, var(--ar-note-glow) 12%, transparent) 45%, transparent 72%);
}
/* A short vertical bar, not a full-height rule — the sketch's own divider. */
.ar-aud__note-sep {
  flex: 0 0 auto; width: 1px; height: 20px; margin-top: 1px;
  background: color-mix(in srgb, var(--ar-note-gold) 45%, transparent);
}
.ar-aud__note-cols {
  flex: 1 1 auto; min-width: 0;
  display: flex; align-items: flex-start; gap: 16px;
}
.ar-aud__note-group {
  flex: 1 1 0; min-width: 0;
  display: grid; grid-template-columns: max-content minmax(0, 1fr);
  gap: 10px 13px; align-items: start;
}
.ar-aud__note-chip {
  font-family: var(--ar-mono); font-size: 10px; font-weight: 600; letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--ar-note-gold);
  border: 1px solid color-mix(in srgb, var(--ar-note-gold) 55%, transparent);
  border-radius: 999px; padding: 3px 12px 4px; margin-top: -2px;
}
.ar-aud__note-facts {
  min-width: 0; display: flex; flex-direction: column; gap: 12px;
  font-size: 12.5px; line-height: 1.5; color: var(--ar-ink-soft);
}
/* Narrow: eyebrow row, then the groups stacked, chip above its facts. */
@container (max-width: 720px) {
  .ar-aud__note-sep { display: none; }
  .ar-aud__note-cols { flex: 1 1 100%; flex-direction: column; gap: 12px; }
  .ar-aud__note-group { grid-template-columns: 1fr; gap: 7px; }
  .ar-aud__note-chip { justify-self: start; }
}

/* ---------------------------------------------------------------------------
   "What your site runs" — the systems roll-up between the tiles and the
   audience card. Four panels in the audience card's own grammar: mono kicker
   + mark, one serif headline number, hairline rows, a footer link. Neutral
   ground (surface-2) — and since 2026-08-12 the audience halves share it,
   so the dashboard's two big-panel cards sit on one paper. Tokens only:
   every WP admin colour-scheme dark dialect in schemes.css re-keys it for
   free.
   --------------------------------------------------------------------------- */
/* Mirrors .ar-aud__head: a plain block, so the title keeps its line and the
   lead's masthead rule spans the card. (.ar-card__head's flex row broke both.) */
.ar-sys__head { margin-bottom: 16px; }
.ar-sys__wait { margin: 0; font-size: 13px; color: var(--ar-ink-faint); }
.ar-sys__grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.ar-sys__panel {
  min-width: 0; padding: 16px 18px 14px;
  border: 1px solid var(--ar-line); border-radius: var(--ar-radius);
  background: var(--ar-surface-2);
  display: flex; flex-direction: column;
}
.ar-sys__kind {
  margin: 0 0 8px; display: flex; align-items: center; gap: 7px;
  font-family: var(--ar-mono); font-size: 10.5px;
  letter-spacing: 0.14em; text-transform: uppercase; color: var(--ar-ink-faint);
}
.ar-sys__mark {
  display: inline-flex; align-items: center; justify-content: center;
  width: 22px; height: 22px; border-radius: 6px;
  background: var(--ar-surface); border: 1px solid var(--ar-line);
  color: var(--ar-ink-soft);
}
.ar-sys__n {
  margin: 0; font-family: var(--ar-serif); font-size: 38px; line-height: 1.03;
  font-weight: 600; color: var(--ar-ink); font-variant-numeric: tabular-nums;
}
.ar-sys__n--off { color: var(--ar-ink-faint); }
.ar-sys__unit { margin: 2px 0 12px; font-size: 12.5px; color: var(--ar-ink-soft); }
.ar-sys__rows { list-style: none; margin: 0; padding: 0; }
.ar-sys__rows li {
  display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  font-size: 13px; padding: 7px 0; border-bottom: 1px solid var(--ar-line);
}
.ar-sys__rows li:first-child { border-top: 1px solid var(--ar-line); }
.ar-sys__row-l { color: var(--ar-ink-soft); min-width: 0; }
.ar-sys__row-s {
  text-align: right; color: var(--ar-ink-soft); font-variant-numeric: tabular-nums;
}
.ar-sys__row-s strong { color: var(--ar-ink); font-weight: 650; }
/* Status words: good, warn, off — never a red "down"; off is information. */
.ar-sys__row-s em { font-style: normal; font-weight: 650; }
.ar-sys__row-s em.is-good { color: var(--ar-good); }
.ar-sys__row-s em.is-warn { color: var(--ar-warn); }
.ar-sys__row-s em.is-off { color: var(--ar-ink-faint); }
/* Footer link pinned level across panels, same affordance as the audience's. */
.ar-sys__go { margin-top: auto; padding-top: 14px; align-self: flex-start; }
.ar-sys__go:hover,
.ar-sys__go:focus-visible {
  background: none;
  color: color-mix(in srgb, var(--ar-accent) 82%, var(--ar-ink-hard));
  text-decoration: underline;
  text-underline-offset: 3px;
}
@container (max-width: 720px) {
  .ar-sys__grid { grid-template-columns: 1fr; }
}
/* Dark: the row hairlines inside the six big cards sink into the panels'
   own ground. A half-step brighter with a faint warm cast — settled scheme
   by scheme with him (2026-08-12; the full line-strong version read too
   loud everywhere it was tried). Modern alone pins his exact #433f3f in
   schemes.css. Covers the first row's border-top too. */
:root[data-ar-theme="dark"] .ar-sys__rows li,
:root[data-ar-theme="dark"] .ar-aud__rows li {
  border-color: color-mix(in srgb, var(--ar-warn) 4%, color-mix(in srgb, var(--ar-line-strong) 40%, var(--ar-line)));
}

/* ---------------------------------------------------------------------------
   RESTORED. Everything from here to the tiles below was deleted by d21ec1d, a
   commit that only meant to rewrite the .ar-aud__note rules directly above and
   whose replacement hunk ran on past them. It took the page-head audience
   badge, the audience panels’ narrow-width stacking, the GA4 sub-section and
   the ENTIRE Readers screen with it — which is why that screen rendered as
   unstyled stacked text for twenty commits. Nothing here is new; it is the
   pre-d21ec1d text, minus the .ar-surface rule that was rewritten afterwards.
   --------------------------------------------------------------------------- */
@container (max-width: 720px) {
  .ar-aud__split { grid-template-columns: 1fr; }
}

/* The audience badge in the page head — whose numbers this screen counts.
   Two states only, and the pair is deliberately NOT colour-coded good/bad:
   neither audience is a problem, they are simply different readers. People
   take the accent (the colour the nav already uses for "you are here"),
   machines a neutral ink, so the eye reads them as two categories rather
   than a status. */
.ar__pagehead-aud {
  display: inline-block; vertical-align: 0.32em; margin-left: 10px;
  font-family: var(--ar-mono); font-size: 9.5px; font-weight: 600;
  letter-spacing: 0.12em; text-transform: uppercase;
  padding: 3px 8px; border-radius: 999px; white-space: nowrap;
}
.ar__pagehead-aud.is-people {
  color: var(--ar-accent);
  background: color-mix(in srgb, var(--ar-accent) 9%, var(--ar-surface));
  border: 1px solid color-mix(in srgb, var(--ar-accent) 26%, var(--ar-surface));
}
.ar__pagehead-aud.is-machines {
  color: var(--ar-ink-soft);
  background: var(--ar-surface-2);
  border: 1px solid var(--ar-line-strong);
}

/* The GA4 sub-section inside the Google card. Set in from the card's own edge
   with a rule above it, so it reads as a second grant on the same account
   rather than a second account. */
.ar-ga4 { margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--ar-line); }
.ar-ga4__title { margin: 0 0 6px; font-size: 13px; font-weight: 600; color: var(--ar-ink); }
.ar-ga4__row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; margin-top: 8px; }
.ar-ga4__input { max-width: 220px; font-family: var(--ar-mono); }
.ar-ga4__err { color: var(--ar-bad); }

/* ---------------------------------------------------------------------------
   Readers — one answer, then what to do about it.

   This card used to open with three totals, a bar and two paragraphs about how
   the numbers are measured. That is the author's interest, not the reader's.
   The reader has one question — did AI send me anyone, and is it growing — so
   the number that answers it is the largest thing on the screen and everything
   else is subordinate to it.
   --------------------------------------------------------------------------- */
.ar-rd__kicker {
  margin: 0; font-family: var(--ar-mono); font-size: 10.5px;
  letter-spacing: 0.14em; text-transform: uppercase; color: var(--ar-ink-faint);
}
.ar-rd__hero {
  margin: 4px 0 0; font-family: var(--ar-serif); font-size: 54px; line-height: 1;
  font-weight: 600; color: var(--ar-ink); font-variant-numeric: tabular-nums;
  display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;
}
.ar-rd__hero-u {
  font-family: var(--ar-sans, inherit); font-size: 15px; font-weight: 400;
  color: var(--ar-ink-soft); letter-spacing: 0;
}
.ar-rd__trend {
  margin: 10px 0 0; font-size: 13.5px; display: flex; align-items: baseline; gap: 6px;
}
.ar-rd__trend.is-up { color: var(--ar-good, var(--ar-accent)); }
.ar-rd__trend.is-down { color: var(--ar-bad); }
.ar-rd__trend.is-flat { color: var(--ar-ink-faint); }
.ar-rd__arrow { font-weight: 700; }
.ar-rd__context {
  margin: 10px 0 0; font-size: 13px; color: var(--ar-ink-soft); max-width: 70ch;
}

/* Two short lists, side by side: who sent them, and what they read. Both are
   things the owner can act on — unlike a total, which is only a mood. */
.ar-rd__cols {
  display: grid; grid-template-columns: 1fr 1fr; gap: 34px;
  margin-top: 22px; padding-top: 18px; border-top: 1px solid var(--ar-line);
}
.ar-rd__col { min-width: 0; }
.ar-rd__col-t { margin: 0 0 10px; font-size: 13px; font-weight: 600; color: var(--ar-ink); }
.ar-rd__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 7px; }
.ar-rd__list li {
  display: flex; align-items: baseline; gap: 12px; font-size: 13px;
  border-bottom: 1px solid var(--ar-line); padding-bottom: 6px;
}
.ar-rd__list li:last-child { border-bottom: 0; padding-bottom: 0; }
.ar-rd__list-l { color: var(--ar-ink); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ar-rd__list-l.is-path { font-family: var(--ar-mono); font-size: 12px; color: var(--ar-ink-soft); direction: ltr; }
.ar-rd__list-n {
  margin-left: auto; flex: 0 0 auto; font-family: var(--ar-mono); font-weight: 700;
  color: var(--ar-ink); font-variant-numeric: tabular-nums;
}

/* The rule divides the CARD; the measure holds the SENTENCE. They were one
   box, so the dashed line stopped at 82ch and read as a half-drawn border
   (his catch, 2026-08-15). Two boxes: the <p> spans the card and carries the
   rule, the <span> inside it keeps the reading width. */
.ar-rd__note {
  margin: 20px 0 0; padding-top: 12px; border-top: 1px dashed var(--ar-line-strong);
  font-size: 12px; line-height: 1.55; color: var(--ar-ink-faint);
}
.ar-rd__note > span { display: block; max-width: 82ch; }

@container (max-width: 720px) {
  .ar-rd__hero { font-size: 42px; }
  .ar-rd__cols { grid-template-columns: 1fr; gap: 22px; }
}

/* "Everyone who visited" — the human half, its own card above the AI one.
   Four cells, each a number with its label and one line of detail underneath,
   so a reader gets the shape of the month without opening anything. */
.ar-rd__grid {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 26px;
  margin: 18px 0 0;
}
.ar-rd__cell { min-width: 0; }
.ar-rd__cn {
  margin: 0; font-family: var(--ar-serif); font-size: 28px; line-height: 1.05;
  font-weight: 600; color: var(--ar-ink); font-variant-numeric: tabular-nums;
}
.ar-rd__cl { margin: 3px 0 0; font-size: 12.5px; color: var(--ar-ink-soft); }
.ar-rd__cs { margin: 5px 0 0; font-size: 11.5px; color: var(--ar-ink-faint); line-height: 1.45; }

.ar-rd__col--wide {
  margin-top: 22px; padding-top: 18px; border-top: 1px solid var(--ar-line);
}
.ar-rd--all { margin-bottom: 16px; }

@container (max-width: 900px) {
  .ar-rd__grid { grid-template-columns: repeat(2, 1fr); gap: 20px; }
}
@container (max-width: 480px) {
  .ar-rd__grid { grid-template-columns: 1fr; }
}

/* Insight lines under the AI headline — the interpretation a reader would
   otherwise have to do themselves. Key, value, figure: one grid, so the three
   columns line up down the list instead of drifting with the text length. */
.ar-rd__insights { list-style: none; margin: 16px 0 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.ar-rd__insights li { display: flex; align-items: baseline; gap: 12px; font-size: 13px; }
.ar-rd__ik { flex: 0 0 132px; color: var(--ar-ink-faint); font-size: 12px; }
.ar-rd__iv { color: var(--ar-ink); font-weight: 600; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ar-rd__iv.is-path { font-family: var(--ar-mono); font-size: 12px; font-weight: 400; }
.ar-rd__ip {
  margin-left: auto; font-family: var(--ar-mono); font-size: 12px; font-weight: 700;
  color: var(--ar-accent); font-variant-numeric: tabular-nums;
}

/* The GA4 footnote. It annotates the numbers; it must not weigh like them. */
.ar-rd__fine {
  margin: 18px 0 0; font-size: 11.5px; line-height: 1.5; color: var(--ar-ink-faint);
  display: flex; align-items: flex-start; gap: 7px; max-width: 78ch;
}
.ar-rd__fine-i {
  flex: 0 0 auto; width: 14px; height: 14px; border-radius: 50%; margin-top: 1px;
  border: 1px solid var(--ar-line-strong); color: var(--ar-ink-faint);
  font-size: 9px; font-weight: 700; font-style: normal;
  display: inline-flex; align-items: center; justify-content: center;
}

.ar-rd__list--wide li { padding-bottom: 8px; }

/* The AI filter: a toolbar, not a card.
   It used to be a full-width card headed "Narrow it down", which gave it the
   same visual weight as the cards holding the numbers — and weight reads as
   scope. It governs only the cards below it, so it loses the surface, the
   border and the serif heading, and keeps just a label, its reach, and the
   controls. The controls already sit in their own tinted box (.ar-log__filters),
   which is the only frame a toolbar needs. */
.ar-rdfilter { margin: 2px 0 0; }
.ar-rdfilter__bar {
  display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin-bottom: 9px;
}
.ar-rdfilter__t { margin: 0; font-size: 13px; font-weight: 600; color: var(--ar-ink); }
/* The whole point of the redesign, in six words. Quiet, because it is a
   qualifier — but present, because its absence is what made the control read
   as broken when the totals above it did not move. */
.ar-rdfilter__scope { margin: 0; font-size: 12px; color: var(--ar-ink-faint); }
/* Pushed to the far end: it reloads the report, it does not filter it, and
   sitting beside the controls made it look like a third button of that set. */
.ar-rdfilter__reload { margin-left: auto; }
/* No card padding to sit inside any more, so the status lines carry their own
   left edge — otherwise they hang off the page grid rather than lining up with
   the controls box above them. */
.ar-rdfilter .ar-ai__filternote,
.ar-rdfilter .ar-log__error,
.ar-rdfilter .ar-wd-empty { margin-left: 2px; }
/* The strip is not a card, so a skeleton styled for one would float on the
   page background. It gets the surface only while it is waiting. */
.ar-rdfilter .ar-skel {
  background: var(--ar-surface); border: 1px solid var(--ar-line);
  border-radius: var(--ar-radius); padding: 16px 18px;
}

/* No breakpoint here on purpose. I wrote one, measured it, and it never fired —
   this strip is not inside the container the query named. The plain flex-wrap
   already holds all three parts on one row down to 560px and drops the reach
   line cleanly below that, with nothing clipped at any width. A rule that
   cannot be shown firing is worse than no rule. */

/* The CDN caveat, folded. */
.ar-ai__cdn { margin: -4px 0 14px; }
.ar-ai__cdn > summary {
  cursor: pointer; font-size: 12px; color: var(--ar-ink-faint);
  list-style: none; display: inline-flex; align-items: center; gap: 6px;
}
.ar-ai__cdn > summary::-webkit-details-marker { display: none; }
.ar-ai__cdn > summary::before { content: "›"; transition: transform 0.15s ease; }
.ar-ai__cdn[open] > summary::before { transform: rotate(90deg); }
.ar-ai__cdn p { margin: 8px 0 0; font-size: 12px; line-height: 1.55; color: var(--ar-ink-soft); max-width: 80ch; }

/* The limits list, short form: three one-line notes, not four paragraphs.
   The heading carries its own Read more, so the fold is where the eye is. */
.ar-aud__limits-t { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.ar-aud__limits-t .ar-linkbtn { font-size: 11px; letter-spacing: 0; text-transform: none; }

/* The tiles stay WHITE. Softening them read as "these are less important",
   which is the wrong note for the first thing on the page — they are the
   premise, not a footnote. Their quietness comes from being small and from
   sitting above the cards, not from being greyed. */
.ar-dash-sum { margin-top: 4px; }
/* Breathing room before the privacy line, and less after it: the line belongs
   to the tiles above it, not to the card below. The page grid's own 22px row
   gap is what separated them, so it is pulled back rather than added to. */
.ar-surface .ar-dash-note { margin-top: 12px; }
.ar-surface { margin-bottom: -8px; }

/* The worklist, narrowed to one finding's pages. It replaces the tabs rather
   than sitting above them: the tabs count the whole list, and leaving them on
   screen beside a filtered view puts two contradictory counts side by side. */
.ar-work__picked {
  margin: 0; padding: 12px 26px; border-bottom: 1px solid var(--ar-line);
  font-size: 13px; color: var(--ar-ink-soft);
  display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;
}

/* "These are from before that" — shown when the tab has been away and a post
   may have been edited elsewhere. Amber rather than red: nothing is wrong, the
   screen is just no longer sure it is current. */
.ar-work__stale {
  margin: 0; padding: 10px 26px;
  background: color-mix(in srgb, var(--ar-warn-bright) 13%, var(--ar-surface));
  border-bottom: 1px solid color-mix(in srgb, var(--ar-warn-mid) 30%, var(--ar-line));
  font-size: 12.5px; color: var(--ar-ink-soft);
  display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap;
}

/* ---------------------------------------------------------------------------
   Brand marks — one vendor glyph, wherever a surface names a service. Filled
   in the surrounding ink by default; a shape declared stroked (the webhook
   glyph, which belongs to no vendor) draws as a line instead. Size is the
   caller's business — each surface sets its own.
   --------------------------------------------------------------------------- */
.ar-brandmark {
  display: inline-block; flex: none; vertical-align: middle;
  width: 1em; height: 1em; fill: currentColor;
}
.ar-brandmark .is-stroked {
  fill: none; stroke: currentColor; stroke-width: 1.7;
  stroke-linecap: round; stroke-linejoin: round;
}

/* ---------------------------------------------------------------------------
   Search Opportunities: each group folds, in the SAME dress the Google-index
   groups wear (his call, 2026-08-15) — the shared .ar-fold box, its drawn
   caret, the label with its count in parentheses. One control per group, not
   one per card: a group whose banner says "nothing to do here" is a stack of
   receipts, and twelve folds would be twelve clicks to answer one question.
   --------------------------------------------------------------------------- */
.ar-opp__group { margin: 12px 0; }
/* A heading in the outline, the summary's own type on screen. */
.ar-opp__foldtitle { margin: 0; font: inherit; color: inherit; }
/* The group's threshold note lives inside the fold now, so it must not carry
   the top margin it wore as a section-level aside. */
.ar-opp__group .ar-card__note { margin-top: 12px; }
/* The group's own qualifiers ride the summary line: the rank chip it always
   had, and — when nothing in the group can be acted on — that fact, so the
   fold is safe to leave closed. */
.ar-opp__group > summary .ar-opp__pos { font-weight: 400; }
.ar-opp__groupcount {
  font-family: var(--ar-mono); font-size: 10.5px; font-weight: 400;
  color: var(--ar-ink-faint);
}

/* The split-search finding announces itself as a SECTION, not as one more
   fold (his call, 2026-08-15): the folds above are a worklist's groups, this
   is a finding the Findings screen links straight into, and every row in it
   holds a live decision — it never collapses, so it must never look
   collapsible. Its head wears the quiet-note dress the rest of the plugin
   uses for an aside — surface-2 behind a left rule, no second border — so it
   frames the section without becoming a card inside a card. */
.ar-clsn { margin-top: 30px; }
.ar-clsn__intro {
  padding: 13px 16px 14px;
  padding-right: max(16px, 100% - 96ch);
  border-left: 2px solid var(--ar-line-strong);
  border-radius: 0 var(--ar-radius) var(--ar-radius) 0;
  background: var(--ar-surface-2);
}
.ar-clsn__band { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
/* The mark IS the thing: one search forking to two pages. Amber, like the
   count beside it — a split is a cost, not a verdict. */
.ar-clsn__mark {
  flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 30px; border-radius: 8px;
  color: var(--ar-warn);
  background: color-mix(in srgb, var(--ar-warn) 10%, transparent);
  border: 1px solid color-mix(in srgb, var(--ar-warn) 26%, var(--ar-line));
}
.ar-clsn__mark svg { width: 17px; height: 17px; display: block; }
.ar-clsn__title {
  margin: 0; font-size: 14.5px; font-weight: 700; letter-spacing: -0.01em;
  color: var(--ar-ink);
}
.ar-clsn__why { margin: 8px 0 0; font-size: 12.5px; line-height: 1.55; color: var(--ar-ink-soft); }

/* ---------------------------------------------------------------------------
   IN-APP NAVIGATION — one rule for every link that keeps you inside the app
   (his call, 2026-08-15). The plugin already owned two marks: → goes somewhere
   in here, ↗ leaves. What it did not own was the INLINE case, so those links
   were bare <a>s wearing wp-admin's blue underline — a local screen dressed as
   an outward hyperlink.

   The rule a reader learns once: NO MARK = you stay here, ↗ = you leave.
   In prose, accent + weight carries it (a glyph mid-sentence breaks the
   reading line); standing alone at the end of a card, the link types its own →.
   ⛔ No underline, ever — the underline is wp-admin's, not ours.
   --------------------------------------------------------------------------- */
.ar-go,
#agentimus-app a.ar-go,
#agentimus-app a.ar-go:link,
#agentimus-app a.ar-go:visited {
  /* It is a <button> now (AppLink) — an <a href> made the browser advertise an
     address in its status bar, so an in-app view change looked like a link to
     somewhere else. The button has to be un-buttoned back to text. */
  appearance: none;
  background: none;
  border: 0;
  padding: 0;
  font: inherit;
  cursor: pointer;
  color: var(--ar-accent);
  font-weight: 600;
  text-decoration: none;
  /* ⛔ NO hover pill on an inline link. A background wide enough to look
     deliberate has to bleed past the word (its padding handed back as negative
     margin), and that bleed paints straight over the words on either side —
     his call, 2026-08-15. The hover cue is the ink alone. */
  transition: color 0.15s ease;
}
/* ONE hover for every in-app navigation in the plugin — the inline kind and
   the standalone kind alike (his call, 2026-08-15; .ar-linkbtn's own pill is
   retired below). Colour alone was too quiet to see in the light theme, so the
   underline arrives WITH it: it is the one cue that cannot paint over the
   words on either side, and keeping it for hover only means the resting state
   still never looks like wp-admin's own blue links. */
.ar-go:hover,
.ar-go:focus-visible,
#agentimus-app a.ar-go:hover,
#agentimus-app a.ar-go:focus-visible,
.ar-linkbtn:hover,
.ar-linkbtn:focus-visible {
  color: color-mix(in srgb, var(--ar-accent) 55%, var(--ar-ink));
  background: none;
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
}
/* The standalone form shares the ink and the weight; it keeps its own spacing. */
.ar-linkbtn { font-weight: 600; }

/* ⛔ NO blanket recolour of classless links. There was one here — a "net" so a
   link added later could not leak wp-admin's blue — and it reached straight
   into the rail's endpoint list, which already had a considered look of its
   own, and repainted it (2026-08-15). A net that changes things nobody asked
   about is not a net. In-app navigation says so explicitly: .ar-go / AppLink.
   */

/* Data Sources: one button width for the WHOLE screen (his call, 2026-08-15).
   Every card here offers the same kind of act — connect a source, stop one —
   so a column of cards should answer with a column of identical buttons; two
   widths made the wider one read as the heavier act. The padding comes in a
   step, and the width is set so the longest label ("Disconnecting…") still
   fits without stretching anything. */
/* Width is this screen's rule; HEIGHT is the house's. Trimming the padding to
   slim these buttons dropped them to 28px while every other button in the
   plugin stands at 40 — measured, 2026-08-15. The width alone does the
   aligning now, and the house padding is left alone. */
[data-group="sources"] .ar-btn--small {
  min-width: 150px;
}
/* Every card here ends the same way: the stop sits at the FAR RIGHT of its own
   line, with room above it (his call, 2026-08-15). It is the card's exit — an
   exit belongs at the end and apart, not pressed against the last thing it
   would be mistaken for a part of. */
[data-group="sources"] .ar-card > .ar-btn--danger,
[data-group="sources"] .ar-ga4 > .ar-btn--danger {
  display: block;
  margin: 20px 0 0 auto;
}

/* ---------------------------------------------------------------------------
   OUTBOUND LINKS — the other half of the rule: every link that leaves this
   app wears ↗, and NONE of them types it by hand any more (34 hand-typed
   arrows removed on 2026-08-15; two outbound links were even wearing → , the
   in-app mark). The glyph comes from the one thing that is always true of an
   outward link — it opens a new tab — so a link added later cannot forget it.
   --------------------------------------------------------------------------- */
#agentimus-app a[target="_blank"]::after,
:is(.ar-modal, .ar-drawer) a[target="_blank"]::after {
  content: "\2197";
  margin-left: 0.28em;
  font-size: 0.85em;
  line-height: 1;
  vertical-align: 1px;
  opacity: 0.75;
}
/* No structural exceptions (audited 2026-08-15). The :has(> svg) / :has(> img)
   pair was written for icon-ONLY links, but CSS cannot see the difference
   between "an icon" and "an icon and three words" — and the audit found the
   app has no icon-only outbound link at all, while "Open in editor" (icon +
   words) was silently losing its mark to the guard. Button-shaped links keep
   it too: "Get a key ↗" is still a word with a mark beside it.

   The escape hatch is a class, not a shape, so opting out is a decision
   someone made rather than a side effect of the markup. */
#agentimus-app a[target="_blank"].ar-nomark::after,
:is(.ar-modal, .ar-drawer) a[target="_blank"].ar-nomark::after { content: none; }

/* A new tab is a new tab whoever opens it: these controls are <button>s that
   call window.open, so the attribute selector above can never see them. They
   name the promise themselves via this class. */
#agentimus-app .ar-newtab::after,
:is(.ar-modal, .ar-drawer) .ar-newtab::after {
  content: "\2197";
  margin-left: 0.28em;
  font-size: 0.85em;
  line-height: 1;
  vertical-align: 1px;
  opacity: 0.75;
}

/* ---------------------------------------------------------------------------
   THE TOOLTIP — one in the whole plugin (promoted out of the announcements
   ledger, 2026-08-15, when the data-source cards needed the same thing).

   A mark you can press, and a bubble that says the part the line has no room
   for: the network's own refusal, the technical original behind a plain
   sentence. ⛔ Never a native title= (his standing rule) — the sentence lives
   in aria-label for a screen reader and in the bubble for everyone else.
   --------------------------------------------------------------------------- */
.ar-tipwrap { position: relative; display: inline-flex; }
.ar-tipbtn {
  appearance: none; cursor: help; display: inline-flex; flex: none;
  /* A box with no text of its own puts its BOTTOM edge on a baseline row's
     baseline — which rides it high. Centre it against the line instead. */
  align-self: center;
  padding: 0; border: 0; background: transparent;
  color: var(--ar-ink-faint);
}
.ar-tipbtn svg {
  width: 15px; height: 15px; fill: none; stroke: currentColor; stroke-width: 1.7;
  stroke-linecap: round; stroke-linejoin: round;
}
.ar-tip {
  position: absolute; left: 50%; bottom: calc(100% + 8px); z-index: 5;
  width: max-content; max-width: 280px; padding: 8px 11px;
  transform: translateX(-50%);
  background: var(--ar-ink); color: var(--ar-surface);
  border: 1px solid var(--ar-line-strong); border-radius: var(--ar-radius);
  box-shadow: 0 10px 26px -14px color-mix(in srgb, var(--ar-shade) 70%, transparent);
  font-size: 12px; font-weight: 400; line-height: 1.45; text-align: left;
  white-space: normal; text-transform: none; letter-spacing: 0;
  opacity: 0; pointer-events: none; transition: opacity 0.12s ease;
}
.ar-tipbtn:hover + .ar-tip,
.ar-tipbtn:focus-visible + .ar-tip { opacity: 1; }
@media (prefers-reduced-motion: reduce) { .ar-tip { transition: none; } }

/* ---------------------------------------------------------------------------
   THE READINESS RAIL — his palette, 2026-08-15. Same card, same size, same
   layout: only the ink and the bullets change.

   What was wrong: the two loudest facts were dimmed and the two quiet ones
   were shouting. The score itself sat at 62% paper while every rung label and
   value was full accent green — so four rows that all say "fine" out-shouted
   the number they roll up into, and "11 to fix", the only thing on the card
   anyone can act on, was greyer than both.
   --------------------------------------------------------------------------- */
/* TWO TOKENS, ONE CARD (2026-08-15). Everything below used to name
   --ar-paper and --ar-good-on-ink directly, which is right only while this
   card is the LIGHT theme's ink panel. At night the card becomes --ar-surface
   and the rail's green becomes --ar-chrome, so paper-keyed text turned
   near-black ON a dark card and the band word kept a green its own ring had
   already left (his catch, 2026-08-15). The card now names its own face and
   its own green once; both themes set them, and nothing here can drift again. */
.ar-rail-card--readiness {
  --rail-face: var(--ar-paper);
  --rail-good: var(--ar-good-on-ink);
  /* The card reads QUIETER than the rest of the rail by day (his catch,
     2026-08-15), because by day it is the one inverted surface in the column:
     cream type on near-black. The pale cards beside it sit at the same 12:1
     and are fine — dark on light is what the whole admin runs at — but light
     on dark at that ratio blooms, worst of all on 12.5px mono. Same number,
     different physics, so it gets its own. */
  --rail-read: 76%;
}
:root[data-ar-theme="dark"] .ar-rail-card--readiness {
  --rail-face: var(--ar-ink);
  --rail-good: var(--ar-chrome);
  /* At night this card is no longer inverted — it is the same surface as its
     neighbours, so it reads at the rail's own level. */
  --rail-read: 74%;
}

/* The kicker names the card; it earns the accent. */
.ar-rail-card--readiness .ar-rail-card__label { color: var(--rail-good); }
/* The score is the headline — full paper, no veil. */
.ar-rail-card--readiness .ar-rail-gauge__num { color: color-mix(in srgb, var(--rail-face) 70%, transparent); }
/* The rungs read as a list again: plain paper for the words and the numbers,
   so the only colour left on a row means something. */
.ar-rail-card--readiness .ar-rung__name,
.ar-rail-card--readiness .ar-rung__count { color: color-mix(in srgb, var(--rail-face) var(--rail-read), transparent); }
/* The one actionable mark on the card wears the one warning colour. */
.ar-rail-card--readiness .ar-rung__todo { color: var(--ar-warn-on-ink); }

/* The bullets are RINGS, never filled discs (his call). The state still shows
   — it moves into the ring's own colour rather than its fill, so nothing is
   lost: green ring = done, amber = in progress, faint = not yet. */
.ar-rail-card--readiness .ar-rung__tick,
.ar-rail-card--readiness .ar-rung[data-state="done"] .ar-rung__tick {
  background: transparent;
  border-width: 2px;
  border-color: color-mix(in srgb, var(--rail-face) 40%, transparent);
}
.ar-rail-card--readiness .ar-rung[data-state="done"] .ar-rung__tick { border-color: var(--rail-good); }
.ar-rail-card--readiness .ar-rung[data-state="current"] .ar-rung__tick { border-color: var(--ar-warn-on-ink); }
/* The half-dot the "current" state used to draw inside the ring would fill it
   again — the ring's colour says it now. */
.ar-rail-card--readiness .ar-rung[data-state="current"] .ar-rung__tick::after { content: none; }

/* One green for the card: the next step stops being a different teal from
   everything above it. */
.ar-rail-card--readiness .ar-rail-link { color: var(--rail-good); }
.ar-rail-card--readiness .ar-rail-link:hover { color: color-mix(in srgb, var(--rail-good) 70%, var(--rail-face)); }

/* The band word takes the gauge's colour (his call, 2026-08-15). It used to be
   coloured by the READY/CLIMB state alone, so a 97% site read "Excellent" in
   plain white beside a green ring — the label and the thing it labels saying
   two different things. The blocked states keep their own colours below; they
   are about reachability, not about a score. */
.ar-rail-card--readiness .ar-rail-tier[data-tone="good"] .ar-rail-tier__name { color: var(--rail-good); }
.ar-rail-card--readiness .ar-rail-tier[data-tone="ok"] .ar-rail-tier__name { color: var(--ar-warn-on-ink); }
.ar-rail-card--readiness .ar-rail-tier[data-tone="low"] .ar-rail-tier__name { color: var(--ar-bad-on-ink); }
/* Blocked outranks tone: "Not reachable" is not a score. */
.ar-rail-card--readiness .ar-rail-tier[data-state="floor"] .ar-rail-tier__name { color: var(--ar-bad-on-ink); }
.ar-rail-card--readiness .ar-rail-tier[data-state="local"] .ar-rail-tier__name { color: var(--ar-warn-on-ink); }

/* The rail cards' label mark (his pick, 2026-08-15): the plugin's one mark
   shape — rounded square, glyph in the accent, its own faint wash and a
   hairline — a step smaller than the Integrations tile, because the rail is
   the quietest column on the screen and the label still has to lead. */
.ar-rail-card__label--mark {
  display: flex;
  align-items: center;
  gap: 9px;
  /* 4px, not the 11px a text-only label carries. The tile is 7px taller than
     the line it replaced, and the rail is already taller than the sticky
     viewport it sits in — so the mark pays for itself out of its own margin
     rather than pushing the footer off the bottom (his catch, 2026-08-15).
     It also reads right: a gap measured under a 15px line looks wider under a
     22px tile. */
  margin-bottom: 4px;
}
.ar-rail-card__mark {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  border-radius: 6px;
  color: var(--ar-accent);
  background: var(--ar-accent-wash);
  /* The same accent-tinted hairline the dashboard tiles wear — a plain
     --ar-line is warm sand against this cool wash, and the two tile families
     sit on the same screen. */
  border: 1px solid color-mix(in srgb, var(--ar-accent) 22%, var(--ar-line));
}
/* 12px, not 13 — the same glyph size .ar-sys__mark uses beside DOORS and
   SIGNALS on this very screen. Both are section labels in the same
   uppercase-mono dress, so they are one object, measured alike. */
.ar-rail-card__mark svg { width: 12px; height: 12px; display: block; }

/* The registrations row wears its whole state (his call, 2026-08-15).
   The alert state already coloured the entire row amber; the valid state
   coloured only the tick and left the words in plain ink — so "all good" and
   "something's wrong" were not the same kind of sentence. Now both say it the
   same way: ring, words and arrow together. */
.ar-rail-regcard.is-ok { color: var(--ar-good); }
.ar-rail-regcard.is-ok .ar-rail-regcard__go { color: var(--ar-good); }
.ar-rail-regcard__text { font-weight: 500; }
/* The ring is drawn, so the icon box is a box, not a line of text — centre it
   on the row rather than on a baseline it no longer has. */
.ar-rail-regcard__icon { display: inline-flex; align-items: center; }
.ar-rail-regcard__icon svg { width: 15px; height: 15px; display: block; }

/* The publish card's two parts: a quiet heading over each half, so "read" and
   "run" are told apart before anyone reaches for a switch. */
.ar-prov-part {
  margin: 18px 0 8px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ar-ink-faint);
}
.ar-prov-part:first-of-type { margin-top: 10px; }
/* A group whose plugin published nothing: the row stays so the owner sees
   everything their site holds, without a switch that could change nothing. */
.ar-prov-none {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 4px 10px;
  margin: 0;
  padding: 10px 0;
  border-bottom: 1px solid var(--ar-line);
  color: var(--ar-ink-faint);
}
.ar-prov-none strong { color: var(--ar-ink-soft); font-weight: 600; }
.ar-prov-none span { font-size: 12px; }

/* The publish switch, ON the row it governs (his call, 2026-08-15: the control
   belongs where the thing is read, not on a second screen). Small, at the end
   of the row's head line, so it never competes with the name. */
.ar-wd-switch { margin-left: auto; flex: 0 0 auto; display: inline-flex; align-items: center; cursor: pointer; }
/* ⚠️⚠️ THE ATTRIBUTE SELECTOR IS LOAD-BEARING, and the `:disabled` twin doubly so.
   wp-admin ships `input[type=checkbox]:disabled { opacity: .7 }` at specificity
   (0,2,1); our old `.ar-wd-switch input` was (0,1,1) and lost, so a DISABLED
   switch un-hid its native checkbox — dashicon tick and all — sitting inside our
   own track. Measured: live inputs computed opacity 0, disabled ones 0.7, and the
   width came back as 16px. ⛔ Never hide a form control with a single-class
   selector: wp-admin's element+state rules outrank it. */
.ar-wd-switch input[type="checkbox"],
.ar-wd-switch input[type="checkbox"]:disabled {
  position: absolute; opacity: 0; width: 0; height: 0; min-width: 0; margin: 0; border: 0;
}
.ar-wd-switch__track {
  position: relative; display: block; width: 34px; height: 19px;
  background: var(--ar-line-strong); border-radius: 999px; transition: background 0.18s;
}
.ar-wd-switch__track::after {
  content: ""; position: absolute; top: 2px; left: 2px; width: 15px; height: 15px;
  background: #fff; border-radius: 50%; transition: transform 0.18s;
}
.ar-wd-switch input:checked + .ar-wd-switch__track { background: var(--ar-good); }
.ar-wd-switch input:checked + .ar-wd-switch__track::after { transform: translateX(15px); }
.ar-wd-switch input:focus-visible + .ar-wd-switch__track { outline: 2px solid var(--ar-accent); outline-offset: 2px; }
/* The one rule under all the groups: a switch and two lines, set apart from the
   folds above it by its own top rule. */
.ar-wd-rule {
  display: flex; align-items: flex-start; gap: 12px;
  margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--ar-line);
  cursor: pointer;
}
.ar-wd-rule input { position: absolute; opacity: 0; width: 0; height: 0; }
.ar-wd-rule .ar-wd-switch__track { margin-top: 1px; flex: 0 0 auto; }
.ar-wd-rule input:checked + .ar-wd-switch__track { background: var(--ar-good); }
.ar-wd-rule input:checked + .ar-wd-switch__track::after { transform: translateX(15px); }
.ar-wd-rule__text { display: flex; flex-direction: column; gap: 2px; }
.ar-wd-rule__text strong { font-size: 13.5px; font-weight: 600; color: var(--ar-ink); }
.ar-wd-rule__text small { font-size: 12px; color: var(--ar-ink-soft); }
/* The second line is the live count — the consequence, so it reads apart from
   the sentence that explains whose decision this is. */
.ar-wd-rule__text small + small { color: var(--ar-ink-faint); }

/* ⭐ Agentimus is never one of the plugins it describes (his call, 2026-08-15) —
   its row still leads its group and still wears the accent bar. ⛔ The "Agentimus"
   CHIP is gone (his call, 2026-08-17): the row is titled "Jobs from Agentimus", so
   the chip said the same word twice, and we cannot badge any other vendor
   honestly — badging only ourselves was special pleading. Being set apart is now
   the bar and the order, not a label. */
.ar-wd-prov.is-ours .ar-wd-prov__bar { background: var(--ar-accent); }

/* A group the owner switched off, said in colour as well as in words (his call,
   2026-08-15): recessed ground, muted edge, quieter title. Not opacity — that
   would fade the very chip explaining WHY it looks different. The jobs are still
   listed because they still work; only the announcing stopped. */
.ar-fold.ar-wd-grp.is-off {
  border-color: var(--ar-line);
  background: var(--ar-surface-2);
}
.ar-fold.ar-wd-grp.is-off > summary,
.ar-fold.ar-wd-grp.is-off .ar-wd-foldtitle { color: var(--ar-ink-faint); }
.ar-fold.ar-wd-grp.is-off > summary::before { border-left-color: var(--ar-ink-faint); }
.ar-fold.ar-wd-grp.is-off .ar-wd-grp__names code,
.ar-fold.ar-wd-grp.is-off .ar-wd-grp__names span { color: var(--ar-ink-faint); }

/* THE NUMBER RAIL (his design, picked 2026-08-15). Order given by a hairline
   and a counter, not by furniture: the alternative put a bordered pill round
   every row, and twenty-three boxes compete with the names they are counting.
   Pills in this admin mean something — a count, a state — so spending one on an
   ordinal is the wrong currency.

   Zero-padded so 01 and 23 are the same width and the rail stays straight, mono
   so they line up by construction, in the accent so the eye can run the column
   without reading it. A tick per row ties each name to the rail; the rail alone
   left the numbers floating beside a list. */
.ar-wd-grp__names { counter-reset: ar-joblist; position: relative; }
/* The rail itself: inset top and bottom so it starts and ends WITH the list
   rather than running past the first and last tick. */
.ar-wd-grp__names::before {
  content: "";
  position: absolute;
  top: 7px;
  bottom: 7px;
  /* 26 (the list's padding) + 22 (the number) + 8 (half the gap) — measured
     against the number's right edge and the name's left edge, not guessed. */
  left: 56px;
  width: 1px;
  background: var(--ar-line);
}
.ar-wd-grp__names li {
  counter-increment: ar-joblist;
  position: relative;
  gap: 16px; /* the rail lives in this gap, between the number and the name. */
}
.ar-wd-grp__names li::before {
  content: counter(ar-joblist, decimal-leading-zero);
  flex: 0 0 22px;
  text-align: right;
  font-family: var(--ar-mono);
  font-size: 11px;
  letter-spacing: 0.02em;
  color: var(--ar-accent);
}
/* ⛔ NO tick per row. There was one, and it sat on top of the second digit —
   every number read "0". The rail and the numbers already carry the order
   between them; a mark on each row was decoration fighting the thing it marked,
   and the simplest fix for a decoration that breaks the content is to not have
   it. (It also could not be placed safely: the rail is positioned against the
   list and a row's mark against the row, two spaces 26px apart.) */
/* Switched off: the rail and its numbers go quiet with the rest of the group. */
.ar-fold.ar-wd-grp.is-off .ar-wd-grp__names li::before { color: var(--ar-ink-faint); }

/* Inline code chips, readable in BOTH themes (his catch, 2026-08-15: "I don't
   see the highlight/bg in the dark mode").

   The chips inherited a global `code, kbd` rule painting rgba(0,0,0,0.07) — 7%
   BLACK. On the light canvas that is the grey box he expects; on the dark one it
   is black on near-black, so every inline path, token and ability name lost its
   chip. It was never our rule, but it is our screen.

   currentColor rather than a surface token, so the chip is always a tint of the
   text it wraps: dark ink on light ground, light ink on dark. And wrapped in
   :where() so this weighs NOTHING — it lands at the same specificity as the
   global rule it replaces, and every component that sets its own chip (or
   deliberately sets none, like the well-known paths and the code samples) still
   wins without needing to know this exists. */
:where(#agentimus-app) code,
:where(#agentimus-app) kbd {
  background: color-mix(in srgb, currentColor 11%, transparent);
}
