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

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

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

	[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. */
.evnm-scope[hidden],
.evnm-scope [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;
}

.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
   ============================================================ */
.evnm-admin .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 {
	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 {
	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 {
	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 );
	color: var( --evnm-accent-contrast, #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: var( --evnm-accent-contrast, #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 ) !important;
	text-decoration: underline !important;
	box-shadow: none !important;
}

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

/* ============================================================
   Input primitive (+ restyle WP form controls inside our scope)
   ============================================================ */
.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 {
	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 {
	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 {
	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 {
	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 {
	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
   ============================================================ */
.evnm-admin .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 {
	background: var( --evnm-success-soft );
	color: var( --evnm-success );
}

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

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

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

/* ============================================================
   Empty-state primitive
   ============================================================ */
.evnm-admin .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 {
	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 {
	margin: 0;
	font-size: var( --evnm-fs-lg );
	font-weight: 600;
	color: var( --evnm-text );
}

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

.evnm-admin .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. */
.evnm-attendees {
	display: flex;
	align-items: center;
	gap: var( --evnm-space-sm );
	margin-block-end: var( --evnm-space-md );
}

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

.evnm-attendees__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-attendees__avatar + .evnm-attendees__avatar {
	margin-inline-start: -10px;
}

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

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

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

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