/* chirp-ui — A love letter to CSS and HTML over the wire.
 *
 * Gorgeous by default. Unapologetically modern. Override any --chirpui-*
 * variable in your own CSS to customize.
 */

/* ==========================================================================
   Tokens — Design system foundation

   Token tiers:
   1) Core primitives: spacing, type, radius, base color, motion, shadow
   2) Semantic tokens: stateful color + interaction semantics
   3) Component aliases: per-component defaults that map to semantic/core

   Theme precedence:
   :root defaults -> [data-theme="light"|"dark"|"system"] mode overrides
   -> @supports capability overrides (oklch, color-mix in oklch)
   ========================================================================== */

/* Alpine x-cloak — hide until Alpine initializes */
[x-cloak] { display: none !important; }

:root {
    font-optical-sizing: var(--chirpui-font-optical-sizing, auto);

    /* Spacing — fluid scale with clamp() */
    --chirpui-spacing-xs: 0.25rem;
    --chirpui-spacing-sm: clamp(0.375rem, 1vw, 0.5rem);
    --chirpui-spacing: clamp(0.5rem, 2vw, 1rem);
    --chirpui-spacing-md: clamp(0.75rem, 3vw, 1.25rem);
    --chirpui-spacing-lg: clamp(1rem, 4vw, 1.5rem);
    --chirpui-spacing-xl: clamp(1.25rem, 5vw, 2rem);
    --chirpui-spacing-2xl: clamp(1.5rem, 6vw, 2.5rem);
    --chirpui-spacing-3xl: clamp(2rem, 8vw, 3rem);

    /* Spacing aliases — prefer these when spacing conveys role */
    --chirpui-space-inline-gap: var(--chirpui-spacing-xs);
    --chirpui-space-control-gap: var(--chirpui-spacing-sm);
    --chirpui-space-cluster-gap: var(--chirpui-spacing-xs);
    --chirpui-space-stack-gap: var(--chirpui-spacing);
    --chirpui-space-section-gap: var(--chirpui-spacing-md);
    --chirpui-space-page-gap: var(--chirpui-spacing-lg);
    --chirpui-space-container-gutter: var(--chirpui-spacing);
    --chirpui-space-card-padding: var(--chirpui-spacing);
    --chirpui-space-card-gap: var(--chirpui-spacing-sm);
    --chirpui-space-surface-padding: var(--chirpui-spacing);
    --chirpui-space-result-gap: var(--chirpui-spacing-md);
    --chirpui-measure-sm: 22rem;
    --chirpui-measure-md: 32rem;
    --chirpui-measure-lg: 48rem;

    /* Sidebar — theme-overridable */
    --chirpui-sidebar-active-bg: color-mix(in srgb, var(--chirpui-accent) 10%, transparent);
    --chirpui-sidebar-active-color: var(--chirpui-accent);
    --chirpui-sidebar-section-gap: var(--chirpui-spacing-md);
    --chirpui-sidebar-link-gap: var(--chirpui-spacing-xs);
    --chirpui-sidebar-collapsed-width: 4rem;
    --chirpui-sidebar-expanded-width: 16rem;
    --chirpui-sidebar-max-width: 20rem;

    /* Radius */
    --chirpui-radius-sm: 0.25rem;
    --chirpui-radius: 0.5rem;
    --chirpui-radius-lg: 0.75rem;
    --chirpui-radius-xl: 1rem;
    --chirpui-radius-2xl: 1.5rem;

    /* Typography — fluid scale */
    --chirpui-font-xs: 0.75rem;
    --chirpui-font-sm: clamp(0.8125rem, 1.5vw, 0.875rem);
    --chirpui-font-base: clamp(0.9375rem, 2vw, 1rem);
    --chirpui-font-lg: clamp(1.0625rem, 2.5vw, 1.125rem);
    --chirpui-font-xl: clamp(1.25rem, 3vw, 1.5rem);
    --chirpui-font-2xl: clamp(1.5rem, 4vw, 1.75rem);
    --chirpui-line-height-tight: 1.25;
    --chirpui-line-height-normal: 1.5;
    --chirpui-line-height-relaxed: 1.7;

    /* UI typography — components (badges, cards, stats, labels) */
    --chirpui-ui-xs: var(--chirpui-font-xs);
    --chirpui-ui-sm: var(--chirpui-font-sm);
    --chirpui-ui-base: var(--chirpui-font-base);
    --chirpui-ui-lg: var(--chirpui-font-lg);
    --chirpui-ui-xl: var(--chirpui-font-xl);
    --chirpui-ui-font-family: ui-sans, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
    --chirpui-ascii-font: ui-monospace, "SF Mono", "Cascadia Code", "Consolas", "Liberation Mono", monospace;
    --chirpui-font-optical-sizing: auto;
    --chirpui-ui-font-weight-normal: 400;
    --chirpui-ui-font-weight-medium: 500;
    --chirpui-ui-font-weight-semibold: 600;
    --chirpui-ui-font-weight-bold: 700;

    /* Prose typography — document content (body, headings) */
    --chirpui-prose-base: var(--chirpui-font-base);
    --chirpui-prose-sm: var(--chirpui-font-sm);
    --chirpui-prose-lg: var(--chirpui-font-lg);
    --chirpui-prose-xl: var(--chirpui-font-xl);
    --chirpui-prose-2xl: var(--chirpui-font-2xl);
    --chirpui-prose-3xl: clamp(1.75rem, 5vw, 2rem);
    --chirpui-prose-4xl: clamp(2rem, 6vw, 2.5rem);
    --chirpui-prose-5xl: clamp(2.5rem, 8vw, 3rem);
    --chirpui-prose-max-width: 65ch;
    --chirpui-prose-font-family: ui-sans, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
    --chirpui-prose-font-optical-sizing: auto;
    --chirpui-prose-font-weight-normal: 400;
    --chirpui-prose-font-weight-medium: 500;
    --chirpui-prose-font-weight-heading: 600;
    --chirpui-prose-font-weight-bold: 700;

    /* Prose spacing — conventional vertical rhythm (override for looser/tighter) */
    --chirpui-prose-spacing: 0.5em;
    --chirpui-prose-spacing-heading: 0.75em;

    /* Color — semantic tokens; light-dark() for dark mode (no @media duplication) */
    color-scheme: light dark;
    --chirpui-text: light-dark(#1e293b, #f1f5f9);
    --chirpui-text-muted: light-dark(#64748b, #94a3b8);
    --chirpui-surface: light-dark(#ffffff, #1e293b);
    --chirpui-surface-alt: light-dark(#f8fafc, #334155);
    --chirpui-border: light-dark(#e2e8f0, #475569);
    --chirpui-border-subtle: color-mix(in srgb, var(--chirpui-border) 70%, transparent);
    --chirpui-accent: light-dark(#0284c7, #38bdf8);
    --chirpui-accent-hover: color-mix(in srgb, var(--chirpui-accent) var(--chirpui-shade-hover), black);
    --chirpui-bg: light-dark(#f8fafc, #0f172a);
    --chirpui-bg-subtle: light-dark(#f1f5f9, #1e293b);
    --chirpui-surface-elevated: var(--chirpui-surface-alt);
    --chirpui-focus-ring: color-mix(in srgb, var(--chirpui-accent) 30%, transparent);

    /* Semantic — badges, status, progress, errors; *-muted use generic shade */
    --chirpui-primary: light-dark(#5b9cf5, #93bbfc);
    --chirpui-success: light-dark(#22c55e, #4ade80);
    --chirpui-warning: light-dark(#f59e5b, #fbbf24);
    --chirpui-error: light-dark(#dc2626, #f87171);
    --chirpui-muted: light-dark(#6b7280, #9ca3af);

    /* Optional component aliases */
    --chirpui-card-header-color: var(--chirpui-text);
    --chirpui-card-hover-border: var(--chirpui-border);
    --chirpui-card-hover-shadow: var(--chirpui-elevation-2);

    /* Card body links — titles/primary links in card content (no underline; card signals clickability) */
    --chirpui-card-body-link-color: var(--chirpui-text);
    --chirpui-card-body-link-decoration: none;
    --chirpui-card-body-link-hover-color: var(--chirpui-accent);

    /* Generic shade modifiers — apply to any color via color-mix(); themes override for global tuning */
    --chirpui-shade-hover: 85%;
    --chirpui-shade-active: 70%;
    --chirpui-shade-light: 15%;
    --chirpui-shade-dim: 40%;
    --chirpui-shade-bright: 85%;
    --chirpui-shade-muted: 15%;

    /* Derived accent states — use generic shades; override base --chirpui-accent for all */
    --chirpui-accent-dim: color-mix(in srgb, var(--chirpui-accent) var(--chirpui-shade-dim), black);
    --chirpui-accent-bright: color-mix(in srgb, var(--chirpui-accent) var(--chirpui-shade-bright), white);
    --chirpui-accent-light: color-mix(in srgb, var(--chirpui-accent) var(--chirpui-shade-light), white);
    --chirpui-accent-active: color-mix(in srgb, var(--chirpui-accent) var(--chirpui-shade-active), black);

    /* Semantic muted backgrounds — derived via generic shade */
    --chirpui-primary-muted: color-mix(in srgb, var(--chirpui-primary) var(--chirpui-shade-muted), white);
    --chirpui-success-muted: color-mix(in srgb, var(--chirpui-success) var(--chirpui-shade-muted), white);
    --chirpui-warning-muted: color-mix(in srgb, var(--chirpui-warning) var(--chirpui-shade-muted), white);
    --chirpui-error-muted: color-mix(in srgb, var(--chirpui-error) var(--chirpui-shade-muted), white);
    --chirpui-muted-bg: color-mix(in srgb, var(--chirpui-muted) var(--chirpui-shade-muted), white);

    /* Info semantic — alias of accent; override --chirpui-accent to change both */
    --chirpui-info: var(--chirpui-accent);

    /* Alert/admonition text/icon colors — derive from semantic base */
    --chirpui-alert-info-color: var(--chirpui-info);
    --chirpui-alert-success-color: var(--chirpui-success);
    --chirpui-alert-warning-color: var(--chirpui-warning);
    --chirpui-alert-error-color: var(--chirpui-error);

    /* Secondary accent — second brand color for gradients, docs blocks, code syntax */
    --chirpui-accent-secondary: light-dark(#7c3aed, #a78bfa);
    --chirpui-accent-secondary-muted: color-mix(in srgb, var(--chirpui-accent-secondary) var(--chirpui-shade-muted), white);
    --chirpui-alert-secondary-bg: light-dark(#f5f3ff, #2e1065);
    --chirpui-alert-secondary-border: light-dark(#c4b5fd, #7c3aed);
    --chirpui-alert-secondary-color: var(--chirpui-accent-secondary);

    /* HTTP method tokens — API docs; map to semantic by default */
    --chirpui-method-get: var(--chirpui-info);
    --chirpui-method-get-bg: var(--chirpui-alert-info-bg);
    --chirpui-method-get-border: var(--chirpui-alert-info-border);
    --chirpui-method-post: var(--chirpui-success);
    --chirpui-method-post-bg: var(--chirpui-alert-success-bg);
    --chirpui-method-post-border: var(--chirpui-alert-success-border);
    --chirpui-method-put: var(--chirpui-warning);
    --chirpui-method-put-bg: var(--chirpui-alert-warning-bg);
    --chirpui-method-put-border: var(--chirpui-alert-warning-border);
    --chirpui-method-patch: var(--chirpui-warning);
    --chirpui-method-patch-bg: var(--chirpui-alert-warning-bg);
    --chirpui-method-patch-border: var(--chirpui-alert-warning-border);
    --chirpui-method-delete: var(--chirpui-error);
    --chirpui-method-delete-bg: var(--chirpui-alert-error-bg);
    --chirpui-method-delete-border: var(--chirpui-alert-error-border);
    --chirpui-method-head: var(--chirpui-muted);
    --chirpui-method-head-bg: var(--chirpui-muted-bg);
    --chirpui-method-head-border: var(--chirpui-border);
    --chirpui-method-options: var(--chirpui-muted);
    --chirpui-method-options-bg: var(--chirpui-muted-bg);
    --chirpui-method-options-border: var(--chirpui-border);

    /* Code syntax — inline code, code blocks, syntax highlighting */
    --chirpui-code-bg: light-dark(#f1f5f9, #1e293b);
    --chirpui-code-text: light-dark(#334155, #cbd5e1);
    --chirpui-code-type: var(--chirpui-info);
    --chirpui-code-type-bg: var(--chirpui-alert-info-bg);
    --chirpui-code-keyword: light-dark(#7c3aed, #a78bfa);
    --chirpui-code-string: light-dark(#059669, #34d399);
    --chirpui-code-number: light-dark(#d97706, #fbbf24);

    /* Code typography — font, size, line-height */
    --chirpui-code-font-family: ui-monospace, ui-serif, "Cascadia Code", "Fira Code", "JetBrains Mono", "SF Mono", Consolas, monospace;
    --chirpui-mono-font-family: var(--chirpui-code-font-family);
    --chirpui-code-font-size-inline: 0.9em;
    --chirpui-code-font-size-block: var(--chirpui-prose-sm);
    --chirpui-code-line-height: 1.6;
    --chirpui-pre-padding: var(--chirpui-spacing-sm);

    /* Motion primitives */
    --chirpui-motion-fast: 120ms;
    --chirpui-motion-base: 150ms;
    --chirpui-motion-slow: 250ms;
    --chirpui-motion-slower: 400ms;
    --chirpui-motion-extra-slow: 600ms;
    --chirpui-motion-crawl: 1500ms;
    --chirpui-motion-loading: 8s;
    --chirpui-ease-standard: ease;
    --chirpui-ease-emphasized: cubic-bezier(0.4, 0, 0.2, 1);
    --chirpui-ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
    --chirpui-ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);
    --chirpui-ease-decel: cubic-bezier(0, 0, 0.2, 1);
    --chirpui-ease-accel: cubic-bezier(0.4, 0, 1, 1);

    /* Effect colors — shimmer, ripple, glow, beam */
    --chirpui-shimmer-from: color-mix(in srgb, var(--chirpui-border) 40%, transparent);
    --chirpui-shimmer-via: color-mix(in srgb, var(--chirpui-surface) 80%, transparent);
    --chirpui-shimmer-to: color-mix(in srgb, var(--chirpui-border) 40%, transparent);
    --chirpui-ripple-color: color-mix(in srgb, var(--chirpui-accent) 25%, transparent);
    --chirpui-beam-color: var(--chirpui-accent);
    --chirpui-glow-color: color-mix(in srgb, var(--chirpui-accent) 40%, transparent);

    /* Backward-compatible motion aliases */
    --chirpui-transition: var(--chirpui-motion-base) var(--chirpui-ease-standard);
    --chirpui-transition-slow: var(--chirpui-motion-slow) var(--chirpui-ease-standard);
    --chirpui-transition-emphasized: var(--chirpui-motion-base) var(--chirpui-ease-emphasized);

    /* Drag-drop tactile polish */
    --chirpui-dnd-lift-scale: 1.02;
    --chirpui-dnd-lift-offset-y: -4px;
    --chirpui-dnd-lift-shadow: var(--chirpui-shadow-lg);
    --chirpui-dnd-drag-opacity: 0.5;
    --chirpui-dnd-ghost-opacity: 0.4;
    --chirpui-dnd-drop-indicator-color: var(--chirpui-accent);
    --chirpui-dnd-drop-indicator-width: 2px;
    --chirpui-dnd-transition: var(--chirpui-motion-base) var(--chirpui-ease-emphasized);
    --chirpui-dnd-drag-transition: var(--chirpui-motion-fast) var(--chirpui-ease-standard);

    /* Avatar */
    --chirpui-avatar-size-sm: 2rem;
    --chirpui-avatar-size-md: 2.5rem;
    --chirpui-avatar-size-lg: 3.5rem;

    /* Video */
    --chirpui-video-aspect-ratio: 16 / 9;

    /* Message bubble */
    --chirpui-message-bubble-radius: var(--chirpui-radius-lg);
    --chirpui-message-bubble-user-bg: var(--chirpui-accent);
    --chirpui-message-bubble-user-color: var(--chirpui-surface);
    --chirpui-message-bubble-assistant-bg: var(--chirpui-bg-subtle);
    --chirpui-message-bubble-assistant-color: var(--chirpui-text);
    --chirpui-message-bubble-system-bg: var(--chirpui-muted-bg);
    --chirpui-message-bubble-system-color: var(--chirpui-text-muted);
    --chirpui-message-bubble-padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    --chirpui-message-bubble-max-width: 85%;
    --chirpui-message-bubble-gap: var(--chirpui-spacing-sm);

    /* Page header — component aliases */
    --chirpui-page-header-padding: var(--chirpui-spacing-md);
    --chirpui-page-header-gap: var(--chirpui-space-page-gap);
    --chirpui-page-header-title-size: var(--chirpui-ui-lg);
    --chirpui-page-header-title-weight: var(--chirpui-ui-font-weight-bold);
    --chirpui-page-header-bg: transparent;
    --chirpui-page-header-border: none;

    /* Chat layout */
    --chirpui-chat-layout-gap: var(--chirpui-spacing-md);
    --chirpui-chat-layout-messages-padding: var(--chirpui-spacing-md);
    --chirpui-chat-layout-input-padding: var(--chirpui-spacing-md);
    --chirpui-chat-layout-input-border: 1px solid var(--chirpui-border);
    --chirpui-chat-layout-activity-width: 280px;
    --chirpui-chat-layout-min-height: 400px;

    /* Workbench */
    --chirpui-panel-header-padding: var(--chirpui-spacing-sm) var(--chirpui-spacing-md);
    --chirpui-panel-body-padding: var(--chirpui-spacing-md);
    --chirpui-panel-footer-padding: var(--chirpui-spacing-sm) var(--chirpui-spacing-md);
    --chirpui-panel-min-height: 14rem;
    --chirpui-file-tree-padding: var(--chirpui-spacing-md);
    --chirpui-empty-panel-state-icon-size: 2rem;
    --chirpui-split-sidebar-width: 18rem;
    --chirpui-split-balanced-width: 1fr;
    --chirpui-split-wide-width: minmax(0, 1.6fr);
    --chirpui-split-narrow-width: minmax(16rem, 0.75fr);
    --chirpui-workspace-min-height: 32rem;

    /* Layout */
    --chirpui-container-max: 72rem;
    --chirpui-grid-min: 20rem;
    /* grid() presets — @media below uses the same rem literals (var() not in @media). */
    --chirpui-layout-bp-sm: 48rem;
    --chirpui-layout-bp-md: 52rem;
    --chirpui-layout-bp-lg: 64rem;
    /* frame() — explicit tracks; override per wrapper via style= or theme */
    --chirpui-frame-gap: var(--chirpui-spacing-lg);
    --chirpui-frame-balanced-columns: minmax(0, 1fr) minmax(0, 1fr);
    --chirpui-frame-hero-columns: minmax(0, 1fr) minmax(0, 1.25fr);
    --chirpui-frame-sidebar-width: var(--chirpui-split-sidebar-width);
    --chirpui-modal-width: 32rem;
    --chirpui-modal-width-sm: 24rem;
    --chirpui-modal-width-lg: 48rem;
    --chirpui-toast-width: 24rem;

    /* Tooltip — maps to theme (default matches floating menus); invert via tokens if needed */
    --chirpui-tooltip-bg: var(--chirpui-surface);
    --chirpui-tooltip-fg: var(--chirpui-text);
    --chirpui-tooltip-border: 1px solid var(--chirpui-border);
    --chirpui-tooltip-shadow: var(--chirpui-elevation-floating);
    --chirpui-tooltip-radius: var(--chirpui-radius-sm);
    --chirpui-tooltip-font-size: var(--chirpui-ui-xs);
    --chirpui-tooltip-font-weight: var(--chirpui-ui-font-weight-medium);
    --chirpui-tooltip-line-height: var(--chirpui-line-height-tight);
    --chirpui-tooltip-padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-sm);
    --chirpui-tooltip-gap: var(--chirpui-spacing-sm);
    --chirpui-tooltip-max-width: min(16rem, 85vw);
    --chirpui-tooltip-z: 50;

    /* Alert variants */
    --chirpui-alert-info-bg: light-dark(#eff6ff, #1e3a5f);
    --chirpui-alert-info-border: light-dark(#bfdbfe, #3b82f6);
    --chirpui-alert-success-bg: light-dark(#f0fdf4, #14532d);
    --chirpui-alert-success-border: light-dark(#bbf7d0, #22c55e);
    --chirpui-alert-warning-bg: light-dark(#fffbeb, #422006);
    --chirpui-alert-warning-border: light-dark(#fde68a, #f59e0b);
    --chirpui-alert-error-bg: light-dark(#fef2f2, #450a0a);
    --chirpui-alert-error-border: light-dark(#fecaca, #ef4444);

    /* Shadows adapt to scheme (core primitives) */
    --chirpui-shadow-xs: light-dark(0 1px 1px rgba(0, 0, 0, 0.04), 0 1px 1px rgba(0, 0, 0, 0.2));
    --chirpui-shadow-sm: light-dark(0 1px 2px rgba(0, 0, 0, 0.05), 0 1px 2px rgba(0, 0, 0, 0.3));
    --chirpui-shadow-md: light-dark(
        0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1),
        0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 2px 4px -2px rgba(0, 0, 0, 0.3)
    );
    --chirpui-shadow-lg: light-dark(
        0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1),
        0 10px 15px -3px rgba(0, 0, 0, 0.5), 0 4px 6px -4px rgba(0, 0, 0, 0.4)
    );
    --chirpui-shadow-xl: light-dark(
        0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1),
        0 20px 25px -5px rgba(0, 0, 0, 0.5), 0 8px 10px -6px rgba(0, 0, 0, 0.4)
    );

    /* Elevation semantics */
    --chirpui-elevation-0: none;
    --chirpui-elevation-1: var(--chirpui-shadow-sm);
    --chirpui-elevation-2: var(--chirpui-shadow-md);
    --chirpui-elevation-3: var(--chirpui-shadow-lg);
    --chirpui-elevation-4: var(--chirpui-shadow-xl);
    --chirpui-elevation-card-rest: var(--chirpui-elevation-1);
    --chirpui-elevation-card-hover: var(--chirpui-elevation-2);
    --chirpui-elevation-floating: var(--chirpui-elevation-2);
    --chirpui-elevation-overlay: var(--chirpui-elevation-3);
    --chirpui-elevation-topbar: var(--chirpui-elevation-1);

    /* Interaction state semantics */
    --chirpui-state-surface-hover: var(--chirpui-bg-subtle);
    --chirpui-state-surface-active: color-mix(in srgb, var(--chirpui-accent) 12%, var(--chirpui-bg-subtle));
    --chirpui-state-border-hover: color-mix(in srgb, var(--chirpui-accent) 35%, var(--chirpui-border));
    --chirpui-state-border-active: color-mix(in srgb, var(--chirpui-accent) 55%, var(--chirpui-border));
    --chirpui-state-text-hover: var(--chirpui-accent-hover);
    --chirpui-state-focus-outline: 2px solid var(--chirpui-accent);
    --chirpui-state-focus-offset: 2px;

    /* Style-axis defaults (data-style="default|neumorphic") */
    --chirpui-neu-surface: var(--chirpui-surface);
    --chirpui-neu-raised: var(--chirpui-shadow-sm);
    --chirpui-neu-inset: inset 0 1px 2px rgba(15, 23, 42, 0.12);
    --chirpui-neu-pressed: inset 0 2px 5px rgba(15, 23, 42, 0.18);
    --chirpui-neu-highlight-border: color-mix(in srgb, white 50%, var(--chirpui-border));
    --chirpui-neu-lowlight-border: color-mix(in srgb, black 16%, var(--chirpui-border));
    --chirpui-neu-chamfer: color-mix(in srgb, white 34%, transparent);

    /* Overlay — for text-on-image contrast */
    --chirpui-overlay-dark: light-dark(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.5));
    --chirpui-overlay-gradient-bottom: linear-gradient(
        to top,
        rgba(0, 0, 0, 0.6),
        transparent
    );
    --chirpui-overlay-gradient-top: linear-gradient(
        to bottom,
        rgba(0, 0, 0, 0.6),
        transparent
    );

    /* Glass / frosted — backdrop-filter required */
    --chirpui-glass-bg: light-dark(
        rgba(255, 255, 255, 0.25),
        rgba(30, 41, 59, 0.4)
    );
    --chirpui-glass-border: light-dark(
        rgba(255, 255, 255, 0.4),
        rgba(71, 85, 105, 0.3)
    );
    --chirpui-frosted-bg: light-dark(
        rgba(255, 255, 255, 0.4),
        rgba(30, 41, 59, 0.5)
    );
    --chirpui-frosted-border: light-dark(
        rgba(255, 255, 255, 0.5),
        rgba(71, 85, 105, 0.4)
    );
    --chirpui-smoke-bg: light-dark(
        rgba(0, 0, 0, 0.08),
        rgba(0, 0, 0, 0.25)
    );
    --chirpui-smoke-border: light-dark(
        rgba(0, 0, 0, 0.1),
        rgba(255, 255, 255, 0.08)
    );

    /* Gradient presets — theme-overridable */
    --chirpui-gradient-subtle: linear-gradient(
        135deg,
        var(--chirpui-bg-subtle) 0%,
        color-mix(in srgb, var(--chirpui-accent) 6%, var(--chirpui-bg)) 100%
    );
    --chirpui-gradient-accent: linear-gradient(
        135deg,
        color-mix(in srgb, var(--chirpui-accent) 15%, white) 0%,
        color-mix(in srgb, var(--chirpui-accent) 8%, var(--chirpui-bg)) 100%
    );
    --chirpui-gradient-border: linear-gradient(
        to right,
        var(--chirpui-accent),
        var(--chirpui-accent-secondary),
        var(--chirpui-accent)
    );
    --chirpui-gradient-split: linear-gradient(
        to right,
        var(--chirpui-surface) 0%,
        var(--chirpui-surface) 50%,
        var(--chirpui-bg-subtle) 50%,
        var(--chirpui-bg-subtle) 100%
    );
    /* Mesh — simulated via radial overlays (BBC-style ambient) */
    --chirpui-gradient-mesh: radial-gradient(
            ellipse 80% 50% at 20% 40%,
            color-mix(in srgb, var(--chirpui-accent) 25%, transparent),
            transparent
        ),
        radial-gradient(
            ellipse 60% 80% at 80% 20%,
            color-mix(in srgb, var(--chirpui-accent-secondary) 20%, transparent),
            transparent
        ),
        var(--chirpui-bg);
}

/* Force light theme when [data-theme="light"] */
[data-theme="light"] {
    --chirpui-text: #1e293b;
    --chirpui-text-muted: #64748b;
    --chirpui-surface: #ffffff;
    --chirpui-surface-alt: #f8fafc;
    --chirpui-border: #e2e8f0;
    --chirpui-accent: #0284c7;
    --chirpui-bg: #f8fafc;
    --chirpui-bg-subtle: #f1f5f9;
    --chirpui-alert-info-bg: #eff6ff;
    --chirpui-alert-info-border: #bfdbfe;
    --chirpui-alert-success-bg: #f0fdf4;
    --chirpui-alert-success-border: #bbf7d0;
    --chirpui-alert-warning-bg: #fffbeb;
    --chirpui-alert-warning-border: #fde68a;
    --chirpui-alert-error-bg: #fef2f2;
    --chirpui-alert-error-border: #fecaca;
    --chirpui-primary: #5b9cf5;
    --chirpui-success: #22c55e;
    --chirpui-warning: #f59e5b;
    --chirpui-error: #dc2626;
    --chirpui-muted: #6b7280;
    --chirpui-accent-secondary: #7c3aed;
    --chirpui-shadow-xs: 0 1px 1px rgba(0, 0, 0, 0.04);
    --chirpui-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
    --chirpui-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
    --chirpui-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
    --chirpui-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
}

@supports (color: oklch(0 0 0)) {
    :root {
        --chirpui-text: light-dark(oklch(0.24 0.02 260), oklch(0.965 0.005 260));
        --chirpui-text-muted: light-dark(oklch(0.55 0.02 261), oklch(0.68 0.02 260));
        --chirpui-surface: light-dark(oklch(1 0 0), oklch(0.24 0.02 260));
        --chirpui-surface-alt: light-dark(oklch(0.985 0.002 260), oklch(0.31 0.02 260));
        --chirpui-border: light-dark(oklch(0.92 0.01 260), oklch(0.42 0.02 260));
        --chirpui-accent: light-dark(oklch(0.55 0.15 230), oklch(0.78 0.12 230));
        --chirpui-accent-hover: light-dark(oklch(0.45 0.15 230), oklch(0.85 0.1 230));
        --chirpui-bg: light-dark(oklch(0.985 0.002 260), oklch(0.18 0.02 260));
        --chirpui-bg-subtle: light-dark(oklch(0.965 0.005 260), oklch(0.24 0.02 260));
        --chirpui-alert-info-bg: light-dark(oklch(0.97 0.02 250), oklch(0.25 0.06 250));
        --chirpui-alert-info-border: light-dark(oklch(0.84 0.06 250), oklch(0.6 0.15 250));
        --chirpui-alert-success-bg: light-dark(oklch(0.975 0.02 145), oklch(0.22 0.06 145));
        --chirpui-alert-success-border: light-dark(oklch(0.88 0.08 145), oklch(0.65 0.19 145));
        --chirpui-alert-warning-bg: light-dark(oklch(0.985 0.02 85), oklch(0.28 0.06 85));
        --chirpui-alert-warning-border: light-dark(oklch(0.9 0.1 85), oklch(0.75 0.15 85));
        --chirpui-alert-error-bg: light-dark(oklch(0.975 0.02 25), oklch(0.28 0.06 25));
        --chirpui-alert-error-border: light-dark(oklch(0.88 0.08 25), oklch(0.6 0.2 25));
    }
    [data-theme="light"] {
        --chirpui-text: oklch(0.24 0.02 260);
        --chirpui-text-muted: oklch(0.55 0.02 261);
        --chirpui-surface: oklch(1 0 0);
        --chirpui-surface-alt: oklch(0.985 0.002 260);
        --chirpui-border: oklch(0.92 0.01 260);
        --chirpui-accent: oklch(0.55 0.15 230);
        --chirpui-accent-hover: oklch(0.45 0.15 230);
        --chirpui-bg: oklch(0.985 0.002 260);
        --chirpui-bg-subtle: oklch(0.965 0.005 260);
        --chirpui-alert-info-bg: oklch(0.97 0.02 250);
        --chirpui-alert-info-border: oklch(0.84 0.06 250);
        --chirpui-alert-success-bg: oklch(0.975 0.02 145);
        --chirpui-alert-success-border: oklch(0.88 0.08 145);
        --chirpui-alert-warning-bg: oklch(0.985 0.02 85);
        --chirpui-alert-warning-border: oklch(0.9 0.1 85);
        --chirpui-alert-error-bg: oklch(0.975 0.02 25);
        --chirpui-alert-error-border: oklch(0.88 0.08 25);
        --chirpui-primary: oklch(0.55 0.15 250);
        --chirpui-success: oklch(0.6 0.18 145);
        --chirpui-warning: oklch(0.72 0.15 65);
        --chirpui-error: oklch(0.55 0.2 25);
        --chirpui-muted: oklch(0.55 0.02 260);
    }

    [data-theme="dark"] {
        --chirpui-primary: oklch(0.65 0.15 250);
        --chirpui-success: oklch(0.7 0.18 145);
        --chirpui-warning: oklch(0.8 0.15 65);
        --chirpui-error: oklch(0.65 0.2 25);
        --chirpui-muted: oklch(0.6 0.02 260);
    }
}

/* Use oklch for color-mix when supported — better perceptual uniformity */
@supports (color: oklch(0 0 0)) {
    :root {
        --chirpui-accent-hover: color-mix(in oklch, var(--chirpui-accent) var(--chirpui-shade-hover), black);
        --chirpui-accent-dim: color-mix(in oklch, var(--chirpui-accent) var(--chirpui-shade-dim), black);
        --chirpui-accent-bright: color-mix(in oklch, var(--chirpui-accent) var(--chirpui-shade-bright), white);
        --chirpui-accent-light: color-mix(in oklch, var(--chirpui-accent) var(--chirpui-shade-light), white);
        --chirpui-accent-active: color-mix(in oklch, var(--chirpui-accent) var(--chirpui-shade-active), black);
        --chirpui-primary-muted: color-mix(in oklch, var(--chirpui-primary) var(--chirpui-shade-muted), white);
        --chirpui-success-muted: color-mix(in oklch, var(--chirpui-success) var(--chirpui-shade-muted), white);
        --chirpui-warning-muted: color-mix(in oklch, var(--chirpui-warning) var(--chirpui-shade-muted), white);
        --chirpui-error-muted: color-mix(in oklch, var(--chirpui-error) var(--chirpui-shade-muted), white);
        --chirpui-muted-bg: color-mix(in oklch, var(--chirpui-muted) var(--chirpui-shade-muted), white);
        --chirpui-accent-secondary-muted: color-mix(in oklch, var(--chirpui-accent-secondary) var(--chirpui-shade-muted), white);
        --chirpui-focus-ring: color-mix(in oklch, var(--chirpui-accent) 30%, transparent);
        --chirpui-border-subtle: color-mix(in oklch, var(--chirpui-border) 70%, transparent);
    }
}

/* ==========================================================================
   Base — prevent layout shift from scrollbar
   ========================================================================== */

html {
    scrollbar-gutter: stable;
}

/* ==========================================================================
   Layout — Tetris-inspired block system
   ========================================================================== */

.chirpui-container {
    container-type: inline-size;
    container-name: chirpui-layout;
    width: 100%;
    max-width: min(var(--chirpui-container-max), 90vw);
    margin-inline: auto;
    padding-inline: var(--chirpui-space-container-gutter);
}

.chirpui-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(var(--chirpui-grid-min), 100%), 1fr));
    gap: var(--chirpui-space-stack-gap);
}

/* Grid items default to min-width:auto (min-content), so rich cells overflow tracks and cover gap.
   Matches .chirpui-block; use block() when you need span= or explicit cell semantics. */
.chirpui-grid > * {
    min-width: 0;
}

.chirpui-grid--cols-2 {
    grid-template-columns: repeat(auto-fit, minmax(min(calc(var(--chirpui-grid-min) * 0.75), 100%), 1fr));
}

.chirpui-grid--cols-3 {
    grid-template-columns: repeat(auto-fit, minmax(min(calc(var(--chirpui-grid-min) * 0.6), 100%), 1fr));
}

.chirpui-grid--cols-4 {
    grid-template-columns: repeat(auto-fit, minmax(min(calc(var(--chirpui-grid-min) * 0.5), 100%), 1fr));
}

.chirpui-grid--gap-sm { gap: var(--chirpui-spacing-sm); }
.chirpui-grid--gap-md { gap: var(--chirpui-spacing-md); }
.chirpui-grid--gap-lg { gap: var(--chirpui-spacing-lg); }

/* Row alignment for uneven-height cells (default grid align-items is stretch) */
.chirpui-grid--items-start {
    align-items: start;
}
.chirpui-grid--items-end {
    align-items: end;
}
.chirpui-grid--items-center {
    align-items: center;
}

/* Fixed-track presets for grid() — see docs/LAYOUT-PRESETS.md (aliases: split-2-1-1, split-thirds, …) */
.chirpui-grid.chirpui-grid--preset-bento-211 {
    grid-template-columns: minmax(0, 2fr) minmax(0, 1fr) minmax(0, 1fr);
}

.chirpui-grid.chirpui-grid--preset-thirds {
    grid-template-columns: repeat(3, minmax(0, 1fr));
}

/* Two-column detail row (1fr : 1.35fr); stacks at 52rem. detail_single = one full-width column. */
.chirpui-grid.chirpui-grid--preset-detail-two {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1.35fr);
    align-items: stretch;
}

.chirpui-grid.chirpui-grid--preset-detail-two.chirpui-grid--detail-two-single {
    grid-template-columns: minmax(0, 1fr);
}

.chirpui-grid.chirpui-grid--preset-detail-two .chirpui-block .chirpui-surface,
.chirpui-grid.chirpui-grid--preset-detail-two .chirpui-block .chirpui-callout {
    height: 100%;
}

.chirpui-grid.chirpui-grid--preset-detail-two .chirpui-cluster--detail-two-sprites {
    flex-wrap: wrap;
    justify-content: flex-start;
}

.chirpui-grid.chirpui-grid--preset-detail-two.chirpui-grid--detail-two-single .chirpui-cluster--detail-two-sprites {
    justify-content: center;
}

/* --chirpui-layout-bp-md */
@media (max-width: 52rem) {
    .chirpui-grid.chirpui-grid--preset-detail-two:not(.chirpui-grid--detail-two-single) {
        grid-template-columns: minmax(0, 1fr);
    }

    .chirpui-grid.chirpui-grid--preset-detail-two .chirpui-cluster--detail-two-sprites {
        justify-content: center;
    }
}

/* --chirpui-layout-bp-lg */
@media (max-width: 64rem) {
    .chirpui-grid.chirpui-grid--preset-bento-211 {
        grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    }

    .chirpui-grid.chirpui-grid--preset-bento-211 .chirpui-block--span-2 {
        grid-column: 1 / -1;
    }
}

/* --chirpui-layout-bp-sm */
@media (max-width: 48rem) {
    .chirpui-grid.chirpui-grid--preset-bento-211,
    .chirpui-grid.chirpui-grid--preset-thirds {
        grid-template-columns: minmax(0, 1fr);
    }

    .chirpui-grid.chirpui-grid--preset-bento-211 .chirpui-block--span-2 {
        grid-column: span 1;
    }
}

/* --------------------------------------------------------------------------
   Frame — structural layouts (hero, sidebar, equal columns). Not auto-fit flow.
   Use grid() for wrapping card/tile lists. See docs/LAYOUT-GRIDS-AND-FRAMES.md.
   -------------------------------------------------------------------------- */

.chirpui-frame {
    display: grid;
    gap: var(--chirpui-frame-gap);
    min-width: 0;
}

.chirpui-frame > * {
    min-width: 0;
}

.chirpui-frame--gap-sm {
    gap: var(--chirpui-spacing-sm);
}

.chirpui-frame--gap-md {
    gap: var(--chirpui-spacing-md);
}

.chirpui-frame--gap-lg {
    gap: var(--chirpui-spacing-lg);
}

.chirpui-frame--balanced {
    grid-template-columns: var(--chirpui-frame-balanced-columns);
}

.chirpui-frame--hero {
    align-items: center;
    grid-template-columns: var(--chirpui-frame-hero-columns);
}

.chirpui-frame--sidebar-end {
    grid-template-columns: minmax(0, 1fr) minmax(0, min(var(--chirpui-frame-sidebar-width), 100%));
}

@container chirpui-layout (width < 48rem) {
    .chirpui-frame--balanced,
    .chirpui-frame--hero,
    .chirpui-frame--sidebar-end {
        grid-template-columns: minmax(0, 1fr);
    }

    .chirpui-frame--hero {
        align-items: stretch;
    }
}

@media (max-width: 48rem) {
    .chirpui-frame--balanced,
    .chirpui-frame--hero,
    .chirpui-frame--sidebar-end {
        grid-template-columns: minmax(0, 1fr);
    }

    .chirpui-frame--hero {
        align-items: stretch;
    }
}

.chirpui-stack {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-space-stack-gap);
}

.chirpui-stack--xs { gap: var(--chirpui-spacing-xs); }
.chirpui-stack--sm { gap: var(--chirpui-spacing-sm); }
.chirpui-stack--md { gap: var(--chirpui-spacing-md); }
.chirpui-stack--lg { gap: var(--chirpui-spacing-lg); }
.chirpui-stack--xl { gap: var(--chirpui-spacing-xl); }

.chirpui-cluster {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--chirpui-space-cluster-gap);
}

.chirpui-cluster--xs { gap: var(--chirpui-spacing-xs); }
.chirpui-cluster--sm { gap: var(--chirpui-spacing-sm); }
.chirpui-cluster--md { gap: var(--chirpui-spacing-md); }
.chirpui-cluster--lg { gap: var(--chirpui-spacing-lg); }

/* Label overline — see label_overline.html */
.chirpui-label-overline {
    display: block;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    margin: 0 0 0.35rem;
}

.chirpui-label-overline--section {
    margin-bottom: 0.75rem;
    font-weight: 700;
    letter-spacing: 0.06em;
}

/* Prose + stack: use block flow so margins collapse; stack gap would double spacing */
.chirpui-prose.chirpui-stack {
    display: block;
}

.chirpui-block {
    min-width: 0;
}

/* Escape hatch for custom flex rows / raw markup (Tailwind-style min-w-0). */
.chirpui-min-w-0 {
    min-width: 0;
}

.chirpui-block--span-2 { grid-column: span 2; }
.chirpui-block--span-3 { grid-column: span 3; }
.chirpui-block--span-full { grid-column: 1 / -1; }

@container chirpui-layout (width < 768px) {
    .chirpui-block--span-2,
    .chirpui-block--span-3 {
        grid-column: span 1;
    }
}

.chirpui-page-header {
    padding: var(--chirpui-page-header-padding);
    background: var(--chirpui-page-header-bg);
    border: var(--chirpui-page-header-border);
}

.chirpui-page-header__top {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--chirpui-page-header-gap);
}

.chirpui-page-header__top > div:first-child {
    flex: 1 1 auto;
    min-width: 0;
    overflow-wrap: break-word;
}

.chirpui-page-header__actions {
    display: flex;
    align-items: center;
    gap: var(--chirpui-space-control-gap);
    flex-wrap: wrap;
    flex-shrink: 0;
}

.chirpui-page-header__actions:empty {
    display: none;
}

.chirpui-page-header__breadcrumbs {
    margin-bottom: var(--chirpui-spacing-xs);
}

.chirpui-page-header__meta {
    margin-top: var(--chirpui-spacing-xs);
    margin-bottom: 0;
}

.chirpui-document-header {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-sm);
}

.chirpui-document-header__eyebrow {
    margin: 0;
    padding: 0 var(--chirpui-page-header-padding);
    color: var(--chirpui-text-muted);
    font-size: var(--chirpui-ui-sm);
    font-weight: var(--chirpui-ui-font-weight-medium);
    letter-spacing: 0.04em;
    text-transform: uppercase;
}

.chirpui-document-header__page-header {
    padding-bottom: 0;
}

.chirpui-document-header__details {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
    padding: 0 var(--chirpui-page-header-padding) var(--chirpui-page-header-padding);
    color: var(--chirpui-text-muted);
    font-size: var(--chirpui-ui-sm);
}

.chirpui-document-header__path {
    padding: 0.15rem 0.45rem;
    border-radius: var(--chirpui-radius-sm);
    border: 1px solid var(--chirpui-border-subtle);
    background: var(--chirpui-bg-subtle);
    color: var(--chirpui-text);
    font-family: var(--chirpui-ascii-font);
    font-size: 0.95em;
}

.chirpui-document-header__detail {
    white-space: nowrap;
}

.chirpui-document-header__status {
    display: inline-flex;
    align-items: center;
    padding: 0.15rem 0.5rem;
    border-radius: 999px;
    background: var(--chirpui-bg-subtle);
    color: var(--chirpui-text);
    font-weight: var(--chirpui-ui-font-weight-medium);
}

.chirpui-section-header {
    margin-bottom: var(--chirpui-space-section-gap);
    padding-bottom: var(--chirpui-space-section-gap);
    border-bottom: 1px solid var(--chirpui-border-subtle);
}

.chirpui-section-header__title-block {
    display: flex;
    align-items: center;
    gap: var(--chirpui-space-control-gap);
}

.chirpui-section-header__icon {
    font-size: 1em;
    line-height: 1;
    flex-shrink: 0;
}

.chirpui-section-header__top {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--chirpui-space-section-gap);
}

.chirpui-section-header__top > .chirpui-section-header__title-block {
    flex: 1 1 auto;
    min-width: 0;
}

.chirpui-section-header__title-block > div {
    min-width: 0;
    overflow-wrap: break-word;
}

.chirpui-section-header__actions {
    display: flex;
    align-items: center;
    gap: var(--chirpui-space-control-gap);
    flex-wrap: wrap;
    flex-shrink: 0;
}

.chirpui-section-header__actions:empty {
    display: none;
}

.chirpui-page-header h1 {
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-page-header-title-size);
    font-weight: var(--chirpui-page-header-title-weight);
    margin: 0;
}

.chirpui-page-header--compact {
    --chirpui-page-header-padding: 0.6rem 1.25rem;
    --chirpui-page-header-gap: var(--chirpui-space-control-gap);
    --chirpui-page-header-title-size: var(--chirpui-ui-base);
    --chirpui-page-header-title-weight: var(--chirpui-ui-font-weight-semibold);
    --chirpui-page-header-bg: var(--chirpui-bg-subtle);
    --chirpui-page-header-border: 1px solid var(--chirpui-border-subtle);
    flex-direction: row;
    align-items: center;
}

.chirpui-page-header--compact .chirpui-page-header__top {
    flex-direction: row;
    align-items: center;
}

.chirpui-section-header h2 {
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-base);
    font-weight: var(--chirpui-ui-font-weight-semibold);
    margin: 0;
}

.chirpui-section-header--inline .chirpui-section-header__top {
    align-items: center;
}

.chirpui-section-header--inline .chirpui-section-header__title-block {
    align-items: center;
}

.chirpui-section-header--inline .chirpui-section-header__title-inline {
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-base);
    font-weight: var(--chirpui-ui-font-weight-semibold);
    margin: 0;
}

.chirpui-section-collapsible__summary {
    list-style: none;
    cursor: pointer;
}

.chirpui-section-collapsible__summary::-webkit-details-marker {
    display: none;
}

.chirpui-section-collapsible__summary::marker {
    display: none;
}

/* ==========================================================================
   Workbench
   ========================================================================== */

.chirpui-panel {
    display: flex;
    flex-direction: column;
    min-height: var(--chirpui-panel-min-height);
    overflow: hidden;
}

.chirpui-panel__header {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--chirpui-space-control-gap);
    padding: var(--chirpui-panel-header-padding);
    border-bottom: 1px solid var(--chirpui-border-subtle);
}

.chirpui-panel__heading {
    min-width: 0;
}

.chirpui-panel__title {
    margin: 0;
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-base);
    font-weight: var(--chirpui-ui-font-weight-semibold);
}

.chirpui-panel__subtitle {
    margin: var(--chirpui-spacing-xs) 0 0;
    color: var(--chirpui-text-muted);
    font-size: var(--chirpui-ui-sm);
}

.chirpui-panel__actions {
    display: flex;
    align-items: center;
    gap: var(--chirpui-space-control-gap);
    flex-wrap: wrap;
    flex-shrink: 0;
}

.chirpui-panel__actions:empty,
.chirpui-panel__footer:empty {
    display: none;
}

.chirpui-panel__body {
    padding: var(--chirpui-panel-body-padding);
    min-height: 0;
}

.chirpui-panel__body--scroll {
    flex: 1 1 auto;
    overflow: auto;
}

.chirpui-panel__footer {
    padding: var(--chirpui-panel-footer-padding);
    border-top: 1px solid var(--chirpui-border-subtle);
}

.chirpui-file-tree .chirpui-panel__body {
    padding: 0;
}

.chirpui-file-tree__nav {
    height: 100%;
}

.chirpui-file-tree__nav .chirpui-nav-tree__header {
    padding: var(--chirpui-spacing-sm) var(--chirpui-file-tree-padding) 0;
    margin-bottom: var(--chirpui-spacing-sm);
}

.chirpui-file-tree__nav .chirpui-nav-tree__list {
    padding: 0 var(--chirpui-file-tree-padding) var(--chirpui-file-tree-padding);
}

.chirpui-split-layout {
    display: grid;
    gap: var(--chirpui-spacing-md);
    min-width: 0;
    align-items: stretch;
}

.chirpui-split-layout--gap-sm { gap: var(--chirpui-spacing-sm); }
.chirpui-split-layout--gap-md { gap: var(--chirpui-spacing-md); }
.chirpui-split-layout--gap-lg { gap: var(--chirpui-spacing-lg); }

.chirpui-split-layout--horizontal {
    grid-template-columns: minmax(0, 1fr);
}

.chirpui-split-layout--vertical {
    grid-template-columns: minmax(0, 1fr);
}

.chirpui-split-layout--vertical > .chirpui-split-layout__primary,
.chirpui-split-layout--vertical > .chirpui-split-layout__secondary,
.chirpui-split-layout__primary,
.chirpui-split-layout__secondary {
    min-width: 0;
}

.chirpui-split-layout--vertical {
    grid-template-rows: auto auto;
}

.chirpui-split-layout--horizontal.chirpui-split-layout--sidebar {
    grid-template-columns: minmax(14rem, var(--chirpui-split-sidebar-width)) minmax(0, 1fr);
}

.chirpui-split-layout--horizontal.chirpui-split-layout--balanced {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
}

.chirpui-split-layout--horizontal.chirpui-split-layout--wide-primary {
    grid-template-columns: var(--chirpui-split-wide-width) var(--chirpui-split-narrow-width);
}

.chirpui-split-layout--horizontal.chirpui-split-layout--wide-secondary {
    grid-template-columns: var(--chirpui-split-narrow-width) var(--chirpui-split-wide-width);
}

.chirpui-workspace-shell {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-md);
}

.chirpui-workspace-shell__header {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--chirpui-page-header-gap);
    padding: var(--chirpui-page-header-padding);
    background: var(--chirpui-page-header-bg);
    border: var(--chirpui-page-header-border);
}

.chirpui-workspace-shell__heading {
    min-width: 0;
}

.chirpui-workspace-shell__title {
    margin: 0;
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-lg);
    font-weight: var(--chirpui-ui-font-weight-bold);
}

.chirpui-workspace-shell__subtitle {
    margin: var(--chirpui-spacing-xs) 0 0;
    color: var(--chirpui-text-muted);
    font-size: var(--chirpui-ui-sm);
}

.chirpui-workspace-shell__toolbar {
    display: flex;
    align-items: center;
    gap: var(--chirpui-space-control-gap);
    flex-wrap: wrap;
    justify-content: flex-end;
    flex-shrink: 0;
}

.chirpui-workspace-shell__toolbar:empty {
    display: none;
}

.chirpui-workspace-shell__layout,
.chirpui-workspace-shell__content-layout {
    min-height: var(--chirpui-workspace-min-height);
}

.chirpui-workspace-shell__main {
    min-width: 0;
    min-height: 100%;
}

@container chirpui-layout (width < 960px) {
    .chirpui-split-layout--horizontal.chirpui-split-layout--sidebar,
    .chirpui-split-layout--horizontal.chirpui-split-layout--wide-primary,
    .chirpui-split-layout--horizontal.chirpui-split-layout--wide-secondary,
    .chirpui-split-layout--horizontal.chirpui-split-layout--balanced {
        grid-template-columns: minmax(0, 1fr);
    }
}

/* ==========================================================================
   Entity header (dashboard-grade)
   ========================================================================== */

.chirpui-entity-header {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--chirpui-space-section-gap);
    flex-wrap: wrap;
}

.chirpui-entity-header__content {
    display: flex;
    align-items: flex-start;
    gap: var(--chirpui-space-control-gap);
    flex: 1 1 auto;
    min-width: 0;
}

.chirpui-entity-header__content > div {
    min-width: 0;
    overflow-wrap: break-word;
}

.chirpui-entity-header__icon {
    font-size: var(--chirpui-ui-lg);
    line-height: 1;
    flex-shrink: 0;
}

.chirpui-entity-header__title {
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-lg);
    font-weight: var(--chirpui-ui-font-weight-bold);
    margin: 0;
}

.chirpui-entity-header__meta {
    margin-top: var(--chirpui-spacing-xs);
    margin-bottom: 0;
}

.chirpui-entity-header__actions {
    display: flex;
    align-items: center;
    gap: var(--chirpui-space-control-gap);
    flex-shrink: 0;
}

.chirpui-entity-header__actions:empty {
    display: none;
}

/* ==========================================================================
   Inline edit field
   ========================================================================== */

.chirpui-inline-edit {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
}

.chirpui-inline-edit--display {
    cursor: pointer;
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-sm);
    margin: calc(-1 * var(--chirpui-spacing-xs)) calc(-1 * var(--chirpui-spacing-sm));
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-inline-edit--display:hover {
    background: color-mix(in srgb, var(--chirpui-accent) 8%, transparent);
}

.chirpui-inline-edit--display .chirpui-inline-edit__value {
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-base);
}

.chirpui-inline-edit--edit .chirpui-inline-edit__form {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
}

.chirpui-inline-edit__input {
    min-width: 12ch;
}

.chirpui-inline-edit__actions {
    display: flex;
    gap: var(--chirpui-spacing-xs);
}

.chirpui-inline-edit__trigger {
    flex-shrink: 0;
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
}

.chirpui-inline-edit__icon {
    font-size: 0.85em;
    opacity: 0.75;
}

.chirpui-inline-edit__trigger:hover .chirpui-inline-edit__icon {
    opacity: 1;
}

/* ==========================================================================
   Row actions (kebab menu)
   ========================================================================== */

.chirpui-row-actions__trigger {
    padding: var(--chirpui-spacing-xs);
}

/* ==========================================================================
   Divider
   ========================================================================== */

.chirpui-divider {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing);
    width: 100%;
    margin: var(--chirpui-spacing) 0;
}

.chirpui-divider::before,
.chirpui-divider::after {
    content: "";
    flex: 1;
    height: 1px;
    background: var(--chirpui-border);
}

.chirpui-divider:not(:has(.chirpui-divider__text))::before,
.chirpui-divider:not(:has(.chirpui-divider__text))::after {
    display: none;
}

.chirpui-divider:not(:has(.chirpui-divider__text)) {
    border-block-start: 1px solid var(--chirpui-border);
}

.chirpui-divider__text {
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-sm);
    font-weight: var(--chirpui-ui-font-weight-medium);
    color: var(--chirpui-text-muted);
    white-space: nowrap;
}

.chirpui-divider--horizontal {
    flex-direction: row;
}

.chirpui-divider--horizontal::before,
.chirpui-divider--horizontal::after {
    width: 1px;
    height: 100%;
    min-height: 1.5em;
}

.chirpui-divider--horizontal:not(:has(.chirpui-divider__text)) {
    border-block-start: none;
    border-inline-start: 1px solid var(--chirpui-border);
    margin: 0 var(--chirpui-spacing);
    width: auto;
    min-height: 1.5em;
}

.chirpui-divider--primary::before,
.chirpui-divider--primary::after { background: var(--chirpui-primary); }
.chirpui-divider--primary:not(:has(.chirpui-divider__text)) { border-color: var(--chirpui-primary); }
.chirpui-divider--success::before,
.chirpui-divider--success::after { background: var(--chirpui-success); }
.chirpui-divider--success:not(:has(.chirpui-divider__text)) { border-color: var(--chirpui-success); }
.chirpui-divider--warning::before,
.chirpui-divider--warning::after { background: var(--chirpui-warning); }
.chirpui-divider--warning:not(:has(.chirpui-divider__text)) { border-color: var(--chirpui-warning); }
.chirpui-divider--error::before,
.chirpui-divider--error::after { background: var(--chirpui-error); }
.chirpui-divider--error:not(:has(.chirpui-divider__text)) { border-color: var(--chirpui-error); }
.chirpui-divider--accent::before,
.chirpui-divider--accent::after { background: var(--chirpui-accent); }
.chirpui-divider--accent:not(:has(.chirpui-divider__text)) { border-color: var(--chirpui-accent); }

/* ==========================================================================
   Avatar
   ========================================================================== */

.chirpui-avatar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    width: var(--chirpui-avatar-size-md);
    height: var(--chirpui-avatar-size-md);
    border-radius: 50%;
    overflow: hidden;
    background: var(--chirpui-bg-subtle);
    color: var(--chirpui-text-muted);
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-sm);
    font-weight: var(--chirpui-ui-font-weight-medium);
}

.chirpui-avatar--sm {
    width: var(--chirpui-avatar-size-sm);
    height: var(--chirpui-avatar-size-sm);
    font-size: var(--chirpui-ui-xs);
}

.chirpui-avatar--lg {
    width: var(--chirpui-avatar-size-lg);
    height: var(--chirpui-avatar-size-lg);
    font-size: var(--chirpui-ui-base);
}

.chirpui-avatar__img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.chirpui-avatar__initials,
.chirpui-avatar__placeholder {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 100%;
}

.chirpui-avatar--online {
    box-shadow: 0 0 0 2px var(--chirpui-surface), 0 0 0 4px var(--chirpui-success);
}

.chirpui-avatar--offline {
    box-shadow: 0 0 0 2px var(--chirpui-surface), 0 0 0 4px var(--chirpui-muted);
}

/* ==========================================================================
   Media Object
   ========================================================================== */

.chirpui-media-object {
    display: flex;
    align-items: flex-start;
    gap: var(--chirpui-spacing);
}

.chirpui-media-object--align-center {
    align-items: center;
}

.chirpui-media-object__media {
    flex-shrink: 0;
}

.chirpui-media-object__media img,
.chirpui-media-object__media video {
    display: block;
    max-width: 100%;
    height: auto;
}

.chirpui-media-object__body {
    flex: 1;
    min-width: 0;
}

.chirpui-media-object__actions {
    flex-shrink: 0;
}

.chirpui-media-object__media:empty,
.chirpui-media-object__body:empty,
.chirpui-media-object__actions:empty {
    display: none;
}

/* ==========================================================================
   Stat
   ========================================================================== */

.chirpui-stat {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
    text-align: center;
}

.chirpui-stat__value {
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-lg);
    font-weight: var(--chirpui-ui-font-weight-semibold);
    font-feature-settings: "tnum";
    color: var(--chirpui-text);
}

.chirpui-stat__label {
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-sm);
    font-weight: var(--chirpui-ui-font-weight-medium);
    color: var(--chirpui-text-muted);
}

.chirpui-stat__icon {
    font-size: var(--chirpui-ui-xl);
    color: var(--chirpui-text-muted);
}

.chirpui-metric-grid {
    align-items: stretch;
}

.chirpui-metric-card {
    height: 100%;
}

.chirpui-metric-card__stat {
    align-items: flex-start;
    text-align: start;
}

.chirpui-metric-card__trend,
.chirpui-metric-card__hint {
    margin: 0;
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text-muted);
}

.chirpui-metric-card__trend {
    margin-top: var(--chirpui-space-card-gap);
    font-weight: var(--chirpui-ui-font-weight-medium);
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-2xs);
}
.chirpui-metric-card__trend--up { color: var(--chirpui-success); }
.chirpui-metric-card__trend--down { color: var(--chirpui-error); }
.chirpui-metric-card__trend--neutral { color: var(--chirpui-text-muted); }
.chirpui-metric-card__trend-arrow { font-size: 0.75em; }
.chirpui-metric-card__top {
    display: flex;
    align-items: flex-start;
    gap: var(--chirpui-spacing-sm);
}
.chirpui-metric-card__icon-badge {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2.5rem;
    height: 2.5rem;
    border-radius: var(--chirpui-radius);
    flex-shrink: 0;
    font-size: var(--chirpui-ui-base);
    background: var(--chirpui-surface-alt);
    color: var(--chirpui-text-muted);
}
.chirpui-metric-card__icon-badge--primary { background: var(--chirpui-primary-muted); color: var(--chirpui-primary); }
.chirpui-metric-card__icon-badge--success { background: var(--chirpui-success-muted); color: var(--chirpui-success); }
.chirpui-metric-card__icon-badge--warning { background: var(--chirpui-warning-muted); color: var(--chirpui-warning); }
.chirpui-metric-card__icon-badge--error { background: var(--chirpui-error-muted); color: var(--chirpui-error); }
.chirpui-metric-card__values { flex: 1; min-width: 0; }
.chirpui-metric-card__footer {
    display: block;
    margin-top: var(--chirpui-spacing-sm);
    padding-top: var(--chirpui-spacing-sm);
    border-top: 1px solid var(--chirpui-border);
    font-size: var(--chirpui-font-xs);
    color: var(--chirpui-accent);
    text-decoration: none;
    transition: color var(--chirpui-transition);
}
.chirpui-metric-card__footer:hover { color: var(--chirpui-accent-hover); }

/* ==========================================================================
   Action Bar
   ========================================================================== */

.chirpui-action-bar {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing);
}

.chirpui-action-bar__item {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-sm);
    background: none;
    border: none;
    font: inherit;
    color: var(--chirpui-text-muted);
    cursor: pointer;
    border-radius: var(--chirpui-radius-sm);
    transition: color var(--chirpui-transition), background var(--chirpui-transition);
}

a.chirpui-action-bar__item {
    text-decoration: none;
}

.chirpui-action-bar__item:hover {
    color: var(--chirpui-accent);
    background: var(--chirpui-bg-subtle);
}

.chirpui-action-bar__item:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-action-bar__item--active {
    color: var(--chirpui-error);
}

.chirpui-action-bar__item--active:hover {
    color: var(--chirpui-error);
}

.chirpui-action-bar__item--disabled {
    opacity: 0.5;
    cursor: not-allowed;
    pointer-events: none;
}

.chirpui-action-bar__icon {
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-lg);
}

.chirpui-action-bar__count {
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-sm);
    font-weight: var(--chirpui-ui-font-weight-medium);
    color: inherit;
}

/* ==========================================================================
   Action Containers
   ========================================================================== */

.chirpui-action-strip {
    width: 100%;
}

.chirpui-action-strip__inner {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    gap: var(--chirpui-space-control-gap);
    width: 100%;
}

.chirpui-action-strip__primary,
.chirpui-action-strip__controls,
.chirpui-action-strip__actions {
    display: flex;
    align-items: center;
    gap: var(--chirpui-space-control-gap);
    min-width: 0;
}

.chirpui-action-strip__primary {
    flex: 1 1 18rem;
}

.chirpui-action-strip__primary > * {
    width: 100%;
}

.chirpui-action-strip__controls {
    flex: 1 1 14rem;
    flex-wrap: wrap;
}

.chirpui-action-strip__actions {
    flex: 0 0 auto;
    margin-inline-start: auto;
    flex-wrap: wrap;
    justify-content: end;
}

.chirpui-action-strip--sm .chirpui-action-strip__inner {
    gap: var(--chirpui-spacing-xs);
}

.chirpui-action-strip--scroll .chirpui-action-strip__inner {
    flex-wrap: nowrap;
    overflow-x: auto;
    padding-bottom: 0.125rem;
}

.chirpui-action-strip--scroll .chirpui-action-strip__primary,
.chirpui-action-strip--scroll .chirpui-action-strip__controls,
.chirpui-action-strip--scroll .chirpui-action-strip__actions {
    flex-wrap: nowrap;
}

.chirpui-action-strip--collapse .chirpui-action-strip__controls {
    flex: 0 1 auto;
}

.chirpui-action-strip--sticky {
    position: sticky;
    top: 0;
    z-index: 10;
}

.chirpui-filter-bar__form {
    width: 100%;
}

.chirpui-command-bar .chirpui-action-strip__actions {
    gap: var(--chirpui-spacing-xs);
}

.chirpui-search-header__form {
    width: 100%;
}

.chirpui-search-header__strip .chirpui-action-strip__primary {
    flex-basis: 24rem;
}

@media (max-width: 48rem) {
    .chirpui-action-strip__primary,
    .chirpui-action-strip__controls,
    .chirpui-action-strip__actions {
        flex: 1 1 100%;
    }

    .chirpui-action-strip__actions {
        margin-inline-start: 0;
        justify-content: start;
    }

    .chirpui-action-strip--scroll .chirpui-action-strip__primary,
    .chirpui-action-strip--scroll .chirpui-action-strip__controls,
    .chirpui-action-strip--scroll .chirpui-action-strip__actions {
        flex: 0 0 auto;
    }
}

/* ==========================================================================
   Chat Layout
   ========================================================================== */

.chirpui-chat-layout {
    display: flex;
    gap: var(--chirpui-chat-layout-gap);
    min-height: var(--chirpui-chat-layout-min-height);
}

.chirpui-chat-layout__main {
    flex: 1;
    display: flex;
    flex-direction: column;
    min-width: 0;
}

.chirpui-chat-layout__messages {
    flex: 1;
    overflow-y: auto;
    padding: var(--chirpui-chat-layout-messages-padding);
}

.chirpui-chat-layout__input {
    padding: var(--chirpui-chat-layout-input-padding);
    border-top: var(--chirpui-chat-layout-input-border);
}

.chirpui-chat-layout__activity {
    width: var(--chirpui-chat-layout-activity-width);
    flex-shrink: 0;
    overflow-y: auto;
}

/* Fill remaining height inside a flex parent (e.g. #page-content > .chirpui-page-fill). */
.chirpui-chat-layout--fill {
    flex: 1;
    min-height: 0;
    align-self: stretch;
}

.chirpui-chat-layout--fill .chirpui-chat-layout__messages {
    display: flex;
    flex-direction: column;
    min-height: 0;
    overflow: hidden;
    /* Transcript / thread scroll lives inside slots, not on this shell */
}

/* Put on SSE / HTMX / custom wrapper around the scroll region inside __messages. */
.chirpui-chat-layout__messages-body {
    flex: 1;
    min-height: 0;
    display: flex;
    flex-direction: column;
    position: relative;
}

@media (max-width: 767px) {
    .chirpui-chat-layout {
        flex-direction: column;
    }

    .chirpui-chat-layout__activity {
        width: 100%;
    }
}

/* ==========================================================================
   Message Bubble & Thread
   ========================================================================== */

.chirpui-message-thread {
    list-style: none;
    margin: 0;
    padding: var(--chirpui-spacing);
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-sm);
}

.chirpui-message-bubble {
    display: flex;
    gap: var(--chirpui-message-bubble-gap);
    max-width: var(--chirpui-message-bubble-max-width);
    padding: var(--chirpui-message-bubble-padding);
    border-radius: var(--chirpui-message-bubble-radius);
    background: var(--chirpui-bg-subtle);
}

.chirpui-message-bubble--right {
    align-self: flex-end;
    flex-direction: row-reverse;
    background: var(--chirpui-accent);
    color: var(--chirpui-surface);
}

.chirpui-message-bubble--left {
    align-self: flex-start;
}

.chirpui-message-bubble--user {
    background: var(--chirpui-message-bubble-user-bg);
    color: var(--chirpui-message-bubble-user-color);
    align-self: flex-end;
    flex-direction: row-reverse;
}

.chirpui-message-bubble--assistant {
    background: var(--chirpui-message-bubble-assistant-bg);
    color: var(--chirpui-message-bubble-assistant-color);
    align-self: flex-start;
}

.chirpui-message-bubble--system {
    background: var(--chirpui-message-bubble-system-bg);
    color: var(--chirpui-message-bubble-system-color);
    align-self: center;
    max-width: 70%;
    font-size: var(--chirpui-font-sm);
}

.chirpui-message-bubble--sent,
.chirpui-message-bubble--read,
.chirpui-message-bubble--pending {
    opacity: 1;
}

.chirpui-message-bubble--pending {
    opacity: 0.85;
}

/* ==========================================================================
   Typing Indicator
   ========================================================================== */

.chirpui-typing-indicator {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    padding: var(--chirpui-spacing-sm);
}

.chirpui-typing-indicator__dot {
    width: 0.5rem;
    height: 0.5rem;
    border-radius: 50%;
    background: var(--chirpui-text-muted);
    animation: chirpui-typing-bounce 1.4s ease-in-out infinite both;
}

.chirpui-typing-indicator__dot:nth-child(2) { animation-delay: 0.2s; }
.chirpui-typing-indicator__dot:nth-child(3) { animation-delay: 0.4s; }

@keyframes chirpui-typing-bounce {
    0%, 80%, 100% { transform: scale(0.6); opacity: 0.5; }
    40% { transform: scale(1); opacity: 1; }
}

/* ==========================================================================
   Chat Input
   ========================================================================== */

.chirpui-chat-input {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-sm);
    padding: var(--chirpui-spacing);
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
}

.chirpui-chat-input__composer {
    display: flex;
    gap: var(--chirpui-spacing-sm);
}

.chirpui-chat-input__field {
    flex: 1;
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    font: inherit;
    background: var(--chirpui-surface);
    color: var(--chirpui-text);
    resize: none;
    transition: border-color var(--chirpui-transition);
}

.chirpui-chat-input__field:focus {
    outline: none;
    border-color: var(--chirpui-accent);
    box-shadow: 0 0 0 3px var(--chirpui-focus-ring);
}

.chirpui-chat-input__field:disabled,
.chirpui-chat-input__field[readonly] {
    background: var(--chirpui-bg-subtle);
    color: var(--chirpui-text-muted);
    cursor: not-allowed;
    border-color: var(--chirpui-border);
}

.chirpui-chat-input__field[readonly] {
    cursor: default;
    opacity: 1;
}

.chirpui-chat-input__field:disabled {
    opacity: 0.5;
}

.chirpui-chat-input__footer {
    display: flex;
    justify-content: flex-end;
    gap: var(--chirpui-spacing-sm);
}

/* ==========================================================================
   Conversation List & Item
   ========================================================================== */

.chirpui-conversation-list {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-xs);
}

.chirpui-conversation-item {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing);
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    text-decoration: none;
    color: inherit;
    border-radius: var(--chirpui-radius);
    transition: background var(--chirpui-transition);
}

.chirpui-conversation-item:hover {
    background: var(--chirpui-bg-subtle);
}

.chirpui-conversation-item:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-conversation-item__avatar {
    flex-shrink: 0;
}

.chirpui-conversation-item__body {
    flex: 1;
    min-width: 0;
}

.chirpui-conversation-item__meta {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: var(--chirpui-spacing-sm);
}

.chirpui-conversation-item__name {
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-sm);
    font-weight: var(--chirpui-ui-font-weight-semibold);
}

.chirpui-conversation-item__time {
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-xs);
    font-weight: var(--chirpui-ui-font-weight-normal);
    color: var(--chirpui-text-muted);
}

.chirpui-conversation-item__preview {
    margin: var(--chirpui-spacing-xs) 0 0;
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-sm);
    font-weight: var(--chirpui-ui-font-weight-normal);
    color: var(--chirpui-text-muted);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.chirpui-conversation-item--muted .chirpui-conversation-item__preview {
    opacity: 0.8;
}

.chirpui-conversation-item__actions:empty {
    display: none;
}

.chirpui-conversation-item__unread {
    flex-shrink: 0;
    min-width: 1.25rem;
    padding: 0.125rem 0.35rem;
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-xs);
    font-weight: var(--chirpui-ui-font-weight-semibold);
    text-align: center;
    background: var(--chirpui-accent);
    color: var(--chirpui-surface);
    border-radius: 9999px;
}

/* ==========================================================================
   Reaction Pill & Message Reactions
   ========================================================================== */

.chirpui-message-reactions {
    display: flex;
    flex-wrap: wrap;
    gap: var(--chirpui-spacing-xs);
    margin-top: var(--chirpui-spacing-xs);
}

.chirpui-reaction-pill {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
    padding: 0.125rem 0.5rem;
    font: inherit;
    background: var(--chirpui-bg-subtle);
    border: 1px solid var(--chirpui-border);
    border-radius: 9999px;
    cursor: pointer;
    transition: background var(--chirpui-transition), border-color var(--chirpui-transition);
}

.chirpui-reaction-pill:hover {
    background: var(--chirpui-border);
}

.chirpui-reaction-pill:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-reaction-pill--active {
    border-color: var(--chirpui-accent);
    background: var(--chirpui-primary-muted);
}

.chirpui-reaction-pill--disabled {
    opacity: 0.5;
    cursor: not-allowed;
    pointer-events: none;
}

.chirpui-reaction-pill__emoji {
    font-size: var(--chirpui-ui-sm);
}

.chirpui-reaction-pill__count {
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-xs);
    font-weight: var(--chirpui-ui-font-weight-medium);
    color: var(--chirpui-text-muted);
}

/* ==========================================================================
   Post Card (Social)
   ========================================================================== */

.chirpui-post-card {
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
    overflow: hidden;
}

.chirpui-post-card__header {
    padding: var(--chirpui-spacing);
}

.chirpui-post-card__author {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing);
}

.chirpui-post-card__avatar {
    flex-shrink: 0;
}

.chirpui-post-card__meta {
    flex: 1;
    min-width: 0;
}

.chirpui-post-card__name {
    font-weight: 600;
    color: var(--chirpui-text);
}

a.chirpui-post-card__name:hover {
    color: var(--chirpui-accent);
}

.chirpui-post-card__handle {
    color: var(--chirpui-text-muted);
    font-size: var(--chirpui-font-sm);
    margin-left: var(--chirpui-spacing-xs);
}

.chirpui-post-card__time {
    display: block;
    font-size: var(--chirpui-font-xs);
    color: var(--chirpui-text-muted);
}

.chirpui-post-card__body {
    padding: 0 var(--chirpui-spacing) var(--chirpui-spacing);
}

.chirpui-post-card__body p {
    margin: 0;
}

.chirpui-post-card__media {
    padding: 0 var(--chirpui-spacing) var(--chirpui-spacing);
}

.chirpui-post-card__media img {
    display: block;
    width: 100%;
    height: auto;
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-post-card__media:empty,
.chirpui-post-card__actions:empty {
    display: none;
}

.chirpui-post-card__actions {
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    border-top: 1px solid var(--chirpui-border);
}

/* ==========================================================================
   Comment & Comment Thread
   ========================================================================== */

.chirpui-comment {
    padding: var(--chirpui-spacing);
}

.chirpui-comment__header {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing);
    margin-bottom: var(--chirpui-spacing-sm);
}

.chirpui-comment__avatar {
    flex-shrink: 0;
}

.chirpui-comment__meta {
    display: flex;
    align-items: baseline;
    gap: var(--chirpui-spacing-sm);
}

.chirpui-comment__author {
    font-weight: 600;
    font-size: var(--chirpui-font-sm);
}

a.chirpui-comment__author:hover {
    color: var(--chirpui-accent);
}

.chirpui-comment__time {
    font-size: var(--chirpui-font-xs);
    color: var(--chirpui-text-muted);
}

.chirpui-comment__body {
    padding-inline-start: calc(var(--chirpui-avatar-size-sm) + var(--chirpui-spacing));
}

.chirpui-comment__body p {
    margin: 0;
}

.chirpui-comment__footer {
    margin-top: var(--chirpui-spacing-sm);
    padding-inline-start: calc(var(--chirpui-avatar-size-sm) + var(--chirpui-spacing));
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing);
}

.chirpui-comment__footer:not(:has(.chirpui-comment__replies-link)):has(.chirpui-comment__actions:empty) {
    display: none;
}

.chirpui-comment__actions:empty {
    display: none;
}

.chirpui-comment__replies {
    margin-top: var(--chirpui-spacing-sm);
    padding-inline-start: calc(var(--chirpui-avatar-size-sm) + var(--chirpui-spacing));
}

.chirpui-comment__replies-link {
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-accent);
}

.chirpui-comment-thread {
    list-style: none;
    margin: 0;
    padding: 0;
}

.chirpui-comment-thread .chirpui-comment {
    border-bottom: 1px solid var(--chirpui-border);
}

.chirpui-comment-thread .chirpui-comment:last-child {
    border-bottom: none;
}

/* ==========================================================================
   Profile Header
   ========================================================================== */

.chirpui-profile-header {
    position: relative;
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
    overflow: hidden;
}

.chirpui-profile-header__cover {
    height: 8rem;
    background-size: cover;
    background-position: center;
    background-color: var(--chirpui-bg-subtle);
}

.chirpui-profile-header__content {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    gap: var(--chirpui-spacing-lg);
    padding: var(--chirpui-spacing);
}

.chirpui-profile-header__avatar {
    flex-shrink: 0;
}

.chirpui-profile-header__avatar:empty,
.chirpui-profile-header__bio:empty,
.chirpui-profile-header__stats:empty,
.chirpui-profile-header__action:empty {
    display: none;
}

.chirpui-profile-header__info {
    flex: 1;
    min-width: 0;
}

.chirpui-profile-header__name {
    margin: 0 0 var(--chirpui-spacing-xs);
    font-size: var(--chirpui-font-xl);
}

a.chirpui-profile-header__name:hover {
    color: var(--chirpui-accent);
}

.chirpui-profile-header__bio {
    margin: 0 0 var(--chirpui-spacing-sm);
    color: var(--chirpui-text-muted);
}

.chirpui-profile-header__stats {
    display: flex;
    gap: var(--chirpui-spacing-lg);
    margin-bottom: var(--chirpui-spacing-sm);
}

.chirpui-profile-header__action {
    flex-shrink: 0;
}

/* ==========================================================================
   Avatar Stack
   ========================================================================== */

.chirpui-avatar-stack {
    display: flex;
}

.chirpui-avatar-stack .chirpui-avatar {
    margin-inline-start: -0.75rem;
}

.chirpui-avatar-stack .chirpui-avatar:first-child {
    margin-inline-start: 0;
}

.chirpui-avatar-stack__more {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: var(--chirpui-avatar-size-sm);
    height: var(--chirpui-avatar-size-sm);
    margin-inline-start: -0.75rem;
    font-size: var(--chirpui-font-xs);
    font-weight: 600;
    background: var(--chirpui-bg-subtle);
    border: 2px solid var(--chirpui-surface);
    border-radius: 50%;
    color: var(--chirpui-text-muted);
}

/* ==========================================================================
   Trending Tag & Mention
   ========================================================================== */

.chirpui-trending-tag {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-sm);
    font-size: var(--chirpui-font-sm);
    font-family: var(--chirpui-ui-font-family);
    font-weight: var(--chirpui-ui-font-weight-medium);
    background: var(--chirpui-bg-subtle);
    border: 1px solid transparent;
    border-radius: var(--chirpui-radius-sm);
    text-decoration: none;
    color: inherit;
    transition: background var(--chirpui-transition), border-color var(--chirpui-transition),
        color var(--chirpui-transition), box-shadow var(--chirpui-transition);
}

a.chirpui-trending-tag {
    border-color: var(--chirpui-border);
    cursor: pointer;
}

a.chirpui-trending-tag:hover {
    background: var(--chirpui-border);
    border-color: color-mix(in srgb, var(--chirpui-border) 70%, black);
    color: var(--chirpui-text);
}

a.chirpui-trending-tag:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

a.chirpui-trending-tag:active {
    background: color-mix(in srgb, var(--chirpui-border) 80%, black);
}

@media (prefers-reduced-motion: no-preference) {
    a.chirpui-trending-tag {
        transition: background var(--chirpui-transition), border-color var(--chirpui-transition),
            color var(--chirpui-transition), box-shadow var(--chirpui-transition),
            transform var(--chirpui-transition);
    }

    a.chirpui-trending-tag:hover {
        transform: translateY(-1px);
        box-shadow: var(--chirpui-shadow-sm);
    }

    a.chirpui-trending-tag:active {
        transition: none;
        transform: translateY(0);
        box-shadow: none;
    }
}

.chirpui-trending-tag__hash {
    color: var(--chirpui-text-muted);
    transition: color var(--chirpui-transition);
}

a.chirpui-trending-tag .chirpui-trending-tag__hash {
    color: var(--chirpui-accent);
}

a.chirpui-trending-tag:hover .chirpui-trending-tag__hash {
    color: var(--chirpui-accent-hover);
}

.chirpui-trending-tag__count {
    font-size: var(--chirpui-font-xs);
    color: var(--chirpui-text-muted);
}

.chirpui-trending-tag--up .chirpui-trending-tag__count::before {
    content: "↑ ";
    color: var(--chirpui-success);
}

.chirpui-mention {
    font-weight: var(--chirpui-ui-font-weight-medium);
    color: inherit;
}

a.chirpui-mention {
    color: var(--chirpui-accent);
    text-decoration: none;
    transition: color var(--chirpui-transition);
}

a.chirpui-mention:hover {
    color: var(--chirpui-accent-hover);
    text-decoration: underline;
}

a.chirpui-mention:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

/* ==========================================================================
   Breadcrumbs
   ========================================================================== */

.chirpui-breadcrumbs__list {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--chirpui-spacing-xs) var(--chirpui-spacing-sm);
    list-style: none;
    margin: 0;
    padding: 0;
    font-size: var(--chirpui-font-sm);
}

.chirpui-breadcrumbs__item {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
}

.chirpui-breadcrumbs__item:not(:last-child)::after {
    content: "/";
    color: var(--chirpui-text-muted);
    font-weight: 400;
}

.chirpui-breadcrumbs__link {
    color: var(--chirpui-accent);
    text-decoration: none;
    transition: color var(--chirpui-transition);
}

.chirpui-breadcrumbs__link:hover {
    color: var(--chirpui-accent-hover);
    text-decoration: underline;
}

.chirpui-breadcrumbs__link:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-breadcrumbs__current {
    color: var(--chirpui-text-muted);
}

/* ==========================================================================
   Navbar
   ========================================================================== */

.chirpui-navbar {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-lg);
    padding: var(--chirpui-spacing) 0;
    border-bottom: 1px solid var(--chirpui-border);
}

.chirpui-navbar__brand {
    font-weight: 600;
    font-size: var(--chirpui-font-lg);
    color: var(--chirpui-text);
    text-decoration: none;
    flex-shrink: 0;
}

.chirpui-navbar__brand:hover {
    color: var(--chirpui-accent);
}

.chirpui-navbar__brand:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

/* ==========================================================================
   Logo
   ========================================================================== */

.chirpui-logo {
    --chirpui-logo-image-height: 1.25rem;
    --chirpui-logo-font-size: var(--chirpui-font-base);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--chirpui-spacing-sm);
    color: inherit;
    text-decoration: none;
}

.chirpui-logo:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-logo__img {
    display: block;
    height: var(--chirpui-logo-image-height);
    width: auto;
    max-width: 100%;
}

.chirpui-logo__text {
    font-size: var(--chirpui-logo-font-size);
    font-weight: 600;
    line-height: 1.2;
    color: inherit;
}

.chirpui-logo--text .chirpui-logo__img {
    display: none;
}

.chirpui-logo--image .chirpui-logo__text {
    display: none;
}

.chirpui-logo--sm {
    --chirpui-logo-image-height: 1rem;
    --chirpui-logo-font-size: var(--chirpui-font-sm);
}

.chirpui-logo--md {
    --chirpui-logo-image-height: 1.25rem;
    --chirpui-logo-font-size: var(--chirpui-font-base);
}

.chirpui-logo--lg {
    --chirpui-logo-image-height: 1.5rem;
    --chirpui-logo-font-size: var(--chirpui-font-lg);
}

.chirpui-logo--start {
    justify-content: flex-start;
}

.chirpui-logo--center {
    justify-content: center;
}

.chirpui-logo--end {
    justify-content: flex-end;
}

.chirpui-navbar__links {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing);
    flex-wrap: wrap;
}

.chirpui-navbar__link {
    color: var(--chirpui-text-muted);
    text-decoration: none;
    font-size: var(--chirpui-font-sm);
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-sm);
    border-radius: var(--chirpui-radius-sm);
    transition: color var(--chirpui-transition), background var(--chirpui-transition);
}

.chirpui-navbar__link:hover {
    color: var(--chirpui-text);
    background: var(--chirpui-bg-subtle);
}

.chirpui-navbar__link:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-navbar__link--active {
    color: var(--chirpui-accent);
    font-weight: 600;
    background: color-mix(in srgb, var(--chirpui-accent) 10%, transparent);
}

.chirpui-navbar--sticky {
    position: sticky;
    top: 0;
    z-index: 50;
    background: var(--chirpui-surface);
}

.chirpui-navbar__links--end {
    margin-left: auto;
}

.chirpui-navbar__links--end:empty {
    display: none;
}

.chirpui-navbar-dropdown {
    position: relative;
    display: inline-block;
}

.chirpui-navbar-dropdown__trigger {
    cursor: pointer;
    list-style: none;
}

.chirpui-navbar-dropdown__trigger::-webkit-details-marker {
    display: none;
}

.chirpui-navbar-dropdown__trigger::after {
    content: "\25B8";
    display: inline-block;
    transition: rotate var(--chirpui-transition);
    margin-inline-start: auto;
    font-size: 0.75em;
    color: var(--chirpui-text-muted);
}

.chirpui-navbar-dropdown[open] > .chirpui-navbar-dropdown__trigger::after {
    rotate: 90deg;
}

/* ==========================================================================
   Sidebar
   ========================================================================== */

.chirpui-sidebar {
    width: 16rem;
    flex-shrink: 0;
    border-right: 1px solid var(--chirpui-border);
    padding: var(--chirpui-spacing) 0;
}

.chirpui-sidebar__header:empty,
.chirpui-sidebar__footer:empty {
    display: none;
}

.chirpui-sidebar__nav {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-sidebar-section-gap);
}

.chirpui-sidebar__section {
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing-sm);
}

.chirpui-sidebar__section-title {
    display: block;
    font-size: var(--chirpui-font-xs);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--chirpui-text-muted);
    margin-bottom: var(--chirpui-spacing-xs);
}

.chirpui-sidebar__link {
    display: flex;
    align-items: center;
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing-sm);
    color: var(--chirpui-text-muted);
    text-decoration: none;
    font-size: var(--chirpui-font-sm);
    border-radius: 0 var(--chirpui-radius-sm) var(--chirpui-radius-sm) 0;
    margin-inline-start: var(--chirpui-spacing-sm);
    transition: color var(--chirpui-transition), background var(--chirpui-transition);
}

.chirpui-sidebar__icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1.25em;
    margin-inline-end: var(--chirpui-spacing-sm);
    font-family: var(--chirpui-ascii-font);
}

.chirpui-sidebar__link:hover {
    color: var(--chirpui-text);
    background: var(--chirpui-state-surface-hover);
}

.chirpui-sidebar__link:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-sidebar__link--active {
    color: var(--chirpui-sidebar-active-color);
    font-weight: 500;
    background: var(--chirpui-sidebar-active-bg);
}

/* ==========================================================================
   Stepper
   ========================================================================== */

.chirpui-stepper {
    margin: var(--chirpui-spacing-lg) 0;
}

.chirpui-stepper__list {
    display: flex;
    align-items: flex-start;
    gap: 0;
    list-style: none;
    margin: 0;
    padding: 0;
    counter-reset: stepper;
}

.chirpui-stepper__item {
    display: flex;
    flex-direction: column;
    align-items: center;
    flex: 1;
    min-width: 0;
    position: relative;
    text-align: center;
}

/* Connector line between steps — drawn via ::before on all items except first */
.chirpui-stepper__item + .chirpui-stepper__item::before {
    content: "";
    position: absolute;
    top: 1rem; /* vertically center on the 2rem indicator */
    right: 50%;
    width: 100%;
    height: 2px;
    background: var(--chirpui-border);
    z-index: 0;
}

.chirpui-stepper__item--completed + .chirpui-stepper__item::before {
    background: var(--chirpui-accent);
}

.chirpui-stepper__indicator {
    position: relative;
    z-index: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    border-radius: 50%;
    background: var(--chirpui-bg-subtle, var(--chirpui-border));
    color: var(--chirpui-text-muted);
    font-size: var(--chirpui-font-sm);
    font-weight: 600;
    flex-shrink: 0;
    border: 2px solid var(--chirpui-border);
    transition: all var(--chirpui-transition);
}

.chirpui-stepper__item--active .chirpui-stepper__indicator {
    background: var(--chirpui-accent);
    color: white;
    border-color: var(--chirpui-accent);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--chirpui-accent) 25%, transparent);
}

.chirpui-stepper__item--completed .chirpui-stepper__indicator {
    background: color-mix(in srgb, var(--chirpui-accent) 15%, transparent);
    color: var(--chirpui-accent);
    border-color: var(--chirpui-accent);
}

.chirpui-stepper__check {
    font-size: 0.875rem;
    line-height: 1;
}

.chirpui-stepper__label {
    display: block;
    margin-top: var(--chirpui-spacing-xs);
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text-muted);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 100%;
    padding: 0 var(--chirpui-spacing-xs);
}

.chirpui-stepper__item--active .chirpui-stepper__label {
    color: var(--chirpui-text);
    font-weight: 600;
}

.chirpui-stepper__item--completed .chirpui-stepper__label {
    color: var(--chirpui-text-muted);
}

/* Hide the old connector element — lines are now drawn via ::before */
.chirpui-stepper__connector {
    display: none;
}

/* ==========================================================================
   Wizard Form
   ========================================================================== */

.chirpui-wizard-form__body {
    margin-top: var(--chirpui-spacing-lg);
}

/* ==========================================================================
   Description List
   ========================================================================== */

.chirpui-dl__header:empty {
    display: none;
}

.chirpui-dl {
    margin: 0;
}

.chirpui-dl__row {
    margin-bottom: var(--chirpui-spacing-sm);
}

.chirpui-dl__row:last-child {
    margin-bottom: 0;
}

.chirpui-dl__term {
    font-size: var(--chirpui-font-sm);
    font-weight: 500;
    color: var(--chirpui-text-muted);
    margin: 0 0 var(--chirpui-spacing-xs) 0;
}

.chirpui-dl__detail {
    margin: 0;
    font-size: var(--chirpui-font-base);
    color: var(--chirpui-text);
}

.chirpui-dl--horizontal {
    display: grid;
    gap: var(--chirpui-spacing-sm) var(--chirpui-spacing-lg);
}

.chirpui-dl--horizontal .chirpui-dl__row {
    display: grid;
    grid-template-columns: minmax(var(--chirpui-dl-term-width, 8rem), auto) 1fr;
    gap: var(--chirpui-spacing);
    align-items: baseline;
    margin-bottom: var(--chirpui-spacing-sm);
}

.chirpui-dl--horizontal .chirpui-dl__term {
    margin-bottom: 0;
}

.chirpui-dl--compact .chirpui-dl__row {
    margin-bottom: var(--chirpui-spacing-xs);
}

.chirpui-dl--compact .chirpui-dl__term {
    font-size: var(--chirpui-font-xs);
}

.chirpui-dl__detail--url,
.chirpui-dl__detail--path {
    font-family: var(--chirpui-mono-font-family);
    font-size: var(--chirpui-font-sm);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.chirpui-dl__detail--number {
    text-align: right;
}

/* Detail alignment overrides */
.chirpui-dl--detail-left .chirpui-dl__detail { text-align: left; }
.chirpui-dl--detail-center .chirpui-dl__detail { text-align: center; }
.chirpui-dl--detail-right .chirpui-dl__detail { text-align: right; }

.chirpui-dl__detail-unset {
    color: var(--chirpui-text-muted);
    font-style: italic;
}

/* ==========================================================================
   Settings Row (label | status | detail)
   ========================================================================== */

.chirpui-settings-row-list {
    display: grid;
    grid-template-columns: minmax(var(--chirpui-dl-term-width, 8rem), auto) minmax(6rem, auto) 1fr;
    gap: var(--chirpui-spacing-sm, 0.5rem) var(--chirpui-spacing-lg, 1.5rem);
    align-items: center;
}

.chirpui-settings-row {
    display: contents;
}

.chirpui-settings-row__label {
    flex-shrink: 0;
}

.chirpui-settings-row__status {
    min-width: 0;
}

.chirpui-settings-row__detail {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
}

.chirpui-settings-row__detail code {
    font-family: var(--chirpui-ascii-font, ui-monospace, monospace);
}

/* ==========================================================================
   Config Row (label | control)
   ========================================================================== */

.chirpui-config-row-list {
    display: grid;
    grid-template-columns: minmax(var(--chirpui-dl-term-width, 8rem), auto) 1fr;
    gap: var(--chirpui-spacing-sm, 0.5rem) var(--chirpui-spacing-lg, 1.5rem);
    align-items: center;
}

.chirpui-config-row {
    display: contents;
}

.chirpui-config-row__label {
    flex-shrink: 0;
}

.chirpui-config-row__control {
    min-width: 0;
}

.chirpui-config-row__form {
    display: flex;
    align-items: center;
}

.chirpui-config-row__toggle-wrap {
    margin: 0;
}

.chirpui-config-row__select {
    max-width: 20rem;
}

.chirpui-config-row__editable {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
}

.chirpui-config-row__editable.chirpui-inline-edit--display {
    margin-inline-start: calc(-1 * var(--chirpui-spacing-sm));
}

/* ==========================================================================
   Timeline
   ========================================================================== */

.chirpui-timeline {
    position: relative;
    padding-inline-start: var(--chirpui-spacing-lg);
    border-inline-start: 2px solid var(--chirpui-border);
}

.chirpui-timeline__item {
    position: relative;
    padding-bottom: var(--chirpui-spacing-lg);
}

.chirpui-timeline__item:last-child {
    padding-bottom: 0;
}

.chirpui-timeline__dot {
    position: absolute;
    left: calc(-1 * var(--chirpui-spacing-lg) - 4px);
    top: 0.35rem;
    width: 0.5rem;
    height: 0.5rem;
    border-radius: 50%;
    background: var(--chirpui-accent);
}

.chirpui-timeline__content {
    margin-inline-start: var(--chirpui-spacing);
}

.chirpui-timeline__header {
    display: flex;
    align-items: baseline;
    gap: var(--chirpui-spacing-sm);
    margin-bottom: var(--chirpui-spacing-xs);
}

.chirpui-timeline__header-actions {
    margin-inline-start: auto;
}

.chirpui-timeline__header-actions:empty,
.chirpui-timeline__body:empty {
    display: none;
}

.chirpui-timeline__title {
    font-weight: 500;
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text);
}

.chirpui-timeline__date {
    font-size: var(--chirpui-font-xs);
    color: var(--chirpui-text-muted);
}

.chirpui-timeline__body {
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text-muted);
}

/* Timeline: icon/avatar variants */
.chirpui-timeline__icon {
    position: absolute;
    left: calc(-1 * var(--chirpui-spacing-lg) - 10px);
    top: 0.15rem;
    width: 1.25rem;
    height: 1.25rem;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background: var(--chirpui-surface);
    border: 2px solid var(--chirpui-border);
    font-size: 0.65rem;
    color: var(--chirpui-text-muted);
}
.chirpui-timeline__avatar {
    position: absolute;
    left: calc(-1 * var(--chirpui-spacing-lg) - 10px);
    top: 0.15rem;
    width: 1.25rem;
    height: 1.25rem;
    border-radius: 50%;
    object-fit: cover;
}
.chirpui-timeline__time {
    display: block;
    font-size: var(--chirpui-font-xs);
    color: var(--chirpui-text-muted);
    margin-bottom: var(--chirpui-spacing-2xs);
    font-variant-numeric: tabular-nums;
}

/* Timeline: semantic dot colors */
.chirpui-timeline__item--success .chirpui-timeline__dot,
.chirpui-timeline__item--success .chirpui-timeline__icon { background: var(--chirpui-success); border-color: var(--chirpui-success); color: white; }
.chirpui-timeline__item--warning .chirpui-timeline__dot,
.chirpui-timeline__item--warning .chirpui-timeline__icon { background: var(--chirpui-warning); border-color: var(--chirpui-warning); color: white; }
.chirpui-timeline__item--error .chirpui-timeline__dot,
.chirpui-timeline__item--error .chirpui-timeline__icon { background: var(--chirpui-error); border-color: var(--chirpui-error); color: white; }
.chirpui-timeline__item--info .chirpui-timeline__dot,
.chirpui-timeline__item--info .chirpui-timeline__icon { background: var(--chirpui-info); border-color: var(--chirpui-info); color: white; }

/* Timeline: hoverable rows */
.chirpui-timeline--hoverable .chirpui-timeline__item {
    border-radius: var(--chirpui-radius);
    padding: var(--chirpui-spacing-xs);
    transition: background var(--chirpui-transition);
}
.chirpui-timeline--hoverable .chirpui-timeline__item:hover {
    background: var(--chirpui-surface-alt);
}

/* Timeline: clickable link overlay */
.chirpui-timeline__item--link { position: relative; }
.chirpui-timeline__link-overlay {
    position: absolute;
    inset: 0;
    z-index: 1;
}

/* ==========================================================================
   List
   ========================================================================== */

.chirpui-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-xs);
}

.chirpui-list__item {
    transition: opacity var(--chirpui-transition-slow), transform var(--chirpui-transition-slow);
    @starting-style {
        opacity: 0;
        transform: translateY(4px);
    }
}

.chirpui-list--bordered .chirpui-list__item {
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    background: var(--chirpui-surface);
}

.chirpui-list--bordered .chirpui-list__item + .chirpui-list__item {
    margin-top: var(--chirpui-spacing-xs);
}

.chirpui-list__link {
    color: var(--chirpui-accent);
    text-decoration: none;
    transition: color var(--chirpui-transition);
}

.chirpui-list__link:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-list__link:hover {
    color: var(--chirpui-accent-hover);
    text-decoration: underline;
}

/* ==========================================================================
   Utilities
   ========================================================================== */

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

.chirpui-focus-ring:focus-visible {
    outline: 2px solid var(--chirpui-focus-ring);
    outline-offset: var(--chirpui-state-focus-offset);
}

/* Typography utilities */
.chirpui-font-xs { font-size: var(--chirpui-font-xs); }
.chirpui-font-sm { font-size: var(--chirpui-font-sm); }
.chirpui-font-base { font-size: var(--chirpui-font-base); }
.chirpui-font-lg { font-size: var(--chirpui-font-lg); }
.chirpui-font-xl { font-size: var(--chirpui-font-xl); }
.chirpui-font-mono { font-family: var(--chirpui-mono-font-family); }
.chirpui-font-2xl { font-size: var(--chirpui-font-2xl); }
.chirpui-text-muted { color: var(--chirpui-text-muted); }

/* UI typography utilities — size, weight, composite */
.chirpui-ui-xs { font-size: var(--chirpui-ui-xs); }
.chirpui-ui-sm { font-size: var(--chirpui-ui-sm); }
.chirpui-ui-base { font-size: var(--chirpui-ui-base); }
.chirpui-ui-lg { font-size: var(--chirpui-ui-lg); }
.chirpui-ui-xl { font-size: var(--chirpui-ui-xl); }
.chirpui-ui-normal { font-weight: var(--chirpui-ui-font-weight-normal); }
.chirpui-ui-medium { font-weight: var(--chirpui-ui-font-weight-medium); }
.chirpui-ui-semibold { font-weight: var(--chirpui-ui-font-weight-semibold); }
.chirpui-ui-bold { font-weight: var(--chirpui-ui-font-weight-bold); }
.chirpui-ui-label {
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-sm);
    font-weight: var(--chirpui-ui-font-weight-medium);
    letter-spacing: 0.02em;
}
.chirpui-ui-title {
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-base);
    font-weight: var(--chirpui-ui-font-weight-semibold);
}
.chirpui-ui-meta {
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-xs);
    font-weight: var(--chirpui-ui-font-weight-normal);
}

.chirpui-prose-sm { font-size: var(--chirpui-prose-sm); }
.chirpui-prose-lg { font-size: var(--chirpui-prose-lg); }

/* Link — underline styling for anchors */
.chirpui-link {
    color: var(--chirpui-accent);
    text-decoration: none;
    text-underline-offset: 0.15em;
    position: relative;
    transition: color var(--chirpui-transition);
}

.chirpui-link::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: -0.05em;
    height: 1px;
    background: currentColor;
    transform: scaleX(0);
    transform-origin: right;
    transition: transform var(--chirpui-transition);
}

.chirpui-link:hover {
    color: var(--chirpui-accent-hover);
}

.chirpui-link:hover::after {
    transform: scaleX(1);
    transform-origin: left;
}

/* Typography — prose and headings */
.chirpui-prose {
    font-family: var(--chirpui-prose-font-family);
    font-size: var(--chirpui-prose-base);
    font-weight: var(--chirpui-prose-font-weight-normal);
    line-height: var(--chirpui-line-height-relaxed);
    color: var(--chirpui-text);
    max-width: var(--chirpui-prose-max-width, 65ch);
}

.chirpui-grid .chirpui-prose,
.chirpui-block.chirpui-prose {
    min-width: 0;
}

:where(.chirpui-prose) h1,
:where(.chirpui-prose) h2,
:where(.chirpui-prose) h3 {
    text-wrap: balance;
    font-family: var(--chirpui-prose-font-family);
    font-weight: var(--chirpui-prose-font-weight-heading);
    letter-spacing: -0.02em;
    color: var(--chirpui-text);
    margin: var(--chirpui-prose-spacing-heading) 0 var(--chirpui-prose-spacing);
}

:where(.chirpui-prose) h1 { font-size: var(--chirpui-prose-3xl); }
:where(.chirpui-prose) h2 { font-size: var(--chirpui-prose-2xl); }
:where(.chirpui-prose) h3 { font-size: var(--chirpui-prose-xl); }

:where(.chirpui-prose) h1:first-child,
:where(.chirpui-prose) h2:first-child,
:where(.chirpui-prose) h3:first-child {
    margin-top: 0;
}

:where(.chirpui-prose) p {
    margin-bottom: var(--chirpui-prose-spacing);
}

:where(.chirpui-prose) code {
    font-family: var(--chirpui-code-font-family);
    font-size: var(--chirpui-code-font-size-inline);
    background: var(--chirpui-code-bg);
    color: var(--chirpui-code-text);
    padding: 0.15em 0.35em;
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-code {
    font-family: var(--chirpui-code-font-family);
    font-size: var(--chirpui-code-font-size-inline);
    background: var(--chirpui-code-bg);
    color: var(--chirpui-code-text);
    padding: 0.15em 0.35em;
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-code-block {
    overflow-x: auto;
    padding: var(--chirpui-pre-padding);
    background: var(--chirpui-code-bg);
    border-radius: var(--chirpui-radius-sm);
    margin-bottom: var(--chirpui-prose-spacing);
    white-space: pre-wrap;
    font-family: var(--chirpui-code-font-family);
    font-size: var(--chirpui-code-font-size-block);
    line-height: var(--chirpui-code-line-height);
}

.chirpui-code-block code {
    background: none;
    padding: 0;
    color: var(--chirpui-code-text);
}

/* Code block copy button — revealed on hover, top-right corner */
.chirpui-code-block-wrapper {
    position: relative;
}

.chirpui-code-block-wrapper .chirpui-code-block {
    margin-bottom: 0;
}

.chirpui-code-block__copy {
    position: absolute;
    top: 0.5rem;
    right: 0.5rem;
    padding: 0.25rem 0.5rem;
    font-family: var(--chirpui-font-family);
    font-size: var(--chirpui-prose-xs);
    line-height: 1.4;
    color: var(--chirpui-code-text);
    background: var(--chirpui-code-bg);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    cursor: pointer;
    opacity: 0;
    transition: opacity var(--chirpui-transition), background var(--chirpui-transition);
}

.chirpui-code-block-wrapper:hover .chirpui-code-block__copy,
.chirpui-code-block__copy:focus-visible {
    opacity: 1;
}

.chirpui-code-block__copy:hover {
    background: var(--chirpui-bg-subtle);
}

.chirpui-code-block__copy:focus-visible {
    outline: 2px solid var(--chirpui-focus-ring);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-fieldset {
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    padding: var(--chirpui-spacing);
    margin: 0 0 var(--chirpui-spacing);
}

.chirpui-fieldset__legend {
    padding: 0 0.5em;
    font-weight: 600;
}

:where(.chirpui-prose) pre {
    overflow-x: auto;
    padding: var(--chirpui-pre-padding);
    background: var(--chirpui-code-bg);
    border-radius: var(--chirpui-radius-sm);
    margin-bottom: var(--chirpui-prose-spacing);
    font-family: var(--chirpui-code-font-family);
    font-size: var(--chirpui-code-font-size-block);
    line-height: var(--chirpui-code-line-height);
}

:where(.chirpui-prose) pre code {
    background: none;
    padding: 0;
    color: var(--chirpui-code-text);
}

:where(.chirpui-prose) a {
    color: var(--chirpui-accent);
    text-decoration: none;
}

:where(.chirpui-prose) a:hover {
    text-decoration: underline;
}

:where(.chirpui-prose) ul,
:where(.chirpui-prose) ol {
    padding-inline-start: 1.5em;
    margin-bottom: var(--chirpui-prose-spacing);
}

:where(.chirpui-prose) blockquote {
    margin: var(--chirpui-prose-spacing) 0;
    padding-inline-start: var(--chirpui-spacing);
    border-inline-start: 3px solid var(--chirpui-accent);
    color: var(--chirpui-text-muted);
}

:where(.chirpui-prose) > *:last-child {
    margin-bottom: 0;
}

:where(.chirpui-prose) hr {
    margin: var(--chirpui-prose-spacing-heading) 0;
    border: none;
    border-top: 1px solid var(--chirpui-border);
}

:where(.chirpui-prose) table {
    width: 100%;
    margin-bottom: var(--chirpui-prose-spacing);
    border-collapse: collapse;
}

:where(.chirpui-prose) th,
:where(.chirpui-prose) td {
    padding: 0.25em 0.5em;
    border: 1px solid var(--chirpui-border);
    text-align: left;
}

:where(.chirpui-prose) th {
    font-weight: var(--chirpui-prose-font-weight-heading);
    background: var(--chirpui-bg-subtle);
}

/* ==========================================================================
   Streaming and AI components
   ========================================================================== */

.chirpui-streaming-block {
    min-height: 2rem;
    position: relative;
    white-space: pre-wrap;
}

.chirpui-streaming-block__cursor {
    display: inline-block;
    width: 2px;
    height: 1em;
    background: var(--chirpui-accent);
    margin-left: 2px;
    animation: chirpui-cursor-blink 0.8s step-end infinite;
    vertical-align: text-bottom;
}

.chirpui-streaming-block--active .chirpui-streaming-block__cursor {
    animation: chirpui-cursor-blink 0.8s step-end infinite;
}

@keyframes chirpui-cursor-blink {
    50% { opacity: 0; }
}

@supports (text-box-trim: trim-both) {
    .chirpui-copy-btn,
    .chirpui-badge,
    .chirpui-pagination__link,
    .chirpui-modal__close,
    .chirpui-toast__close,
    .chirpui-alert__close {
        text-box-trim: trim-both;
        text-box-edge: cap alphabetic;
    }
}

.chirpui-copy-btn {
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-sm);
    font-size: var(--chirpui-font-sm);
    background: var(--chirpui-bg-subtle);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    color: var(--chirpui-text-muted);
    cursor: pointer;
    transition: background var(--chirpui-transition), color var(--chirpui-transition);
}

.chirpui-copy-btn:hover {
    background: var(--chirpui-border);
    color: var(--chirpui-text);
}

.chirpui-copy-btn:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-model-card__header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--chirpui-spacing-sm);
}

.chirpui-model-card__title {
    font-weight: 600;
}

.chirpui-model-card__badge {
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-xs);
    font-weight: var(--chirpui-ui-font-weight-medium);
    padding: 0.15rem 0.4rem;
    background: var(--chirpui-bg-subtle);
    border-radius: var(--chirpui-radius-sm);
    color: var(--chirpui-text-muted);
}

.chirpui-model-card__body {
    min-height: 3rem;
}

@media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
    }

    .chirpui-streaming-block__cursor {
        animation: none;
    }
}

/* ==========================================================================
   Surface
   ========================================================================== */

.chirpui-surface {
    border-radius: var(--chirpui-radius);
    padding: var(--chirpui-space-surface-padding);
}

.chirpui-surface--default {
    background: var(--chirpui-surface);
}

.chirpui-surface--muted {
    background: var(--chirpui-bg-subtle);
}

.chirpui-surface--elevated {
    background: var(--chirpui-surface-elevated);
    box-shadow: var(--chirpui-elevation-2);
}

.chirpui-surface--accent {
    background: color-mix(in srgb, var(--chirpui-accent) 10%, transparent);
}

.chirpui-surface--gradient-subtle {
    background: var(--chirpui-gradient-subtle);
}

.chirpui-surface--gradient-accent {
    background: var(--chirpui-gradient-accent);
}

.chirpui-surface--gradient-mesh {
    background: var(--chirpui-gradient-mesh);
}

/* Gradient border — dual background, background-clip; fallback solid border */
.chirpui-surface--gradient-border {
    background: var(--chirpui-surface);
    border: 2px solid var(--chirpui-border);
}
@supports (background: linear-gradient(red, blue)) and (background-clip: padding-box) {
    .chirpui-surface--gradient-border {
        background: linear-gradient(var(--chirpui-surface), var(--chirpui-surface)),
            var(--chirpui-gradient-border);
        background-origin: padding-box, border-box;
        background-clip: padding-box, border-box;
        background-repeat: no-repeat;
        border: 2px solid transparent;
    }
}

/* Glass — subtle blur, translucent */
.chirpui-surface--glass {
    background: var(--chirpui-surface-alt);
    border: 1px solid var(--chirpui-border);
}
@supports (backdrop-filter: blur(10px)) or (-webkit-backdrop-filter: blur(10px)) {
    .chirpui-surface--glass {
        background: var(--chirpui-glass-bg);
        border-color: var(--chirpui-glass-border);
        backdrop-filter: blur(10px);
        -webkit-backdrop-filter: blur(10px);
    }
}

/* Frosted — stronger blur, more opaque */
.chirpui-surface--frosted {
    background: var(--chirpui-surface-alt);
    border: 1px solid var(--chirpui-border);
}
@supports (backdrop-filter: blur(20px)) or (-webkit-backdrop-filter: blur(20px)) {
    .chirpui-surface--frosted {
        background: var(--chirpui-frosted-bg);
        border-color: var(--chirpui-frosted-border);
        backdrop-filter: blur(20px);
        -webkit-backdrop-filter: blur(20px);
    }
}

/* Smoke — dark tinted glass for overlays */
.chirpui-surface--smoke {
    background: var(--chirpui-bg-subtle);
    border: 1px solid var(--chirpui-border);
}
@supports (backdrop-filter: blur(12px)) or (-webkit-backdrop-filter: blur(12px)) {
    .chirpui-surface--smoke {
        background: var(--chirpui-smoke-bg);
        border-color: var(--chirpui-smoke-border);
        backdrop-filter: blur(12px);
        -webkit-backdrop-filter: blur(12px);
    }
}

.chirpui-surface--full {
    width: 100%;
}

/* Blade — full-width edge-to-edge section; breaks out of container */
.chirpui-blade {
    width: 100vw;
    max-width: 100vw;
    margin-inline: calc(50% - 50vw);
}

/* Parallax — subtle scroll-driven opacity (Chrome 115+); respects prefers-reduced-motion */
@supports (animation-timeline: view()) {
    @media (prefers-reduced-motion: no-preference) {
        .chirpui-blade--parallax .chirpui-surface {
            animation: chirpui-parallax-fade linear;
            animation-timeline: view();
            animation-range: entry 0% entry 50%;
        }
    }
}
@keyframes chirpui-parallax-fade {
    from { opacity: 0.97; }
    to { opacity: 1; }
}

.chirpui-surface--no-padding {
    padding: 0;
}

/* ==========================================================================
   Callout
   ========================================================================== */

.chirpui-callout {
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    border-radius: var(--chirpui-radius-sm);
    border-inline-start: 4px solid var(--chirpui-border);
}

.chirpui-callout--info {
    background: var(--chirpui-alert-info-bg);
    border-inline-start-color: var(--chirpui-alert-info-border);
}

.chirpui-callout--success {
    background: var(--chirpui-alert-success-bg);
    border-inline-start-color: var(--chirpui-alert-success-border);
}

.chirpui-callout--warning {
    background: var(--chirpui-alert-warning-bg);
    border-inline-start-color: var(--chirpui-alert-warning-border);
}

.chirpui-callout--error {
    background: var(--chirpui-alert-error-bg);
    border-inline-start-color: var(--chirpui-alert-error-border);
}

.chirpui-callout--neutral {
    background: var(--chirpui-bg-subtle);
    border-inline-start-color: var(--chirpui-border);
}

.chirpui-callout__header {
    display: flex;
    align-items: flex-start;
    gap: var(--chirpui-spacing-sm);
    margin-bottom: var(--chirpui-spacing-xs);
}

.chirpui-callout__icon {
    font-size: 1em;
    line-height: 1;
    flex-shrink: 0;
}

.chirpui-callout__title {
    font-weight: 600;
    font-size: var(--chirpui-font-base);
    margin-bottom: 0;
}

.chirpui-callout__header-actions {
    margin-inline-start: auto;
}

.chirpui-callout__header-actions:empty {
    display: none;
}

.chirpui-callout__header:not(:has(.chirpui-callout__icon)):not(:has(.chirpui-callout__title)):has(.chirpui-callout__header-actions:empty) {
    display: none;
}

.chirpui-callout__body {
    font-size: var(--chirpui-font-sm);
}

/* ==========================================================================
   Hero
   ========================================================================== */

.chirpui-hero {
    width: 100%;
    padding: var(--chirpui-spacing-xl) var(--chirpui-spacing);
}

.chirpui-hero__inner {
    max-width: var(--chirpui-container-max);
    margin-inline: auto;
    text-align: center;
}

.chirpui-hero__title {
    font-size: var(--chirpui-font-2xl);
    font-weight: 700;
    line-height: var(--chirpui-line-height-tight);
    margin: 0 0 var(--chirpui-spacing-sm);
    color: var(--chirpui-text);
}

.chirpui-hero__subtitle {
    font-size: var(--chirpui-font-lg);
    color: var(--chirpui-text-muted);
    margin: 0 0 var(--chirpui-spacing);
    line-height: var(--chirpui-line-height-normal);
}

.chirpui-hero__content {
    margin-top: var(--chirpui-spacing);
}

.chirpui-hero__action {
    margin-top: var(--chirpui-spacing);
}

.chirpui-hero__action:empty {
    display: none;
}

.chirpui-hero--solid {
    background: var(--chirpui-bg-subtle);
}

.chirpui-hero--muted {
    background: var(--chirpui-surface-alt);
}

.chirpui-hero--gradient {
    background: linear-gradient(
        135deg,
        var(--chirpui-bg-subtle) 0%,
        color-mix(in srgb, var(--chirpui-accent) 8%, var(--chirpui-bg)) 100%
    );
}

.chirpui-hero--mesh {
    background: var(--chirpui-gradient-mesh);
}

.chirpui-hero--animated-gradient {
    background: var(--chirpui-gradient-subtle);
}
@media (prefers-reduced-motion: no-preference) {
    .chirpui-hero--animated-gradient {
        background: linear-gradient(
            -45deg,
            var(--chirpui-bg-subtle),
            color-mix(in srgb, var(--chirpui-accent) 8%, var(--chirpui-bg)),
            color-mix(in srgb, var(--chirpui-accent-secondary) 6%, var(--chirpui-bg)),
            var(--chirpui-bg-subtle)
        );
        background-size: 400% 400%;
        animation: chirpui-gradient-shift 15s ease infinite;
    }
}
@keyframes chirpui-gradient-shift {
    0% { background-position: 0% 50%; }
    50% { background-position: 100% 50%; }
    100% { background-position: 0% 50%; }
}

/* Page hero (docs, editorial) */
.chirpui-hero--page .chirpui-hero__eyebrow,
.chirpui-hero--page .chirpui-hero__actions,
.chirpui-hero--page .chirpui-hero__metadata,
.chirpui-hero--page .chirpui-hero__footer {
    margin-bottom: var(--chirpui-spacing-sm);
}

.chirpui-hero--page .chirpui-hero__eyebrow:empty,
.chirpui-hero--page .chirpui-hero__actions:empty,
.chirpui-hero--page .chirpui-hero__metadata:empty,
.chirpui-hero--page .chirpui-hero__footer:empty {
    display: none;
}

.chirpui-hero--page-minimal .chirpui-hero__eyebrow {
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text-muted);
}

/* ==========================================================================
   Overlay
   ========================================================================== */

.chirpui-overlay {
    position: absolute;
    inset: 0;
    pointer-events: none;
}

.chirpui-overlay--dark {
    background: var(--chirpui-overlay-dark);
}

.chirpui-overlay--gradient-bottom {
    background: var(--chirpui-overlay-gradient-bottom);
}

.chirpui-overlay--gradient-top {
    background: var(--chirpui-overlay-gradient-top);
}

/* ==========================================================================
   Carousel
   ========================================================================== */

.chirpui-carousel {
    position: relative;
}

.chirpui-carousel__track {
    display: flex;
    gap: var(--chirpui-spacing);
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scroll-behavior: smooth;
    -webkit-overflow-scrolling: touch;
    padding-inline: var(--chirpui-spacing);
}

.chirpui-carousel__slide {
    scroll-snap-align: start;
    scroll-snap-stop: always;
    flex: 0 0 auto;
}

.chirpui-carousel--compact .chirpui-carousel__slide {
    min-width: min(280px, 85vw);
}

.chirpui-carousel--page .chirpui-carousel__slide {
    min-width: 100%;
    scroll-snap-align: center;
}

.chirpui-carousel__dots {
    display: flex;
    justify-content: center;
    gap: var(--chirpui-spacing-sm);
    margin-top: var(--chirpui-spacing);
    padding-inline: var(--chirpui-spacing);
}

.chirpui-carousel__dot {
    width: 0.5rem;
    height: 0.5rem;
    border-radius: 50%;
    background: var(--chirpui-border);
    transition: background var(--chirpui-transition);
}

.chirpui-carousel__dot:hover {
    background: var(--chirpui-accent);
}

.chirpui-carousel:has(#slide-1:target) .chirpui-carousel__dot[href="#slide-1"],
.chirpui-carousel:has(#slide-2:target) .chirpui-carousel__dot[href="#slide-2"],
.chirpui-carousel:has(#slide-3:target) .chirpui-carousel__dot[href="#slide-3"],
.chirpui-carousel:has(#slide-4:target) .chirpui-carousel__dot[href="#slide-4"],
.chirpui-carousel:has(#slide-5:target) .chirpui-carousel__dot[href="#slide-5"] {
    background: var(--chirpui-accent);
}

/* ==========================================================================
   Card
   ========================================================================== */

.chirpui-card {
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
    overflow: hidden;
    box-shadow: var(--chirpui-elevation-card-rest);
    transition: border-color var(--chirpui-transition), box-shadow var(--chirpui-transition),
        transform var(--chirpui-transition), opacity var(--chirpui-transition);
    @starting-style {
        opacity: 0;
        transform: translateY(8px);
    }
}

.chirpui-card__header {
    display: flex;
    align-items: center;
    gap: var(--chirpui-space-card-gap);
    padding: var(--chirpui-space-card-gap) var(--chirpui-space-card-padding);
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-sm);
    font-weight: var(--chirpui-ui-font-weight-semibold);
    color: var(--chirpui-card-header-color);
    border-bottom: 1px solid var(--chirpui-border);
}

.chirpui-card__icon {
    font-size: 1em;
    line-height: 1;
    flex-shrink: 0;
}

.chirpui-card__header-content {
    flex: 1;
}

.chirpui-card__title {
    display: block;
    font-size: var(--chirpui-ui-base);
    font-weight: var(--chirpui-ui-font-weight-semibold);
}

.chirpui-card__header-actions {
    display: flex;
    align-items: center;
    gap: var(--chirpui-space-inline-gap);
    margin-inline-start: auto;
}

.chirpui-card__header-badges {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--chirpui-space-inline-gap);
    flex-shrink: 0;
}

.chirpui-card__header-badges:empty {
    display: none;
}

.chirpui-card__header-subtitle {
    margin-top: var(--chirpui-spacing-xs);
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text-muted);
}

.chirpui-card__header-subtitle:empty {
    display: none;
}

.chirpui-card__body {
    padding: var(--chirpui-space-card-padding);
}

.chirpui-card__body-actions:empty {
    display: none;
}

.chirpui-card__body-actions:not(:empty) {
    margin-top: var(--chirpui-space-card-gap);
    display: flex;
    align-items: center;
    gap: var(--chirpui-space-control-gap);
}

/* Links in card body — no underline by default; card/title signals clickability */
.chirpui-card__body a {
    color: var(--chirpui-card-body-link-color);
    text-decoration: var(--chirpui-card-body-link-decoration);
    transition: color var(--chirpui-transition);
}

.chirpui-card__body a:hover {
    color: var(--chirpui-card-body-link-hover-color);
}

.chirpui-card:has(.chirpui-card__footer) .chirpui-card__body,
.chirpui-card:has(.chirpui-card__footer-wrap:not(:empty)) .chirpui-card__body {
    padding-bottom: var(--chirpui-space-card-gap);
}

.chirpui-card__footer {
    padding: var(--chirpui-space-card-gap) var(--chirpui-space-card-padding);
    border-top: 1px solid var(--chirpui-border);
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text-muted);
}

.chirpui-card__footer-wrap:not(:empty) {
    border-top: 1px solid var(--chirpui-border);
    padding: var(--chirpui-space-card-gap) var(--chirpui-space-card-padding);
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text-muted);
}

.chirpui-card__top-meta {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-space-inline-gap);
    padding: var(--chirpui-space-card-gap) var(--chirpui-space-card-padding);
    border-bottom: 1px solid var(--chirpui-border);
    font-size: var(--chirpui-font-xs);
}

.chirpui-card__top-meta:empty {
    display: none;
}

.chirpui-card__main-link {
    display: block;
    flex: 1;
    color: inherit;
    text-decoration: none;
}

.chirpui-resource-card {
    height: 100%;
}

.chirpui-resource-card__description {
    margin: 0;
}

.chirpui-card--collapsible summary {
    cursor: pointer;
    list-style: none;
}

.chirpui-card--collapsible summary::before {
    content: "\25B6";
    display: inline-block;
    margin-right: var(--chirpui-spacing-xs);
    transition: transform var(--chirpui-transition);
    font-size: 0.75em;
}

.chirpui-card--collapsible[open] summary::before {
    rotate: 90deg;
}

.chirpui-card__media {
    overflow: hidden;
}

.chirpui-card__media:empty {
    display: none;
}

.chirpui-card__media img,
.chirpui-card__media video {
    display: block;
    width: 100%;
    height: auto;
    aspect-ratio: var(--chirpui-video-aspect-ratio);
    object-fit: cover;
}

.chirpui-card--feature .chirpui-card__media,
.chirpui-card--media .chirpui-card__media {
    order: -1;
}

.chirpui-card--horizontal {
    display: flex;
    flex-direction: row;
}

.chirpui-card--horizontal .chirpui-card__media {
    flex: 0 0 40%;
    max-width: 12rem;
}

.chirpui-card--horizontal .chirpui-card__media img,
.chirpui-card--horizontal .chirpui-card__media video {
    aspect-ratio: 1;
    height: 100%;
}

.chirpui-card--stats .chirpui-card__body {
    text-align: center;
}

.chirpui-card--stats .chirpui-card__header {
    border-bottom: none;
    font-size: var(--chirpui-font-2xl);
    font-weight: 700;
}

.chirpui-card--glass {
    background: color-mix(in srgb, var(--chirpui-surface) 80%, transparent);
    backdrop-filter: blur(8px);
}

/* Gradient border — dual background, background-clip; fallback solid */
.chirpui-card--gradient-border {
    border: 2px solid var(--chirpui-border);
}
@supports (background-clip: padding-box) {
    .chirpui-card--gradient-border {
        background: linear-gradient(var(--chirpui-surface), var(--chirpui-surface)),
            var(--chirpui-gradient-border);
        background-origin: padding-box, border-box;
        background-clip: padding-box, border-box;
        background-repeat: no-repeat;
        border: 2px solid transparent;
    }
}

.chirpui-card--gradient-header .chirpui-card__header {
    background: var(--chirpui-gradient-subtle);
}

.chirpui-card--hoverable:not(.chirpui-card--link) {
    cursor: pointer;
    transition: transform var(--chirpui-transition), box-shadow var(--chirpui-transition);
}

.chirpui-card:not(.chirpui-card--link):hover {
    border-color: var(--chirpui-card-hover-border);
    box-shadow: var(--chirpui-elevation-card-hover);
}

@media (prefers-reduced-motion: no-preference) {
    .chirpui-card:not(.chirpui-card--link):hover {
        transform: translateY(-2px);
    }

    .chirpui-card--hoverable:not(.chirpui-card--link):hover {
        transform: translateY(-2px);
        box-shadow: var(--chirpui-shadow-md);
    }
}

.chirpui-card--link {
    display: flex;
    flex-direction: column;
    height: 100%;
    text-decoration: none;
    color: inherit;
    cursor: pointer;
    transition: box-shadow var(--chirpui-transition), border-color var(--chirpui-transition);
}

.chirpui-card--linked {
    display: flex;
    flex-direction: column;
    height: 100%;
    transition: box-shadow var(--chirpui-transition), border-color var(--chirpui-transition);
}

.chirpui-resource-index {
    width: 100%;
}

.chirpui-resource-index__search,
.chirpui-resource-index__filters,
.chirpui-resource-index__results {
    width: 100%;
}

.chirpui-card--link .chirpui-card__body {
    flex: 1;
}

.chirpui-card--linked .chirpui-card__body {
    flex: 1;
}

.chirpui-card--link:hover {
    border-color: var(--chirpui-state-border-hover);
    box-shadow: var(--chirpui-elevation-card-hover);
}

.chirpui-card--linked:hover,
.chirpui-card--linked:has(.chirpui-card__main-link:focus-visible) {
    border-color: var(--chirpui-state-border-hover);
    box-shadow: var(--chirpui-elevation-card-hover);
}

@media (prefers-reduced-motion: no-preference) {
    .chirpui-card--link {
        transition: box-shadow var(--chirpui-transition), border-color var(--chirpui-transition),
            transform var(--chirpui-transition);
    }

    .chirpui-card--linked {
        transition: box-shadow var(--chirpui-transition), border-color var(--chirpui-transition),
            transform var(--chirpui-transition);
    }

    .chirpui-card--link:hover {
        transform: translateY(-2px);
    }

    .chirpui-card--linked:hover,
    .chirpui-card--linked:has(.chirpui-card__main-link:focus-visible) {
        transform: translateY(-2px);
    }

    .chirpui-card--link:active {
        transform: translateY(0);
    }

    .chirpui-card--linked:has(.chirpui-card__main-link:active) {
        transform: translateY(0);
    }
}

.chirpui-card--link:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-card--linked:has(.chirpui-card__main-link:focus-visible) {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-card--link:active {
    box-shadow: var(--chirpui-elevation-card-rest);
    border-color: var(--chirpui-state-border-active);
}

.chirpui-card--linked:has(.chirpui-card__main-link:active) {
    box-shadow: var(--chirpui-elevation-card-rest);
    border-color: var(--chirpui-state-border-active);
}

/* ==========================================================================
   Video Card
   ========================================================================== */

.chirpui-video-card {
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
    overflow: hidden;
    transition: border-color var(--chirpui-transition), box-shadow var(--chirpui-transition);
}

.chirpui-video-card:hover {
    border-color: var(--chirpui-card-hover-border);
    box-shadow: var(--chirpui-elevation-card-hover);
}

.chirpui-video-card__link {
    display: block;
    text-decoration: none;
    color: inherit;
}

.chirpui-video-card__thumbnail {
    position: relative;
    margin: 0;
    aspect-ratio: var(--chirpui-video-aspect-ratio);
    overflow: hidden;
    background: var(--chirpui-bg-subtle);
}

.chirpui-video-card__thumbnail img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.chirpui-video-card__actions {
    position: absolute;
    top: var(--chirpui-spacing-xs);
    right: var(--chirpui-spacing-xs);
}

.chirpui-video-card__actions:empty {
    display: none;
}

.chirpui-video-card__duration {
    position: absolute;
    right: var(--chirpui-spacing-xs);
    bottom: var(--chirpui-spacing-xs);
    padding: 0.125rem 0.35rem;
    font-size: var(--chirpui-font-xs);
    font-weight: 600;
    background: rgba(0, 0, 0, 0.75);
    color: white;
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-video-card__body {
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
}

.chirpui-video-card__title {
    margin: 0 0 var(--chirpui-spacing-xs);
    font-size: var(--chirpui-font-sm);
    font-weight: 600;
    line-height: var(--chirpui-line-height-tight);
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.chirpui-video-card__channel,
.chirpui-video-card__meta {
    margin: 0;
    font-size: var(--chirpui-font-xs);
    color: var(--chirpui-text-muted);
}

.chirpui-video-card__channel-link {
    color: inherit;
    text-decoration: none;
}

.chirpui-video-card__channel-link:hover {
    color: var(--chirpui-accent);
    text-decoration: underline;
}

/* ==========================================================================
   Channel Card
   ========================================================================== */

.chirpui-channel-card {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing);
    padding: var(--chirpui-spacing);
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
}

.chirpui-channel-card__link {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing);
    flex: 1;
    min-width: 0;
    text-decoration: none;
    color: inherit;
}

.chirpui-channel-card__link:hover .chirpui-channel-card__name {
    color: var(--chirpui-accent);
}

.chirpui-channel-card__info {
    min-width: 0;
}

.chirpui-channel-card__name {
    margin: 0;
    font-size: var(--chirpui-font-base);
    font-weight: 600;
}

.chirpui-channel-card__subscribers {
    margin: var(--chirpui-spacing-xs) 0 0;
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text-muted);
}

.chirpui-channel-card__body:empty {
    display: none;
}

.chirpui-channel-card__actions {
    flex-shrink: 0;
}

/* ==========================================================================
   Video Thumbnail
   ========================================================================== */

.chirpui-video-thumbnail {
    display: block;
    position: relative;
    aspect-ratio: var(--chirpui-video-aspect-ratio);
    overflow: hidden;
    background: var(--chirpui-bg-subtle);
    border-radius: var(--chirpui-radius);
}

.chirpui-video-thumbnail__img-wrap {
    position: relative;
    display: block;
    width: 100%;
    height: 100%;
}

.chirpui-video-thumbnail img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.chirpui-video-thumbnail__play {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 3rem;
    color: rgba(255, 255, 255, 0.9);
    text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

.chirpui-video-thumbnail__duration {
    position: absolute;
    right: var(--chirpui-spacing-xs);
    bottom: var(--chirpui-spacing-xs);
    padding: 0.125rem 0.35rem;
    font-size: var(--chirpui-font-xs);
    font-weight: 600;
    background: rgba(0, 0, 0, 0.75);
    color: white;
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-video-thumbnail__progress {
    position: absolute;
    left: 0;
    bottom: 0;
    height: 3px;
    background: var(--chirpui-error);
}

/* ==========================================================================
   Live Badge
   ========================================================================== */

.chirpui-live-badge {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
    padding: 0.125rem 0.5rem;
    font-size: var(--chirpui-font-xs);
    font-weight: 600;
    background: var(--chirpui-error);
    color: white;
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-live-badge__dot {
    width: 0.5rem;
    height: 0.5rem;
    border-radius: 50%;
    background: currentColor;
    animation: chirpui-live-pulse 1.5s ease-in-out infinite;
}

@keyframes chirpui-live-pulse {
    0%, 100% { opacity: 1; }
    50% { opacity: 0.5; }
}

.chirpui-live-badge__viewers {
    opacity: 0.9;
}

/* ==========================================================================
   Playlist
   ========================================================================== */

.chirpui-playlist {
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
    overflow: hidden;
}

.chirpui-playlist__header {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
    border-bottom: 1px solid var(--chirpui-border);
}

.chirpui-playlist__title {
    margin: 0;
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    font-size: var(--chirpui-font-sm);
    font-weight: 600;
    flex: 1;
}

.chirpui-playlist__header-actions:empty {
    display: none;
}

.chirpui-playlist__list {
    list-style: none;
    margin: 0;
    padding: 0;
}

.chirpui-playlist-item {
    border-bottom: 1px solid var(--chirpui-border);
}

.chirpui-playlist-item:last-child {
    border-bottom: none;
}

.chirpui-playlist-item__link {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: var(--chirpui-spacing);
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    text-decoration: none;
    color: inherit;
    transition: background var(--chirpui-transition);
}

.chirpui-playlist-item__link:hover {
    background: var(--chirpui-bg-subtle);
}

.chirpui-playlist-item__link:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-playlist-item--active .chirpui-playlist-item__link {
    color: var(--chirpui-accent);
    background: color-mix(in srgb, var(--chirpui-accent) 10%, transparent);
    font-weight: 600;
}

.chirpui-playlist-item__title {
    flex: 1;
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.chirpui-playlist-item__duration {
    flex-shrink: 0;
    font-size: var(--chirpui-font-xs);
    color: var(--chirpui-text-muted);
}

/* ==========================================================================
   Chapter List
   ========================================================================== */

.chirpui-chapter-list {
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
    background: var(--chirpui-surface);
}

.chirpui-chapter-list__summary {
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    font-weight: 600;
    cursor: pointer;
    list-style: none;
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
}

.chirpui-chapter-list__summary::after {
    content: "\25B8";
    display: inline-block;
    transition: rotate var(--chirpui-transition);
    margin-inline-start: auto;
    font-size: 0.75em;
    color: var(--chirpui-text-muted);
}

.chirpui-chapter-list[open] > .chirpui-chapter-list__summary::after {
    rotate: 90deg;
}

.chirpui-chapter-list__summary-text {
    flex: 1;
}

.chirpui-chapter-list__summary-actions:empty {
    display: none;
}

.chirpui-chapter-list__summary::-webkit-details-marker {
    display: none;
}

.chirpui-chapter-list__list {
    padding: 0 var(--chirpui-spacing) var(--chirpui-spacing);
    margin: 0;
    list-style: none;
}

.chirpui-chapter-item {
    margin-bottom: var(--chirpui-spacing-xs);
}

.chirpui-chapter-item:last-child {
    margin-bottom: 0;
}

.chirpui-chapter-item__link {
    display: flex;
    gap: var(--chirpui-spacing);
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-sm);
    text-decoration: none;
    color: inherit;
    border-radius: var(--chirpui-radius-sm);
    transition: background var(--chirpui-transition);
}

a.chirpui-chapter-item__link:hover {
    background: var(--chirpui-bg-subtle);
}

a.chirpui-chapter-item__link:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-chapter-item__timestamp {
    flex-shrink: 0;
    font-size: var(--chirpui-font-xs);
    color: var(--chirpui-text-muted);
}

.chirpui-chapter-item__title {
    flex: 1;
    min-width: 0;
}

/* ==========================================================================
   Modal
   ========================================================================== */

/* Native <dialog>: must stay hidden until showModal() is called (theme-safe) */
dialog.chirpui-modal:not([open]) {
    display: none;
}

dialog.chirpui-modal,
.chirpui-modal {
    max-width: var(--chirpui-modal-width);
    width: 100%;
    background: var(--chirpui-surface);
    color: var(--chirpui-text, inherit);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
    padding: 0;
    box-shadow: var(--chirpui-elevation-overlay);
    transition: transform var(--chirpui-transition-slow) var(--chirpui-ease-spring),
        opacity var(--chirpui-transition-slow) var(--chirpui-ease-spring);
    @starting-style {
        transform: scale(0.95);
        opacity: 0;
    }
}

/* Top layer: ensure descendants inherit modal text color (avoids black-on-black) */
dialog.chirpui-modal * {
    color: inherit;
}

dialog.chirpui-modal a {
    color: var(--chirpui-accent);
}

.chirpui-modal--small { max-width: var(--chirpui-modal-width-sm); }
.chirpui-modal--large { max-width: var(--chirpui-modal-width-lg); }

.chirpui-modal::backdrop {
    background: rgba(0, 0, 0, 0.4);
    backdrop-filter: blur(2px);
}

.chirpui-modal__header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    border-bottom: 1px solid var(--chirpui-border);
}

.chirpui-modal__title {
    margin: 0;
    font-size: 1.125rem;
}

.chirpui-modal__header-actions {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
    margin-inline-start: auto;
}

.chirpui-modal__header-actions:empty {
    display: none;
}

.chirpui-modal__close {
    background: none;
    border: none;
    color: inherit;
    font-size: 1.5rem;
    cursor: pointer;
    line-height: 1;
    padding: 0 var(--chirpui-spacing-xs);
    border-radius: var(--chirpui-radius-sm);
    transition: background var(--chirpui-transition);
}

.chirpui-modal__close:hover {
    background: var(--chirpui-bg-subtle);
}

.chirpui-modal__close:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-modal__body {
    padding: var(--chirpui-spacing);
    color: inherit;
}

.chirpui-modal__body code {
    color: inherit;
    background: var(--chirpui-bg-subtle);
    padding: 0.125em 0.25em;
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-modal__footer {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: var(--chirpui-spacing-sm);
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    border-top: 1px solid var(--chirpui-border);
}

.chirpui-modal__footer:empty {
    display: none;
}

/* Confirm dialog */
.chirpui-confirm__message:empty {
    display: none;
}

.chirpui-confirm__message {
    margin: 0 0 var(--chirpui-spacing) 0;
    color: var(--chirpui-text-muted);
}

.chirpui-confirm__footer {
    display: flex;
    gap: var(--chirpui-spacing-sm);
    justify-content: flex-end;
}

.chirpui-confirm--danger {
    border-left: 3px solid var(--chirpui-error);
}

.chirpui-confirm--danger .chirpui-modal__header {
    background: color-mix(in srgb, var(--chirpui-error) 8%, var(--chirpui-surface));
}

.chirpui-confirm--danger .chirpui-modal__title {
    color: var(--chirpui-error);
}

.chirpui-confirm--danger .chirpui-confirm__icon {
    margin-right: 0.5em;
}

.chirpui-confirm--danger .chirpui-btn--danger {
    background: var(--chirpui-error);
    color: white;
    border-color: var(--chirpui-error);
}

.chirpui-confirm--danger .chirpui-btn--danger:hover {
    background: color-mix(in srgb, var(--chirpui-error) 85%, black);
}

/* ==========================================================================
   Drawer
   ========================================================================== */

.chirpui-drawer {
    border: none;
    padding: 0;
    max-width: none;
    width: 100%;
    height: 100%;
    background: transparent;
}

.chirpui-drawer::backdrop {
    background: rgba(0, 0, 0, 0.4);
    backdrop-filter: blur(2px);
}

.chirpui-drawer__panel {
    position: absolute;
    top: 0;
    bottom: 0;
    width: min(24rem, 90vw);
    max-width: 24rem;
    background: var(--chirpui-surface);
    box-shadow: var(--chirpui-elevation-overlay);
    display: flex;
    flex-direction: column;
    margin: 0;
    transition: transform var(--chirpui-transition-slow) var(--chirpui-ease-spring);
}

.chirpui-drawer--right .chirpui-drawer__panel {
    right: 0;
    margin-left: auto;
}

.chirpui-drawer--right .chirpui-drawer__panel {
    @starting-style {
        transform: translateX(100%);
    }
}

.chirpui-drawer--left .chirpui-drawer__panel {
    left: 0;
    margin-right: auto;
}

.chirpui-drawer--left .chirpui-drawer__panel {
    @starting-style {
        transform: translateX(-100%);
    }
}

.chirpui-drawer__header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: var(--chirpui-spacing) var(--chirpui-spacing-md);
    border-bottom: 1px solid var(--chirpui-border);
}

.chirpui-drawer__title {
    margin: 0;
    font-size: var(--chirpui-font-lg);
}

.chirpui-drawer__header-actions {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
    margin-inline-start: auto;
}

.chirpui-drawer__header-actions:empty {
    display: none;
}

.chirpui-drawer__close {
    background: none;
    border: none;
    color: inherit;
    font-size: 1.5rem;
    cursor: pointer;
    line-height: 1;
    padding: 0 var(--chirpui-spacing-xs);
    border-radius: var(--chirpui-radius-sm);
    transition: background var(--chirpui-transition);
}

.chirpui-drawer__close:hover {
    background: var(--chirpui-bg-subtle);
}

.chirpui-drawer__close:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-drawer__body {
    padding: var(--chirpui-spacing-md);
    overflow-y: auto;
    flex: 1;
}

/* ==========================================================================
   Tabs
   ========================================================================== */

.chirpui-tabs {
    display: flex;
    gap: 0;
    border-bottom: 1px solid var(--chirpui-border);
}

.chirpui-tab {
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    text-decoration: none;
    color: inherit;
    border-bottom: 2px solid transparent;
    margin-bottom: -1px;
    font-size: var(--chirpui-font-sm);
    transition: border-color var(--chirpui-transition);
    cursor: pointer;
}

.chirpui-tab:hover {
    border-bottom-color: var(--chirpui-border);
}

.chirpui-tab--active {
    border-bottom-color: var(--chirpui-accent);
    color: var(--chirpui-accent);
    font-weight: 600;
}

.chirpui-tab--disabled {
    opacity: 0.5;
    cursor: not-allowed;
    pointer-events: none;
}

/* ==========================================================================
   Accordion
   ========================================================================== */

.chirpui-accordion {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-xs);
}

.chirpui-accordion__item {
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    background: var(--chirpui-surface);
    overflow: hidden;
}

.chirpui-accordion__trigger {
    cursor: pointer;
    list-style: none;
    padding: var(--chirpui-spacing) var(--chirpui-spacing-md);
    font-weight: 600;
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
}

.chirpui-accordion__trigger::-webkit-details-marker {
    display: none;
}

.chirpui-accordion__trigger::marker {
    display: none;
}

.chirpui-accordion__trigger::before {
    content: "▸";
    font-size: 0.75em;
    transition: transform var(--chirpui-transition-slow) var(--chirpui-ease-spring);
}

.chirpui-accordion__item[open] .chirpui-accordion__trigger::before {
    transform: rotate(90deg);
}

.chirpui-accordion__trigger:hover {
    background: var(--chirpui-bg-subtle);
}

.chirpui-accordion__trigger-text {
    flex: 1;
}

.chirpui-accordion__trigger-actions {
    margin-inline-start: auto;
}

.chirpui-accordion__trigger-actions:empty {
    display: none;
}

.chirpui-accordion__content {
    padding: 0 var(--chirpui-spacing-md) var(--chirpui-spacing) var(--chirpui-spacing-md);
    padding-inline-start: calc(var(--chirpui-spacing-md) + 1em);
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text-muted);
}

.chirpui-accordion__item[open] .chirpui-accordion__content {
    animation: chirpui-accordion-content-in var(--chirpui-transition-slow) var(--chirpui-ease-spring);
}

@keyframes chirpui-accordion-content-in {
    from { opacity: 0; }
    to { opacity: 1; }
}

/* ==========================================================================
   Collapse
   ========================================================================== */

.chirpui-collapse {
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    background: var(--chirpui-surface);
    overflow: hidden;
}

.chirpui-collapse__trigger {
    cursor: pointer;
    list-style: none;
    padding: var(--chirpui-spacing) var(--chirpui-spacing-md);
    font-weight: 600;
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
}

.chirpui-collapse__trigger-text {
    flex: 1;
}

.chirpui-collapse__trigger-actions:empty {
    display: none;
}

.chirpui-collapse__trigger::-webkit-details-marker {
    display: none;
}

.chirpui-collapse__trigger::marker {
    display: none;
}

.chirpui-collapse__trigger::after {
    content: "\25B8";
    display: inline-block;
    transition: rotate var(--chirpui-transition);
    margin-inline-start: auto;
    font-size: 0.75em;
    color: var(--chirpui-text-muted);
}

.chirpui-collapse[open] > .chirpui-collapse__trigger::after {
    rotate: 90deg;
}

.chirpui-collapse__trigger:hover {
    background: var(--chirpui-bg-subtle);
}

.chirpui-collapse__content {
    padding: var(--chirpui-spacing) var(--chirpui-spacing-md);
    border-top: 1px solid var(--chirpui-border);
    font-size: var(--chirpui-font-sm);
}

.chirpui-collapse[open] .chirpui-collapse__content {
    animation: chirpui-accordion-content-in var(--chirpui-transition-slow) var(--chirpui-ease-spring);
}

/* ==========================================================================
   Dropdown
   ========================================================================== */

.chirpui-dropdown {
    position: relative;
    display: inline-block;
}

.chirpui-dropdown__trigger {
    cursor: pointer;
    list-style: none;
}

.chirpui-dropdown__header:empty,
.chirpui-dropdown__footer:empty {
    display: none;
}

.chirpui-dropdown__menu {
    position: absolute;
    left: 0;
    z-index: 10;
    min-width: 10rem;
    overflow-x: hidden;
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    background: var(--chirpui-surface);
    box-shadow: var(--chirpui-elevation-floating);
    padding: var(--chirpui-spacing-xs) 0;
    margin-top: var(--chirpui-spacing-xs);
}

.chirpui-dropdown__menu a,
.chirpui-dropdown__menu button {
    display: block;
    box-sizing: border-box;
    width: 100%;
    min-width: 0;
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing);
    text-decoration: none;
    color: inherit;
    text-align: left;
    background: none;
    border: none;
    cursor: pointer;
    font-size: var(--chirpui-font-sm);
}

.chirpui-dropdown__menu a:hover,
.chirpui-dropdown__menu button:hover {
    background: var(--chirpui-bg-subtle);
}

.chirpui-dropdown__menu a:focus-visible,
.chirpui-dropdown__menu button:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-dropdown__menu a[aria-disabled],
.chirpui-dropdown__menu button:disabled {
    color: var(--chirpui-text-muted);
    cursor: default;
    pointer-events: none;
}

/* Split button */
.chirpui-split-btn {
    display: inline-flex;
}

.chirpui-split-btn__primary {
    border-top-right-radius: 0;
    border-bottom-right-radius: 0;
    margin-right: -1px;
}

.chirpui-split-btn__dropdown {
    position: relative;
    display: inline-block;
}

.chirpui-split-btn__trigger {
    display: flex;
    align-items: center;
    justify-content: center;
    min-width: 2rem;
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    border: 1px solid var(--chirpui-border);
    border-radius: 0 var(--chirpui-radius-sm) var(--chirpui-radius-sm) 0;
    background: var(--chirpui-surface);
    color: var(--chirpui-text);
    cursor: pointer;
    font-size: 0.75rem;
    list-style: none;
    transition: background var(--chirpui-transition), border-color var(--chirpui-transition),
        box-shadow var(--chirpui-transition);
}

.chirpui-split-btn__trigger::-webkit-details-marker {
    display: none;
}

.chirpui-split-btn__primary:hover + .chirpui-split-btn__dropdown .chirpui-split-btn__trigger,
.chirpui-split-btn__trigger:hover {
    background: var(--chirpui-bg-subtle);
}

.chirpui-split-btn__primary.chirpui-btn--primary {
    border-color: var(--chirpui-accent);
}

.chirpui-split-btn__primary.chirpui-btn--primary + .chirpui-split-btn__dropdown .chirpui-split-btn__trigger {
    border-color: var(--chirpui-accent);
    background: var(--chirpui-accent);
    color: white;
}

.chirpui-split-btn__menu-header:empty,
.chirpui-split-btn__menu-footer:empty {
    display: none;
}

.chirpui-split-btn__menu {
    position: absolute;
    right: 0;
    top: 100%;
    margin-top: var(--chirpui-spacing-xs);
    min-width: 10rem;
    padding: var(--chirpui-spacing-xs);
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    box-shadow: var(--chirpui-elevation-floating);
    z-index: 20;
}

.chirpui-split-btn__menu a,
.chirpui-split-btn__menu button {
    display: block;
    width: 100%;
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    text-align: left;
    text-decoration: none;
    color: inherit;
    background: none;
    border: none;
    font: inherit;
    cursor: pointer;
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-split-btn__menu a:hover,
.chirpui-split-btn__menu button:hover {
    background: var(--chirpui-bg-subtle);
}

/* Popover */
.chirpui-popover {
    position: relative;
    display: inline-block;
}

.chirpui-popover__trigger {
    cursor: pointer;
    list-style: none;
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    background: var(--chirpui-surface);
    transition: background var(--chirpui-transition), border-color var(--chirpui-transition),
        box-shadow var(--chirpui-transition);
}

.chirpui-popover__trigger::-webkit-details-marker {
    display: none;
}

.chirpui-popover__trigger:hover {
    background: var(--chirpui-state-surface-hover);
    border-color: var(--chirpui-state-border-hover);
}

.chirpui-popover__header:empty,
.chirpui-popover__footer:empty {
    display: none;
}

.chirpui-popover__panel {
    position: absolute;
    left: 0;
    top: 100%;
    margin-top: var(--chirpui-spacing-xs);
    min-width: 12rem;
    padding: var(--chirpui-spacing);
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    box-shadow: var(--chirpui-elevation-overlay);
    z-index: 20;
}

/* Tag input */
.chirpui-tag-input {
    margin-bottom: var(--chirpui-spacing);
}

.chirpui-tag-input__label {
    display: block;
    margin-bottom: var(--chirpui-spacing-xs);
}

.chirpui-tag-input__chips {
    display: flex;
    flex-wrap: wrap;
    gap: var(--chirpui-spacing-sm);
    align-items: center;
}

.chirpui-tag {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-sm);
    background: var(--chirpui-bg-subtle);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
    font-size: var(--chirpui-font-sm);
    font-family: var(--chirpui-ui-font-family);
    font-weight: var(--chirpui-ui-font-weight-medium);
    line-height: 1.4;
    transition: background var(--chirpui-transition), border-color var(--chirpui-transition),
        color var(--chirpui-transition), box-shadow var(--chirpui-transition);
}

a.chirpui-tag {
    text-decoration: none;
    color: var(--chirpui-accent);
    border-color: color-mix(in srgb, var(--chirpui-accent) 30%, var(--chirpui-border));
    cursor: pointer;
}

a.chirpui-tag:hover {
    color: var(--chirpui-accent-hover);
    border-color: color-mix(in srgb, var(--chirpui-accent) 50%, var(--chirpui-border));
    background: color-mix(in srgb, var(--chirpui-accent) 8%, var(--chirpui-bg-subtle));
}

a.chirpui-tag:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

a.chirpui-tag:active {
    background: color-mix(in srgb, var(--chirpui-accent) 15%, var(--chirpui-bg-subtle));
}

.chirpui-tag__remove {
    display: inline;
    margin: 0;
    padding: 0;
}

.chirpui-tag__remove-btn {
    background: none;
    border: none;
    padding: 0.125rem;
    margin: 0;
    cursor: pointer;
    font-size: 1rem;
    line-height: 1;
    color: var(--chirpui-text-muted);
    border-radius: var(--chirpui-radius-sm);
    transition: color var(--chirpui-transition), background var(--chirpui-transition);
}

.chirpui-tag__remove-btn:hover {
    color: var(--chirpui-error);
    background: var(--chirpui-error-muted);
}

.chirpui-tag__remove-btn:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: 1px;
}

.chirpui-tag__remove-btn:active {
    color: white;
    background: var(--chirpui-error);
}

.chirpui-tag-input__add {
    display: inline-flex;
    gap: var(--chirpui-spacing-sm);
    align-items: center;
}

.chirpui-tag-input__add-field {
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-sm);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    font: inherit;
    min-width: 8rem;
    background: var(--chirpui-surface);
    color: var(--chirpui-text);
    transition: border-color var(--chirpui-transition), box-shadow var(--chirpui-transition);
}

.chirpui-tag-input__add-field:focus {
    border-color: var(--chirpui-accent);
    box-shadow: 0 0 0 3px var(--chirpui-focus-ring);
    outline: none;
}

.chirpui-tag-input__add-field:disabled,
.chirpui-tag-input__add-field[readonly] {
    background: var(--chirpui-bg-subtle);
    color: var(--chirpui-text-muted);
    cursor: not-allowed;
    border-color: var(--chirpui-border);
}

.chirpui-tag-input__add-field[readonly] {
    cursor: default;
    opacity: 1;
}

.chirpui-tag-input__add-field:disabled {
    opacity: 0.5;
}

/* Tree view */
.chirpui-tree {
    list-style: none;
    margin: 0;
    padding: 0;
}

.chirpui-tree__item {
    margin: 0;
}

.chirpui-tree__node {
    margin: 0;
}

.chirpui-tree__label {
    display: block;
    padding: var(--chirpui-spacing-xs) 0;
    cursor: default;
}

.chirpui-tree__label--leaf {
    padding-inline-start: var(--chirpui-spacing);
}

.chirpui-tree__node summary {
    cursor: pointer;
}

.chirpui-tree__node summary:hover {
    color: var(--chirpui-accent);
}

.chirpui-tree .chirpui-tree {
    padding-inline-start: var(--chirpui-spacing);
    border-inline-start: 1px solid var(--chirpui-border);
    margin-inline-start: var(--chirpui-spacing-sm);
}

/* Nav tree (docs sidebar, hierarchical nav) */
.chirpui-nav-tree {
    font-size: var(--chirpui-font-sm);
}

.chirpui-nav-tree__header {
    margin-bottom: var(--chirpui-spacing-sm);
}

.chirpui-nav-tree__header:empty {
    display: none;
}

.chirpui-nav-tree__list {
    list-style: none;
    margin: 0;
    padding: 0;
}

.chirpui-nav-tree__list--nested {
    padding-inline-start: var(--chirpui-spacing);
    border-inline-start: 1px solid var(--chirpui-border);
    margin-inline-start: var(--chirpui-spacing-sm);
}

.chirpui-nav-tree__item {
    margin: 0;
}

.chirpui-nav-tree__node {
    margin: 0;
}

.chirpui-nav-tree__label {
    display: block;
    cursor: pointer;
}

.chirpui-nav-tree__label summary {
    list-style: none;
}

.chirpui-nav-tree__label summary::-webkit-details-marker {
    display: none;
}

.chirpui-nav-tree__link {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
    padding: var(--chirpui-spacing-xs) 0;
    color: var(--chirpui-text);
    text-decoration: none;
}

.chirpui-nav-tree__link:hover {
    color: var(--chirpui-accent);
}

.chirpui-nav-tree__link:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-nav-tree__link--active {
    font-weight: 600;
    color: var(--chirpui-accent);
    background: color-mix(in srgb, var(--chirpui-accent) 10%, transparent);
}

.chirpui-nav-tree__link--leaf {
    padding-inline-start: var(--chirpui-spacing);
}

.chirpui-nav-tree__icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1.25em;
    color: var(--chirpui-text-muted);
    font-family: var(--chirpui-ascii-font);
}

.chirpui-nav-tree__link--active .chirpui-nav-tree__icon {
    color: currentColor;
}

.chirpui-nav-tree__title {
    min-width: 0;
}

.chirpui-nav-tree__text {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
    padding: var(--chirpui-spacing-xs) 0;
    color: var(--chirpui-text-muted);
}

.chirpui-nav-tree__text--leaf {
    padding-inline-start: var(--chirpui-spacing);
}

/* Calendar */
.chirpui-calendar {
    max-width: 24rem;
}

.chirpui-calendar__header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: var(--chirpui-spacing);
}

.chirpui-calendar__title {
    margin: 0;
    font-size: var(--chirpui-font-lg);
}

.chirpui-calendar__nav {
    display: flex;
    gap: var(--chirpui-spacing-sm);
}

.chirpui-calendar__nav-link {
    color: var(--chirpui-accent);
    text-decoration: none;
}

.chirpui-calendar__nav-link:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-calendar__nav-link:hover {
    text-decoration: underline;
}

.chirpui-calendar__weekdays {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: var(--chirpui-spacing-xs);
    font-size: var(--chirpui-font-xs);
    color: var(--chirpui-text-muted);
    margin-bottom: var(--chirpui-spacing-xs);
}

.chirpui-calendar__grid {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: var(--chirpui-spacing-xs);
}

.chirpui-calendar__day {
    aspect-ratio: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: flex-start;
    padding: var(--chirpui-spacing-xs);
    background: var(--chirpui-bg-subtle);
    border-radius: var(--chirpui-radius-sm);
    font-size: var(--chirpui-font-sm);
}

.chirpui-calendar__day--empty {
    background: transparent;
    visibility: hidden;
}

.chirpui-calendar__day-num {
    font-weight: 500;
}

.chirpui-calendar__event {
    font-size: var(--chirpui-font-xs);
    color: var(--chirpui-accent);
    text-decoration: none;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    max-width: 100%;
}

/* ==========================================================================
   Toast
   ========================================================================== */

.chirpui-toast-container {
    position: fixed;
    top: var(--chirpui-spacing);
    right: var(--chirpui-spacing);
    z-index: 50;
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-sm);
    max-width: var(--chirpui-toast-width);
}

.chirpui-toast {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    background: var(--chirpui-surface);
    font-size: var(--chirpui-font-sm);
    box-shadow: var(--chirpui-shadow-md);
    transition: opacity var(--chirpui-transition), transform var(--chirpui-transition);
    @starting-style {
        opacity: 0;
        transform: translateY(8px);
    }
}

.chirpui-toast--info    { border-color: var(--chirpui-alert-info-border); background: var(--chirpui-alert-info-bg); }
.chirpui-toast--success { border-color: var(--chirpui-alert-success-border); background: var(--chirpui-alert-success-bg); }
.chirpui-toast--warning { border-color: var(--chirpui-alert-warning-border); background: var(--chirpui-alert-warning-bg); }
.chirpui-toast--error   { border-color: var(--chirpui-alert-error-border); background: var(--chirpui-alert-error-bg); }

.chirpui-toast__close {
    background: none;
    border: none;
    font-size: 1.25rem;
    cursor: pointer;
    line-height: 1;
    margin-inline-start: var(--chirpui-spacing-sm);
    padding: 0;
}

.chirpui-toast__close:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

/* ==========================================================================
   Table
   ========================================================================== */

.chirpui-table-wrap {
    overflow-x: auto;
}

.chirpui-table-wrap--sticky .chirpui-table__head {
    position: sticky;
    top: 0;
    z-index: 1;
    background: var(--chirpui-surface);
}

.chirpui-table__th--actions,
.chirpui-table__td--actions {
    width: 1%;
    white-space: nowrap;
    text-align: right;
}

.chirpui-table__caption:empty {
    display: none;
}

.chirpui-table {
    width: 100%;
    border-collapse: collapse;
}

.chirpui-table__th,
.chirpui-table__td {
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    text-align: left;
    border-bottom: 1px solid var(--chirpui-border);
}

.chirpui-table__th {
    font-weight: 600;
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text-muted);
}

.chirpui-table__sort {
    background: none;
    border: none;
    padding: 0;
    font: inherit;
    color: inherit;
    cursor: pointer;
}

.chirpui-table__sort:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-table__sort:hover {
    text-decoration: underline;
}

.chirpui-table--striped .chirpui-table__row:nth-child(even) {
    background: var(--chirpui-bg-subtle);
}

.chirpui-table__avatar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.5rem;
    height: 1.5rem;
    margin-inline-end: var(--chirpui-spacing-xs);
    font-size: 0.75rem;
    background: var(--chirpui-bg-subtle);
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-table--compact .chirpui-table__th,
.chirpui-table--compact .chirpui-table__td {
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-sm);
    font-size: var(--chirpui-font-sm);
}

/* Per-column alignment utilities */
.chirpui-table__th--left,
.chirpui-table__td--left { text-align: left; }
.chirpui-table__th--center,
.chirpui-table__td--center { text-align: center; }
.chirpui-table__th--right,
.chirpui-table__td--right { text-align: right; }

/* Params table (API docs) */
.chirpui-params-table__title {
    margin: 0 0 var(--chirpui-spacing-sm);
    font-size: var(--chirpui-font-lg);
    font-weight: 600;
}

.chirpui-params-table__wrap {
    overflow-x: auto;
}

.chirpui-params-table__table {
    width: 100%;
    border-collapse: collapse;
    font-size: var(--chirpui-font-sm);
}

.chirpui-params-table__th,
.chirpui-params-table__td {
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    text-align: left;
    border-bottom: 1px solid var(--chirpui-border);
}

.chirpui-params-table__th {
    font-weight: 600;
    color: var(--chirpui-text-muted);
}

.chirpui-params-table__th--name,
.chirpui-params-table__td--name {
    min-width: 8rem;
}

.chirpui-params-table__th--type,
.chirpui-params-table__td--type {
    min-width: 6rem;
}

.chirpui-params-table__th--default,
.chirpui-params-table__td--default {
    min-width: 5rem;
}

.chirpui-params-table__code {
    font-family: ui-monospace, monospace;
    font-size: 0.9em;
    padding: 0.1em 0.3em;
    background: var(--chirpui-bg-subtle);
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-params-table__code--muted {
    color: var(--chirpui-text-muted);
}

.chirpui-params-table__empty {
    color: var(--chirpui-text-muted);
}

/* Signature (function/method signatures) */
.chirpui-signature {
    margin: 0 0 var(--chirpui-spacing);
    padding: var(--chirpui-spacing);
    overflow-x: auto;
    background: var(--chirpui-bg-subtle);
    border-radius: var(--chirpui-radius);
    font-size: var(--chirpui-font-sm);
}

.chirpui-signature__code {
    font-family: ui-monospace, monospace;
    white-space: pre;
}

/* Index card (listing cards) */
.chirpui-index-card {
    display: block;
    padding: var(--chirpui-spacing);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
    text-decoration: none;
    color: inherit;
    transition: border-color var(--chirpui-transition), box-shadow var(--chirpui-transition);
}

.chirpui-index-card:hover {
    border-color: var(--chirpui-card-hover-border);
    box-shadow: var(--chirpui-card-hover-shadow);
}

.chirpui-index-card:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-index-card:active {
    box-shadow: none;
    border-color: var(--chirpui-accent);
}

.chirpui-index-card__header {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
    margin-bottom: var(--chirpui-spacing-xs);
}

.chirpui-index-card__badge {
    flex-shrink: 0;
    padding: 0.15rem 0.4rem;
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-xs);
    font-weight: var(--chirpui-ui-font-weight-medium);
    font-weight: 600;
    text-transform: uppercase;
    background: var(--chirpui-bg-subtle);
    border-radius: var(--chirpui-radius-sm);
    color: var(--chirpui-text-muted);
}

.chirpui-index-card__title {
    font-weight: 600;
}

.chirpui-index-card__description {
    margin: 0;
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text-muted);
    line-height: var(--chirpui-line-height-normal);
}

.chirpui-selection-bar,
.chirpui-bulk-bar {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing);
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    background: var(--chirpui-bg-subtle);
    border-radius: var(--chirpui-radius);
    font-size: var(--chirpui-font-sm);
}

.chirpui-selection-bar__count,
.chirpui-bulk-bar__count {
    font-weight: 600;
    margin-inline-end: auto;
}

.chirpui-selection-bar__actions {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
    flex-wrap: wrap;
}

/* ==========================================================================
   Pagination
   ========================================================================== */

.chirpui-pagination {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
}

.chirpui-pagination__link {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 2rem;
    height: 2rem;
    padding: 0 var(--chirpui-spacing-xs);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    text-decoration: none;
    color: inherit;
    font-size: var(--chirpui-font-sm);
    transition: background var(--chirpui-transition);
}

.chirpui-pagination__link:hover:not(.chirpui-pagination__link--disabled):not(.chirpui-pagination__link--active) {
    background: var(--chirpui-bg-subtle);
}

.chirpui-pagination__link:focus-visible:not(.chirpui-pagination__link--disabled) {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-pagination__link--active {
    color: var(--chirpui-accent);
    font-weight: 600;
    background: color-mix(in srgb, var(--chirpui-accent) 10%, transparent);
}

.chirpui-pagination__link--disabled {
    opacity: 0.4;
    cursor: default;
    pointer-events: none;
}

.chirpui-pagination__ellipsis {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 2rem;
    height: 2rem;
    color: var(--chirpui-text-muted);
}

/* ==========================================================================
   Alert
   ========================================================================== */

.chirpui-alert {
    display: flex;
    align-items: flex-start;
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-alert--info    { border-color: var(--chirpui-alert-info-border); background: var(--chirpui-alert-info-bg); }
.chirpui-alert--success { border-color: var(--chirpui-alert-success-border); background: var(--chirpui-alert-success-bg); }
.chirpui-alert--warning { border-color: var(--chirpui-alert-warning-border); background: var(--chirpui-alert-warning-bg); }
.chirpui-alert--error   { border-color: var(--chirpui-alert-error-border); background: var(--chirpui-alert-error-bg); }

.chirpui-alert__icon {
    font-size: 1em;
    line-height: 1;
    flex-shrink: 0;
    margin-inline-end: var(--chirpui-spacing-sm);
}

.chirpui-alert__body {
    flex: 1;
}

.chirpui-alert__title {
    font-weight: 600;
    margin-bottom: var(--chirpui-spacing-xs);
}

.chirpui-alert__actions {
    margin-top: var(--chirpui-spacing-sm);
}

.chirpui-alert__actions:empty {
    display: none;
}

.chirpui-alert__close {
    background: none;
    border: none;
    font-size: 1.25rem;
    cursor: pointer;
    line-height: 1;
    margin-inline-start: var(--chirpui-spacing-sm);
    padding: 0;
}

.chirpui-alert__close:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

/* Collapsible alert (details/summary) */
.chirpui-alert[role="alert"] summary {
    cursor: pointer;
    list-style: none;
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
}
.chirpui-alert[role="alert"] summary::-webkit-details-marker {
    display: none;
}

.chirpui-mt-sm { margin-top: var(--chirpui-spacing-sm); }
.chirpui-mt-md { margin-top: var(--chirpui-spacing-md); }
.chirpui-mb-md { margin-bottom: var(--chirpui-spacing-md); }

.chirpui-result-slot {
    margin-top: var(--chirpui-space-result-gap);
}

.chirpui-result-slot:empty {
    margin-top: 0;
}

.chirpui-result-slot--sm {
    margin-top: var(--chirpui-space-control-gap);
}

.chirpui-result-slot--sm:empty {
    margin-top: 0;
}

/* ==========================================================================
   Route tabs — subsection navigation (route-backed, HTMX swap)
   ========================================================================== */

.chirpui-route-tabs {
    display: flex;
    flex-wrap: wrap;
    gap: var(--chirpui-spacing-sm);
    border-bottom: 1px solid var(--chirpui-border);
    padding-bottom: 0;
}
.chirpui-route-tab {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    color: var(--chirpui-text-muted);
    text-decoration: none;
    font-size: var(--chirpui-font-sm);
    font-weight: 500;
    border-radius: var(--chirpui-radius-sm) var(--chirpui-radius-sm) 0 0;
    border: 1px solid transparent;
    border-bottom: none;
    margin-bottom: -1px;
    background: transparent;
    transition: color var(--chirpui-transition), background var(--chirpui-transition),
        border-color var(--chirpui-transition);
}
.chirpui-route-tab:hover {
    color: var(--chirpui-text);
    background: var(--chirpui-surface-alt);
}
.chirpui-route-tab--active,
.chirpui-route-tab[aria-current="page"] {
    color: var(--chirpui-accent);
    background: var(--chirpui-primary-muted);
    border-color: var(--chirpui-border);
    border-bottom-color: var(--chirpui-bg);
    box-shadow: 0 -1px 0 0 var(--chirpui-accent);
}
.chirpui-route-tab__label {
    /* Inherits from parent; explicit for BEM consistency */
}
.chirpui-route-tab__icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1em;
    height: 1em;
    opacity: 0.85;
}
.chirpui-route-tab--active .chirpui-route-tab__icon,
.chirpui-route-tab[aria-current="page"] .chirpui-route-tab__icon {
    opacity: 1;
}
.chirpui-route-tab__badge {
    font-size: var(--chirpui-font-xs);
    padding: 0.125rem 0.375rem;
    background: var(--chirpui-surface-alt);
    border-radius: 9999px;
}

/* ==========================================================================
   Theme toggle
   ========================================================================== */

.chirpui-theme-toggle {
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-sm);
    min-width: 2rem;
}
.chirpui-theme-toggle__icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1em;
    height: 1em;
    font-size: 1.25rem;
    line-height: 1;
    opacity: 0.85;
    font-family: var(--chirpui-ascii-font);
}
.chirpui-theme-toggle:hover .chirpui-theme-toggle__icon {
    opacity: 1;
}

/* ==========================================================================
   Dropdown menu (items-based, JS-driven)
   ========================================================================== */

.chirpui-dropdown__trigger[data-chirpui-dropdown-trigger] {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
}
.chirpui-dropdown__menu[hidden] {
    display: none;
}
.chirpui-dropdown__menu:not([hidden]) {
    display: block;
}
.chirpui-dropdown__item {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
    width: 100%;
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    border: none;
    background: none;
    color: var(--chirpui-text);
    font: inherit;
    text-align: left;
    cursor: pointer;
    border-radius: var(--chirpui-radius-sm);
    text-decoration: none;
}
.chirpui-dropdown__item:hover,
.chirpui-dropdown__item:focus {
    background: var(--chirpui-muted-bg);
}
.chirpui-dropdown__item--danger {
    color: var(--chirpui-error);
}
.chirpui-dropdown__item--danger:hover {
    background: var(--chirpui-error-muted);
}
.chirpui-dropdown__divider {
    height: 1px;
    background: var(--chirpui-border);
    margin: var(--chirpui-spacing-xs) 0;
}
.chirpui-dropdown__icon {
    opacity: 0.8;
}
.chirpui-dropdown__caret {
    font-size: 0.7em;
    opacity: 0.7;
}
.chirpui-dropdown--split {
    display: inline-flex;
}
.chirpui-dropdown__split-primary {
    border-top-right-radius: 0;
    border-bottom-right-radius: 0;
}
.chirpui-dropdown__trigger--split {
    border: 1px solid var(--chirpui-primary);
    background: var(--chirpui-primary);
    color: white;
    padding: 0.25rem 0.5rem;
    border-top-right-radius: var(--chirpui-radius-sm);
    border-bottom-right-radius: var(--chirpui-radius-sm);
    border-left: none;
}
.chirpui-dropdown__trigger--split:hover {
    background: var(--chirpui-accent-hover);
    border-color: var(--chirpui-accent-hover);
}
.chirpui-dropdown__trigger--select {
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
    background: var(--chirpui-surface);
}
.chirpui-dropdown__item--selected {
    background: var(--chirpui-primary-muted);
}

/* ==========================================================================
   Tray (slide-out panel)
   ========================================================================== */

.chirpui-tray {
    position: fixed;
    inset: 0;
    z-index: 1100;
}
.chirpui-tray--closed {
    pointer-events: none;
}
.chirpui-tray--closed .chirpui-tray__backdrop {
    opacity: 0;
}
.chirpui-tray--open .chirpui-tray__backdrop {
    opacity: 1;
}
.chirpui-tray--open {
    pointer-events: auto;
}
.chirpui-tray__backdrop {
    position: absolute;
    inset: 0;
    background: var(--chirpui-smoke-bg);
    transition: opacity var(--chirpui-transition);
}
.chirpui-tray__panel {
    position: absolute;
    top: 0;
    bottom: 0;
    width: min(90vw, 24rem);
    max-width: 24rem;
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    box-shadow: var(--chirpui-elevation-overlay);
    display: flex;
    flex-direction: column;
    transition: transform var(--chirpui-transition);
    overflow: hidden;
}
.chirpui-tray--right .chirpui-tray__panel {
    right: 0;
    transform: translateX(100%);
}
.chirpui-tray--right.chirpui-tray--open .chirpui-tray__panel {
    transform: translateX(0);
}
.chirpui-tray--left .chirpui-tray__panel {
    left: 0;
    transform: translateX(-100%);
}
.chirpui-tray--left.chirpui-tray--open .chirpui-tray__panel {
    transform: translateX(0);
}
.chirpui-tray--bottom .chirpui-tray__panel {
    left: 0;
    right: 0;
    top: auto;
    width: 100%;
    max-width: none;
    max-height: 70vh;
    transform: translateY(100%);
}
.chirpui-tray--bottom.chirpui-tray--open .chirpui-tray__panel {
    transform: translateY(0);
}
.chirpui-tray__header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: var(--chirpui-spacing) var(--chirpui-spacing);
    border-bottom: 1px solid var(--chirpui-border);
    flex-shrink: 0;
}
.chirpui-tray__title {
    margin: 0;
    font-size: 1rem;
    font-weight: 600;
}
.chirpui-tray__close {
    background: none;
    border: none;
    font-size: 1.5rem;
    line-height: 1;
    cursor: pointer;
    color: var(--chirpui-text-muted);
    padding: 0.25rem;
}
.chirpui-tray__close:hover {
    color: var(--chirpui-text);
}
.chirpui-tray__body {
    flex: 1;
    overflow-y: auto;
    padding: var(--chirpui-spacing);
}

/* ==========================================================================
   Modal overlay (div-based, for modal_overlay component)
   ========================================================================== */

.chirpui-modal[data-modal-id] {
    position: fixed;
    inset: 0;
    z-index: 1200;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--chirpui-spacing);
}
.chirpui-modal[data-modal-id].chirpui-modal--closed {
    pointer-events: none;
}
.chirpui-modal[data-modal-id].chirpui-modal--closed .chirpui-modal__backdrop {
    opacity: 0;
}
.chirpui-modal[data-modal-id].chirpui-modal--open .chirpui-modal__backdrop {
    opacity: 1;
}
.chirpui-modal[data-modal-id].chirpui-modal--open {
    pointer-events: auto;
}
.chirpui-modal[data-modal-id] .chirpui-modal__backdrop {
    position: absolute;
    inset: 0;
    background: var(--chirpui-smoke-bg);
    transition: opacity var(--chirpui-transition);
}
.chirpui-modal[data-modal-id] .chirpui-modal__panel {
    position: relative;
    width: 100%;
    max-width: 28rem;
    max-height: 90vh;
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
    box-shadow: var(--chirpui-elevation-overlay);
    display: flex;
    flex-direction: column;
    overflow: hidden;
    transition: transform var(--chirpui-transition);
}
.chirpui-modal[data-modal-id].chirpui-modal--closed .chirpui-modal__panel {
    transform: scale(0.95);
    opacity: 0;
}
.chirpui-modal[data-modal-id].chirpui-modal--open .chirpui-modal__panel {
    transform: scale(1);
    opacity: 1;
}

/* ==========================================================================
   Tabs panels (button-based)
   ========================================================================== */

.chirpui-tabs[data-chirpui-tabs] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--chirpui-spacing-xs);
    border-bottom: 1px solid var(--chirpui-border);
    margin-bottom: var(--chirpui-spacing);
}
.chirpui-tabs__tab {
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    background: none;
    border: none;
    border-bottom: 2px solid transparent;
    color: var(--chirpui-text-muted);
    font: inherit;
    cursor: pointer;
    margin-bottom: -1px;
}
.chirpui-tabs__tab:hover {
    color: var(--chirpui-text);
}
.chirpui-tabs__tab--active,
.chirpui-tabs__tab[aria-selected="true"] {
    color: var(--chirpui-accent);
    border-bottom-color: var(--chirpui-accent);
}
.chirpui-tab-panel[hidden] {
    display: none;
}

/* ==========================================================================
   data-theme support (for theme toggle)
   ========================================================================== */

[data-theme="light"] {
    color-scheme: light;
}
[data-theme="dark"] {
    color-scheme: dark;
}
@media (prefers-color-scheme: light) {
    [data-theme="system"] {
        color-scheme: light;
    }
}
@media (prefers-color-scheme: dark) {
    [data-theme="system"] {
        color-scheme: dark;
    }
}

/* ==========================================================================
   data-style support (artistic preset axis)
   ========================================================================== */

[data-style="default"] {
    --chirpui-neu-surface: var(--chirpui-surface);
}

[data-style="neumorphic"] {
    --chirpui-neu-surface: color-mix(in srgb, var(--chirpui-bg-subtle) 88%, var(--chirpui-surface));
    --chirpui-neu-surface-alt: color-mix(in srgb, var(--chirpui-neu-surface) 82%, var(--chirpui-bg));
    --chirpui-neu-raised-sm:
        -4px -4px 10px color-mix(in srgb, white 78%, transparent),
        5px 5px 11px color-mix(in srgb, black 14%, transparent);
    --chirpui-neu-raised-md:
        -6px -6px 14px color-mix(in srgb, white 76%, transparent),
        8px 8px 16px color-mix(in srgb, black 17%, transparent);
    --chirpui-neu-raised-lg:
        -8px -8px 18px color-mix(in srgb, white 74%, transparent),
        11px 11px 22px color-mix(in srgb, black 20%, transparent);
    --chirpui-neu-raised:
        var(--chirpui-neu-raised-md);
    --chirpui-neu-inset:
        inset -2px -2px 4px color-mix(in srgb, white 74%, transparent),
        inset 3px 3px 7px color-mix(in srgb, black 15%, transparent);
    --chirpui-neu-pressed:
        inset -3px -3px 6px color-mix(in srgb, white 68%, transparent),
        inset 4px 4px 9px color-mix(in srgb, black 22%, transparent);
    --chirpui-neu-highlight-border: color-mix(in srgb, white 72%, var(--chirpui-border));
    --chirpui-neu-lowlight-border: color-mix(in srgb, black 26%, var(--chirpui-border));
    --chirpui-neu-chamfer: color-mix(in srgb, white 55%, transparent);

    /* Semantic remap for broad component adoption */
    --chirpui-elevation-1: var(--chirpui-neu-raised-sm);
    --chirpui-elevation-2: var(--chirpui-neu-raised-md);
    --chirpui-elevation-3: var(--chirpui-neu-raised-lg);
    --chirpui-elevation-4: var(--chirpui-neu-raised-lg);
    --chirpui-elevation-card-rest: var(--chirpui-neu-raised-sm);
    --chirpui-elevation-card-hover: var(--chirpui-neu-raised-md);
    --chirpui-elevation-floating: var(--chirpui-neu-raised-md);
    --chirpui-elevation-overlay: var(--chirpui-neu-raised-lg);
    --chirpui-elevation-topbar: var(--chirpui-neu-raised-sm);

    --chirpui-state-surface-hover: color-mix(in srgb, var(--chirpui-neu-surface) 90%, var(--chirpui-bg));
    --chirpui-state-surface-active: color-mix(in srgb, var(--chirpui-neu-surface) 82%, var(--chirpui-bg));
    --chirpui-state-border-hover: var(--chirpui-neu-lowlight-border);
    --chirpui-state-border-active: var(--chirpui-neu-lowlight-border);
}

[data-theme="dark"][data-style="neumorphic"] {
    --chirpui-neu-surface: color-mix(in srgb, var(--chirpui-surface) 88%, var(--chirpui-bg-subtle));
    --chirpui-neu-surface-alt: color-mix(in srgb, var(--chirpui-neu-surface) 76%, var(--chirpui-bg));
    --chirpui-neu-raised-sm:
        -3px -3px 8px color-mix(in srgb, white 12%, transparent),
        5px 5px 11px color-mix(in srgb, black 46%, transparent);
    --chirpui-neu-raised-md:
        -5px -5px 11px color-mix(in srgb, white 14%, transparent),
        7px 7px 15px color-mix(in srgb, black 50%, transparent);
    --chirpui-neu-raised-lg:
        -7px -7px 15px color-mix(in srgb, white 16%, transparent),
        10px 10px 20px color-mix(in srgb, black 56%, transparent);
    --chirpui-neu-raised:
        var(--chirpui-neu-raised-md);
    --chirpui-neu-inset:
        inset -2px -2px 5px color-mix(in srgb, white 14%, transparent),
        inset 3px 3px 8px color-mix(in srgb, black 52%, transparent);
    --chirpui-neu-pressed:
        inset -3px -3px 7px color-mix(in srgb, white 11%, transparent),
        inset 4px 4px 10px color-mix(in srgb, black 58%, transparent);
    --chirpui-neu-highlight-border: color-mix(in srgb, white 14%, var(--chirpui-border));
    --chirpui-neu-lowlight-border: color-mix(in srgb, black 36%, var(--chirpui-border));
    --chirpui-state-surface-hover: color-mix(in srgb, var(--chirpui-neu-surface) 92%, var(--chirpui-bg));
    --chirpui-state-surface-active: color-mix(in srgb, var(--chirpui-neu-surface) 84%, var(--chirpui-bg));
}

/* Foundations and layout containers */
[data-style="neumorphic"] .chirpui-surface:not(.chirpui-surface--accent):not(
        .chirpui-surface--gradient-subtle
    ):not(.chirpui-surface--gradient-accent):not(.chirpui-surface--gradient-border):not(
        .chirpui-surface--gradient-mesh
    ):not(.chirpui-surface--glass):not(.chirpui-surface--frosted):not(.chirpui-surface--smoke),
[data-style="neumorphic"] .chirpui-card:not(.chirpui-card--glass):not(.chirpui-card--gradient-border),
[data-style="neumorphic"] .chirpui-app-shell__topbar,
[data-style="neumorphic"] .chirpui-app-shell__sidebar,
[data-style="neumorphic"] .chirpui-app-shell__main,
[data-style="neumorphic"] .chirpui-dropdown__menu,
[data-style="neumorphic"] .chirpui-popover__panel,
[data-style="neumorphic"] .chirpui-tray[data-tray-id] .chirpui-tray__panel,
[data-style="neumorphic"] .chirpui-modal[data-modal-id] .chirpui-modal__panel,
[data-style="neumorphic"] .chirpui-tooltip__bubble {
    background: linear-gradient(
        145deg,
        color-mix(in srgb, white 30%, var(--chirpui-neu-surface)),
        var(--chirpui-neu-surface-alt)
    );
    border: 1px solid var(--chirpui-neu-highlight-border);
    border-bottom-color: var(--chirpui-neu-lowlight-border);
    border-right-color: var(--chirpui-neu-lowlight-border);
    box-shadow: var(--chirpui-neu-raised);
}

[data-style="neumorphic"] .chirpui-tooltip__bubble::after {
    background: linear-gradient(
        145deg,
        color-mix(in srgb, white 30%, var(--chirpui-neu-surface)),
        var(--chirpui-neu-surface-alt)
    );
}

[data-style="neumorphic"] .chirpui-stat {
    background: linear-gradient(
        145deg,
        color-mix(in srgb, white 24%, var(--chirpui-neu-surface)),
        var(--chirpui-neu-surface-alt)
    );
    border: 0;
    box-shadow: var(--chirpui-neu-raised-sm);
}

[data-style="neumorphic"] .chirpui-app-shell__main {
    background: color-mix(in srgb, var(--chirpui-neu-surface-alt) 80%, var(--chirpui-bg));
}

[data-style="neumorphic"] :is(.chirpui-app-shell__sidebar, .chirpui-sidebar) {
    border-right-color: transparent;
}

[data-style="neumorphic"] .chirpui-app-shell__topbar {
    border-bottom-color: transparent;
}

[data-style="neumorphic"] .chirpui-card :is(.chirpui-card__header, .chirpui-card__footer, .chirpui-card__footer-wrap) {
    border-color: color-mix(in srgb, var(--chirpui-neu-lowlight-border) 40%, transparent);
}

[data-style="neumorphic"] .chirpui-app-shell__main {
    padding: calc(var(--chirpui-spacing-lg) + var(--chirpui-spacing-xs));
}

[data-style="neumorphic"] .chirpui-sidebar__section {
    padding: var(--chirpui-spacing) var(--chirpui-spacing);
}

[data-style="neumorphic"] .chirpui-sidebar__link {
    padding-inline: var(--chirpui-spacing);
    margin-inline-start: var(--chirpui-spacing);
    border-radius: var(--chirpui-radius-sm);
}

[data-theme="dark"][data-style="neumorphic"] :is(
        .chirpui-surface:not(.chirpui-surface--accent):not(.chirpui-surface--gradient-subtle):not(
                .chirpui-surface--gradient-accent
            ):not(.chirpui-surface--gradient-border):not(.chirpui-surface--gradient-mesh):not(
                .chirpui-surface--glass
            ):not(.chirpui-surface--frosted):not(.chirpui-surface--smoke),
        .chirpui-card:not(.chirpui-card--glass):not(.chirpui-card--gradient-border),
        .chirpui-app-shell__topbar,
        .chirpui-app-shell__sidebar,
        .chirpui-app-shell__main,
        .chirpui-dropdown__menu,
        .chirpui-popover__panel,
        .chirpui-tray[data-tray-id] .chirpui-tray__panel,
        .chirpui-modal[data-modal-id] .chirpui-modal__panel,
        .chirpui-tooltip__bubble
    ) {
    background: linear-gradient(
        145deg,
        color-mix(in srgb, white 10%, var(--chirpui-neu-surface)),
        var(--chirpui-neu-surface-alt)
    );
}

[data-theme="dark"][data-style="neumorphic"] .chirpui-tooltip__bubble::after {
    background: linear-gradient(
        145deg,
        color-mix(in srgb, white 10%, var(--chirpui-neu-surface)),
        var(--chirpui-neu-surface-alt)
    );
}

[data-theme="dark"][data-style="neumorphic"] .chirpui-stat {
    background: linear-gradient(
        145deg,
        color-mix(in srgb, white 8%, var(--chirpui-neu-surface)),
        var(--chirpui-neu-surface-alt)
    );
}

/* Depth budget: avoid stacked raised shadows in nested containers */
[data-style="neumorphic"] :is(.chirpui-card, .chirpui-surface, .chirpui-stat) > :is(
        .chirpui-card,
        .chirpui-surface,
        .chirpui-stat
    ) {
    box-shadow: var(--chirpui-neu-inset);
    background: color-mix(in srgb, var(--chirpui-neu-surface-alt) 88%, var(--chirpui-bg));
    border-color: var(--chirpui-neu-lowlight-border);
}

[data-style="neumorphic"] .chirpui-card :is(.chirpui-card__footer, .chirpui-card__footer-wrap) {
    background: transparent;
}

[data-style="neumorphic"] .chirpui-card__body {
    background: transparent;
}

[data-style="neumorphic"] .chirpui-card__body :is(.chirpui-surface, .chirpui-card) {
    box-shadow: none;
    border-color: color-mix(in srgb, var(--chirpui-neu-lowlight-border) 45%, transparent);
    background: color-mix(in srgb, var(--chirpui-neu-surface-alt) 94%, var(--chirpui-bg));
}

[data-style="neumorphic"] .chirpui-card__body .chirpui-stat {
    background: transparent;
    box-shadow: none;
    border: 0;
    min-height: 100%;
    justify-content: center;
}

[data-style="neumorphic"] .chirpui-card .chirpui-surface {
    border-color: var(--chirpui-neu-lowlight-border);
}

[data-style="neumorphic"] .chirpui-card .chirpui-stat {
    border: 0;
}

[data-style="neumorphic"] .chirpui-card .chirpui-stat :is(.chirpui-card, .chirpui-surface, .chirpui-stat),
[data-style="neumorphic"] .chirpui-surface .chirpui-stat :is(.chirpui-card, .chirpui-surface, .chirpui-stat) {
    box-shadow: none;
}

[data-style="neumorphic"] .chirpui-card__body :is(
        textarea.chirpui-field__input,
        .chirpui-chat-input__field,
        .chirpui-tag-input__add-field
    ) {
    background: color-mix(in srgb, var(--chirpui-neu-surface-alt) 90%, var(--chirpui-bg));
    border-color: color-mix(in srgb, var(--chirpui-neu-lowlight-border) 50%, transparent);
    box-shadow: inset 0 1px 2px color-mix(in srgb, black 18%, transparent);
}

[data-theme="dark"][data-style="neumorphic"] .chirpui-card__body :is(
        textarea.chirpui-field__input,
        .chirpui-chat-input__field,
        .chirpui-tag-input__add-field
    ) {
    background: color-mix(in srgb, var(--chirpui-neu-surface-alt) 84%, var(--chirpui-bg));
    border-color: color-mix(in srgb, var(--chirpui-neu-lowlight-border) 55%, transparent);
}

/* Controls and interactive elements */
[data-style="neumorphic"] .chirpui-btn:not(.chirpui-btn--primary):not(.chirpui-btn--danger):not(.chirpui-btn--ghost),
[data-style="neumorphic"] .chirpui-field__input,
[data-style="neumorphic"] .chirpui-field__file,
[data-style="neumorphic"] .chirpui-segmented,
[data-style="neumorphic"] .chirpui-segmented__label,
[data-style="neumorphic"] .chirpui-tabs__tab,
[data-style="neumorphic"] .chirpui-sidebar__link,
[data-style="neumorphic"] .chirpui-sidebar-toggle,
[data-style="neumorphic"] .chirpui-popover__trigger,
[data-style="neumorphic"] .chirpui-split-btn__trigger,
[data-style="neumorphic"] .chirpui-tag {
    background: linear-gradient(
        145deg,
        color-mix(in srgb, white 24%, var(--chirpui-neu-surface)),
        var(--chirpui-neu-surface-alt)
    );
    border-color: var(--chirpui-neu-highlight-border);
    box-shadow: var(--chirpui-neu-raised-sm);
}

[data-theme="dark"][data-style="neumorphic"] :is(
        .chirpui-btn:not(.chirpui-btn--primary):not(.chirpui-btn--danger):not(.chirpui-btn--ghost),
        .chirpui-field__input,
        .chirpui-field__file,
        .chirpui-segmented,
        .chirpui-segmented__label,
        .chirpui-tabs__tab,
        .chirpui-sidebar__link,
        .chirpui-sidebar-toggle,
        .chirpui-popover__trigger,
        .chirpui-split-btn__trigger,
        .chirpui-tag
    ) {
    background: linear-gradient(
        145deg,
        color-mix(in srgb, white 8%, var(--chirpui-neu-surface)),
        color-mix(in srgb, var(--chirpui-neu-surface-alt) 92%, var(--chirpui-bg))
    );
}

[data-style="neumorphic"] .chirpui-btn--primary,
[data-style="neumorphic"] .chirpui-btn--danger,
[data-style="neumorphic"] .chirpui-split-btn__primary.chirpui-btn--primary
    + .chirpui-split-btn__dropdown
    .chirpui-split-btn__trigger {
    box-shadow:
        inset 0 1px 0 color-mix(in srgb, white 30%, transparent),
        0 8px 14px color-mix(in srgb, black 28%, transparent);
}

[data-style="neumorphic"] .chirpui-btn--ghost {
    box-shadow: none;
    background: transparent;
}

[data-style="neumorphic"] .chirpui-tabs__tab {
    border: 1px solid transparent;
    border-radius: var(--chirpui-radius-sm);
    margin-bottom: 0;
}

[data-style="neumorphic"] .chirpui-tabs__tab[aria-selected="true"],
[data-style="neumorphic"] .chirpui-tabs__tab--active {
    box-shadow: var(--chirpui-neu-pressed);
    border-color: var(--chirpui-neu-lowlight-border);
    border-bottom-color: var(--chirpui-neu-lowlight-border);
    color: var(--chirpui-accent);
}

[data-style="neumorphic"] .chirpui-btn:not(.chirpui-btn--primary):not(.chirpui-btn--danger):not(.chirpui-btn--ghost):hover:not(:disabled),
[data-style="neumorphic"] .chirpui-field__input:hover:not(:disabled):not([readonly]),
[data-style="neumorphic"] .chirpui-field__file:hover:not(:disabled):not([readonly]),
[data-style="neumorphic"] .chirpui-tabs__tab:hover,
[data-style="neumorphic"] .chirpui-sidebar__link:hover,
[data-style="neumorphic"] .chirpui-sidebar-toggle:hover,
[data-style="neumorphic"] .chirpui-popover__trigger:hover,
[data-style="neumorphic"] .chirpui-split-btn__trigger:hover,
[data-style="neumorphic"] .chirpui-tag:hover {
    border-color: var(--chirpui-neu-lowlight-border);
    box-shadow: var(--chirpui-neu-raised-md);
}

[data-style="neumorphic"] .chirpui-btn:not(.chirpui-btn--primary):not(.chirpui-btn--danger):active:not(:disabled),
[data-style="neumorphic"] .chirpui-btn:not(.chirpui-btn--primary):not(.chirpui-btn--danger)[aria-pressed="true"],
[data-style="neumorphic"] .chirpui-field__input:active:not(:disabled),
[data-style="neumorphic"] .chirpui-field__file:active:not(:disabled),
[data-style="neumorphic"] .chirpui-tabs__tab[aria-selected="true"],
[data-style="neumorphic"] .chirpui-sidebar__link[aria-current="page"],
[data-style="neumorphic"] .chirpui-sidebar__link--active,
[data-style="neumorphic"] .chirpui-sidebar-toggle:active,
[data-style="neumorphic"] .chirpui-popover__trigger:active,
[data-style="neumorphic"] .chirpui-split-btn__trigger:active,
[data-style="neumorphic"] a.chirpui-tag:active {
    box-shadow: var(--chirpui-neu-pressed);
}

[data-style="neumorphic"] :is(.chirpui-sidebar__link--active, .chirpui-sidebar__link[aria-current="page"]) {
    background: color-mix(in srgb, var(--chirpui-accent) 16%, var(--chirpui-neu-surface-alt));
    color: var(--chirpui-accent);
    border-color: color-mix(in srgb, var(--chirpui-accent) 42%, var(--chirpui-neu-lowlight-border));
}

[data-style="neumorphic"] :is(.chirpui-tabs__tab--active, .chirpui-tabs__tab[aria-selected="true"]) {
    background: color-mix(in srgb, var(--chirpui-accent) 12%, var(--chirpui-neu-surface-alt));
}

[data-style="neumorphic"] a.chirpui-tag {
    background: color-mix(in srgb, var(--chirpui-accent) 9%, var(--chirpui-neu-surface-alt));
    border-color: color-mix(in srgb, var(--chirpui-accent) 35%, var(--chirpui-neu-lowlight-border));
    color: var(--chirpui-accent);
}

[data-style="neumorphic"] a.chirpui-tag:hover {
    background: color-mix(in srgb, var(--chirpui-accent) 14%, var(--chirpui-neu-surface-alt));
    border-color: color-mix(in srgb, var(--chirpui-accent) 52%, var(--chirpui-neu-lowlight-border));
}

[data-style="neumorphic"] a.chirpui-tag:active {
    background: color-mix(in srgb, var(--chirpui-accent) 18%, var(--chirpui-neu-surface-alt));
}

[data-style="neumorphic"] .chirpui-toggle-wrap .chirpui-toggle__track {
    box-shadow: var(--chirpui-neu-inset);
    border: 1px solid var(--chirpui-neu-lowlight-border);
}

[data-style="neumorphic"] .chirpui-toggle-wrap:has(.chirpui-toggle:checked) .chirpui-toggle__track {
    box-shadow: var(--chirpui-neu-pressed);
}

/* Data-display depth cues */
[data-style="neumorphic"] .chirpui-progress__track,
[data-style="neumorphic"] .chirpui-bar-chart__track,
[data-style="neumorphic"] .chirpui-donut,
[data-style="neumorphic"] .chirpui-description-list {
    background: color-mix(in srgb, var(--chirpui-neu-surface) 80%, var(--chirpui-bg));
    border: 1px solid var(--chirpui-neu-lowlight-border);
    box-shadow: var(--chirpui-neu-inset);
}

[data-theme="dark"][data-style="neumorphic"] :is(
        .chirpui-progress__track,
        .chirpui-bar-chart__track,
        .chirpui-donut,
        .chirpui-description-list
    ) {
    border-color: color-mix(in srgb, var(--chirpui-neu-lowlight-border) 60%, transparent);
    box-shadow:
        inset -1px -1px 3px color-mix(in srgb, white 8%, transparent),
        inset 2px 2px 5px color-mix(in srgb, black 46%, transparent);
}

[data-style="neumorphic"] .chirpui-progress__fill,
[data-style="neumorphic"] .chirpui-bar-chart__bar {
    box-shadow:
        inset 0 1px 0 var(--chirpui-neu-chamfer),
        0 1px 1px color-mix(in srgb, black 20%, transparent);
}

[data-style="neumorphic"] .chirpui-btn:focus-visible,
[data-style="neumorphic"] .chirpui-field__input:focus-visible,
[data-style="neumorphic"] .chirpui-tabs__tab:focus-visible,
[data-style="neumorphic"] .chirpui-sidebar__link:focus-visible,
[data-style="neumorphic"] .chirpui-sidebar-toggle:focus-visible,
[data-style="neumorphic"] .chirpui-tag:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

@media (prefers-reduced-motion: reduce) {
    [data-style="neumorphic"] .chirpui-btn:hover:not(:disabled),
    [data-style="neumorphic"] .chirpui-btn:active:not(:disabled) {
        transform: none;
    }
}

/* ==========================================================================
   Form Fields
   ========================================================================== */

.chirpui-field {
    margin-bottom: var(--chirpui-spacing);
}

.chirpui-field__label {
    display: block;
    margin-bottom: var(--chirpui-spacing-xs);
    font-weight: 500;
    font-size: var(--chirpui-font-sm);
}

.chirpui-field__label--inline {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
    cursor: pointer;
}

.chirpui-field__required {
    color: var(--chirpui-alert-error-border);
}

.chirpui-field__input[type="checkbox"],
.chirpui-field__input[type="radio"] {
    accent-color: var(--chirpui-accent);
}

@supports (field-sizing: content) {
    textarea.chirpui-field__input {
        field-sizing: content;
        min-height: 3lh;
    }
}

.chirpui-field__input {
    display: block;
    width: 100%;
    padding: var(--chirpui-spacing-sm);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    font: inherit;
    background: var(--chirpui-surface);
    color: var(--chirpui-text);
    transition: border-color var(--chirpui-transition), box-shadow var(--chirpui-transition);
}

.chirpui-field__input:focus {
    outline: none;
    border-color: var(--chirpui-accent);
    box-shadow: 0 0 0 3px var(--chirpui-focus-ring);
}

.chirpui-field__input:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-field__input:disabled,
.chirpui-field__input[readonly] {
    background: var(--chirpui-bg-subtle);
    color: var(--chirpui-text-muted);
    cursor: not-allowed;
    border-color: var(--chirpui-border);
}

.chirpui-field__input[readonly] {
    cursor: default;
    opacity: 1;
}

.chirpui-field__input:disabled {
    opacity: 0.5;
}

.chirpui-field--error .chirpui-field__input {
    border-color: var(--chirpui-alert-error-border);
}

@keyframes chirpui-field-shake {
    0%, 100% { transform: translateX(0); }
    20% { transform: translateX(-4px); }
    40% { transform: translateX(4px); }
    60% { transform: translateX(-2px); }
    80% { transform: translateX(2px); }
}

@media (prefers-reduced-motion: no-preference) {
    .chirpui-field--error .chirpui-field__input {
        animation: chirpui-field-shake 0.4s ease-in-out;
    }
}

@supports selector(:user-invalid) {
    .chirpui-field__input:user-invalid {
        border-color: var(--chirpui-alert-error-border);
    }
    .chirpui-field__input:user-valid:not(:placeholder-shown) {
        border-color: var(--chirpui-alert-success-border);
    }
}

.chirpui-field__hint {
    display: block;
    margin-top: var(--chirpui-spacing-xs);
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text-muted);
}

.chirpui-field__error {
    display: block;
    margin-top: var(--chirpui-spacing-xs);
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-error);
}

.chirpui-field__checkbox {
    width: auto;
}

.chirpui-field--checkbox {
    margin-bottom: var(--chirpui-spacing-sm);
}

/* Radio group */
.chirpui-field--radio {
    border: none;
    padding: 0;
}

.chirpui-field--radio .chirpui-field__label {
    margin-bottom: var(--chirpui-spacing-sm);
}

.chirpui-field__radio-group {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-sm);
}

.chirpui-field--radio-horizontal .chirpui-field__radio-group {
    flex-direction: row;
    flex-wrap: wrap;
}

.chirpui-field__radio-option {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
    cursor: pointer;
}

.chirpui-field__radio-option .chirpui-field__input {
    width: auto;
    display: inline-block;
}

.chirpui-field__radio-label {
    font-weight: 400;
}

/* File input */
.chirpui-field__file {
    display: block;
    width: 100%;
    padding: var(--chirpui-spacing-sm);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    font: inherit;
    background: var(--chirpui-surface);
    color: var(--chirpui-text);
}

.chirpui-field__file::file-selector-button {
    margin-inline-end: var(--chirpui-spacing);
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-sm);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    background: var(--chirpui-surface-alt);
    color: var(--chirpui-text);
    font: inherit;
    cursor: pointer;
}

.chirpui-field__file::file-selector-button:hover {
    background: var(--chirpui-bg-subtle);
}

.chirpui-field--error .chirpui-field__file {
    border-color: var(--chirpui-alert-error-border);
}

/* Date input - inherit from chirpui-field__input */
input[type="date"].chirpui-field__input {
    min-height: 2.5rem;
}

/* Star rating — CSS-only interactive star picker
   Uses reverse DOM order + flex-direction: row-reverse so the ~ sibling
   selector fills all stars up to the hovered/checked one. */
.chirpui-star-rating {
    display: inline-flex;
    flex-direction: row-reverse;
    gap: 0.125rem;
    border: 0;
    padding: 0;
    margin: 0;
}

.chirpui-star-rating__input {
    position: absolute;
    opacity: 0;
    width: 0;
    height: 0;
    pointer-events: none;
}

.chirpui-star-rating__label {
    cursor: pointer;
    font-size: 1.5rem;
    line-height: 1;
    color: var(--chirpui-border);
    transition: color var(--chirpui-transition), transform var(--chirpui-transition);
    user-select: none;
}

.chirpui-star-rating__label:hover {
    transform: scale(1.15);
}

.chirpui-star-rating__input:checked ~ .chirpui-star-rating__label {
    color: var(--chirpui-warning);
}

.chirpui-star-rating:hover .chirpui-star-rating__label {
    color: var(--chirpui-border);
}

.chirpui-star-rating .chirpui-star-rating__label:hover,
.chirpui-star-rating .chirpui-star-rating__label:hover ~ .chirpui-star-rating__label {
    color: var(--chirpui-warning);
}

.chirpui-star-rating__input:focus-visible + .chirpui-star-rating__label {
    outline: 2px solid var(--chirpui-focus-ring);
    outline-offset: var(--chirpui-state-focus-offset);
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-star-rating--sm .chirpui-star-rating__label { font-size: 1.125rem; }
.chirpui-star-rating--lg .chirpui-star-rating__label { font-size: 2rem; }

/* Thumbs up/down — binary sentiment radio pair */
.chirpui-thumbs {
    display: inline-flex;
    gap: 0.5rem;
    border: 0;
    padding: 0;
    margin: 0;
}

.chirpui-thumbs__input {
    position: absolute;
    opacity: 0;
    width: 0;
    height: 0;
    pointer-events: none;
}

.chirpui-thumbs__label {
    cursor: pointer;
    font-size: 1.5rem;
    line-height: 1;
    filter: grayscale(1);
    opacity: 0.5;
    transition: filter var(--chirpui-transition), opacity var(--chirpui-transition), transform var(--chirpui-transition);
    user-select: none;
}

.chirpui-thumbs__label:hover {
    filter: grayscale(0);
    opacity: 0.8;
    transform: scale(1.15);
}

.chirpui-thumbs__input:checked + .chirpui-thumbs__label {
    filter: grayscale(0);
    opacity: 1;
    transform: scale(1.1);
}

.chirpui-thumbs__input:focus-visible + .chirpui-thumbs__label {
    outline: 2px solid var(--chirpui-focus-ring);
    outline-offset: var(--chirpui-state-focus-offset);
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-thumbs--sm .chirpui-thumbs__label { font-size: 1.125rem; }
.chirpui-thumbs--lg .chirpui-thumbs__label { font-size: 2rem; }

/* Segmented control — connected button-group radio selector */
.chirpui-segmented {
    display: inline-flex;
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
    overflow: hidden;
    background: var(--chirpui-bg);
}

.chirpui-segmented__input {
    position: absolute;
    opacity: 0;
    width: 0;
    height: 0;
    pointer-events: none;
}

.chirpui-segmented__label {
    cursor: pointer;
    padding: 0.375rem 0.875rem;
    font-size: var(--chirpui-prose-sm);
    line-height: 1.5;
    color: var(--chirpui-text);
    border-left: 1px solid var(--chirpui-border);
    transition: background var(--chirpui-transition), color var(--chirpui-transition);
    user-select: none;
    text-align: center;
}

.chirpui-segmented__label:first-of-type {
    border-left: 0;
}

.chirpui-segmented__label:hover {
    background: var(--chirpui-bg-subtle);
}

.chirpui-segmented__input:checked + .chirpui-segmented__label {
    background: var(--chirpui-accent);
    color: white;
    border-left-color: var(--chirpui-accent);
}

.chirpui-segmented__input:checked + .chirpui-segmented__label + .chirpui-segmented__input + .chirpui-segmented__label {
    border-left-color: var(--chirpui-accent);
}

.chirpui-segmented__input:focus-visible + .chirpui-segmented__label {
    outline: 2px solid var(--chirpui-focus-ring);
    outline-offset: -2px;
}

.chirpui-segmented--sm .chirpui-segmented__label {
    padding: 0.25rem 0.625rem;
    font-size: var(--chirpui-prose-xs);
}

/* Number scale — horizontal numbered radio row (NPS-style) */
.chirpui-number-scale {
    display: inline-flex;
    gap: 2px;
}

.chirpui-number-scale__input {
    position: absolute;
    opacity: 0;
    width: 0;
    height: 0;
    pointer-events: none;
}

.chirpui-number-scale__label {
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    min-width: 2.25rem;
    height: 2.25rem;
    font-size: var(--chirpui-prose-sm);
    font-weight: 500;
    color: var(--chirpui-muted);
    background: var(--chirpui-bg);
    border: 1px solid var(--chirpui-border);
    transition: background var(--chirpui-transition), color var(--chirpui-transition),
                border-color var(--chirpui-transition), transform var(--chirpui-transition);
    user-select: none;
}

.chirpui-number-scale__label:first-of-type {
    border-radius: var(--chirpui-radius) 0 0 var(--chirpui-radius);
}

.chirpui-number-scale__label:last-of-type {
    border-radius: 0 var(--chirpui-radius) var(--chirpui-radius) 0;
}

.chirpui-number-scale__label:hover {
    background: var(--chirpui-bg-subtle);
    color: var(--chirpui-text);
}

.chirpui-number-scale__input:checked + .chirpui-number-scale__label {
    background: var(--chirpui-accent);
    color: white;
    border-color: var(--chirpui-accent);
    transform: scale(1.08);
    z-index: 1;
}

.chirpui-number-scale__input:focus-visible + .chirpui-number-scale__label {
    outline: 2px solid var(--chirpui-focus-ring);
    outline-offset: var(--chirpui-state-focus-offset);
    z-index: 2;
}

.chirpui-number-scale__labels {
    display: flex;
    justify-content: space-between;
    margin-top: 0.25rem;
}

/* Sortable list — drag-to-reorder container.
   Alpine wiring (x-data, @dragstart, etc.) is left to the consumer;
   ChirpUI provides the visual structure and drag affordances. */
.chirpui-sortable {
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.chirpui-sortable__item {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.625rem 0.75rem;
    background: var(--chirpui-bg);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    cursor: grab;
    transition: box-shadow var(--chirpui-transition), opacity var(--chirpui-transition),
                border-color var(--chirpui-transition);
    user-select: none;
}

.chirpui-sortable__item:hover {
    box-shadow: var(--chirpui-shadow-sm);
}

.chirpui-sortable__item:active {
    cursor: grabbing;
}

.chirpui-sortable__item--dragging {
    opacity: 0.4;
}

.chirpui-sortable__item--over {
    border-top: 2px solid var(--chirpui-accent);
    padding-top: calc(0.625rem - 1px);
}

.chirpui-sortable__handle {
    flex-shrink: 0;
    color: var(--chirpui-muted);
    font-size: 1rem;
    line-height: 1;
    cursor: grab;
}

.chirpui-sortable__handle:active {
    cursor: grabbing;
}

.chirpui-sortable__content {
    flex: 1;
    min-width: 0;
}

.chirpui-sortable__remove {
    flex-shrink: 0;
    margin-left: auto;
    padding: 0.25rem 0.375rem;
    font-size: 1rem;
    line-height: 1;
    color: var(--chirpui-muted);
    background: none;
    border: 1px solid transparent;
    border-radius: var(--chirpui-radius-sm);
    cursor: pointer;
    transition: color var(--chirpui-transition), border-color var(--chirpui-transition);
}

.chirpui-sortable__remove:hover {
    color: var(--chirpui-error);
    border-color: var(--chirpui-error);
}

.chirpui-sortable__remove:focus-visible {
    outline: 2px solid var(--chirpui-focus-ring);
    outline-offset: var(--chirpui-state-focus-offset);
}

/* Fragment island — HTMX-safe mutation region */
.chirpui-fragment-island {
    /* No layout; just a wrapper for hx-disinherit */
}

/* DnD primitives — row and board variants */
.chirpui-dnd {
    display: flex;
    gap: var(--chirpui-spacing-xs);
}

.chirpui-dnd--row {
    flex-direction: column;
    gap: 2px;
}

.chirpui-dnd--board {
    flex-direction: row;
    gap: var(--chirpui-spacing-md);
    overflow-x: auto;
    padding-bottom: var(--chirpui-spacing-sm);
}

.chirpui-dnd__item {
    position: relative;
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.625rem 0.75rem;
    background: var(--chirpui-bg);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    cursor: grab;
    transition: transform var(--chirpui-dnd-transition),
                box-shadow var(--chirpui-dnd-transition),
                opacity var(--chirpui-dnd-drag-transition),
                border-color var(--chirpui-dnd-transition);
    user-select: none;
}

.chirpui-dnd__item:hover {
    box-shadow: var(--chirpui-shadow-sm);
}

.chirpui-dnd__item:active {
    cursor: grabbing;
}

.chirpui-dnd__item--dragging {
    opacity: var(--chirpui-dnd-drag-opacity);
    transform: scale(var(--chirpui-dnd-lift-scale))
               translateY(var(--chirpui-dnd-lift-offset-y));
    box-shadow: var(--chirpui-dnd-lift-shadow);
}

.chirpui-dnd__item--over {
    border-top: var(--chirpui-dnd-drop-indicator-width) solid
               var(--chirpui-dnd-drop-indicator-color);
    padding-top: calc(0.625rem - var(--chirpui-dnd-drop-indicator-width));
}

.chirpui-dnd__handle {
    flex-shrink: 0;
    color: var(--chirpui-muted);
    font-size: 1rem;
    line-height: 1;
    cursor: grab;
}

.chirpui-dnd__handle:active {
    cursor: grabbing;
}

.chirpui-dnd__handle:focus-visible {
    outline: 2px solid var(--chirpui-focus-ring);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-dnd__drop-indicator {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: var(--chirpui-dnd-drop-indicator-width);
    background: var(--chirpui-dnd-drop-indicator-color);
    border-radius: var(--chirpui-radius-sm);
    opacity: 0;
    transition: opacity var(--chirpui-dnd-transition);
    pointer-events: none;
}

.chirpui-dnd__item--over .chirpui-dnd__drop-indicator {
    opacity: 1;
}

.chirpui-dnd__column {
    flex-shrink: 0;
    width: min(18rem, 100%);
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-sm);
    padding: var(--chirpui-spacing);
    background: var(--chirpui-bg-subtle);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
}

.chirpui-dnd__column-header {
    font-weight: 600;
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text-muted);
}

.chirpui-dnd__column-body {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-sm);
    min-height: 4rem;
    border-radius: var(--chirpui-radius-sm);
    transition: background var(--chirpui-dnd-transition);
}

.chirpui-dnd__column-body--over {
    background: color-mix(in srgb, var(--chirpui-accent) 8%, transparent);
}

.chirpui-dnd__card {
    padding: var(--chirpui-spacing);
    background: var(--chirpui-bg);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    cursor: grab;
    transition: box-shadow var(--chirpui-dnd-transition),
                opacity var(--chirpui-dnd-drag-transition);
    user-select: none;
}

.chirpui-dnd__card:hover {
    box-shadow: var(--chirpui-shadow-sm);
}

.chirpui-dnd__card:active {
    cursor: grabbing;
}

.chirpui-dnd__card--dragging {
    opacity: var(--chirpui-dnd-drag-opacity);
    box-shadow: var(--chirpui-dnd-lift-shadow);
}

.chirpui-dnd__column-body--over .chirpui-dnd__card {
    border-color: var(--chirpui-dnd-drop-indicator-color);
}

/* Reduced motion */
@media (prefers-reduced-motion: reduce) {
    .chirpui-dnd__item,
    .chirpui-dnd__card {
        transition: none;
    }

    .chirpui-dnd__item--dragging {
        transform: none;
    }
}

/* Range slider */
.chirpui-field--range {
    margin-bottom: var(--chirpui-spacing);
}

.chirpui-field__range-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: var(--chirpui-spacing-xs);
}

.chirpui-field__range-value {
    font-size: var(--chirpui-font-sm);
    font-weight: 500;
    color: var(--chirpui-text-muted);
}

.chirpui-field__range {
    display: block;
    width: 100%;
    height: 0.5rem;
    accent-color: var(--chirpui-accent);
    cursor: pointer;
}

.chirpui-field__range:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-field--error .chirpui-field__range {
    accent-color: var(--chirpui-error);
}

/* Input group (prefix/suffix) */
.chirpui-input-group {
    display: flex;
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    overflow: hidden;
}

.chirpui-input-group__prefix,
.chirpui-input-group__suffix {
    display: flex;
    align-items: center;
    padding: var(--chirpui-spacing-sm);
    background: var(--chirpui-bg-subtle);
    color: var(--chirpui-text-muted);
    font-size: var(--chirpui-font-sm);
}

.chirpui-input-group__prefix:empty,
.chirpui-input-group__suffix:empty {
    display: none;
}

.chirpui-input-group__input {
    flex: 1;
    min-width: 0;
    border: none;
    padding: var(--chirpui-spacing-sm);
    font: inherit;
    background: var(--chirpui-surface);
    color: var(--chirpui-text);
}

.chirpui-input-group__input:focus {
    outline: none;
}

.chirpui-input-group__input:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: -2px;
}

.chirpui-input-group__input:disabled,
.chirpui-input-group__input[readonly] {
    background: var(--chirpui-bg-subtle);
    color: var(--chirpui-text-muted);
    cursor: not-allowed;
}

.chirpui-input-group__input[readonly] {
    cursor: default;
    opacity: 1;
}

.chirpui-input-group__input:disabled {
    opacity: 0.5;
}

.chirpui-field--error .chirpui-input-group {
    border-color: var(--chirpui-alert-error-border);
}

/* Search bar — input + optional button/icon. Input flexes; button stays compact. */
.chirpui-search-bar__inner {
    display: flex;
    align-items: stretch;
    gap: var(--chirpui-spacing-sm);
}

.chirpui-search-bar__input {
    flex: 1 1 auto;
    min-width: 0;
    padding: var(--chirpui-spacing-sm);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    font: inherit;
    background: var(--chirpui-surface);
    color: var(--chirpui-text);
    transition: border-color var(--chirpui-transition), box-shadow var(--chirpui-transition);
}

.chirpui-search-bar__input:focus {
    outline: none;
    border-color: var(--chirpui-accent);
    box-shadow: 0 0 0 3px var(--chirpui-focus-ring);
}

.chirpui-search-bar__input:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-search-bar--with-icon .chirpui-search-bar__inner {
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    overflow: hidden;
}

.chirpui-search-bar--with-icon .chirpui-search-bar__icon {
    display: flex;
    align-items: center;
    padding: 0 var(--chirpui-spacing-sm);
    background: var(--chirpui-bg-subtle);
    color: var(--chirpui-text-muted);
    font-size: var(--chirpui-font-sm);
}

.chirpui-search-bar--with-icon .chirpui-search-bar__input {
    border: none;
    border-radius: 0;
}

.chirpui-search-bar__btn {
    flex-shrink: 0;
    white-space: nowrap;
}

.chirpui-field--error .chirpui-search-bar__input {
    border-color: var(--chirpui-alert-error-border);
}

.chirpui-field--error.chirpui-search-bar--with-icon .chirpui-search-bar__inner {
    border-color: var(--chirpui-alert-error-border);
}

/* Multi-select */
.chirpui-field__input--multi {
    min-height: 8rem;
}

/* Toggle (switch-style checkbox) */
.chirpui-field--toggle {
    margin-bottom: var(--chirpui-spacing-sm);
}

.chirpui-toggle-wrap {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
    cursor: pointer;
}

.chirpui-toggle__track {
    display: inline-block;
    width: 2.5rem;
    height: 1.25rem;
    border-radius: 9999px;
    background: var(--chirpui-border);
    position: relative;
    flex-shrink: 0;
    transition: background var(--chirpui-transition);
}

.chirpui-toggle__track {
    transition: background var(--chirpui-transition), transform var(--chirpui-transition);
}

.chirpui-toggle__track::after {
    content: "";
    position: absolute;
    width: 1rem;
    height: 1rem;
    top: 0.125rem;
    left: 0.125rem;
    border-radius: 50%;
    background: var(--chirpui-surface);
    box-shadow: var(--chirpui-shadow-sm);
    transition: transform var(--chirpui-transition-slow) var(--chirpui-ease-spring);
}

.chirpui-toggle-wrap:has(.chirpui-toggle:checked) .chirpui-toggle__track {
    background: var(--chirpui-accent);
}

.chirpui-toggle-wrap:has(.chirpui-toggle:checked) .chirpui-toggle__track::after {
    transform: translateX(1.25rem);
}

.chirpui-toggle-wrap:has(.chirpui-toggle:active) .chirpui-toggle__track {
    transform: scale(0.98);
}

.chirpui-toggle-wrap:has(.chirpui-toggle:focus-visible) .chirpui-toggle__track {
    box-shadow: 0 0 0 2px var(--chirpui-focus-ring);
}

.chirpui-toggle-wrap:has(.chirpui-toggle:disabled) {
    opacity: 0.5;
    cursor: not-allowed;
}

.chirpui-toggle__label {
    font-size: var(--chirpui-font-sm);
}

/* Toggle: size variants */
.chirpui-toggle-wrap--sm .chirpui-toggle__track { width: 1.75rem; height: 0.875rem; }
.chirpui-toggle-wrap--sm .chirpui-toggle__track::after { width: 0.625rem; height: 0.625rem; }
.chirpui-toggle-wrap--sm:has(.chirpui-toggle:checked) .chirpui-toggle__track::after { transform: translateX(0.875rem); }
.chirpui-toggle-wrap--lg .chirpui-toggle__track { width: 3.25rem; height: 1.625rem; }
.chirpui-toggle-wrap--lg .chirpui-toggle__track::after { width: 1.375rem; height: 1.375rem; }
.chirpui-toggle-wrap--lg:has(.chirpui-toggle:checked) .chirpui-toggle__track::after { transform: translateX(1.625rem); }

/* Toggle: color variants */
.chirpui-toggle-wrap--success:has(.chirpui-toggle:checked) .chirpui-toggle__track { background: var(--chirpui-success); }
.chirpui-toggle-wrap--danger:has(.chirpui-toggle:checked) .chirpui-toggle__track { background: var(--chirpui-error); }
.chirpui-toggle-wrap--accent:has(.chirpui-toggle:checked) .chirpui-toggle__track { background: var(--chirpui-accent); }

/* Toggle: label inside track */
.chirpui-toggle__track-label {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    font-size: 0.5rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    pointer-events: none;
    transition: opacity var(--chirpui-motion-fast);
}
.chirpui-toggle__track-label--on { left: 0.35rem; color: white; opacity: 0; }
.chirpui-toggle__track-label--off { right: 0.35rem; color: var(--chirpui-text-muted); opacity: 1; }
.chirpui-toggle-wrap:has(.chirpui-toggle:checked) .chirpui-toggle__track-label--on { opacity: 1; }
.chirpui-toggle-wrap:has(.chirpui-toggle:checked) .chirpui-toggle__track-label--off { opacity: 0; }

.chirpui-form-actions {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
    margin-top: var(--chirpui-spacing);
}

.chirpui-form-actions--end {
    justify-content: flex-end;
}

.chirpui-key-value-form__row {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    gap: var(--chirpui-spacing-md);
}

.chirpui-key-value-form__key,
.chirpui-key-value-form__value {
    flex: 1;
    min-width: 10rem;
    margin-bottom: 0;
}

.chirpui-key-value-form__value {
    min-width: 12rem;
}

/* Match input and button heights for clean alignment */
.chirpui-key-value-form__row .chirpui-field__input {
    height: 2.25rem;
    box-sizing: border-box;
}

.chirpui-key-value-form__submit {
    flex-shrink: 0;
    display: flex;
    align-items: flex-end;
}

.chirpui-key-value-form__submit .chirpui-btn {
    height: 2.25rem;
    box-sizing: border-box;
}

@media (max-width: 40rem) {
    .chirpui-key-value-form__row {
        flex-direction: column;
        align-items: stretch;
    }
}

/* ==========================================================================
   Button
   ========================================================================== */

/* Explicit cursor for button/a — overrides browser default (cursor: default on button) */
button.chirpui-btn,
a.chirpui-btn {
    cursor: pointer;
}

.chirpui-btn {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--chirpui-spacing-xs);
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    font-size: var(--chirpui-font-sm);
    font-weight: 500;
    line-height: 1.25;
    text-decoration: none;
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
    background: var(--chirpui-surface);
    color: var(--chirpui-text);
    cursor: pointer;
    box-shadow: var(--chirpui-shadow-sm);
    transition: background var(--chirpui-transition), border-color var(--chirpui-transition),
        color var(--chirpui-transition), transform var(--chirpui-transition),
        box-shadow var(--chirpui-transition);
}

.chirpui-btn:hover:not(:disabled) {
    background: var(--chirpui-bg-subtle);
    border-color: var(--chirpui-border);
}

.chirpui-btn:active:not(:disabled) {
    background: var(--chirpui-border);
}

.chirpui-btn:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-btn:disabled {
    opacity: 0.5;
    cursor: not-allowed;
    pointer-events: none;
}

/* Primary variant */
.chirpui-btn--primary {
    background: var(--chirpui-accent);
    border-color: var(--chirpui-accent);
    color: white;
}

.chirpui-btn--primary:hover:not(:disabled) {
    background: var(--chirpui-accent-hover);
    border-color: var(--chirpui-accent-hover);
}

.chirpui-btn--primary:active:not(:disabled) {
    background: var(--chirpui-accent-hover);
    border-color: var(--chirpui-accent-hover);
}

/* Secondary variant */
.chirpui-btn--secondary {
    background: var(--chirpui-bg-subtle);
    border-color: var(--chirpui-border);
}

.chirpui-btn--secondary:hover:not(:disabled) {
    background: var(--chirpui-border);
}

.chirpui-btn--secondary:active:not(:disabled) {
    background: var(--chirpui-border);
}

/* Ghost variant — outline style, minimal fill */
.chirpui-btn--ghost {
    background: transparent;
    border-color: var(--chirpui-border);
    box-shadow: none;
    color: var(--chirpui-text);
}

.chirpui-btn--ghost:hover:not(:disabled) {
    background: var(--chirpui-bg-subtle);
    border-color: var(--chirpui-border);
}

.chirpui-btn--ghost:active:not(:disabled) {
    background: var(--chirpui-border);
}

/* Danger variant */
.chirpui-btn--danger {
    background: var(--chirpui-error);
    border-color: var(--chirpui-error);
    color: white;
}

.chirpui-btn--danger:hover:not(:disabled) {
    background: color-mix(in srgb, var(--chirpui-error) 85%, black);
    border-color: color-mix(in srgb, var(--chirpui-error) 85%, black);
}

.chirpui-btn--danger:active:not(:disabled) {
    background: color-mix(in srgb, var(--chirpui-error) 75%, black);
    border-color: color-mix(in srgb, var(--chirpui-error) 75%, black);
}

/* Small button — compact for search bars, toolbars */
.chirpui-btn--sm {
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-sm);
    font-size: var(--chirpui-font-xs);
}

.chirpui-btn-group {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
}
.chirpui-btn-group--end { justify-content: flex-end; }
.chirpui-btn-group--between { justify-content: space-between; }
.chirpui-btn-group--center { justify-content: center; }
.chirpui-btn-group--stretch .chirpui-btn { flex: 1; }

/* Actions bar — semantic wrapper for form/dialog/card button groups.
   Use in modal footers, card footers, form buttons, confirmation dialogs. */
.chirpui-actions {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: var(--chirpui-spacing-sm);
    padding: var(--chirpui-spacing-sm) 0;
}
.chirpui-actions--start { justify-content: flex-start; }
.chirpui-actions--center { justify-content: center; }
.chirpui-actions--between { justify-content: space-between; }
.chirpui-actions--stretch .chirpui-btn { flex: 1; }
.chirpui-actions--stacked {
    flex-direction: column;
    align-items: stretch;
}
.chirpui-actions--bordered {
    border-top: 1px solid var(--chirpui-border);
    padding-top: var(--chirpui-spacing);
    margin-top: var(--chirpui-spacing);
}

/* Hover lift and active press — only when motion is preferred */
@media (prefers-reduced-motion: no-preference) {
    .chirpui-btn:hover:not(:disabled) {
        transform: translateY(-2px);
        box-shadow: var(--chirpui-shadow-md);
    }

    .chirpui-btn:active:not(:disabled) {
        transition: none;
        transform: scale(0.98) translateY(0);
        box-shadow: var(--chirpui-shadow-sm);
    }

    .chirpui-btn--ghost:hover:not(:disabled) {
        box-shadow: none;
    }

    .chirpui-btn--ghost:active:not(:disabled) {
        box-shadow: none;
    }
}

/* Loading state — use with loading=true or htmx (adds htmx-request to trigger) */
.chirpui-btn--loading,
.chirpui-btn.htmx-request {
    cursor: wait;
    pointer-events: none;
}

.chirpui-btn__icon {
    font-size: 1em;
    line-height: 1;
}

.chirpui-btn__label {
    display: inline-flex;
    align-items: center;
    gap: inherit;
    transition: opacity var(--chirpui-transition);
}

.chirpui-btn__spinner {
    display: none;
    position: absolute;
    inset: 0;
    align-items: center;
    justify-content: center;
}

.chirpui-btn--loading .chirpui-btn__icon,
.chirpui-btn--loading .chirpui-btn__label,
.chirpui-btn.htmx-request .chirpui-btn__icon,
.chirpui-btn.htmx-request .chirpui-btn__label {
    opacity: 0;
}

.chirpui-btn--loading .chirpui-btn__spinner,
.chirpui-btn.htmx-request .chirpui-btn__spinner {
    display: inline-flex;
}

/* ==========================================================================
   Badge
   ========================================================================== */

.chirpui-badge {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
    padding: 0.25rem 0.5rem;
    border-radius: var(--chirpui-radius-sm);
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-ui-sm);
    font-weight: var(--chirpui-ui-font-weight-medium);
    font-feature-settings: "tnum";
    line-height: 1;
    border: 1px solid;
    text-decoration: none;
    transition: background var(--chirpui-transition), color var(--chirpui-transition),
        border-color var(--chirpui-transition), box-shadow var(--chirpui-transition);
}

a.chirpui-badge {
    cursor: pointer;
    box-shadow: var(--chirpui-shadow-sm);
    border-width: 1.5px;
}

a.chirpui-badge:hover,
a.chirpui-badge:focus {
    text-decoration: none;
}

a.chirpui-badge:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

@media (prefers-reduced-motion: no-preference) {
    a.chirpui-badge {
        transition: background var(--chirpui-transition), color var(--chirpui-transition),
            border-color var(--chirpui-transition), box-shadow var(--chirpui-transition),
            transform var(--chirpui-transition);
    }

    a.chirpui-badge:hover {
        transform: translateY(-1px);
        box-shadow: var(--chirpui-shadow-sm);
    }

    a.chirpui-badge:active {
        transition: none;
        transform: translateY(0);
        box-shadow: none;
    }
}

.chirpui-badge__icon {
    font-size: 1em;
    line-height: 1;
}

.chirpui-badge__text {
    line-height: 1;
}

.chirpui-badge--primary {
    background: var(--chirpui-primary-muted);
    color: var(--chirpui-primary);
    border-color: var(--chirpui-primary);
}

a.chirpui-badge--primary:hover {
    background: color-mix(in srgb, var(--chirpui-primary) 25%, var(--chirpui-primary-muted));
    color: color-mix(in srgb, var(--chirpui-primary) var(--chirpui-shade-hover), black);
}

a.chirpui-badge--primary:active {
    background: color-mix(in srgb, var(--chirpui-primary) 35%, var(--chirpui-primary-muted));
}

.chirpui-badge--success {
    background: var(--chirpui-success-muted);
    color: var(--chirpui-success);
    border-color: var(--chirpui-success);
}

a.chirpui-badge--success:hover {
    background: color-mix(in srgb, var(--chirpui-success) 25%, var(--chirpui-success-muted));
    color: color-mix(in srgb, var(--chirpui-success) var(--chirpui-shade-hover), black);
}

a.chirpui-badge--success:active {
    background: color-mix(in srgb, var(--chirpui-success) 35%, var(--chirpui-success-muted));
}

.chirpui-badge--warning {
    background: var(--chirpui-warning-muted);
    color: var(--chirpui-warning);
    border-color: var(--chirpui-warning);
}

a.chirpui-badge--warning:hover {
    background: color-mix(in srgb, var(--chirpui-warning) 25%, var(--chirpui-warning-muted));
    color: color-mix(in srgb, var(--chirpui-warning) var(--chirpui-shade-hover), black);
}

a.chirpui-badge--warning:active {
    background: color-mix(in srgb, var(--chirpui-warning) 35%, var(--chirpui-warning-muted));
}

.chirpui-badge--error {
    background: var(--chirpui-error-muted);
    color: var(--chirpui-error);
    border-color: var(--chirpui-error);
}

a.chirpui-badge--error:hover {
    background: color-mix(in srgb, var(--chirpui-error) 25%, var(--chirpui-error-muted));
    color: color-mix(in srgb, var(--chirpui-error) var(--chirpui-shade-hover), black);
}

a.chirpui-badge--error:active {
    background: color-mix(in srgb, var(--chirpui-error) 35%, var(--chirpui-error-muted));
}

.chirpui-badge--muted {
    background: var(--chirpui-muted-bg);
    color: var(--chirpui-text-muted);
    border-color: var(--chirpui-border);
}

a.chirpui-badge--muted:hover {
    background: var(--chirpui-border);
    color: var(--chirpui-text);
}

a.chirpui-badge--muted:active {
    background: color-mix(in srgb, var(--chirpui-border) 80%, black);
}

.chirpui-badge--info {
    background: var(--chirpui-alert-info-bg);
    color: var(--chirpui-info);
    border-color: var(--chirpui-alert-info-border);
}

a.chirpui-badge--info:hover {
    background: color-mix(in srgb, var(--chirpui-info) 20%, var(--chirpui-alert-info-bg));
    color: color-mix(in srgb, var(--chirpui-info) var(--chirpui-shade-hover), black);
}

a.chirpui-badge--info:active {
    background: color-mix(in srgb, var(--chirpui-info) 30%, var(--chirpui-alert-info-bg));
}

/* Custom color (scoped --chirpui-badge-color) */
.chirpui-badge--custom {
    --_bg-mix: light-dark(12%, 18%);
    background: color-mix(in srgb, var(--chirpui-badge-color) var(--_bg-mix), transparent);
    color: var(--chirpui-badge-color);
    border-color: color-mix(in srgb, var(--chirpui-badge-color) 40%, transparent);
}

.chirpui-badge--custom-solid {
    background: var(--chirpui-badge-color);
    color: var(--chirpui-badge-text, white);
    border-color: var(--chirpui-badge-color);
}

a.chirpui-badge--custom:hover {
    background: color-mix(in srgb, var(--chirpui-badge-color) light-dark(18%, 24%), transparent);
}

a.chirpui-badge--custom-solid:hover {
    filter: brightness(1.05);
}

/* filter_chips.html — filter_group row (not filter_bar.html form toolbar) */
.chirpui-filter-group {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
}

/* ==========================================================================
   Spinner
   ========================================================================== */

.chirpui-spinner {
    display: inline-block;
    line-height: 1;
    font-size: 1rem;
}

.chirpui-spinner--sm { font-size: 0.75rem; }
.chirpui-spinner--md { font-size: 1rem; }
.chirpui-spinner--lg { font-size: 1.5rem; }

.chirpui-spinner__mote {
    display: inline-block;
    animation: chirpui-mote-pulse 0.9s ease-in-out infinite;
}

@keyframes chirpui-mote-pulse {
    0%, 100% {
        opacity: 0.3;
        scale: 0.8;
    }
    33% {
        opacity: 0.7;
        scale: 1;
    }
    66% {
        opacity: 1;
        scale: 1.1;
    }
}

.chirpui-spinner-thinking {
    display: inline-block;
    line-height: 1;
    font-size: 1rem;
}

.chirpui-spinner-thinking--sm { font-size: 0.75rem; }
.chirpui-spinner-thinking--md { font-size: 1rem; }
.chirpui-spinner-thinking--lg { font-size: 1.5rem; }

.chirpui-spinner-thinking__char {
    display: inline-block;
    animation: chirpui-spiral-rotate 0.6s steps(4) infinite;
}

@keyframes chirpui-spiral-rotate {
    0% { content: "◜"; }
    25% { content: "◝"; }
    50% { content: "◞"; }
    75% { content: "◟"; }
}

/* Accessibility: Reduced motion */
@media (prefers-reduced-motion: reduce) {
.chirpui-spinner__mote,
.chirpui-spinner-thinking__char {
        animation: none;
        opacity: 1;
        scale: 1;
    }
}

/* ==========================================================================
   ASCII Icons — Unicode symbols as primary icons
   ========================================================================== */

/* ASCII/symbol glyphs — monospace for consistent ○●◐ sizing across fonts */
.chirpui-ascii {
    display: inline-block;
    line-height: 1;
    font-size: 1rem;
    font-family: var(--chirpui-ascii-font);
}

.chirpui-ascii--sm { font-size: 0.75rem; }
.chirpui-ascii--md { font-size: 1rem; }
.chirpui-ascii--lg { font-size: 1.5rem; }
.chirpui-ascii--xl { font-size: 2rem; }

.chirpui-ascii__char {
    display: inline-block;
}

/* Rotate: 4 overlapping chars, cycle opacity */
.chirpui-ascii--rotate {
    position: relative;
    width: 1em;
    height: 1em;
    text-align: center;
}

.chirpui-ascii--rotate .chirpui-ascii__char {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    opacity: 0;
    animation: chirpui-ascii-rotate-cycle 0.8s steps(1) infinite;
}

.chirpui-ascii--rotate .chirpui-ascii__char--1 { animation-delay: 0s; }
.chirpui-ascii--rotate .chirpui-ascii__char--2 { animation-delay: -0.6s; }
.chirpui-ascii--rotate .chirpui-ascii__char--3 { animation-delay: -0.4s; }
.chirpui-ascii--rotate .chirpui-ascii__char--4 { animation-delay: -0.2s; }

@keyframes chirpui-ascii-rotate-cycle {
    0%, 24% { opacity: 1; }
    25%, 100% { opacity: 0; }
}

/* Blink */
.chirpui-ascii--blink .chirpui-ascii__char {
    animation: chirpui-ascii-blink 0.8s step-end infinite;
}

@keyframes chirpui-ascii-blink {
    50% { opacity: 0; }
}

/* Pulse — opacity + scale */
.chirpui-ascii--pulse .chirpui-ascii__char {
    animation: chirpui-ascii-pulse 1s ease-in-out infinite;
}

@keyframes chirpui-ascii-pulse {
    0%, 100% { opacity: 0.6; scale: 0.9; }
    50% { opacity: 1; scale: 1.1; }
}

/* Shrink — scale down and back */
.chirpui-ascii--shrink .chirpui-ascii__char {
    animation: chirpui-ascii-shrink 1.2s ease-in-out infinite;
}

@keyframes chirpui-ascii-shrink {
    0%, 100% { scale: 1; }
    50% { scale: 0.6; }
}

/* Grow — scale up and back */
.chirpui-ascii--grow .chirpui-ascii__char {
    animation: chirpui-ascii-grow 1.2s ease-in-out infinite;
}

@keyframes chirpui-ascii-grow {
    0%, 100% { scale: 1; }
    50% { scale: 1.4; }
}

/* Spin — full rotation */
.chirpui-ascii--spin .chirpui-ascii__char {
    animation: chirpui-ascii-spin 1s linear infinite;
}

@keyframes chirpui-ascii-spin {
    to { rotate: 360deg; }
}

/* Bounce — translateY */
.chirpui-ascii--bounce .chirpui-ascii__char {
    animation: chirpui-ascii-bounce 0.6s ease-in-out infinite;
}

@keyframes chirpui-ascii-bounce {
    0%, 100% { translate: 0 0; }
    50% { translate: 0 -0.25em; }
}

/* Throb — opacity only, gentle */
.chirpui-ascii--throb .chirpui-ascii__char {
    animation: chirpui-ascii-throb 1.5s ease-in-out infinite;
}

@keyframes chirpui-ascii-throb {
    0%, 100% { opacity: 0.5; }
    50% { opacity: 1; }
}

/* Wiggle — small rotation wobble */
.chirpui-ascii--wiggle .chirpui-ascii__char {
    animation: chirpui-ascii-wiggle 0.5s ease-in-out infinite;
}

@keyframes chirpui-ascii-wiggle {
    0%, 100% { rotate: 0deg; }
    25% { rotate: -12deg; }
    75% { rotate: 12deg; }
}

/* Glow — text-shadow pulse */
.chirpui-ascii--glow .chirpui-ascii__char {
    animation: chirpui-ascii-glow 1.5s ease-in-out infinite;
}

@keyframes chirpui-ascii-glow {
    0%, 100% {
        filter: drop-shadow(0 0 2px currentColor);
        opacity: 0.8;
    }
    50% {
        filter: drop-shadow(0 0 8px currentColor);
        opacity: 1;
    }
}

/* Accessibility: Reduced motion for ASCII icons */
@media (prefers-reduced-motion: reduce) {
    .chirpui-ascii--blink .chirpui-ascii__char,
    .chirpui-ascii--pulse .chirpui-ascii__char,
    .chirpui-ascii--shrink .chirpui-ascii__char,
    .chirpui-ascii--grow .chirpui-ascii__char,
    .chirpui-ascii--spin .chirpui-ascii__char,
    .chirpui-ascii--bounce .chirpui-ascii__char,
    .chirpui-ascii--throb .chirpui-ascii__char,
    .chirpui-ascii--wiggle .chirpui-ascii__char,
    .chirpui-ascii--glow .chirpui-ascii__char,
    .chirpui-ascii--rotate .chirpui-ascii__char {
        animation: none;
        opacity: 1;
        scale: 1;
        rotate: 0;
        translate: 0 0;
        filter: none;
    }
}

/* ==========================================================================
   Skeleton
   ========================================================================== */

.chirpui-skeleton {
    display: inline-block;
    background: linear-gradient(
        90deg,
        var(--chirpui-bg-subtle) 25%,
        var(--chirpui-border) 50%,
        var(--chirpui-bg-subtle) 75%
    );
    background-size: 200% 100%;
    animation: chirpui-skeleton-shimmer 1.5s ease-in-out infinite;
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-skeleton--avatar {
    width: var(--chirpui-avatar-size-md);
    height: var(--chirpui-avatar-size-md);
    border-radius: 50%;
}

.chirpui-skeleton--card {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing);
    width: 100%;
}

.chirpui-skeleton--card-img {
    width: 100%;
    height: 0;
    padding-bottom: 56.25%;
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-skeleton--card-line {
    display: block;
    height: 1em;
    width: 100%;
}

.chirpui-skeleton--card-line:last-child {
    width: 60%;
}

.chirpui-skeleton--text {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-sm);
}

.chirpui-skeleton__line {
    display: block;
    height: 1em;
    width: 100%;
}

.chirpui-skeleton__line:last-child {
    width: 75%;
}

@keyframes chirpui-skeleton-shimmer {
    0% { background-position: 200% 0; }
    100% { background-position: -200% 0; }
}

@media (prefers-reduced-motion: reduce) {
    .chirpui-skeleton {
        animation: none;
        background: var(--chirpui-bg-subtle);
    }
}

/* ==========================================================================
   Infinite Scroll
   ========================================================================== */

.chirpui-infinite-scroll__loading {
    opacity: 0;
    pointer-events: none;
    transition: opacity var(--chirpui-transition);
}

.chirpui-infinite-scroll__loading.htmx-request {
    opacity: 1;
}

.chirpui-infinite-scroll__loading--skeleton {
    padding: var(--chirpui-spacing);
}

/* ==========================================================================
   Reveal on Scroll (Alpine Intersect)
   ========================================================================== */

.chirpui-reveal-on-scroll {
    /* min-height: 1px set inline so Intersection Observer has a valid target */
}

/* ==========================================================================
   Empty State
   ========================================================================== */

.chirpui-empty-state {
    text-align: center;
    padding: var(--chirpui-spacing) calc(var(--chirpui-spacing) * 2);
    color: var(--chirpui-text-muted);
}

.chirpui-empty-state__icon,
.chirpui-empty-state__illustration {
    font-size: 3rem;
    line-height: 1;
    margin-bottom: var(--chirpui-spacing);
    opacity: 0.6;
}

.chirpui-empty-state__title {
    margin: 0 0 var(--chirpui-spacing-sm) 0;
    font-size: 1.25rem;
    font-weight: 600;
    color: var(--chirpui-text);
}

.chirpui-empty-state__code {
    margin-bottom: var(--chirpui-spacing-sm);
}

.chirpui-empty-state__code code {
    font-family: ui-monospace, monospace;
    font-size: 0.9em;
    padding: 0.2em 0.4em;
    background: var(--chirpui-bg-subtle);
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-empty-state__search-hint {
    margin: var(--chirpui-spacing-sm) 0 0;
    font-size: var(--chirpui-font-sm);
}

.chirpui-empty-state__suggestions {
    margin: var(--chirpui-spacing-sm) 0 0;
    padding-inline-start: 1.25rem;
    text-align: left;
}

.chirpui-empty-state__body {
    font-size: var(--chirpui-font-sm);
}

.chirpui-empty-state__action {
    display: inline-block;
    margin-top: var(--chirpui-spacing);
}

.chirpui-empty-state__action:empty {
    display: none;
}

.chirpui-empty-panel-state {
    display: flex;
    flex-direction: column;
    justify-content: center;
    min-height: 100%;
}

.chirpui-empty-panel-state--compact {
    padding: var(--chirpui-spacing-md);
}

.chirpui-empty-panel-state--compact .chirpui-empty-state__icon,
.chirpui-empty-panel-state--compact .chirpui-empty-state__illustration {
    font-size: var(--chirpui-empty-panel-state-icon-size);
    margin-bottom: var(--chirpui-spacing-sm);
}

.chirpui-empty-panel-state--compact .chirpui-empty-state__title {
    font-size: var(--chirpui-ui-base);
    margin-bottom: var(--chirpui-spacing-xs);
}

.chirpui-empty-panel-state--compact .chirpui-empty-state__body {
    max-width: var(--chirpui-measure-sm);
    margin: 0 auto;
}

.chirpui-empty-panel-state--compact .chirpui-empty-state__action {
    margin-top: var(--chirpui-spacing-sm);
}

/* ==========================================================================
   Progress Bar
   ========================================================================== */

.chirpui-progress-bar {
    position: relative;
    width: 100%;
}

.chirpui-progress-bar--sm { height: 0.25rem; }
.chirpui-progress-bar--md { height: 0.5rem; }
.chirpui-progress-bar--lg { height: 1rem; }

.chirpui-progress-bar__track {
    width: 100%;
    height: 100%;
    background: var(--chirpui-bg-subtle);
    border-radius: var(--chirpui-radius-sm);
    overflow: hidden;
}

.chirpui-progress-bar__fill {
    height: 100%;
    background: currentColor;
    transition: width var(--chirpui-motion-slow) var(--chirpui-ease-standard);
    border-radius: var(--chirpui-radius-sm);
}

/* Progress bar variants */
.chirpui-progress-bar--gold .chirpui-progress-bar__fill {
    background: var(--chirpui-accent-dim, var(--chirpui-accent));
}

.chirpui-progress-bar--radiant .chirpui-progress-bar__fill {
    background: linear-gradient(
        90deg,
        var(--chirpui-accent-dim, var(--chirpui-accent)),
        var(--chirpui-accent-bright, var(--chirpui-accent))
    );
}

.chirpui-progress-bar--success .chirpui-progress-bar__fill {
    background: var(--chirpui-success);
}

.chirpui-progress-bar--watched .chirpui-progress-bar__fill {
    background: var(--chirpui-error);
}

.chirpui-progress-bar--info .chirpui-progress-bar__fill {
    background: var(--chirpui-info);
}

.chirpui-progress-bar--warning .chirpui-progress-bar__fill {
    background: var(--chirpui-warning);
}

.chirpui-progress-bar--error .chirpui-progress-bar__fill {
    background: var(--chirpui-error);
}

.chirpui-progress-bar--custom .chirpui-progress-bar__fill {
    background: var(--chirpui-progress-color);
}

.chirpui-progress-bar__label {
    display: block;
    margin-top: var(--chirpui-spacing-xs);
    font-size: var(--chirpui-font-sm);
    text-align: center;
    color: var(--chirpui-text-muted);
}

/* ==========================================================================
   Bar Chart (CSS-only horizontal bars)
   ========================================================================== */

.chirpui-bar-chart {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-sm);
}

.chirpui-bar-chart--sm .chirpui-bar-chart__track { height: 0.25rem; }
.chirpui-bar-chart--md .chirpui-bar-chart__track { height: 0.5rem; }
.chirpui-bar-chart--lg .chirpui-bar-chart__track { height: 0.75rem; }

.chirpui-bar-chart__row {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(4rem, 3fr) auto;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
}

.chirpui-bar-chart__label {
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.chirpui-bar-chart__label-link {
    color: inherit;
    text-decoration: none;
}

.chirpui-bar-chart__label-link:hover {
    color: var(--chirpui-accent);
    text-decoration: underline;
}

.chirpui-bar-chart__track {
    width: 100%;
    background: var(--chirpui-bg-subtle);
    border-radius: var(--chirpui-radius-sm);
    overflow: hidden;
}

.chirpui-bar-chart__bar {
    height: 100%;
    min-width: 2px;
    transition: width var(--chirpui-motion-slow) var(--chirpui-ease-standard);
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-bar-chart--gold .chirpui-bar-chart__bar {
    background: var(--chirpui-accent-dim, var(--chirpui-accent));
}

.chirpui-bar-chart--radiant .chirpui-bar-chart__bar {
    background: linear-gradient(
        90deg,
        var(--chirpui-accent-dim, var(--chirpui-accent)),
        var(--chirpui-accent-bright, var(--chirpui-accent))
    );
}

.chirpui-bar-chart--success .chirpui-bar-chart__bar {
    background: var(--chirpui-success);
}

.chirpui-bar-chart--muted .chirpui-bar-chart__bar {
    background: var(--chirpui-text-muted);
}

.chirpui-bar-chart__value {
    font-size: var(--chirpui-font-sm);
    font-variant-numeric: tabular-nums;
    color: var(--chirpui-text-muted);
    min-width: 2ch;
    text-align: right;
}

/* ==========================================================================
   Donut Chart (CSS-only conic gradient)
   ========================================================================== */

.chirpui-donut {
    position: relative;
    width: var(--chirpui-donut-size, 4rem);
    height: var(--chirpui-donut-size, 4rem);
    border-radius: 50%;
}

.chirpui-donut--sm { --chirpui-donut-size: 2.5rem; }
.chirpui-donut--md { --chirpui-donut-size: 4rem; }
.chirpui-donut--lg { --chirpui-donut-size: 6rem; }

.chirpui-donut__ring {
    width: 100%;
    height: 100%;
    border-radius: 50%;
    background: conic-gradient(
        var(--chirpui-donut-fill, var(--chirpui-accent)) 0deg,
        var(--chirpui-donut-fill, var(--chirpui-accent)) calc(var(--chirpui-donut-pct, 0) * 3.6deg),
        var(--chirpui-bg-subtle) calc(var(--chirpui-donut-pct, 0) * 3.6deg),
        var(--chirpui-bg-subtle) 360deg
    );
}

.chirpui-donut__center {
    position: absolute;
    inset: 15%;
    border-radius: 50%;
    background: var(--chirpui-surface);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: var(--chirpui-font-sm);
    font-weight: 600;
    color: var(--chirpui-text);
}

.chirpui-donut--gold .chirpui-donut__ring {
    --chirpui-donut-fill: var(--chirpui-accent-dim, var(--chirpui-accent));
}

.chirpui-donut--success .chirpui-donut__ring {
    --chirpui-donut-fill: var(--chirpui-success);
}

.chirpui-donut--muted .chirpui-donut__ring {
    --chirpui-donut-fill: var(--chirpui-text-muted);
}

/* ==========================================================================
   Status Indicator
   ========================================================================== */

.chirpui-status-indicator {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
    padding: 0.25rem 0.5rem;
    border-radius: var(--chirpui-radius-sm);
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-font-sm);
    font-weight: var(--chirpui-ui-font-weight-medium);
    transition: background var(--chirpui-transition), color var(--chirpui-transition);
}

.chirpui-status-indicator__dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: currentColor;
}

.chirpui-status-indicator__icon {
    font-size: 1em;
    line-height: 1;
}

.chirpui-status-indicator__label {
    line-height: 1;
}

/* Status variants - minimal styling, override with themes */
.chirpui-status-indicator--default {
    background: var(--chirpui-muted-bg);
    color: var(--chirpui-muted);
}

.chirpui-status-indicator--success {
    background: var(--chirpui-success-muted);
    color: var(--chirpui-success);
}

.chirpui-status-indicator--warning {
    background: var(--chirpui-warning-muted);
    color: var(--chirpui-warning);
}

.chirpui-status-indicator--error {
    background: var(--chirpui-error-muted);
    color: var(--chirpui-error);
}

.chirpui-status-indicator--info {
    background: var(--chirpui-alert-info-bg);
    color: var(--chirpui-info);
}

.chirpui-status-indicator--primary {
    background: var(--chirpui-primary-muted);
    color: var(--chirpui-primary);
}

.chirpui-status-indicator--custom {
    --_bg-mix: light-dark(14%, 20%);
    background: color-mix(in srgb, var(--chirpui-status-color) var(--_bg-mix), transparent);
    color: var(--chirpui-status-color);
}

.chirpui-status-indicator--custom .chirpui-status-indicator__dot {
    background: var(--chirpui-status-color);
}

/* Pulsing animation */
.chirpui-status-indicator--pulse .chirpui-status-indicator__dot {
    animation: chirpui-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}

@keyframes chirpui-pulse {
    0%, 100% {
        opacity: 1;
    }
    50% {
        opacity: 0.5;
    }
}

@media (prefers-reduced-motion: reduce) {
    .chirpui-status-indicator--pulse .chirpui-status-indicator__dot {
        animation: none;
    }
}

/* ==========================================================================
   App Shell
   ========================================================================== */
/* Root cause (9650266): grid + flex layout needs min-size 0 on flex/grid
   children to allow shrinking; topbar needs nowrap + topbar-end needs flex
   layout; breadcrumbs in topbar must not wrap or topbar grows vertically. */

body:has(> .chirpui-app-shell) {
    margin: 0;
}

.chirpui-app-shell {
    display: grid;
    grid-template-columns: var(--chirpui-sidebar-width, 16rem) 1fr;
    grid-template-rows: auto 1fr;
    grid-template-areas: "topbar topbar" "sidebar main";
    height: 100dvh;
    overflow: hidden;
}

.chirpui-app-shell__topbar {
    grid-area: topbar;
    display: flex;
    align-items: center;
    flex-wrap: nowrap;
    gap: var(--chirpui-spacing);
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
    border-bottom: 1px solid var(--chirpui-border);
    background: var(--chirpui-surface);
    position: sticky;
    top: 0;
    z-index: 50;
    flex-shrink: 0;
    box-shadow: var(--chirpui-elevation-topbar);
    transition: box-shadow var(--chirpui-transition);
}

.chirpui-app-shell__topbar--glass {
    background: var(--chirpui-surface);
    border-color: var(--chirpui-border);
}
@supports (backdrop-filter: blur(10px)) or (-webkit-backdrop-filter: blur(10px)) {
    .chirpui-app-shell__topbar--glass {
        background: var(--chirpui-glass-bg);
        border-color: var(--chirpui-glass-border);
        backdrop-filter: blur(10px);
        -webkit-backdrop-filter: blur(10px);
    }
}

.chirpui-app-shell__topbar--gradient {
    background: var(--chirpui-gradient-subtle);
}

.chirpui-app-shell__brand {
    font-weight: 600;
    font-size: var(--chirpui-font-lg);
    color: var(--chirpui-text);
    text-decoration: none;
    flex-shrink: 0;
}

.chirpui-app-shell__topbar-start {
    flex-shrink: 0;
}

.chirpui-app-shell__topbar-center {
    flex: 1;
    min-width: 0;
    overflow: hidden;
}

.chirpui-app-shell__topbar-end {
    flex-shrink: 0;
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
}

.chirpui-app-shell__shell-actions {
    display: flex;
    align-items: center;
    min-width: 0;
}

.chirpui-shell-actions {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    justify-content: flex-end;
    gap: var(--chirpui-spacing-xs);
}

.chirpui-shell-actions__group {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
}

.chirpui-shell-action-form {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
    margin: 0;
}

/* Keep breadcrumbs single-line in topbar to prevent topbar height growth */
.chirpui-app-shell__topbar-center .chirpui-breadcrumbs__list {
    flex-wrap: nowrap;
    overflow: hidden;
}

.chirpui-app-shell__topbar-center .chirpui-breadcrumbs__item {
    flex-shrink: 0;
}

.chirpui-app-shell__topbar-center .chirpui-breadcrumbs__item:last-child {
    flex-shrink: 1;
    min-width: 0;
}

.chirpui-app-shell__topbar-center .chirpui-breadcrumbs__item:last-child .chirpui-breadcrumbs__link,
.chirpui-app-shell__topbar-center .chirpui-breadcrumbs__item:last-child .chirpui-breadcrumbs__current {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    display: block;
}

.chirpui-app-shell__sidebar {
    grid-area: sidebar;
    position: relative;
    min-height: 0;
    overflow-y: auto;
    overscroll-behavior: contain;
    border-right: 1px solid var(--chirpui-border);
}

.chirpui-app-shell__sidebar--muted {
    background: var(--chirpui-bg-subtle);
}

.chirpui-app-shell__sidebar--glass {
    background: var(--chirpui-surface);
}
@supports (backdrop-filter: blur(10px)) or (-webkit-backdrop-filter: blur(10px)) {
    .chirpui-app-shell__sidebar--glass {
        background: var(--chirpui-glass-bg);
        backdrop-filter: blur(10px);
        -webkit-backdrop-filter: blur(10px);
    }
}

.chirpui-app-shell__sidebar .chirpui-sidebar {
    width: auto;
    border-right: none;
}

.chirpui-app-shell__sidebar-resize {
    position: absolute;
    right: 0;
    top: 0;
    bottom: 0;
    width: 10px;
    cursor: pointer;
    z-index: 20;
    user-select: none;
}

.chirpui-app-shell__sidebar-resize::before {
    content: "";
    position: absolute;
    left: 4px;
    top: 0;
    bottom: 0;
    width: 2px;
    background: var(--chirpui-border);
    opacity: 0.6;
}

.chirpui-app-shell__sidebar-resize:hover::before,
.chirpui-app-shell__sidebar-resize:active::before {
    background: var(--chirpui-accent);
    opacity: 1;
}

.chirpui-app-shell__sidebar-resize:hover {
    background: color-mix(in srgb, var(--chirpui-accent) 10%, transparent);
}

/* Sidebar collapsed (icon-only) */
.chirpui-app-shell--sidebar-collapsed {
    --chirpui-sidebar-width: var(--chirpui-sidebar-collapsed-width, 4rem);
}

.chirpui-app-shell--sidebar-collapsible {
    transition: grid-template-columns var(--chirpui-transition);
}

.chirpui-app-shell--sidebar-collapsed .chirpui-sidebar__label,
.chirpui-app-shell--sidebar-collapsed .chirpui-sidebar__section-title {
    overflow: hidden;
    width: 0;
    opacity: 0;
    white-space: nowrap;
}

.chirpui-app-shell--sidebar-collapsed .chirpui-sidebar__link {
    justify-content: center;
    padding-inline: var(--chirpui-spacing-sm);
    margin-inline: var(--chirpui-spacing-sm);
    border-radius: var(--chirpui-radius-sm);
}

.chirpui-app-shell--sidebar-collapsed .chirpui-sidebar__icon {
    margin-inline-end: 0;
    min-width: 0;
    width: 1.25em;
    justify-content: center;
}

.chirpui-sidebar-toggle {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: var(--chirpui-spacing-sm);
    background: transparent;
    border: none;
    border-radius: var(--chirpui-radius-sm);
    color: var(--chirpui-text-muted);
    cursor: pointer;
    font-size: var(--chirpui-font-sm);
    transition: color var(--chirpui-transition), background var(--chirpui-transition),
        box-shadow var(--chirpui-transition), transform var(--chirpui-transition);
}

.chirpui-sidebar-toggle:hover {
    color: var(--chirpui-text);
    background: var(--chirpui-state-surface-hover);
    box-shadow: var(--chirpui-elevation-1);
}

.chirpui-sidebar-toggle:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-sidebar-toggle:active {
    transform: translateY(1px);
}

.chirpui-sidebar-toggle__icon {
    font-family: var(--chirpui-ascii-font);
}

.chirpui-sidebar-toggle[aria-expanded="false"] .chirpui-sidebar-toggle__icon {
    transform: rotate(180deg);
}

.chirpui-app-shell__main {
    grid-area: main;
    position: relative;
    min-height: 0;
    min-width: 0;
    overflow-x: clip;
    overflow-y: auto;
    overscroll-behavior: contain;
    padding: var(--chirpui-spacing-lg);
}

/* Full-height main: flex column so #page-content can flex:1; inner panels own scroll.
   Opt in via {% block main_shell_class %}chirpui-app-shell__main--fill{% end %} on app_shell_layout. */
.chirpui-app-shell__main--fill {
    display: flex;
    flex-direction: column;
    min-height: 0;
    overflow: hidden;
    padding: 0;
}

.chirpui-app-shell__main--fill #page-content {
    flex: 1;
    min-height: 0;
    gap: 0;
}

/* Optional: single root wrapper inside #page-content that should fill (chat, maps). */
.chirpui-app-shell__main--fill #page-content > .chirpui-page-fill {
    display: flex;
    flex-direction: column;
    flex: 1;
    min-height: 0;
    min-width: 0;
}

.chirpui-app-shell__main--fill::before {
    top: 0;
    margin-inline: 0;
}

/* Navigation loading indicator — thin accent bar at the top of #main.
   Appears automatically via HTMX's .htmx-request class on the swap target.
   Slow cubic-bezier creep gives the illusion of real progress. */
.chirpui-app-shell__main::before {
    content: "";
    position: sticky;
    top: calc(-1 * var(--chirpui-spacing-lg));
    left: 0;
    right: 0;
    display: block;
    height: 2px;
    margin-inline: calc(-1 * var(--chirpui-spacing-lg));
    margin-bottom: calc(-2px);
    background: var(--chirpui-accent);
    transform: scaleX(0);
    transform-origin: left;
    z-index: 10;
    pointer-events: none;
}

.chirpui-app-shell__main.htmx-request::before {
    transform: scaleX(0.7);
    transition: transform var(--chirpui-motion-loading) var(--chirpui-ease-decel);
}

@media (prefers-reduced-motion: reduce) {
    .chirpui-app-shell__main.htmx-request::before {
        transform: scaleX(1);
        transition: none;
    }
}

/* Fragment targets — vertical spacing. Tabs topmost; title/actions/content below. */
#page-root {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-lg);
}

#page-content {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-md);
}

#page-content-inner {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-md);
}

/* ==========================================================================
   Sidebar — section links container
   ========================================================================== */

.chirpui-sidebar__section-links {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-sidebar-link-gap);
    margin-top: var(--chirpui-spacing-xs);
}

/* Collapsible section (details/summary) */
.chirpui-sidebar__section > summary {
    cursor: pointer;
    list-style: none;
    display: flex;
    align-items: center;
}

.chirpui-sidebar__section > summary::-webkit-details-marker {
    display: none;
}

.chirpui-sidebar__section > summary::after {
    content: "\25B8";
    display: inline-block;
    transition: rotate var(--chirpui-transition);
    margin-inline-start: auto;
    font-size: 0.75em;
    color: var(--chirpui-text-muted);
}

.chirpui-sidebar__section[open] > summary::after {
    rotate: 90deg;
}

/* ==========================================================================
   Command Palette
   ========================================================================== */

.chirpui-command-palette {
    border: none;
    background: transparent;
    padding: 0;
    max-width: 40rem;
    width: 90vw;
    margin: 10vh auto auto;
    border-radius: var(--chirpui-radius-lg);
    overflow: hidden;
}

.chirpui-command-palette::backdrop {
    background: rgba(0, 0, 0, 0.5);
    backdrop-filter: blur(4px);
}

.chirpui-command-palette__inner {
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-lg);
    box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
    overflow: hidden;
}

.chirpui-command-palette__input {
    width: 100%;
    padding: var(--chirpui-spacing) var(--chirpui-spacing-lg);
    border: none;
    border-bottom: 1px solid var(--chirpui-border);
    background: transparent;
    font-size: var(--chirpui-font-lg);
    color: var(--chirpui-text);
    outline: none;
    font-family: inherit;
}

.chirpui-command-palette__input::placeholder {
    color: var(--chirpui-text-muted);
}

.chirpui-command-palette__results {
    max-height: 20rem;
    overflow-y: auto;
    padding: var(--chirpui-spacing-sm) 0;
}

.chirpui-command-palette__results:empty {
    display: none;
}

.chirpui-command-palette__group-title {
    font-size: var(--chirpui-font-xs);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--chirpui-text-muted);
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing-lg);
}

.chirpui-command-palette__item {
    display: block;
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing-lg);
    color: var(--chirpui-text);
    text-decoration: none;
    transition: background var(--chirpui-transition);
}

.chirpui-command-palette__item:hover {
    background: var(--chirpui-bg-subtle);
}

.chirpui-command-palette__item:focus-visible {
    outline: var(--chirpui-state-focus-outline);
    outline-offset: var(--chirpui-state-focus-offset);
}

.chirpui-command-palette__item-label {
    font-weight: 500;
}

.chirpui-command-palette__item-hint {
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text-muted);
}

.chirpui-command-palette__trigger {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-sm);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-sm);
    background: transparent;
    color: var(--chirpui-text-muted);
    font-size: var(--chirpui-font-sm);
    cursor: pointer;
    transition: color var(--chirpui-transition), border-color var(--chirpui-transition);
    font-family: inherit;
}

.chirpui-command-palette__trigger:hover {
    color: var(--chirpui-text);
    border-color: var(--chirpui-text-muted);
}

.chirpui-command-palette__kbd {
    font-size: var(--chirpui-font-xs);
    padding: 0.1em 0.4em;
    border-radius: var(--chirpui-radius-xs, 3px);
    background: var(--chirpui-bg-subtle);
    border: 1px solid var(--chirpui-border);
}

/* ==========================================================================
   Utility: Inline grouping and measures
   ========================================================================== */

.chirpui-flow {
    display: flex;
    flex-wrap: wrap;
    gap: var(--chirpui-space-cluster-gap);
    align-items: center;
}

.chirpui-flow--sm { gap: var(--chirpui-spacing-sm); }
.chirpui-flow--md { gap: var(--chirpui-spacing-md); }
.chirpui-flow--lg { gap: var(--chirpui-spacing-lg); }

.chirpui-inline {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-space-inline-gap);
    flex-wrap: nowrap;
}

.chirpui-measure-sm { max-width: var(--chirpui-measure-sm); }
.chirpui-measure-md { max-width: var(--chirpui-measure-md); }
.chirpui-measure-lg { max-width: var(--chirpui-measure-lg); }

.chirpui-placeholder-inline {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-space-control-gap);
    color: var(--chirpui-text-muted);
}

.chirpui-list-reset {
    margin: 0;
    padding-inline-start: 1.25rem;
}

/* ==========================================================================
   Utility: Auto-fill grid (for tag filters, etc.)
   ========================================================================== */

.chirpui-grid--auto-fill {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(6rem, 1fr));
    gap: var(--chirpui-spacing-sm);
}

.chirpui-grid--auto-fill .chirpui-badge {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* ==========================================================================
   Inner shell sections (nested layouts: forum > subforum > thread)
   ========================================================================== */

.chirpui-shell-section {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-md);
    min-height: 0;
}
.chirpui-shell-section__nav {
    flex-shrink: 0;
}
.chirpui-shell-section__content {
    flex: 1;
    min-height: 0;
    overflow-y: auto;
}


/* ==========================================================================
   Effects Foundation — @property, @keyframes, reduced-motion
   ========================================================================== */

/* CSS Houdini custom properties for animatable values */
@property --chirpui-beam-angle {
    syntax: "<angle>";
    inherits: false;
    initial-value: 0deg;
}

@property --chirpui-num {
    syntax: "<integer>";
    inherits: false;
    initial-value: 0;
}

/* --- Shimmer: translating gradient highlight --- */
@keyframes chirpui-shimmer {
    0% { transform: translateX(-100%); }
    100% { transform: translateX(100%); }
}

/* --- Ripple: radial scale-out for click feedback --- */
@keyframes chirpui-ripple-expand {
    0% { transform: scale(0); opacity: 0.6; }
    100% { transform: scale(4); opacity: 0; }
}

/* --- Border beam: conic gradient rotation --- */
@keyframes chirpui-border-beam-rotate {
    0% { --chirpui-beam-angle: 0deg; }
    100% { --chirpui-beam-angle: 360deg; }
}

/* --- Pulse ring: expanding ring that fades --- */
@keyframes chirpui-pulse-ring {
    0% { transform: scale(1); opacity: 0.6; }
    100% { transform: scale(2.2); opacity: 0; }
}

/* --- Float: gentle vertical bob --- */
@keyframes chirpui-float {
    0%, 100% { transform: translateY(0); }
    50% { transform: translateY(-6px); }
}

/* --- Count up: CSS counter increment via @property --- */
@keyframes chirpui-count-up {
    from { --chirpui-num: 0; }
}

/* --- Meteor: diagonal streak --- */
@keyframes chirpui-meteor {
    0% { transform: rotate(215deg) translateX(0); opacity: 1; }
    70% { opacity: 1; }
    100% { transform: rotate(215deg) translateX(-600px); opacity: 0; }
}

/* --- Marquee: infinite horizontal scroll --- */
@keyframes chirpui-marquee {
    0% { transform: translateX(0); }
    100% { transform: translateX(-50%); }
}

/* --- Text reveal: clip-path wipe --- */
@keyframes chirpui-text-reveal {
    0% { clip-path: inset(0 100% 0 0); }
    100% { clip-path: inset(0 0 0 0); }
}

/* --- Spotlight rotate: radial gradient rotation --- */
@keyframes chirpui-spotlight-rotate {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
}

/* --- Typewriter: step-based text reveal with cursor --- */
@keyframes chirpui-typewriter {
    from { width: 0; }
    to { width: 100%; }
}
@keyframes chirpui-blink-caret {
    0%, 100% { border-color: transparent; }
    50% { border-color: currentColor; }
}

/* --- Glitch: offset pseudo-element distortion --- */
@keyframes chirpui-glitch {
    0%, 100% { clip-path: inset(0 0 0 0); transform: translate(0); }
    20% { clip-path: inset(20% 0 40% 0); transform: translate(-2px, 1px); }
    40% { clip-path: inset(60% 0 10% 0); transform: translate(2px, -1px); }
    60% { clip-path: inset(10% 0 70% 0); transform: translate(-1px, 2px); }
    80% { clip-path: inset(50% 0 20% 0); transform: translate(1px, -2px); }
}
@keyframes chirpui-glitch-alt {
    0%, 100% { clip-path: inset(0 0 0 0); transform: translate(0); }
    20% { clip-path: inset(50% 0 20% 0); transform: translate(2px, -1px); }
    40% { clip-path: inset(10% 0 60% 0); transform: translate(-2px, 2px); }
    60% { clip-path: inset(40% 0 30% 0); transform: translate(1px, -1px); }
    80% { clip-path: inset(70% 0 5% 0); transform: translate(-1px, 1px); }
}

/* --- Neon: pulsing glow flicker --- */
@keyframes chirpui-neon-flicker {
    0%, 19%, 21%, 23%, 25%, 54%, 56%, 100% { opacity: 1; }
    20%, 24%, 55% { opacity: 0.6; }
}
@keyframes chirpui-neon-pulse {
    0%, 100% { text-shadow: 0 0 4px currentColor, 0 0 11px currentColor, 0 0 19px currentColor; }
    50% { text-shadow: 0 0 4px currentColor, 0 0 20px currentColor, 0 0 40px currentColor, 0 0 60px currentColor; }
}

/* --- Aurora: drifting gradient blobs --- */
@keyframes chirpui-aurora-drift-1 {
    0%, 100% { transform: translate(0, 0) rotate(0deg) scale(1); }
    25% { transform: translate(30%, -20%) rotate(90deg) scale(1.1); }
    50% { transform: translate(-20%, 30%) rotate(180deg) scale(0.9); }
    75% { transform: translate(20%, -10%) rotate(270deg) scale(1.05); }
}
@keyframes chirpui-aurora-drift-2 {
    0%, 100% { transform: translate(0, 0) rotate(0deg) scale(1); }
    33% { transform: translate(-30%, 20%) rotate(120deg) scale(1.15); }
    66% { transform: translate(20%, -30%) rotate(240deg) scale(0.85); }
}

/* --- Symbol Rain: cascading ASCII characters --- */
@keyframes chirpui-symbol-rain-fall {
    0% { transform: translateY(-100%) rotate(0deg); opacity: 0; }
    10% { opacity: 0.7; }
    90% { opacity: 0.7; }
    100% { transform: translateY(calc(100vh + 2rem)) rotate(45deg); opacity: 0; }
}

/* --- Holy Light: ascending divine sparkles with parallax --- */
@keyframes chirpui-holy-rise-far {
    0% { transform: translateY(0) scale(0.6); opacity: 0; }
    15% { opacity: 0.3; }
    85% { opacity: 0.3; }
    100% { transform: translateY(-120px) scale(0.6); opacity: 0; }
}
@keyframes chirpui-holy-rise-mid {
    0% { transform: translateY(0) scale(0.85); opacity: 0; }
    15% { opacity: 0.6; }
    50% { opacity: 0.8; }
    85% { opacity: 0.5; }
    100% { transform: translateY(-200px) scale(0.85); opacity: 0; }
}
@keyframes chirpui-holy-rise-near {
    0% { transform: translateY(0) scale(1); opacity: 0; }
    10% { opacity: 0.9; }
    50% { opacity: 1; }
    90% { opacity: 0.7; }
    100% { transform: translateY(-300px) scale(1); opacity: 0; }
}
@keyframes chirpui-holy-glow-pulse {
    0%, 100% { filter: drop-shadow(0 0 3px var(--chirpui-holy-color)) brightness(1); }
    50% { filter: drop-shadow(0 0 8px var(--chirpui-holy-color)) brightness(1.3); }
}

/* --- Rune Field: drifting mystical symbols with parallax --- */
@keyframes chirpui-rune-drift-far {
    0%, 100% { transform: translate(0, 0) rotate(0deg); }
    25% { transform: translate(8px, -6px) rotate(5deg); }
    50% { transform: translate(-4px, -12px) rotate(-3deg); }
    75% { transform: translate(6px, -4px) rotate(2deg); }
}
@keyframes chirpui-rune-drift-mid {
    0%, 100% { transform: translate(0, 0) rotate(0deg); }
    25% { transform: translate(-12px, 8px) rotate(-8deg); }
    50% { transform: translate(10px, -15px) rotate(5deg); }
    75% { transform: translate(-6px, 6px) rotate(-3deg); }
}
@keyframes chirpui-rune-drift-near {
    0%, 100% { transform: translate(0, 0) rotate(0deg); }
    25% { transform: translate(15px, -10px) rotate(10deg); }
    50% { transform: translate(-8px, -20px) rotate(-6deg); }
    75% { transform: translate(10px, -5px) rotate(4deg); }
}
@keyframes chirpui-rune-pulse {
    0%, 100% { opacity: var(--chirpui-rune-opacity, 0.4); }
    50% { opacity: calc(var(--chirpui-rune-opacity, 0.4) + 0.15); }
}

/* --- ASCII Skeleton: wave opacity for character fills --- */
@keyframes chirpui-ascii-skeleton-wave {
    0%, 100% { opacity: 0.25; }
    50% { opacity: 0.6; }
}

/* --- ASCII Momentum: physics-like spin with accel/decel --- */
@keyframes chirpui-ascii-momentum {
    0%   { transform: rotate(0deg); }
    8%   { transform: rotate(45deg); }      /* fast start */
    20%  { transform: rotate(180deg); }     /* peak speed */
    35%  { transform: rotate(340deg); }     /* still fast */
    50%  { transform: rotate(420deg); }     /* slowing */
    65%  { transform: rotate(460deg); }     /* decelerating */
    78%  { transform: rotate(480deg); }     /* crawling */
    88%  { transform: rotate(490deg); }     /* almost stopped */
    95%  { transform: rotate(495deg); }     /* barely moving */
    100% { transform: rotate(720deg); }     /* sudden burst again */
}
@keyframes chirpui-ascii-momentum-reverse {
    0%   { transform: rotate(0deg); }
    10%  { transform: rotate(-60deg); }
    25%  { transform: rotate(-200deg); }
    40%  { transform: rotate(-310deg); }
    55%  { transform: rotate(-370deg); }
    70%  { transform: rotate(-395deg); }
    82%  { transform: rotate(-400deg); }
    92%  { transform: rotate(-402deg); }
    100% { transform: rotate(-720deg); }
}
@keyframes chirpui-ascii-momentum-drift {
    0%   { transform: rotate(0deg); }
    15%  { transform: rotate(90deg); }
    30%  { transform: rotate(95deg); }      /* pause/drift */
    45%  { transform: rotate(270deg); }     /* burst */
    60%  { transform: rotate(275deg); }     /* pause */
    75%  { transform: rotate(360deg); }
    85%  { transform: rotate(362deg); }     /* almost still */
    100% { transform: rotate(720deg); }     /* final burst */
}

/* --- ASCII Spinner: stepped visibility keyframes --- */
@keyframes chirpui-ascii-spinner-10 {
    0%, 9%   { opacity: 1; }
    10%, 100% { opacity: 0; }
}
@keyframes chirpui-ascii-spinner-8 {
    0%, 11.5%  { opacity: 1; }
    12.5%, 100% { opacity: 0; }
}
@keyframes chirpui-ascii-spinner-5 {
    0%, 19%  { opacity: 1; }
    20%, 100% { opacity: 0; }
}
@keyframes chirpui-ascii-spinner-4 {
    0%, 24%  { opacity: 1; }
    25%, 100% { opacity: 0; }
}

/* --- Constellation: twinkling starfield with gentle drift --- */
@keyframes chirpui-star-twinkle {
    0%, 100% { opacity: var(--chirpui-star-base-opacity, 0.3); transform: scale(1); }
    50% { opacity: calc(var(--chirpui-star-base-opacity, 0.3) + 0.5); transform: scale(1.3); }
}
@keyframes chirpui-star-drift {
    0%, 100% { transform: translate(0, 0); }
    33% { transform: translate(3px, -2px); }
    66% { transform: translate(-2px, 3px); }
}

/* --- Sparkle: star pop-in/pop-out --- */
@keyframes chirpui-sparkle {
    0%, 100% { opacity: 0; transform: scale(0) rotate(0deg); }
    50% { opacity: 1; transform: scale(1) rotate(180deg); }
}

/* --- Confetti: falling pieces --- */
@keyframes chirpui-confetti-fall {
    0% { transform: translateY(-100%) rotate(0deg); opacity: 1; }
    100% { transform: translateY(100vh) rotate(720deg); opacity: 0; }
}
@keyframes chirpui-confetti-sway {
    0%, 100% { margin-left: 0; }
    50% { margin-left: 30px; }
}

/* --- Orbit: circular rotation --- */
@keyframes chirpui-orbit {
    0% { transform: rotate(0deg) translateX(var(--chirpui-orbit-radius, 60px)) rotate(0deg); }
    100% { transform: rotate(360deg) translateX(var(--chirpui-orbit-radius, 60px)) rotate(-360deg); }
}

/* --- Wobble: micro-interaction utilities --- */
@keyframes chirpui-wobble {
    0%, 100% { transform: translateX(0); }
    15% { transform: translateX(-12px) rotate(-5deg); }
    30% { transform: translateX(10px) rotate(3deg); }
    45% { transform: translateX(-6px) rotate(-3deg); }
    60% { transform: translateX(4px) rotate(2deg); }
    75% { transform: translateX(-2px) rotate(-1deg); }
}
@keyframes chirpui-jello {
    0%, 100% { transform: skewX(0deg) skewY(0deg); }
    11.1% { transform: skewX(-12.5deg) skewY(-12.5deg); }
    22.2% { transform: skewX(6.25deg) skewY(6.25deg); }
    33.3% { transform: skewX(-3.125deg) skewY(-3.125deg); }
    44.4% { transform: skewX(1.5625deg) skewY(1.5625deg); }
    55.5% { transform: skewX(-0.78125deg) skewY(-0.78125deg); }
    66.6% { transform: skewX(0.390625deg) skewY(0.390625deg); }
}
@keyframes chirpui-rubber-band {
    0%, 100% { transform: scaleX(1) scaleY(1); }
    30% { transform: scaleX(1.25) scaleY(0.75); }
    40% { transform: scaleX(0.75) scaleY(1.25); }
    50% { transform: scaleX(1.15) scaleY(0.85); }
    65% { transform: scaleX(0.95) scaleY(1.05); }
    75% { transform: scaleX(1.05) scaleY(0.95); }
}
@keyframes chirpui-bounce-in {
    0% { transform: scale(0.3); opacity: 0; }
    50% { transform: scale(1.05); }
    70% { transform: scale(0.9); }
    100% { transform: scale(1); opacity: 1; }
}

/* --- Reduced motion: disable all new effect animations --- */
@media (prefers-reduced-motion: reduce) {
    .chirpui-shimmer-btn__shimmer,
    .chirpui-ripple-btn__ripple,
    .chirpui-border-beam__beam,
    .chirpui-notification-dot__ping,
    .chirpui-marquee__track,
    .chirpui-meteor__streak,
    .chirpui-text-reveal,
    .chirpui-number-ticker__value,
    .chirpui-animated-counter__value,
    .chirpui-particle-bg__dot,
    .chirpui-glow-card__glow,
    .chirpui-spotlight-card__spotlight,
    .chirpui-dock__item,
    .chirpui-typewriter__text,
    .chirpui-glitch,
    .chirpui-glitch::before,
    .chirpui-glitch::after,
    .chirpui-neon,
    .chirpui-aurora__blob,
    .chirpui-sparkle__star,
    .chirpui-confetti__piece,
    .chirpui-orbit__item,
    .chirpui-wobble,
    .chirpui-jello,
    .chirpui-rubber-band,
    .chirpui-bounce-in,
    .chirpui-symbol-rain__drop,
    .chirpui-holy-light__mote,
    .chirpui-rune-field__rune,
    .chirpui-constellation__star,
    .chirpui-ascii-border--spin .chirpui-ascii-border__corner,
    .chirpui-ascii-divider--spin .chirpui-ascii-divider__glyph,
    .chirpui-ascii-divider--spin-reverse .chirpui-ascii-divider__glyph,
    .chirpui-ascii-divider--spin-drift .chirpui-ascii-divider__glyph,
    .chirpui-ascii-spinner__char,
    .chirpui-ascii-skeleton,
    .chirpui-ascii-skeleton__fill,
    .chirpui-ascii-skeleton__line {
        animation: none !important;
        transition: none !important;
    }
    .chirpui-text-reveal { clip-path: none; }
    .chirpui-number-ticker__value { --chirpui-num: var(--chirpui-num-target, 0); }
    .chirpui-typewriter__text { width: 100%; border-color: transparent; }
}


/* ==========================================================================
   Shimmer Button
   ========================================================================== */

.chirpui-shimmer-btn {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--chirpui-spacing-xs);
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-md);
    font-size: var(--chirpui-ui-sm);
    font-weight: 500;
    color: var(--chirpui-text);
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
    overflow: hidden;
    cursor: pointer;
    transition: background var(--chirpui-transition);
}
.chirpui-shimmer-btn:hover { background: var(--chirpui-surface-alt); }
.chirpui-shimmer-btn__shimmer {
    position: absolute;
    inset: 0;
    background: linear-gradient(
        90deg,
        var(--chirpui-shimmer-from),
        var(--chirpui-shimmer-via),
        var(--chirpui-shimmer-to)
    );
    animation: chirpui-shimmer 2s var(--chirpui-ease-standard) infinite;
    pointer-events: none;
}
.chirpui-shimmer-btn--primary {
    background: var(--chirpui-accent);
    color: var(--chirpui-bg);
    border-color: var(--chirpui-accent);
}
.chirpui-shimmer-btn--primary:hover { background: var(--chirpui-accent-hover); }
.chirpui-shimmer-btn--sm { padding: var(--chirpui-spacing-2xs) var(--chirpui-spacing-sm); font-size: var(--chirpui-ui-xs); }
.chirpui-shimmer-btn--lg { padding: var(--chirpui-spacing-sm) var(--chirpui-spacing-lg); font-size: var(--chirpui-ui-base); }


/* ==========================================================================
   Ripple Button
   ========================================================================== */

.chirpui-ripple-btn {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--chirpui-spacing-xs);
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-md);
    font-size: var(--chirpui-ui-sm);
    font-weight: 500;
    color: var(--chirpui-text);
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
    overflow: hidden;
    cursor: pointer;
    transition: background var(--chirpui-transition);
}
.chirpui-ripple-btn:hover { background: var(--chirpui-surface-alt); }
.chirpui-ripple-btn__ripple {
    position: absolute;
    border-radius: 50%;
    background: var(--chirpui-ripple-color);
    transform: scale(0);
    animation: chirpui-ripple-expand var(--chirpui-motion-extra-slow) var(--chirpui-ease-decel) forwards;
    pointer-events: none;
}
.chirpui-ripple-btn--primary {
    background: var(--chirpui-accent);
    color: var(--chirpui-bg);
    border-color: var(--chirpui-accent);
}
.chirpui-ripple-btn--primary:hover { background: var(--chirpui-accent-hover); }
.chirpui-ripple-btn--sm { padding: var(--chirpui-spacing-2xs) var(--chirpui-spacing-sm); font-size: var(--chirpui-ui-xs); }
.chirpui-ripple-btn--lg { padding: var(--chirpui-spacing-sm) var(--chirpui-spacing-lg); font-size: var(--chirpui-ui-base); }


/* ==========================================================================
   Border Beam
   ========================================================================== */

.chirpui-border-beam {
    position: relative;
    overflow: hidden;
    border-radius: var(--chirpui-radius);
    padding: 1px;
}
.chirpui-border-beam__beam {
    position: absolute;
    inset: 0;
    border-radius: inherit;
    background: conic-gradient(from var(--chirpui-beam-angle, 0deg), transparent 60%, var(--chirpui-beam-color) 80%, transparent 100%);
    animation: chirpui-border-beam-rotate var(--chirpui-motion-crawl) linear infinite;
    pointer-events: none;
    z-index: 0;
}
.chirpui-border-beam__content {
    position: relative;
    background: var(--chirpui-surface);
    border-radius: calc(var(--chirpui-radius) - 1px);
    z-index: 1;
}
.chirpui-border-beam--accent .chirpui-border-beam__beam { --chirpui-beam-color: var(--chirpui-accent); }
.chirpui-border-beam--success .chirpui-border-beam__beam { --chirpui-beam-color: var(--chirpui-success); }
.chirpui-border-beam--warning .chirpui-border-beam__beam { --chirpui-beam-color: var(--chirpui-warning); }


/* ==========================================================================
   Notification Dot
   ========================================================================== */

.chirpui-notification-dot {
    position: relative;
    display: inline-flex;
}
.chirpui-notification-dot__dot {
    position: absolute;
    top: -2px;
    right: -2px;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--chirpui-error);
    z-index: 1;
}
.chirpui-notification-dot__ping {
    position: absolute;
    top: -2px;
    right: -2px;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--chirpui-error);
    animation: chirpui-pulse-ring 1.5s var(--chirpui-ease-decel) infinite;
    z-index: 0;
}
.chirpui-notification-dot--success .chirpui-notification-dot__dot,
.chirpui-notification-dot--success .chirpui-notification-dot__ping { background: var(--chirpui-success); }
.chirpui-notification-dot--warning .chirpui-notification-dot__dot,
.chirpui-notification-dot--warning .chirpui-notification-dot__ping { background: var(--chirpui-warning); }
.chirpui-notification-dot--sm .chirpui-notification-dot__dot,
.chirpui-notification-dot--sm .chirpui-notification-dot__ping { width: 6px; height: 6px; top: -1px; right: -1px; }
.chirpui-notification-dot--lg .chirpui-notification-dot__dot,
.chirpui-notification-dot--lg .chirpui-notification-dot__ping { width: 12px; height: 12px; top: -3px; right: -3px; }


/* ==========================================================================
   Number Ticker
   ========================================================================== */

.chirpui-number-ticker {
    display: inline-block;
}
.chirpui-number-ticker__value {
    font-variant-numeric: tabular-nums;
    counter-reset: chirpui-num var(--chirpui-num);
    animation: chirpui-count-up 1.5s var(--chirpui-ease-decel) forwards;
}
.chirpui-number-ticker__value::after {
    content: counter(chirpui-num);
}
.chirpui-number-ticker--mono { font-family: var(--chirpui-font-mono, ui-monospace, monospace); }
.chirpui-number-ticker--sm { font-size: var(--chirpui-ui-sm); }
.chirpui-number-ticker--md { font-size: var(--chirpui-ui-base); }
.chirpui-number-ticker--lg { font-size: var(--chirpui-ui-lg); }
.chirpui-number-ticker--xl { font-size: var(--chirpui-prose-2xl); }


/* ==========================================================================
   Marquee
   ========================================================================== */

.chirpui-marquee {
    overflow: hidden;
    position: relative;
    width: 100%;
}
.chirpui-marquee__track {
    display: flex;
    gap: var(--chirpui-spacing-lg);
    width: max-content;
    animation: chirpui-marquee 20s linear infinite;
}
.chirpui-marquee--reverse .chirpui-marquee__track {
    animation-direction: reverse;
}
.chirpui-marquee--fast .chirpui-marquee__track { animation-duration: 10s; }
.chirpui-marquee--slow .chirpui-marquee__track { animation-duration: 40s; }
.chirpui-marquee:hover .chirpui-marquee__track {
    animation-play-state: paused;
}
.chirpui-marquee__fade {
    position: absolute;
    top: 0;
    bottom: 0;
    width: 4rem;
    z-index: 1;
    pointer-events: none;
}
.chirpui-marquee__fade--start {
    left: 0;
    background: linear-gradient(to right, var(--chirpui-bg), transparent);
}
.chirpui-marquee__fade--end {
    right: 0;
    background: linear-gradient(to left, var(--chirpui-bg), transparent);
}


/* ==========================================================================
   Meteor Effect
   ========================================================================== */

.chirpui-meteor {
    position: relative;
    overflow: hidden;
}
.chirpui-meteor__streak {
    position: absolute;
    top: 0;
    left: 50%;
    width: 2px;
    height: 80px;
    background: linear-gradient(to bottom, var(--chirpui-beam-color), transparent);
    border-radius: 999px;
    animation: chirpui-meteor 3s linear infinite;
    opacity: 0;
}
.chirpui-meteor__streak:nth-child(2) { animation-delay: 0.8s; left: 30%; height: 60px; }
.chirpui-meteor__streak:nth-child(3) { animation-delay: 1.6s; left: 70%; height: 100px; }
.chirpui-meteor__streak:nth-child(4) { animation-delay: 2.4s; left: 15%; height: 50px; }
.chirpui-meteor--accent .chirpui-meteor__streak { --chirpui-beam-color: var(--chirpui-accent); }
.chirpui-meteor--muted .chirpui-meteor__streak { --chirpui-beam-color: var(--chirpui-text-muted); }


/* ==========================================================================
   Text Reveal
   ========================================================================== */

.chirpui-text-reveal {
    animation: chirpui-text-reveal 0.8s var(--chirpui-ease-decel) forwards;
    clip-path: inset(0 100% 0 0);
}
.chirpui-text-reveal--gradient {
    background: linear-gradient(90deg, var(--chirpui-accent), var(--chirpui-accent-bright));
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
}


/* ==========================================================================
   Gradient Text
   ========================================================================== */

.chirpui-gradient-text {
    background: linear-gradient(135deg, var(--chirpui-accent), var(--chirpui-accent-bright));
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
    display: inline;
}
.chirpui-gradient-text--animated {
    background-size: 200% 200%;
    animation: chirpui-gradient-shift 3s ease infinite;
}


/* ==========================================================================
   Glow Card
   ========================================================================== */

.chirpui-glow-card {
    position: relative;
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-lg);
    overflow: hidden;
    padding: var(--chirpui-spacing-md);
}
.chirpui-glow-card__glow {
    position: absolute;
    inset: 0;
    opacity: 0;
    transition: opacity var(--chirpui-motion-slow) var(--chirpui-ease-standard);
    background: radial-gradient(
        circle at var(--chirpui-mouse-x, 50%) var(--chirpui-mouse-y, 50%),
        var(--chirpui-glow-color),
        transparent 60%
    );
    pointer-events: none;
    z-index: 0;
}
.chirpui-glow-card:hover .chirpui-glow-card__glow { opacity: 1; }
.chirpui-glow-card__content {
    position: relative;
    z-index: 1;
}
.chirpui-glow-card--accent { --chirpui-glow-color: color-mix(in srgb, var(--chirpui-accent) 30%, transparent); }
.chirpui-glow-card--muted { --chirpui-glow-color: color-mix(in srgb, var(--chirpui-text-muted) 20%, transparent); }


/* ==========================================================================
   Spotlight Card
   ========================================================================== */

.chirpui-spotlight-card {
    position: relative;
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-lg);
    overflow: hidden;
    padding: var(--chirpui-spacing-md);
}
.chirpui-spotlight-card__spotlight {
    position: absolute;
    /* Force square so the rotation stays circular, not rectangular */
    width: 200%;
    aspect-ratio: 1;
    top: 50%;
    left: 50%;
    translate: -50% -50%;
    background: radial-gradient(circle at 50% 50%, var(--chirpui-glow-color), transparent 50%);
    animation: chirpui-spotlight-rotate 8s linear infinite;
    pointer-events: none;
    z-index: 0;
    opacity: 0.4;
}
.chirpui-spotlight-card__content {
    position: relative;
    z-index: 1;
}
.chirpui-spotlight-card--accent .chirpui-spotlight-card__spotlight {
    background: radial-gradient(circle at 50% 50%, color-mix(in srgb, var(--chirpui-accent) 40%, transparent), transparent 50%);
}


/* ==========================================================================
   Particle Background
   ========================================================================== */

.chirpui-particle-bg {
    position: relative;
    overflow: hidden;
}
.chirpui-particle-bg__canvas {
    position: absolute;
    inset: 0;
    pointer-events: none;
    z-index: 0;
}
.chirpui-particle-bg__dot {
    position: absolute;
    width: 3px;
    height: 3px;
    border-radius: 50%;
    background: var(--chirpui-glow-color);
    opacity: 0.5;
    animation: chirpui-float 4s var(--chirpui-ease-standard) infinite;
}
.chirpui-particle-bg__dot:nth-child(2) { animation-delay: 0.5s; animation-duration: 5s; }
.chirpui-particle-bg__dot:nth-child(3) { animation-delay: 1.0s; animation-duration: 3.5s; }
.chirpui-particle-bg__dot:nth-child(4) { animation-delay: 1.5s; animation-duration: 4.5s; }
.chirpui-particle-bg__dot:nth-child(5) { animation-delay: 2.0s; animation-duration: 6s; }
.chirpui-particle-bg__dot:nth-child(6) { animation-delay: 2.5s; animation-duration: 3s; }
.chirpui-particle-bg__dot:nth-child(7) { animation-delay: 3.0s; animation-duration: 5.5s; }
.chirpui-particle-bg__dot:nth-child(8) { animation-delay: 3.5s; animation-duration: 4s; }
.chirpui-particle-bg__content {
    position: relative;
    z-index: 1;
}
.chirpui-particle-bg--accent .chirpui-particle-bg__dot { background: var(--chirpui-accent); }
.chirpui-particle-bg--muted .chirpui-particle-bg__dot { background: var(--chirpui-text-muted); opacity: 0.3; }


/* ==========================================================================
   Animated Counter
   ========================================================================== */

.chirpui-animated-counter {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-2xs);
}
.chirpui-animated-counter__value {
    font-size: var(--chirpui-prose-2xl);
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    counter-reset: chirpui-num var(--chirpui-num);
    animation: chirpui-count-up 1.8s var(--chirpui-ease-decel) forwards;
}
.chirpui-animated-counter__value::after {
    content: counter(chirpui-num);
}
.chirpui-animated-counter__prefix::after {
    content: attr(data-prefix);
}
.chirpui-animated-counter__label {
    font-size: var(--chirpui-ui-sm);
    color: var(--chirpui-text-muted);
}
.chirpui-animated-counter--mono .chirpui-animated-counter__value {
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
}


/* ==========================================================================
   Pulsing Button
   ========================================================================== */

.chirpui-pulsing-btn {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--chirpui-spacing-xs);
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-md);
    font-size: var(--chirpui-ui-sm);
    font-weight: 500;
    color: var(--chirpui-bg);
    background: var(--chirpui-accent);
    border: none;
    border-radius: var(--chirpui-radius);
    cursor: pointer;
    transition: background var(--chirpui-transition);
}
.chirpui-pulsing-btn:hover { background: var(--chirpui-accent-hover); }
.chirpui-pulsing-btn__ring {
    position: absolute;
    inset: 0;
    border-radius: inherit;
    background: var(--chirpui-accent);
    animation: chirpui-pulse-ring 2s var(--chirpui-ease-decel) infinite;
    z-index: -1;
}


/* ==========================================================================
   Bento Grid
   ========================================================================== */

.chirpui-bento {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--chirpui-spacing-md);
}
.chirpui-bento__item {
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-lg);
    padding: var(--chirpui-spacing-md);
    min-height: 120px;
}
.chirpui-bento__item--span-2 { grid-column: span 2; }
.chirpui-bento__item--span-row { grid-row: span 2; }
.chirpui-bento__item--span-full { grid-column: 1 / -1; }
@media (max-width: 768px) {
    .chirpui-bento { grid-template-columns: 1fr; }
    .chirpui-bento__item--span-2 { grid-column: span 1; }
}


/* ==========================================================================
   Floating Dock
   ========================================================================== */

.chirpui-dock {
    display: flex;
    align-items: flex-end;
    justify-content: center;
    gap: var(--chirpui-spacing-xs);
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-md);
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-2xl);
    box-shadow: var(--chirpui-shadow-lg);
}
.chirpui-dock__item {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    border-radius: var(--chirpui-radius);
    color: var(--chirpui-text-muted);
    background: transparent;
    border: none;
    cursor: pointer;
    transition: transform var(--chirpui-motion-fast) var(--chirpui-ease-spring),
                color var(--chirpui-motion-fast);
}
.chirpui-dock__item:hover {
    transform: scale(1.4) translateY(-8px);
    color: var(--chirpui-text);
}
.chirpui-dock__item--active {
    color: var(--chirpui-accent);
}
.chirpui-dock__indicator {
    position: absolute;
    bottom: -4px;
    left: 50%;
    transform: translateX(-50%);
    width: 4px;
    height: 4px;
    border-radius: 50%;
    background: var(--chirpui-accent);
}
.chirpui-dock--glass {
    background: color-mix(in srgb, var(--chirpui-surface) 70%, transparent);
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
}
.chirpui-dock--sm .chirpui-dock__item { width: 32px; height: 32px; }
.chirpui-dock--lg .chirpui-dock__item { width: 48px; height: 48px; }


/* ==========================================================================
   Animated Stat Card (composite)
   ========================================================================== */

.chirpui-animated-stat-card {
    display: flex;
    flex-direction: column;
    gap: var(--chirpui-spacing-xs);
    padding: var(--chirpui-spacing-md);
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius-lg);
}
.chirpui-animated-stat-card__trend {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-2xs);
    font-size: var(--chirpui-ui-xs);
    font-weight: 500;
    color: var(--chirpui-text-muted);
}
.chirpui-animated-stat-card__trend--up { color: var(--chirpui-success); }
.chirpui-animated-stat-card__trend--down { color: var(--chirpui-error); }


/* ==========================================================================
   Hero Effects (composite wrapper)
   ========================================================================== */

.chirpui-hero-effects {
    min-height: 400px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    padding: var(--chirpui-spacing-2xl) var(--chirpui-spacing-lg);
}


/* ==========================================================================
   Marquee Item
   ========================================================================== */

.chirpui-marquee__item {
    display: inline-flex;
    align-items: center;
    white-space: nowrap;
    padding: 0 var(--chirpui-spacing-sm);
    font-size: var(--chirpui-ui-sm);
    color: var(--chirpui-text-muted);
}


/* ==========================================================================
   Tooltip (enhanced with bubble + arrow)
   ========================================================================== */

.chirpui-tooltip {
    position: relative;
    display: inline-flex;
}
.chirpui-tooltip__bubble {
    position: absolute;
    z-index: var(--chirpui-tooltip-z);
    box-sizing: border-box;
    /* Shrink-to-fit uses the narrow tooltip anchor as the containing block; without
       max-content, used width collapses to ~trigger width despite max-width. */
    width: max-content;
    max-width: var(--chirpui-tooltip-max-width);
    padding: var(--chirpui-tooltip-padding);
    border: var(--chirpui-tooltip-border);
    border-radius: var(--chirpui-tooltip-radius);
    background: var(--chirpui-tooltip-bg);
    color: var(--chirpui-tooltip-fg);
    font-family: var(--chirpui-ui-font-family);
    font-size: var(--chirpui-tooltip-font-size);
    font-weight: var(--chirpui-tooltip-font-weight);
    line-height: var(--chirpui-tooltip-line-height);
    text-align: center;
    text-wrap: balance;
    white-space: normal;
    pointer-events: none;
    opacity: 0;
    transform: scale(0.95);
    box-shadow: var(--chirpui-tooltip-shadow);
    transition:
        opacity var(--chirpui-motion-fast) var(--chirpui-ease-decel),
        transform var(--chirpui-motion-fast) var(--chirpui-ease-decel);
}
.chirpui-tooltip__bubble::after {
    content: "";
    position: absolute;
    width: 6px;
    height: 6px;
    box-sizing: border-box;
    background: var(--chirpui-tooltip-bg);
    transform: rotate(45deg);
}
/* Ensure tooltip bubbles escape overflow:hidden ancestors */
.chirpui-tooltip { overflow: visible; }
.chirpui-tooltip:hover .chirpui-tooltip__bubble,
.chirpui-tooltip:focus-within .chirpui-tooltip__bubble {
    opacity: 1;
    transform: scale(1);
}

/* Tooltip positions */
.chirpui-tooltip--top .chirpui-tooltip__bubble {
    bottom: calc(100% + var(--chirpui-tooltip-gap));
    left: 50%;
    transform: translateX(-50%) scale(0.95);
}
.chirpui-tooltip--top:hover .chirpui-tooltip__bubble,
.chirpui-tooltip--top:focus-within .chirpui-tooltip__bubble {
    transform: translateX(-50%) scale(1);
}
.chirpui-tooltip--top .chirpui-tooltip__bubble::after {
    bottom: -3px;
    left: 50%;
    margin-left: -3px;
}

.chirpui-tooltip--bottom .chirpui-tooltip__bubble {
    top: calc(100% + var(--chirpui-tooltip-gap));
    left: 50%;
    transform: translateX(-50%) scale(0.95);
}
.chirpui-tooltip--bottom:hover .chirpui-tooltip__bubble,
.chirpui-tooltip--bottom:focus-within .chirpui-tooltip__bubble {
    transform: translateX(-50%) scale(1);
}
.chirpui-tooltip--bottom .chirpui-tooltip__bubble::after {
    top: -3px;
    left: 50%;
    margin-left: -3px;
}

.chirpui-tooltip--left .chirpui-tooltip__bubble {
    right: calc(100% + var(--chirpui-tooltip-gap));
    top: 50%;
    transform: translateY(-50%) scale(0.95);
}
.chirpui-tooltip--left:hover .chirpui-tooltip__bubble,
.chirpui-tooltip--left:focus-within .chirpui-tooltip__bubble {
    transform: translateY(-50%) scale(1);
}
.chirpui-tooltip--left .chirpui-tooltip__bubble::after {
    right: -3px;
    top: 50%;
    margin-top: -3px;
}

.chirpui-tooltip--right .chirpui-tooltip__bubble {
    left: calc(100% + var(--chirpui-tooltip-gap));
    top: 50%;
    transform: translateY(-50%) scale(0.95);
}
.chirpui-tooltip--right:hover .chirpui-tooltip__bubble,
.chirpui-tooltip--right:focus-within .chirpui-tooltip__bubble {
    transform: translateY(-50%) scale(1);
}
.chirpui-tooltip--right .chirpui-tooltip__bubble::after {
    left: -3px;
    top: 50%;
    margin-top: -3px;
}

@media (prefers-reduced-motion: reduce) {
    .chirpui-tooltip__bubble {
        transition: none;
    }
}

/* ==========================================================================
   Icon Button
   ========================================================================== */

.chirpui-icon-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.25rem;
    height: 2.25rem;
    border-radius: var(--chirpui-radius);
    border: 1px solid var(--chirpui-border);
    background: var(--chirpui-surface);
    color: var(--chirpui-text-muted);
    cursor: pointer;
    transition: background var(--chirpui-transition), color var(--chirpui-transition);
    text-decoration: none;
    font-size: var(--chirpui-ui-sm);
    flex-shrink: 0;
}
.chirpui-icon-btn:hover { background: var(--chirpui-surface-alt); color: var(--chirpui-text); }
.chirpui-icon-btn:focus-visible { box-shadow: 0 0 0 2px var(--chirpui-focus-ring); outline: none; }
.chirpui-icon-btn:disabled, .chirpui-icon-btn[aria-disabled="true"] { opacity: 0.5; cursor: not-allowed; pointer-events: none; }

/* Icon button variants */
.chirpui-icon-btn--primary { background: var(--chirpui-accent); color: var(--chirpui-bg); border-color: var(--chirpui-accent); }
.chirpui-icon-btn--primary:hover { background: var(--chirpui-accent-hover); }
.chirpui-icon-btn--ghost { background: transparent; border-color: transparent; }
.chirpui-icon-btn--ghost:hover { background: var(--chirpui-surface-alt); }
.chirpui-icon-btn--danger { background: transparent; border-color: transparent; color: var(--chirpui-error); }
.chirpui-icon-btn--danger:hover { background: var(--chirpui-error-muted); }

/* Icon button sizes */
.chirpui-icon-btn--sm { width: 1.75rem; height: 1.75rem; font-size: var(--chirpui-ui-xs); }
.chirpui-icon-btn--lg { width: 2.75rem; height: 2.75rem; font-size: var(--chirpui-ui-base); }


/* ==========================================================================
   Segmented Control
   ========================================================================== */

.chirpui-segmented {
    display: inline-flex;
    background: var(--chirpui-surface-alt);
    border-radius: var(--chirpui-radius);
    padding: 2px;
    gap: 2px;
}
.chirpui-segmented__option {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--chirpui-spacing-2xs);
    padding: var(--chirpui-spacing-2xs) var(--chirpui-spacing-sm);
    font-size: var(--chirpui-ui-sm);
    font-weight: 500;
    color: var(--chirpui-text-muted);
    border-radius: calc(var(--chirpui-radius) - 2px);
    cursor: pointer;
    transition: background var(--chirpui-transition), color var(--chirpui-transition),
                box-shadow var(--chirpui-transition);
    user-select: none;
}
.chirpui-segmented__option:hover { color: var(--chirpui-text); }
.chirpui-segmented__option--active,
.chirpui-segmented__option:has(input:checked) {
    background: var(--chirpui-surface);
    color: var(--chirpui-text);
    box-shadow: var(--chirpui-shadow-sm);
}
.chirpui-segmented__icon { font-size: 0.85em; }

/* Segmented sizes */
.chirpui-segmented--sm .chirpui-segmented__option { padding: 1px var(--chirpui-spacing-xs); font-size: var(--chirpui-ui-xs); }
.chirpui-segmented--lg .chirpui-segmented__option { padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-md); font-size: var(--chirpui-ui-base); }


/* ==========================================================================
   Split Panel
   ========================================================================== */

.chirpui-split-panel {
    display: flex;
    width: 100%;
    height: 100%;
    min-height: 0;
    overflow: hidden;
}
.chirpui-split-panel--vertical { flex-direction: column; }
.chirpui-split-panel__pane {
    overflow: auto;
    min-width: 0;
    min-height: 0;
}
.chirpui-split-panel__pane--second {
    flex: 1;
}
.chirpui-split-panel__handle {
    flex-shrink: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--chirpui-surface-alt);
    transition: background var(--chirpui-motion-fast);
    cursor: col-resize;
    width: 6px;
}
.chirpui-split-panel--vertical .chirpui-split-panel__handle {
    cursor: row-resize;
    width: auto;
    height: 6px;
}
.chirpui-split-panel__handle:hover { background: var(--chirpui-border); }
.chirpui-split-panel--dragging .chirpui-split-panel__handle { background: var(--chirpui-accent); }
.chirpui-split-panel__handle-grip {
    width: 2px;
    height: 20px;
    border-radius: 1px;
    background: var(--chirpui-text-muted);
    opacity: 0.5;
}
.chirpui-split-panel--vertical .chirpui-split-panel__handle-grip {
    width: 20px;
    height: 2px;
}
.chirpui-split-panel--dragging { user-select: none; }


/* ==========================================================================
   Typewriter — step-based text reveal with blinking cursor
   ========================================================================== */

.chirpui-typewriter {
    display: inline-block;
}
.chirpui-typewriter__text {
    display: inline-block;
    overflow: hidden;
    white-space: nowrap;
    border-right: 2px solid currentColor;
    width: 0;
    animation:
        chirpui-typewriter var(--chirpui-typewriter-duration, 2s) steps(var(--chirpui-typewriter-steps, 30), end) forwards,
        chirpui-blink-caret 0.75s step-end infinite;
}
.chirpui-typewriter--no-cursor .chirpui-typewriter__text {
    border-right: none;
}
.chirpui-typewriter--delay-1 .chirpui-typewriter__text { animation-delay: 0.5s; }
.chirpui-typewriter--delay-2 .chirpui-typewriter__text { animation-delay: 1s; }
.chirpui-typewriter--delay-3 .chirpui-typewriter__text { animation-delay: 1.5s; }
.chirpui-typewriter--fast .chirpui-typewriter__text { --chirpui-typewriter-duration: 1s; }
.chirpui-typewriter--slow .chirpui-typewriter__text { --chirpui-typewriter-duration: 4s; }


/* ==========================================================================
   Glitch Text — RGB-split distortion effect
   ========================================================================== */

.chirpui-glitch {
    position: relative;
    display: inline-block;
    font-weight: 700;
    color: var(--chirpui-text);
}
.chirpui-glitch::before,
.chirpui-glitch::after {
    content: attr(data-text);
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    pointer-events: none;
}
.chirpui-glitch::before {
    color: #0ff;
    animation: chirpui-glitch 3s infinite linear alternate-reverse;
    mix-blend-mode: difference;
}
.chirpui-glitch::after {
    color: #f0f;
    animation: chirpui-glitch-alt 2s infinite linear alternate-reverse;
    mix-blend-mode: difference;
}
.chirpui-glitch--subtle::before { opacity: 0.5; }
.chirpui-glitch--subtle::after { opacity: 0.5; }
.chirpui-glitch--intense::before,
.chirpui-glitch--intense::after {
    filter: blur(0.5px);
}
.chirpui-glitch--intense::before { animation-duration: 1.5s; }
.chirpui-glitch--intense::after { animation-duration: 1s; }


/* ==========================================================================
   Neon Text — layered text-shadow glow
   ========================================================================== */

.chirpui-neon {
    display: inline-block;
    font-weight: 700;
    color: #fff;
    text-shadow:
        0 0 4px currentColor,
        0 0 11px currentColor,
        0 0 19px currentColor,
        0 0 40px var(--chirpui-neon-color, #0ff),
        0 0 80px var(--chirpui-neon-color, #0ff),
        0 0 90px var(--chirpui-neon-color, #0ff);
}
.chirpui-neon--cyan { --chirpui-neon-color: #0ff; }
.chirpui-neon--magenta { --chirpui-neon-color: #f0f; }
.chirpui-neon--green { --chirpui-neon-color: #0f0; }
.chirpui-neon--orange { --chirpui-neon-color: #f80; }
.chirpui-neon--blue { --chirpui-neon-color: #08f; }
.chirpui-neon--red { --chirpui-neon-color: #f22; }
.chirpui-neon--flicker {
    animation: chirpui-neon-flicker 4s infinite;
}
.chirpui-neon--pulse {
    animation: chirpui-neon-pulse 2s ease-in-out infinite;
}


/* ==========================================================================
   Aurora Background — drifting gradient blobs
   ========================================================================== */

.chirpui-aurora {
    position: relative;
    overflow: hidden;
    isolation: isolate;
}
.chirpui-aurora__blobs {
    position: absolute;
    inset: -50%;
    z-index: -1;
    filter: blur(80px);
    opacity: 0.5;
}
.chirpui-aurora__blob {
    position: absolute;
    border-radius: 50%;
    width: 50%;
    height: 50%;
}
.chirpui-aurora__blob:nth-child(1) {
    top: 10%;
    left: 20%;
    background: var(--chirpui-aurora-1, color-mix(in srgb, var(--chirpui-accent) 60%, #0ff));
    animation: chirpui-aurora-drift-1 15s ease-in-out infinite;
}
.chirpui-aurora__blob:nth-child(2) {
    top: 40%;
    left: 50%;
    background: var(--chirpui-aurora-2, color-mix(in srgb, var(--chirpui-accent) 60%, #f0f));
    animation: chirpui-aurora-drift-2 20s ease-in-out infinite;
}
.chirpui-aurora__blob:nth-child(3) {
    top: 60%;
    left: 10%;
    background: var(--chirpui-aurora-3, color-mix(in srgb, var(--chirpui-accent) 40%, #0f0));
    animation: chirpui-aurora-drift-1 25s ease-in-out infinite reverse;
}
.chirpui-aurora--intense .chirpui-aurora__blobs { opacity: 0.7; filter: blur(60px); }
.chirpui-aurora--subtle .chirpui-aurora__blobs { opacity: 0.25; filter: blur(120px); }
.chirpui-aurora__content {
    position: relative;
    z-index: 1;
}


/* ==========================================================================
   Scanline Overlay — CRT/retro line effect
   ========================================================================== */

.chirpui-scanline {
    position: relative;
    overflow: hidden;
}
.chirpui-scanline::after {
    content: "";
    position: absolute;
    inset: 0;
    background: repeating-linear-gradient(
        0deg,
        transparent,
        transparent 1px,
        rgba(0, 0, 0, 0.03) 1px,
        rgba(0, 0, 0, 0.03) 2px
    );
    pointer-events: none;
    z-index: 10;
}
.chirpui-scanline--heavy::after {
    background: repeating-linear-gradient(
        0deg,
        transparent,
        transparent 1px,
        rgba(0, 0, 0, 0.08) 1px,
        rgba(0, 0, 0, 0.08) 2px
    );
}
.chirpui-scanline--crt::after {
    background: repeating-linear-gradient(
        0deg,
        transparent,
        transparent 2px,
        rgba(0, 0, 0, 0.05) 2px,
        rgba(0, 0, 0, 0.05) 4px
    );
    mix-blend-mode: multiply;
}
.chirpui-scanline--crt {
    border-radius: var(--chirpui-radius-lg);
    box-shadow: inset 0 0 60px rgba(0, 0, 0, 0.15);
}


/* ==========================================================================
   Grain Overlay — film grain texture
   ========================================================================== */

.chirpui-grain {
    position: relative;
    overflow: hidden;
}
.chirpui-grain::after {
    content: "";
    position: absolute;
    inset: -50%;
    width: 200%;
    height: 200%;
    background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
    background-size: 128px 128px;
    opacity: 0.08;
    pointer-events: none;
    z-index: 10;
    mix-blend-mode: overlay;
}
.chirpui-grain--heavy::after { opacity: 0.18; }
.chirpui-grain--subtle::after { opacity: 0.04; }
.chirpui-grain--animated::after {
    animation: chirpui-float 0.3s steps(2) infinite;
}


/* ==========================================================================
   Orbit — items rotating around a center
   ========================================================================== */

.chirpui-orbit {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    width: var(--chirpui-orbit-size, 200px);
    height: var(--chirpui-orbit-size, 200px);
}
.chirpui-orbit__center {
    position: absolute;
    z-index: 2;
    display: flex;
    align-items: center;
    justify-content: center;
}
.chirpui-orbit__ring {
    position: absolute;
    inset: 0;
    border: 1px dashed var(--chirpui-border);
    border-radius: 50%;
}
.chirpui-orbit__item {
    position: absolute;
    top: 50%;
    left: 50%;
    margin-top: -12px;
    margin-left: -12px;
    width: 24px;
    height: 24px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background: var(--chirpui-surface);
    border: 1px solid var(--chirpui-border);
    font-size: var(--chirpui-font-sm);
    animation: chirpui-orbit var(--chirpui-orbit-duration, 12s) linear infinite;
    --chirpui-orbit-radius: calc(var(--chirpui-orbit-size, 200px) / 2 - 12px);
}
.chirpui-orbit__item:nth-child(1) { animation-delay: 0s; }
.chirpui-orbit__item:nth-child(2) { animation-delay: calc(var(--chirpui-orbit-duration, 12s) * -0.25); }
.chirpui-orbit__item:nth-child(3) { animation-delay: calc(var(--chirpui-orbit-duration, 12s) * -0.5); }
.chirpui-orbit__item:nth-child(4) { animation-delay: calc(var(--chirpui-orbit-duration, 12s) * -0.75); }
.chirpui-orbit__item:nth-child(5) { animation-delay: calc(var(--chirpui-orbit-duration, 12s) * -0.2); }
.chirpui-orbit__item:nth-child(6) { animation-delay: calc(var(--chirpui-orbit-duration, 12s) * -0.4); }
.chirpui-orbit__item:nth-child(7) { animation-delay: calc(var(--chirpui-orbit-duration, 12s) * -0.6); }
.chirpui-orbit__item:nth-child(8) { animation-delay: calc(var(--chirpui-orbit-duration, 12s) * -0.8); }
.chirpui-orbit--sm { --chirpui-orbit-size: 120px; }
.chirpui-orbit--lg { --chirpui-orbit-size: 300px; }
.chirpui-orbit--xl { --chirpui-orbit-size: 400px; }
.chirpui-orbit--fast { --chirpui-orbit-duration: 6s; }
.chirpui-orbit--slow { --chirpui-orbit-duration: 20s; }
.chirpui-orbit--reverse .chirpui-orbit__item { animation-direction: reverse; }


/* ==========================================================================
   Sparkle — staggered star twinkles
   ========================================================================== */

.chirpui-sparkle {
    position: relative;
    display: inline-block;
}
.chirpui-sparkle__star {
    position: absolute;
    width: 10px;
    height: 10px;
    pointer-events: none;
    z-index: 2;
    animation: chirpui-sparkle var(--chirpui-sparkle-duration, 1.5s) ease-in-out infinite;
}
.chirpui-sparkle__star::before,
.chirpui-sparkle__star::after {
    content: "";
    position: absolute;
    background: var(--chirpui-sparkle-color, var(--chirpui-accent));
    border-radius: 2px;
}
.chirpui-sparkle__star::before {
    width: 100%;
    height: 2px;
    top: 50%;
    transform: translateY(-50%);
}
.chirpui-sparkle__star::after {
    height: 100%;
    width: 2px;
    left: 50%;
    transform: translateX(-50%);
}
.chirpui-sparkle__star:nth-child(1) { top: 0; left: 10%; animation-delay: 0s; }
.chirpui-sparkle__star:nth-child(2) { top: 20%; right: 5%; animation-delay: 0.4s; }
.chirpui-sparkle__star:nth-child(3) { bottom: 10%; left: 30%; animation-delay: 0.8s; }
.chirpui-sparkle__star:nth-child(4) { top: 40%; left: 60%; animation-delay: 1.2s; }
.chirpui-sparkle__star:nth-child(5) { bottom: 30%; right: 15%; animation-delay: 0.2s; }
.chirpui-sparkle__star:nth-child(6) { top: 5%; left: 70%; animation-delay: 0.6s; }
.chirpui-sparkle--gold { --chirpui-sparkle-color: #ffd700; }
.chirpui-sparkle--white { --chirpui-sparkle-color: #fff; }
.chirpui-sparkle--rainbow .chirpui-sparkle__star:nth-child(1) { --chirpui-sparkle-color: #f44; }
.chirpui-sparkle--rainbow .chirpui-sparkle__star:nth-child(2) { --chirpui-sparkle-color: #fa0; }
.chirpui-sparkle--rainbow .chirpui-sparkle__star:nth-child(3) { --chirpui-sparkle-color: #0c0; }
.chirpui-sparkle--rainbow .chirpui-sparkle__star:nth-child(4) { --chirpui-sparkle-color: #0cf; }
.chirpui-sparkle--rainbow .chirpui-sparkle__star:nth-child(5) { --chirpui-sparkle-color: #c0f; }
.chirpui-sparkle--rainbow .chirpui-sparkle__star:nth-child(6) { --chirpui-sparkle-color: #f0c; }


/* ==========================================================================
   Confetti — Alpine-triggered celebration burst
   ========================================================================== */

.chirpui-confetti {
    position: fixed;
    inset: 0;
    pointer-events: none;
    z-index: 9999;
    overflow: hidden;
}
.chirpui-confetti__piece {
    position: absolute;
    top: -10%;
    width: 10px;
    height: 10px;
    opacity: 0;
}
.chirpui-confetti__piece--active {
    animation:
        chirpui-confetti-fall var(--chirpui-confetti-duration, 3s) ease-in forwards,
        chirpui-confetti-sway var(--chirpui-confetti-sway, 1.5s) ease-in-out infinite;
}
.chirpui-confetti__piece--square { border-radius: 0; }
.chirpui-confetti__piece--circle { border-radius: 50%; }
.chirpui-confetti__piece--strip {
    width: 4px;
    height: 14px;
    border-radius: 2px;
}


/* ==========================================================================
   Wobble/Jello/Rubber-band — micro-interaction utilities
   ========================================================================== */

.chirpui-wobble { animation: chirpui-wobble 1s ease-in-out; }
.chirpui-jello { animation: chirpui-jello 1s ease-in-out; }
.chirpui-rubber-band { animation: chirpui-rubber-band 1s ease-in-out; }
.chirpui-bounce-in { animation: chirpui-bounce-in 0.6s ease-out; }

/* Hover-triggered variants */
.chirpui-hover-wobble:hover { animation: chirpui-wobble 1s ease-in-out; }
.chirpui-hover-jello:hover { animation: chirpui-jello 1s ease-in-out; }
.chirpui-hover-rubber:hover { animation: chirpui-rubber-band 1s ease-in-out; }

/* Click-triggered (via :active or Alpine) */
.chirpui-click-wobble:active { animation: chirpui-wobble 0.6s ease-in-out; }
.chirpui-click-jello:active { animation: chirpui-jello 0.6s ease-in-out; }


/* ==========================================================================
   Symbol Rain — cascading ASCII characters
   ========================================================================== */

.chirpui-symbol-rain {
    position: relative;
    overflow: hidden;
}
.chirpui-symbol-rain__canvas {
    position: absolute;
    inset: 0;
    pointer-events: none;
    z-index: 0;
}
.chirpui-symbol-rain__drop {
    position: absolute;
    top: 0;
    font-family: var(--chirpui-ascii-font);
    font-size: 0.875rem;
    color: var(--chirpui-symbol-rain-color, var(--chirpui-accent));
    opacity: 0;
    animation: chirpui-symbol-rain-fall var(--chirpui-symbol-rain-speed, 4s) linear infinite;
}
.chirpui-symbol-rain__drop:nth-child(1) { animation-delay: 0s; animation-duration: 3.5s; }
.chirpui-symbol-rain__drop:nth-child(2) { animation-delay: 0.7s; animation-duration: 4.2s; font-size: 0.75rem; }
.chirpui-symbol-rain__drop:nth-child(3) { animation-delay: 1.3s; animation-duration: 3.8s; }
.chirpui-symbol-rain__drop:nth-child(4) { animation-delay: 2.0s; animation-duration: 5s; font-size: 1rem; }
.chirpui-symbol-rain__drop:nth-child(5) { animation-delay: 0.4s; animation-duration: 4.5s; font-size: 0.675rem; }
.chirpui-symbol-rain__drop:nth-child(6) { animation-delay: 1.8s; animation-duration: 3.2s; }
.chirpui-symbol-rain__content {
    position: relative;
    z-index: 1;
}
.chirpui-symbol-rain--accent .chirpui-symbol-rain__drop { --chirpui-symbol-rain-color: var(--chirpui-accent); }
.chirpui-symbol-rain--gold .chirpui-symbol-rain__drop { --chirpui-symbol-rain-color: #ffd700; }
.chirpui-symbol-rain--muted .chirpui-symbol-rain__drop { --chirpui-symbol-rain-color: var(--chirpui-text-muted); opacity: 0.4; }


/* ==========================================================================
   Holy Light — divine ascending sparkles with parallax
   ========================================================================== */

.chirpui-holy-light {
    position: relative;
    overflow: hidden;
    --chirpui-holy-color: #ffd700;
}
.chirpui-holy-light__layers {
    position: absolute;
    inset: 0;
    pointer-events: none;
    z-index: 0;
}
.chirpui-holy-light__layer {
    position: absolute;
    inset: 0;
}
.chirpui-holy-light__mote {
    position: absolute;
    font-family: var(--chirpui-ascii-font);
    color: var(--chirpui-holy-color);
    opacity: 0;
}

/* Far layer — small, slow, faint */
.chirpui-holy-light__layer--far .chirpui-holy-light__mote {
    font-size: 0.5rem;
    animation:
        chirpui-holy-rise-far 8s ease-in-out infinite,
        chirpui-holy-glow-pulse 3s ease-in-out infinite;
}
.chirpui-holy-light__layer--far .chirpui-holy-light__mote:nth-child(2) { animation-delay: 1.5s; }
.chirpui-holy-light__layer--far .chirpui-holy-light__mote:nth-child(3) { animation-delay: 3s; }
.chirpui-holy-light__layer--far .chirpui-holy-light__mote:nth-child(4) { animation-delay: 4.5s; }
.chirpui-holy-light__layer--far .chirpui-holy-light__mote:nth-child(5) { animation-delay: 6s; }

/* Mid layer — medium, moderate speed */
.chirpui-holy-light__layer--mid .chirpui-holy-light__mote {
    font-size: 0.875rem;
    animation:
        chirpui-holy-rise-mid 6s ease-in-out infinite,
        chirpui-holy-glow-pulse 2.5s ease-in-out infinite;
}
.chirpui-holy-light__layer--mid .chirpui-holy-light__mote:nth-child(2) { animation-delay: 1.2s; }
.chirpui-holy-light__layer--mid .chirpui-holy-light__mote:nth-child(3) { animation-delay: 2.4s; }
.chirpui-holy-light__layer--mid .chirpui-holy-light__mote:nth-child(4) { animation-delay: 3.6s; }
.chirpui-holy-light__layer--mid .chirpui-holy-light__mote:nth-child(5) { animation-delay: 4.8s; }

/* Near layer — large, fast, bright */
.chirpui-holy-light__layer--near .chirpui-holy-light__mote {
    font-size: 1.25rem;
    animation:
        chirpui-holy-rise-near 4.5s ease-in-out infinite,
        chirpui-holy-glow-pulse 2s ease-in-out infinite;
}
.chirpui-holy-light__layer--near .chirpui-holy-light__mote:nth-child(2) { animation-delay: 1s; }
.chirpui-holy-light__layer--near .chirpui-holy-light__mote:nth-child(3) { animation-delay: 2.2s; }
.chirpui-holy-light__layer--near .chirpui-holy-light__mote:nth-child(4) { animation-delay: 3.4s; }

.chirpui-holy-light__content {
    position: relative;
    z-index: 1;
}

/* Variants */
.chirpui-holy-light--gold { --chirpui-holy-color: #ffd700; }
.chirpui-holy-light--silver { --chirpui-holy-color: #c0c0c0; }
.chirpui-holy-light--holy { --chirpui-holy-color: #fffacd; }

/* Intensity */
.chirpui-holy-light--intense .chirpui-holy-light__mote { filter: drop-shadow(0 0 6px var(--chirpui-holy-color)); }
.chirpui-holy-light--subtle .chirpui-holy-light__layer--near .chirpui-holy-light__mote { font-size: 0.875rem; }
.chirpui-holy-light--subtle .chirpui-holy-light__layer--mid .chirpui-holy-light__mote { font-size: 0.625rem; }


/* ==========================================================================
   Rune Field — mystical drifting symbols with parallax
   ========================================================================== */

.chirpui-rune-field {
    position: relative;
    overflow: hidden;
    --chirpui-rune-color: var(--chirpui-accent);
    --chirpui-rune-opacity: 0.4;
}
.chirpui-rune-field__layers {
    position: absolute;
    inset: 0;
    pointer-events: none;
    z-index: 0;
}
.chirpui-rune-field__layer {
    position: absolute;
    inset: 0;
}
.chirpui-rune-field__rune {
    position: absolute;
    font-family: var(--chirpui-ascii-font);
    color: var(--chirpui-rune-color);
}

/* Far layer — tiny, slow drift, very faint */
.chirpui-rune-field__layer--far .chirpui-rune-field__rune {
    font-size: 0.625rem;
    --chirpui-rune-opacity: 0.2;
    animation:
        chirpui-rune-drift-far 20s ease-in-out infinite,
        chirpui-rune-pulse 4s ease-in-out infinite;
}
.chirpui-rune-field__layer--far .chirpui-rune-field__rune:nth-child(2) { animation-delay: 3s; }
.chirpui-rune-field__layer--far .chirpui-rune-field__rune:nth-child(3) { animation-delay: 6s; }
.chirpui-rune-field__layer--far .chirpui-rune-field__rune:nth-child(4) { animation-delay: 9s; }
.chirpui-rune-field__layer--far .chirpui-rune-field__rune:nth-child(5) { animation-delay: 12s; }
.chirpui-rune-field__layer--far .chirpui-rune-field__rune:nth-child(6) { animation-delay: 15s; }

/* Mid layer — medium, moderate drift */
.chirpui-rune-field__layer--mid .chirpui-rune-field__rune {
    font-size: 1rem;
    --chirpui-rune-opacity: 0.35;
    animation:
        chirpui-rune-drift-mid 14s ease-in-out infinite,
        chirpui-rune-pulse 3s ease-in-out infinite;
}
.chirpui-rune-field__layer--mid .chirpui-rune-field__rune:nth-child(2) { animation-delay: 2.5s; }
.chirpui-rune-field__layer--mid .chirpui-rune-field__rune:nth-child(3) { animation-delay: 5s; }
.chirpui-rune-field__layer--mid .chirpui-rune-field__rune:nth-child(4) { animation-delay: 7.5s; }
.chirpui-rune-field__layer--mid .chirpui-rune-field__rune:nth-child(5) { animation-delay: 10s; }

/* Near layer — large, visible, pronounced drift */
.chirpui-rune-field__layer--near .chirpui-rune-field__rune {
    font-size: 1.5rem;
    --chirpui-rune-opacity: 0.5;
    animation:
        chirpui-rune-drift-near 10s ease-in-out infinite,
        chirpui-rune-pulse 2.5s ease-in-out infinite;
}
.chirpui-rune-field__layer--near .chirpui-rune-field__rune:nth-child(2) { animation-delay: 2s; }
.chirpui-rune-field__layer--near .chirpui-rune-field__rune:nth-child(3) { animation-delay: 4.5s; }
.chirpui-rune-field__layer--near .chirpui-rune-field__rune:nth-child(4) { animation-delay: 7s; }

.chirpui-rune-field__content {
    position: relative;
    z-index: 1;
}

/* Variants */
.chirpui-rune-field--arcane { --chirpui-rune-color: #a855f7; }
.chirpui-rune-field--frost { --chirpui-rune-color: #67e8f9; }
.chirpui-rune-field--ember { --chirpui-rune-color: #fb923c; }


/* ==========================================================================
   Constellation — twinkling ASCII starfield
   ========================================================================== */

.chirpui-constellation {
    position: relative;
    overflow: hidden;
    --chirpui-star-color: var(--chirpui-text);
    --chirpui-star-base-opacity: 0.3;
}
.chirpui-constellation__field {
    position: absolute;
    inset: 0;
    pointer-events: none;
    z-index: 0;
}
.chirpui-constellation__star {
    position: absolute;
    font-family: var(--chirpui-ascii-font);
    font-size: 0.75rem;
    color: var(--chirpui-star-color);
    opacity: var(--chirpui-star-base-opacity);
    animation:
        chirpui-star-twinkle var(--chirpui-star-twinkle-speed, 3s) ease-in-out infinite,
        chirpui-star-drift 12s ease-in-out infinite;
}
.chirpui-constellation__star:nth-child(2) { animation-delay: 0.5s; font-size: 0.5rem; }
.chirpui-constellation__star:nth-child(3) { animation-delay: 1.2s; font-size: 0.875rem; }
.chirpui-constellation__star:nth-child(4) { animation-delay: 0.3s; }
.chirpui-constellation__star:nth-child(5) { animation-delay: 1.8s; font-size: 0.625rem; }
.chirpui-constellation__star:nth-child(6) { animation-delay: 0.9s; font-size: 1rem; }
.chirpui-constellation__star:nth-child(7) { animation-delay: 2.1s; font-size: 0.5rem; }
.chirpui-constellation__star:nth-child(8) { animation-delay: 1.5s; }
.chirpui-constellation__star:nth-child(9) { animation-delay: 0.6s; font-size: 0.875rem; }
.chirpui-constellation__star:nth-child(10) { animation-delay: 2.4s; font-size: 0.625rem; }
.chirpui-constellation__star:nth-child(11) { animation-delay: 1.1s; }
.chirpui-constellation__star:nth-child(12) { animation-delay: 0.2s; font-size: 1rem; }
.chirpui-constellation__star:nth-child(13) { animation-delay: 1.7s; font-size: 0.5rem; }
.chirpui-constellation__star:nth-child(14) { animation-delay: 2.8s; font-size: 0.875rem; }
.chirpui-constellation__star:nth-child(15) { animation-delay: 0.8s; }
.chirpui-constellation__star:nth-child(16) { animation-delay: 2.0s; font-size: 0.625rem; }
.chirpui-constellation__content {
    position: relative;
    z-index: 1;
}

/* Variants */
.chirpui-constellation--warm { --chirpui-star-color: #fbbf24; }
.chirpui-constellation--cool { --chirpui-star-color: #67e8f9; }
.chirpui-constellation--mono { --chirpui-star-color: var(--chirpui-text-muted); }

/* Density */
.chirpui-constellation--dense { --chirpui-star-base-opacity: 0.4; --chirpui-star-twinkle-speed: 2s; }
.chirpui-constellation--sparse { --chirpui-star-base-opacity: 0.2; --chirpui-star-twinkle-speed: 5s; }


/* ==========================================================================
   ASCII Border — box-drawing character frame
   ========================================================================== */

.chirpui-ascii-border {
    --chirpui-ascii-border-color: var(--chirpui-text-muted);
    font-family: var(--chirpui-ascii-font);
    display: inline-block;
    overflow: hidden;
    min-width: 0;
}
.chirpui-ascii-border__top,
.chirpui-ascii-border__bottom {
    display: flex;
    color: var(--chirpui-ascii-border-color);
    line-height: 1;
    user-select: none;
}
.chirpui-ascii-border__corner {
    flex-shrink: 0;
}
.chirpui-ascii-border__line {
    flex: 1;
    overflow: hidden;
    white-space: nowrap;
    position: relative;
}
/* Fill the horizontal line with the box-drawing character via repeating background */
.chirpui-ascii-border__top .chirpui-ascii-border__line::after,
.chirpui-ascii-border__bottom .chirpui-ascii-border__line::after {
    content: "────────────────────────────────────────────────────────────────────────────────";
    position: absolute;
    inset: 0;
    overflow: hidden;
    color: var(--chirpui-ascii-border-color);
}
.chirpui-ascii-border--double .chirpui-ascii-border__top .chirpui-ascii-border__line::after,
.chirpui-ascii-border--double .chirpui-ascii-border__bottom .chirpui-ascii-border__line::after {
    content: "════════════════════════════════════════════════════════════════════════════════";
}
.chirpui-ascii-border--heavy .chirpui-ascii-border__top .chirpui-ascii-border__line::after,
.chirpui-ascii-border--heavy .chirpui-ascii-border__bottom .chirpui-ascii-border__line::after {
    content: "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━";
}
/* When a glyph is present in the top line, the glyph content takes precedence over the fill */
.chirpui-ascii-border__top .chirpui-ascii-border__line:not(:empty)::after {
    content: none;
}
.chirpui-ascii-border__mid {
    display: flex;
}
.chirpui-ascii-border__side {
    color: var(--chirpui-ascii-border-color);
    line-height: 1;
    user-select: none;
    flex-shrink: 0;
}
.chirpui-ascii-border__content {
    flex: 1;
    padding: var(--chirpui-spacing-sm) var(--chirpui-spacing);
}

/* Momentum spin for border corners */
.chirpui-ascii-border--spin .chirpui-ascii-border__corner {
    display: inline-block;
    animation: chirpui-ascii-momentum 6s cubic-bezier(0.2, 0, 0.1, 1) infinite;
}
.chirpui-ascii-border--spin .chirpui-ascii-border__top .chirpui-ascii-border__corner:nth-child(1) {
    animation-name: chirpui-ascii-momentum;
    animation-duration: 5s;
}
.chirpui-ascii-border--spin .chirpui-ascii-border__top .chirpui-ascii-border__corner:nth-child(3) {
    animation-name: chirpui-ascii-momentum-reverse;
    animation-duration: 7s;
}
.chirpui-ascii-border--spin .chirpui-ascii-border__bottom .chirpui-ascii-border__corner:nth-child(1) {
    animation-name: chirpui-ascii-momentum-drift;
    animation-duration: 8s;
}
.chirpui-ascii-border--spin .chirpui-ascii-border__bottom .chirpui-ascii-border__corner:nth-child(3) {
    animation-name: chirpui-ascii-momentum;
    animation-duration: 6.5s;
}


/* ==========================================================================
   ASCII Divider — glyph-centered horizontal separator
   ========================================================================== */

.chirpui-ascii-divider {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
    width: 100%;
    margin: var(--chirpui-spacing) 0;
    font-family: var(--chirpui-ascii-font);
    color: var(--chirpui-text-muted);
    user-select: none;
}
.chirpui-ascii-divider::before,
.chirpui-ascii-divider::after {
    content: "────────────────────────────────────────";
    flex: 1;
    overflow: hidden;
    white-space: nowrap;
    max-height: 1.2em;
    color: var(--chirpui-text-muted);
    opacity: 0.5;
}
.chirpui-ascii-divider__glyph {
    flex-shrink: 0;
    font-size: 0.875rem;
    opacity: 0.7;
}

/* Variant: double line */
.chirpui-ascii-divider--double::before,
.chirpui-ascii-divider--double::after {
    content: "════════════════════════════════════════";
}

/* Variant: heavy line */
.chirpui-ascii-divider--heavy::before,
.chirpui-ascii-divider--heavy::after {
    content: "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━";
}

/* Variant: dots */
.chirpui-ascii-divider--dots::before,
.chirpui-ascii-divider--dots::after {
    content: "· · · · · · · · · · · · · · · · · · · · ";
}

/* Momentum spin for the glyph */
.chirpui-ascii-divider--spin .chirpui-ascii-divider__glyph {
    display: inline-block;
    animation: chirpui-ascii-momentum 6s cubic-bezier(0.2, 0, 0.1, 1) infinite;
}
.chirpui-ascii-divider--spin-reverse .chirpui-ascii-divider__glyph {
    display: inline-block;
    animation: chirpui-ascii-momentum-reverse 7s cubic-bezier(0.2, 0, 0.1, 1) infinite;
}
.chirpui-ascii-divider--spin-drift .chirpui-ascii-divider__glyph {
    display: inline-block;
    animation: chirpui-ascii-momentum-drift 8s cubic-bezier(0.3, 0, 0.1, 1) infinite;
}


/* ==========================================================================
   ASCII Sparkline — inline block-character data visualization
   ========================================================================== */

.chirpui-ascii-sparkline {
    font-family: var(--chirpui-ascii-font);
    font-size: 1rem;
    line-height: 1;
    letter-spacing: 0.05em;
    color: var(--chirpui-text);
    display: inline-flex;
    align-items: flex-end;
    gap: 1px;
    vertical-align: middle;
}
.chirpui-ascii-sparkline__bar {
    display: inline-block;
    line-height: 1;
}

/* Variants */
.chirpui-ascii-sparkline--accent { color: var(--chirpui-accent); }
.chirpui-ascii-sparkline--muted { color: var(--chirpui-text-muted); }
.chirpui-ascii-sparkline--gradient .chirpui-ascii-sparkline__bar {
    background: linear-gradient(to top, var(--chirpui-accent), var(--chirpui-accent-bright, var(--chirpui-accent)));
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
}


/* ==========================================================================
   ASCII Progress — terminal-style progress bar
   ========================================================================== */

.chirpui-ascii-progress {
    font-family: var(--chirpui-ascii-font);
    font-size: 0.875rem;
    line-height: 1.4;
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
    color: var(--chirpui-text);
}
.chirpui-ascii-progress__label {
    color: var(--chirpui-text-muted);
    flex-shrink: 0;
}
.chirpui-ascii-progress__track {
    letter-spacing: 0;
    white-space: nowrap;
}
.chirpui-ascii-progress__filled {
    color: var(--chirpui-ascii-progress-fill, var(--chirpui-accent));
}
.chirpui-ascii-progress__empty {
    color: var(--chirpui-text-muted);
    opacity: 0.4;
}
.chirpui-ascii-progress__value {
    color: var(--chirpui-text-muted);
    font-size: 0.75rem;
    flex-shrink: 0;
}

/* Variants */
.chirpui-ascii-progress--accent { --chirpui-ascii-progress-fill: var(--chirpui-accent); }
.chirpui-ascii-progress--success { --chirpui-ascii-progress-fill: var(--chirpui-success); }
.chirpui-ascii-progress--warning { --chirpui-ascii-progress-fill: var(--chirpui-warning); }

/* ==========================================================================
   ASCII Empty — zero-data empty state
   ========================================================================== */

.chirpui-ascii-empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    padding: var(--chirpui-spacing-xl) var(--chirpui-spacing);
    gap: var(--chirpui-spacing-xs);
}
.chirpui-ascii-empty__glyph {
    font-family: var(--chirpui-ascii-font);
    font-size: 2.5rem;
    line-height: 1;
    color: var(--chirpui-text-muted);
    opacity: 0.5;
    margin-bottom: var(--chirpui-spacing-sm);
}
.chirpui-ascii-empty__heading {
    font-family: var(--chirpui-ascii-font);
    font-size: 0.875rem;
    font-weight: var(--chirpui-ui-font-weight-medium, 500);
    color: var(--chirpui-text);
    margin: 0;
}
.chirpui-ascii-empty__desc {
    font-size: 0.82rem;
    color: var(--chirpui-text-muted);
    margin: 0;
    max-width: 30ch;
}
.chirpui-ascii-empty__action {
    margin-top: var(--chirpui-spacing-sm);
}
.chirpui-ascii-empty__action:empty {
    display: none;
}

/* Variants */
.chirpui-ascii-empty--muted .chirpui-ascii-empty__glyph { color: var(--chirpui-text-muted); opacity: 0.3; }
.chirpui-ascii-empty--accent .chirpui-ascii-empty__glyph { color: var(--chirpui-accent); opacity: 0.6; }

/* ==========================================================================
   ASCII Spinner
   ========================================================================== */

.chirpui-ascii-spinner {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
    font-family: var(--chirpui-ascii-font);
}

.chirpui-ascii-spinner__chars {
    position: relative;
    display: inline-block;
}

.chirpui-ascii-spinner--sm .chirpui-ascii-spinner__chars { width: 0.75rem; height: 0.75rem; font-size: 0.75rem; }
.chirpui-ascii-spinner--md .chirpui-ascii-spinner__chars { width: 1rem; height: 1rem; font-size: 1rem; }
.chirpui-ascii-spinner--lg .chirpui-ascii-spinner__chars { width: 1.5rem; height: 1.5rem; font-size: 1.5rem; }

.chirpui-ascii-spinner__char {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    opacity: 0;
}

.chirpui-ascii-spinner__label {
    color: var(--chirpui-fg-muted, inherit);
}

/* Braille: 10 frames */
.chirpui-ascii-spinner--braille .chirpui-ascii-spinner__char {
    animation: chirpui-ascii-spinner-10 1s steps(1) infinite;
}
.chirpui-ascii-spinner--braille .chirpui-ascii-spinner__char:nth-child(1)  { animation-delay: 0s; }
.chirpui-ascii-spinner--braille .chirpui-ascii-spinner__char:nth-child(2)  { animation-delay: -0.9s; }
.chirpui-ascii-spinner--braille .chirpui-ascii-spinner__char:nth-child(3)  { animation-delay: -0.8s; }
.chirpui-ascii-spinner--braille .chirpui-ascii-spinner__char:nth-child(4)  { animation-delay: -0.7s; }
.chirpui-ascii-spinner--braille .chirpui-ascii-spinner__char:nth-child(5)  { animation-delay: -0.6s; }
.chirpui-ascii-spinner--braille .chirpui-ascii-spinner__char:nth-child(6)  { animation-delay: -0.5s; }
.chirpui-ascii-spinner--braille .chirpui-ascii-spinner__char:nth-child(7)  { animation-delay: -0.4s; }
.chirpui-ascii-spinner--braille .chirpui-ascii-spinner__char:nth-child(8)  { animation-delay: -0.3s; }
.chirpui-ascii-spinner--braille .chirpui-ascii-spinner__char:nth-child(9)  { animation-delay: -0.2s; }
.chirpui-ascii-spinner--braille .chirpui-ascii-spinner__char:nth-child(10) { animation-delay: -0.1s; }

/* Box: 4 frames */
.chirpui-ascii-spinner--box .chirpui-ascii-spinner__char {
    animation: chirpui-ascii-spinner-4 0.8s steps(1) infinite;
}
.chirpui-ascii-spinner--box .chirpui-ascii-spinner__char:nth-child(1) { animation-delay: 0s; }
.chirpui-ascii-spinner--box .chirpui-ascii-spinner__char:nth-child(2) { animation-delay: -0.6s; }
.chirpui-ascii-spinner--box .chirpui-ascii-spinner__char:nth-child(3) { animation-delay: -0.4s; }
.chirpui-ascii-spinner--box .chirpui-ascii-spinner__char:nth-child(4) { animation-delay: -0.2s; }

/* Dots: 8 frames */
.chirpui-ascii-spinner--dots .chirpui-ascii-spinner__char {
    animation: chirpui-ascii-spinner-8 0.8s steps(1) infinite;
}
.chirpui-ascii-spinner--dots .chirpui-ascii-spinner__char:nth-child(1) { animation-delay: 0s; }
.chirpui-ascii-spinner--dots .chirpui-ascii-spinner__char:nth-child(2) { animation-delay: -0.7s; }
.chirpui-ascii-spinner--dots .chirpui-ascii-spinner__char:nth-child(3) { animation-delay: -0.6s; }
.chirpui-ascii-spinner--dots .chirpui-ascii-spinner__char:nth-child(4) { animation-delay: -0.5s; }
.chirpui-ascii-spinner--dots .chirpui-ascii-spinner__char:nth-child(5) { animation-delay: -0.4s; }
.chirpui-ascii-spinner--dots .chirpui-ascii-spinner__char:nth-child(6) { animation-delay: -0.3s; }
.chirpui-ascii-spinner--dots .chirpui-ascii-spinner__char:nth-child(7) { animation-delay: -0.2s; }
.chirpui-ascii-spinner--dots .chirpui-ascii-spinner__char:nth-child(8) { animation-delay: -0.1s; }

/* Arrows: 8 frames */
.chirpui-ascii-spinner--arrows .chirpui-ascii-spinner__char {
    animation: chirpui-ascii-spinner-8 0.8s steps(1) infinite;
}
.chirpui-ascii-spinner--arrows .chirpui-ascii-spinner__char:nth-child(1) { animation-delay: 0s; }
.chirpui-ascii-spinner--arrows .chirpui-ascii-spinner__char:nth-child(2) { animation-delay: -0.7s; }
.chirpui-ascii-spinner--arrows .chirpui-ascii-spinner__char:nth-child(3) { animation-delay: -0.6s; }
.chirpui-ascii-spinner--arrows .chirpui-ascii-spinner__char:nth-child(4) { animation-delay: -0.5s; }
.chirpui-ascii-spinner--arrows .chirpui-ascii-spinner__char:nth-child(5) { animation-delay: -0.4s; }
.chirpui-ascii-spinner--arrows .chirpui-ascii-spinner__char:nth-child(6) { animation-delay: -0.3s; }
.chirpui-ascii-spinner--arrows .chirpui-ascii-spinner__char:nth-child(7) { animation-delay: -0.2s; }
.chirpui-ascii-spinner--arrows .chirpui-ascii-spinner__char:nth-child(8) { animation-delay: -0.1s; }

/* Blocks: 4 frames */
.chirpui-ascii-spinner--blocks .chirpui-ascii-spinner__char {
    animation: chirpui-ascii-spinner-4 0.8s steps(1) infinite;
}
.chirpui-ascii-spinner--blocks .chirpui-ascii-spinner__char:nth-child(1) { animation-delay: 0s; }
.chirpui-ascii-spinner--blocks .chirpui-ascii-spinner__char:nth-child(2) { animation-delay: -0.6s; }
.chirpui-ascii-spinner--blocks .chirpui-ascii-spinner__char:nth-child(3) { animation-delay: -0.4s; }
.chirpui-ascii-spinner--blocks .chirpui-ascii-spinner__char:nth-child(4) { animation-delay: -0.2s; }

/* ==========================================================================
   ASCII Badge
   ========================================================================== */

.chirpui-ascii-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.25em;
    font-family: var(--chirpui-ascii-font);
    font-size: 0.75rem;
    line-height: 1;
    white-space: nowrap;
    color: var(--chirpui-text);
}
.chirpui-ascii-badge__open,
.chirpui-ascii-badge__close {
    color: var(--chirpui-text-muted);
    opacity: 0.6;
}
.chirpui-ascii-badge__glyph {
    color: var(--chirpui-ascii-badge-color, var(--chirpui-text));
}
.chirpui-ascii-badge__text {
    color: var(--chirpui-ascii-badge-color, var(--chirpui-text));
}

/* Variants */
.chirpui-ascii-badge--success { --chirpui-ascii-badge-color: var(--chirpui-success); }
.chirpui-ascii-badge--warning { --chirpui-ascii-badge-color: var(--chirpui-warning); }
.chirpui-ascii-badge--error { --chirpui-ascii-badge-color: var(--chirpui-error); }
.chirpui-ascii-badge--accent { --chirpui-ascii-badge-color: var(--chirpui-accent); }
.chirpui-ascii-badge--muted { --chirpui-ascii-badge-color: var(--chirpui-text-muted); }


/* ==========================================================================
   ASCII Glyph Fill — hover/active micro-moments
   Swap between hollow and filled glyphs on interaction.

   Usage:
       <span class="chirpui-ascii-fill" data-hollow="◇" data-filled="◆">◇</span>
       <span class="chirpui-ascii-fill" data-hollow="☆" data-filled="★">☆</span>
       <span class="chirpui-ascii-fill" data-hollow="○" data-filled="●">○</span>

   Or as utility classes on a parent (swaps all .chirpui-ascii-fill children):
       <button class="chirpui-ascii-fill-hover">
           <span class="chirpui-ascii-fill" ...>◇</span> Settings
       </button>
   ========================================================================== */

.chirpui-ascii-fill {
    font-family: var(--chirpui-ascii-font);
    display: inline-block;
    transition: transform var(--chirpui-motion-fast) var(--chirpui-ease-spring);
    cursor: default;
}

/* Self-hover: the glyph itself is hovered */
.chirpui-ascii-fill:hover {
    transform: scale(1.15);
}

/* Parent-triggered hover: parent has .chirpui-ascii-fill-hover */
.chirpui-ascii-fill-hover:hover .chirpui-ascii-fill {
    transform: scale(1.15);
}

/* Active/press: slight shrink for tactile feel */
.chirpui-ascii-fill:active,
.chirpui-ascii-fill-hover:active .chirpui-ascii-fill {
    transform: scale(0.9);
    transition-duration: var(--chirpui-motion-fast);
}


/* ==========================================================================
   ASCII Error Page — stylized error states with ASCII art
   ========================================================================== */

.chirpui-ascii-error {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    padding: var(--chirpui-spacing-2xl) var(--chirpui-spacing);
    gap: var(--chirpui-spacing-xs);
    min-height: 40vh;
}
.chirpui-ascii-error__art {
    font-family: var(--chirpui-ascii-font);
    font-size: 0.875rem;
    line-height: 1.6;
    color: var(--chirpui-text-muted);
    opacity: 0.6;
    margin: 0 0 var(--chirpui-spacing);
    white-space: pre;
    user-select: none;
}
.chirpui-ascii-error__code {
    font-family: var(--chirpui-ascii-font);
    font-size: 3rem;
    font-weight: var(--chirpui-ui-font-weight-bold, 700);
    line-height: 1;
    color: var(--chirpui-text);
    letter-spacing: 0.1em;
}
.chirpui-ascii-error__heading {
    font-family: var(--chirpui-ascii-font);
    font-size: 1rem;
    font-weight: var(--chirpui-ui-font-weight-medium, 500);
    color: var(--chirpui-text);
    margin: var(--chirpui-spacing-xs) 0 0;
}
.chirpui-ascii-error__desc {
    font-size: 0.82rem;
    color: var(--chirpui-text-muted);
    margin: var(--chirpui-spacing-xs) 0 0;
    max-width: 40ch;
}
.chirpui-ascii-error__action {
    margin-top: var(--chirpui-spacing);
}
.chirpui-ascii-error__action:empty {
    display: none;
}


/* ==========================================================================
   ASCII Skeleton — character-based loading placeholder
   ========================================================================== */

.chirpui-ascii-skeleton {
    display: inline-block;
    font-family: var(--chirpui-ascii-font);
    font-size: 0.75rem;
    line-height: 1.4;
    color: var(--chirpui-text-muted);
    overflow: hidden;
    border-radius: var(--chirpui-radius-sm);
    letter-spacing: 0.05em;
}
.chirpui-ascii-skeleton__fill,
.chirpui-ascii-skeleton__line {
    display: block;
    overflow: hidden;
    white-space: nowrap;
    max-height: 1.4em;
    animation: chirpui-ascii-skeleton-wave 2s ease-in-out infinite;
}

/* Stagger wave across lines */
.chirpui-ascii-skeleton__line:nth-child(2) { animation-delay: 0.15s; }
.chirpui-ascii-skeleton__line:nth-child(3) { animation-delay: 0.3s; }
.chirpui-ascii-skeleton__line:nth-child(4) { animation-delay: 0.45s; }
.chirpui-ascii-skeleton__line:nth-child(5) { animation-delay: 0.6s; }
.chirpui-ascii-skeleton__line:nth-child(6) { animation-delay: 0.75s; }

/* Header line inside card skeleton */
.chirpui-ascii-skeleton__line--header {
    font-size: 0.875rem;
    margin-bottom: var(--chirpui-spacing-xs);
    font-weight: var(--chirpui-ui-font-weight-medium, 500);
}

/* Text variant */
.chirpui-ascii-skeleton--text {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    width: 100%;
}
.chirpui-ascii-skeleton--text .chirpui-ascii-skeleton__line:last-child {
    max-width: 75%;
}

/* Card variant */
.chirpui-ascii-skeleton--card {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    width: 100%;
    padding: var(--chirpui-spacing-sm);
    border: 1px solid var(--chirpui-border);
    border-radius: var(--chirpui-radius);
}
.chirpui-ascii-skeleton--card .chirpui-ascii-skeleton__line:last-child {
    max-width: 60%;
}

/* Avatar variant */
.chirpui-ascii-skeleton--avatar {
    width: 2.5rem;
    height: 2.5rem;
    border-radius: 50%;
    border: 1px solid var(--chirpui-border);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: 1.25rem;
}
.chirpui-ascii-skeleton--avatar .chirpui-ascii-skeleton__fill {
    animation: chirpui-ascii-skeleton-wave 2s ease-in-out infinite;
}

/* Heading variant */
.chirpui-ascii-skeleton--heading {
    display: block;
    font-size: 1rem;
    width: 60%;
}
.chirpui-ascii-skeleton--heading .chirpui-ascii-skeleton__fill {
    font-size: inherit;
}

/* ================================================================
   ASCII Toggle — box-drawing switch with Unicode knob
   OFF:  ╶───○     ON:  ●───╴
   ================================================================ */
.chirpui-ascii-toggle {
    display: inline-flex;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
    cursor: pointer;
    user-select: none;
}

.chirpui-ascii-toggle__track {
    display: inline-flex;
    align-items: center;
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
    font-size: 1rem;
    line-height: 1;
    color: var(--chirpui-text-muted);
    transition: color var(--chirpui-transition);
}

.chirpui-ascii-toggle__rail {
    display: inline-flex;
    align-items: center;
    position: relative;
    width: 3.5em;
    height: 1.4em;
    overflow: hidden;
}

/* The rail draws the track characters via pseudo-elements */
.chirpui-ascii-toggle__rail::before {
    content: "╶───";
    position: absolute;
    left: 0;
    pointer-events: none;
    transition: opacity var(--chirpui-transition);
}
.chirpui-ascii-toggle__rail::after {
    content: "───╴";
    position: absolute;
    right: 0;
    pointer-events: none;
    transition: opacity var(--chirpui-transition);
}

/* The knob — ○ when off, ● when on */
.chirpui-ascii-toggle__knob {
    position: absolute;
    left: 0;
    transition: left var(--chirpui-transition-slow) var(--chirpui-ease-spring),
                color var(--chirpui-transition);
    z-index: 1;
    pointer-events: none;
}
.chirpui-ascii-toggle__knob::before {
    content: "○";
    font-size: 1.15em;
}

/* Checked state */
.chirpui-ascii-toggle:has(.chirpui-ascii-toggle__input:checked) .chirpui-ascii-toggle__track {
    color: var(--chirpui-accent);
}
.chirpui-ascii-toggle:has(.chirpui-ascii-toggle__input:checked) .chirpui-ascii-toggle__knob {
    left: calc(100% - 1em);
}
.chirpui-ascii-toggle:has(.chirpui-ascii-toggle__input:checked) .chirpui-ascii-toggle__knob::before {
    content: "●";
}

/* Focus ring */
.chirpui-ascii-toggle:has(.chirpui-ascii-toggle__input:focus-visible) .chirpui-ascii-toggle__rail {
    outline: 2px solid var(--chirpui-focus-ring);
    outline-offset: 2px;
    border-radius: 2px;
}

/* Active press feedback */
.chirpui-ascii-toggle:has(.chirpui-ascii-toggle__input:active) .chirpui-ascii-toggle__knob::before {
    content: "◉";
}

/* Label */
.chirpui-ascii-toggle__label {
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text);
}

/* Disabled */
.chirpui-ascii-toggle--disabled {
    opacity: 0.4;
    cursor: not-allowed;
    pointer-events: none;
}

/* --- Size variants --- */
.chirpui-ascii-toggle--sm .chirpui-ascii-toggle__track { font-size: 0.75rem; }
.chirpui-ascii-toggle--sm .chirpui-ascii-toggle__rail { width: 2.8em; height: 1.2em; }
.chirpui-ascii-toggle--sm .chirpui-ascii-toggle__label { font-size: var(--chirpui-font-xs, 0.7rem); }

.chirpui-ascii-toggle--lg .chirpui-ascii-toggle__track { font-size: 1.35rem; }
.chirpui-ascii-toggle--lg .chirpui-ascii-toggle__rail { width: 4em; height: 1.6em; }

/* --- Color variants --- */
.chirpui-ascii-toggle--success:has(.chirpui-ascii-toggle__input:checked) .chirpui-ascii-toggle__track {
    color: var(--chirpui-success);
}
.chirpui-ascii-toggle--danger:has(.chirpui-ascii-toggle__input:checked) .chirpui-ascii-toggle__track {
    color: var(--chirpui-error);
}
.chirpui-ascii-toggle--accent:has(.chirpui-ascii-toggle__input:checked) .chirpui-ascii-toggle__track {
    color: var(--chirpui-accent);
}

/* Reduced motion */
@media (prefers-reduced-motion: reduce) {
    .chirpui-ascii-toggle__knob {
        transition: none;
    }
}

/* ================================================================
   ASCII Switch — vertical breaker toggle with block characters
   ┌───┐        ┌───┐
   │░░░│  OFF   │███│  ON
   │░░░│        │███│
   │███│        │░░░│
   │███│        │░░░│
   └───┘        └───┘
   ================================================================ */
.chirpui-ascii-switch {
    display: inline-flex;
    flex-direction: column;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
    cursor: pointer;
    user-select: none;
}

.chirpui-ascii-switch__body {
    display: flex;
    flex-direction: column;
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
    font-size: 0.85rem;
    line-height: 1;
    color: var(--chirpui-text-muted);
    transition: color var(--chirpui-transition);
}

/* Top and bottom caps: box-drawing corners + horizontal line */
.chirpui-ascii-switch__cap {
    display: block;
    white-space: pre;
    text-align: center;
}
.chirpui-ascii-switch__cap--top::before { content: "┌───┐"; }
.chirpui-ascii-switch__cap--bottom::before { content: "└───┘"; }

/* The slot contains rows of block characters */
.chirpui-ascii-switch__slot {
    position: relative;
    display: flex;
    flex-direction: column;
    overflow: hidden;
    height: 4.2em;
}

/* The lever is the sliding element — 4 rows of characters, 2 filled + 2 empty.
   We slide it up (ON) or down (OFF). */
.chirpui-ascii-switch__lever {
    display: flex;
    flex-direction: column;
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    transition: transform var(--chirpui-transition-slow) var(--chirpui-ease-spring);
    transform: translateY(0);
}

/* 4 rows via pseudo + generated content on the lever */
.chirpui-ascii-switch__lever::before,
.chirpui-ascii-switch__lever::after {
    display: block;
    white-space: pre;
    text-align: center;
}

/* Bottom 2 rows = filled blocks, Top 2 rows = light shade */
.chirpui-ascii-switch__lever::before {
    content: "│░░░│\A│░░░│";
    opacity: 0.4;
}
.chirpui-ascii-switch__lever::after {
    content: "│███│\A│███│";
}

/* OFF state — lever is down (default), blocks at bottom */
/* (default position, no transform needed) */

/* ON state — lever slides up, blocks move to top */
.chirpui-ascii-switch:has(.chirpui-ascii-switch__input:checked) .chirpui-ascii-switch__lever {
    transform: translateY(-50%);
}

/* Color on checked */
.chirpui-ascii-switch:has(.chirpui-ascii-switch__input:checked) .chirpui-ascii-switch__body {
    color: var(--chirpui-accent);
}

/* Active press — brief squish */
.chirpui-ascii-switch:has(.chirpui-ascii-switch__input:active) .chirpui-ascii-switch__body {
    transform: scaleY(0.95);
    transition: transform var(--chirpui-motion-fast);
}

/* Focus ring */
.chirpui-ascii-switch:has(.chirpui-ascii-switch__input:focus-visible) .chirpui-ascii-switch__body {
    outline: 2px solid var(--chirpui-focus-ring);
    outline-offset: 2px;
    border-radius: 2px;
}

.chirpui-ascii-switch__label {
    font-size: var(--chirpui-font-xs, 0.7rem);
    color: var(--chirpui-text-muted);
    text-align: center;
    transition: color var(--chirpui-transition);
}
.chirpui-ascii-switch:has(.chirpui-ascii-switch__input:checked) .chirpui-ascii-switch__label {
    color: var(--chirpui-text);
}

/* Disabled */
.chirpui-ascii-switch--disabled {
    opacity: 0.4;
    cursor: not-allowed;
    pointer-events: none;
}

/* --- Size variants --- */
.chirpui-ascii-switch--sm .chirpui-ascii-switch__body { font-size: 0.65rem; }
.chirpui-ascii-switch--sm .chirpui-ascii-switch__slot { height: 3.2em; }

.chirpui-ascii-switch--lg .chirpui-ascii-switch__body { font-size: 1.15rem; }
.chirpui-ascii-switch--lg .chirpui-ascii-switch__slot { height: 5.2em; }

/* --- Color variants --- */
.chirpui-ascii-switch--success:has(.chirpui-ascii-switch__input:checked) .chirpui-ascii-switch__body {
    color: var(--chirpui-success);
}
.chirpui-ascii-switch--danger:has(.chirpui-ascii-switch__input:checked) .chirpui-ascii-switch__body {
    color: var(--chirpui-error);
}
.chirpui-ascii-switch--accent:has(.chirpui-ascii-switch__input:checked) .chirpui-ascii-switch__body {
    color: var(--chirpui-accent);
}

/* Reduced motion */
@media (prefers-reduced-motion: reduce) {
    .chirpui-ascii-switch__lever {
        transition: none;
    }
}

/* ================================================================
   ASCII Breaker Panel — framed set of switches
   ================================================================ */

.chirpui-ascii-breaker-panel {
    display: inline-block;
}

.chirpui-ascii-breaker-panel .chirpui-ascii-border {
    padding: 1rem 1.25rem;
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
}

.chirpui-ascii-breaker-panel__title {
    text-align: center;
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
    font-size: var(--chirpui-font-xs, 0.65rem);
    font-weight: 700;
    letter-spacing: 0.15em;
    text-transform: uppercase;
    color: var(--chirpui-text-muted);
}

.chirpui-ascii-breaker-panel__divider {
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
    text-align: center;
    color: var(--chirpui-text-muted);
    font-size: 0.75rem;
    line-height: 1;
    overflow: hidden;
    white-space: nowrap;
    opacity: 0.5;
}
.chirpui-ascii-breaker-panel__divider::before {
    content: "────────────────────────────────────────";
    display: block;
    overflow: hidden;
}

.chirpui-ascii-breaker-panel__master {
    display: flex;
    justify-content: center;
    padding: 0.25rem 0;
}

.chirpui-ascii-breaker-panel__switches {
    display: flex;
    gap: 1rem;
    justify-content: center;
    flex-wrap: wrap;
}

.chirpui-ascii-breaker-panel__breaker {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.35rem;
}

.chirpui-ascii-breaker-panel__status {
    display: flex;
    align-items: center;
    justify-content: center;
}

/* Compact size */
.chirpui-ascii-breaker-panel--sm .chirpui-ascii-border {
    padding: 0.6rem 0.75rem;
    gap: 0.5rem;
}
.chirpui-ascii-breaker-panel--sm .chirpui-ascii-breaker-panel__switches {
    gap: 0.6rem;
}

/* ================================================================
   ASCII Indicator Light — blinking mainframe LEDs
   ================================================================ */

@keyframes chirpui-indicator-blink {
    0%, 100% { opacity: 1; }
    50% { opacity: 0.3; }
}
@keyframes chirpui-indicator-blink-fast {
    0%, 100% { opacity: 1; }
    50% { opacity: 0.15; }
}

.chirpui-ascii-indicator {
    display: inline-flex;
    flex-direction: column;
    align-items: center;
    gap: 0.15em;
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
}

.chirpui-ascii-indicator__light {
    font-size: 1rem;
    line-height: 1;
    text-shadow: 0 0 4px currentColor;
}

.chirpui-ascii-indicator__label {
    font-size: var(--chirpui-font-xs, 0.65rem);
    color: var(--chirpui-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    white-space: nowrap;
}

/* Color variants */
.chirpui-ascii-indicator--success .chirpui-ascii-indicator__light { color: var(--chirpui-success); }
.chirpui-ascii-indicator--warning .chirpui-ascii-indicator__light { color: var(--chirpui-warning, #e6a700); }
.chirpui-ascii-indicator--error .chirpui-ascii-indicator__light { color: var(--chirpui-error); }
.chirpui-ascii-indicator--muted .chirpui-ascii-indicator__light { color: var(--chirpui-text-muted); text-shadow: none; }
.chirpui-ascii-indicator--accent .chirpui-ascii-indicator__light { color: var(--chirpui-accent); }

/* Blink */
.chirpui-ascii-indicator--blink .chirpui-ascii-indicator__light {
    animation: chirpui-indicator-blink 2s ease-in-out infinite;
}
.chirpui-ascii-indicator--blink-fast .chirpui-ascii-indicator__light {
    animation: chirpui-indicator-blink-fast 0.6s ease-in-out infinite;
}

/* Row layout */
.chirpui-ascii-indicator-row {
    display: flex;
    gap: 1rem;
    align-items: flex-start;
}

@media (prefers-reduced-motion: reduce) {
    .chirpui-ascii-indicator--blink .chirpui-ascii-indicator__light,
    .chirpui-ascii-indicator--blink-fast .chirpui-ascii-indicator__light {
        animation: none;
    }
}

/* ================================================================
   ASCII Tile Button — square mainframe pushbuttons
   ================================================================ */

@keyframes chirpui-tile-glow {
    0%, 100% { box-shadow: 0 0 3px currentColor, inset 0 0 3px currentColor; }
    50% { box-shadow: 0 0 8px currentColor, inset 0 0 6px currentColor; }
}

.chirpui-ascii-tile-btn {
    display: inline-flex;
    flex-direction: column;
    align-items: center;
    gap: 0.25em;
    cursor: pointer;
    user-select: none;
    border: none;
    background: none;
    padding: 0;
    font: inherit;
    color: inherit;
}

.chirpui-ascii-tile-btn__face {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2.5rem;
    height: 2.5rem;
    border: 2px solid var(--chirpui-border);
    border-radius: 3px;
    background: var(--chirpui-surface);
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
    font-size: 1rem;
    color: var(--chirpui-text-muted);
    transition: background var(--chirpui-transition),
                border-color var(--chirpui-transition),
                color var(--chirpui-transition),
                box-shadow var(--chirpui-transition),
                transform var(--chirpui-motion-fast);
}

.chirpui-ascii-tile-btn__glyph {
    line-height: 1;
}

.chirpui-ascii-tile-btn__label {
    font-size: var(--chirpui-font-xs, 0.6rem);
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
    color: var(--chirpui-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    white-space: nowrap;
}

/* Hover */
.chirpui-ascii-tile-btn:hover .chirpui-ascii-tile-btn__face {
    border-color: var(--chirpui-text-muted);
    background: var(--chirpui-bg-subtle);
}

/* Active press — push in */
.chirpui-ascii-tile-btn:active .chirpui-ascii-tile-btn__face,
.chirpui-ascii-tile-btn:has(.chirpui-ascii-tile-btn__input:active) .chirpui-ascii-tile-btn__face {
    transform: scale(0.9);
    background: var(--chirpui-accent);
    border-color: var(--chirpui-accent);
    color: var(--chirpui-surface);
}

/* Focus */
.chirpui-ascii-tile-btn:focus-visible .chirpui-ascii-tile-btn__face,
.chirpui-ascii-tile-btn:has(.chirpui-ascii-tile-btn__input:focus-visible) .chirpui-ascii-tile-btn__face {
    outline: 2px solid var(--chirpui-focus-ring);
    outline-offset: 2px;
}

/* Lit state (checkbox checked OR .chirpui-ascii-tile-btn--lit) */
.chirpui-ascii-tile-btn--lit .chirpui-ascii-tile-btn__face,
.chirpui-ascii-tile-btn:has(.chirpui-ascii-tile-btn__input:checked) .chirpui-ascii-tile-btn__face {
    background: var(--chirpui-accent);
    border-color: var(--chirpui-accent);
    color: var(--chirpui-surface);
    box-shadow: 0 0 6px var(--chirpui-accent);
    animation: chirpui-tile-glow 3s ease-in-out infinite;
}

/* Color variants — change the "lit" color */
.chirpui-ascii-tile-btn--success:has(.chirpui-ascii-tile-btn__input:checked) .chirpui-ascii-tile-btn__face,
.chirpui-ascii-tile-btn--success.chirpui-ascii-tile-btn--lit .chirpui-ascii-tile-btn__face {
    background: var(--chirpui-success); border-color: var(--chirpui-success);
    box-shadow: 0 0 6px var(--chirpui-success);
}
.chirpui-ascii-tile-btn--warning:has(.chirpui-ascii-tile-btn__input:checked) .chirpui-ascii-tile-btn__face,
.chirpui-ascii-tile-btn--warning.chirpui-ascii-tile-btn--lit .chirpui-ascii-tile-btn__face {
    background: var(--chirpui-warning, #e6a700); border-color: var(--chirpui-warning, #e6a700);
    box-shadow: 0 0 6px var(--chirpui-warning, #e6a700);
}
.chirpui-ascii-tile-btn--danger:has(.chirpui-ascii-tile-btn__input:checked) .chirpui-ascii-tile-btn__face,
.chirpui-ascii-tile-btn--danger.chirpui-ascii-tile-btn--lit .chirpui-ascii-tile-btn__face {
    background: var(--chirpui-error); border-color: var(--chirpui-error);
    box-shadow: 0 0 6px var(--chirpui-error);
}
.chirpui-ascii-tile-btn--accent:has(.chirpui-ascii-tile-btn__input:checked) .chirpui-ascii-tile-btn__face,
.chirpui-ascii-tile-btn--accent.chirpui-ascii-tile-btn--lit .chirpui-ascii-tile-btn__face {
    background: var(--chirpui-accent); border-color: var(--chirpui-accent);
    box-shadow: 0 0 6px var(--chirpui-accent);
}

/* Disabled */
.chirpui-ascii-tile-btn--disabled,
.chirpui-ascii-tile-btn:disabled {
    opacity: 0.35;
    cursor: not-allowed;
    pointer-events: none;
}

/* Grid layout */
.chirpui-ascii-tile-grid {
    display: grid;
    grid-template-columns: repeat(var(--_tile-cols, 4), auto);
    gap: 0.5rem;
    justify-content: start;
}

@media (prefers-reduced-motion: reduce) {
    .chirpui-ascii-tile-btn--lit .chirpui-ascii-tile-btn__face,
    .chirpui-ascii-tile-btn:has(.chirpui-ascii-tile-btn__input:checked) .chirpui-ascii-tile-btn__face {
        animation: none;
    }
}

/* ================================================================
   ASCII Knob — rotary dial selector
   ================================================================ */

.chirpui-ascii-knob {
    display: inline-flex;
    flex-direction: column;
    align-items: center;
    gap: var(--chirpui-spacing-sm);
    border: none;
    padding: 0;
    margin: 0;
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
}

.chirpui-ascii-knob__legend {
    font-size: var(--chirpui-font-xs, 0.65rem);
    color: var(--chirpui-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    margin-bottom: var(--chirpui-spacing-xs);
}

.chirpui-ascii-knob__dial {
    display: flex;
    flex-direction: column;
    align-items: center;
    line-height: 1.15;
    font-size: 0.85rem;
    color: var(--chirpui-text-muted);
    transition: color var(--chirpui-transition);
}

.chirpui-ascii-knob__frame {
    display: block;
    white-space: pre;
}

.chirpui-ascii-knob__positions {
    display: flex;
    gap: 0;
}

.chirpui-ascii-knob__position {
    cursor: pointer;
    user-select: none;
}

.chirpui-ascii-knob__notch {
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 0 0.35em;
    transition: color var(--chirpui-transition);
    color: var(--chirpui-text-muted);
}

.chirpui-ascii-knob__tick {
    font-size: 0.7rem;
    line-height: 1;
    opacity: 0.5;
}

.chirpui-ascii-knob__value {
    font-size: var(--chirpui-font-xs, 0.65rem);
    white-space: nowrap;
}

/* Selected position */
.chirpui-ascii-knob__position:has(.chirpui-ascii-knob__input:checked) .chirpui-ascii-knob__notch {
    color: var(--chirpui-accent);
}
.chirpui-ascii-knob__position:has(.chirpui-ascii-knob__input:checked) .chirpui-ascii-knob__tick {
    opacity: 1;
    font-weight: 700;
}

/* Hover */
.chirpui-ascii-knob__position:hover .chirpui-ascii-knob__notch {
    color: var(--chirpui-text);
}

/* Focus */
.chirpui-ascii-knob__position:has(.chirpui-ascii-knob__input:focus-visible) .chirpui-ascii-knob__notch {
    outline: 2px solid var(--chirpui-focus-ring);
    outline-offset: 1px;
    border-radius: 2px;
}

/* Accent variant */
.chirpui-ascii-knob--accent .chirpui-ascii-knob__position:has(.chirpui-ascii-knob__input:checked) .chirpui-ascii-knob__notch {
    color: var(--chirpui-accent);
}

/* When any position is checked, light up the dial */
.chirpui-ascii-knob:has(.chirpui-ascii-knob__input:checked) .chirpui-ascii-knob__dial {
    color: var(--chirpui-text);
}

/* ================================================================
   ASCII Fader — vertical mixing-board slider
   ================================================================ */

.chirpui-ascii-fader {
    display: inline-flex;
    flex-direction: column;
    align-items: center;
    gap: 0.2em;
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
}

.chirpui-ascii-fader__track {
    display: flex;
    flex-direction: column;
    align-items: center;
    line-height: 1.1;
    font-size: 0.85rem;
    color: var(--chirpui-text-muted);
}

.chirpui-ascii-fader__cap {
    display: block;
    white-space: pre;
}

.chirpui-ascii-fader__segment {
    display: block;
    white-space: pre;
    transition: color var(--chirpui-transition);
}

.chirpui-ascii-fader__segment--filled {
    color: var(--chirpui-accent);
    text-shadow: 0 0 4px currentColor;
}

.chirpui-ascii-fader__label {
    font-size: var(--chirpui-font-xs, 0.6rem);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--chirpui-text-muted);
}

.chirpui-ascii-fader__value {
    font-size: var(--chirpui-font-xs, 0.6rem);
    color: var(--chirpui-text-muted);
    min-width: 2em;
    text-align: center;
}

/* Color variants */
.chirpui-ascii-fader--success .chirpui-ascii-fader__segment--filled { color: var(--chirpui-success); }
.chirpui-ascii-fader--warning .chirpui-ascii-fader__segment--filled { color: var(--chirpui-warning, #e6a700); }
.chirpui-ascii-fader--danger .chirpui-ascii-fader__segment--filled { color: var(--chirpui-error); }
.chirpui-ascii-fader--accent .chirpui-ascii-fader__segment--filled { color: var(--chirpui-accent); }

/* Fader bank */
.chirpui-ascii-fader-bank {
    display: inline-flex;
    flex-direction: column;
    align-items: center;
    gap: 0.5rem;
}
.chirpui-ascii-fader-bank__title {
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
    font-size: var(--chirpui-font-xs, 0.6rem);
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--chirpui-text-muted);
}
.chirpui-ascii-fader-bank__faders {
    display: flex;
    gap: 0.75rem;
    align-items: flex-end;
}

/* ================================================================
   ASCII VU Meter — horizontal bouncing level bars
   ================================================================ */

@keyframes chirpui-vu-bounce {
    0%, 100% { opacity: 1; }
    30% { opacity: 0.85; }
    60% { opacity: 1; }
    80% { opacity: 0.9; }
}

.chirpui-ascii-vu {
    display: flex;
    align-items: center;
    gap: 0.5em;
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
    font-size: 0.8rem;
    line-height: 1;
}

.chirpui-ascii-vu__label {
    font-size: var(--chirpui-font-xs, 0.6rem);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--chirpui-text-muted);
    min-width: 2.5em;
    text-align: right;
}

.chirpui-ascii-vu__track {
    display: inline-flex;
    align-items: center;
    white-space: nowrap;
}

.chirpui-ascii-vu__bracket {
    color: var(--chirpui-text-muted);
    opacity: 0.5;
}

.chirpui-ascii-vu__cell {
    color: var(--chirpui-text-muted);
    opacity: 0.3;
    transition: color var(--chirpui-transition), opacity var(--chirpui-transition);
}

.chirpui-ascii-vu__cell--filled {
    color: var(--chirpui-success);
    opacity: 1;
    text-shadow: 0 0 2px currentColor;
}

.chirpui-ascii-vu__cell--hot {
    color: var(--chirpui-error);
    text-shadow: 0 0 4px currentColor;
}

.chirpui-ascii-vu__cell--peak {
    color: var(--chirpui-error);
    text-shadow: 0 0 6px currentColor;
    font-weight: 700;
}

.chirpui-ascii-vu__readout {
    font-size: var(--chirpui-font-xs, 0.6rem);
    color: var(--chirpui-text-muted);
    min-width: 3em;
}

/* Animate variant */
.chirpui-ascii-vu--animate .chirpui-ascii-vu__cell--filled {
    animation: chirpui-vu-bounce 1.5s ease-in-out infinite;
}
.chirpui-ascii-vu--animate .chirpui-ascii-vu__cell--filled:nth-child(odd) {
    animation-delay: 0.1s;
}

/* Color variants */
.chirpui-ascii-vu--accent .chirpui-ascii-vu__cell--filled { color: var(--chirpui-accent); }
.chirpui-ascii-vu--accent .chirpui-ascii-vu__cell--hot { color: var(--chirpui-accent); }
.chirpui-ascii-vu--success .chirpui-ascii-vu__cell--filled { color: var(--chirpui-success); }
.chirpui-ascii-vu--warning .chirpui-ascii-vu__cell--filled { color: var(--chirpui-warning, #e6a700); }
.chirpui-ascii-vu--warning .chirpui-ascii-vu__cell--hot { color: var(--chirpui-error); }

/* Stack layout */
.chirpui-ascii-vu-stack {
    display: flex;
    flex-direction: column;
    gap: 0.35em;
}
.chirpui-ascii-vu-stack__title {
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
    font-size: var(--chirpui-font-xs, 0.6rem);
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--chirpui-text-muted);
}

@media (prefers-reduced-motion: reduce) {
    .chirpui-ascii-vu--animate .chirpui-ascii-vu__cell--filled {
        animation: none;
    }
}

/* ================================================================
   ASCII 7-Segment Display — retro LCD readout
   ================================================================ */

.chirpui-ascii-7seg {
    display: inline-flex;
    flex-direction: column;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
}

.chirpui-ascii-7seg__label {
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
    font-size: var(--chirpui-font-xs, 0.6rem);
    letter-spacing: 0.15em;
    text-transform: uppercase;
    color: var(--chirpui-text-muted);
}

.chirpui-ascii-7seg__display {
    display: inline-flex;
    align-items: center;
    background: var(--chirpui-bg-subtle);
    border: 1px solid var(--chirpui-border);
    border-radius: 3px;
    padding: 0.3em 0.15em;
    gap: 0;
}

.chirpui-ascii-7seg__frame {
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
    font-size: 0.6em;
    color: var(--chirpui-text-muted);
    opacity: 0.3;
    padding: 0 0.1em;
}

.chirpui-ascii-7seg__digit {
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
    font-size: 1.6rem;
    font-weight: 700;
    line-height: 1;
    letter-spacing: 0.08em;
    padding: 0 0.06em;
    color: var(--chirpui-text);
    text-shadow: 0 0 6px currentColor;
}

/* Colon and period are narrower */
.chirpui-ascii-7seg__digit[data-char=":"],
.chirpui-ascii-7seg__digit[data-char="."] {
    letter-spacing: 0;
    padding: 0;
    font-size: 1.4rem;
}

/* Dash is muted */
.chirpui-ascii-7seg__digit[data-char="-"] {
    opacity: 0.5;
}

/* Color variants */
.chirpui-ascii-7seg--accent .chirpui-ascii-7seg__digit { color: var(--chirpui-accent); }
.chirpui-ascii-7seg--success .chirpui-ascii-7seg__digit { color: var(--chirpui-success); }
.chirpui-ascii-7seg--warning .chirpui-ascii-7seg__digit { color: var(--chirpui-warning, #e6a700); }
.chirpui-ascii-7seg--error .chirpui-ascii-7seg__digit { color: var(--chirpui-error); }

/* ================================================================
   ASCII Checkbox — ☐/☑ ballot-style checkboxes
   ================================================================ */

.chirpui-ascii-checkbox {
    display: flex;
    align-items: center;
    gap: 0.5em;
    cursor: pointer;
    user-select: none;
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
}

.chirpui-ascii-checkbox__box {
    font-size: 1.1rem;
    line-height: 1;
    color: var(--chirpui-text-muted);
    transition: color var(--chirpui-transition);
}
.chirpui-ascii-checkbox__box::before {
    content: "☐";
}

.chirpui-ascii-checkbox:has(.chirpui-ascii-checkbox__input:checked) .chirpui-ascii-checkbox__box {
    color: var(--chirpui-accent);
}
.chirpui-ascii-checkbox:has(.chirpui-ascii-checkbox__input:checked) .chirpui-ascii-checkbox__box::before {
    content: "☑";
}

/* Active press */
.chirpui-ascii-checkbox:has(.chirpui-ascii-checkbox__input:active) .chirpui-ascii-checkbox__box::before {
    content: "☒";
}

.chirpui-ascii-checkbox__label {
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text);
}

/* Focus */
.chirpui-ascii-checkbox:has(.chirpui-ascii-checkbox__input:focus-visible) .chirpui-ascii-checkbox__box {
    outline: 2px solid var(--chirpui-focus-ring);
    outline-offset: 2px;
    border-radius: 2px;
}

/* Disabled */
.chirpui-ascii-checkbox--disabled {
    opacity: 0.4;
    cursor: not-allowed;
    pointer-events: none;
}

/* Variants */
.chirpui-ascii-checkbox--accent:has(.chirpui-ascii-checkbox__input:checked) .chirpui-ascii-checkbox__box { color: var(--chirpui-accent); }
.chirpui-ascii-checkbox--success:has(.chirpui-ascii-checkbox__input:checked) .chirpui-ascii-checkbox__box { color: var(--chirpui-success); }
.chirpui-ascii-checkbox--danger:has(.chirpui-ascii-checkbox__input:checked) .chirpui-ascii-checkbox__box { color: var(--chirpui-error); }

/* Group */
.chirpui-ascii-checkbox-group {
    display: flex;
    flex-direction: column;
    gap: 0.4em;
    border: none;
    padding: 0;
    margin: 0;
}
.chirpui-ascii-checkbox-group__legend {
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
    font-size: var(--chirpui-font-xs, 0.65rem);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--chirpui-text-muted);
    margin-bottom: 0.35em;
}

/* ================================================================
   ASCII Radio — (○)/(●) dial-style selectors
   ================================================================ */

.chirpui-ascii-radio {
    display: flex;
    align-items: center;
    gap: 0.5em;
    cursor: pointer;
    user-select: none;
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
}

.chirpui-ascii-radio__dot {
    font-size: 1.1rem;
    line-height: 1;
    color: var(--chirpui-text-muted);
    transition: color var(--chirpui-transition);
}
.chirpui-ascii-radio__dot::before {
    content: "○";
}

.chirpui-ascii-radio:has(.chirpui-ascii-radio__input:checked) .chirpui-ascii-radio__dot {
    color: var(--chirpui-accent);
}
.chirpui-ascii-radio:has(.chirpui-ascii-radio__input:checked) .chirpui-ascii-radio__dot::before {
    content: "●";
}

/* Active */
.chirpui-ascii-radio:has(.chirpui-ascii-radio__input:active) .chirpui-ascii-radio__dot::before {
    content: "◉";
}

.chirpui-ascii-radio__label {
    font-size: var(--chirpui-font-sm);
    color: var(--chirpui-text);
}

/* Focus */
.chirpui-ascii-radio:has(.chirpui-ascii-radio__input:focus-visible) .chirpui-ascii-radio__dot {
    outline: 2px solid var(--chirpui-focus-ring);
    outline-offset: 2px;
    border-radius: 50%;
}

/* Disabled */
.chirpui-ascii-radio--disabled {
    opacity: 0.4;
    cursor: not-allowed;
    pointer-events: none;
}

/* Group */
.chirpui-ascii-radio-group {
    display: flex;
    flex-direction: column;
    gap: 0.4em;
    border: none;
    padding: 0;
    margin: 0;
}
.chirpui-ascii-radio-group--horizontal {
    flex-direction: row;
    gap: 1.25em;
}
.chirpui-ascii-radio-group__legend {
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
    font-size: var(--chirpui-font-xs, 0.65rem);
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--chirpui-text-muted);
    margin-bottom: 0.35em;
}

/* Accent variant */
.chirpui-ascii-radio-group--accent .chirpui-ascii-radio:has(.chirpui-ascii-radio__input:checked) .chirpui-ascii-radio__dot {
    color: var(--chirpui-accent);
}

/* ================================================================
   ASCII Stepper — pipeline/wizard progress
   [✓]───[✓]───[●]───[○]───[○]
   ================================================================ */

.chirpui-ascii-stepper {
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
}

.chirpui-ascii-stepper__track {
    display: flex;
    align-items: flex-start;
}

.chirpui-ascii-stepper__step {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.25em;
}

.chirpui-ascii-stepper__node {
    font-size: 0.85rem;
    line-height: 1;
    white-space: nowrap;
    color: var(--chirpui-text-muted);
    transition: color var(--chirpui-transition);
}

.chirpui-ascii-stepper__label {
    font-size: var(--chirpui-font-xs, 0.6rem);
    color: var(--chirpui-text-muted);
    white-space: nowrap;
    transition: color var(--chirpui-transition);
}

.chirpui-ascii-stepper__connector {
    font-size: 0.85rem;
    line-height: 1;
    color: var(--chirpui-text-muted);
    opacity: 0.4;
    padding-top: 0;
    align-self: center;
    margin-top: -0.25em;
}

/* Complete step */
.chirpui-ascii-stepper__step--complete .chirpui-ascii-stepper__node {
    color: var(--chirpui-success);
}
.chirpui-ascii-stepper__step--complete .chirpui-ascii-stepper__label {
    color: var(--chirpui-text);
}
.chirpui-ascii-stepper__connector--complete {
    color: var(--chirpui-success);
    opacity: 0.8;
}

/* Active step */
.chirpui-ascii-stepper__step--active .chirpui-ascii-stepper__node {
    color: var(--chirpui-accent);
    text-shadow: 0 0 4px currentColor;
}
.chirpui-ascii-stepper__step--active .chirpui-ascii-stepper__label {
    color: var(--chirpui-text);
    font-weight: 600;
}

/* Pending step — stays muted (default) */

/* Variants */
.chirpui-ascii-stepper--accent .chirpui-ascii-stepper__step--complete .chirpui-ascii-stepper__node { color: var(--chirpui-accent); }
.chirpui-ascii-stepper--accent .chirpui-ascii-stepper__connector--complete { color: var(--chirpui-accent); }
.chirpui-ascii-stepper--success .chirpui-ascii-stepper__step--active .chirpui-ascii-stepper__node { color: var(--chirpui-success); }

/* ================================================================
   ASCII Split-Flap Display — Solari board / departure board
   ================================================================ */

@keyframes chirpui-split-flap-flip {
    0% {
        transform: scaleY(0.1) translateY(-40%);
        opacity: 0;
    }
    30% {
        transform: scaleY(1.05);
        opacity: 1;
    }
    50% {
        transform: scaleY(0.97);
    }
    100% {
        transform: scaleY(1);
        opacity: 1;
    }
}

.chirpui-split-flap {
    display: inline-flex;
    gap: 2px;
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
}

.chirpui-split-flap__char {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1.1em;
    height: 1.6em;
    background: var(--chirpui-bg-subtle);
    border: 1px solid var(--chirpui-border);
    border-radius: 2px;
    font-size: 0.95rem;
    font-weight: 700;
    letter-spacing: 0;
    color: var(--chirpui-text);
    position: relative;
    overflow: hidden;
}

/* Center split line — the mechanical gap */
.chirpui-split-flap__char::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    top: 50%;
    height: 1px;
    background: var(--chirpui-border);
    opacity: 0.6;
    pointer-events: none;
}

/* Flip animation */
.chirpui-split-flap--animate .chirpui-split-flap__char {
    animation: chirpui-split-flap-flip 0.4s ease-out both;
}

/* Amber variant — classic departure board */
.chirpui-split-flap--amber .chirpui-split-flap__char {
    background: #1a1400;
    border-color: #3a3000;
    color: #ffb300;
    text-shadow: 0 0 4px #ffb30066;
}
.chirpui-split-flap--amber .chirpui-split-flap__char::after {
    background: #3a3000;
}

/* Green variant — retro terminal */
.chirpui-split-flap--green .chirpui-split-flap__char {
    background: #001a00;
    border-color: #003a00;
    color: #33ff33;
    text-shadow: 0 0 4px #33ff3366;
}
.chirpui-split-flap--green .chirpui-split-flap__char::after {
    background: #003a00;
}

/* Row in a board */
.chirpui-split-flap-row {
    display: flex;
    gap: 1.5rem;
    padding: 0.35rem 0;
}

/* Board container */
.chirpui-split-flap-board {
    display: inline-flex;
    flex-direction: column;
    background: var(--chirpui-bg-subtle);
    border: 2px solid var(--chirpui-border);
    border-radius: 4px;
    padding: 0.75rem 1rem;
    gap: 0;
}

.chirpui-split-flap-board__title {
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
    font-size: var(--chirpui-font-xs, 0.6rem);
    letter-spacing: 0.2em;
    text-transform: uppercase;
    color: var(--chirpui-text-muted);
    padding-bottom: 0.5rem;
    border-bottom: 1px solid var(--chirpui-border);
    margin-bottom: 0.25rem;
}

.chirpui-split-flap-board__body {
    display: flex;
    flex-direction: column;
}

/* Board color variants */
.chirpui-split-flap-board--amber {
    background: #0d0a00;
    border-color: #3a3000;
}
.chirpui-split-flap-board--amber .chirpui-split-flap-board__title {
    color: #ffb30088;
    border-color: #3a3000;
}
.chirpui-split-flap-board--amber .chirpui-split-flap__char {
    background: #1a1400;
    border-color: #3a3000;
    color: #ffb300;
    text-shadow: 0 0 4px #ffb30066;
}
.chirpui-split-flap-board--amber .chirpui-split-flap__char::after {
    background: #3a3000;
}

.chirpui-split-flap-board--green {
    background: #000d00;
    border-color: #003a00;
}
.chirpui-split-flap-board--green .chirpui-split-flap-board__title {
    color: #33ff3388;
    border-color: #003a00;
}
.chirpui-split-flap-board--green .chirpui-split-flap__char {
    background: #001a00;
    border-color: #003a00;
    color: #33ff33;
    text-shadow: 0 0 4px #33ff3366;
}
.chirpui-split-flap-board--green .chirpui-split-flap__char::after {
    background: #003a00;
}

/* Divider between rows */
.chirpui-split-flap-row + .chirpui-split-flap-row {
    border-top: 1px solid var(--chirpui-border);
}
.chirpui-split-flap-board--amber .chirpui-split-flap-row + .chirpui-split-flap-row {
    border-color: #3a3000;
}
.chirpui-split-flap-board--green .chirpui-split-flap-row + .chirpui-split-flap-row {
    border-color: #003a00;
}

@media (prefers-reduced-motion: reduce) {
    .chirpui-split-flap--animate .chirpui-split-flap__char {
        animation: none;
    }
}

/* ================================================================
   ASCII Ticker — scrolling text banner
   ================================================================ */

@keyframes chirpui-ticker-scroll {
    from { transform: translateX(0); }
    to { transform: translateX(-50%); }
}

.chirpui-ascii-ticker {
    display: flex;
    align-items: center;
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
    font-size: 0.8rem;
    overflow: hidden;
    max-width: 100%;
}

.chirpui-ascii-ticker__bracket {
    color: var(--chirpui-text-muted);
    opacity: 0.5;
    flex-shrink: 0;
}

.chirpui-ascii-ticker__track {
    overflow: hidden;
    flex: 1;
    min-width: 0;
}

.chirpui-ascii-ticker__text {
    display: inline-block;
    white-space: nowrap;
    animation: chirpui-ticker-scroll 20s linear infinite;
    color: var(--chirpui-text);
}

/* Speeds */
.chirpui-ascii-ticker--slow .chirpui-ascii-ticker__text { animation-duration: 35s; }
.chirpui-ascii-ticker--fast .chirpui-ascii-ticker__text { animation-duration: 10s; }

/* Variants */
.chirpui-ascii-ticker--accent .chirpui-ascii-ticker__text { color: var(--chirpui-accent); }
.chirpui-ascii-ticker--success .chirpui-ascii-ticker__text { color: var(--chirpui-success); }
.chirpui-ascii-ticker--warning .chirpui-ascii-ticker__text { color: var(--chirpui-warning, #e6a700); }
.chirpui-ascii-ticker--error .chirpui-ascii-ticker__text { color: var(--chirpui-error); }

@media (prefers-reduced-motion: reduce) {
    .chirpui-ascii-ticker__text {
        animation: none;
    }
}

/* ================================================================
   ASCII Table — box-drawing character borders
   ================================================================ */

/* Character maps per variant (via CSS custom properties) */
.chirpui-ascii-table--single {
    --_at-tl: "┌"; --_at-tr: "┐"; --_at-bl: "└"; --_at-br: "┘";
    --_at-h: "─"; --_at-v: "│";
    --_at-mt: "┬"; --_at-mb: "┴"; --_at-ml: "├"; --_at-mr: "┤"; --_at-x: "┼";
    --_at-mh: "─";
}
.chirpui-ascii-table--double {
    --_at-tl: "╔"; --_at-tr: "╗"; --_at-bl: "╚"; --_at-br: "╝";
    --_at-h: "═"; --_at-v: "║";
    --_at-mt: "╦"; --_at-mb: "╩"; --_at-ml: "╠"; --_at-mr: "╣"; --_at-x: "╬";
    --_at-mh: "═";
}
.chirpui-ascii-table--heavy {
    --_at-tl: "┏"; --_at-tr: "┓"; --_at-bl: "┗"; --_at-br: "┛";
    --_at-h: "━"; --_at-v: "┃";
    --_at-mt: "┳"; --_at-mb: "┻"; --_at-ml: "┣"; --_at-mr: "┫"; --_at-x: "╋";
    --_at-mh: "━";
}
.chirpui-ascii-table--rounded {
    --_at-tl: "╭"; --_at-tr: "╮"; --_at-bl: "╰"; --_at-br: "╯";
    --_at-h: "─"; --_at-v: "│";
    --_at-mt: "┬"; --_at-mb: "┴"; --_at-ml: "├"; --_at-mr: "┤"; --_at-x: "┼";
    --_at-mh: "─";
}

.chirpui-ascii-table {
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
    font-size: var(--chirpui-font-sm);
    line-height: 1.5;
    color: var(--chirpui-text);
    display: inline-block;
    max-width: 100%;
}

/* Border lines — built from repeating characters */
.chirpui-ascii-table__border {
    white-space: nowrap;
    overflow: hidden;
    color: var(--chirpui-text-muted);
    user-select: none;
}
.chirpui-ascii-table__border--top::before,
.chirpui-ascii-table__border--mid::before,
.chirpui-ascii-table__border--bottom::before {
    display: block;
    overflow: hidden;
}
.chirpui-ascii-table__border--top::before {
    content: "┌────────────────────────────────────────────────────────────────────────────────────────────────────┐";
}
.chirpui-ascii-table__border--mid::before {
    content: "├────────────────────────────────────────────────────────────────────────────────────────────────────┤";
}
.chirpui-ascii-table__border--bottom::before {
    content: "└────────────────────────────────────────────────────────────────────────────────────────────────────┘";
}

/* Double variant overrides */
.chirpui-ascii-table--double .chirpui-ascii-table__border--top::before {
    content: "╔════════════════════════════════════════════════════════════════════════════════════════════════════╗";
}
.chirpui-ascii-table--double .chirpui-ascii-table__border--mid::before {
    content: "╠════════════════════════════════════════════════════════════════════════════════════════════════════╣";
}
.chirpui-ascii-table--double .chirpui-ascii-table__border--bottom::before {
    content: "╚════════════════════════════════════════════════════════════════════════════════════════════════════╝";
}

/* Heavy variant overrides */
.chirpui-ascii-table--heavy .chirpui-ascii-table__border--top::before {
    content: "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓";
}
.chirpui-ascii-table--heavy .chirpui-ascii-table__border--mid::before {
    content: "┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫";
}
.chirpui-ascii-table--heavy .chirpui-ascii-table__border--bottom::before {
    content: "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛";
}

/* Rounded variant overrides */
.chirpui-ascii-table--rounded .chirpui-ascii-table__border--top::before {
    content: "╭────────────────────────────────────────────────────────────────────────────────────────────────────╮";
}
.chirpui-ascii-table--rounded .chirpui-ascii-table__border--bottom::before {
    content: "╰────────────────────────────────────────────────────────────────────────────────────────────────────╯";
}

/* Rows */
.chirpui-ascii-table__row {
    display: flex;
    gap: 0;
    transition: background var(--chirpui-transition);
}
.chirpui-ascii-table__row::before,
.chirpui-ascii-table__row::after {
    content: "│";
    color: var(--chirpui-text-muted);
    flex-shrink: 0;
    display: flex;
    align-items: center;
}
.chirpui-ascii-table--double .chirpui-ascii-table__row::before,
.chirpui-ascii-table--double .chirpui-ascii-table__row::after {
    content: "║";
}
.chirpui-ascii-table--heavy .chirpui-ascii-table__row::before,
.chirpui-ascii-table--heavy .chirpui-ascii-table__row::after {
    content: "┃";
}

/* Cells */
.chirpui-ascii-table__th,
.chirpui-ascii-table__td {
    flex: 1;
    padding: 0.15em 1em;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.chirpui-ascii-table__th {
    font-weight: 600;
    color: var(--chirpui-text);
}

.chirpui-ascii-table__td {
    color: var(--chirpui-text);
}

/* Cell alignment */
.chirpui-ascii-table__cell--left { text-align: left; }
.chirpui-ascii-table__cell--center { text-align: center; }
.chirpui-ascii-table__cell--right { text-align: right; }

/* Row hover */
.chirpui-ascii-table__body .chirpui-ascii-table__row:hover {
    background: var(--chirpui-bg-subtle);
}

/* Striped rows */
.chirpui-ascii-table--striped .chirpui-ascii-table__body .chirpui-ascii-table__row:nth-child(even) {
    background: var(--chirpui-bg-subtle);
}

/* Compact */
.chirpui-ascii-table--compact .chirpui-ascii-table__th,
.chirpui-ascii-table--compact .chirpui-ascii-table__td {
    padding: 0 0.75em;
}

/* Sticky header */
.chirpui-ascii-table--sticky .chirpui-ascii-table__head {
    position: sticky;
    top: 0;
    z-index: 1;
    background: var(--chirpui-surface);
}

/* ================================================================
   Row component enhancements
   ================================================================ */

/* --- Table: row hover --- */
.chirpui-table__row {
    transition: background var(--chirpui-transition);
}
.chirpui-table__row:hover {
    background: var(--chirpui-bg-subtle);
}

/* --- Table: cell truncation utility --- */
.chirpui-table__td--truncate {
    max-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* --- Table: monospace cells (for IDs, hashes, paths) --- */
.chirpui-table__td--mono {
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
    font-size: var(--chirpui-font-sm);
}

/* --- Table: empty state --- */
.chirpui-table__empty {
    text-align: center;
    padding: var(--chirpui-spacing-lg) var(--chirpui-spacing);
    color: var(--chirpui-text-muted);
    font-style: italic;
}

/* --- Description list: row hover + dividers --- */
.chirpui-dl--hoverable .chirpui-dl__row {
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-sm);
    border-radius: var(--chirpui-radius-sm);
    transition: background var(--chirpui-transition);
}
.chirpui-dl--hoverable .chirpui-dl__row:hover {
    background: var(--chirpui-bg-subtle);
}

.chirpui-dl--divided .chirpui-dl__row {
    padding-bottom: var(--chirpui-spacing-sm);
    border-bottom: 1px solid var(--chirpui-border);
}
.chirpui-dl--divided .chirpui-dl__row:last-child {
    border-bottom: none;
    padding-bottom: 0;
}

/* --- Description list: icon slot --- */
.chirpui-dl__icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.25em;
    flex-shrink: 0;
    color: var(--chirpui-text-muted);
    font-family: var(--chirpui-font-mono, ui-monospace, monospace);
}

.chirpui-dl__term-group {
    display: flex;
    align-items: center;
    gap: var(--chirpui-spacing-xs);
}

/* --- Config row: hover + dividers --- */
.chirpui-config-row-list--hoverable .chirpui-config-row:hover > * {
    background: var(--chirpui-bg-subtle);
}
.chirpui-config-row-list--hoverable .chirpui-config-row > * {
    transition: background var(--chirpui-transition);
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-sm);
}

.chirpui-config-row-list--divided {
    row-gap: 0;
}
.chirpui-config-row-list--divided .chirpui-config-row > *:first-child {
    border-bottom: 1px solid var(--chirpui-border);
    padding-bottom: var(--chirpui-spacing-sm);
}
.chirpui-config-row-list--divided .chirpui-config-row > *:last-child {
    border-bottom: 1px solid var(--chirpui-border);
    padding-bottom: var(--chirpui-spacing-sm);
}
.chirpui-config-row-list--divided .chirpui-config-row:last-child > * {
    border-bottom: none;
}

/* --- Settings row: hover + dividers --- */
.chirpui-settings-row-list--hoverable .chirpui-settings-row:hover > * {
    background: var(--chirpui-bg-subtle);
}
.chirpui-settings-row-list--hoverable .chirpui-settings-row > * {
    transition: background var(--chirpui-transition);
    padding: var(--chirpui-spacing-xs) var(--chirpui-spacing-sm);
}

.chirpui-settings-row-list--divided {
    row-gap: 0;
}
.chirpui-settings-row-list--divided .chirpui-settings-row > *:first-child {
    border-bottom: 1px solid var(--chirpui-border);
    padding-bottom: var(--chirpui-spacing-sm);
}
.chirpui-settings-row-list--divided .chirpui-settings-row > *:nth-child(2) {
    border-bottom: 1px solid var(--chirpui-border);
    padding-bottom: var(--chirpui-spacing-sm);
}
.chirpui-settings-row-list--divided .chirpui-settings-row > *:last-child {
    border-bottom: 1px solid var(--chirpui-border);
    padding-bottom: var(--chirpui-spacing-sm);
}
.chirpui-settings-row-list--divided .chirpui-settings-row:last-child > * {
    border-bottom: none;
}

/* --- Shared: relaxed density --- */
.chirpui-dl--relaxed .chirpui-dl__row {
    margin-bottom: var(--chirpui-spacing);
}
.chirpui-config-row-list--relaxed {
    row-gap: var(--chirpui-spacing);
}
.chirpui-settings-row-list--relaxed {
    row-gap: var(--chirpui-spacing);
}
