/**
 * Eventonomy UI — single source-of-truth design system (ux-foundation compliant).
 *
 * One file, the entire admin UI vocabulary: 3-layer tokens + 6 component
 * primitives (page shell, card, button, input, badge, empty) + the admin page
 * compositions that build on them (settings sidebar-nav, dashboard stats,
 * health table, list rows). Everything is scoped to `.evnm-admin` so it never
 * leaks into wp-admin chrome.
 *
 * Rules honoured: single CSS file (R9), token-only values (R6), Lucide-sized
 * icons (R5), 40px tap targets (R13), :focus-visible rings (R14), empty-state
 * primitive (R15), logical properties for RTL, dark mode via root token
 * override, exactly two @media blocks at the file bottom.
 */

/* ============================================================
   Layer 2 — semantic tokens (fall back to WP/theme Layer 1)
   Declared on :root so BOTH admin and frontend blocks read the
   same design system (ux-foundation Rule 9 — one source of truth).
   ============================================================ */
:root {
	/* Brand / accent — adopt the host theme's primary colour so plugin
	   buttons and links match the site. Resolution order: BuddyX /
	   BuddyX-Pro (`--bx-color-accent`) -> Reign brand (`--reign-colors-theme`,
	   then its button background) -> WP-admin colour (admin screens) ->
	   default blue. NOTE: Reign's `--reign-accent-color` is the accent *text*
	   colour (white in several schemes), so it is deliberately NOT used here.
	   The theme vars live on `:root`, so this resolves correctly; only the
	   plugin reads --evnm-*, so adopting them never affects the theme's
	   styles. */
	/* Brand-first accent (QA card 10082261413): the plugin OWNS its accent by
	   default — BRAND.md grass green, accessible on white — so every install
	   gets the same premium identity instead of silently adopting whatever the
	   host theme's primary happens to be. Theme adoption is now an EXPLICIT
	   opt-in: a theme/site owner sets the override vars, e.g.
	     :root { --evnm-accent-override: var( --bx-color-accent ); }
	   (The pre-1.1.0 auto-adoption chain caused the RSVP surface to change
	   color per theme with no guaranteed floor.) */
	--evnm-brand: #4d7c0f;
	--evnm-brand-hover: #3f6212;
	--evnm-accent: var( --evnm-accent-override, var( --evnm-brand ) );
	--evnm-accent-hover: var( --evnm-accent-hover-override, var( --evnm-brand-hover ) );
	--evnm-accent-contrast: var( --evnm-accent-contrast-override, #fff );
	--evnm-accent-soft: #eef5df;

	/* Surfaces */
	--evnm-bg: #f6f7f7;
	--evnm-surface: #fff;
	--evnm-surface-alt: #f6f7f7;

	/* Chips that sit ON MEDIA (date chip + pills overlaid on a cover image).
	   These deliberately do NOT flip with the colour scheme: they float over a
	   photograph, not over the page background, so a photo-safe light plate with
	   dark ink is correct in BOTH modes. They exist as a PAIR because the bug
	   they fix was a hardcoded white background wearing a token-driven
	   foreground - the two followed different rules and diverged the moment the
	   theme went dark, leaving white text on a white chip. */
	--evnm-media-chip-surface: rgba( 255, 255, 255, 0.94 );
	--evnm-media-chip-ink: #1e1e1e;
	--evnm-media-chip-ink-muted: #50575e;
	/*
	 * Accent ink for text ON that plate - NOT --evnm-accent.
	 *
	 * The plate deliberately stays light in dark mode (it sits on a cover
	 * photo), but --evnm-accent brightens for dark backgrounds, so the month
	 * label on a date chip came out light-lime on white: measured 1.7-2.0:1,
	 * and the single-event date tile as low as 1.02:1 (QA re-check, card
	 * 10149465332). This one is pinned dark in both modes so every variant
	 * clears WCAG AA on the plate.
	 */
	--evnm-media-chip-accent: #3f6212;

	/* Text */
	--evnm-text: #1e1e1e;
	--evnm-text-muted: #50575e;
	--evnm-text-tertiary: #787c82;

	/* Lines */
	--evnm-border: #dcdcde;
	--evnm-border-strong: #c3c4c7;

	/* Status (foreground + soft background pairs, all contrast-verified) */
	--evnm-success: #00733f;
	--evnm-success-soft: #edfaef;
	--evnm-warning: #8a6100;
	--evnm-warning-soft: #fcf3e3;
	--evnm-danger: #b32d2e;
	--evnm-danger-soft: #fcf0f1;
	/* Danger has TWO jobs and they need different colours in dark mode:
	   --evnm-danger is a FILL (the destructive button, the "No" chip) and does
	   not change with the theme, while --evnm-danger-ink is danger as TEXT on
	   one of our surfaces and must lighten when the surface darkens. They are
	   the same value here because a light surface suits both. Mirrors the
	   --evnm-success-surface / --evnm-success-on-surface pair below. */
	--evnm-danger-ink: #b32d2e;
	--evnm-info: #2271b1;
	--evnm-info-soft: #f0f6fc;

	/* Spacing scale (8-step) */
	--evnm-space-xs: 4px;
	--evnm-space-sm: 8px;
	--evnm-space-md: 12px;
	--evnm-space-lg: 16px;
	--evnm-space-xl: 20px;
	--evnm-space-2xl: 24px;
	--evnm-space-3xl: 32px;
	--evnm-space-4xl: 48px;

	/* Radius */
	--evnm-radius-sm: 4px;
	--evnm-radius-md: 8px;
	--evnm-radius-lg: 12px;
	--evnm-radius-full: 9999px;

	/* Shadow */
	--evnm-shadow-sm: 0 1px 2px rgba( 0, 0, 0, 0.05 );
	--evnm-shadow-md: 0 2px 8px rgba( 0, 0, 0, 0.08 );
	--evnm-shadow-lg: 0 12px 28px rgba( 0, 0, 0, 0.12 );
	/* Upward shadow for pinned bottom bars (sticky action/save bars). */
	--evnm-shadow-up: 0 -6px 16px rgba( 0, 0, 0, 0.08 );

	/* Typography — chain to the theme's body font (BuddyX exposes
	   --global-font-family; Reign/others fall through to `inherit` = the theme
	   body font) so event pages match the site. Admin re-defines this token below
	   with a fixed stack, since wp-admin has its own font context. */
	--evnm-font: var( --global-font-family, inherit );
	--evnm-fs-sm: 12px;
	--evnm-fs-base: 13px;
	--evnm-fs-md: 14px;
	--evnm-fs-lg: 16px;
	--evnm-fs-xl: 20px;
	--evnm-fs-2xl: 24px;

	/* Controls */
	--evnm-control-h: 40px;
	--evnm-control-h-sm: 32px;
	--evnm-badge-size: 20px;

	/* Motion */
	--evnm-transition: 160ms cubic-bezier( 0.4, 0, 0.2, 1 );
	--evnm-transition-slow: 300ms cubic-bezier( 0.4, 0, 0.2, 1 );

	/* Map embed treatment — none in light mode; the dark palettes below swap
	   in an invert/hue-rotate filter so the keyless OSM tiles read as a dark
	   map instead of a bright white slab (D1). Blocks consume it via
	   `filter: var( --evnm-map-filter, none )` on the iframe. */
	--evnm-map-filter: none;

	/* Success SURFACE pair (confirmation cards, e.g. the RSVP confirmed
	   state). Light mode aliases the soft palette; the dark palettes below
	   override BOTH so a large success card reads dark-green-on-dark instead
	   of a bright mint slab. Chips keep using the raw soft tokens. */
	--evnm-success-surface: var( --evnm-success-soft );
	--evnm-success-on-surface: var( --evnm-success );
}

.evnm-admin {
	/* wp-admin has no theme body font to inherit — keep a fixed system stack. */
	--evnm-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
	font-family: var( --evnm-font );
	color: var( --evnm-text );
}

/* ============================================================
   Frontend page shell — the premium container for every
   Eventonomy frontend surface (calendar, list, single, editor).
   ============================================================ */
.evnm-fullwidth {
	width: 100%;
}

.evnm-page {
	max-width: 1200px;
	margin-inline: auto;
	padding: var( --evnm-space-3xl ) var( --evnm-space-xl );
}

/* Shared frontend navigation across event surfaces. */
.evnm-event-nav {
	display: flex;
	flex-wrap: wrap;
	gap: var( --evnm-space-xs );
	margin-block-end: var( --evnm-space-2xl );
	padding-block-end: var( --evnm-space-md );
	border-block-end: 1px solid var( --evnm-border );
}

.evnm-event-nav__link {
	display: inline-flex;
	align-items: center;
	min-height: var( --evnm-control-h );
	padding: 0 var( --evnm-space-lg );
	border-radius: var( --evnm-radius-md );
	color: var( --evnm-text-muted );
	font-weight: 600;
	text-decoration: none;
	transition: background var( --evnm-transition ), color var( --evnm-transition );
}

.evnm-event-nav__link:hover {
	background: var( --evnm-surface-alt );
	color: var( --evnm-text );
}

.evnm-event-nav__link.is-active {
	background: var( --evnm-accent-soft );
	color: var( --evnm-accent );
}

.evnm-event-nav__link:focus-visible {
	outline: 2px solid var( --evnm-accent );
	outline-offset: 2px;
}

/* Space stacked Eventonomy blocks on a browse page. */
.evnm-page > * + * {
	margin-block-start: var( --evnm-space-2xl );
}

/* Frontend dark mode — switch the plugin's surfaces/text to dark whenever
   the host theme signals dark. The Wbcom family (BuddyX 5.1+, BuddyX-Pro,
   Reign 8+) emits these signals, all covered here:
     - `[data-bx-mode="dark"]`  modern shared toggle on <html> (explicit dark)
     - `[data-bx-mode="auto"]`  modern toggle following the OS (see @media below)
     - `body.dark-scheme`       legacy Reign customizer colour scheme
     - `.dark-mode`             legacy BuddyX html/body dark class
   Only the plugin reads --evnm-*, so overriding them never affects the
   theme's own styles. Mirrors Reign's own `.dark-scheme,[data-bx-mode=dark]`. */
/* Single dark palette for every class-based trigger - the frontend theme
   signals above PLUS the admin's manual [data-theme="dark"] opt-in (we never
   fight wp-admin's light chrome unless the surface explicitly requests it). One
   selector list = one source of truth, so a token change can't drift between
   triggers (the drift that once made Reign dark render light cards). */
.dark-mode,
body.dark-scheme,
[data-bx-mode="dark"],
.evnm-admin[data-theme="dark"] {
	--evnm-bg: #1a1c1f;
	--evnm-surface: #26282b;
	--evnm-surface-alt: #2f3135;
	--evnm-text: #f0f0f1;
	--evnm-text-muted: #c3c4c7;
	--evnm-text-tertiary: #a7aaad;
	--evnm-border: #3c3f44;
	--evnm-border-strong: #4f5359;
	--evnm-accent-soft: #26330f;
	/* Dark brand: the BRAND.md dark-bg lockup greens — bright lime accent with
	   near-black ink for contrast (the light pair would vanish on dark). */
	--evnm-brand: #84cc16;
	--evnm-brand-hover: #a3e635;
	--evnm-accent-contrast: var( --evnm-accent-contrast-override, #16181d );
	/* Dark map treatment: invert + hue-rotate keeps road/label hues roughly
	   right while turning the OSM tiles dark; slightly desaturated + dimmed so
	   the embed sits with the dark surfaces instead of glowing. */
	--evnm-map-filter: invert( 0.88 ) hue-rotate( 180deg ) brightness( 0.95 ) contrast( 0.92 ) saturate( 0.6 );
	--evnm-success-surface: #17281e;
	--evnm-success-on-surface: #7bdca4;
	/* #b32d2e was chosen against white; on #2f3135 it measures 2.07:1, far
	   under the 4.5:1 AA floor, so every error message was unreadable in dark
	   mode. #f28b82 measures 5.45:1 on --evnm-surface-alt and 6.18:1 on
	   --evnm-surface. The FILL token is deliberately left alone. */
	--evnm-danger-ink: #f28b82;
	--evnm-danger-soft: #40191a;
}

/* Native form-control chrome inside plugin surfaces follows the palette
   (UX-P9): without color-scheme the browser paints datetime/date inputs'
   calendar icon and picker panel light-on-dark. Scoped to .evnm-scope so the
   THEME's own controls are untouched - the theme owns its color-scheme. */
.dark-mode .evnm-scope,
body.dark-scheme .evnm-scope,
[data-bx-mode="dark"] .evnm-scope {
	color-scheme: dark;
}

/* Modern toggle set to "auto" follows the operating-system preference. NOTE:
   a media query cannot share a selector list with the class triggers above, so
   these values are duplicated - keep them IN SYNC with the palette above. */
@media ( prefers-color-scheme: dark ) {
	[data-bx-mode="auto"] {
		--evnm-bg: #1a1c1f;
		--evnm-surface: #26282b;
		--evnm-surface-alt: #2f3135;
		--evnm-text: #f0f0f1;
		--evnm-text-muted: #c3c4c7;
		--evnm-text-tertiary: #a7aaad;
		--evnm-border: #3c3f44;
		--evnm-border-strong: #4f5359;
		--evnm-accent-soft: #26330f;
		--evnm-brand: #84cc16;
		--evnm-brand-hover: #a3e635;
		--evnm-accent-contrast: var( --evnm-accent-contrast-override, #16181d );
		--evnm-map-filter: invert( 0.88 ) hue-rotate( 180deg ) brightness( 0.95 ) contrast( 0.92 ) saturate( 0.6 );
		--evnm-success-surface: #17281e;
		--evnm-success-on-surface: #7bdca4;
		--evnm-danger-ink: #f28b82;
		--evnm-danger-soft: #40191a;
	}

	[data-bx-mode="auto"] .evnm-scope {
		color-scheme: dark;
	}
}

/* ============================================================
   Theme isolation (UX-A1) — systematic, theme-agnostic defense
   for every frontend block.

   `.evnm-scope` is injected centrally on every block's outermost
   element by BlockRegistrar::add_scope_class() (Pro blocks and
   child-theme template overrides included), so these rules cover
   ALL plugin frontend markup without per-block opt-in.

   Three layers, by cascade weight:

   1. ZERO-SPECIFICITY RESET (below, non-!important). Selectors are
      written as `:where(.evnm-scope) tag` — the scope contributes
      (0,0,0), the whole selector is (0,0,1) — so every plugin
      component class (0,1,0+) always wins, and UA defaults plus any
      theme property the theme does NOT set are normalized to the
      plugin baseline. Against a theme's own bare element selectors
      (`button {}`, `a {}` — also (0,0,1)) it ties, and the tie
      resolves by source order (stylesheet enqueued at priority 100 in
      FrontendAssetsProvider, printing after most themes; outliers
      like Reign@5001 keep their element-level typography ties, which
      is benign — decorative skinning is stopped by layers 2 + 3
      regardless of print order).

   2. TEXT-CONTROL GUARD (below, `!important` at zero specificity,
      var-indirected). Themes skin form controls with attribute
      selectors (`input[type="text"]` = (0,1,1)) that outrank the
      plugin's own component classes (0,1,0) — no specificity exists
      between the two, so the guard uses `!important` to win, and
      routes every value through `--evnm-field-*` custom properties
      (falling back to the input-primitive tokens) so plugin
      components can still re-skin a control by setting the variable
      on any normal-specificity class. All values are tokens: dark
      mode and brand adoption keep working.

   3. `.evnm-btn` COMPONENT GUARD (in the button-primitive section,
      `!important`). Kept because legacy Wbcom theme releases
      (BuddyX < 5.1, Reign < 8.x) paint every bare <button> via a
      ~(0,9,1) `button:not([class*=…])…` rule that a zero-spec reset
      provably cannot beat. Generalized from the old reactive
      `.evnm-dash` / `.evnm-event-editor` scopes to `.evnm-scope`.

   Why not @layer: unlayered styles beat layered styles, and theme
   styles are unlayered — putting this reset in a layer would make
   it WEAKER than the theme, the opposite of the goal.
   ============================================================ */

/* ---- Layer 0: the `hidden` attribute always wins ---------------- */

/* Every Interactivity `data-wp-bind--hidden` toggle relies on the HTML
   `hidden` attribute, but the UA's `[hidden]{display:none}` rule loses
   to ANY author `display:` — so every component rule like
   `.evnm-rsvp__success{display:flex}` left its node visible while
   "hidden" (false "You are registered" card next to the RSVP form,
   Pro recurrence panel showing for one-off events, ...). One guard at
   the scope root covers every block AND Pro/add-on seam markup instead
   of a per-class `&[hidden]` re-assert in each stylesheet. `!important`
   is deliberate (same rationale as the L2/L3 guards below): a nested
   `.wp-block-* .evnm-*` rule at (0,2,0) would outrank any un-imported
   attribute selector we could write. No component animates its hide,
   so nothing legitimately needs to beat this. The admin scope has the same
   hazard: `.evnm-admin .evnm-field{display:grid}` outranks the UA rule, so a
   server-rendered or JS-toggled `hidden` field (e.g. the conditional platform-
   fee inputs) stayed visible — the guard covers `.evnm-admin` too. */
.evnm-scope[hidden],
.evnm-scope [hidden],
.evnm-admin[hidden],
.evnm-admin [hidden] {
	display: none !important;
}

/* Border-box baseline: classic themes (Reign, BuddyX, most others) set a
   global `*{box-sizing:border-box}` reset, and every Eventonomy component
   was authored assuming it. Block themes (TT24/TT25) ship NO such reset,
   so `width:100%` + padding rules overflowed (e.g. the search-filter
   "Create event" button pushed 9px past a 390px viewport). Zero-specificity
   so any component that deliberately sets box-sizing still wins. */
:where(.evnm-scope),
:where(.evnm-scope) *,
:where(.evnm-scope) *::before,
:where(.evnm-scope) *::after {
	box-sizing: border-box;
}

/* ---- Layer 1: zero-specificity bare-tag reset ------------------- */

/* Buttons (and button-shaped inputs): strip every decorative property
   a theme skins (backgrounds, pills, shadows, uppercase) back to a
   text-button baseline; block styles build the real look on top. */
:where(.evnm-scope) button,
:where(.evnm-scope) input:where([type="button"], [type="submit"], [type="reset"]) {
	margin: 0;
	padding: 0;
	border: 0;
	border-radius: 0;
	background: none;
	color: inherit;
	font: inherit;
	letter-spacing: inherit;
	text-transform: none;
	text-decoration: none;
	text-shadow: none;
	box-shadow: none;
	cursor: pointer;
}

/* Unclassed (prose) links — e.g. inside notices or user-provided
   descriptions: keep them recognizable as links, but on the plugin's
   accent token (which chains to the theme brand) instead of whatever
   underline/color combination the theme applies. Classed plugin links
   style themselves and are untouched (0,1,0 beats this (0,0,1)). */
:where(.evnm-scope) a:where(:not([class])) {
	color: var( --evnm-accent );
	text-decoration: underline;
	text-underline-offset: 2px;
}

/* Plugin-classed links default to NO underline: block themes underline
   every link via `a:where(:not(.wp-element-button))` — also (0,0,1), a
   tie this stylesheet wins by printing later — which otherwise draws
   underlines under non-prose link content (card covers, monogram
   placeholders, icon links). A component that wants an underline
   declares it on its class (0,1,0). */
:where(.evnm-scope) a:where([class*="evnm-"]) {
	text-decoration: none;
}

/* Headings: type family + ink come from the plugin tokens so a theme's
   heading color can't go illegible on plugin dark surfaces. Sizes and
   margins are left alone — every plugin heading is classed and sets
   its own scale. */
:where(.evnm-scope) h1,
:where(.evnm-scope) h2,
:where(.evnm-scope) h3,
:where(.evnm-scope) h4,
:where(.evnm-scope) h5,
:where(.evnm-scope) h6 {
	font-family: var( --evnm-font );
	color: var( --evnm-text );
}

/* ---- Layer 2: text-control guard (var-indirected !important) ---- */

/* Text-like inputs, selects and textareas. Checkbox / radio / range /
   color / file are deliberately excluded — blocks style those natively
   (accent-color etc.). Values mirror the input primitive exactly, so
   the plugin's own per-block input classes (same tokens) render
   identically; a component needing a different skin sets the
   `--evnm-field-*` variable on its class instead of fighting the
   `!important`. */
:where(.evnm-scope) input:where(:not([type])),
:where(.evnm-scope) input:where([type="text"], [type="email"], [type="url"], [type="number"], [type="search"], [type="password"], [type="tel"], [type="date"], [type="time"], [type="datetime-local"], [type="month"], [type="week"]),
:where(.evnm-scope) select,
:where(.evnm-scope) textarea {
	box-sizing: border-box;
	min-height: var( --evnm-field-minh, var( --evnm-control-h ) ) !important;
	padding: var( --evnm-field-pad, 0 var( --evnm-space-md ) ) !important;
	border: var( --evnm-field-border, 1px solid var( --evnm-border-strong ) ) !important;
	border-radius: var( --evnm-field-radius, var( --evnm-radius-md ) ) !important;
	background: var( --evnm-field-bg, var( --evnm-surface ) ) !important;
	color: var( --evnm-field-color, var( --evnm-text ) ) !important;
	font: inherit !important;
	text-shadow: none !important;
	box-shadow: none !important;
}

/* Textareas are multi-line: block padding + a taller floor, set through
   the guard's own variables (variables are never contested by themes). */
:where(.evnm-scope) textarea {
	--evnm-field-minh: calc( var( --evnm-control-h ) * 2 );
	--evnm-field-pad: var( --evnm-space-sm ) var( --evnm-space-md );
	line-height: 1.5;
}

/* Focus: re-assert the plugin's accent ring over any theme :focus skin
   (same values every block's own :focus rule sets today). */
:where(.evnm-scope) input:where(:not([type]), [type="text"], [type="email"], [type="url"], [type="number"], [type="search"], [type="password"], [type="tel"], [type="date"], [type="time"], [type="datetime-local"], [type="month"], [type="week"]):focus,
:where(.evnm-scope) select:focus,
:where(.evnm-scope) textarea:focus {
	border-color: var( --evnm-accent ) !important;
	box-shadow: 0 0 0 1px var( --evnm-accent ) !important;
}

/* ============================================================
   Page shell
   ============================================================ */
.evnm-admin {
	margin-inline-end: 20px;
}

.evnm-admin .evnm-admin-header {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-end;
	justify-content: space-between;
	gap: var( --evnm-space-md );
	padding: 0 0 var( --evnm-space-lg );
	margin-block-end: var( --evnm-space-xl );
	border-block-end: 1px solid var( --evnm-border );
}

.evnm-admin .evnm-admin-header__titles {
	min-width: 0;
}

/* Brand bar — consistent across every page; one primary action on the right. */
.evnm-admin .evnm-admin-header__bar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var( --evnm-space-sm );
}

.evnm-admin .evnm-admin-header__brand {
	display: inline-flex;
	align-items: center;
	gap: var( --evnm-space-xs );
	color: var( --evnm-accent );
}

.evnm-admin .evnm-admin-header__brand-name {
	font-size: var( --evnm-fs-md );
	font-weight: 700;
	letter-spacing: 0.01em;
	color: var( --evnm-text );
}

.evnm-admin .evnm-admin-header__version {
	font-size: var( --evnm-fs-sm );
	font-weight: 600;
	color: var( --evnm-text-muted );
	background: var( --evnm-surface-alt );
	border: 1px solid var( --evnm-border );
	border-radius: var( --evnm-radius-full, 999px );
	padding: 1px 8px;
}

.evnm-admin .evnm-admin-header__action {
	flex: 0 0 auto;
}

.evnm-admin .evnm-admin-header__title {
	margin: 0;
	padding: 0;
	font-size: var( --evnm-fs-2xl );
	font-weight: 600;
	line-height: 1.2;
	color: var( --evnm-text );
}

.evnm-admin .evnm-admin-header__desc {
	margin: var( --evnm-space-xs ) 0 0;
	font-size: var( --evnm-fs-md );
	color: var( --evnm-text-muted );
}

.evnm-admin .evnm-admin-body {
	/* Fill the wp-admin content area. A fixed 1180px cap left a large blank
	   column on the right of wide screens (the full-bleed data pages - Events,
	   Attendees - use this body, while the shell pages already fill), so the
	   admin looked half-empty and inconsistent. Fill the width like WP's own
	   list tables; inner forms keep their own readable widths. */
	max-width: none;
}

/* ============================================================
   Operations Console shell (Phase 1 keystone) — authored once in
   AbstractAdminPage::render() + AdminMenu::render_rail(). Top bar +
   left rail + main content slot. Tokens only; logical props for RTL.
   ============================================================ */
.evnm-admin .evnm-shell {
	--evnm-rail-w: 248px;
	--evnm-rail-w-collapsed: 64px;
	--evnm-topbar-h: 56px;
	display: flex;
	flex-direction: column;
	min-height: calc( 100vh - 32px );
	margin-inline-start: -20px; /* bleed to the wp-admin content edge */
	background: var( --evnm-bg );
}

/* Reset the legacy outer margin when the shell is in play. */
.evnm-admin {
	margin-inline-end: 0;
}

/* ---- Top bar ---------------------------------------------------- */
.evnm-admin .evnm-shell__topbar {
	position: sticky;
	inset-block-start: 32px; /* below the wp-admin bar */
	z-index: 20;
	display: flex;
	align-items: center;
	gap: var( --evnm-space-lg );
	min-height: var( --evnm-topbar-h );
	padding: var( --evnm-space-sm ) var( --evnm-space-xl );
	background: var( --evnm-surface );
	border-block-end: 1px solid var( --evnm-border );
}

.evnm-admin .evnm-shell__rail-toggle {
	display: none; /* shown <=640px */
	align-items: center;
	justify-content: center;
	width: var( --evnm-control-h );
	height: var( --evnm-control-h );
	padding: 0;
	color: var( --evnm-text-muted );
	background: transparent;
	border: 1px solid var( --evnm-border );
	border-radius: var( --evnm-radius-md );
	cursor: pointer;
}

.evnm-admin .evnm-shell__rail-toggle:hover {
	color: var( --evnm-text );
	background: var( --evnm-surface-alt );
}

.evnm-admin .evnm-shell__rail-toggle:focus-visible {
	outline: 2px solid var( --evnm-accent );
	outline-offset: 2px;
}

.evnm-admin .evnm-shell__brand {
	display: inline-flex;
	align-items: center;
	gap: var( --evnm-space-xs );
	color: var( --evnm-accent );
	text-decoration: none;
	flex: 0 0 auto;
}

.evnm-admin .evnm-shell__brand-name {
	font-size: var( --evnm-fs-md );
	font-weight: 700;
	letter-spacing: 0.01em;
	color: var( --evnm-text );
}

.evnm-admin .evnm-shell__version {
	font-size: var( --evnm-fs-sm );
	font-weight: 600;
	color: var( --evnm-text-muted );
	background: var( --evnm-surface-alt );
	border: 1px solid var( --evnm-border );
	border-radius: var( --evnm-radius-full );
	padding: 1px 8px;
}

.evnm-admin .evnm-shell__breadcrumb {
	display: flex;
	align-items: center;
	gap: var( --evnm-space-sm );
	min-width: 0;
	font-size: var( --evnm-fs-md );
	color: var( --evnm-text-tertiary );
}

.evnm-admin .evnm-shell__crumb {
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}

.evnm-admin .evnm-shell__crumb--current {
	color: var( --evnm-text );
	font-weight: 600;
}

/* Clickable parent crumb: reads as text until you aim at it. */
.evnm-admin a.evnm-shell__crumb--link {
	color: inherit;
	text-decoration: none;
}

.evnm-admin a.evnm-shell__crumb--link:hover,
.evnm-admin a.evnm-shell__crumb--link:focus-visible {
	color: var( --evnm-accent );
	text-decoration: underline;
}

.evnm-admin .evnm-shell__crumb-sep {
	color: var( --evnm-border-strong );
}

.evnm-admin .evnm-shell__topbar-actions {
	display: flex;
	align-items: center;
	gap: var( --evnm-space-sm );
	margin-inline-start: auto;
	flex: 0 0 auto;
}

.evnm-admin .evnm-shell__search {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: var( --evnm-control-h );
	height: var( --evnm-control-h );
	color: var( --evnm-text-muted );
	border: 1px solid var( --evnm-border );
	border-radius: var( --evnm-radius-md );
	text-decoration: none;
}

.evnm-admin .evnm-shell__search:hover {
	color: var( --evnm-text );
	background: var( --evnm-surface-alt );
}

.evnm-admin .evnm-shell__search:focus-visible,
.evnm-admin .evnm-shell__create:focus-visible {
	outline: 2px solid var( --evnm-accent );
	outline-offset: 2px;
}

/* ---- Health chip ----------------------------------------------- */
.evnm-admin .evnm-health-chip {
	display: inline-flex;
	align-items: center;
	gap: var( --evnm-space-xs );
	min-height: var( --evnm-control-h );
	padding: 0 var( --evnm-space-md );
	font-size: var( --evnm-fs-base );
	font-weight: 600;
	text-decoration: none;
	border: 1px solid transparent;
	border-radius: var( --evnm-radius-full );
}

/* Count badge inside the chip — hidden on wide screens (the full label says
   the number); shown only at <=640px where the label collapses. */
.evnm-admin .evnm-health-chip__count {
	display: none;
	font-weight: 700;
}

.evnm-admin .evnm-health-chip--ok {
	color: var( --evnm-success );
	background: var( --evnm-success-soft );
	border-color: var( --evnm-success-soft );
}

.evnm-admin .evnm-health-chip--warning {
	color: var( --evnm-warning );
	background: var( --evnm-warning-soft );
	border-color: var( --evnm-warning-soft );
}

.evnm-admin .evnm-health-chip:hover {
	border-color: currentColor;
}

.evnm-admin .evnm-health-chip:focus-visible {
	outline: 2px solid var( --evnm-accent );
	outline-offset: 2px;
}

/* ---- Body: rail + main ----------------------------------------- */
.evnm-admin .evnm-shell__body {
	display: grid;
	grid-template-columns: var( --evnm-rail-w ) minmax( 0, 1fr );
	align-items: start;
	flex: 1 1 auto;
}

/* Full-bleed data screens (Events, Attendees & Orders): no rail, single
   column, so the filter bar + table get the whole width at scale (Rule 17). */
.evnm-admin .evnm-shell__body--full {
	grid-template-columns: minmax( 0, 1fr );
}

/* Screen-reader-only utility (visible to AT, hidden visually). */
.evnm-admin .evnm-sr-only {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip: rect( 0 0 0 0 );
	white-space: nowrap;
	border: 0;
}

/* ---- Left rail -------------------------------------------------- */
.evnm-admin .evnm-shell__rail {
	position: sticky;
	inset-block-start: calc( 32px + var( --evnm-topbar-h ) );
	align-self: start;
	max-height: calc( 100vh - 32px - var( --evnm-topbar-h ) );
	overflow-y: auto;
	padding: var( --evnm-space-lg ) var( --evnm-space-md );
	background: var( --evnm-surface );
	border-inline-end: 1px solid var( --evnm-border );
}

.evnm-admin .evnm-rail__group + .evnm-rail__group {
	margin-block-start: var( --evnm-space-lg );
}

.evnm-admin .evnm-rail__group-label {
	margin: 0 0 var( --evnm-space-xs );
	padding-inline: var( --evnm-space-sm );
	font-size: var( --evnm-fs-sm );
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.06em;
	color: var( --evnm-text-tertiary );
}

.evnm-admin .evnm-rail__item {
	display: flex;
	align-items: center;
	gap: var( --evnm-space-sm );
	min-height: var( --evnm-control-h );
	padding: 0 var( --evnm-space-md );
	margin-block-end: 2px;
	border-radius: var( --evnm-radius-md );
	color: var( --evnm-text-muted );
	font-size: var( --evnm-fs-md );
	font-weight: 500;
	text-decoration: none;
	transition: background var( --evnm-transition ), color var( --evnm-transition );
}

.evnm-admin .evnm-rail__item:hover {
	background: var( --evnm-surface-alt );
	color: var( --evnm-text );
}

.evnm-admin .evnm-rail__item:focus-visible {
	outline: 2px solid var( --evnm-accent );
	outline-offset: 2px;
}

.evnm-admin .evnm-rail__item.is-active {
	background: var( --evnm-accent-soft );
	color: var( --evnm-accent );
	font-weight: 600;
}

.evnm-admin .evnm-rail__item.is-locked {
	color: var( --evnm-text-tertiary );
	cursor: not-allowed;
}

.evnm-admin .evnm-rail__item.is-locked:hover {
	background: transparent;
	color: var( --evnm-text-tertiary );
}

.evnm-admin .evnm-rail__label {
	flex: 1 1 auto;
	min-width: 0;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}

.evnm-admin .evnm-rail__badge {
	flex: 0 0 auto;
	font-size: 10px;
	font-weight: 700;
	letter-spacing: 0.04em;
	color: var( --evnm-accent );
	background: var( --evnm-accent-soft );
	border: 1px solid var( --evnm-accent-soft );
	border-radius: var( --evnm-radius-sm );
	padding: 1px 6px;
}

/* ---- Nested sub-nav (Rule 17): Settings sections inside the one rail ---- */
.evnm-admin .evnm-rail__sub {
	display: flex;
	flex-direction: column;
	gap: 2px;
	margin: var( --evnm-space-xs ) 0 var( --evnm-space-sm );
	/* Indent + guide line align the children under the parent item's label. */
	padding-inline-start: var( --evnm-space-md );
	margin-inline-start: calc( var( --evnm-space-md ) + 9px );
	border-inline-start: 1px solid var( --evnm-border );
}

.evnm-admin .evnm-rail__sub-item {
	display: flex;
	align-items: center;
	gap: var( --evnm-space-sm );
	min-height: 36px;
	padding: 0 var( --evnm-space-md );
	border-radius: var( --evnm-radius-md );
	color: var( --evnm-text-muted );
	font-size: var( --evnm-fs-sm );
	font-weight: 500;
	text-decoration: none;
	transition: background var( --evnm-transition ), color var( --evnm-transition );
}

.evnm-admin .evnm-rail__sub-item:hover {
	background: var( --evnm-surface-alt );
	color: var( --evnm-text );
}

.evnm-admin .evnm-rail__sub-item:focus-visible {
	outline: 2px solid var( --evnm-accent );
	outline-offset: 2px;
}

.evnm-admin .evnm-rail__sub-item.is-active {
	background: var( --evnm-accent-soft );
	color: var( --evnm-accent );
	font-weight: 600;
}

.evnm-admin .evnm-rail__sub-item .evnm-icon {
	color: currentColor;
	opacity: 0.85;
}

.evnm-admin .evnm-rail__sub-label {
	flex: 1 1 auto;
	min-width: 0;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}

/* ---- Main content slot ----------------------------------------- */
.evnm-admin .evnm-shell__main {
	min-width: 0;
	padding: var( --evnm-space-2xl ) var( --evnm-space-3xl );
}

.evnm-admin .evnm-shell__main .evnm-admin-header {
	padding-block-start: 0;
}

/* ============================================================
   Card primitive
   ============================================================ */
/* Card is a SHARED primitive too - see the note on form controls above. The
 * member dashboard rendered .evnm-card with no surface, border or padding, so
 * the form floated on the page background while the empty state below it had a
 * proper container. */
.evnm-admin .evnm-card,
.evnm-scope .evnm-card {
	background: var( --evnm-surface );
	border: 1px solid var( --evnm-border );
	border-radius: var( --evnm-radius-lg );
	box-shadow: var( --evnm-shadow-sm );
	padding: var( --evnm-space-2xl );
	margin-block-end: var( --evnm-space-xl );
}

.evnm-admin .evnm-card__title,
.evnm-admin .evnm-card-title,
.evnm-scope .evnm-card__title {
	margin: 0 0 var( --evnm-space-xs );
	padding: 0;
	font-size: var( --evnm-fs-lg );
	font-weight: 600;
	line-height: 1.3;
	color: var( --evnm-text );
}

.evnm-admin .evnm-card__desc,
.evnm-scope .evnm-card__desc {
	margin: 0 0 var( --evnm-space-lg );
	font-size: var( --evnm-fs-md );
	color: var( --evnm-text-muted );
}

.evnm-admin .evnm-card__title + .evnm-card__desc,
.evnm-scope .evnm-card__title + .evnm-card__desc {
	margin-block-start: calc( -1 * var( --evnm-space-xs ) );
}

/* Auto-wrap legacy WP markup (h2 + form-table) so it inherits card rhythm. */
.evnm-admin .evnm-card > h2:first-child {
	margin-block-start: 0;
}

/* Premium form card (Learnomy/Jetonomy form-table): a tinted section head over
   divided 2-column rows. The fields are direct children of the card. */
.evnm-admin .evnm-card--form {
	padding: 0;
	overflow: hidden;
}

.evnm-admin .evnm-card--form .evnm-card__head {
	padding: var( --evnm-space-lg ) var( --evnm-space-2xl );
	background: var( --evnm-surface-alt );
	border-block-end: 1px solid var( --evnm-border );
}

.evnm-admin .evnm-card--form .evnm-card__title {
	margin: 0;
	font-size: var( --evnm-fs-sm );
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.05em;
}

.evnm-admin .evnm-card--form .evnm-card__desc {
	margin: 4px 0 0;
}

/* Each direct-child field is a divided form-table row. */
.evnm-admin .evnm-card--form > .evnm-field {
	padding: var( --evnm-space-lg ) var( --evnm-space-2xl );
	border-block-end: 1px solid var( --evnm-border );
}

.evnm-admin .evnm-card--form > .evnm-field:last-child {
	border-block-end: 0;
}

/* Standalone notes inside a form card (e.g. live preview, Pro note) get row padding. */
.evnm-admin .evnm-card--form > .evnm-note {
	margin: 0;
	padding: var( --evnm-space-md ) var( --evnm-space-2xl );
	border-block-end: 1px solid var( --evnm-border );
}

.evnm-admin .evnm-card--form > .evnm-note:last-child {
	border-block-end: 0;
}

/* ============================================================
   Button primitive (+ restyle native WP buttons inside our scope)
   ============================================================ */
.evnm-btn,
.evnm-admin .button,
.evnm-admin .button-primary,
.evnm-admin .button-secondary {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: var( --evnm-space-sm );
	min-height: var( --evnm-control-h );
	padding: 0 var( --evnm-space-lg );
	border: 1px solid var( --evnm-border-strong );
	border-radius: var( --evnm-radius-md );
	background: var( --evnm-surface );
	color: var( --evnm-text );
	font-size: var( --evnm-fs-md );
	font-weight: 500;
	line-height: 1;
	text-decoration: none;
	cursor: pointer;
	transition: background var( --evnm-transition ), border-color var( --evnm-transition ), box-shadow var( --evnm-transition );
}

.evnm-btn:hover,
.evnm-admin .button:hover,
.evnm-admin .button-secondary:hover {
	background: var( --evnm-surface-alt );
	border-color: var( --evnm-accent );
	color: var( --evnm-accent );
}

/* Disabled state: dim, block the pointer, and suppress the hover lift so a
   disabled button (e.g. a full event's RSVP) reads and behaves as inert. */
.evnm-btn:disabled,
.evnm-btn[disabled],
.evnm-btn[aria-disabled="true"] {
	opacity: 0.5;
	cursor: not-allowed;
	box-shadow: none;
}

.evnm-btn:disabled:hover,
.evnm-btn[disabled]:hover,
.evnm-btn[aria-disabled="true"]:hover {
	box-shadow: none;
	transform: none;
}

.evnm-btn--primary,
.evnm-admin .button-primary,
.evnm-admin input[type="submit"].button-primary,
.evnm-admin .button.button-primary {
	background: var( --evnm-accent );
	border-color: var( --evnm-accent );
	color: var( --evnm-accent-contrast );
}

.evnm-btn--primary:hover,
.evnm-admin .button-primary:hover,
.evnm-admin .button.button-primary:hover {
	background: var( --evnm-accent-hover );
	border-color: var( --evnm-accent-hover );
	color: var( --evnm-accent-contrast );
}

.evnm-btn--ghost {
	background: transparent;
	border-color: transparent;
	color: var( --evnm-accent );
}

.evnm-btn--danger {
	background: var( --evnm-danger );
	border-color: var( --evnm-danger );
	/* NOT --evnm-accent-contrast: that token flips to near-black in dark mode
	   because the dark BRAND is lime and needs dark ink. The danger fill is the
	   same red in both modes, so borrowing it dropped this button to 2.82:1.
	   White is the correct pair for #b32d2e in either mode (6.30:1). */
	color: #fff;
}

/* Compact button for inline table actions (e.g. the Events row "Edit"). */
.evnm-btn--sm {
	min-height: var( --evnm-control-h-sm );
	padding: 0 var( --evnm-space-md );
	font-size: var( --evnm-fs-sm );
}

/* Theme-isolation layer 3 — `.evnm-btn` component guard (see the Theme
   isolation section at the top of this file). Legacy Wbcom theme releases
   (BuddyX < 5.1, Reign < 8.x) skin every bare <button> with a very
   high-specificity, non-!important rule -
   `button:not([class*=wp-])…{ background: var(--bx-color-accent); color:#fff }`
   (~9 negations) - which repaints our <button>-based .evnm-btn elements
   (ghost/neutral/danger) as solid brand pills, white text; current releases
   still hit submit buttons via `button[type=submit]` (0,1,1). A plain (0,2,0)
   class can't out-specify either, so re-assert the plugin's button component
   inside the universal block scope (.evnm-scope, injected on every block root
   by BlockRegistrar) with !important on the colour-bearing properties. The
   theme rules are NOT !important, so this wins cleanly; values stay
   token-driven (a primary button still adopts the host brand accent, dark
   mode still adapts); wp-admin has no theme to fight, so the global,
   non-!important rules above suffice there. KEPT (not replaced by the
   zero-specificity reset) because a (0,0,1) reset provably cannot beat those
   theme selectors. */
.evnm-scope .evnm-btn {
	background: var( --evnm-surface ) !important;
	border: 1px solid var( --evnm-border-strong ) !important;
	color: var( --evnm-text ) !important;
	box-shadow: none !important;
	text-shadow: none !important;
}

.evnm-scope .evnm-btn:hover {
	background: var( --evnm-surface-alt ) !important;
	border-color: var( --evnm-accent ) !important;
	color: var( --evnm-accent ) !important;
}

.evnm-scope .evnm-btn--primary {
	background: var( --evnm-accent ) !important;
	border-color: var( --evnm-accent ) !important;
	color: var( --evnm-accent-contrast ) !important;
}

.evnm-scope .evnm-btn--primary:hover {
	background: var( --evnm-accent-hover ) !important;
	border-color: var( --evnm-accent-hover ) !important;
	color: var( --evnm-accent-contrast ) !important;
}

.evnm-scope .evnm-btn--ghost {
	background: transparent !important;
	border-color: transparent !important;
	color: var( --evnm-accent ) !important;
}

/* RSVP block controls (QA card 10082261413): the segmented Going/Maybe/No
   choice must read NEUTRAL with a clearly-filled selected state, and only the
   RSVP CTA carries the solid accent. These classes don't carry .evnm-btn, so
   high-specificity theme button selectors were painting all four the theme
   color — same defense as the .evnm-btn guard above. */
.evnm-scope .evnm-rsvp__choice {
	background: var( --evnm-surface ) !important;
	border: 1px solid var( --evnm-border-strong ) !important;
	color: var( --evnm-text ) !important;
	box-shadow: none !important;
	text-shadow: none !important;
}

.evnm-scope .evnm-rsvp__choice:hover {
	background: var( --evnm-surface-alt ) !important;
	border-color: var( --evnm-accent ) !important;
	color: var( --evnm-accent ) !important;
}

.evnm-scope .evnm-rsvp__choice[aria-pressed='true'] {
	background: var( --evnm-accent ) !important;
	border-color: var( --evnm-accent ) !important;
	color: var( --evnm-accent-contrast ) !important;
}

.evnm-scope .evnm-rsvp__submit {
	background: var( --evnm-accent ) !important;
	border: 1px solid var( --evnm-accent ) !important;
	color: var( --evnm-accent-contrast ) !important;
	box-shadow: none !important;
	text-shadow: none !important;
}

.evnm-scope .evnm-rsvp__submit:hover:not( :disabled ) {
	background: var( --evnm-accent-hover ) !important;
	border-color: var( --evnm-accent-hover ) !important;
}

.evnm-scope .evnm-rsvp__submit:disabled {
	opacity: 0.55;
	cursor: not-allowed;
}

/* Guest magic-link path: quiet secondary, never competes with the CTA. */
.evnm-scope .evnm-rsvp__magic {
	background: transparent !important;
	border: 1px solid var( --evnm-border-strong ) !important;
	color: var( --evnm-text-muted ) !important;
	box-shadow: none !important;
}

.evnm-scope .evnm-rsvp__magic:hover {
	border-color: var( --evnm-accent ) !important;
	color: var( --evnm-accent ) !important;
}

.evnm-scope .evnm-btn--danger {
	background: var( --evnm-danger ) !important;
	border-color: var( --evnm-danger ) !important;
	color: #fff !important;
}

/* Frontend bare-button sweep (QA card 10082532937): every remaining frontend
   <button> that carries only its block-local class. BuddyX 5.1 bx-tokens skins
   `button:not([class*="wp-"])…` at ~(0,5,1), which outranks both the L1
   zero-spec reset and the block classes (0,1,0) - the same screen showed the
   brand-green RSVP CTA next to theme-red Search/Share/Save. Same defense as
   the .evnm-btn / .evnm-rsvp__choice guards above; every value token-driven so
   brand + dark mode ride along. Values MIRROR each block's own SCSS intent. */

/* Search: the one solid-accent CTA on the archive bar. */
.evnm-scope .evnm-search-filter__button {
	background: var( --evnm-accent ) !important;
	border: 1px solid var( --evnm-accent ) !important;
	color: var( --evnm-accent-contrast ) !important;
	box-shadow: none !important;
	text-shadow: none !important;
}

.evnm-scope .evnm-search-filter__button:hover {
	background: var( --evnm-accent-hover ) !important;
	border-color: var( --evnm-accent-hover ) !important;
}

/* Clear all: quiet text button next to Search. */
.evnm-scope .evnm-search-filter__clear {
	background: transparent !important;
	border: 1px solid var( --evnm-border-strong ) !important;
	color: var( --evnm-text-muted ) !important;
	box-shadow: none !important;
}

.evnm-scope .evnm-search-filter__clear:hover {
	background: var( --evnm-surface-alt ) !important;
	color: var( --evnm-text ) !important;
}

/* Load more + single-event Share + calendar month nav: the shared quiet
   outline-button skin (surface bg, accent on hover). */
.evnm-scope .evnm-events-list__load-more,
.evnm-scope .evnm-single-event__share-btn,
.evnm-scope .evnm-calendar__nav {
	background: var( --evnm-surface ) !important;
	border: 1px solid var( --evnm-border-strong ) !important;
	color: var( --evnm-text ) !important;
	box-shadow: none !important;
	text-shadow: none !important;
}

.evnm-scope .evnm-events-list__load-more:hover,
.evnm-scope .evnm-single-event__share-btn:hover,
.evnm-scope .evnm-calendar__nav:hover {
	background: var( --evnm-surface-alt ) !important;
	border-color: var( --evnm-accent ) !important;
	color: var( --evnm-accent ) !important;
}

/* Share fallback-menu items: borderless full-width rows. */
.evnm-scope .evnm-single-event__share-item {
	background: transparent !important;
	border: 0 !important;
	color: var( --evnm-text ) !important;
	box-shadow: none !important;
}

.evnm-scope .evnm-single-event__share-item:hover,
.evnm-scope .evnm-single-event__share-item:focus-visible {
	background: var( --evnm-surface-alt ) !important;
	color: var( --evnm-accent ) !important;
}

/* RSVP donation chips: accent outline pill, fills on hover. */
.evnm-scope .evnm-rsvp__chip {
	background: transparent !important;
	border: 1px solid var( --evnm-accent ) !important;
	color: var( --evnm-accent ) !important;
	box-shadow: none !important;
}

.evnm-scope .evnm-rsvp__chip:hover {
	background: var( --evnm-accent ) !important;
	color: var( --evnm-accent-contrast ) !important;
}

/* RSVP cancel: quiet underlined danger text, never a solid pill. */
.evnm-scope .evnm-rsvp__cancel {
	background: transparent !important;
	border: 0 !important;
	padding: 0 !important;
	color: var( --evnm-danger-ink, var( --evnm-danger ) ) !important;
	text-decoration: underline !important;
	box-shadow: none !important;
}

.evnm-scope .evnm-rsvp__cancel:hover {
	color: var( --evnm-danger-strong, var( --evnm-danger-ink, var( --evnm-danger ) ) ) !important;
}

/* ============================================================
   Input primitive (+ restyle WP form controls inside our scope)
   ============================================================ */
/* Form controls are a SHARED primitive, not an admin one.
 *
 * These rules were `.evnm-admin`-scoped only, so any frontend surface that
 * rendered `.evnm-field` / `.evnm-input` - the member dashboard's Connect &
 * Import form being the visible casualty - fell back to raw browser defaults:
 * three different control widths, a URL input too narrow to show its own
 * placeholder, and labels that did not align. The markup was correct the whole
 * time; the stylesheet simply had no non-admin definition.
 *
 * `.evnm-scope` is the plugin's own frontend root (BlockRegistrar puts it on
 * every block's outermost element), so pairing it with `.evnm-admin` here gives
 * one definition for both surfaces - Same-Family, Same-Shell - instead of a
 * frontend copy that drifts from the admin one. */
.evnm-admin .evnm-input,
.evnm-admin input[type="text"],
.evnm-admin input[type="email"],
.evnm-admin input[type="url"],
.evnm-admin input[type="number"],
.evnm-admin input[type="search"],
.evnm-admin input[type="password"],
.evnm-admin select,
.evnm-admin textarea,
.evnm-admin .regular-text,
.evnm-scope .evnm-input,
.evnm-scope select.evnm-input,
.evnm-scope textarea.evnm-input {
	box-sizing: border-box;
	min-height: var( --evnm-control-h );
	padding: 0 var( --evnm-space-md );
	border: 1px solid var( --evnm-border-strong );
	border-radius: var( --evnm-radius-md );
	background: var( --evnm-surface );
	color: var( --evnm-text );
	font-size: var( --evnm-fs-md );
	line-height: var( --evnm-control-h );
	box-shadow: none;
	transition: border-color var( --evnm-transition ), box-shadow var( --evnm-transition );
}

.evnm-admin textarea {
	min-height: calc( var( --evnm-control-h ) * 2 );
	padding-block: var( --evnm-space-sm );
	line-height: 1.5;
}

.evnm-admin .evnm-input:focus,
.evnm-admin input[type="text"]:focus,
.evnm-admin input[type="number"]:focus,
.evnm-admin select:focus,
.evnm-admin textarea:focus,
.evnm-admin .regular-text:focus,
.evnm-scope .evnm-input:focus {
	border-color: var( --evnm-accent );
	box-shadow: 0 0 0 1px var( --evnm-accent );
	outline: 2px solid transparent;
}

/* Field grouping */
/* Form row — Learnomy/Jetonomy 2-column form-table: label left, control right,
   help under the control. Used in plain form cards AND feature config blocks. */
.evnm-admin .evnm-field,
.evnm-scope .evnm-field {
	display: grid;
	grid-template-columns: minmax( 150px, 220px ) minmax( 0, 1fr );
	column-gap: var( --evnm-space-2xl );
	align-items: start;
	margin: 0;
	/* Universal fallback spacing so any .evnm-field (including Pro-rendered ones
	   outside a --form card) never touches its neighbour. Form/feature cards
	   override this with their own divided-row padding below. */
	padding-block: var( --evnm-space-md );
}

/* "A key is saved: ••••" confirmation under a secret/API-key field. */
.evnm-admin .evnm-field__saved {
	grid-column: 2;
	display: inline-flex;
	align-items: center;
	gap: var( --evnm-space-2xs, 4px );
	margin-block-start: var( --evnm-space-2xs, 4px );
	font-size: var( --evnm-fs-sm );
	color: var( --evnm-success, #1a7f37 );
}

.evnm-admin .evnm-field__saved code {
	color: var( --evnm-text-muted );
	letter-spacing: 0.05em;
}

.evnm-admin .evnm-field > label,
.evnm-scope .evnm-field > label {
	grid-column: 1;
	grid-row: 1;
	padding-block-start: 7px;
	font-size: var( --evnm-fs-md );
	font-weight: 600;
	line-height: 1.4;
	color: var( --evnm-text );
}

.evnm-admin .evnm-field > .evnm-input,
.evnm-admin .evnm-field > select,
.evnm-admin .evnm-field > input,
.evnm-admin .evnm-field > textarea,
.evnm-scope .evnm-field > .evnm-input {
	grid-column: 2;
	grid-row: 1;
	width: 100%;
	max-width: 460px;
}

.evnm-admin .evnm-field > input[type="number"] {
	max-width: 180px;
}

.evnm-admin .evnm-field > textarea {
	max-width: 560px;
}

/* Pro email-template groups (Notifications tab). The fieldset is a plain
   grouping wrapper around stacked .evnm-field rows; the legend titles each
   template. Reset native fieldset chrome so it sits flush in the card. */
.evnm-admin .evnm-email-tpl {
	margin: 0;
	padding: var( --evnm-space-md ) 0 0;
	border: 0;
	border-block-start: 1px solid var( --evnm-border );
}

.evnm-admin .evnm-email-tpl:first-of-type {
	border-block-start: 0;
}

.evnm-admin .evnm-email-tpl__title {
	float: none;
	width: auto;
	padding: 0;
	margin-block-end: var( --evnm-space-xs );
	font-size: var( --evnm-fs-md );
	font-weight: 600;
	color: var( --evnm-text );
}

.evnm-admin .evnm-field > .evnm-note {
	grid-column: 2;
	grid-row: 2;
	margin-block-start: var( --evnm-space-xs );
}

/* Checkbox row: label left (like every other row), the box in the control column. */
.evnm-admin .evnm-field--checkbox > label {
	cursor: pointer;
	padding-block-start: 0;
}

.evnm-admin .evnm-field--checkbox > input[type="checkbox"] {
	grid-column: 2;
	grid-row: 1;
	width: 20px;
	height: 20px;
	min-height: 20px;
	max-width: none;
	margin: 0;
	cursor: pointer;
}

/* A fieldset of related checkboxes (e.g. enabled views) spans the control col.
   Each choice is a neat inline-flex chip that wraps with clear spacing instead
   of running together on one cramped line. */
.evnm-admin .evnm-field--checkgroup {
	display: block;
}

.evnm-admin .evnm-field--checkgroup > .evnm-note {
	display: block;
	margin-block: var( --evnm-space-xs ) var( --evnm-space-sm );
}

.evnm-admin .evnm-field--checkgroup .evnm-field--checkbox {
	display: inline-flex;
	align-items: center;
	gap: var( --evnm-space-xs );
	margin-inline-end: var( --evnm-space-lg );
	margin-block-end: var( --evnm-space-xs );
	cursor: pointer;
}

.evnm-admin .evnm-field--checkgroup .evnm-field--checkbox > input[type="checkbox"] {
	grid-column: auto;
	grid-row: auto;
	width: 18px;
	height: 18px;
	margin: 0;
}

/* Pro-locked field on Free: visibly inert (the Pro note above explains why). */
.evnm-admin .evnm-field--disabled {
	opacity: 0.55;
}

.evnm-admin .evnm-field--disabled .evnm-input {
	cursor: not-allowed;
}

/* Capability (feature) card — identical form-table shell as plain cards: a
   tinted head whose toggle turns the feature on/off, then divided config rows. */
.evnm-admin .evnm-feature__row {
	display: flex;
	align-items: center;
	gap: var( --evnm-space-sm );
	margin: 0;
	cursor: pointer;
}

.evnm-admin .evnm-feature__input {
	flex: 0 0 auto;
	width: 20px;
	height: 20px;
	min-height: 20px;
	margin: 0;
}

/* Pro-only capability with Pro inactive: the toggle is disabled (does nothing
   without the add-on). Dim the head and show a not-allowed cursor so it reads
   as locked rather than broken; the "Pro" badge + note explain why. */
.evnm-admin .evnm-feature.is-pro-locked .evnm-feature__head {
	opacity: 0.65;
}

.evnm-admin .evnm-feature.is-pro-locked .evnm-feature__row,
.evnm-admin .evnm-feature.is-pro-locked .evnm-feature__input {
	cursor: not-allowed;
}

.evnm-admin .evnm-feature__pro {
	margin-inline-start: var( --evnm-space-xs );
	vertical-align: middle;
}

.evnm-admin .evnm-feature__label {
	font-size: var( --evnm-fs-sm );
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.05em;
	color: var( --evnm-text );
}

.evnm-admin .evnm-feature__desc {
	/* Align under the label text, past the checkbox + gap. */
	margin: var( --evnm-space-xs ) 0 0;
	padding-inline-start: calc( 20px + var( --evnm-space-sm ) );
}

/* Collapsed feature: the head carries no bottom divider (nothing below it). */
.evnm-admin .evnm-feature:not( .is-open ) .evnm-feature__head {
	border-block-end: 0;
}

/* Inline capability settings — revealed on the same screen when enabled, as a
   plain body of divided form-table rows (no nested accent box). */
.evnm-admin .evnm-feature__config {
	display: none;
	padding: 0;
	margin: 0;
	border: 0;
	background: transparent;
}

.evnm-admin .evnm-feature.is-open .evnm-feature__config {
	display: block;
}

.evnm-admin .evnm-feature__config > .evnm-field {
	padding: var( --evnm-space-lg ) var( --evnm-space-2xl );
	border-block-end: 1px solid var( --evnm-border );
}

.evnm-admin .evnm-feature__config > .evnm-field:last-child {
	border-block-end: 0;
}

/* Non-field config content (questions repeater, notes, gateway panels, Pro
   slots) keeps comfortable padding so it isn't flush to the card edge. */
.evnm-admin .evnm-feature__config > :not( .evnm-field ) {
	padding-inline: var( --evnm-space-2xl );
}

.evnm-admin .evnm-feature__config > :not( .evnm-field ):first-child {
	padding-block-start: var( --evnm-space-lg );
}

.evnm-admin .evnm-feature__config > :not( .evnm-field ):last-child {
	padding-block-end: var( --evnm-space-lg );
}

/* Questions tab previews its example even while the feature is off, so the
   section is never blank. Keep the head divider since a body follows. */
.evnm-admin .evnm-feature[ data-evnm-feature="custom_questions" ] .evnm-feature__config {
	display: block;
}

.evnm-admin .evnm-feature[ data-evnm-feature="custom_questions" ]:not( .is-open ) .evnm-feature__head {
	border-block-end: 1px solid var( --evnm-border );
}

.evnm-admin .evnm-questions--preview {
	opacity: 0.65;
}

/* Custom-questions repeater (Settings → Registration). */
.evnm-admin .evnm-question {
	margin-block-end: var( --evnm-space-md );
	padding: var( --evnm-space-md );
	border: 1px solid var( --evnm-border );
	border-radius: var( --evnm-radius-md );
	background: var( --evnm-surface );
}

.evnm-admin .evnm-question__actions {
	margin-block-end: 0;
}

.evnm-admin .evnm-questions__actions {
	margin-block-start: var( --evnm-space-md );
}

/* Payment gateway panels — only the selected gateway is shown. */
.evnm-admin .evnm-gateway {
	display: none;
}

.evnm-admin .evnm-gateway.is-active {
	display: block;
}

.evnm-admin .evnm-input--readonly {
	background: var( --evnm-surface-alt );
	color: var( --evnm-text-muted );
	font-family: var( --evnm-font-mono, monospace );
	font-size: var( --evnm-fs-sm );
}

.evnm-admin .evnm-gateway__guide {
	margin-block-start: var( --evnm-space-md );
	padding: var( --evnm-space-md ) var( --evnm-space-lg );
	background: var( --evnm-accent-soft );
	border-radius: var( --evnm-radius-md );
}

.evnm-admin .evnm-gateway__guide-title {
	margin: 0 0 var( --evnm-space-xs );
	font-weight: 600;
	font-size: var( --evnm-fs-sm );
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var( --evnm-text-muted );
}

.evnm-admin .evnm-gateway__guide-steps {
	margin: 0 0 var( --evnm-space-sm );
	padding-inline-start: var( --evnm-space-lg );
	color: var( --evnm-text );
}

.evnm-admin .evnm-gateway__guide-steps li {
	margin-block-end: var( --evnm-space-xs );
}

.evnm-admin .evnm-gateway__guide-link {
	font-weight: 600;
	font-size: var( --evnm-fs-sm );
}

.evnm-admin fieldset {
	border: 0;
	margin: 0;
	padding: 0;
}

/* ============================================================
   Badge primitive
   ============================================================ */
/* Badge: shared primitive, was admin-only. No frontend emitter uses it TODAY
 * (blocks use bespoke .evnm-chip), so this is latent - but a badge defined
 * admin-only is exactly the trap the Connect-form bug came from, so close the
 * class now rather than the day someone emits .evnm-badge on the frontend. */
.evnm-admin .evnm-badge,
.evnm-scope .evnm-badge {
	display: inline-flex;
	align-items: center;
	gap: var( --evnm-space-xs );
	padding: 2px var( --evnm-space-sm );
	border-radius: var( --evnm-radius-full );
	background: var( --evnm-surface-alt );
	color: var( --evnm-text-muted );
	font-size: var( --evnm-fs-sm );
	font-weight: 600;
	line-height: 1.6;
	text-transform: capitalize;
}

.evnm-admin .evnm-badge--ok,
.evnm-admin .evnm-badge--success,
.evnm-scope .evnm-badge--ok,
.evnm-scope .evnm-badge--success {
	background: var( --evnm-success-soft );
	color: var( --evnm-success );
}

.evnm-admin .evnm-badge--missing,
.evnm-admin .evnm-badge--danger,
.evnm-scope .evnm-badge--missing,
.evnm-scope .evnm-badge--danger {
	background: var( --evnm-danger-soft );
	color: var( --evnm-danger );
}

.evnm-admin .evnm-badge--warning,
.evnm-scope .evnm-badge--warning {
	background: var( --evnm-warning-soft );
	color: var( --evnm-warning );
}

.evnm-admin .evnm-badge--info,
.evnm-scope .evnm-badge--info {
	background: var( --evnm-info-soft );
	color: var( --evnm-info );
}

/* ============================================================
   Empty-state primitive
   ============================================================ */
/* Empty state is a SHARED primitive - same note as card/field/input. It was
 * admin-only, so a frontend .evnm-empty (the events-list "No events found"
 * archive being the visible casualty) rendered as raw left-aligned text with no
 * surface, icon or centering - reading as a failed load. */
.evnm-admin .evnm-empty,
.evnm-scope .evnm-empty {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: var( --evnm-space-sm );
	padding: var( --evnm-space-3xl ) var( --evnm-space-xl );
	border: 1px dashed var( --evnm-border );
	border-radius: var( --evnm-radius-md );
	background: var( --evnm-surface-alt );
	color: var( --evnm-text-muted );
	text-align: center;
	font-size: var( --evnm-fs-md );
}

.evnm-admin .evnm-empty__icon,
.evnm-scope .evnm-empty__icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 52px;
	height: 52px;
	border-radius: var( --evnm-radius-full, 999px );
	background: var( --evnm-accent-soft );
	color: var( --evnm-accent );
}

.evnm-admin .evnm-empty__title,
.evnm-scope .evnm-empty__title {
	margin: 0;
	font-size: var( --evnm-fs-lg );
	font-weight: 600;
	color: var( --evnm-text );
}

.evnm-admin .evnm-empty__body,
.evnm-scope .evnm-empty__body {
	margin: 0;
	max-width: 32rem;
	color: var( --evnm-text-muted );
}

.evnm-admin .evnm-empty__cta,
.evnm-scope .evnm-empty__cta {
	margin-block-start: var( --evnm-space-xs );
}

/* ============================================================
   Settings — sidebar nav layout (Pattern A)
   ============================================================ */
/* Shared Lucide icon primitive (inherits color via currentColor). */
.evnm-icon {
	display: inline-block;
	flex: 0 0 auto;
	vertical-align: middle;
}

/* Rule 17: the settings section nav lives in the shell rail (.evnm-rail__sub),
   not in a second sidebar here. The pane is a single full-width column; only
   the ?tab= panel shows (server-driven, so it works with JS off too). */
.evnm-admin .evnm-settings__pane {
	min-width: 0;
}

.evnm-admin .evnm-settings__panel {
	display: none;
}

.evnm-admin .evnm-settings__panel.is-active {
	display: block;
}

.evnm-admin .evnm-settings__pane .submit {
	margin: 0;
	padding: var( --evnm-space-lg ) 0 0;
}

/* ============================================================
   Dashboard — stat cards (Pattern B)
   ============================================================ */
.evnm-admin .evnm-stats-row {
	display: grid;
	grid-template-columns: repeat( 4, 1fr );
	gap: var( --evnm-space-lg );
}

.evnm-admin .evnm-stat {
	display: flex;
	flex-direction: column;
	gap: var( --evnm-space-xs );
	padding: var( --evnm-space-lg );
	border: 1px solid var( --evnm-border );
	border-radius: var( --evnm-radius-md );
	background: var( --evnm-surface-alt );
}

.evnm-admin .evnm-stat__count {
	font-size: var( --evnm-fs-2xl );
	font-weight: 700;
	line-height: 1.1;
	color: var( --evnm-text );
}

.evnm-admin .evnm-stat__label {
	font-size: var( --evnm-fs-md );
	color: var( --evnm-text-muted );
}

/* Recent list */
.evnm-admin .evnm-recent-list {
	margin: 0;
	padding: 0;
	list-style: none;
}

.evnm-admin .evnm-recent-list__item {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var( --evnm-space-md );
	padding: var( --evnm-space-md ) 0;
	border-block-end: 1px solid var( --evnm-border );
}

.evnm-admin .evnm-recent-list__item:last-child {
	border-block-end: 0;
}

.evnm-admin .evnm-recent-list__title {
	font-weight: 500;
	color: var( --evnm-text );
}

.evnm-admin .evnm-actions {
	display: flex;
	flex-wrap: wrap;
	gap: var( --evnm-space-sm );
	margin: 0;
}

/* An action row directly above a card (e.g. "Back to events" over the event
   editor) needs breathing room — .evnm-card only carries margin-block-end, so
   the buttons sat flush against the card's top border. */
.evnm-admin .evnm-actions + .evnm-card {
	margin-block-start: var( --evnm-space-lg );
}

/* ============================================================
   Command Center — KPI grid (Pattern B, linked stat cards)
   ============================================================ */
.evnm-admin .evnm-kpi-grid {
	display: grid;
	grid-template-columns: repeat( 4, 1fr );
	gap: var( --evnm-space-lg );
	margin-block-end: var( --evnm-space-xl );
}

.evnm-admin .evnm-kpi {
	display: flex;
	flex-direction: column;
	gap: var( --evnm-space-xs );
	padding: var( --evnm-space-xl );
	border: 1px solid var( --evnm-border );
	border-radius: var( --evnm-radius-lg );
	background: var( --evnm-surface );
	box-shadow: var( --evnm-shadow-sm );
	color: var( --evnm-text );
	text-decoration: none;
	transition: border-color var( --evnm-transition ), box-shadow var( --evnm-transition ), transform var( --evnm-transition );
}

.evnm-admin .evnm-kpi:hover,
.evnm-admin .evnm-kpi:focus-visible {
	border-color: var( --evnm-accent );
	box-shadow: var( --evnm-shadow-md );
}

.evnm-admin .evnm-kpi__icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	margin-block-end: var( --evnm-space-xs );
	border-radius: var( --evnm-radius-md );
	background: var( --evnm-accent-soft );
	color: var( --evnm-accent );
}

.evnm-admin .evnm-kpi__value {
	font-size: var( --evnm-fs-2xl );
	font-weight: 700;
	line-height: 1.1;
	color: var( --evnm-text );
}

.evnm-admin .evnm-kpi__label {
	font-size: var( --evnm-fs-md );
	color: var( --evnm-text-muted );
}

/* ============================================================
   Setup & Health — setup-state banner
   ============================================================ */
.evnm-admin .evnm-setup-banner {
	display: flex;
	align-items: center;
	gap: var( --evnm-space-lg );
	border-inline-start-width: 3px;
}

.evnm-admin .evnm-setup-banner.is-incomplete {
	border-inline-start-color: var( --evnm-warning );
	background: var( --evnm-warning-soft );
}

.evnm-admin .evnm-setup-banner.is-complete {
	border-inline-start-color: var( --evnm-success );
	background: var( --evnm-success-soft );
}

.evnm-admin .evnm-setup-banner__icon {
	display: inline-flex;
	flex-shrink: 0;
	align-items: center;
	justify-content: center;
}

.evnm-admin .evnm-setup-banner.is-incomplete .evnm-setup-banner__icon {
	color: var( --evnm-warning );
}

.evnm-admin .evnm-setup-banner.is-complete .evnm-setup-banner__icon {
	color: var( --evnm-success );
}

.evnm-admin .evnm-setup-banner__text {
	flex: 1 1 auto;
	min-width: 0;
}

.evnm-admin .evnm-setup-banner__title {
	margin: 0 0 var( --evnm-space-xs );
	font-size: var( --evnm-fs-lg );
	font-weight: 600;
	color: var( --evnm-text );
}

.evnm-admin .evnm-setup-banner__body {
	margin: 0;
	font-size: var( --evnm-fs-md );
	color: var( --evnm-text-muted );
}

.evnm-admin .evnm-setup-banner__action {
	flex-shrink: 0;
}

/* ============================================================
   Command Center — Needs attention panel (signature feature)
   ============================================================ */
.evnm-admin .evnm-attention__list {
	margin: 0;
	padding: 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: var( --evnm-space-sm );
}

.evnm-admin .evnm-attention__row {
	display: flex;
	align-items: center;
	gap: var( --evnm-space-md );
	padding: var( --evnm-space-md ) var( --evnm-space-lg );
	border: 1px solid var( --evnm-border );
	border-inline-start-width: 3px;
	border-radius: var( --evnm-radius-md );
	background: var( --evnm-surface-alt );
}

.evnm-admin .evnm-attention__row.is-warning {
	border-inline-start-color: var( --evnm-warning );
	background: var( --evnm-warning-soft );
}

.evnm-admin .evnm-attention__row.is-info {
	border-inline-start-color: var( --evnm-info );
	background: var( --evnm-info-soft );
}

.evnm-admin .evnm-attention__icon {
	display: inline-flex;
	flex-shrink: 0;
	align-items: center;
	justify-content: center;
}

.evnm-admin .evnm-attention__row.is-warning .evnm-attention__icon {
	color: var( --evnm-warning );
}

.evnm-admin .evnm-attention__row.is-info .evnm-attention__icon {
	color: var( --evnm-info );
}

.evnm-admin .evnm-attention__message {
	flex: 1 1 auto;
	min-width: 0;
	font-size: var( --evnm-fs-md );
	color: var( --evnm-text );
}

.evnm-admin .evnm-attention__action {
	display: inline-flex;
	flex-shrink: 0;
	align-items: center;
	gap: var( --evnm-space-xs );
	min-height: var( --evnm-control-h );
	padding-inline: var( --evnm-space-sm );
	font-size: var( --evnm-fs-md );
	font-weight: 600;
	color: var( --evnm-accent );
	text-decoration: none;
	white-space: nowrap;
}

.evnm-admin .evnm-attention__action:hover,
.evnm-admin .evnm-attention__action:focus-visible {
	color: var( --evnm-accent-hover );
	text-decoration: underline;
}

/* ============================================================
   Command Center — Recent activity feed
   ============================================================ */
.evnm-admin .evnm-activity__list {
	margin: 0;
	padding: 0;
	list-style: none;
}

.evnm-admin .evnm-activity__row {
	display: flex;
	align-items: center;
	gap: var( --evnm-space-md );
	padding: var( --evnm-space-md ) 0;
	border-block-end: 1px solid var( --evnm-border );
}

.evnm-admin .evnm-activity__row:last-child {
	border-block-end: 0;
}

.evnm-admin .evnm-activity__icon {
	display: inline-flex;
	flex-shrink: 0;
	align-items: center;
	justify-content: center;
	width: 32px;
	height: 32px;
	border-radius: var( --evnm-radius-full );
	background: var( --evnm-surface-alt );
	color: var( --evnm-text-muted );
}

.evnm-admin .evnm-activity__text {
	flex: 1 1 auto;
	min-width: 0;
	font-size: var( --evnm-fs-md );
	color: var( --evnm-text );
}

.evnm-admin .evnm-activity__time {
	flex-shrink: 0;
	font-size: var( --evnm-fs-sm );
	color: var( --evnm-text-tertiary );
	white-space: nowrap;
}

/* ============================================================
   Tab nav (Tools) — restyle native nav-tab-wrapper to pill tabs
   ============================================================ */
.evnm-admin .evnm-tab-nav.nav-tab-wrapper {
	margin: 0 0 var( --evnm-space-xl );
	padding: 0;
	border-block-end: 1px solid var( --evnm-border );
	display: flex;
	gap: var( --evnm-space-xs );
}

.evnm-admin .evnm-tab-nav .nav-tab {
	margin: 0;
	padding: var( --evnm-space-sm ) var( --evnm-space-lg );
	border: 0;
	border-block-end: 2px solid transparent;
	background: none;
	color: var( --evnm-text-muted );
	font-size: var( --evnm-fs-md );
	font-weight: 500;
	border-radius: 0;
	transition: color var( --evnm-transition ), border-color var( --evnm-transition );
}

.evnm-admin .evnm-tab-nav .nav-tab:hover {
	color: var( --evnm-text );
}

.evnm-admin .evnm-tab-nav .nav-tab-active,
.evnm-admin .evnm-tab-nav .nav-tab-active:focus {
	color: var( --evnm-accent );
	border-block-end-color: var( --evnm-accent );
	background: none;
}

/* ============================================================
   Tables (health, events, attendees) — token-styled WP tables
   ============================================================ */
.evnm-admin .evnm-table-wrap {
	overflow-x: auto;
}

.evnm-admin .evnm-table,
.evnm-admin .evnm-health__table,
.evnm-admin table.widefat {
	width: 100%;
	border-collapse: collapse;
	border: 1px solid var( --evnm-border );
	border-radius: var( --evnm-radius-md );
	overflow: hidden;
	background: var( --evnm-surface );
}

.evnm-admin .evnm-table th,
.evnm-admin .evnm-health__table th,
.evnm-admin table.widefat th {
	padding: var( --evnm-space-md );
	text-align: start;
	font-size: var( --evnm-fs-sm );
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.02em;
	color: var( --evnm-text-tertiary );
	background: var( --evnm-surface-alt );
	border-block-end: 1px solid var( --evnm-border );
}

.evnm-admin .evnm-table td,
.evnm-admin .evnm-health__table td,
.evnm-admin table.widefat td {
	padding: var( --evnm-space-md );
	font-size: var( --evnm-fs-md );
	color: var( --evnm-text );
	border-block-end: 1px solid var( --evnm-border );
}

/* Table links (e.g. Reports event names) read as clean accent links, not raw
   underlined blue, so admin data tables look finished. */
.evnm-admin .evnm-table a {
	color: var( --evnm-accent );
	text-decoration: none;
	font-weight: 500;
}

.evnm-admin .evnm-table a:hover,
.evnm-admin .evnm-table a:focus-visible {
	text-decoration: underline;
}

.evnm-admin .evnm-table tr:last-child td,
.evnm-admin .evnm-health__table tr:last-child td {
	border-block-end: 0;
}

/* Status pills (health check) */
.evnm-admin .evnm-status {
	display: inline-flex;
	align-items: center;
	gap: var( --evnm-space-xs );
	padding: 2px var( --evnm-space-sm );
	border-radius: var( --evnm-radius-full );
	font-size: var( --evnm-fs-sm );
	font-weight: 600;
}

.evnm-admin .evnm-status--ok {
	background: var( --evnm-success-soft );
	color: var( --evnm-success );
}

.evnm-admin .evnm-status--warn {
	background: var( --evnm-warning-soft );
	color: var( --evnm-warning );
}

.evnm-admin .evnm-status--fail {
	background: var( --evnm-danger-soft );
	color: var( --evnm-danger );
}

/* ============================================================
   Misc list compositions (pages list, moderation, chips)
   ============================================================ */
.evnm-admin .evnm-pages-list,
.evnm-admin .evnm-moderation-list {
	margin: 0;
	padding: 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: var( --evnm-space-sm );
}

.evnm-admin .evnm-pages-list__item,
.evnm-admin .evnm-moderation-item {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var( --evnm-space-md );
	padding: var( --evnm-space-md );
	border: 1px solid var( --evnm-border );
	border-radius: var( --evnm-radius-md );
	background: var( --evnm-surface-alt );
}

/* Status chip — SINGLE SOURCE consumed by BOTH the admin console and the
   front-end blocks (My Events). Unscoped on purpose: exactly one lifecycle
   palette, never re-authored per surface. */
.evnm-chip {
	display: inline-flex;
	align-items: center;
	padding: 2px var( --evnm-space-sm );
	border-radius: var( --evnm-radius-full );
	background: var( --evnm-accent-soft );
	color: var( --evnm-accent );
	font-size: var( --evnm-fs-sm );
	font-weight: 600;
}

.evnm-chip--published {
	background: var( --evnm-success-soft );
	color: var( --evnm-success );
}

.evnm-chip--pending {
	background: var( --evnm-warning-soft );
	color: var( --evnm-warning );
}

.evnm-chip--cancelled,
.evnm-chip--failed {
	background: var( --evnm-danger-soft );
	color: var( --evnm-danger );
}

.evnm-chip--paid {
	background: var( --evnm-success-soft );
	color: var( --evnm-success );
}

.evnm-chip--draft,
.evnm-chip--private,
.evnm-chip--past,
.evnm-chip--refunded {
	background: var( --evnm-surface-alt );
	color: var( --evnm-text-muted );
}

/* "Who's going" avatar stack + count (P6 social proof) — SINGLE SOURCE
   consumed by the single-event register card AND the RSVP block's
   confirmation state (markup built by evnm_attendee_stack()). Overlapping
   circles, 5 max; guests are counted in the number but never pictured.
   NOTE: this is its OWN BEM block (.evnm-attendee-stack). Do NOT name it
   .evnm-attendees — that class is the manage-attendees BLOCK ROOT, and the
   align-items:center below leaked onto that column flex container. */
.evnm-attendee-stack {
	display: flex;
	align-items: center;
	gap: var( --evnm-space-sm );
	margin-block-end: var( --evnm-space-md );
}

.evnm-attendee-stack__avatars {
	display: inline-flex;
	flex-shrink: 0;
}

.evnm-attendee-stack__avatar {
	display: inline-flex;
	width: 32px;
	height: 32px;
	border-radius: var( --evnm-radius-full );
	border: 2px solid var( --evnm-surface );
	background: var( --evnm-surface-alt );
	overflow: hidden;
	box-shadow: var( --evnm-shadow-sm );
}

.evnm-attendee-stack__avatar + .evnm-attendee-stack__avatar {
	margin-inline-start: -10px;
}

.evnm-attendee-stack__avatar img,
.evnm-attendee-stack__img {
	display: block;
	width: 100%;
	height: 100%;
	border-radius: inherit;
	object-fit: cover;
}

.evnm-attendee-stack__count {
	font-size: var( --evnm-fs-sm );
	font-weight: 600;
	color: var( --evnm-text-muted );
	white-space: nowrap;
}

.evnm-admin .evnm-note,
.evnm-admin .description {
	font-size: var( --evnm-fs-md );
	color: var( --evnm-text-muted );
}

.evnm-admin .evnm-events-filter {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var( --evnm-space-md );
	margin-block-end: var( --evnm-space-lg );
}

/* Search (Events) — sits at the end of the filter bar (Learnomy pattern). */
.evnm-admin .evnm-events-search {
	display: flex;
	align-items: center;
	gap: var( --evnm-space-sm );
	margin-inline-start: auto;
}

.evnm-admin .evnm-events-search .evnm-input {
	min-width: 220px;
	max-width: 320px;
}

/* Bulk-actions toolbar above the Attendees / Orders tables (F2). */
.evnm-admin .evnm-bulkbar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var( --evnm-space-sm );
	margin-block-end: var( --evnm-space-md );
}

