/* ============================================================================
   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 40px so the footer lines up with the
   full-bleed app. */
#wpfooter { padding-left: 40px; padding-right: 40px; 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;
  --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) */

  --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; } }

#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;
}
#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; }
#agentimus-app code { font-family: var(--ar-mono); font-size: 0.86em; }

/* 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 rgba(20, 107, 100, 0.16); }
  to   { box-shadow: 0 0 0 2px rgba(20, 107, 100, 0), 0 0 0 7px rgba(20, 107, 100, 0); }
}
#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); }

/* ---- 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;
  transition: opacity 0.15s;
}
.ar__brand:hover { opacity: 0.82; }
.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 rgba(27, 25, 19, 0.25);
}
/* 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;
}

/* Brand / nav separator — a small right-pointing arrow whose tip is a gold gem:
   two angled bars meet at a framed gold node that points toward the menu. The gold
   echoes the version line + logo crossbar, the ring echoes the logo's framed mark.
   Sets the masthead apart from the menu; no motion, no layout shift. */
.ar__sep {
  flex: 0 0 auto;
  align-self: center;
  display: inline-flex;
  /* The bar uses a uniform 26px gap; pull the arrow in toward the brand so it sits
     closer to the logo/wordmark, leaving the arrow → menu spacing untouched. */
  margin-left: -10px;
}
.ar__sep svg { display: block; }
.ar__sep-chev {
  stroke: var(--ar-line-strong);
  stroke-width: 1.4;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.ar__sep-ring { stroke: rgba(173, 123, 24, 0.45); stroke-width: 1; }
.ar__sep-node { fill: var(--ar-warn); filter: drop-shadow(0 0 2px rgba(173, 123, 24, 0.45)); }

/* 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); }

/* ---- Nav "Activity to review" badge + dropdown ------------------------- */
.ar__review { flex: 0 0 auto; align-self: center; position: relative; margin-left: auto; }
.ar__review-btn {
  appearance: none; cursor: pointer;
  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; }
.ar__review-count {
  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);
}
.ar__review-pop {
  position: absolute; top: calc(100% + 8px); right: 0; z-index: 60;
  width: 400px; max-width: calc(100cqw - 32px);
  max-height: 72vh; overflow-y: auto;
  background: var(--ar-surface); border: 1px solid var(--ar-line-strong); border-radius: var(--ar-radius);
  box-shadow: 0 14px 36px -12px rgba(27, 25, 19, 0.45);
  padding: 16px 18px;
}
.ar__review-pop-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.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); }
/* Dropdown rows always stack (container queries key off the app width, not the popover). */
.ar__review-pop .ar-susp-row { grid-template-columns: 1fr; row-gap: 8px; padding: 12px 0; }
.ar__review-pop .ar-susp-row:first-child { padding-top: 6px; }
.ar__review-pop .ar-susp-row__action { justify-self: start; text-align: left; max-width: none; }
/* 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__review-head-right { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; justify-content: flex-end; }
.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: rgba(47, 122, 76, 0.45); color: var(--ar-good); background: rgba(47, 122, 76, 0.08); }
.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. */
  height: var(--ar-bar-h);
  display: flex; flex-direction: column; justify-content: center;
  padding: 0 34px;
  background: var(--ar-surface);
  border-bottom: 1px solid var(--ar-line);
}
/* #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: rgba(243, 240, 231, 0.92);
}
.ar-rail-tier[data-state="top"] .ar-rail-tier__name { color: #5cc08a; }
.ar-rail-tier[data-state="floor"] .ar-rail-tier__name { color: #e08a72; }
.ar-rail-tier__sub {
  font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase;
  color: rgba(243, 240, 231, 0.45);
}

/* 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: rgba(243, 240, 231, 0.4);
}
.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; }
.ar-rung__count { font-size: 11px; opacity: 0.85; }
.ar-rung[data-state="done"] { color: #5cc08a; }
.ar-rung[data-state="done"] .ar-rung__tick { background: currentColor; }
.ar-rung[data-state="current"] { color: #e0b24c; }
.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 {
  display: block; width: 100%; 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 0 0; font-family: var(--ar-mono); font-size: 12px; color: rgba(243, 240, 231, 0.5); }

/* Dark variant of the Readiness rail card. Double class so it outranks the base
   .ar-rail-card background regardless of source order. */