.evnm-admin .evnm-bulkbar .evnm-bulk-action {
	min-width: 180px;
	max-width: 260px;
}

.evnm-admin .evnm-bulk-feedback {
	color: var( --evnm-text-muted );
	font-size: var( --evnm-fs-sm );
}

.evnm-admin .evnm-check-col {
	width: 28px;
	text-align: center;
}

/* Per-row order action buttons wrap tightly inside the Actions cell. */
.evnm-admin .evnm-order-actions {
	white-space: nowrap;
}

.evnm-admin .evnm-order-actions .evnm-btn {
	margin-inline-end: var( --evnm-space-xs );
}

@media ( max-width: 640px ) {
	.evnm-admin .evnm-bulkbar {
		align-items: stretch;
		flex-direction: column;
	}

	.evnm-admin .evnm-bulkbar .evnm-bulk-action {
		max-width: none;
	}
}

/* Pagination below the table. */
.evnm-admin .evnm-pagination {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var( --evnm-space-md );
	margin-block-start: var( --evnm-space-lg );
}

.evnm-admin .evnm-pagination__summary {
	margin: 0;
	color: var( --evnm-text-muted );
	font-size: var( --evnm-fs-sm );
}

.evnm-admin .evnm-pagination__links {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 2px;
	margin-inline-start: auto;
}