.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: rgba(243, 240, 231, 0.5); }
.ar-rail-card--readiness .ar-rail-gauge__track { stroke: rgba(243, 240, 231, 0.15); }
.ar-rail-card--readiness .ar-rail-gauge__num { color: rgba(243, 240, 231, 0.62); }
.ar-rail-card--readiness .ar-rail-allgood { color: #5cc08a; }
/* Brightened gauge tones for contrast on the dark card. */
.ar-rail-card--readiness .ar-rail-gauge__fill[data-tone="good"] { stroke: #5cc08a; }
.ar-rail-card--readiness .ar-rail-gauge__fill[data-tone="ok"] { stroke: #e0b24c; }
.ar-rail-card--readiness .ar-rail-gauge__fill[data-tone="low"] { stroke: #e08a72; }
.ar-rail-card--readiness .ar-rail-link { color: #57b6a6; }
.ar-rail-card--readiness .ar-rail-link:hover { color: #6fc7b8; }

/* ---- 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: #fffefb;
  border-radius: 8px;
  overflow: hidden;
  box-shadow: 0 14px 36px -10px rgba(27, 25, 19, 0.42), 0 0 0 1px rgba(27, 25, 19, 0.06);
  font-family: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace;
}
.ar-toast__bar { flex: 0 0 4px; background: #9a937f; }
.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: #1b1913;
}
.ar-toast__msg { font-size: 13px; line-height: 1.4; color: #4a463d; }

.ar-toast.is-success .ar-toast__bar { background: #2f9e5e; }
.ar-toast.is-success .ar-toast__title { color: #1d7a45; }
.ar-toast.is-error .ar-toast__bar { background: #c0392b; }
.ar-toast.is-error .ar-toast__title { color: #a3271a; }
.ar-toast.is-warning .ar-toast__bar { background: #d99a1c; }
.ar-toast.is-warning .ar-toast__title { color: #936713; }
.ar-toast.is-info .ar-toast__bar { background: #3a6ea5; }
.ar-toast.is-info .ar-toast__title { color: #2c5680; }

/* 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;
}
.ar__main { display: grid; gap: 22px; min-width: 0; }
/* 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 checks are 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; }
.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 {
  appearance: none; background: none; border: 0; padding: 10px 0 0; 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 { margin: 9px 0 0; font-size: 12px; color: var(--ar-good); }
/* 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;
  font-family: var(--ar-mono); font-size: 12.5px; color: var(--ar-ink); text-decoration: none;
}
.ar-rail-links a::before { content: "↳"; color: var(--ar-accent); }
.ar-rail-links a:hover { 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: rgba(47, 122, 76, 0.12); 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: rgba(173, 123, 24, 0.45); }
.ar-rail-card--validation.is-bad { border-color: rgba(185, 60, 43, 0.45); }
.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; }
}

/* Narrow widths: stack the header into two rows. Row 1 is the brand alone; row 2
   is the navbar — all tabs on a single line at the left with the bell pinned to
   the right (a touch smaller) so the notification sits on the menu row. The tab
   strip keeps every item on one line, scrolling horizontally only if the screen
   is too narrow for all of them. */
@container (max-width: 720px) {
  .ar__bar {
    flex-wrap: wrap;
    align-items: center;
    /* Row-gap applies twice across the invisible break line → ~12px brand↔nav. */
    gap: 6px 16px;
    padding: 11px 16px;
    min-height: 0;
  }
  /* Repurpose the brand→nav arrow as an invisible full-width line break: it bumps
     the tabs + bell onto the row below while leaving the brand its own top row —
     without turning the brand button itself into a full-width tap target. */
  .ar__sep { display: block; flex-basis: 100%; height: 0; margin: 0; }
  .ar__sep svg { display: none; }
  /* Condense the masthead: drop the version line, shrink the mark + wordmark. */
  .ar__ver { display: none; }
  .ar__mark { width: 26px; height: 26px; }
  .ar__logo { width: 16px; }
  .ar__name { font-size: 15px; }
  /* Navbar row: all tabs stay on ONE line at the left; the labels tighten a
     touch so every one fits on typical small screens, and if the viewport is
     narrower than that the strip scrolls horizontally (scrollbar hidden) rather
     than wrapping a tab onto its own row. The bell stays pinned right;
     flex-basis:0 lets the strip shrink-to-fit beside it. */
  .ar__tabs {
    flex: 1 1 0; min-width: 0;
    flex-wrap: nowrap;
    overflow-x: auto;
    gap: 16px;
    /* Spread the tabs across the full strip so they reach toward the bell instead
       of bunching at the left with dead space before it. space-between only
       distributes EXISTING free space, so when the strip is too narrow it collapses
       to the gap and scrolls — it can never force an overflow. */
    justify-content: space-between;
  }
  .ar__tab { letter-spacing: 0.07em; font-size: 10.5px; white-space: nowrap; }
  .ar__review { flex: 0 0 auto; align-self: center; }
  /* 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; }
  .ar__pagehead { padding-left: 16px; padding-right: 16px; }
  .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; }
}

/* 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-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); }
.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);
}
.ar-card__lead { margin: 0 0 18px; color: var(--ar-ink-soft); font-size: 13px; max-width: 95ch; }
/* Quiet aside that clarifies a control's scope (e.g. "advertises, not enforces"). */
.ar-card__note {
  margin: 14px 0 0; padding: 9px 12px; max-width: 88ch;
  border-left: 2px solid var(--ar-line-strong); border-radius: 0 var(--ar-radius) var(--ar-radius) 0;
  background: #faf8f2; 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; }
/* 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 {
  background: var(--ar-surface);
  border: 1px solid var(--ar-line);
  border-radius: var(--ar-radius);
  /* 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;
}
.ar-tabpanel__tabs {
  display: flex; gap: 0;
  background: var(--ar-surface-2);
  border-bottom: 1px solid var(--ar-line);
  border-radius: var(--ar-radius) var(--ar-radius) 0 0;
  overflow-x: auto; scrollbar-width: none; -ms-overflow-style: none;
}
.ar-tabpanel__tabs::-webkit-scrollbar { display: none; }
.ar-subnav__item {
  appearance: none; cursor: pointer; background: transparent; border: 0;
  flex: 1 1 0; min-width: max-content; white-space: nowrap; text-align: center;
  padding: 14px 20px;
  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;
}
.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);
  margin-bottom: -1px;                                   /* cover the tab-row rule… */
  border-bottom: 1px solid var(--ar-surface);            /* …so the body merges in */
  box-shadow: inset 0 2px 0 0 var(--ar-accent);          /* top accent indicator */
}
.ar-subnav__item:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: -2px; }
/* On a phone, clamp the tabs so all five fit one row instead of scrolling off
   the edge: smaller type, tighter tracking, slimmer padding. Their total
   max-content then fits a typical (≥360px) viewport; the strip keeps
   overflow-x:auto as a graceful fallback for anything narrower. */
@media (max-width: 600px) {
  .ar-tabpanel__tabs .ar-subnav__item {
    padding: 12px 6px;
    font-size: 10px;
    letter-spacing: 0.02em;
  }
}

/* Slim section description, a band under the tabs. */
.ar-tabpanel__body { min-width: 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;
}
.ar-tabpanel__caption {
  margin: 0; padding: 11px 26px; font-size: 12.5px; color: var(--ar-ink-soft);
  border-bottom: 1px solid var(--ar-line);
}

/* 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: 0; counter-reset: arcard; }
.ar-tabpanel .ar-card {
  border: 0; border-radius: 0; background: transparent;
  border-top: 1px solid var(--ar-line);
}
.ar-tabpanel .ar-group > .ar-card:first-child { border-top: 0; }
.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; 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); }

/* 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: #d8d2c2; 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; }

/* "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: #fff; 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: rgba(173, 123, 24, 0.08); border: 1px solid rgba(173, 123, 24, 0.35); }
.ar-dbgcard.is-fail { background: rgba(180, 40, 40, 0.07); border: 1px solid rgba(180, 40, 40, 0.35); }
.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: #bcdcc6; background: #eef5f0; }
.ar-signal-state.is-block { color: var(--ar-bad); border-color: #e6c1b9; background: #f8ebe8; }

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

/* 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 {
  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);
}

.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: #fffefb; 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 rgba(20, 107, 100, 0.13);
}
.ar-input--sm { width: 96px; font-family: var(--ar-mono); }
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 rgba(27, 25, 19, 0.06);
}
.ar-svc:first-of-type { margin-top: 6px; }
.ar-svc__row { display: flex; flex-wrap: wrap; gap: 8px; padding-right: 24px; }
.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; }
.ar-svc__x {
  position: absolute;
  top: 5px;
  right: 6px;
  width: 22px;
  height: 22px;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  font-size: 18px;
  line-height: 1;
  color: var(--ar-ink-soft);
  background: transparent;
  border: 0;
  border-radius: 4px;
  cursor: pointer;
  transition: background 0.15s, color 0.15s;
}
.ar-svc__x:hover { background: rgba(27, 25, 19, 0.08); color: var(--ar-ink); }
/* Plain text button, right-aligned. */
.ar-svc__add {
  display: block;
  width: fit-content;
  margin: 8px 0 0 auto;
  padding: 2px 0;
  font-size: 13px;
  color: var(--ar-accent);
  background: transparent;
  border: 0;
  cursor: pointer;
}
.ar-svc__add:hover { text-decoration: underline; }
.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: #eef5f3; }

/* 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;
}

.ar-linkbtn {
  appearance: none; background: none; border: 0; padding: 0; margin-left: 4px; cursor: pointer;
  font: inherit; color: var(--ar-accent); text-decoration: underline;
}
.ar-linkbtn:hover { color: var(--ar-ink); }

/* 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; text-decoration: none; }
.ar-types-bar .ar-linkbtn:hover { text-decoration: underline; }

/* 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: #fffefb; 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: #2f9e5e; }

.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: #fffefb; 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: #f0f6f4; }
.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: "✓"; position: absolute; top: 8px; right: 11px;
  font-size: 11px; line-height: 1; font-weight: 700; color: var(--ar-accent);
}
/* 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; }

.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;
}

/* ---- 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;
  color: inherit; font-family: inherit; font-size: inherit; line-height: 1.3;
}
.ar-tags__edit:hover { text-decoration: underline; text-underline-offset: 2px; }
.ar-tags__x {
  appearance: none; border: 0; background: none; cursor: pointer;
  color: rgba(243, 240, 231, 0.6); font-size: 15px; line-height: 1; padding: 0;
}
.ar-tags__x:hover { color: var(--ar-paper); }

/* ---- 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); }

/* ---- Actions ------------------------------------------------------------ */
.ar-actions { display: flex; justify-content: flex-end; }
.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: #000; box-shadow: 0 6px 18px -8px rgba(27, 25, 19, 0.7); }
.ar-btn:active:not(:disabled) { transform: translateY(1px); }
.ar-btn:disabled { opacity: 0.5; cursor: default; }
.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: var(--ar-paper); box-shadow: 0 6px 18px -8px rgba(185, 60, 43, 0.6); }

/* ---- 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) ------------------------------ */
.ar-modal {
  position: fixed; inset: 0; z-index: 100001;
  display: flex; align-items: center; justify-content: center;
  padding: 20px;
  background: rgba(27, 25, 19, 0.42);
  -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px);
}
.ar-modal__panel {
  display: flex; flex-direction: column;
  width: 100%; max-width: 560px; max-height: min(calc(100vh - 40px), 600px); overflow: hidden;
  background: var(--ar-surface); border: 1px solid var(--ar-line-strong);
  border-radius: 10px;
  box-shadow: 0 24px 60px -20px rgba(27, 25, 19, 0.5);
}
.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, rgba(255, 253, 247, 0), 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: #bcdcc6; background: #eef5f0; }
.ar-preview__state.is-off { color: var(--ar-ink-soft); border-color: var(--ar-line-strong); background: #f4f1e8; }
.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; }
  .ar-modal__panel { max-height: calc(100vh - 20px); }
}

/* ---- 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: 600px; }
.ar-wiz__steps { display: flex; align-items: center; gap: 6px; }
.ar-wiz__dot { width: 7px; height: 7px; border-radius: 50%; background: var(--ar-line-strong); transition: background 0.2s ease; }
.ar-wiz__dot.is-on { background: var(--ar-accent); }
.ar-wiz__count { margin: 8px 0 0; font-family: var(--ar-mono); font-size: 10.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ar-ink-faint); }
.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); }
.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: #fff; 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 {
  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);
}
.ar-wiz__explore button:hover { border-color: var(--ar-line-strong); background: var(--ar-surface-2); }
.ar-wiz__explore button: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; }
}

/* ---- Readiness ---------------------------------------------------------- */
/* Each rung is a titled group of checks, with its own pass tally. */
.ar-checkgroup { margin-top: 26px; }
.ar-checkgroup:first-of-type { margin-top: 16px; }
.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: rgba(47, 122, 76, 0.55); }
.ar-checkgroup.is-warn .ar-checkgroup__head::after { background: rgba(173, 123, 24, 0.5); }
.ar-checkgroup.is-fail .ar-checkgroup__head::after { background: rgba(185, 60, 43, 0.5); }
.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 {
  display: flex; align-items: flex-start; gap: 16px;
  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 { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.ar-check__text strong { font-size: 14px; font-weight: 600; }
.ar-check__text small { color: var(--ar-ink-soft); font-size: 12.5px; }
.ar-check__fix {
  margin: 8px 0 0; padding: 8px 11px;
  font-size: 12.5px; line-height: 1.5; color: var(--ar-ink);
  background: var(--ar-paper); border-radius: 6px;
  border-left: 2px solid var(--ar-line-strong);
}
.ar-check.is-warn .ar-check__fix { border-left-color: var(--ar-warn); }
.ar-check.is-fail .ar-check__fix { border-left-color: var(--ar-bad); }
.ar-check__action {
  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: #bcdcc6; background: #eef5f0; }
.ar-check__tag.is-warn { color: var(--ar-warn); border-color: #e6d5a8; background: #f7f1df; }
.ar-check__tag.is-fail { color: var(--ar-bad); border-color: #e6c1b9; background: #f8ebe8; }
.ar-check__rule { flex: 0 0 auto; 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); }

/* 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; }
.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: rgba(173, 123, 24, 0.08);
  border: 1px solid rgba(173, 123, 24, 0.35); 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: rgba(173, 123, 24, 0.12); 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: rgba(173, 123, 24, 0.12); 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: rgba(74, 124, 89, 0.09);
  border: 1px solid rgba(74, 124, 89, 0.35); 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: rgba(180, 40, 40, 0.12); }
.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: rgba(180, 40, 40, 0.07); border-color: rgba(180, 40, 40, 0.35); }
.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; }

.ar-wd-canonical {
  display: flex; align-items: center; gap: 12px;
  margin: 4px 0 16px; padding: 13px 15px;
  background: #faf8f1; 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: #fff; background: var(--ar-accent); padding: 3px 7px; border-radius: 3px;
}
.ar-wd-canonical__path { flex: 1; font-family: var(--ar-mono); font-size: 13.5px; color: var(--ar-ink); }
.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: rgba(20, 107, 100, 0.08); }
.ar-wd-canonical__ext:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 1px; }
.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 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; }
}

/* 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; }
.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); }
.ar-wd-group__caret { font-size: 9px; transition: transform 0.15s ease; }
.ar-wd-group__caret.is-open { transform: rotate(90deg); }
.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: #bcdcc6; background: #eef5f0; }
.ar-wd-engine.is-off { color: var(--ar-bad); border-color: #e6c1b9; background: #f8ebe8; }

/* 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; }
.ar-wd-prov__head { display: flex; flex-wrap: wrap; align-items: center; gap: 9px; }
.ar-wd-prov__head strong { font-size: 14.5px; font-weight: 600; }
.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 #bcd9d4; background: #eef5f3; padding: 2px 7px; border-radius: 3px;
}
.ar-wd-type--agent { color: var(--ar-warn); border-color: #e6d5a8; background: #f7f1df; }
.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;
}

.ar-wd-eps { margin: 11px 0 0; padding: 0; list-style: none; display: grid; gap: 7px; }
.ar-wd-eps li { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; }
.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;
}
.ar-wd-eps code { font-size: 12px; color: var(--ar-ink); }
.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: #bcdcc6; background: #eef5f0; }
.ar-wd-auth.is-locked { color: var(--ar-warn); border-color: #e6d5a8; background: #f7f1df; }

@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; }
.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);
}
.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; }
.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: #bcd9d4; background: #eef5f3; }

.ar-wd-wk { margin: 14px 0 0; padding: 0; list-style: none; display: grid; gap: 10px; }
.ar-wd-wk li { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.ar-wd-wk a { text-decoration: none; }
.ar-wd-wk code { font-size: 12px; color: var(--ar-ink); border-bottom: 1px solid var(--ar-line-strong); }
.ar-wd-wk a:hover code { color: var(--ar-accent); border-bottom-color: var(--ar-accent); }
.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: #bcdcc6; background: #eef5f0; }
.ar-wd-src.is-managed { color: var(--ar-accent); border-color: #bcd9d4; background: #eef5f3; }

.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: #e6c1b9; background: #f8ebe8; }
.ar-wd-notice.is-warning .ar-wd-notice__tag { color: var(--ar-warn); border-color: #e6d5a8; background: #f7f1df; }

/* ---- 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. */
.ar-dash-sum { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.ar-dash-tile {
  appearance: none; cursor: pointer; text-align: left;
  display: flex; flex-direction: column; gap: 4px;
  padding: 15px 18px; 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;
}
.ar-dash-tile:hover { border-color: var(--ar-line-strong); box-shadow: 0 5px 16px -9px rgba(27, 25, 19, 0.4); }
.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, 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); }

/* 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 rgba(27, 25, 19, 0.55);
  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);
  border-radius: 7px; box-shadow: 0 10px 24px -10px rgba(27, 25, 19, 0.55);
  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;
}
/* 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: #e6e4dd; }

/* 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__pages { display: flex; flex-direction: column; gap: 5px; margin: 8px 0 0; }
.ar-optcheck__row { display: flex; align-items: center; gap: 12px; }
.ar-optcheck__page { flex: 1 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); }
.ar-optcheck__more { margin: 7px 0 0; font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-faint); }
/* Set-aside / restore actions — always visible, pinned to the right of the row. */
.ar-optcheck__aside, .ar-optcheck__restore {
  flex: 0 0 auto; margin-left: auto; appearance: none; background: none; cursor: pointer;
  padding: 3px 9px; font-family: var(--ar-mono); font-size: 11px; white-space: nowrap;
  border-radius: 6px; transition: color 0.15s ease, border-color 0.15s ease;
}
.ar-optcheck__aside { border: 1px solid var(--ar-line); color: var(--ar-ink-soft); }
.ar-optcheck__aside:hover, .ar-optcheck__aside:focus-visible { border-color: var(--ar-ink-faint); color: var(--ar-ink); }
.ar-optcheck__restore { border: 0; color: var(--ar-accent); padding: 3px 4px; }
.ar-optcheck__restore:hover, .ar-optcheck__restore:focus-visible { text-decoration: underline; }
.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". */
.ar-setaside { margin: 16px 0 0; padding: 14px 0 0; border-top: 1px dashed var(--ar-line); }
.ar-setaside__head { margin: 0 0 8px; font-family: var(--ar-mono); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ar-ink-faint); }
.ar-setaside__note { text-transform: none; letter-spacing: 0; margin-left: 6px; }

/* Day-report modal: a wider panel; header with prev/next + a day dropdown. */
.ar-modal__panel--day { max-width: 640px; }
.ar-day-head { display: flex; align-items: center; justify-content: space-between; gap: 10px 12px; margin-bottom: 8px; flex-wrap: wrap; }
.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); }
@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; }
.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); }
.ar-act-delta.is-down { color: var(--ar-bad); }
.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); }
.ar-act-more__caret { font-size: 8px; line-height: 1; }
.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; }
.ar-refspark__bar {
  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);
}
.ar-refspark__bar.is-zero { background: var(--ar-line); height: 2px !important; }