.evnm-admin .evnm-pagination__links .page-numbers {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 34px;
	min-height: 34px;
	padding: 0 var( --evnm-space-sm );
	border: 1px solid var( --evnm-border );
	border-radius: var( --evnm-radius-md );
	color: var( --evnm-text );
	font-size: var( --evnm-fs-sm );
	text-decoration: none;
	transition: background var( --evnm-transition ), color var( --evnm-transition ), border-color var( --evnm-transition );
}

.evnm-admin .evnm-pagination__links a.page-numbers:hover {
	background: var( --evnm-surface-alt );
	border-color: var( --evnm-accent );
	color: var( --evnm-accent );
}

.evnm-admin .evnm-pagination__links a.page-numbers:focus-visible {
	outline: 2px solid var( --evnm-accent );
	outline-offset: 2px;
}

.evnm-admin .evnm-pagination__links .page-numbers.current {
	background: var( --evnm-accent );
	border-color: var( --evnm-accent );
	color: var( --evnm-accent-contrast, #fff );
	font-weight: 600;
}

.evnm-admin .evnm-pagination__links .page-numbers.dots {
	border-color: transparent;
	min-width: 0;
}

/* Status filter nav (Events) */
.evnm-admin .evnm-status-nav {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var( --evnm-space-xs );
	font-size: var( --evnm-fs-md );
}

.evnm-admin .evnm-status-link {
	padding: var( --evnm-space-xs ) var( --evnm-space-md );
	border-radius: var( --evnm-radius-full );
	color: var( --evnm-text-muted );
	text-decoration: none;
	transition: background var( --evnm-transition ), color var( --evnm-transition );
}

.evnm-admin .evnm-status-link:hover {
	background: var( --evnm-surface-alt );
	color: var( --evnm-text );
}

.evnm-admin .evnm-status-link.is-active {
	background: var( --evnm-accent-soft );
	color: var( --evnm-accent );
	font-weight: 600;
}

.evnm-admin .evnm-status-sep {
	color: var( --evnm-border-strong );
}

/* Inline counter (e.g. moderation queue) */
.evnm-admin .evnm-count {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 22px;
	height: 22px;
	padding: 0 var( --evnm-space-xs );
	border-radius: var( --evnm-radius-full );
	background: var( --evnm-accent-soft );
	color: var( --evnm-accent );
	font-size: var( --evnm-fs-sm );
	font-weight: 700;
	vertical-align: middle;
}

.evnm-admin .evnm-moderation-author {
	color: var( --evnm-text-muted );
	font-size: var( --evnm-fs-sm );
}

.evnm-admin .evnm-moderation-actions {
	display: flex;
	gap: var( --evnm-space-sm );
	flex-shrink: 0;
}

.evnm-admin .evnm-events-toolbar {
	justify-content: flex-end;
}

/* ============================================================
   Events lifecycle pipeline + per-event health (Events screen)
   ============================================================ */
.evnm-admin .evnm-pipeline {
	display: flex;
	flex-wrap: wrap;
	align-items: stretch;
	gap: var( --evnm-space-xs );
	width: 100%;
}

.evnm-admin .evnm-pipeline__stage {
	display: inline-flex;
	align-items: center;
	gap: var( --evnm-space-xs );
	min-height: var( --evnm-control-h );
	padding: 0 var( --evnm-space-md );
	border: 1px solid var( --evnm-border );
	border-radius: var( --evnm-radius-full );
	color: var( --evnm-text-muted );
	background: var( --evnm-surface );
	font-size: var( --evnm-fs-md );
	text-decoration: none;
	transition: background var( --evnm-transition ), color var( --evnm-transition ), border-color var( --evnm-transition );
}

.evnm-admin .evnm-pipeline__stage:hover {
	color: var( --evnm-text );
	background: var( --evnm-surface-alt );
	border-color: var( --evnm-border-strong );
}

.evnm-admin .evnm-pipeline__stage.is-active {
	color: var( --evnm-accent );
	background: var( --evnm-accent-soft );
	border-color: var( --evnm-accent );
	font-weight: 600;
}

.evnm-admin .evnm-pipeline__count {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: var( --evnm-badge-size );
	height: var( --evnm-badge-size );
	padding: 0 var( --evnm-space-xs );
	border-radius: var( --evnm-radius-full );
	background: var( --evnm-surface-alt );
	color: var( --evnm-text-muted );
	font-size: var( --evnm-fs-sm );
	font-weight: 700;
	line-height: 1;
}

.evnm-admin .evnm-pipeline__stage.is-active .evnm-pipeline__count {
	background: var( --evnm-accent );
	color: var( --evnm-accent-contrast );
}

/* Per-event health cells */
.evnm-admin .evnm-events-table__muted {
	color: var( --evnm-text-tertiary );
}

.evnm-admin .evnm-cap {
	display: inline-flex;
	align-items: center;
	white-space: nowrap;
	color: var( --evnm-text );
}

.evnm-admin .evnm-cap--high {
	color: var( --evnm-warning );
	font-weight: 600;
}

.evnm-admin .evnm-cap--full {
	color: var( --evnm-danger );
	font-weight: 600;
}

.evnm-admin .evnm-events-table__actions {
	/* Flex row so the mix of <a> links and inline <form> buttons (Verify /
	   Delete) sits on one aligned line - block-level forms used to break onto
	   their own lines, staggering the actions and inflating row height. */
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: flex-end;
	gap: var( --evnm-space-xs );
}

/* ============================================================
   Focus-visible rings (R14) — every interactive element
   ============================================================ */
.evnm-admin a:focus-visible,
.evnm-admin button:focus-visible,
.evnm-admin .button:focus-visible,
.evnm-btn:focus-visible,
.evnm-admin input:focus-visible,
.evnm-admin select:focus-visible,
.evnm-admin textarea:focus-visible,
.evnm-admin [tabindex]:focus-visible {
	outline: 2px solid var( --evnm-accent );
	outline-offset: 2px;
	box-shadow: none;
}

@media ( prefers-reduced-motion: reduce ) {
	.evnm-admin * {
		transition: none !important;
	}
}

/* ============================================================
   Responsive — exactly two breakpoints, anchored at file bottom
   ============================================================ */
@media ( max-width: 1024px ) {
	/* Rail collapses to icon-only. */
	.evnm-admin .evnm-shell__body {
		grid-template-columns: var( --evnm-rail-w-collapsed ) minmax( 0, 1fr );
	}

	.evnm-admin .evnm-shell__rail {
		padding-inline: var( --evnm-space-xs );
	}

	.evnm-admin .evnm-rail__group-label,
	.evnm-admin .evnm-rail__label,
	.evnm-admin .evnm-rail__badge {
		/* Visually hidden but kept for AT (logical, no left/right). */
		position: absolute;
		width: 1px;
		height: 1px;
		padding: 0;
		margin: -1px;
		overflow: hidden;
		clip: rect( 0 0 0 0 );
		white-space: nowrap;
		border: 0;
	}

	.evnm-admin .evnm-rail__item {
		justify-content: center;
		padding-inline: 0;
	}

	.evnm-admin .evnm-shell__breadcrumb {
		display: none;
	}

	.evnm-admin .evnm-shell__main {
		padding: var( --evnm-space-xl );
	}

	/* Rule 17 sub-nav collapses to icon-only with the rail at this width. */
	.evnm-admin .evnm-rail__sub {
		margin-inline-start: 0;
		padding-inline-start: 0;
		border-inline-start: 0;
		align-items: center;
	}

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

	.evnm-admin .evnm-rail__sub-item {
		justify-content: center;
		padding-inline: 0;
	}

	.evnm-admin .evnm-stats-row,
	.evnm-admin .evnm-kpi-grid {
		grid-template-columns: repeat( 2, 1fr );
	}

	.evnm-admin .evnm-card {
		padding: var( --evnm-space-lg );
	}
}

@media ( max-width: 640px ) {
	.evnm-admin .evnm-admin-header__title {
		font-size: var( --evnm-fs-xl );
	}

	.evnm-admin .evnm-stats-row,
	.evnm-admin .evnm-kpi-grid {
		grid-template-columns: 1fr;
	}

	/* Attention rows stack vertically so the action link gets its own line. */
	.evnm-admin .evnm-attention__row {
		flex-wrap: wrap;
	}

	.evnm-admin .evnm-attention__message {
		flex-basis: calc( 100% - var( --evnm-space-2xl ) );
	}

	.evnm-admin .evnm-attention__action {
		margin-inline-start: calc( 18px + var( --evnm-space-md ) );
	}

	/* Setup banner stacks: icon+text on top, full-width action below. */
	.evnm-admin .evnm-setup-banner {
		flex-wrap: wrap;
	}

	.evnm-admin .evnm-setup-banner__action {
		flex-basis: 100%;
		justify-content: center;
	}

	.evnm-admin .evnm-field {
		max-width: none;
	}

	/* Stack label above its control on phones. The desktop 2-column grid
	   (label | control) collapses the control column to a few px at phone
	   widths, making wide inputs/selects unusable. Checkbox / checkgroup rows
	   keep their inline layout (the box sits beside its label). */
	.evnm-admin .evnm-field:not( .evnm-field--checkbox ):not( .evnm-field--checkgroup ),
	.evnm-scope .evnm-field:not( .evnm-field--checkbox ):not( .evnm-field--checkgroup ) {
		grid-template-columns: minmax( 0, 1fr );
		row-gap: var( --evnm-space-2xs, 4px );
	}

	.evnm-admin .evnm-field:not( .evnm-field--checkbox ):not( .evnm-field--checkgroup ) > label,
	.evnm-admin .evnm-field:not( .evnm-field--checkbox ):not( .evnm-field--checkgroup ) > .evnm-input,
	.evnm-admin .evnm-field:not( .evnm-field--checkbox ):not( .evnm-field--checkgroup ) > select,
	.evnm-admin .evnm-field:not( .evnm-field--checkbox ):not( .evnm-field--checkgroup ) > input,
	.evnm-admin .evnm-field:not( .evnm-field--checkbox ):not( .evnm-field--checkgroup ) > textarea,
	.evnm-admin .evnm-field:not( .evnm-field--checkbox ):not( .evnm-field--checkgroup ) > .evnm-note,
	.evnm-admin .evnm-field:not( .evnm-field--checkbox ):not( .evnm-field--checkgroup ) > .evnm-field__saved,
	.evnm-scope .evnm-field:not( .evnm-field--checkbox ):not( .evnm-field--checkgroup ) > label,
	.evnm-scope .evnm-field:not( .evnm-field--checkbox ):not( .evnm-field--checkgroup ) > .evnm-input,
	.evnm-scope .evnm-field:not( .evnm-field--checkbox ):not( .evnm-field--checkgroup ) > .evnm-note {
		grid-column: 1;
		grid-row: auto;
	}

	.evnm-admin .evnm-field:not( .evnm-field--checkbox ):not( .evnm-field--checkgroup ) > label {
		padding-block-start: 0;
	}

	/* Checkbox rows keep the box beside the label, but their descriptive note
	   must span the full width — in the 2-col grid it otherwise crams into the
	   narrow control column below the box. */
	.evnm-admin .evnm-field--checkbox > .evnm-note {
		grid-column: 1 / -1;
		grid-row: auto;
	}

	/* Opt-in responsive table: `.evnm-table--stack` rows collapse into labelled
	   cards on phones so every column is visible without a horizontal scroll.
	   Each data <td> carries data-label="Column"; the first cell is the card
	   title, the actions cell is a right-aligned button row. */
	.evnm-admin .evnm-table--stack,
	.evnm-admin .evnm-table--stack tbody {
		display: block;
	}

	.evnm-admin .evnm-table--stack thead {
		display: none;
	}

	.evnm-admin .evnm-table--stack tr {
		display: block;
		/* Uniform card surface — overrides the desktop zebra striping on mobile. */
		background: var( --evnm-surface ) !important;
		border: 1px solid var( --evnm-border );
		border-radius: var( --evnm-radius-md );
		padding: var( --evnm-space-md );
		margin-block-end: var( --evnm-space-sm );
	}

	.evnm-admin .evnm-table--stack td {
		display: flex;
		justify-content: space-between;
		align-items: baseline;
		gap: var( --evnm-space-md );
		padding: var( --evnm-space-2xs ) 0;
		border: none;
		text-align: start;
	}

	.evnm-admin .evnm-table--stack td[data-label]::before {
		content: attr( data-label );
		flex: 0 0 auto;
		font-size: var( --evnm-fs-sm );
		font-weight: 600;
		color: var( --evnm-text-muted );
	}

	/* First cell = the card title (source name + URL): full width, no label. */
	.evnm-admin .evnm-table--stack td:first-child {
		display: block;
		padding-block-end: var( --evnm-space-xs );
		margin-block-end: var( --evnm-space-2xs );
		border-block-end: 1px solid var( --evnm-border-subtle, var( --evnm-border ) );
	}

	/* Actions cell: keep the button row, right-aligned, below the facts. */
	.evnm-admin .evnm-table--stack td.evnm-events-table__actions {
		justify-content: flex-end;
		padding-block-start: var( --evnm-space-xs );
	}

	/* Off-canvas rail: single column; rail slides in over the content. */
	.evnm-admin .evnm-shell__body {
		grid-template-columns: minmax( 0, 1fr );
	}

	.evnm-admin .evnm-shell__rail-toggle {
		display: inline-flex;
	}

	.evnm-admin .evnm-shell__rail {
		position: fixed;
		inset-block: 0;
		inset-inline-start: 0;
		z-index: 30;
		width: var( --evnm-rail-w );
		max-height: 100vh;
		padding: var( --evnm-space-lg ) var( --evnm-space-md );
		box-shadow: var( --evnm-shadow-md );
		transform: translateX( -100% );
		transition: transform var( --evnm-transition );
	}

	/* RTL: slide in from the opposite edge. */
	[dir="rtl"] .evnm-admin .evnm-shell__rail {
		transform: translateX( 100% );
	}

	.evnm-admin .evnm-shell.is-rail-open .evnm-shell__rail {
		transform: translateX( 0 );
	}

	/* Restore full labels when the off-canvas rail is open. */
	.evnm-admin .evnm-shell__rail .evnm-rail__group-label,
	.evnm-admin .evnm-shell__rail .evnm-rail__label,
	.evnm-admin .evnm-shell__rail .evnm-rail__badge {
		position: static;
		width: auto;
		height: auto;
		margin: 0;
		clip: auto;
		overflow: visible;
	}

	.evnm-admin .evnm-shell__rail .evnm-rail__item {
		justify-content: flex-start;
		padding-inline: var( --evnm-space-md );
	}

	/* Rule 17: restore the nested Settings sub-nav (labels + indent guide)
	   when the off-canvas rail is open on mobile. */
	.evnm-admin .evnm-shell__rail .evnm-rail__sub-label {
		position: static;
		width: auto;
		height: auto;
		margin: 0;
		clip: auto;
		overflow: visible;
	}

	.evnm-admin .evnm-shell__rail .evnm-rail__sub {
		align-items: stretch;
		margin-inline-start: var( --evnm-space-md );
		padding-inline-start: var( --evnm-space-lg );
		border-inline-start: 1px solid var( --evnm-border );
	}

	.evnm-admin .evnm-shell__rail .evnm-rail__sub-item {
		justify-content: flex-start;
		padding-inline: var( --evnm-space-sm );
	}

	.evnm-admin .evnm-shell__rail-backdrop {
		position: fixed;
		inset: 0;
		z-index: 29;
		background: rgba( 15, 23, 42, 0.45 );
		border: 0;
		padding: 0;
		margin: 0;
		cursor: pointer;
	}

	.evnm-admin .evnm-shell__brand-name {
		display: none;
	}

	/* ---- 390px top-bar polish ----------------------------------------
	   Fit the rail-toggle + brand + health chip + Create button on one
	   row at 390px with no horizontal scroll. Tokens only. */
	.evnm-admin .evnm-shell__topbar {
		gap: var( --evnm-space-sm );
		padding-inline: var( --evnm-space-md );
	}

	/* The breadcrumb + version chip would crowd the row — drop them; the
	   per-page heading still names the screen below the bar. */
	.evnm-admin .evnm-shell__breadcrumb,
	.evnm-admin .evnm-shell__version,
	.evnm-admin .evnm-shell__search {
		display: none;
	}

	/* Brand collapses to the icon only (name already hidden above). */
	.evnm-admin .evnm-shell__brand {
		margin-inline-end: auto;
	}

	.evnm-admin .evnm-shell__topbar-actions {
		gap: var( --evnm-space-xs );
		margin-inline-start: 0;
	}

	/* Health chip keeps its icon + count, drops the wordy label so it
	   reads as a compact signal instead of a full sentence. The aria-label
	   on the chip preserves the accessible name. */
	.evnm-admin .evnm-health-chip {
		padding-inline: var( --evnm-space-sm );
	}

	.evnm-admin .evnm-health-chip__label {
		position: absolute;
		width: 1px;
		height: 1px;
		margin: -1px;
		padding: 0;
		overflow: hidden;
		clip: rect( 0, 0, 0, 0 );
		white-space: nowrap;
		border: 0;
	}

	/* Surface the compact count next to the icon (warning chip only — the
	   "ok" chip has no count and stays icon-only). */
	.evnm-admin .evnm-health-chip__count {
		display: inline-flex;
	}

	/* Create button shrinks to a compact icon + short label. */
	.evnm-admin .evnm-shell__create {
		padding-inline: var( --evnm-space-md );
	}

	.evnm-admin .evnm-shell__create-label {
		position: absolute;
		width: 1px;
		height: 1px;
		margin: -1px;
		padding: 0;
		overflow: hidden;
		clip: rect( 0, 0, 0, 0 );
		white-space: nowrap;
		border: 0;
	}
}

/* ============================================================
   Shared confirm modal (window.evnmConfirm — ux-foundation Rule 8)
   Mounted inside .evnm-admin so tokens + .evnm-btn apply.
   ============================================================ */
.evnm-admin .evnm-modal-overlay {
	position: fixed;
	inset: 0;
	z-index: 100000;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: var( --evnm-space-lg );
	background: rgba( 15, 23, 42, 0.55 );
}

.evnm-admin .evnm-modal {
	width: 100%;
	max-width: 28rem;
	padding: var( --evnm-space-xl );
	background: var( --evnm-surface, #fff );
	border-radius: var( --evnm-radius-lg );
	box-shadow: 0 10px 40px rgba( 0, 0, 0, 0.25 );
}

.evnm-admin .evnm-modal__message {
	margin: 0 0 var( --evnm-space-lg );
	font-size: var( --evnm-fs-md );
	line-height: 1.5;
	color: var( --evnm-text );
}

.evnm-admin .evnm-modal__actions {
	display: flex;
	justify-content: flex-end;
	gap: var( --evnm-space-sm );
}

@media ( prefers-reduced-motion: no-preference ) {
	.evnm-admin .evnm-modal-overlay {
		animation: evnm-fade-in var( --evnm-transition, 200ms ) ease;
	}
	.evnm-admin .evnm-modal {
		animation: evnm-pop-in var( --evnm-transition, 200ms ) ease;
	}
	@keyframes evnm-fade-in {
		from { opacity: 0; }
		to { opacity: 1; }
	}
	@keyframes evnm-pop-in {
		from { opacity: 0; transform: translateY( 8px ) scale( 0.98 ); }
		to { opacity: 1; transform: none; }
	}
}

/* ------------------------------------------------------------
   Frontend confirm modal — window.evnmConfirm mounts the overlay
   in <body> on the frontend (no .evnm-admin scope). These base
   selectors give it the same tokenised look there; the more
   specific .evnm-admin rules above still win inside wp-admin.
   ------------------------------------------------------------ */
.evnm-modal-overlay {
	position: fixed;
	inset: 0;
	z-index: 100000;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: var( --evnm-space-lg );
	background: rgba( 15, 23, 42, 0.55 );
}

.evnm-modal {
	width: 100%;
	max-width: 28rem;
	padding: var( --evnm-space-xl );
	font-family: var( --evnm-font );
	background: var( --evnm-surface );
	border-radius: var( --evnm-radius-lg );
	box-shadow: var( --evnm-shadow-md );
}

.evnm-modal__message {
	margin: 0 0 var( --evnm-space-lg );
	font-size: var( --evnm-fs-md );
	line-height: 1.5;
	color: var( --evnm-text );
}

.evnm-modal__actions {
	display: flex;
	justify-content: flex-end;
	gap: var( --evnm-space-sm );
}

.evnm-modal .evnm-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: var( --evnm-control-h );
	padding: 0 var( --evnm-space-lg );
	border: 1px solid var( --evnm-border-strong );
	border-radius: var( --evnm-radius-md );
	background: var( --evnm-surface );
	color: var( --evnm-text );
	font-family: var( --evnm-font );
	font-size: var( --evnm-fs-md );
	font-weight: 500;
	line-height: 1;
	cursor: pointer;
	transition: background var( --evnm-transition ), border-color var( --evnm-transition ), color var( --evnm-transition );
}

.evnm-modal .evnm-btn:hover {
	border-color: var( --evnm-accent );
	color: var( --evnm-accent );
}

.evnm-modal .evnm-btn:focus-visible {
	outline: 2px solid var( --evnm-accent );
	outline-offset: 2px;
}

.evnm-modal .evnm-btn--primary {
	background: var( --evnm-accent );
	border-color: var( --evnm-accent );
	color: var( --evnm-accent-contrast );
}

.evnm-modal .evnm-btn--primary:hover {
	background: var( --evnm-accent-hover );
	border-color: var( --evnm-accent-hover );
	color: var( --evnm-accent-contrast );
}

.evnm-modal .evnm-btn--danger {
	background: var( --evnm-danger );
	border-color: var( --evnm-danger );
	color: var( --evnm-accent-contrast );
}

.evnm-modal .evnm-btn--danger:hover {
	background: var( --evnm-danger );
	border-color: var( --evnm-danger );
	color: var( --evnm-accent-contrast );
	opacity: 0.92;
}

.evnm-modal .evnm-btn--ghost {
	background: transparent;
	border-color: transparent;
	color: var( --evnm-text-muted );
}

.evnm-modal .evnm-btn--ghost:hover {
	border-color: transparent;
	color: var( --evnm-text );
}

@media ( prefers-reduced-motion: no-preference ) {
	.evnm-modal-overlay {
		animation: evnm-fade-in var( --evnm-transition, 200ms ) ease;
	}
	.evnm-modal {
		animation: evnm-pop-in var( --evnm-transition, 200ms ) ease;
	}
}

/* Importer — confirm form spacing */
.evnm-import-confirm-form {
	margin-top: 1em;
}

/* ============================================================
   Event Workspace (Phase 2 Stage B) — per-event console
   ============================================================ */

/* Event header: title + status badge + meta. */
.evnm-admin .evnm-workspace__header {
	display: flex;
	flex-direction: column;
	gap: var( --evnm-space-md );
}

.evnm-admin .evnm-workspace__heading {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var( --evnm-space-md );
}

.evnm-admin .evnm-workspace__title {
	margin: 0;
	font-size: var( --evnm-fs-xl, 20px );
	font-weight: 700;
	color: var( --evnm-text );
}

.evnm-admin .evnm-workspace__meta {
	display: flex;
	flex-wrap: wrap;
	gap: var( --evnm-space-2xl );
	margin: 0;
}

.evnm-admin .evnm-workspace__meta-item {
	display: flex;
	flex-direction: column;
	gap: var( --evnm-space-xs );
}

.evnm-admin .evnm-workspace__meta-item dt {
	margin: 0;
	font-size: var( --evnm-fs-sm );
	font-weight: 600;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var( --evnm-text-tertiary );
}

.evnm-admin .evnm-workspace__meta-item dd {
	margin: 0;
	font-size: var( --evnm-fs-md );
	color: var( --evnm-text );
}

/* Tab bar — scrolls horizontally on narrow viewports (no overflow break). */
.evnm-admin .evnm-workspace-tabs {
	display: flex;
	gap: var( --evnm-space-xs );
	margin-block: var( --evnm-space-xl );
	padding-block-end: var( --evnm-space-xs );
	border-block-end: 1px solid var( --evnm-border );
	overflow-x: auto;
	scrollbar-width: thin;
}

.evnm-admin .evnm-workspace-tabs__tab {
	display: inline-flex;
	align-items: center;
	gap: var( --evnm-space-sm );
	min-height: var( --evnm-control-h );
	padding: 0 var( --evnm-space-lg );
	border: 1px solid transparent;
	border-radius: var( --evnm-radius-md );
	color: var( --evnm-text-muted );
	font-size: var( --evnm-fs-md );
	font-weight: 500;
	white-space: nowrap;
	text-decoration: none;
	transition: background var( --evnm-transition ), color var( --evnm-transition ), border-color var( --evnm-transition );
}

.evnm-admin .evnm-workspace-tabs__tab:hover {
	color: var( --evnm-text );
	background: var( --evnm-surface-alt );
}

.evnm-admin .evnm-workspace-tabs__tab.is-active {
	color: var( --evnm-accent );
	background: var( --evnm-accent-soft );
	border-color: var( --evnm-accent );
	font-weight: 600;
}

.evnm-admin .evnm-workspace-tabs__tab:focus-visible {
	outline: 2px solid var( --evnm-accent );
	outline-offset: 2px;
}

.evnm-admin .evnm-workspace-tabs__icon {
	display: inline-flex;
	align-items: center;
}

/* Overview KPIs reuse the shared .evnm-kpi-grid / .evnm-kpi primitives. */
.evnm-admin .evnm-workspace__kpis {
	margin-block-start: var( --evnm-space-xl );
}

.evnm-admin .evnm-workspace__actions-card {
	margin-block-end: var( --evnm-space-xl );
}

/* Promote tab — let the read-only URL/embed fields span the card. */
.evnm-admin .evnm-workspace__field {
	max-width: none;
}

.evnm-admin .evnm-workspace__embed {
	font-family: var( --evnm-font-mono, monospace );
	resize: vertical;
}

/* Rail collapsed / off-canvas breakpoints already shrink .evnm-shell__main;
   the tab bar's own overflow-x handles the narrow case. At <=640 tighten the
   tab padding so all six fit the scroll comfortably. */
@media ( max-width: 640px ) {
	.evnm-admin .evnm-workspace-tabs__tab {
		padding: 0 var( --evnm-space-md );
	}

	.evnm-admin .evnm-workspace__meta {
		gap: var( --evnm-space-lg );
	}
}

/* Tools — Demo data action row (Load + Remove side by side). */
.evnm-admin .evnm-tools-actions {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var( --evnm-space-md );
	margin: var( --evnm-space-lg ) 0 0;
}

.evnm-admin .evnm-inline-form {
	margin: 0;
	display: inline-flex;
	align-items: center;
	gap: var( --evnm-space-sm );
	flex-wrap: wrap;
}

/* Blocks reference list (admin → Blocks): a clean card row per block. */
.evnm-admin .evnm-block-list {
	margin: 0 0 var( --evnm-space-lg );
	padding: 0;
	list-style: none;
	display: grid;
	gap: var( --evnm-space-sm );
}

.evnm-admin .evnm-block-list__item {
	padding: var( --evnm-space-md );
	border: 1px solid var( --evnm-border );
	border-radius: var( --evnm-radius-md, 8px );
	background: var( --evnm-surface );
}

.evnm-admin .evnm-block-list__head {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: var( --evnm-space-xs );
}

.evnm-admin .evnm-block-list__title {
	font-weight: 600;
	color: var( --evnm-text );
}

.evnm-admin .evnm-block-list__name {
	font-size: var( --evnm-fs-sm );
	color: var( --evnm-text-muted );
	background: var( --evnm-surface-alt );
	padding: 2px 6px;
	border-radius: var( --evnm-radius-sm, 4px );
}

.evnm-admin .evnm-block-list__desc {
	margin: var( --evnm-space-xs ) 0 0;
	color: var( --evnm-text-muted );
}

/* Pro blocks shown as an upsell on a Free-only install: dimmed to read as
   not-yet-available while still legible. */
.evnm-admin .evnm-block-list.is-pro-locked {
	opacity: 0.6;
}

/* Free vs Pro comparison table. */
.evnm-admin .evnm-compare__col {
	inline-size: 88px;
	text-align: center;
}

.evnm-admin .evnm-mark {
	display: inline-flex;
	align-items: center;
	justify-content: center;
}

.evnm-admin .evnm-mark--yes {
	color: var( --evnm-accent );
}

.evnm-admin .evnm-mark--no {
	color: var( --evnm-text-tertiary );
}

.evnm-admin .evnm-upgrade__status {
	margin: 0;
}

/* Command Center "Getting started" checklist. */
.evnm-admin .evnm-getting-started__header {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var( --evnm-space-sm );
	margin-block-end: var( --evnm-space-md );
}

.evnm-admin .evnm-getting-started__dismiss {
	font-size: var( --evnm-fs-sm );
	color: var( --evnm-text-muted );
	text-decoration: none;
}

.evnm-admin .evnm-getting-started__dismiss:hover {
	color: var( --evnm-accent );
}

.evnm-admin .evnm-checklist {
	margin: 0;
	padding: 0;
	list-style: none;
	display: grid;
	gap: var( --evnm-space-sm );
}

.evnm-admin .evnm-checklist__item {
	display: flex;
	align-items: center;
	gap: var( --evnm-space-sm );
	font-size: var( --evnm-fs-md );
}

.evnm-admin .evnm-checklist__item a {
	color: var( --evnm-accent );
	text-decoration: none;
	font-weight: 500;
}

.evnm-admin .evnm-checklist__item a:hover {
	text-decoration: underline;
}

.evnm-admin .evnm-checklist__item.is-done a {
	color: var( --evnm-text-muted );
}

.evnm-admin .evnm-checklist__done {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	inline-size: 20px;
	block-size: 20px;
	border-radius: 50%;
	background: var( --evnm-accent );
	color: var( --evnm-accent-contrast, #fff );
	font-size: 12px;
	flex-shrink: 0;
}

.evnm-admin .evnm-checklist__todo {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	inline-size: 20px;
	block-size: 20px;
	color: var( --evnm-text-tertiary );
	font-size: 16px;
	flex-shrink: 0;
}

/* ── Setup wizard: step progress tracker ─────────────────────────────────── */
.evnm-setup-tracker {
	display: flex;
	flex-wrap: wrap;
	gap: var(--evnm-space-sm);
	list-style: none;
	margin: 0 0 var(--evnm-space-lg);
	padding: 0;
	counter-reset: evnm-step;
}
.evnm-setup-tracker__item {
	display: flex;
	align-items: center;
	gap: var(--evnm-space-xs);
	flex: 1 1 auto;
	min-width: 0;
}
.evnm-setup-tracker__link {
	display: flex;
	align-items: center;
	gap: var(--evnm-space-xs);
	text-decoration: none;
	color: var(--evnm-text-muted);
	min-width: 0;
}
.evnm-setup-tracker__num {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 28px;
	height: 28px;
	flex: 0 0 28px;
	border-radius: var(--evnm-radius-full);
	border: 1px solid var(--evnm-border-strong);
	background: var(--evnm-surface);
	color: var(--evnm-text-muted);
	font-size: 13px;
	font-weight: 600;
	line-height: 1;
}
.evnm-setup-tracker__label {
	font-size: 13px;
	font-weight: 500;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.evnm-setup-tracker__item:not(:last-child)::after {
	content: "";
	flex: 1 1 auto;
	height: 2px;
	min-width: 12px;
	background: var(--evnm-border);
	margin: 0 var(--evnm-space-xs);
}
.evnm-setup-tracker__item.is-done .evnm-setup-tracker__num {
	background: var(--evnm-success);
	border-color: var(--evnm-success);
	color: var( --evnm-accent-contrast, #fff );
}
.evnm-setup-tracker__item.is-done .evnm-setup-tracker__label { color: var(--evnm-text); }
.evnm-setup-tracker__item.is-done:not(:last-child)::after { background: var(--evnm-success); }
.evnm-setup-tracker__item.is-current .evnm-setup-tracker__num {
	background: var(--evnm-accent);
	border-color: var(--evnm-accent);
	color: var(--evnm-accent-contrast);
}
.evnm-setup-tracker__item.is-current .evnm-setup-tracker__label { color: var(--evnm-text); font-weight: 600; }
.evnm-setup-tracker__link:focus-visible {
	outline: 2px solid var(--evnm-accent);
	outline-offset: 2px;
	border-radius: var(--evnm-radius-sm);
}
.evnm-admin .evnm-setup-step { max-width: 760px; }
/* Padded body for wizard steps (the card--form itself is padding:0). */
.evnm-admin .evnm-setup-step__body { padding: var(--evnm-space-2xl); }
.evnm-admin .evnm-setup-step__intro {
	margin: 0 0 var(--evnm-space-lg);
	color: var(--evnm-text-muted);
	font-size: var(--evnm-fs-md);
	line-height: 1.6;
}
.evnm-admin .evnm-setup-step__body .evnm-field { margin: 0 0 var(--evnm-space-lg); }
.evnm-admin .evnm-setup-step__body .evnm-field:last-of-type { margin-bottom: 0; }
.evnm-admin .evnm-setup-step__body .evnm-input { min-width: 280px; max-width: 100%; }
.evnm-admin .evnm-setup-nav {
	display: flex;
	flex-wrap: wrap;
	gap: var(--evnm-space-sm);
	align-items: center;
	margin: var(--evnm-space-xl) 0 0;
}
/* INTENTIONAL EXEMPTION to the 640/1024 breakpoint contract: the setup tracker
   is a wp-admin-only surface and this 782px is WordPress admin's own responsive
   breakpoint (the admin menu/bar collapse width, `$breakpoint-medium`). Aligning
   the step-label collapse to WP's breakpoint keeps the wizard in step with the
   surrounding admin chrome; it is deliberately not one of the plugin's own two
   frontend breakpoints. */
@media (max-width: 782px) {
	.evnm-setup-tracker__item:not(:last-child)::after { display: none; }
	.evnm-setup-tracker__label { display: none; }
	.evnm-setup-tracker__item.is-current .evnm-setup-tracker__label { display: inline; }
}

/* ── Tools → Importer: migration rails (scan report, background job, undo) ── */
.evnm-import-scan__types,
.evnm-import-job__counts {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
	gap: var(--evnm-space-xs) var(--evnm-space-md);
	list-style: none;
	margin: var(--evnm-space-sm) 0 var(--evnm-space-md);
	padding: 0;
}
.evnm-import-scan__types li,
.evnm-import-job__counts li {
	margin: 0;
	color: var(--evnm-text-muted);
	font-size: 13px;
}
.evnm-import-scan__types li strong,
.evnm-import-job__counts li strong {
	color: var(--evnm-text);
	font-variant-numeric: tabular-nums;
}
.evnm-progress {
	inline-size: 100%;
	block-size: 10px;
	border-radius: var(--evnm-radius-full);
	background: var(--evnm-surface-muted);
	overflow: hidden;
	margin: var(--evnm-space-sm) 0 var(--evnm-space-xs);
}
.evnm-progress__bar {
	block-size: 100%;
	inline-size: 0%;
	border-radius: inherit;
	background: var(--evnm-accent);
	transition: inline-size 0.4s ease;
}
.evnm-import-job__meta {
	margin-block-start: 0;
	color: var(--evnm-text-muted);
	font-variant-numeric: tabular-nums;
}
.evnm-import-job__errors,
.evnm-import-scan__errors {
	margin-block: var(--evnm-space-sm);
}
.evnm-import-undo-form {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: var(--evnm-space-sm);
	margin-block: var(--evnm-space-sm);
}
.evnm-import-undo-form__what {
	min-inline-size: 220px;
	font-weight: 600;
}
@media (max-width: 640px) {
	.evnm-import-undo-form {
		align-items: stretch;
		flex-direction: column;
	}
	.evnm-import-undo-form__what {
		min-inline-size: 0;
	}
}

/* ============================================================
   Sortable admin table headers (Events / Attendees / Orders)
   WP admin convention: the header cell is a link that toggles
   evnm_orderby/evnm_order; the active column shows a direction arrow.
   ============================================================ */
.evnm-admin .evnm-table th.evnm-th-sortable {
	padding: 0;
}

.evnm-admin .evnm-table .evnm-th-sort {
	display: inline-flex;
	align-items: center;
	gap: var( --evnm-space-xs );
	padding: var( --evnm-space-md );
	color: inherit;
	font-weight: inherit;
	text-decoration: none;
}

.evnm-admin .evnm-table .evnm-th-sort:hover,
.evnm-admin .evnm-table .evnm-th-sort:focus-visible {
	color: var( --evnm-accent );
	text-decoration: none;
}

/* Direction arrow: hidden until the column is sorted; hover previews it. */
.evnm-admin .evnm-table .evnm-th-sort__arrow::before {
	content: "\2191\2193"; /* ↑↓ */
	font-size: 10px;
	letter-spacing: -2px;
	opacity: 0;
}

.evnm-admin .evnm-table .evnm-th-sort:hover .evnm-th-sort__arrow::before {
	opacity: 0.45;
}

.evnm-admin .evnm-table th.is-sorted .evnm-th-sort__arrow::before {
	opacity: 1;
}

.evnm-admin .evnm-table th.is-sorted.is-asc .evnm-th-sort__arrow::before {
	content: "\2191"; /* ↑ */
	letter-spacing: 0;
}

.evnm-admin .evnm-table th.is-sorted.is-desc .evnm-th-sort__arrow::before {
	content: "\2193"; /* ↓ */
	letter-spacing: 0;
}

/* ============================================================
   Settings-saved toast (E9): small token-styled confirmation that
   mirrors the settings_errors notice (which stays for a11y/no-JS).
   Injected by admin-settings.js on ?settings-updated=true.
   ============================================================ */
.evnm-toast {
	position: fixed;
	inset-block-start: 48px; /* clear the 32px admin bar */
	inset-inline-end: var( --evnm-space-xl );
	z-index: 99999;
	display: inline-flex;
	align-items: center;
	gap: var( --evnm-space-sm );
	max-inline-size: 320px;
	padding: var( --evnm-space-md ) var( --evnm-space-lg );
	background: var( --evnm-success-surface );
	color: var( --evnm-success-on-surface );
	border: 1px solid var( --evnm-success );
	border-radius: var( --evnm-radius-md );
	box-shadow: var( --evnm-shadow-lg );
	font-size: var( --evnm-fs-md );
	font-weight: 600;
	opacity: 0;
	transform: translateY( -6px );
}

.evnm-toast.is-visible {
	opacity: 1;
	transform: translateY( 0 );
}

@media ( prefers-reduced-motion: no-preference ) {
	.evnm-toast {
		transition: opacity 0.25s ease, transform 0.25s ease;
	}
}

/* ============================================================
   Form-card content spacing (QA card 10074099843): .evnm-card--form
   zeroes the card padding and pads its DIRECT children, so anything
   nested inside a <form> (catalog edit fields, merge tool, Save row)
   rendered flush against the card border. One shared rule restores the
   card's row padding for form-wrapped content on every page using the
   form-card pattern.
   ============================================================ */
.evnm-admin .evnm-card--form > form {
	padding: var( --evnm-space-lg ) var( --evnm-space-2xl );
}

/* Same family: the Tools demo-data action row and inline notices are direct
   children of a padding-0 form card. */
.evnm-admin .evnm-card--form > .evnm-tools-actions {
	padding: 0 var( --evnm-space-2xl ) var( --evnm-space-lg );
}

.evnm-admin .evnm-card--form > .notice {
	margin-inline: var( --evnm-space-2xl );
}

/* Busy submit buttons (data-evnm-busy, wired in admin-shell.js): a small
   inline spinner replaces the idle look while the POST runs. */
.evnm-admin .evnm-btn.is-busy {
	opacity: 0.75;
	pointer-events: none;
}

.evnm-admin .evnm-btn.is-busy::before {
	content: "";
	display: inline-block;
	inline-size: 12px;
	block-size: 12px;
	margin-inline-end: var( --evnm-space-sm );
	border: 2px solid currentColor;
	border-inline-start-color: transparent;
	border-radius: 50%;
	vertical-align: -2px;
}

@media ( prefers-reduced-motion: no-preference ) {
	.evnm-admin .evnm-btn.is-busy::before {
		animation: evnm-busy-spin 0.8s linear infinite;
	}
}

@keyframes evnm-busy-spin {
	to {
		transform: rotate( 360deg );
	}
}

/* Admin list search/filter row: with the category select added (F3) the row
   can exceed small viewports — let it wrap, and stack cleanly under 640px. */
.evnm-admin .evnm-events-search {
	flex-wrap: wrap;
}

@media ( max-width: 640px ) {
	.evnm-admin .evnm-events-search {
		inline-size: 100%;
	}

	.evnm-admin .evnm-events-search .evnm-input {
		min-width: 0;
		flex: 1 1 100%;
	}
}