/* 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);
}
.ar-card__more .ar-linkbtn { display: inline-flex; align-items: center; gap: 4px; font-weight: 600; }
.ar-card__more .ar-linkbtn svg { transition: transform 0.18s ease; }
.ar-card__more .ar-linkbtn:hover svg { transform: translateX(2px); }
@media (prefers-reduced-motion: reduce) { .ar-card__more .ar-linkbtn svg { transition: none; } }
.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 4px; }
/* 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 -------------------------------- */
.ar-aiday { margin: 0; padding: 0; list-style: none; display: grid; gap: 4px; }
.ar-aiday__row {
  display: grid; grid-template-columns: minmax(0, 1fr) 90px auto auto; align-items: center; gap: 12px;
  /* Bleed 8px each side (width + negative margin) so the hover highlight has breathing
     room past the content, while the padding keeps the resting content aligned as before. */
  width: calc(100% + 16px); margin: 0 -8px; padding: 6px 8px; border: 0; background: transparent;
  cursor: pointer; text-align: left; color: inherit;
  border-radius: 6px; transition: background-color 0.12s ease;
}
.ar-aiday__row:hover { background: #f4f0e6; }
.ar-aiday__row:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; border-radius: 6px; }
.ar-aiday__date { font-size: 13px; color: var(--ar-ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ar-aiday__n { font-family: var(--ar-mono); font-size: 12px; color: var(--ar-ink-soft); text-align: right; min-width: 24px; }
.ar-aiday__chev { color: var(--ar-ink-faint); opacity: 0.7; transition: transform 0.2s ease, opacity 0.15s ease; }
.ar-aiday__row:hover .ar-aiday__chev { opacity: 1; color: var(--ar-ink-soft); }
.ar-aiday__chev.is-open { transform: rotate(180deg); }
/* min-width:0 at BOTH list levels. A grid item's default is min-width:auto — its
   min-content width — and here that is the un-wrappable <code> path, so the row simply
   refused to shrink: on a narrow card the path ran past the edge and pushed the hit count
   clean out of view. The path's own ellipsis can only bite once its ancestors may shrink. */
.ar-aiday__item { min-width: 0; }
.ar-aiday__detail {
  margin: 0 0 8px 2px; padding: 6px 0 2px 12px; list-style: none; display: grid; gap: 7px;
  border-left: 2px solid var(--ar-line);
  min-width: 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: #e6e4dd; }
.ar-aivis__n { margin-left: auto; flex: 0 0 auto; font-family: var(--ar-mono); font-size: 12px; color: var(--ar-ink-soft); }
@media (prefers-reduced-motion: reduce) { .ar-aiday__chev { transition: opacity 0.15s ease; } }

/* 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, rgba(255, 253, 247, 0), 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: rgba(20, 107, 100, 0.08); 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: 7px 14px 7px 0; text-align: left; vertical-align: middle; white-space: nowrap; }
.ar-act-table th:first-child, .ar-act-table td:first-child { padding-left: 2px; }
.ar-act-table thead th {
  position: sticky; top: 0; z-index: 1; background: var(--ar-surface);
  font-family: var(--ar-sans); font-size: 10px; font-weight: 700; letter-spacing: 0.07em;
  text-transform: uppercase; color: var(--ar-ink-faint);
  padding-top: 2px; 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: 600; 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; }

/* ---- Suspicious activity (UA-only abuse signals) ----------------------- */
.ar-susp-counts { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; flex: 0 0 auto; }
/* Small status pills — colours mirror the readiness notices (bad/warn/neutral). */
.ar-susp-badge {
  font-family: var(--ar-mono); font-size: 9.5px; font-weight: 600;
  letter-spacing: 0.08em; text-transform: uppercase;
  padding: 2px 6px; border-radius: 3px; border: 1px solid; white-space: nowrap;
}
.ar-susp-badge.is-spoof { color: var(--ar-bad); background: #f8ebe8; border-color: #e6c1b9; }
.ar-susp-badge.is-heavy { color: var(--ar-warn); background: #f7f1df; border-color: #e6d5a8; }
.ar-susp-badge.is-new { color: var(--ar-ink-soft); background: var(--ar-surface-2); border-color: var(--ar-line); }

.ar-susp-banner {
  margin: 0 0 14px; padding: 9px 13px; border-radius: var(--ar-radius);
  background: #f7f1df; border: 1px solid #e6d5a8; color: var(--ar-ink-soft); font-size: 12.5px;
}
.ar-susp-banner .ar-linkbtn { font-size: 12.5px; }

.ar-susp-list { margin: 6px 0 0; padding: 0; list-style: none; }
.ar-susp-row {
  display: grid; grid-template-columns: minmax(0, 1fr) auto;
  column-gap: 18px; align-items: center;
  padding: 13px 0; border-bottom: 1px solid var(--ar-line);
}
.ar-susp-row:first-child { padding-top: 4px; }
.ar-susp-row:last-child { border-bottom: 0; padding-bottom: 2px; }
.ar-susp-row__info { min-width: 0; display: grid; gap: 4px; }
.ar-susp-row__head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.ar-susp-row__agent { font-size: 13px; font-weight: 600; color: var(--ar-ink); }
.ar-susp-badges { display: inline-flex; gap: 5px; }
/* Identity card for a recognised crawler: a factual "who is this" (kind + operator
   + docs link), NOT a severity badge — it informs the Block/Allow choice without
   the plugin taking a side. */
.ar-susp-row__known { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.ar-susp-kind {
  font-family: var(--ar-mono); font-size: 9.5px; font-weight: 600;
  letter-spacing: 0.08em; text-transform: uppercase;
  padding: 2px 6px; border-radius: 3px; border: 1px solid; white-space: nowrap;
  color: var(--ar-ink-soft); background: var(--ar-surface-2); border-color: var(--ar-line);
}
.ar-susp-kind.is-ai { color: var(--ar-accent); background: #eef5f3; border-color: #bcd9d3; }
.ar-susp-kind.is-danger { color: var(--ar-bad); background: #f8ebe8; border-color: #e6c1b9; }
.ar-susp-row__by { font-size: 11.5px; color: var(--ar-ink-soft); }
.ar-susp-row__learn { font-size: 11px; color: var(--ar-accent); text-decoration: none; white-space: nowrap; }
.ar-susp-row__learn:hover { text-decoration: underline; }
.ar-susp-row__learn:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; border-radius: 2px; }
.ar-susp-row__unverified { font-size: 10.5px; color: var(--ar-ink-faint); font-style: italic; }
/* UA is quiet mono text, NOT a chip — neutralise wp-admin's <code> background/padding. */
.ar-susp-row__ua {
  font-family: var(--ar-mono); font-size: 11px; color: var(--ar-ink-faint);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%;
  background: none; padding: 0; border: 0;
}
.ar-susp-row__ua.is-copyable { cursor: pointer; }
.ar-susp-row__ua.is-copyable:hover { color: var(--ar-ink-soft); }
.ar-susp-row__ua.is-empty { font-style: italic; }
.ar-susp-row__meta { font-family: var(--ar-mono); font-size: 10.5px; color: var(--ar-ink-faint); }
.ar-susp-row__action { justify-self: end; text-align: right; max-width: 230px; }
/* Text-style action buttons — one per row, each a DISTINCT colour so the choice is
   scannable at a glance: Block (red) · Allow (green) · Check this bot (teal) · Ignore
   (grey). Sans, not mono, so a multi-word label like "Check this bot" reads tight. */
.ar-susp-block,
.ar-susp-allow,
.ar-susp-check-btn,
.ar-susp-ignore-btn {
  appearance: none; cursor: pointer; white-space: nowrap;
  font-family: var(--ar-sans); font-size: 12px; font-weight: 600; letter-spacing: 0;
  padding: 0; border: 0; background: none; margin: 0;
  transition: color 0.15s ease;
}
.ar-susp-block { color: var(--ar-bad); }        /* deny — red */
.ar-susp-allow { color: var(--ar-good); }       /* trust — green */
.ar-susp-check-btn { color: var(--ar-info); }   /* inspect — blue (distinct from Allow) */
.ar-susp-ignore-btn { color: var(--ar-ink-soft); } /* set aside — grey */
.ar-susp-block:hover,
.ar-susp-allow:hover,
.ar-susp-check-btn:hover,
.ar-susp-ignore-btn:hover { text-decoration: underline; }
.ar-susp-ignore-btn:hover { color: var(--ar-ink); }
.ar-susp-check-btn.is-on { text-decoration: underline; }
.ar-susp-block:focus-visible,
.ar-susp-allow:focus-visible,
.ar-susp-check-btn:focus-visible,
.ar-susp-ignore-btn:focus-visible { outline: 2px solid var(--ar-accent); outline-offset: 2px; border-radius: 2px; }
.ar-susp-block:disabled,
.ar-susp-allow:disabled,
.ar-susp-check-btn:disabled,
.ar-susp-ignore-btn:disabled { color: var(--ar-ink-faint); cursor: default; text-decoration: none; }
.ar-susp-blocked { font-family: var(--ar-mono); font-size: 11px; color: var(--ar-good); white-space: nowrap; }
.ar-susp-reason { margin: 0; font-size: 11px; font-style: italic; color: var(--ar-ink-faint); line-height: 1.45; }
/* A caught impersonator has no safe one-click action — its status line is a red alert,
   not a faint aside. */
.ar-susp-reason.is-alert { color: var(--ar-bad); font-style: normal; font-weight: 400; }

/* Action cell: an optional status line above a SINGLE row that holds every action —
   Block · Allow · Check this bot · Ignore — so they never split across two lines. */
.ar-susp-row__action { display: flex; flex-direction: column; gap: 7px; }
.ar__review-pop .ar-susp-row__action { align-items: flex-start; }
.ar-susp-row__buttons { display: flex; flex-flow: row wrap; align-items: baseline; column-gap: 16px; row-gap: 6px; }

/* "Check this bot" verdict card — spans the row, tinted by verdict tone. */
.ar-susp-check {
  grid-column: 1 / -1; margin-top: 2px;
  padding: 11px 13px; border-radius: var(--ar-radius);
  background: var(--ar-surface-2); border: 1px solid var(--ar-line);
  border-left: 3px solid var(--ar-ink-faint);
  display: grid; gap: 6px;
}
.ar-susp-check.is-danger { border-left-color: var(--ar-bad); background: #f8ebe8; border-color: #e6c1b9; }
.ar-susp-check.is-warn { border-left-color: var(--ar-warn); }
.ar-susp-check.is-ok { border-left-color: var(--ar-good); }
.ar-susp-check.is-info { border-left-color: var(--ar-accent); }
.ar-susp-check__title { margin: 0; font-size: 12.5px; font-weight: 600; color: var(--ar-ink); }
.ar-susp-check.is-danger .ar-susp-check__title { color: var(--ar-bad); }
.ar-susp-check__detail { margin: 0; font-size: 12px; color: var(--ar-ink-soft); line-height: 1.5; }
.ar-susp-check__rec { margin: 0; font-size: 12px; color: var(--ar-ink); line-height: 1.5; }
.ar-susp-check__doclink {
  justify-self: start; font-size: 11.5px; color: var(--ar-accent); text-decoration: none; white-space: nowrap;
}
.ar-susp-check__doclink:hover { text-decoration: underline; }
.ar-susp-check__doclink.is-unverified { color: var(--ar-ink-soft); font-style: italic; }
.ar-susp-check__research { display: flex; align-items: baseline; flex-wrap: wrap; gap: 10px; margin-top: 1px; }
.ar-susp-check__reslabel { font-size: 11px; color: var(--ar-ink-faint); }
.ar-susp-check__reslink { font-size: 11.5px; color: var(--ar-accent); text-decoration: none; white-space: nowrap; }
.ar-susp-check__reslink:hover { text-decoration: underline; }
.ar-susp-check__note {
  margin: 3px 0 0; padding-top: 7px; border-top: 1px dashed var(--ar-line);
  font-size: 11px; color: var(--ar-ink-faint); font-style: italic; line-height: 1.5;
}
.ar-susp-check__note .ar-linkbtn { font-style: normal; }

@container (max-width: 600px) {
  /* Stack the action under the info so a long "Block <token>" never crushes the row. */
  .ar-susp-row { grid-template-columns: 1fr; row-gap: 9px; }
  .ar-susp-row__action { justify-self: start; text-align: left; max-width: none; }
}

/* ======================================================================
   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-rev-tab.is-active { background: var(--ar-surface); color: var(--ar-ink); font-weight: 600; box-shadow: 0 1px 2px rgba(27, 25, 19, 0.09); }
.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: #faf3e4; 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: #eccdc6; background: #fdf6f4; }
.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: #f8e5e0; color: var(--ar-bad); border-color: #eccdc6; }
.ar-rev-avatar.is-warn { background: #f6eeda; color: var(--ar-warn); border-color: #e6d6b0; }
.ar-rev-avatar.is-ok { background: #e7f2ea; color: var(--ar-good); border-color: #c4ddca; }
.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: #eef5f3; border-color: #c8e0da; }
.ar-rev-tag.is-heavy { color: var(--ar-warn); background: #f7efdd; border-color: #e6d6ad; }

/* 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: #f8e9e5; color: #8c2f22; }
.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; }
.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: #bcdcc6; }
.ar-rev-btn--allow:hover:not(:disabled) { background: #edf5ef; }
.ar-rev-btn--block { color: var(--ar-bad); border-color: #e6c1b9; }
.ar-rev-btn--block:hover:not(:disabled) { background: #f9ece9; }
.ar-rev-link {
  appearance: none; cursor: pointer; border: 0; background: none; padding: 0;
  font-family: var(--ar-sans); font-size: 12px; font-weight: 500; color: var(--ar-ink-soft);
  transition: color 0.14s ease;
}
.ar-rev-link:hover { color: var(--ar-ink); text-decoration: underline; }
.ar-rev-link:disabled { color: var(--ar-ink-faint); cursor: default; text-decoration: none; }
.ar-rev-link--details { color: var(--ar-info); }
.ar-rev-link--details.is-on { text-decoration: underline; }

/* 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); }
/* 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: #f1e7d7; 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: #eef5f3; }
.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; }

/* ---- Loading skeleton (activity first load) ---------------------------- */
.ar-skel { display: grid; gap: 14px; margin-top: 16px; }
.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; }
.ar-skel__box, .ar-skel__line {
  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 { 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; } }

.ar-fade-enter-active, .ar-fade-leave-active { transition: opacity 0.2s; }
.ar-fade-enter-from, .ar-fade-leave-to { opacity: 0; }

@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); }
.ar-about-item {
  display: flex; align-items: flex-start; justify-content: space-between; gap: 14px;
  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;
}
.ar-about-item__desc { margin: 4px 0 0; font-size: 12.5px; line-height: 1.5; color: var(--ar-ink-soft); max-width: 80ch; }
.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: #bcdcc6; background: #eef5f0; }

/* 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); }
.ar-about-priv__cell--head {
  display: flex; gap: 14px; align-items: flex-start; background: var(--ar-ink); border-color: var(--ar-ink);
}
.ar-about-priv__cell--head h3 { color: var(--ar-paper); }
.ar-about-priv__cell--head p { color: rgba(243, 240, 231, 0.72); }
.ar-about-priv__cell--head .ar-linkbtn { color: #57b6a6; }
.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: #5cc08a; background: rgba(92, 192, 138, 0.14);
}
.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: #e9e4d6; 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); }
.ar-about-faq__caret { flex: 0 0 auto; color: var(--ar-ink-faint); transition: transform 0.15s ease; }
.ar-about-faq__item.is-open .ar-about-faq__caret { transform: rotate(90deg); 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; }
  .ar-about-item { flex-direction: column; }
  .ar-about-tag { align-self: flex-start; }
}

/* 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: #9a9ea4;
  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: 2px; }

.ar-log__filters {
  padding: 14px 16px; margin-bottom: 18px;
  background: var(--ar-surface-2); 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; }

.ar-log__verdict {
  margin-left: 8px; padding: 1px 6px; border-radius: 3px;
  font-family: var(--ar-mono); font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase;
}
.ar-log__verdict.is-verified { color: var(--ar-good); border: 1px solid currentColor; }
.ar-log__verdict.is-spoofed  { color: var(--ar-bad);  border: 1px solid currentColor; }
.ar-act-table tr.is-spoofed td { background: color-mix(in srgb, var(--ar-bad) 5%, transparent); }

.ar-log__seen { color: var(--ar-ink-faint); font-family: var(--ar-mono); font-size: 11px; }

.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%; }
  .ar-log__actions .ar-btn { flex: 1 1 auto; }
}

/* ---- "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 rgba(27, 25, 19, 0.05), 0 18px 36px -20px rgba(27, 25, 19, 0.5);
  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: rgba(20, 107, 100, 0.08); 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). */
.ar-log-note {
  margin: 18px 0 0; padding-top: 14px; border-top: 1px solid var(--ar-line);
  font-size: 12px; line-height: 1.65; color: var(--ar-ink-soft); max-width: 78ch;
}
.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; }

/* ---------------------------------------------------------------------------
   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;
}

.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; }
.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; }

.ar-aa__table { width: 100%; border-collapse: collapse; margin: 0 0 16px; }
.ar-aa__table th {
  text-align: left; padding: 8px 10px;
  font-family: var(--ar-mono); font-size: 10px; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.06em;
  color: var(--ar-ink-faint); border-bottom: 1px solid var(--ar-line-strong);
  white-space: nowrap;
}
.ar-aa__table td {
  padding: 10px; font-size: 13px; color: var(--ar-ink-soft);
  border-bottom: 1px solid var(--ar-line); vertical-align: top;
}
.ar-aa__table tr.is-unseen td { background: rgba(20, 107, 100, 0.045); }
.ar-aa__what { display: block; font-weight: 600; color: var(--ar-ink); }

/* 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. */
.ar-aa__limits {
  margin: 0; padding-top: 14px; border-top: 1px solid var(--ar-line);
  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. */
.ar-aa__new {
  display: inline-block; margin-left: 6px; 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; }
