/* nexcalia/ui — bundled CSS. Generated by scripts/build-dist.php. Do not edit. */

/* ===== tokens.css ===== */


:root {
  --font-sans: "Inter Tight", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
  --font-mono: "JetBrains Mono", ui-monospace, "SF Mono", Menlo, monospace;

  
  --nx-blue:           #3359A5;  
  --nx-blue-ribbon:    #264D91;  
  --nx-royal-blue:     #4B6FB7;  
  --nx-dodger-blue:    #5F8FD1;  
  --nx-mariner:        #7FA7DE;  
  --nx-botticelli:     #D4DEEF;  
  --nx-puertorico:     #57B893;  
  --nx-highlight:      #F6DB78;  
  --nx-whisper:        #FBFBFD;  
  --nx-white-lilac:    #F3F5FA;  
  --nx-ghost:          #C6CDD8;  
  --nx-regent-gray:    #8894A5;  
  --nx-pickled:        #2B3948;  
  --nx-night-shadz:    #A53359;  
  --nx-tall-poppy:     #B22A36;

  /* Universal anchors — only place where hex literals live by design.
     --nx-white: always-white text reference for accent buttons + dark code blocks
                 (do NOT use --surface, which becomes dark in dark mode).
     --nx-code-fg: light foreground for the dark code-snippet panel in the catalog. */
  --nx-white:          #FFFFFF;
  --nx-code-fg:        #E6EAF5;


  --bg:        var(--nx-whisper);
  --bg-2:      var(--nx-white-lilac);
  --surface:   #ffffff;
  --surface-2: var(--nx-white-lilac);
  --ink:       var(--nx-pickled);
  --ink-2:     #3A4658;
  /* A11Y-001 — repointed from #8894A5 (3.8:1, AA fail) to #5B6878 (5.5:1, AA pass) */
  /* A11Y-002 — bumped from #5B6878 (5.5:1) to #4E5B6C (7.0:1) for stronger
     section labels (Aujourd'hui / Gestion) and tertiary text on tinted surfaces. */
  --regent-darker:    #4E5B6C;
  --ink-3:     var(--regent-darker);
  --line:      #E6EAF1;
  --line-2:    var(--nx-ghost);
  --hover:     #ECF0F6;

  /* Accessible badge tints — paired with their *-dark ink for AA contrast */
  --puertorico-dark:  #1F5F46;
  --puertorico-tint:  #E7F4EE;
  --highlight-dark:   #6B5817;
  --highlight-tint:   #FFF7DD;
  --night-shadz-tint: #F8E0E8;

  --primary:      var(--nx-blue);
  --primary-deep: var(--nx-blue-ribbon);
  --primary-soft: var(--nx-botticelli);
  --primary-tint: #ECF0F8;

  --ok:           var(--nx-puertorico);                          
  --ok-deep:      color-mix(in oklab, var(--nx-puertorico) 75%, var(--ink)); 
  --ok-soft:      #DDEFE6;
  --warn:         var(--nx-night-shadz);
  --warn-soft:    color-mix(in oklab, var(--nx-highlight) 45%, var(--surface));
  --info:         var(--nx-blue);
  --info-soft:    var(--nx-botticelli);
  --danger:       var(--nx-tall-poppy);
  --danger-soft:  #F5D6DA;
  /* Rouge d'à-plat sous texte blanc (pastilles de compteur, badges pleins).
     En palette claire --danger convient déjà : blanc sur #B22A36 = 6.4:1. */
  --danger-strong: var(--nx-tall-poppy);
  --neutral:      #4A5667;
  --neutral-soft: #E6EAF1;

  --accent-yellow: var(--nx-highlight);
  --accent-green:  var(--nx-puertorico);
  --accent-burgundy: var(--nx-night-shadz);

  
  --row-h: 48px;
  --pad-y: 12px;
  --pad-x: 18px;
  --fs-body: 0.9375rem;  
  --fs-sm: 0.875rem;     
  --fs-xs: 0.8125rem;    
  --gap: 14px;

  --radius: 8px;
  --radius-sm: 6px;
  --radius-lg: 12px;

  --shadow-sm: 0 1px 0 rgba(40, 24, 16, 0.04), 0 1px 2px rgba(40, 24, 16, 0.04);
  --shadow-md: 0 1px 0 rgba(40, 24, 16, 0.04), 0 8px 24px rgba(40, 24, 16, 0.08);
  --shadow-lg: 0 12px 40px rgba(40, 24, 16, 0.14), 0 2px 6px rgba(40, 24, 16, 0.06);
}

[data-palette="burgundy"] {
  --primary:      var(--nx-night-shadz);   
  --primary-deep: #7A1F40;
  --primary-soft: #F5D6E1;
  --primary-tint: #FBEEF3;
  --info:         var(--nx-night-shadz);
  --info-soft:    #F5D6E1;
}

[data-palette="mariner"] {
  --primary:      var(--nx-mariner);       
  --primary-deep: var(--nx-royal-blue);    
  --primary-soft: #DFE8F5;
  --primary-tint: #EEF3FA;
  --info:         var(--nx-mariner);
  --info-soft:    #DFE8F5;
}

[data-palette="emerald"] {
  --primary:      var(--nx-puertorico);    
  --primary-deep: #3D8C6E;
  --primary-soft: #D8F1E5;
  --primary-tint: #EBF7F1;
  --info:         var(--nx-puertorico);
  --info-soft:    #D8F1E5;
}

[data-palette="dark"] {
  --bg:        #0B1020;
  --bg-2:      #131A2E;
  --surface:   #161E36;
  --surface-2: #0F1528;
  --ink:       #E6EAF5;
  --ink-2:     #A3ADC7;
  /* A11Y-001 — bumped from #6B7591 to #A8B5C4 for AA on dark surface */
  --ink-3:     #A8B5C4;
  --line:      #232C47;
  --line-2:    #2E3856;
  --hover:     #1C2540;
  /* A11Y: was #6BA0FF — white text on it gave 2.6:1 (FAIL). #3B79F2 ≈ 4.1:1. */
  --primary:      #3B79F2;
  --primary-deep: #2455B5;
  --primary-soft: rgba(107, 160, 255, 0.18);
  --primary-tint: rgba(107, 160, 255, 0.08);
  --ok:           #36D399;
  --ok-deep:      #6EE3B4;
  --ok-soft:      rgba(54, 211, 153, 0.16);
  --warn:         #F4C242;
  --warn-soft:    rgba(244, 194, 66, 0.16);
  --info:         #6BA0FF;
  --info-soft:    rgba(107, 160, 255, 0.16);
  --danger:       #F87171;
  --danger-soft:  rgba(248, 113, 113, 0.16);
  /* A11Y — --danger sous texte blanc ne donne que 2.8:1 (FAIL) : trop clair pour un
     à-plat. #D02F3D = 5.1:1 avec blanc, et 3.6:1 sur --surface-2 (> 3:1 requis pour
     un élément non textuel) donc la pastille reste franche sur fond sombre. */
  --danger-strong: #D02F3D;
  --neutral:      #A3ADC7;
  --neutral-soft: #232C47;
  --shadow-sm: 0 1px 0 rgba(0,0,0,.25), 0 1px 2px rgba(0,0,0,.35);
  --shadow-md: 0 1px 0 rgba(0,0,0,.25), 0 8px 24px rgba(0,0,0,.45);
  --shadow-lg: 0 12px 40px rgba(0,0,0,.55), 0 2px 6px rgba(0,0,0,.4);
}

[data-density="compact"] {
  --row-h: 34px;
  --pad-y: 7px;
  --pad-x: 12px;
  --fs-body: 0.8125rem;
  --fs-sm: 0.75rem;
  --fs-xs: 0.6875rem;
  --gap: 8px;
}

[data-density="comfy"] {
  --row-h: 48px;
  --pad-y: 14px;
  --pad-x: 20px;
  --fs-body: 0.9375rem;
  --fs-sm: 0.875rem;
  --fs-xs: 0.8125rem;
  --gap: 16px;
}

html { font-size: 16px; }
html[data-scale="md"] {
  font-size: 17px;
  --row-h: 52px;
  --pad-y: 14px;
}
html[data-scale="lg"] {
  font-size: 18px;
  --row-h: 56px;
  --pad-y: 16px;
}
html[data-scale="xl"] {
  font-size: 20px;
  --row-h: 60px;
  --pad-y: 18px;
}

.nexcalia-app, .nexcalia-app * { box-sizing: border-box; }
.nexcalia-app {
  font-family: var(--font-sans);
  background: var(--bg);
  color: var(--ink);
  font-size: var(--fs-body);
  font-feature-settings: "ss01", "cv11";
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}
/* .nexcalia-shell carries shell-grid sizing; .nexcalia-app stays a pure CSS
   scope with no layout opinions. Pairs with the .nexcalia-shell grid declared
   in components.css (commit 2411060 — feat/decouple-app-scope-from-shell-grid). */
.nexcalia-shell { height: 100vh; }
.nexcalia-app button { font-family: inherit; }
/* ===== components.css ===== */

/* ===== catalog.css ===== */

.nx-ds-section {
    background: var(--surface);
    border: 1px solid var(--line);
    border-radius: var(--radius-lg);
    padding: 24px;
    box-shadow: var(--shadow-sm);
    transition: box-shadow .2s ease-out, transform .2s ease-out;
}
.nx-ds-section:hover {
    box-shadow: var(--shadow-md);
}
.nx-ds-section-head {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    gap: 20px;
    margin-bottom: 20px;
    padding-bottom: 16px;
    border-bottom: 1px dashed color-mix(in oklab, var(--line) 80%, transparent);
}
.nx-ds-section-head h2 {
    font-size: 1rem;
    font-weight: 600;
    margin: 0 0 4px;
    letter-spacing: -0.01em;
}
.nx-ds-section-head p {
    font-size: 0.78125rem;
    color: var(--ink-3);
    margin: 0;
    max-width: 70ch;
    line-height: 1.5;
}
.nx-ds-section-head code {
    font-family: var(--font-mono);
    font-size: 0.6875rem;
    padding: 1px 5px;
    background: var(--bg-2);
    border-radius: 4px;
    color: var(--ink-2);
}
.nx-ds-badge {
    flex-shrink: 0;
    font-family: var(--font-mono);
    font-size: 0.65625rem;
    padding: 4px 8px;
    border-radius: 6px;
    background: color-mix(in oklab, var(--primary-soft) 70%, var(--surface));
    color: var(--primary-deep);
    font-weight: 500;
    white-space: nowrap;
}
.nx-ds-demo {
    display: flex;
    flex-direction: column;
    gap: 14px;
}
.nx-ds-row {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    align-items: flex-start;
}
.nx-ds-hint {
    align-self: center;
    margin-left: 8px;
    font-size: 0.6875rem;
    color: var(--ink-3);
    font-style: italic;
}

.nx-ds-icon-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(110px, 1fr));
    gap: 8px;
}
.nx-ds-icon-tile {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 6px;
    padding: 14px 8px 10px;
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    background: var(--bg);
    cursor: default;
    transition: all .15s ease-out;
}
.nx-ds-icon-tile:hover {
    background: var(--surface);
    border-color: var(--primary-soft);
    transform: translateY(-1px);
    box-shadow: 0 2px 8px rgba(43,57,72,.08);
}
.nx-ds-icon-svg {
    color: var(--ink-2);
    transition: color .15s, transform .2s;
}
.nx-ds-icon-tile:hover .nx-ds-icon-svg {
    color: var(--primary);
    transform: scale(1.15);
}
.nx-ds-icon-tile code {
    font-family: var(--font-mono);
    font-size: 0.625rem;
    color: var(--ink-3);
    text-align: center;
}

.nx-ds-spark-card {
    overflow: hidden;
    border: 1px solid var(--line);
    border-radius: var(--radius);
    background: var(--bg);
    padding: 14px;
}
.nx-ds-spark-label {
    font-size: 0.6875rem;
    color: var(--ink-3);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    margin-bottom: 6px;
}

.nx-ds-spark-card ui-chart {
    display: block;
    margin: 0 -14px -14px;
    width: calc(100% + 28px);
}

.nx-ds-palette-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
    gap: 10px;
}
.nx-ds-palette-tile {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px 12px;
    border: 1px solid var(--line);
    border-radius: var(--radius);
    background: var(--bg);
    font-size: 0.78125rem;
    transition: transform .15s, box-shadow .15s;
}
.nx-ds-palette-tile:hover {
    transform: translateY(-1px);
    box-shadow: var(--shadow-sm);
}
.nx-ds-palette-swatch {
    width: 30px;
    height: 30px;
    border-radius: 8px;
    flex-shrink: 0;
    display: grid;
    place-items: center;
    box-shadow: inset 0 1px 0 rgba(255,255,255,.18), 0 1px 2px rgba(43,57,72,.1);
}
.nx-ds-palette-name {
    font-weight: 500;
    color: var(--ink);
}

.nx-ds-brand-palette {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
    gap: 10px;
}
.nx-ds-color-tile {
    display: flex;
    gap: 12px;
    padding: 10px;
    border: 1px solid var(--line);
    border-radius: var(--radius);
    background: var(--bg);
    transition: transform .15s, box-shadow .15s;
    cursor: default;
}
.nx-ds-color-tile:hover {
    transform: translateY(-1px);
    box-shadow: var(--shadow-sm);
}
.nx-ds-color-swatch {
    width: 48px;
    height: 48px;
    border-radius: 8px;
    flex-shrink: 0;
    box-shadow:
        inset 0 1px 0 rgba(255,255,255,.20),
        0 1px 3px rgba(43,57,72,.10),
        inset 0 0 0 1px rgba(0,0,0,.06);
}
.nx-ds-color-info {
    display: flex;
    flex-direction: column;
    gap: 1px;
    min-width: 0;
    flex: 1;
}
.nx-ds-color-name {
    font-size: 0.75rem;
    font-weight: 600;
    color: var(--ink);
    line-height: 1.3;
}

.nx-ds-color-var {
    font-family: var(--font-mono);
    font-size: 0.6875rem;
    font-weight: 600;
    color: var(--ink-2);
    letter-spacing: -0.01em;
    line-height: 1.4;
    margin-top: 1px;
}
.nx-ds-color-hex {
    font-family: var(--font-mono);
    font-size: 0.625rem;
    color: var(--ink-3);
    letter-spacing: 0.02em;
    line-height: 1.3;
}

.nx-ds-color-tokens {
    display: flex;
    flex-wrap: wrap;
    gap: 3px;
    margin-top: 4px;
}
.nx-ds-color-token {
    font-family: var(--font-mono);
    font-size: 0.625rem;
    color: var(--primary-deep);
    background: color-mix(in oklab, var(--primary-soft) 55%, var(--surface));
    padding: 1px 6px;
    border-radius: 999px;
    line-height: 1.4;
    font-weight: 500;
    letter-spacing: -0.01em;
}

[data-palette="dark"] .nx-ds-section {
    background: color-mix(in oklab, var(--surface) 92%, white);
    border-color: rgba(255,255,255,.10);
}
[data-palette="dark"] .nx-ds-section-head {
    border-bottom-color: rgba(255,255,255,.10);
}
[data-palette="dark"] .nx-ds-icon-tile,
[data-palette="dark"] .nx-ds-spark-card,
[data-palette="dark"] .nx-ds-palette-tile {
    background: color-mix(in oklab, var(--surface) 92%, white);
    border-color: rgba(255,255,255,.10);
}

.nx-sortable-tag {
    display: inline-flex;
    align-items: center;
    padding: 2px 8px;
    font-size: 0.6875rem;
    font-weight: 500;
    color: var(--nx-night-shadz);
    background: color-mix(in oklab, var(--nx-highlight) 35%, var(--surface));
    border-radius: 999px;
}

.nx-ds-subtitle {
    font-size: 0.75rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--ink-3);
    margin-bottom: 8px;
}

.nx-sortable-readout {
    margin-top: 16px;
    padding: 12px 14px;
    background: color-mix(in oklab, var(--primary) 5%, var(--surface));
    border: 1px dashed color-mix(in oklab, var(--primary) 35%, var(--line));
    border-radius: 10px;
    font-size: 0.8125rem;
    color: var(--ink-2);
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.nx-sortable-readout-head {
    display: flex;
    align-items: center;
    gap: 8px;
    color: var(--ink);
}
.nx-sortable-readout-pill {
    display: inline-flex;
    align-items: center;
    padding: 2px 8px;
    font-size: 0.6875rem;
    font-weight: 600;
    letter-spacing: 0.02em;
    color: white;
    background: var(--primary);
    border-radius: 999px;
}
.nx-sortable-readout-row {
    display: flex;
    align-items: baseline;
    gap: 8px;
}
.nx-sortable-readout-label {
    min-width: 48px;
    color: var(--ink-3);
    font-variant: small-caps;
    letter-spacing: 0.04em;
}
.nx-sortable-readout code {
    font-size: 0.8125rem;
    color: var(--ink);
}
.nx-sortable-readout-hint {
    color: var(--ink-3);
    font-style: italic;
}

.nx-ds-group-title {
    margin: 28px 0 12px;
    font-size: 0.6875rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--ink-3);
    padding-bottom: 8px;
    border-bottom: 1px solid color-mix(in oklab, var(--line) 70%, transparent);
    scroll-margin-top: 16px;
}
.nx-ds-group-title:first-child { margin-top: 0; }

.nx-ds-card {
    background: var(--surface);
    border: 1px solid color-mix(in oklab, var(--line) 70%, transparent);
    border-radius: 12px;
    overflow: hidden;
}
.nx-ds-tabs-frame {
    background: linear-gradient(180deg,
        color-mix(in oklab, var(--surface-2) 60%, var(--surface)),
        var(--surface));
    padding: 0 8px;
    border-bottom: 1px solid color-mix(in oklab, var(--line) 60%, transparent);
}
.nx-ds-tabs-panel {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 16px 18px;
    color: var(--ink-2);
    font-size: 0.8125rem;
    background: var(--surface);
}
.nx-ds-tabs-panel-icon { color: var(--primary); flex-shrink: 0; }
.nx-ds-tabs-panel code {
    color: var(--ink);
    background: color-mix(in oklab, var(--primary) 7%, var(--surface));
    border-radius: 4px;
    padding: 1px 6px;
    font-size: 0.75rem;
}

.nx-ds-seg-row {
    flex-wrap: wrap;
    gap: 20px;
    align-items: flex-end;
}
.nx-ds-seg-card {
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.nx-ds-seg-label {
    font-size: 0.6875rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--ink-3);
}

.nx-ds-chart-card {
    border: 1px solid var(--line);
    border-radius: var(--radius);
    background: var(--bg);
    padding: 14px;
    display: flex;
    flex-direction: column;
    gap: 8px;
}
.nx-ds-chart-head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;
}
.nx-ds-chart-title {
    font-size: 0.875rem;
    font-weight: 600;
    color: var(--ink);
}
.nx-ds-chart-sub {
    font-family: var(--font-mono);
    font-size: 0.6875rem;
    color: var(--ink-3);
}
.nexcalia-app .nx-ds-search .nx-input { background: var(--surface); }
.nexcalia-app .nx-ds-search .nx-input-control { padding: 8px 4px 8px 0; }
.nexcalia-app .nx-input-clear:hover { color: var(--ink) !important; background: var(--hover); border-radius: 4px; }

.nexcalia-app .nx-ds-code-block {
    margin-top: 16px;
    padding-top: 12px;
    border-top: 1px dashed color-mix(in oklab, var(--line) 60%, transparent);
}
.nexcalia-app .nx-ds-code-toggle {
    appearance: none;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 5px 10px 5px 8px;
    border-radius: 6px;
    border: 1px solid var(--line);
    background: var(--surface);
    color: var(--ink-2);
    font-size: 0.6875rem;
    font-weight: 600;
    font-family: var(--font-mono);
    cursor: pointer;
    transition: background-color .15s, color .15s, border-color .15s;
}
.nexcalia-app .nx-ds-code-toggle:hover {
    background: var(--primary-tint);
    color: var(--primary-deep);
    border-color: color-mix(in oklab, var(--primary) 40%, var(--line));
}
.nexcalia-app .nx-ds-code-toggle[aria-expanded="true"] {
    background: var(--primary-soft);
    color: var(--primary-deep);
    border-color: var(--primary);
}
.nexcalia-app .nx-ds-code-glyph {
    font-family: var(--font-mono);
    font-size: 0.75rem;
    color: var(--ink-3);
    transition: color .15s;
}
.nexcalia-app .nx-ds-code-toggle:hover .nx-ds-code-glyph,
.nexcalia-app .nx-ds-code-toggle[aria-expanded="true"] .nx-ds-code-glyph {
    color: var(--primary);
}
.nexcalia-app .nx-ds-code-body {
    position: relative;
    margin-top: 10px;
    border-radius: 8px;
    background: color-mix(in oklab, var(--ink) 96%, var(--surface));
    border: 1px solid color-mix(in oklab, var(--ink) 90%, var(--line));
    overflow: hidden;
}
.nexcalia-app .nx-ds-code-pre {
    margin: 0;
    padding: 16px 18px;
    overflow-x: auto;
    font-family: var(--font-mono);
    font-size: 0.75rem;
    line-height: 1.55;
    color: var(--nx-code-fg);
    background: transparent;
}
.nexcalia-app .nx-ds-code-pre code {
    font-family: inherit;
    color: inherit;
    background: transparent;
    padding: 0;
}
.nexcalia-app .nx-ds-code-copy {
    appearance: none;
    position: absolute;
    top: 8px;
    right: 8px;
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 4px 8px;
    border-radius: 5px;
    border: 1px solid rgba(255,255,255,0.12);
    background: rgba(255,255,255,0.06);
    color: rgba(255,255,255,0.78);
    font-size: 0.625rem;
    font-weight: 600;
    cursor: pointer;
    transition: background-color .15s, color .15s, border-color .15s;
    z-index: 1;
}
.nexcalia-app .nx-ds-code-copy:hover {
    background: rgba(255,255,255,0.12);
    color: white;
    border-color: rgba(255,255,255,0.24);
}


/* ===== loading-a11y.css ===== */
.nexcalia-app button:focus-visible,
.nexcalia-app a:focus-visible,
.nexcalia-app [role="button"]:focus-visible,
.nexcalia-app [tabindex]:not([tabindex="-1"]):focus-visible,
.nx-modal-panel button:focus-visible,
.nx-modal-panel a:focus-visible,
.nx-slideover button:focus-visible,
.nx-slideover a:focus-visible,
.nx-dropdown-menu button:focus-visible,
.nx-dropdown-menu a:focus-visible,
.nx-tooltip-menu a:focus-visible {
    outline: 2px solid color-mix(in oklab, currentColor 60%, transparent);
    outline-offset: 2px;
    border-radius: var(--radius-sm);
}

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

.nx-toaster {
    position: fixed;
    top: 16px;
    right: 16px;
    z-index: 10000;
    display: flex;
    flex-direction: column;
    gap: 8px;
    pointer-events: none;
    max-width: calc(100vw - 32px);
}
.nx-toast {
    pointer-events: auto;
    display: flex;
    align-items: flex-start;
    gap: 12px;
    min-width: 280px;
    max-width: 420px;
    padding: 12px 14px;
    background: var(--surface);
    color: var(--ink);
    border: 1px solid color-mix(in oklab, var(--line) 70%, transparent);
    border-radius: 10px;
    box-shadow:
        0 1px 0 rgba(255, 255, 255, 0.6) inset,
        0 12px 32px rgba(43, 57, 72, 0.18),
        0 2px 8px rgba(43, 57, 72, 0.08);
    font-size: 0.8125rem;
    line-height: 1.4;
}
.nx-toast-icon {
    flex-shrink: 0;
    width: 6px;
    align-self: stretch;
    border-radius: 3px;
    margin: 2px 0;
}
.nx-toast-info   .nx-toast-icon { background: var(--info); }
.nx-toast-ok     .nx-toast-icon { background: var(--nx-puertorico); }
.nx-toast-warn   .nx-toast-icon { background: var(--warn); }
.nx-toast-danger .nx-toast-icon { background: var(--nx-tall-poppy); }

.nx-toast-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.nx-toast-message { font-weight: 600; color: var(--ink); }
.nx-toast-description { font-size: 0.75rem; color: var(--ink-3); }
.nx-toast-close {
    appearance: none;
    border: 0;
    background: transparent;
    color: var(--ink-3);
    font-size: 1.25rem;
    line-height: 1;
    cursor: pointer;
    padding: 0 2px;
    margin-top: -2px;
    transition: color .15s;
}
.nx-toast-close:hover { color: var(--ink); }

[data-palette="dark"] .nx-toast {
    background: color-mix(in oklab, var(--surface) 92%, white);
    box-shadow:
        0 1px 0 rgba(255, 255, 255, 0.08) inset,
        0 12px 32px rgba(0, 0, 0, 0.55),
        0 2px 8px rgba(0, 0, 0, 0.35);
}

.nexcalia-app .nx-empty-sm {
    padding: 20px 16px;
    gap: 4px;
}
.nexcalia-app .nx-empty-sm .nx-empty-icon {
    width: 44px; height: 44px;
    margin-bottom: 2px;
}
.nexcalia-app .nx-empty-sm .nx-empty-title { font-size: 0.875rem; }
.nexcalia-app .nx-empty-sm .nx-empty-message { font-size: 0.75rem; }
.nexcalia-app .nx-empty-sm .nx-empty-cta { margin-top: 6px; }

.nx-skeleton {
    display: inline-block;
    background: linear-gradient(90deg,
        color-mix(in oklab, var(--ink-3) 14%, transparent) 0%,
        color-mix(in oklab, var(--ink-3) 22%, transparent) 50%,
        color-mix(in oklab, var(--ink-3) 14%, transparent) 100%);
    background-size: 200% 100%;
    animation: nx-skeleton-shimmer 1.4s ease-in-out infinite;
    vertical-align: middle;
}
.nx-skeleton-rd-sm   { border-radius: 4px; }
.nx-skeleton-rd-md   { border-radius: 6px; }
.nx-skeleton-rd-full { border-radius: 999px; }
.nx-skeleton-stack {
    display: flex;
    flex-direction: column;
}
.nx-skeleton-stack .nx-skeleton { display: block; }
@keyframes nx-skeleton-shimmer {
    0%   { background-position: 100% 0; }
    100% { background-position: -100% 0; }
}

.nx-spinner {
    display: inline-block;
    animation: nx-spinner-rotate 0.9s linear infinite;
    flex-shrink: 0;
    vertical-align: middle;
}
.nx-spinner-primary { color: var(--primary); }
.nx-spinner-ink     { color: var(--ink-2); }
.nx-spinner-white   { color: white; }
@keyframes nx-spinner-rotate {
    to { transform: rotate(360deg); }
}

.nx-banner {
    position: relative;
    width: 100%;
    color: var(--ink);
    font-size: 0.8125rem;
    line-height: 1.4;
    border-bottom: 1px solid color-mix(in oklab, var(--line) 80%, transparent);
}
.nx-banner-inner {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 8px 16px;
    max-width: 100%;
}
.nx-banner-icon {
    flex-shrink: 0;
    width: 22px; height: 22px;
    border-radius: 50%;
    display: grid;
    place-items: center;
    color: white;
}
.nx-banner-body {
    flex: 1;
    min-width: 0;
    display: flex;
    align-items: baseline;
    gap: 8px;
    flex-wrap: wrap;
}
.nx-banner-title {
    font-weight: 600;
    color: var(--ink);
}
.nx-banner-message { color: var(--ink-2); }
.nx-banner-cta {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    flex-shrink: 0;
    padding: 4px 10px;
    border-radius: 999px;
    font-weight: 600;
    font-size: 0.75rem;
    color: var(--ink);
    background: color-mix(in oklab, var(--surface) 60%, transparent);
    border: 1px solid color-mix(in oklab, var(--ink) 12%, transparent);
    text-decoration: none;
    transition: background-color .15s, transform .12s, border-color .15s;
}
.nx-banner-cta:hover {
    background: var(--surface);
    border-color: color-mix(in oklab, var(--ink) 25%, transparent);
    transform: translateY(-1px);
}
.nx-banner-close {
    appearance: none;
    border: 0;
    background: transparent;
    color: inherit;
    padding: 6px;
    border-radius: 4px;
    cursor: pointer;
    opacity: 0.6;
    display: grid;
    place-items: center;
    transition: opacity .15s, background-color .15s;
    flex-shrink: 0;
}
.nx-banner-close:hover { opacity: 1; background: color-mix(in oklab, currentColor 12%, transparent); }

.nx-banner-info {
    background: color-mix(in oklab, var(--info) 12%, var(--surface));
    border-bottom-color: color-mix(in oklab, var(--info) 35%, var(--line));
}
.nx-banner-info .nx-banner-icon { background: var(--info); }

.nx-banner-ok {
    background: color-mix(in oklab, var(--nx-puertorico) 14%, var(--surface));
    border-bottom-color: color-mix(in oklab, var(--nx-puertorico) 40%, var(--line));
}
.nx-banner-ok .nx-banner-icon { background: var(--nx-puertorico); }

.nx-banner-warn {
    background: color-mix(in oklab, var(--nx-highlight) 35%, var(--surface));
    border-bottom-color: color-mix(in oklab, var(--nx-highlight) 70%, var(--line));
}
.nx-banner-warn .nx-banner-icon { background: var(--nx-highlight); color: var(--nx-night-shadz); }
.nx-banner-warn .nx-banner-title { color: var(--nx-night-shadz); }

.nx-banner-danger {
    background: color-mix(in oklab, var(--nx-tall-poppy) 14%, var(--surface));
    border-bottom-color: color-mix(in oklab, var(--nx-tall-poppy) 40%, var(--line));
}
.nx-banner-danger .nx-banner-icon { background: var(--nx-tall-poppy); }

.nx-banner-promo {
    background: linear-gradient(90deg,
        var(--primary-deep),
        var(--primary));
    color: white;
    border-bottom-color: transparent;
}
.nx-banner-promo .nx-banner-icon { background: rgba(255,255,255,.22); color: white; }
.nx-banner-promo .nx-banner-title,
.nx-banner-promo .nx-banner-message { color: white; }
.nx-banner-promo .nx-banner-cta {
    background: rgba(255,255,255,.18);
    color: white;
    border-color: rgba(255,255,255,.25);
}
.nx-banner-promo .nx-banner-cta:hover {
    background: rgba(255,255,255,.28);
    border-color: rgba(255,255,255,.35);
}

.nx-checkcard {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 14px 16px;
    background: var(--surface);
    border: 1px solid color-mix(in oklab, var(--line) 80%, transparent);
    border-radius: var(--radius);
    cursor: pointer;
    user-select: none;
    transition: background-color .25s ease-out, border-color .25s ease-out,
                transform .12s ease-out, box-shadow .2s ease-out;
}
.nx-checkcard:hover {
    border-color: color-mix(in oklab, var(--ink) 18%, var(--line));
    transform: translateY(-1px);
    box-shadow: 0 1px 0 rgba(43, 57, 72, 0.04), 0 4px 12px rgba(43, 57, 72, 0.08);
}
.nx-checkcard:active { transform: translateY(0); transition-duration: .08s; }
.nx-checkcard-input {
    position: absolute;
    opacity: 0;
    pointer-events: none;
    width: 0; height: 0;
}

.nx-checkcard-box {
    flex-shrink: 0;
    width: 22px; height: 22px;
    border: 1.5px solid var(--line-2);
    border-radius: 6px;
    background: var(--surface);
    display: grid;
    place-items: center;
    color: transparent;
    transition: background-color .2s, border-color .2s, color .2s, transform .15s;
}
.nx-checkcard:hover .nx-checkcard-box {
    border-color: color-mix(in oklab, var(--ink) 30%, var(--line-2));
}
.nx-checkcard-input:focus-visible + .nx-checkcard-box {
    outline: 2px solid color-mix(in oklab, currentColor 60%, transparent);
    outline-offset: 2px;
}

.nx-checkcard-label {
    flex: 1;
    font-size: 0.875rem;
    color: var(--ink);
    background-image: linear-gradient(currentColor, currentColor);
    background-repeat: no-repeat;
    background-position: 0 60%;
    background-size: 0% 1.5px;
    transition: background-size .35s ease-out, color .25s ease-out, opacity .25s ease-out;
}

.nx-checkcard-meta {
    flex-shrink: 0;
    font-size: 0.75rem;
    color: var(--ink-3);
    transition: color .2s;
}

.nx-checkcard-ok     { --nx-checkcard-tone: var(--nx-puertorico); --nx-checkcard-soft: color-mix(in oklab, var(--nx-puertorico) 14%, var(--surface)); }
.nx-checkcard-info   { --nx-checkcard-tone: var(--info);          --nx-checkcard-soft: color-mix(in oklab, var(--info) 14%, var(--surface)); }

.nx-checkcard-warn   { --nx-checkcard-tone: var(--nx-night-shadz); --nx-checkcard-soft: color-mix(in oklab, var(--nx-highlight) 35%, var(--surface)); }

.nx-checkcard:has(.nx-checkcard-input:checked) {
    background: var(--nx-checkcard-soft);
    border-color: color-mix(in oklab, var(--nx-checkcard-tone) 35%, var(--line));
}
.nx-checkcard-input:checked + .nx-checkcard-box {
    background: var(--nx-checkcard-tone);
    border-color: var(--nx-checkcard-tone);
    color: white;
    transform: scale(1.04);
}
.nx-checkcard:has(.nx-checkcard-input:checked) .nx-checkcard-label {
    color: color-mix(in oklab, var(--nx-checkcard-tone) 65%, var(--ink));
    background-size: 100% 1.5px;
    opacity: 0.75;
}
.nx-checkcard:has(.nx-checkcard-input:checked) .nx-checkcard-meta {
    color: color-mix(in oklab, var(--nx-checkcard-tone) 55%, var(--ink-3));
}
.nx-checkcard.is-invalid {
    border-color: var(--nx-tall-poppy);
    box-shadow: 0 0 0 2px color-mix(in oklab, var(--nx-tall-poppy) 18%, transparent);
}
.nx-checkcard.is-invalid .nx-checkcard-box {
    border-color: var(--nx-tall-poppy);
}

.nx-del-btn {
    position: relative;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 8px 12px;
    border: 1px solid color-mix(in oklab, var(--nx-tall-poppy) 22%, var(--line));
    border-radius: 8px;
    background: color-mix(in oklab, var(--nx-tall-poppy) 6%, var(--surface));
    color: var(--nx-tall-poppy);
    font-size: 0.8125rem;
    font-weight: 500;
    cursor: pointer;
    transition: color .18s, background-color .18s, border-color .18s, box-shadow .18s;
}
.nx-del-btn-sm { padding: 6px 10px; font-size: 0.75rem; }
.nx-del-btn:hover,
.nx-del-btn:focus-visible {
    background: color-mix(in oklab, var(--nx-tall-poppy) 14%, var(--surface));
    border-color: color-mix(in oklab, var(--nx-tall-poppy) 45%, var(--line));
    outline: none;
}
.nx-del-btn:focus-visible {
    box-shadow: 0 0 0 3px color-mix(in oklab, var(--nx-tall-poppy) 25%, transparent);
}
.nx-del-btn[disabled],
.nx-del-btn.nx-del-loading { opacity: .85; cursor: not-allowed; }

.nx-del-ico,
.nx-del-spinner {
    display: inline-grid;
    place-items: center;
    width: 18px; height: 18px;
}
.nx-del-spinner svg {
    width: 18px; height: 18px;
    color: var(--nx-tall-poppy);
    animation: nx-del-spin .8s linear infinite;
}
@keyframes nx-del-spin { to { transform: rotate(360deg); } }

.nx-del-label {
    display: inline-block;
    font-weight: 600;
    color: var(--nx-tall-poppy);
    transform-origin: right center;
    white-space: nowrap;
}
.nx-del-label-enter        { transition: transform .18s ease-out, opacity .18s ease-out; }
.nx-del-label-enter-start  { transform: scale(0.6); opacity: 0; }
.nx-del-label-enter-end    { transform: scale(1);   opacity: 1; }

.nx-del-btn.is-armed {
    background: color-mix(in oklab, var(--nx-tall-poppy) 14%, var(--surface));
    border-color: color-mix(in oklab, var(--nx-tall-poppy) 45%, var(--line));
}

.nx-sortable-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
}
.nx-sortable-item {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 14px 12px;
    border-top: 1px solid color-mix(in oklab, var(--line) 70%, transparent);
    background: var(--surface);
    transition: background-color .2s ease-out;
}
.nx-sortable-item:first-child { border-top: 0; }
.nx-sortable-item:hover { background: color-mix(in oklab, var(--ink) 3%, var(--surface)); }

.nx-sortable-grip {
    appearance: none;
    border: 1px solid transparent;
    background: transparent;
    color: var(--ink-3);
    width: 28px; height: 28px;
    border-radius: 6px;
    cursor: grab;
    display: grid;
    place-items: center;
    transition: background-color .15s, border-color .15s, color .15s;
    flex-shrink: 0;
}
.nx-sortable-grip:hover,
.nx-sortable-grip:focus-visible {
    background: color-mix(in oklab, var(--ink) 6%, var(--surface));
    border-color: color-mix(in oklab, var(--ink) 12%, var(--line));
    color: var(--ink);
    outline: none;
}
.nx-sortable-grip:active { cursor: grabbing; }

.nx-sortable-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.nx-sortable-title {
    font-weight: 600;
    color: var(--ink);
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
}
.nx-sortable-meta { font-size: 0.8125rem; color: var(--ink-3); }
.nx-sortable-actions {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-shrink: 0;
}

.nx-sortable-empty {
    padding: 24px;
    color: var(--ink-3);
    text-align: center;
    font-size: 0.875rem;
}

.nx-sortable-ghost {
    background: color-mix(in oklab, var(--primary) 8%, var(--surface)) !important;
    opacity: 0.6;
    border-radius: 8px;
    box-shadow: inset 0 0 0 2px color-mix(in oklab, var(--primary) 40%, transparent);
}
.nx-sortable-chosen { cursor: grabbing; }
.nx-sortable-drag {
    background: var(--surface) !important;
    box-shadow:
        0 1px 0 rgba(255,255,255,.4) inset,
        0 12px 28px rgba(43, 57, 72, 0.18),
        0 4px 10px rgba(43, 57, 72, 0.10);
    border-radius: 10px;
    transform: rotate(0.5deg);
}

.nx-ds-section[id] { scroll-margin-top: 16px; }
/* ─── Disabled state — uniform treatment across interactive components.
   Opacity dim + not-allowed cursor + neutralize hover lift / transform. */
.nexcalia-app .btn:disabled,
.nexcalia-app .btn[aria-disabled="true"] {
    opacity: 0.55;
    cursor: not-allowed;
    pointer-events: none;
    transform: none !important;
    box-shadow: var(--shadow-sm) !important;
}
.nx-del-btn:disabled,
.nx-del-btn[aria-disabled="true"] {
    opacity: 0.55;
    cursor: not-allowed;
    pointer-events: none;
}
.nexcalia-app .nx-toggle:has(.nx-toggle-input:disabled) {
    opacity: 0.55;
    cursor: not-allowed;
}
.nexcalia-app .nx-toggle:has(.nx-toggle-input:disabled) .nx-toggle-track {
    background: color-mix(in oklab, var(--ink-3) 40%, var(--surface-2));
}
.nx-checkcard:has(.nx-checkcard-input:disabled) {
    opacity: 0.55;
    cursor: not-allowed;
    pointer-events: none;
}
.nx-checkbox:has(.nx-checkbox-input:disabled) {
    opacity: 0.55;
    cursor: not-allowed;
}

/* Sortable item — keyboard pick-up state (Space/Enter on grip) */
.nx-sortable-item.is-keyboard-picked {
    background: color-mix(in oklab, var(--primary) 10%, var(--surface));
    box-shadow:
        inset 0 0 0 2px color-mix(in oklab, var(--primary) 45%, transparent),
        0 4px 14px rgba(43, 57, 72, 0.10);
    border-radius: 8px;
    z-index: 2;
    position: relative;
}
.nx-sortable-item.is-keyboard-picked .nx-sortable-grip {
    color: var(--primary);
    background: color-mix(in oklab, var(--primary) 12%, var(--surface));
}

/* ─── .nx-surface — opt-in primitive for card-like neutral surfaces.
   Composes: bg/border/radius/shadow + optional lift on hover. Use as a base
   class on any new card-like component instead of re-declaring the stanza.

   Variants:
     .nx-surface--lift   hover lift + deeper shadow
     .nx-surface--press  press down on click
     .nx-surface--flat   no shadow (for inset/sub-cards) */
.nexcalia-app .nx-surface {
    background: var(--surface);
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    box-shadow: var(--shadow-sm);
    transition: transform .18s ease-out, box-shadow .18s ease-out, border-color .15s;
}
.nexcalia-app .nx-surface--lift:hover {
    transform: translateY(-1px);
    box-shadow: var(--shadow-md);
    border-color: color-mix(in oklab, var(--primary) 22%, var(--line));
}
.nexcalia-app .nx-surface--press:active {
    transform: translateY(0);
    transition-duration: .08s;
}
.nexcalia-app .nx-surface--flat {
    box-shadow: none;
}

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

.nexcalia-app .nx-helptip {
    position: relative;
    display: inline-flex;
    vertical-align: middle;
    margin-left: 4px;
}
.nexcalia-app .nx-helptip-trigger {
    appearance: none;
    width: 16px; height: 16px;
    border-radius: 50%;
    border: 1px solid var(--line-2);
    background: var(--surface);
    color: var(--ink-3);
    display: grid; place-items: center;
    cursor: help;
    padding: 0;
    transition: background-color .15s, color .15s, border-color .15s, transform .15s;
}
.nexcalia-app .nx-helptip-trigger:hover,
.nexcalia-app .nx-helptip-trigger[aria-expanded="true"] {
    background: var(--primary-soft);
    border-color: var(--primary);
    color: var(--primary-deep);
}
.nexcalia-app .nx-helptip-trigger:focus-visible {
    outline: 2px solid var(--primary);
    outline-offset: 2px;
}
.nexcalia-app .nx-helptip-pop {
    position: absolute;
    bottom: calc(100% + 8px);
    left: 50%;
    transform: translateX(-50%);
    z-index: 200;
    background: var(--surface);
    border: 1px solid var(--line);
    border-radius: 8px;
    padding: 10px 12px;
    box-shadow:
        0 1px 0 rgba(43,57,72,.04),
        0 8px 24px rgba(43,57,72,.14);
    font-size: 0.75rem;
    color: var(--ink);
    line-height: 1.4;
    text-align: left;
    white-space: normal;
    min-width: 200px;
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transition: opacity .15s ease-out, visibility 0s linear .15s;
}
.nexcalia-app .nx-helptip-pop.is-open {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
    transition: opacity .15s ease-out, visibility 0s linear 0s;
}
.nexcalia-app .nx-helptip-pop::after {
    content: '';
    position: absolute;
    top: 100%; left: 50%;
    transform: translateX(-50%);
    border: 6px solid transparent;
    border-top-color: var(--surface);
    filter: drop-shadow(0 1px 0 var(--line));
}
.nexcalia-app .nx-helptip-title {
    display: block;
    font-weight: 600;
    color: var(--ink);
    margin-bottom: 4px;
}
.nexcalia-app .nx-helptip-body {
    color: var(--ink-2);
}

.nexcalia-app .nx-range {
    display: flex;
    flex-direction: column;
    gap: 8px;
    width: 100%;
    --nx-range-h: 6px;
    --nx-range-thumb: 16px;
}
.nexcalia-app .nx-range-label {
    font-size: 0.75rem;
    color: var(--ink-2);
    font-weight: 500;
}
.nexcalia-app .nx-range-track-wrap {
    position: relative;
    height: var(--nx-range-thumb);
    padding: 0 calc(var(--nx-range-thumb) / 2);
}
.nexcalia-app .nx-range-rail,
.nexcalia-app .nx-range-fill {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    height: var(--nx-range-h);
    border-radius: 999px;
    pointer-events: none;
}
.nexcalia-app .nx-range-rail {
    left: 0; right: 0;
    background: var(--surface-2, color-mix(in oklab, var(--ink) 6%, var(--surface)));
    border: 1px solid var(--line);
}
.nexcalia-app .nx-range-fill {
    background: linear-gradient(90deg, var(--primary), var(--primary-deep));
}
.nexcalia-app .nx-range-input {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    margin: 0;
    background: transparent;
    appearance: none;
    -webkit-appearance: none;
    pointer-events: none;
}
.nexcalia-app .nx-range-input::-webkit-slider-runnable-track {
    background: transparent;
    height: 100%;
}
.nexcalia-app .nx-range-input::-moz-range-track {
    background: transparent;
    height: 100%;
}
.nexcalia-app .nx-range-input::-webkit-slider-thumb {
    appearance: none;
    -webkit-appearance: none;
    width: var(--nx-range-thumb);
    height: var(--nx-range-thumb);
    border-radius: 50%;
    background: var(--surface);
    border: 2px solid var(--primary);
    box-shadow: 0 1px 3px rgba(43,57,72,.18);
    cursor: grab;
    pointer-events: auto;
    transition: transform .15s, box-shadow .15s, border-color .15s;
}
.nexcalia-app .nx-range-input::-moz-range-thumb {
    width: var(--nx-range-thumb);
    height: var(--nx-range-thumb);
    border-radius: 50%;
    background: var(--surface);
    border: 2px solid var(--primary);
    box-shadow: 0 1px 3px rgba(43,57,72,.18);
    cursor: grab;
    pointer-events: auto;
    transition: transform .15s, box-shadow .15s, border-color .15s;
}
.nexcalia-app .nx-range-input:hover::-webkit-slider-thumb,
.nexcalia-app .nx-range-input:focus-visible::-webkit-slider-thumb {
    transform: scale(1.15);
    border-color: var(--primary-deep);
    box-shadow: 0 0 0 4px var(--primary-soft), 0 2px 6px rgba(43,57,72,.22);
}
.nexcalia-app .nx-range-input:hover::-moz-range-thumb,
.nexcalia-app .nx-range-input:focus-visible::-moz-range-thumb {
    transform: scale(1.15);
    border-color: var(--primary-deep);
    box-shadow: 0 0 0 4px var(--primary-soft), 0 2px 6px rgba(43,57,72,.22);
}
.nexcalia-app .nx-range-input:active::-webkit-slider-thumb,
.nexcalia-app .nx-range-input:active::-moz-range-thumb {
    cursor: grabbing;
}
.nexcalia-app .nx-range-input:focus { outline: none; }
.nexcalia-app .nx-range-input-to {
    z-index: 2;
}
.nexcalia-app .nx-range-values {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 0.8125rem;
    color: var(--ink);
    font-variant-numeric: tabular-nums;
    font-weight: 500;
}
.nexcalia-app .nx-range-sep {
    color: var(--ink-3);
}

.nexcalia-app .nx-actmsg {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    font-size: 0.75rem;
    font-weight: 500;
    opacity: 0;
    transform: translateX(-4px);
    pointer-events: none;
    transition: opacity .25s ease-out, transform .25s ease-out;
}
.nexcalia-app .nx-actmsg.is-shown {
    opacity: 1;
    transform: translateX(0);
}
.nexcalia-app .nx-actmsg-ok      { color: var(--ok-deep); }
.nexcalia-app .nx-actmsg-info    { color: var(--info); }
.nexcalia-app .nx-actmsg-warn    { color: var(--warn); }
.nexcalia-app .nx-actmsg-danger  { color: var(--danger); }

.nexcalia-app .nx-input-time {
    max-width: 90px;
}
.nexcalia-app .nx-input-time .nx-input-control {
    font-variant-numeric: tabular-nums;
    letter-spacing: 0.04em;
    text-align: center;
}

.nexcalia-app .nx-ctxmenu-wrap {
    position: relative;
}
.nexcalia-app .nx-ctxmenu-target {
    display: contents;
}
.nx-ctxmenu {
    position: relative;
    z-index: 9999;
    color: var(--ink);
    border-radius: 10px;
    padding: 6px;
    /* Aurora-blue halo at the top edge — same visual language used by
       .nx-modal-panel, .nx-overlay-head and the booking-preview popover.
       Subtle, fades before mid-height so items remain perfectly legible. */
    background:
        radial-gradient(
            160% 60px at 50% -10%,
            color-mix(in oklab, var(--primary) 12%, transparent),
            transparent 70%
        ),
        var(--surface);
    box-shadow:
        0 1px 0 rgba(255,255,255,0.6) inset,
        0 12px 32px rgba(43,57,72,0.18),
        0 2px 8px rgba(43,57,72,0.08),
        0 0 0 1px color-mix(in oklab, var(--line) 80%, transparent);
}
/* Specular highlight strip at the top — same trick as .nx-modal-panel::before */
.nx-ctxmenu::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 1px;
    border-radius: 10px 10px 0 0;
    background: linear-gradient(
        90deg,
        transparent,
        rgba(255,255,255,0.95) 40%,
        rgba(255,255,255,0.95) 60%,
        transparent
    );
    pointer-events: none;
    z-index: 2;
}
.nx-ctxmenu .nx-dropdown-item {
    padding: 6px 10px;
    font-size: 0.78125rem;
}
[data-palette="dark"] .nx-ctxmenu {
    background: color-mix(in oklab, var(--surface) 92%, white);
}

/* Confirm modal — rendered inside .nx-modal-panel which is teleported outside
   .nexcalia-app (wire-elements/modal renders at the body root). The rules
   below scope to .nx-modal-panel instead so the prefix matches. */
.nx-modal-panel .nx-confirm-modal {
    padding: 24px;
}
.nx-modal-panel .nx-confirm-body {
    display: flex;
    align-items: flex-start;
    gap: 16px;
}
.nx-modal-panel .nx-confirm-icon {
    flex-shrink: 0;
    width: 48px; height: 48px;
    border-radius: 50%;
    display: grid;
    place-items: center;
    color: white;
}
.nx-modal-panel .nx-confirm-icon-danger {
    background: color-mix(in oklab, var(--nx-tall-poppy) 18%, var(--surface));
    color: var(--nx-tall-poppy);
}
.nx-modal-panel .nx-confirm-icon-warn {
    background: color-mix(in oklab, var(--nx-highlight) 35%, var(--surface));
    color: var(--nx-night-shadz);
}
.nx-modal-panel .nx-confirm-icon-info {
    background: color-mix(in oklab, var(--info) 14%, var(--surface));
    color: var(--info);
}
.nx-modal-panel .nx-confirm-text {
    flex: 1;
    min-width: 0;
}
.nx-modal-panel .nx-confirm-title {
    font-size: 1.0625rem;
    font-weight: 600;
    color: var(--ink);
    margin: 0 0 6px;
    letter-spacing: -0.01em;
}
.nx-modal-panel .nx-confirm-message {
    font-size: 0.8125rem;
    color: var(--ink-2);
    line-height: 1.5;
    margin: 0;
}
.nx-modal-panel .nx-confirm-foot {
    display: flex;
    justify-content: flex-end;
    gap: 8px;
    margin-top: 20px;
    padding-top: 16px;
    border-top: 1px dashed color-mix(in oklab, var(--line) 70%, transparent);
}

.nexcalia-app .nx-fileup {
    display: block;
    width: 100%;
}
.nexcalia-app .nx-fileup .nx-fileup-dropzone {
    border-color: color-mix(in oklab, var(--ink) 14%, var(--line));
    background: color-mix(in oklab, var(--ink) 4%, var(--surface));
    color: var(--ink-2);
    transition: background-color .18s ease-out, border-color .18s ease-out, transform .18s ease-out;
}
.nexcalia-app .nx-fileup .nx-fileup-dropzone:hover,
.nexcalia-app .nx-fileup [data-flux-file-upload-trigger]:hover .nx-fileup-dropzone {
    border-color: var(--primary);
    background: var(--primary-tint);
    color: var(--ink);
}
.nexcalia-app .nx-fileup [data-dragging] .nx-fileup-dropzone,
.nexcalia-app .nx-fileup .nx-fileup-dropzone[data-dragging] {
    border-color: var(--primary);
    background: var(--primary-soft);
    color: var(--primary-deep);
    transform: scale(1.005);
}
.nexcalia-app .nx-fileup .nx-fileup-dropzone [data-flux-icon] {
    color: var(--ink-3);
    transition: color .18s, transform .22s cubic-bezier(0.34, 1.3, 0.4, 1);
}
.nexcalia-app .nx-fileup .nx-fileup-dropzone:hover [data-flux-icon] {
    color: var(--primary);
    transform: translateY(-2px);
}
.nexcalia-app .nx-fileup [data-loading] .nx-fileup-dropzone {
    background: var(--primary-soft);
    border-color: var(--primary);
}

.nexcalia-app .nx-avatar-upload {
    position: relative;
    display: inline-block;
}
.nexcalia-app .nx-avatar-upload-pill {
    position: relative;
    display: grid;
    place-items: center;
    width: var(--nx-av-size);
    height: var(--nx-av-size);
    border-radius: 50%;
    overflow: hidden;
    cursor: pointer;
    background: var(--surface-2);
    border: 2px solid color-mix(in oklab, var(--primary) 25%, var(--line));
    box-shadow: 0 2px 6px rgba(43,57,72,.08);
    transition: border-color .18s, box-shadow .18s, transform .18s;
}
.nexcalia-app .nx-avatar-upload-pill:hover,
.nexcalia-app .nx-avatar-upload-pill:focus-visible {
    border-color: var(--primary);
    box-shadow: 0 0 0 4px var(--primary-soft), 0 4px 12px rgba(43,57,72,.12);
    transform: translateY(-1px);
}
.nexcalia-app .nx-avatar-upload-input {
    position: absolute;
    width: 1px; height: 1px;
    opacity: 0;
    pointer-events: none;
}
.nexcalia-app .nx-avatar-upload-img {
    width: 100%; height: 100%;
    object-fit: cover;
}
.nexcalia-app .nx-avatar-upload-fallback {
    font-size: calc(var(--nx-av-size) * 0.32);
    font-weight: 600;
    color: var(--primary-deep);
    background: linear-gradient(135deg, var(--primary-tint), var(--primary-soft));
    width: 100%; height: 100%;
    display: grid;
    place-items: center;
    text-transform: uppercase;
    letter-spacing: 0.02em;
}
.nexcalia-app .nx-avatar-upload-overlay {
    position: absolute;
    inset: 0;
    display: grid;
    place-items: center;
    background: rgba(15, 23, 42, 0.55);
    color: white;
    opacity: 0;
    transition: opacity .18s ease-out;
}
.nexcalia-app .nx-avatar-upload-pill:hover .nx-avatar-upload-overlay,
.nexcalia-app .nx-avatar-upload-pill:focus-visible .nx-avatar-upload-overlay {
    opacity: 1;
}
.nexcalia-app .nx-avatar-upload-remove {
    position: absolute;
    top: -4px; right: -4px;
    width: 22px; height: 22px;
    border-radius: 50%;
    background: var(--nx-tall-poppy);
    color: white;
    border: 2px solid var(--surface);
    display: grid;
    place-items: center;
    cursor: pointer;
    transition: background-color .15s, transform .15s;
}
.nexcalia-app .nx-avatar-upload-remove:hover {
    background: color-mix(in oklab, var(--nx-tall-poppy) 85%, black);
    transform: scale(1.1);
}

.nexcalia-app .nx-image-upload {
    position: relative;
    display: block;
    width: 100%;
}
.nexcalia-app .nx-image-upload-area {
    position: relative;
    display: block;
    width: 100%;
    overflow: hidden;
    border-radius: 10px;
    border: 1.5px dashed color-mix(in oklab, var(--ink) 18%, var(--line));
    background: color-mix(in oklab, var(--ink) 3%, var(--surface));
    cursor: pointer;
    transition: border-color .18s, background-color .18s, transform .18s;
}
.nexcalia-app .nx-image-upload-area:hover,
.nexcalia-app .nx-image-upload-area:focus-visible {
    border-color: var(--primary);
    background: var(--primary-tint);
    transform: translateY(-1px);
}
/* Aspect ratios apply to the .area itself (it carries the dashed border).
   max-width is also on the area so the dashed box doesn't sprawl in a wide
   parent — wrapper stays width:100% so the trash button anchors against it. */
.nexcalia-app .nx-image-upload-area.nx-image-upload-square    { aspect-ratio: 1 / 1; max-width: 220px; }
.nexcalia-app .nx-image-upload-area.nx-image-upload-video     { aspect-ratio: 16 / 9; }
.nexcalia-app .nx-image-upload-area.nx-image-upload-banner    { aspect-ratio: 3 / 1; }
.nexcalia-app .nx-image-upload-area.nx-image-upload-portrait  { aspect-ratio: 3 / 4; max-width: 240px; }
.nexcalia-app .nx-image-upload-input {
    position: absolute;
    width: 1px; height: 1px;
    opacity: 0;
    pointer-events: none;
}
.nexcalia-app .nx-image-upload-img {
    position: absolute;
    inset: 0;
    width: 100%; height: 100%;
    object-fit: cover;
}
.nexcalia-app .nx-image-upload-empty {
    position: absolute;
    inset: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 4px;
    color: var(--ink-3);
    padding: 12px;
    text-align: center;
}
.nexcalia-app .nx-image-upload-heading {
    font-size: 0.8125rem;
    font-weight: 600;
    color: var(--ink-2);
    margin-top: 4px;
}
.nexcalia-app .nx-image-upload-text {
    font-size: 0.6875rem;
    color: var(--ink-3);
}
.nexcalia-app .nx-image-upload-overlay {
    position: absolute;
    bottom: 8px;
    left: 50%;
    transform: translateX(-50%) translateY(4px);
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 4px 10px;
    border-radius: 999px;
    background: rgba(15, 23, 42, 0.78);
    color: white;
    font-size: 0.6875rem;
    font-weight: 600;
    opacity: 0;
    transition: opacity .18s ease-out, transform .22s cubic-bezier(0.34, 1.3, 0.4, 1);
    pointer-events: none;
}
.nexcalia-app .nx-image-upload-area:hover .nx-image-upload-overlay,
.nexcalia-app .nx-image-upload-area:focus-visible .nx-image-upload-overlay {
    opacity: 1;
    transform: translateX(-50%) translateY(0);
}
.nexcalia-app .nx-image-upload-remove {
    position: absolute;
    top: 6px; right: 6px;
    width: 26px; height: 26px;
    border-radius: 50%;
    background: rgba(15, 23, 42, 0.78);
    color: white;
    border: 0;
    display: grid;
    place-items: center;
    cursor: pointer;
    z-index: 1;
    transition: background-color .15s, transform .15s;
}
.nexcalia-app .nx-image-upload-remove:hover {
    background: var(--nx-tall-poppy);
    transform: scale(1.1);
}

.nexcalia-app .nx-combobox {
    width: 100%;
}
.nexcalia-app .nx-combobox-item {
    border-radius: 6px;
    transition: background-color .12s;
}
.nexcalia-app .nx-combobox-item:hover,
.nexcalia-app .nx-combobox-item[data-active] {
    background: var(--primary-tint) !important;
    color: var(--ink) !important;
}
.nexcalia-app .nx-combobox-item-content {
    display: flex;
    flex-direction: column;
    gap: 1px;
    min-width: 0;
    flex: 1;
}
.nexcalia-app .nx-combobox-label {
    font-size: 0.8125rem;
    font-weight: 500;
    color: var(--ink);
}
.nexcalia-app .nx-combobox-meta {
    font-size: 0.6875rem;
    color: var(--ink-3);
}

.nexcalia-app .nx-repeater {
    display: flex;
    flex-direction: column;
    gap: 8px;
}
.nexcalia-app .nx-repeater-rows {
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.nexcalia-app .nx-repeater-row {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px;
    background: var(--surface);
    border: 1px solid var(--line);
    border-radius: 8px;
    transition: border-color .15s, background-color .15s;
}
.nexcalia-app .nx-repeater-row:hover {
    border-color: var(--line-2);
}
.nexcalia-app .nx-repeater-cell {
    flex: 1;
    min-width: 0;
    display: flex;
    align-items: center;
    gap: 8px;
}
.nexcalia-app .nx-repeater-remove {
    appearance: none;
    flex-shrink: 0;
    width: 28px; height: 28px;
    border-radius: 6px;
    border: 1px solid transparent;
    background: transparent;
    color: var(--ink-3);
    display: grid;
    place-items: center;
    cursor: pointer;
    transition: background-color .15s, color .15s, border-color .15s;
}
.nexcalia-app .nx-repeater-remove:hover {
    background: color-mix(in oklab, var(--nx-tall-poppy) 10%, var(--surface));
    color: var(--nx-tall-poppy);
    border-color: color-mix(in oklab, var(--nx-tall-poppy) 25%, var(--line));
}
.nexcalia-app .nx-repeater-add {
    appearance: none;
    align-self: flex-start;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 6px 10px 6px 8px;
    border-radius: 6px;
    border: 1px dashed color-mix(in oklab, var(--primary) 35%, var(--line-2));
    background: transparent;
    color: var(--primary-deep);
    font-size: 0.75rem;
    font-weight: 600;
    cursor: pointer;
    min-height: 24px;
    transition: background-color .15s, border-color .15s, color .15s;
}
.nexcalia-app .nx-repeater-add:hover {
    background: var(--primary-tint);
    border-color: var(--primary);
    border-style: solid;
}
.nexcalia-app .nx-repeater-empty {
    margin: 0;
    padding: 14px 12px;
    border: 1px dashed var(--line-2);
    border-radius: 8px;
    text-align: center;
    font-size: 0.75rem;
    color: var(--ink-3);
    background: color-mix(in oklab, var(--ink) 2%, var(--surface));
}

.nexcalia-app .nx-breadcrumbs {
    display: block;
}
.nexcalia-app .nx-breadcrumbs-list {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 4px;
    list-style: none;
    padding: 0;
    margin: 0;
    font-size: 0.75rem;
}
.nexcalia-app .nx-breadcrumbs-item {
    display: inline-flex;
    align-items: center;
    gap: 4px;
}
.nexcalia-app .nx-breadcrumbs-link {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    color: var(--ink-3);
    text-decoration: none;
    padding: 2px 4px;
    border-radius: 4px;
    transition: color .15s, background-color .15s;
}
.nexcalia-app .nx-breadcrumbs-link:hover {
    color: var(--primary-deep);
    background: var(--primary-tint);
}
.nexcalia-app .nx-breadcrumbs-label {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    color: var(--ink-3);
    padding: 2px 4px;
}
.nexcalia-app .nx-breadcrumbs-item.is-current .nx-breadcrumbs-label {
    color: var(--ink);
    font-weight: 600;
}
.nexcalia-app .nx-breadcrumbs-sep {
    color: var(--ink-3);
    opacity: 0.6;
    margin: 0 2px;
}
.nexcalia-app .nx-breadcrumbs-ellipsis {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    color: var(--ink-3);
    padding: 2px 4px;
    font-weight: 500;
}

.nexcalia-app .nx-pagination {
    display: flex;
    align-items: center;
    gap: 16px;
    padding: 12px 4px;
    font-size: 0.75rem;
    color: var(--ink-2);
    flex-wrap: wrap;
}
.nexcalia-app .nx-pagination-label {
    display: inline-flex;
    align-items: baseline;
    gap: 4px;
}
.nexcalia-app .nx-pagination-label strong {
    color: var(--ink);
    font-weight: 600;
}
.nexcalia-app .nx-pagination-of { color: var(--ink-3); }
.nexcalia-app .nx-pagination-spacer { flex: 1; min-width: 0; }
.nexcalia-app .nx-pagination-size {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    color: var(--ink-3);
}
.nexcalia-app .nx-pagination-size-label { font-size: 0.6875rem; }
.nexcalia-app .nx-pagination-select {
    appearance: none;
    -webkit-appearance: none;
    background: var(--surface);
    border: 1px solid var(--line);
    border-radius: 6px;
    padding: 4px 22px 4px 10px;
    font-size: 0.75rem;
    color: var(--ink);
    cursor: pointer;
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%238894A5' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M6 9l6 6 6-6'/></svg>");
    background-repeat: no-repeat;
    background-position: right 6px center;
    transition: border-color .15s, box-shadow .15s;
}
.nexcalia-app .nx-pagination-select:hover { border-color: var(--line-2); }
.nexcalia-app .nx-pagination-select:focus-visible {
    border-color: var(--primary);
    outline: none;
    box-shadow: 0 0 0 3px var(--primary-soft);
}
.nexcalia-app .nx-pagination-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: inline-flex;
    align-items: center;
    gap: 2px;
}
.nexcalia-app .nx-pagination-btn {
    appearance: none;
    min-width: 30px;
    height: 30px;
    padding: 0 8px;
    border-radius: 6px;
    border: 1px solid transparent;
    background: transparent;
    color: var(--ink-2);
    font-size: 0.75rem;
    font-weight: 500;
    font-variant-numeric: tabular-nums;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    transition: background-color .12s, color .12s, border-color .12s, transform .12s;
}
.nexcalia-app .nx-pagination-btn:hover:not([disabled]) {
    background: var(--hover);
    color: var(--ink);
    border-color: var(--line);
}
.nexcalia-app .nx-pagination-btn.is-current {
    background: var(--primary);
    color: var(--nx-white);
    border-color: var(--primary);
    box-shadow: 0 1px 2px color-mix(in oklab, var(--primary) 30%, transparent);
}
.nexcalia-app .nx-pagination-btn.is-current:hover { transform: translateY(-1px); }
.nexcalia-app .nx-pagination-btn[disabled] {
    opacity: 0.4;
    cursor: not-allowed;
}
.nexcalia-app .nx-pagination-step {
    color: var(--ink-3);
}
.nexcalia-app .nx-pagination-ellipsis {
    display: inline-grid;
    place-items: center;
    min-width: 28px;
    color: var(--ink-3);
    font-weight: 600;
}

.nexcalia-app .nx-filter-chip {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 3px 4px 3px 8px;
    border-radius: 999px;
    font-size: 0.6875rem;
    font-weight: 500;
    border: 1px solid transparent;
    transition: background-color .15s, border-color .15s;
}
.nexcalia-app .nx-filter-chip-icon { margin-right: 2px; flex-shrink: 0; }
.nexcalia-app .nx-filter-chip-label { padding: 0 2px; }
.nexcalia-app .nx-filter-chip-remove {
    appearance: none;
    width: 16px;
    height: 16px;
    border-radius: 50%;
    border: 0;
    background: transparent;
    color: inherit;
    cursor: pointer;
    display: grid;
    place-items: center;
    opacity: 0.6;
    transition: opacity .15s, background-color .15s;
    flex-shrink: 0;
}
.nexcalia-app .nx-filter-chip-remove:hover {
    opacity: 1;
    background: color-mix(in oklab, currentColor 18%, transparent);
}
.nexcalia-app .nx-filter-chip-neutral {
    background: var(--neutral-soft);
    color: var(--ink-2);
    border-color: color-mix(in oklab, var(--ink) 8%, var(--line));
}
.nexcalia-app .nx-filter-chip-info {
    background: var(--info-soft);
    color: var(--info);
    border-color: color-mix(in oklab, var(--info) 25%, transparent);
}
.nexcalia-app .nx-filter-chip-ok {
    background: var(--ok-soft);
    color: var(--ok-deep);
    border-color: color-mix(in oklab, var(--ok) 25%, transparent);
}
.nexcalia-app .nx-filter-chip-warn {
    background: var(--warn-soft);
    color: var(--warn);
    border-color: color-mix(in oklab, var(--warn) 25%, transparent);
}
.nexcalia-app .nx-filter-chip-danger {
    background: var(--danger-soft);
    color: var(--danger);
    border-color: color-mix(in oklab, var(--danger) 25%, transparent);
}
.nexcalia-app .nx-filter-chip-accent {
    background: var(--primary-soft);
    color: var(--primary-deep);
    border-color: color-mix(in oklab, var(--primary) 25%, transparent);
}

.nexcalia-app .nx-data-table {
    display: flex;
    flex-direction: column;
    background: var(--surface);
    border: 1px solid var(--line);
    border-radius: 10px;
    overflow: hidden;
}
.nexcalia-app .nx-data-table-toolbar {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
    padding: 12px 14px;
    border-bottom: 1px solid var(--line);
    background: color-mix(in oklab, var(--ink) 2%, var(--surface));
}
.nexcalia-app .nx-data-table-toolbar > .nx-input {
    flex: 1 1 240px;
    max-width: 360px;
}
.nexcalia-app .nx-data-table-toolbar .nx-data-table-spacer { flex: 1 1 auto; }
.nexcalia-app .nx-data-table-body {
    position: relative;
    min-height: 120px;
}
.nexcalia-app .nx-data-table-body.is-loading {
    pointer-events: none;
}
.nexcalia-app .nx-data-table-body.is-loading > *:not(.nx-data-table-overlay) {
    opacity: 0.4;
    filter: blur(0.5px);
    transition: opacity .15s, filter .15s;
}
.nexcalia-app .nx-data-table-overlay {
    position: absolute;
    inset: 0;
    display: grid;
    place-items: center;
    pointer-events: none;
    background: color-mix(in oklab, var(--surface) 60%, transparent);
    opacity: 0;
    transition: opacity .2s ease-out;
}
.nexcalia-app .nx-data-table-body.is-loading .nx-data-table-overlay {
    opacity: 1;
}
.nexcalia-app .nx-data-table-spin {
    color: var(--primary);
    animation: nx-spinner-rotate 1.2s linear infinite;
}
.nexcalia-app .nx-data-table-empty {
    padding: 48px 24px;
    text-align: center;
}
.nexcalia-app .nx-data-table-empty-icon {
    display: inline-grid;
    place-items: center;
    width: 48px; height: 48px;
    border-radius: 50%;
    background: color-mix(in oklab, var(--ink) 6%, var(--surface));
    color: var(--ink-3);
    margin-bottom: 10px;
}
.nexcalia-app .nx-data-table-empty-title {
    font-size: 0.875rem;
    font-weight: 600;
    color: var(--ink);
    margin-bottom: 4px;
}
.nexcalia-app .nx-data-table-empty-text {
    font-size: 0.75rem;
    color: var(--ink-3);
    max-width: 360px;
    margin: 0 auto;
}
.nexcalia-app .nx-data-table-footer {
    padding: 8px 14px;
    border-top: 1px solid var(--line);
    background: color-mix(in oklab, var(--ink) 2%, var(--surface));
}

.nx-bulk-actions {
    position: fixed;
    bottom: 24px;
    left: 50%;
    transform: translateX(-50%);
    z-index: 9999;
    pointer-events: auto;
}
.nx-bulk-actions-inner {
    display: inline-flex;
    align-items: center;
    gap: 12px;
    padding: 8px 8px 8px 16px;
    background: var(--ink, var(--nx-pickled));
    color: var(--surface);
    border-radius: 999px;
    box-shadow:
        0 12px 32px rgba(43,57,72,0.28),
        0 2px 8px rgba(43,57,72,0.18);
    font-size: 0.8125rem;
    font-weight: 500;
}
.nx-bulk-actions-count {
    display: inline-flex;
    align-items: baseline;
    gap: 4px;
    color: var(--nx-white);
}
.nx-bulk-actions-count strong {
    font-weight: 700;
    color: var(--nx-white);
}
.nx-bulk-actions-clear {
    appearance: none;
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 4px 10px 4px 8px;
    border-radius: 999px;
    border: 1px solid color-mix(in oklab, var(--nx-white) 18%, transparent);
    background: transparent;
    color: color-mix(in oklab, var(--nx-white) 78%, transparent);
    font-size: 0.6875rem;
    font-weight: 500;
    cursor: pointer;
    transition: background-color .15s, color .15s, border-color .15s;
}
.nx-bulk-actions-clear:hover {
    background: color-mix(in oklab, var(--nx-white) 10%, transparent);
    color: var(--nx-white);
    border-color: color-mix(in oklab, var(--nx-white) 32%, transparent);
}
.nx-bulk-actions-sep {
    width: 1px;
    align-self: stretch;
    background: color-mix(in oklab, var(--nx-white) 18%, transparent);
}
.nx-bulk-actions-buttons {
    display: inline-flex;
    align-items: center;
    gap: 6px;
}


/* ===== buttons.css ===== */
.nexcalia-app .btn {
  appearance: none;
  display: inline-flex; align-items: center; gap: 6px;
  height: 34px; padding: 0 14px;
  border: 1px solid var(--line);
  background: var(--surface);
  color: var(--ink);
  border-radius: var(--radius-sm);
  font-size: 0.8125rem; font-weight: 500;
  cursor: pointer;
  transition: background-color .15s, border-color .15s, transform .18s ease-out, box-shadow .18s ease-out;
  box-shadow: 0 1px 0 rgba(43,57,72,.04);
}
.nexcalia-app .btn:hover {
  background: var(--hover);
  transform: translateY(-1px);
  box-shadow: 0 1px 0 rgba(43,57,72,.04), 0 4px 12px rgba(43,57,72,.10);
}
.nexcalia-app .btn:active { transform: translateY(0); transition-duration: .08s; }

.nexcalia-app .btn.primary {
  background: var(--primary); border-color: var(--primary); color: white;
  box-shadow:
    0 1px 0 rgba(0,0,0,.06),
    0 1px 3px color-mix(in oklab, var(--primary) 18%, transparent);
}
.nexcalia-app .btn.primary:hover {
  background: var(--primary-deep);
  border-color: var(--primary-deep);
  transform: translateY(-1px);
  box-shadow:
    0 2px 0 rgba(0,0,0,.06),
    0 6px 18px color-mix(in oklab, var(--primary) 30%, transparent);
}

.nexcalia-app .btn.accent {
  background: var(--primary); border-color: var(--primary); color: white;
  box-shadow:
    0 1px 0 rgba(0,0,0,.06),
    0 1px 3px color-mix(in oklab, var(--primary) 22%, transparent),
    inset 0 1px 0 rgba(255,255,255,.22);
}
.nexcalia-app .btn.accent:hover {
  background: var(--primary-deep);
  border-color: var(--primary-deep);
  transform: translateY(-1px);
  box-shadow:
    0 2px 0 rgba(0,0,0,.06),
    0 6px 18px color-mix(in oklab, var(--primary) 35%, transparent),
    inset 0 1px 0 rgba(255,255,255,.22);
}
/* Tailles — <x-nexcalia.button size="sm|lg"> émet ces classes (md = défaut,
   porté par .btn lui-même). */
.nexcalia-app .btn-sm {
  height: 28px; padding: 0 10px;
  font-size: 0.75rem; gap: 5px;
}
.nexcalia-app .btn-lg {
  height: 42px; padding: 0 18px;
  font-size: 0.875rem; gap: 8px;
}

.nexcalia-app .btn:focus-visible {
  outline: 2px solid var(--primary);
  outline-offset: 2px;
}

.nexcalia-app .btn.ghost { border-color: transparent; background: transparent; box-shadow: none; }
.nexcalia-app .btn.ghost:hover {
  background: var(--hover);
  transform: translateY(-1px);
  box-shadow: 0 1px 0 rgba(43,57,72,.04), 0 2px 8px rgba(43,57,72,.08);
}

.nexcalia-app .nx-clipboard-btn {
  appearance: none;
  display: inline-flex; align-items: center; gap: 6px;
  padding: 6px 10px;
  border-radius: 6px;
  border: 1px solid var(--line);
  background: var(--surface);
  color: var(--ink-2);
  font-size: 0.8125rem;
  cursor: pointer;
  transition: background-color .15s, color .15s, border-color .15s, transform .15s;
  min-height: 24px;
}
.nexcalia-app .nx-clipboard-btn:hover {
  background: var(--hover);
  color: var(--ink);
  border-color: var(--line-2);
}
.nexcalia-app .nx-clipboard-btn:focus-visible {
  outline: 2px solid var(--primary);
  outline-offset: 2px;
}
.nexcalia-app .nx-clipboard-icon {
  position: relative;
  width: 12px; height: 12px;
  display: inline-grid;
  place-items: center;
  color: var(--ink-3);
  transition: color .15s;
}
.nexcalia-app .nx-clipboard-btn:hover .nx-clipboard-icon { color: var(--primary); }
.nexcalia-app .nx-clipboard-icon .nx-clipboard-check,
.nexcalia-app .nx-clipboard-icon .nx-clipboard-clip {
  position: absolute; inset: 0;
  transition: opacity .18s ease-out, transform .22s cubic-bezier(0.34, 1.3, 0.4, 1);
}
.nexcalia-app .nx-clipboard-icon .nx-clipboard-check { opacity: 0; transform: scale(0.6); color: var(--ok); }
.nexcalia-app .nx-clipboard-btn.is-copied { color: var(--ok-deep); border-color: color-mix(in oklab, var(--ok) 40%, var(--line)); }
.nexcalia-app .nx-clipboard-btn.is-copied .nx-clipboard-icon .nx-clipboard-check { opacity: 1; transform: scale(1); }
.nexcalia-app .nx-clipboard-btn.is-copied .nx-clipboard-icon .nx-clipboard-clip  { opacity: 0; transform: scale(0.7); }

.nexcalia-app .nx-splitbtn {
  display: inline-flex;
  align-items: stretch;
  position: relative;
}
.nexcalia-app .nx-splitbtn > .btn.nx-splitbtn-main {
  border-top-right-radius: 0;
  border-bottom-right-radius: 0;
  position: relative;
  z-index: 1;
}
.nexcalia-app .nx-splitbtn > .nx-splitbtn-chev {
  margin-left: -1px;
}
.nexcalia-app .nx-splitbtn .nx-dropdown-menu {
  top: calc(100% + 6px);
  margin: 0;
}
.nexcalia-app .nx-splitbtn .nx-splitbtn-chev {
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
  padding-left: 8px;
  padding-right: 8px;
  position: relative;
}
.nexcalia-app .nx-splitbtn .nx-splitbtn-chev::before {
  content: '';
  position: absolute;
  top: 6px; bottom: 6px; left: 0;
  width: 1px;
  background: color-mix(in oklab, currentColor 22%, transparent);
  pointer-events: none;
}
.nexcalia-app .nx-splitbtn .nx-splitbtn-main:focus-visible,
.nexcalia-app .nx-splitbtn .nx-splitbtn-chev:focus-visible {
  z-index: 2;
}

.nexcalia-app .btn.danger {
  color: white;
  background: var(--nx-tall-poppy);
  border-color: var(--nx-tall-poppy);
  box-shadow:
    0 1px 0 rgba(0,0,0,.06),
    0 1px 3px color-mix(in oklab, var(--nx-tall-poppy) 22%, transparent),
    inset 0 1px 0 rgba(255,255,255,.22);
}
.nexcalia-app .btn.danger:hover {
  background: color-mix(in oklab, var(--nx-tall-poppy) 85%, black);
  border-color: color-mix(in oklab, var(--nx-tall-poppy) 85%, black);
  transform: translateY(-1px);
  box-shadow:
    0 2px 0 rgba(0,0,0,.06),
    0 6px 18px color-mix(in oklab, var(--nx-tall-poppy) 35%, transparent),
    inset 0 1px 0 rgba(255,255,255,.22);
}


/* ===== pills.css ===== */
.nexcalia-app .pill {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 2px 8px;
  border-radius: 999px;
  font-size: var(--fs-xs);
  font-weight: 500;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  border: 1px solid transparent;
}
.nexcalia-app .pill .d { width: 5px; height: 5px; border-radius: 50%; background: currentColor; }
.nexcalia-app .pill.ok    { background: var(--ok-soft); color: var(--ok-deep); }
.nexcalia-app .pill.warn  { background: var(--warn-soft); color: var(--warn); }
.nexcalia-app .pill.info  { background: var(--info-soft); color: var(--info); }
.nexcalia-app .pill.danger{ background: var(--danger-soft); color: var(--danger); }
.nexcalia-app .pill.neutral{ background: var(--neutral-soft); color: var(--ink-2); }
.nexcalia-app .pill.accent{ background: var(--primary-soft); color: var(--primary-deep); }
.nexcalia-app .pill.outline { background: var(--neutral-soft); border-color: transparent; color: var(--ink-2); }

/* En palette sombre --primary-deep reste un bleu foncé (contrairement à --ok-deep,
   éclairci lui), donc .pill.accent rendait du bleu foncé sur bleu nuit : 1,4:1.
   On ne peut pas éclaircir le token — il sert AUSSI de fond (btn.primary:hover,
   6 usages) — d'où une variante portée par la pill elle-même. Mesuré à 5,05:1. */
[data-palette="dark"] .nexcalia-app .pill.accent {
  background: color-mix(in oklab, var(--primary) 24%, transparent);
  color: color-mix(in oklab, var(--primary) 40%, var(--ink));
}

.nexcalia-app .pill.has-icon { padding: 2px 8px 2px 6px; gap: 3px; line-height: 1; }
.nexcalia-app .pill.has-icon svg { flex-shrink: 0; margin-top: -0.5px; }

/* ─── Pastille de compteur sur une icône de nav repliée ───
   Usage : dans une `.nx-nav-item` (position: relative), à côté de l'icône 16px, avec
   [data-collapse-only] pour n'exister qu'en sidebar repliée :

       <span class="nx-nav-icon-badge" data-collapse-only>{{ $n }}</span>

   Repliée, la rangée ne contient plus que l'icône centrée : l'ancrage top/left 50 %
   vise donc le centre de l'icône, et le décalage porte la pastille sur son coin
   haut-droit. Le ring `--surface-2` la détache du fond de la sidebar ; `pointer-events`
   neutralisé pour ne pas manger le survol du lien (tooltip du mode replié). */
.nexcalia-app .nx-nav-icon-badge {
  position: absolute;
  top: 50%;
  left: 50%;
  z-index: 3;
  transform: translate(1.5px, -15.5px);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  height: 14px;
  min-width: 14px;
  padding: 0 3px;
  border-radius: 999px;
  background: var(--danger-strong);
  color: var(--nx-white);
  font-size: 0.5625rem;
  font-weight: 700;
  line-height: 1;
  letter-spacing: 0.01em;
  font-variant-numeric: tabular-nums;
  pointer-events: none;
  box-shadow:
    0 0 0 1.5px var(--surface-2),
    0 1px 2px rgba(43, 57, 72, 0.28);
}

.nexcalia-app .page-head {
  display: flex; align-items: flex-end; gap: 16px;
  padding: 18px 24px 12px;
  border-bottom: 1px solid var(--line);
}
.nexcalia-app .page-head h1 {
  font-size: 1.375rem; font-weight: 600;
  letter-spacing: -0.02em; margin: 0;
}
.nexcalia-app .page-head .sub { font-size: 0.75rem; color: var(--ink-3); margin-top: 2px; }
.nexcalia-app .page-head .actions { margin-left: auto; display: flex; gap: 8px; align-items: center; }

.nexcalia-app .page-tabs {
  display: flex; gap: 2px;
  padding: 0 24px;
  border-bottom: 1px solid var(--line);
  background: var(--surface);
}
.nexcalia-app .page-tabs .tab {
  appearance: none;
  background: transparent;
  border: 0;
  font-family: inherit;
  position: relative;
  padding: 8px 12px;
  font-size: 0.75rem; font-weight: 500;
  color: var(--ink-2);
  cursor: pointer;
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
}
.nexcalia-app .page-tabs .tab.active { color: var(--ink); border-bottom-color: var(--ink); }
.nexcalia-app .page-tabs .tab .count {
  margin-left: 6px; font-size: 0.625rem; color: var(--ink-3);
  background: var(--bg-2); padding: 1px 5px; border-radius: 4px;
}


/* ===== cards.css ===== */
.nexcalia-app .card {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
}
.nexcalia-app .card-head {
  display: flex; align-items: center;
  padding: 10px 12px;
  border-bottom: 1px solid var(--line);
  font-size: 0.875rem; font-weight: 600; color: var(--ink);
}
.nexcalia-app .card-head .more { margin-left: auto; color: var(--ink-3); font-size: 0.6875rem; font-weight: 500; }

/* Composable hover treatment for list rows: mouse-following blue halo + primary
   border tint + soft lift. Same visual language as .nx-resource-row, but layout
   agnostic so it composes with any row markup (e.g. rows with a flush color bar).
   Pair with x-data="nxSpotlight" (sets --nx-mx/--nx-my) for the cursor-tracking. */
.nexcalia-app .nx-row-spotlight {
  position: relative;
  transition: border-color 0.15s, box-shadow 0.15s;
}
.nexcalia-app .nx-row-spotlight::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: radial-gradient(
    360px 200px at calc(var(--nx-mx, 50) * 1%) 25%,
    color-mix(in oklab, var(--primary) 16%, transparent),
    transparent 70%
  );
  opacity: 0;
  transition: opacity 0.25s ease-out;
  pointer-events: none;
}
.nexcalia-app .nx-row-spotlight:hover::before { opacity: 1; }
.nexcalia-app .nx-row-spotlight:has(.icon-btn:hover)::before { opacity: 0; }
.nexcalia-app .nx-row-spotlight:hover {
  border-color: color-mix(in oklab, var(--primary) 30%, var(--line));
  box-shadow: 0 1px 0 rgba(43, 57, 72, 0.04), 0 4px 12px rgba(43, 57, 72, 0.08);
}
.nexcalia-app .nx-row-spotlight > * { position: relative; }

/* Variante tabulaire du halo ci-dessus, pour une vraie <table> .tbl.
   Activation : <x-nexcalia.table spotlight> (le prop pose la classe et le
   tracking Alpine sur la table).

   ⚠ NE PAS transposer .nx-row-spotlight tel quel : PAS de pseudo-élément sur
   un <tr>. Blink enveloppe tout enfant hors-flux d'une rangée de table dans
   une CELLULE ANONYME, même en position: absolute. La table gagne alors une
   colonne fantôme qui absorbe une part de la largeur restante, et toutes les
   données se décalent d'un cran vers la droite par rapport aux en-têtes
   (constaté : premier th à x=273 pour un premier td à x=429). Le CSS
   s'applique pourtant comme écrit — le piège est dans le modèle de boîtes
   tabulaire, pas dans les règles.

   Le halo est donc peint comme BACKGROUND de la rangée elle-même :
   - les fonds de rangée se peignent sous les fonds de cellule et couvrent
     toute la largeur de la rangée (border-spacing: 0, donc aucun trou) ; le
     fond plat `--hover` posé sur les cellules est neutralisé et repris ici,
     ce qui le rend transitionnable ;
   - les pourcentages du gradient se résolvent sur la boîte de la rangée,
     c'est-à-dire la largeur de la table : --nx-mx reste valable tel quel, et
     un seul x-data="nxSpotlight" sur la <table> suffit pour toutes les lignes
     (les rangées ont la même origine X et la même largeur que la table) ;
   - le fondu 0.25s est conservé en faisant passer l'alpha du gradient par une
     custom property ENREGISTRÉE, seule façon de rendre un dégradé animable.

   Le lift box-shadow du modèle carte est remplacé par une teinte primaire de
   la bordure basse : les lignes sont contiguës, pas des cartes détachées. */
@property --nx-halo-alpha {
  syntax: "<number>";
  inherits: false;
  initial-value: 0;
}

.nexcalia-app .tbl.nx-tbl-spotlight tbody tr {
  background-color: transparent;
  background-image: radial-gradient(
    360px 200px at calc(var(--nx-mx, 50) * 1%) 50%,
    color-mix(in oklab, var(--primary) calc(16% * var(--nx-halo-alpha)), transparent),
    transparent 70%
  );
  transition: background-color 0.25s ease-out, --nx-halo-alpha 0.25s ease-out;
}

.nexcalia-app .tbl.nx-tbl-spotlight tbody tr:hover {
  background-color: var(--hover);
  --nx-halo-alpha: 1;
}

/* Le halo se coupe sous le curseur d'un bouton d'action ; le fond plat, lui,
   reste (la ligne doit continuer de se lire comme active). */
.nexcalia-app .tbl.nx-tbl-spotlight tbody tr:has(.icon-btn:hover) {
  --nx-halo-alpha: 0;
}

.nexcalia-app .tbl.nx-tbl-spotlight tbody tr > td {
  transition: border-color 0.15s;
}

/* Neutralise le fond plat que `.tbl tbody tr:hover td` pose sur les cellules
   (il masquerait le halo). Exclut .selected pour ne pas effacer la teinte de
   sélection. Spécificité volontairement supérieure : cette règle vit dans un
   part importé AVANT les règles .tbl de components.css. */
.nexcalia-app .tbl.nx-tbl-spotlight tbody tr:hover:not(.selected) td {
  background: transparent;
  border-bottom-color: color-mix(in oklab, var(--primary) 30%, var(--line));
}

/* Radio-card — single-select clickable cards (mutually-exclusive choices).
   Sibling of .nx-checkcard but radio semantics: a dot instead of a box,
   no strike-through. Composes .nx-row-spotlight (above) for the cursor-
   following halo + primary border tint + lift on hover. Stacked-block
   rendering: contiguous borders, rounded corners only on the group. */
.nexcalia-app .nx-radiocard-group {
    display: flex;
    flex-direction: column;
}

.nexcalia-app .nx-radiocard {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 14px 16px;
    background: var(--surface);
    border: 1px solid color-mix(in oklab, var(--line) 80%, transparent);
    border-radius: var(--radius);
    cursor: pointer;
    user-select: none;
    position: relative;
    transition:
        background-color 0.25s ease-out,
        border-color 0.25s ease-out,
        box-shadow 0.2s ease-out;
}

/* Empilement en bloc : on fusionne les bordures et n'arrondit que le groupe. */
.nexcalia-app .nx-radiocard-group .nx-radiocard {
    border-radius: 0;
    margin-top: -1px;
}
.nexcalia-app .nx-radiocard-group .nx-radiocard:first-child {
    margin-top: 0;
    border-top-left-radius: var(--radius);
    border-top-right-radius: var(--radius);
}
.nexcalia-app .nx-radiocard-group .nx-radiocard:last-child {
    border-bottom-left-radius: var(--radius);
    border-bottom-right-radius: var(--radius);
}

/* Le feedback hover est fourni par le halo spotlight (.nx-row-spotlight) :
   bordure teintée + box-shadow lift. On garde seulement le z-index pour que
   le lift passe au-dessus des cartes voisines (bordures contiguës). */
.nexcalia-app .nx-radiocard:hover {
    z-index: 1;
}

.nexcalia-app .nx-radiocard-input {
    position: absolute;
    opacity: 0;
    pointer-events: none;
    width: 0;
    height: 0;
}

/* Puce radio : cercle vide → point plein --primary à l'état coché. */
.nexcalia-app .nx-radiocard-dot {
    flex-shrink: 0;
    width: 20px;
    height: 20px;
    border: 2px solid var(--line-2);
    border-radius: 50%;
    background: var(--surface);
    display: grid;
    place-items: center;
    transition:
        border-color 0.2s ease-out,
        box-shadow 0.2s ease-out;
}
.nexcalia-app .nx-radiocard-dot::after {
    content: "";
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background: var(--primary);
    transform: scale(0);
    transition: transform 0.15s ease-out;
}
.nexcalia-app .nx-radiocard:hover .nx-radiocard-dot {
    border-color: color-mix(in oklab, var(--ink) 30%, var(--line-2));
}
.nexcalia-app .nx-radiocard-input:focus-visible + .nx-radiocard-dot {
    outline: 2px solid color-mix(in oklab, var(--primary) 60%, transparent);
    outline-offset: 2px;
}

/* Texte : label + description optionnelle. */
.nexcalia-app .nx-radiocard-text {
    flex: 1;
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}
.nexcalia-app .nx-radiocard-label {
    font-size: var(--fs-body);
    color: var(--ink);
    transition: color 0.2s ease-out;
}
.nexcalia-app .nx-radiocard-desc {
    font-size: var(--fs-xs);
    color: var(--ink-3);
}
.nexcalia-app .nx-radiocard-meta {
    flex-shrink: 0;
    font-size: var(--fs-xs);
    color: var(--ink-3);
    transition: color 0.2s ease-out;
}

/* État coché. */
.nexcalia-app .nx-radiocard:has(.nx-radiocard-input:checked) {
    background: var(--primary-tint);
    border-color: var(--primary);
    z-index: 2;
}
.nexcalia-app .nx-radiocard-input:checked + .nx-radiocard-dot {
    border-color: var(--primary);
}
.nexcalia-app .nx-radiocard-input:checked + .nx-radiocard-dot::after {
    transform: scale(1);
}
.nexcalia-app
    .nx-radiocard:has(.nx-radiocard-input:checked)
    .nx-radiocard-label {
    color: color-mix(in oklab, var(--primary) 55%, var(--ink));
    font-weight: 500;
}

/* États erreur / désactivé. */
.nexcalia-app .nx-radiocard.is-invalid {
    border-color: var(--danger);
    box-shadow: 0 0 0 2px color-mix(in oklab, var(--danger) 18%, transparent);
    z-index: 2;
}
.nexcalia-app .nx-radiocard.is-invalid .nx-radiocard-dot {
    border-color: var(--danger);
}
.nexcalia-app .nx-radiocard:has(.nx-radiocard-input:disabled) {
    opacity: 0.55;
    cursor: not-allowed;
    pointer-events: none;
}


/* ===== kpi.css ===== */
.nexcalia-app .kpi {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 12px 14px;
  display: flex; flex-direction: column; gap: 4px;
  position: relative;
  overflow: hidden;
  transition: transform .2s ease-out, box-shadow .2s ease-out, border-color .2s ease-out;
}
.nexcalia-app .kpi::before {
  content: '';
  position: absolute;
  inset: 0;
  background: radial-gradient(300px 120px at 50% 0%, color-mix(in oklab, var(--primary) 14%, transparent), transparent 70%);
  opacity: 0;
  transition: opacity .3s ease-out;
  pointer-events: none;
}
.nexcalia-app .kpi:hover {
  transform: translateY(-2px);
  box-shadow: 0 8px 24px rgba(43,57,72,.10), 0 2px 4px rgba(43,57,72,.06);
  border-color: color-mix(in oklab, var(--primary) 28%, var(--line));
}
.nexcalia-app .kpi:hover::before { opacity: 1; }
.nexcalia-app .kpi > * { position: relative; }
.nexcalia-app .kpi .lbl { font-size: 0.6875rem; color: var(--ink-3); letter-spacing: 0.02em; }
.nexcalia-app .kpi .val { font-size: 1.5rem; font-weight: 600; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; }
.nexcalia-app .kpi .row { display: flex; align-items: baseline; gap: 8px; }
.nexcalia-app .kpi .delta { font-size: 0.6875rem; font-variant-numeric: tabular-nums; font-weight: 500; }

.nexcalia-app .kpi .delta-arrow-up::before    { content: '▲ ' / ''; font-size: 0.625rem; }
.nexcalia-app .kpi .delta-arrow-down::before  { content: '▼ ' / ''; font-size: 0.625rem; }
.nexcalia-app .kpi .delta-arrow-flat::before  { content: '— ' / ''; font-size: 0.625rem; }

/* A11Y: --ok (#57B893) on light bg fails AA (2.2:1). --ok-deep is darker. */
.nexcalia-app .kpi .delta-sentiment-good    { color: var(--ok-deep); }
.nexcalia-app .kpi .delta-sentiment-bad     { color: var(--danger); }
.nexcalia-app .kpi .delta-sentiment-neutral { color: var(--ink-2); }

.nexcalia-app .kpi .delta.up { color: var(--ok-deep); }
.nexcalia-app .kpi .delta.dn { color: var(--danger); }
.nexcalia-app .kpi .spark { height: 28px; margin-top: 4px; }

.nexcalia-app .kpi .nx-kpi-spark {
    display: block;
    margin: 8px -14px -12px;
    width: calc(100% + 28px);
    height: 48px;
}
.nexcalia-app .kpi .nx-kpi-spark ui-chart {
    display: block;
    height: 100%;
    width: 100%;
}

[data-palette="dark"] .nexcalia-app .kpi:hover {
  box-shadow: 0 8px 24px rgba(0,0,0,.45), 0 2px 4px rgba(0,0,0,.30);
}


/* ===== color-picker.css ===== */
/* ============================================================================
   color-picker — déclencheur (pastille + hex) + <flux:popover> contenant une
   grille de pastilles + couleur personnalisée + saisie hex. Recolorise les
   primitives Flux (dropdown/popover, palette zinc) vers les tokens Nexcalia.
   ========================================================================== */

.nexcalia-app .nx-colorpicker {
  display: inline-flex;
}

/* ---- Déclencheur ------------------------------------------------------- */
.nexcalia-app .nx-colorpicker-trigger {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  height: 38px;
  padding: 0 10px;
  border-radius: var(--radius, 8px);
  border: 1px solid var(--line);
  background: var(--surface);
  color: var(--ink);
  cursor: pointer;
  transition:
    border-color 0.12s ease,
    box-shadow 0.12s ease;
}
.nexcalia-app .nx-colorpicker-trigger:hover {
  border-color: var(--ink-3);
}
.nexcalia-app .nx-colorpicker-trigger:focus-visible {
  outline: none;
  border-color: var(--primary);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary) 18%, transparent);
}
.nexcalia-app .nx-colorpicker-trigger-sw {
  width: 18px;
  height: 18px;
  border-radius: 5px;
  border: 1px solid rgba(0, 0, 0, 0.12);
  flex-shrink: 0;
}
.nexcalia-app .nx-colorpicker-trigger-sw.is-empty {
  background: repeating-conic-gradient(var(--line) 0% 25%, transparent 0% 50%)
    50% / 8px 8px !important;
}
.nexcalia-app .nx-colorpicker-trigger-text {
  font-size: 0.85rem;
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  text-transform: lowercase;
  color: var(--ink-2);
  min-width: 58px;
  text-align: left;
}
.nexcalia-app .nx-colorpicker-chev {
  width: 14px;
  height: 14px;
  color: var(--ink-3);
  flex-shrink: 0;
}

/* ---- Popover (override du chrome Flux zinc → tokens) -------------------
   NE PAS toucher au `display` : Flux masque/affiche le popover via
   `not-data-open:hidden` (display:none quand fermé). On ne stylise QUE
   l'apparence ; le layout flex va sur le conteneur interne `.nx-colorpicker-panel`. */
.nexcalia-app .nx-colorpicker-pop {
  position: relative;
  min-width: 0 !important;
  width: max-content;
  padding: 14px !important;
  border: 0 !important;
  border-radius: 12px !important;
  background: var(--surface) !important;
  overflow: hidden;
  /* Même langage visuel que .nx-dropdown-menu : liseré inset blanc + ombres
     douces + anneau 1px ; le halo bleu est porté par ::after. */
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.6) inset,
    0 18px 40px rgba(43, 57, 72, 0.16),
    0 4px 12px rgba(43, 57, 72, 0.08),
    0 0 0 1px color-mix(in oklab, var(--line) 80%, transparent) !important;
}
/* Léger halo bleu dans le coin haut-gauche (identique aux dropdowns). */
.nexcalia-app .nx-colorpicker-pop::after {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(
    140px 80px at 20% 0%,
    color-mix(in oklab, var(--primary) 10%, transparent),
    transparent 70%
  );
  pointer-events: none;
}
.nexcalia-app .nx-colorpicker-panel {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  gap: 12px;
}

/* ---- Grille de pastilles ---------------------------------------------- */
.nexcalia-app .nx-colorpicker-swatches {
  display: grid;
  grid-template-columns: repeat(10, 24px);
  gap: 7px;
}
.nexcalia-app .nx-colorpicker-swatch {
  --sw: transparent;
  position: relative;
  width: 24px;
  height: 24px;
  border-radius: 6px;
  background: var(--sw);
  border: 1px solid rgba(0, 0, 0, 0.12);
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  transition:
    transform 0.12s ease,
    box-shadow 0.12s ease;
}
.nexcalia-app .nx-colorpicker-swatch:hover {
  transform: translateY(-1px);
}
.nexcalia-app .nx-colorpicker-swatch:focus-visible {
  outline: none;
  box-shadow:
    0 0 0 2px var(--surface),
    0 0 0 4px var(--primary);
}
.nexcalia-app .nx-colorpicker-swatch.is-selected {
  box-shadow:
    0 0 0 2px var(--surface),
    0 0 0 4px var(--primary);
}
.nexcalia-app .nx-colorpicker-check,
.nexcalia-app .nx-colorpicker-plus {
  width: 14px;
  height: 14px;
  color: #fff;
  filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.35));
}
.nexcalia-app .nx-colorpicker-check {
  opacity: 0;
  transition: opacity 0.12s ease;
}
.nexcalia-app .nx-colorpicker-swatch.is-selected .nx-colorpicker-check {
  opacity: 1;
}

/* Pastille « couleur personnalisée » : roue arc-en-ciel quand inactive */
.nexcalia-app .nx-colorpicker-custom {
  border-style: dashed;
  border-color: var(--line);
  background: conic-gradient(
    from 90deg,
    #ef4444,
    #f59e0b,
    #16a34a,
    #0891b2,
    #6366f1,
    #db2777,
    #ef4444
  );
}
.nexcalia-app .nx-colorpicker-custom.is-selected {
  background: var(--sw);
  border-style: solid;
  border-color: rgba(0, 0, 0, 0.12);
}

/* ---- Couleur personnalisée + saisie hex ------------------------------- */
.nexcalia-app .nx-colorpicker-hexrow {
  display: flex;
  align-items: center;
  gap: 8px;
}
.nexcalia-app .nx-colorpicker-hexrow .nx-colorpicker-swatch {
  flex-shrink: 0;
}
.nexcalia-app .nx-colorpicker-hex {
  flex: 1;
  height: 34px;
  border-radius: var(--radius, 8px);
  border: 1px solid var(--line);
  background: var(--surface);
  color: var(--ink);
  font-size: 0.85rem;
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  padding: 0 10px;
  text-transform: lowercase;
}
.nexcalia-app .nx-colorpicker-hex:focus {
  outline: none;
  border-color: var(--primary);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary) 18%, transparent);
}


/* ===== multipick.css ===== */
.nexcalia-app .nx-multipick { position: relative; }
.nexcalia-app .nx-multipick [x-cloak] { display: none; }
.nexcalia-app .nx-multipick-trigger {
    align-items: center;
    flex-wrap: wrap;
    gap: 4px;
    min-height: 36px;
    padding: 4px 30px 4px 6px;
    cursor: pointer;
}
.nexcalia-app .nx-input-sm.nx-multipick-trigger { min-height: 30px; padding: 3px 28px 3px 5px; }
.nexcalia-app .nx-input-lg.nx-multipick-trigger { min-height: 42px; padding: 6px 32px 6px 8px; }
.nexcalia-app .nx-multipick-placeholder {
    padding: 2px 4px;
    font-size: var(--fs-body);
    color: var(--ink-3);
}
.nexcalia-app .nx-multipick-panel {
    top: calc(100% + 6px);
    left: 0;
    right: 0;
    min-width: 0;
    padding: 6px;
}
.nexcalia-app .nx-multipick-panel.is-up {
    top: auto;
    bottom: calc(100% + 6px);
}
.nexcalia-app .nx-multipick-search { padding-bottom: 6px; }
.nexcalia-app .nx-multipick-list { max-height: 220px; overflow-y: auto; }
.nexcalia-app .nx-multipick-option {
    width: 100%;
    border: 0;
    background: transparent;
    text-align: left;
}
.nexcalia-app .nx-multipick-option.is-active { background: var(--hover); }
.nexcalia-app .nx-multipick-check { opacity: 0; }
.nexcalia-app .nx-multipick-option[aria-selected="true"] .nx-multipick-check { opacity: 1; }
.nexcalia-app .nx-multipick-sentinel { font-weight: 600; }
.nexcalia-app .nx-multipick-sep {
    height: 1px;
    margin: 4px 0;
    background: color-mix(in oklab, var(--line) 70%, transparent);
}
.nexcalia-app .nx-multipick-empty {
    padding: 8px 10px;
    font-size: var(--fs-sm);
    color: var(--ink-3);
}
.nexcalia-app .nx-multipick-foot {
    margin-top: 6px;
    padding-top: 6px;
    border-top: 1px solid var(--line);
}
.nexcalia-app .nx-multipick-foot .btn { width: 100%; justify-content: center; }
.nexcalia-app .nx-pill-remove {
    display: inline-flex;
    padding: 0;
    border: 0;
    background: transparent;
    color: inherit;
    cursor: pointer;
    opacity: 0.8;
}
.nexcalia-app .nx-pill-remove:hover { opacity: 1; }



/* ===== autocomplete.css ===== */
.nexcalia-app .nx-autocomplete { position: relative; }
.nexcalia-app .nx-autocomplete [x-cloak] { display: none; }
.nexcalia-app .nx-autocomplete-spinner { padding-right: 10px; }
.nexcalia-app .nx-autocomplete-panel {
    top: calc(100% + 6px);
    left: 0;
    right: 0;
    min-width: 0;
    padding: 6px;
}
.nexcalia-app .nx-autocomplete-list { max-height: 220px; overflow-y: auto; }
.nexcalia-app .nx-autocomplete-option {
    width: 100%;
    border: 0;
    background: transparent;
    text-align: left;
}
.nexcalia-app .nx-autocomplete-option.is-active { background: var(--hover); }
.nexcalia-app .nx-autocomplete-empty {
    padding: 8px 10px;
    font-size: var(--fs-sm);
    color: var(--ink-3);
}
.nexcalia-app .nx-autocomplete-foot {
    margin-top: 6px;
    padding-top: 6px;
    border-top: 1px solid var(--line);
}
.nexcalia-app .nx-autocomplete-foot .btn { width: 100%; justify-content: center; }


/* ===== swatch-select.css ===== */
.nexcalia-app .nx-swatch-select { position: relative; }
.nexcalia-app .nx-swatch-select [x-cloak] { display: none; }
.nexcalia-app .nx-swatch-trigger {
    align-items: center;
    gap: 8px;
    min-height: 36px;
    padding: 0 30px 0 10px;
    cursor: pointer;
}
.nexcalia-app .nx-input-sm.nx-swatch-trigger { min-height: 30px; }
.nexcalia-app .nx-input-lg.nx-swatch-trigger { min-height: 42px; }
.nexcalia-app .nx-swatch-trigger-label {
    font-size: var(--fs-body);
    color: var(--ink);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.nexcalia-app .nx-swatch-placeholder {
    font-size: var(--fs-body);
    color: var(--ink-3);
}
.nexcalia-app .nx-swatch-dot {
    display: block;
    width: 18px;
    height: 18px;
    border-radius: 50%;
    object-fit: cover;
    flex-shrink: 0;
    box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--ink) 14%, transparent);
}
.nexcalia-app .nx-swatch-panel {
    top: calc(100% + 6px);
    left: 0;
    right: 0;
    min-width: 0;
    padding: 8px;
}
.nexcalia-app .nx-swatch-grid {
    display: grid;
    grid-template-columns: repeat(var(--nx-swatch-cols, 5), minmax(0, 1fr));
    gap: 4px;
    max-height: 260px;
    overflow-y: auto;
}
.nexcalia-app .nx-swatch-option {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 5px;
    padding: 8px 4px;
    border: 0;
    border-radius: var(--radius-sm);
    background: transparent;
    cursor: pointer;
    transition: background-color 0.12s ease-out;
}
.nexcalia-app .nx-swatch-option:hover,
.nexcalia-app .nx-swatch-option.is-active { background: var(--hover); }
.nexcalia-app .nx-swatch-option[aria-selected="true"] { background: var(--primary-soft); }
.nexcalia-app .nx-swatch-option .nx-swatch-dot { width: 26px; height: 26px; }
.nexcalia-app .nx-swatch-option[aria-selected="true"] .nx-swatch-dot {
    box-shadow: 0 0 0 2px var(--surface), 0 0 0 4px var(--primary);
}
.nexcalia-app .nx-swatch-name {
    max-width: 100%;
    font-size: var(--fs-xs);
    color: var(--ink-2);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.nexcalia-app .nx-swatch-empty {
    padding: 8px 10px;
    font-size: var(--fs-sm);
    color: var(--ink-3);
}


/* ===== flux-dark.css ===== */
/* ── Surfaces flottantes Flux en palette sombre ───────────────────────────
   Tous les panneaux Flux (select listbox, pillbox, autocomplete, time-picker,
   date-picker, popover/dropdown, éditeur, palette de commandes) partagent la
   même recette `bg-white dark:bg-zinc-700` posée sur un élément [popover] :
   une seule règle générique suffit, plutôt qu'un override par composant.
   Le `.bg-white` du sélecteur est ce qui distingue un panneau d'une bulle
   volontairement sombre — la bulle de jour du date-picker est en bg-zinc-800
   dans les deux thèmes et reste donc intacte.
   !important : `dark:bg-zinc-700` compile en `[data-palette="dark"]
   .dark\:bg-zinc-700` (0,2,0), plus fort que nos sélecteurs, et flux.css est
   servi après app.css. Couvre aussi les volets legacy, déjà en data-palette. */
[data-palette="dark"] [popover].bg-white {
    background-color: var(--surface) !important;
    border-color: var(--line) !important;
    color: var(--ink) !important;
}

/* Le date-picker est le seul Flux à poser son panneau dans un <dialog> plutôt
   qu'un [popover], en dark:bg-zinc-900 : presque noir, donc il PARAÎT correct
   en sombre alors qu'il n'est pas non plus aux tokens. */
[data-palette="dark"] [data-flux-date-picker] > dialog {
    background-color: var(--surface) !important;
    border-color: var(--line) !important;
    color: var(--ink) !important;
}

/* Champ de recherche interne des select / pillbox / palette de commandes */
[data-palette="dark"] [popover] input.bg-white {
    background-color: var(--surface-2) !important;
    border-color: var(--line) !important;
    color: var(--ink) !important;
}

/* Option survolée ou active au clavier */
[data-palette="dark"] [popover] [data-active] {
    background-color: var(--hover) !important;
    color: var(--ink) !important;
}

/* Option sélectionnée */
[data-palette="dark"] [popover] [aria-selected="true"] {
    background-color: var(--primary-soft) !important;
    color: var(--ink) !important;
}

/* Pills du déclencheur pillbox — zinc-400/40 par défaut, gris chaud en sombre */
[data-palette="dark"] ui-selected .dark\:bg-zinc-400\/40 {
    background-color: var(--primary-soft) !important;
    color: var(--ink) !important;
}

/* Infobulle des graphiques (<x-nexcalia.spark> → flux:chart). Hors [popover] :
   elle vit dans un <template name="tooltip"> cloné à l'exécution et positionné
   en absolu, d'où le ciblage par <ui-chart>. Le corps suit la même recette
   bg-white/zinc-700 que les panneaux, l'en-tête est en zinc-600.
   unverified against a live chart — l'infobulle n'apparaît qu'au survol d'un
   point de données, que je n'ai pas su déclencher en test automatisé. */
[data-palette="dark"] ui-chart .bg-white {
    background-color: var(--surface) !important;
    border-color: var(--line) !important;
    color: var(--ink) !important;
}
[data-palette="dark"] ui-chart .dark\:bg-zinc-600 {
    background-color: var(--surface-2) !important;
    border-color: var(--line) !important;
}


/* ===== border-beam.css ===== */
/* border-beam — un trait lumineux fin qui orbite le long de la bordure d'un
   élément (carte, bouton, input), pour mettre en avant un élément sans être
   criard. Pur CSS, zéro JS requis.

   Technique de rendu (respecte le border-radius, contrairement à border-image) :
   - un pseudo-élément ::after en inset:0 qui porte un conic-gradient (l'arc) ;
   - un double mask (content-box exclude) qui n'expose que l'anneau de bordure,
     d'épaisseur --nx-beam-width (= le padding du pseudo-élément) ;
   - l'angle du dégradé est une custom property animée via @property, donc seule
     cette variable est animée (pas de repaint massif du layout).

   @property est supporté partout (Chrome 85+, Safari 15.4+, Firefox 128+). En
   l'absence de support, l'arc reste simplement statique — dégradé acceptable.

   TAILLE DE L'HÔTE — @property évite le *layout*, pas le *paint* : l'arc est
   repeint à chaque image, sur toute la surface de l'hôte. Mesuré sur une carte
   420×580 : pire image à 100,5 ms (75,9 ms sans le bloom `--nx-beam-glow: 0`),
   contre 17,7 ms pour une bordure en dégradé statique. Réserver aux petits
   éléments (bouton, badge, input) ; sur une carte, préférer une bordure
   dégradée statique.

   Variables de tuning (sur l'élément hôte) :
     --nx-beam-width     épaisseur du trait            (défaut 1.75px)
     --nx-beam-duration  durée d'une orbite complète   (défaut 6s, lent/calme)
     --nx-beam-color     couleur du trait              (défaut var(--primary))
     --nx-beam-size      demi-longueur de l'arc, en %  (défaut 11%)
     --nx-beam-glow      intensité du bloom (0 = off)  (défaut 0.35) */

@property --nx-beam-angle {
  syntax: "<angle>";
  initial-value: 0deg;
  inherits: false;
}

.nexcalia-app .nx-border-beam {
  position: relative;
  --nx-beam-width: 1.75px;
  --nx-beam-duration: 6s;
  --nx-beam-color: var(--primary);
  --nx-beam-size: 11%;
  --nx-beam-glow: 0.35;
}

/* Le trait lumineux : conic-gradient étroit, fondu doux des deux côtés (pas de
   bords durs), isolé sur l'anneau de bordure par le double mask. */
.nexcalia-app .nx-border-beam::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  padding: var(--nx-beam-width);
  pointer-events: none;
  z-index: 1;
  background: conic-gradient(
    from var(--nx-beam-angle),
    transparent 0%,
    color-mix(in oklab, var(--nx-beam-color) 90%, transparent) var(--nx-beam-size),
    transparent calc(var(--nx-beam-size) * 2)
  );
  -webkit-mask:
    linear-gradient(var(--nx-white) 0 0) content-box,
    linear-gradient(var(--nx-white) 0 0);
  -webkit-mask-composite: xor;
  mask:
    linear-gradient(var(--nx-white) 0 0) content-box,
    linear-gradient(var(--nx-white) 0 0);
  mask-composite: exclude;
  animation: nx-beam-spin var(--nx-beam-duration) linear infinite;
}

/* Bloom : copie plus large et floutée du même arc, très basse opacité, pour un
   halo cohérent avec le langage aurora/spotlight du thème. Désactivable en
   posant --nx-beam-glow: 0. */
.nexcalia-app .nx-border-beam::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  padding: calc(var(--nx-beam-width) * 2);
  pointer-events: none;
  z-index: 0;
  opacity: var(--nx-beam-glow);
  filter: blur(3px);
  background: conic-gradient(
    from var(--nx-beam-angle),
    transparent 0%,
    color-mix(in oklab, var(--nx-beam-color) 70%, transparent) var(--nx-beam-size),
    transparent calc(var(--nx-beam-size) * 2)
  );
  -webkit-mask:
    linear-gradient(var(--nx-white) 0 0) content-box,
    linear-gradient(var(--nx-white) 0 0);
  -webkit-mask-composite: xor;
  mask:
    linear-gradient(var(--nx-white) 0 0) content-box,
    linear-gradient(var(--nx-white) 0 0);
  mask-composite: exclude;
  animation: nx-beam-spin var(--nx-beam-duration) linear infinite;
}

@keyframes nx-beam-spin {
  to {
    --nx-beam-angle: 360deg;
  }
}

/* Variantes de couleur — branchées sur les tokens sémantiques du thème. */
.nexcalia-app .nx-border-beam--success {
  --nx-beam-color: var(--ok);
}
.nexcalia-app .nx-border-beam--warning {
  --nx-beam-color: var(--warn);
}
.nexcalia-app .nx-border-beam--danger {
  --nx-beam-color: var(--danger);
}
.nexcalia-app .nx-border-beam--info {
  --nx-beam-color: var(--info);
}

/* Réglages d'ambiance optionnels. */
.nexcalia-app .nx-border-beam--calm {
  --nx-beam-duration: 9s;
}
.nexcalia-app .nx-border-beam--flat {
  --nx-beam-glow: 0;
}

/* prefers-reduced-motion : l'orbite est déjà quasi-gelée par la règle globale de
   loading-a11y.css ; on coupe explicitement l'animation pour figer l'arc dans un
   état stable (angle initial), cohérent avec le reste du thème. */
@media (prefers-reduced-motion: reduce) {
  .nexcalia-app .nx-border-beam::before,
  .nexcalia-app .nx-border-beam::after {
    animation: none;
  }
}


/* ===== spotlight.css ===== */
/* spotlight — un anneau lumineux qui tourne le long de la bordure, révélé au
   survol. Même technique que border-beam (conic-gradient masqué en anneau,
   angle animé via @property), mais orienté interaction : invisible au repos,
   il apparaît au survol pour désigner l'action principale.

   Deux usages :
     .nx-spotlight        anneau blanc, révélé au survol — pour un bouton plein
                          (primary/accent), où le blanc tranche sur le fond.
     .nx-spotlight-card   anneau aux couleurs de marque, permanent — pour une
                          surface claire (carte, sélecteur d'espace), où un
                          anneau blanc serait invisible.

   Réservé aux petits éléments : l'arc se repeint à chaque image, ce qui reste
   indolore sur un bouton mais provoque un jank net sur une grande carte
   (mesuré : ~100 ms/frame sur 420×580). Voir aussi border-beam.css. */

@property --ring-angle {
  syntax: "<angle>";
  initial-value: 0deg;
  inherits: false;
}

.nexcalia-app .nx-spotlight {
  position: relative;
  isolation: isolate;
}

.nexcalia-app .nx-spotlight::before {
  content: "";
  position: absolute;
  inset: -1.5px;
  padding: 1.5px;
  border-radius: inherit;
  background: conic-gradient(
    from var(--ring-angle, 0deg),
    transparent 0deg,
    rgba(255, 255, 255, 0.95) 14deg,
    rgba(255, 255, 255, 0.45) 38deg,
    rgba(255, 255, 255, 0.18) 70deg,
    transparent 100deg,
    transparent 360deg
  );
  -webkit-mask:
    linear-gradient(var(--nx-white) 0 0) content-box,
    linear-gradient(var(--nx-white) 0 0);
  -webkit-mask-composite: xor;
  mask:
    linear-gradient(var(--nx-white) 0 0) content-box,
    linear-gradient(var(--nx-white) 0 0);
  mask-composite: exclude;
  opacity: 0;
  transition: opacity 0.25s ease-out;
  pointer-events: none;
}
/* Au focus clavier aussi : l'anneau désigne l'action principale, il doit se
   montrer à qui navigue au clavier. */
.nexcalia-app .nx-spotlight:hover::before,
.nexcalia-app .nx-spotlight:focus-visible::before {
  opacity: 1;
  animation: nx-ring-spin 2.2s linear infinite;
}

/* Doublement de classe pour passer devant `.nx-spotlight:hover::before`, de
   spécificité égale : l'anneau de marque doit rester le même au survol. */
.nexcalia-app .nx-spotlight.nx-spotlight-card::before {
  background: conic-gradient(
    from var(--ring-angle, 0deg),
    transparent 0deg,
    color-mix(in oklab, var(--primary) 75%, transparent) 14deg,
    color-mix(in oklab, var(--primary) 40%, transparent) 38deg,
    color-mix(in oklab, var(--primary) 12%, transparent) 70deg,
    transparent 100deg,
    transparent 360deg
  );
  opacity: 1;
  animation: nx-ring-spin 2.6s linear infinite;
}

@keyframes nx-ring-spin {
  from {
    --ring-angle: 0deg;
  }
  to {
    --ring-angle: 360deg;
  }
}

@media (prefers-reduced-motion: reduce) {
  .nexcalia-app .nx-spotlight::before,
  .nexcalia-app .nx-spotlight:hover::before,
  .nexcalia-app .nx-spotlight:focus-visible::before,
  .nexcalia-app .nx-spotlight.nx-spotlight-card::before {
    animation: none;
  }
}


/* ===== powered-by.css ===== */
/* powered-by — signature « Propulsé par nexcalia » (voir
   resources/views/components/nexcalia/powered-by.blade.php).

   Au repos : le libellé, la barre bleue seule de la marque, le mot « nexcalia ».
   Au survol : libellé et mot se rétractent pendant que le logotype se déplie
   (le X glisse en place, « ne » apparaît, « calia » se dévoile au clip-path,
   les deux triangles rebondissent).

   Non scopé .nexcalia-app : la signature sert aussi sur des layouts publics
   (borne, écran d'authentification) qui n'ont pas le wrapper. Les tokens vivant
   sur :root, les couleurs suivent quand même la palette.

   Retinte — la signature se pose parfois sur un fond qui ne suit PAS la palette
   (photo, aplat de marque). Redéfinir alors ces deux variables sur l'hôte
   plutôt que de surcharger les règles :
     --nx-signature-ink       nom + logotype   (défaut --ink)
     --nx-signature-ink-soft  libellé          (défaut --ink-3) */

.nx-created-by {
  --nx-signature-ink: var(--ink);
  --nx-signature-ink-soft: var(--ink-3);

  display: flex;
  align-items: center;
  justify-content: center;
  width: 13rem;
  height: 2rem;
  margin-inline: auto;
}

.nx-created-by__label,
.nx-created-by__name {
  display: inline-block;
  position: relative;
  top: 0.25rem;
  overflow: hidden;
  white-space: nowrap;
  font-size: 0.875rem;
}
.nx-created-by__label {
  max-width: 10rem;
  margin-right: 0.5rem;
  color: var(--nx-signature-ink-soft);
  transition:
    max-width 0.3s ease-in 0.55s,
    margin-right 0.3s ease-in 0.55s,
    opacity 0.2s ease-in 0.65s;
}
.nx-created-by:hover .nx-created-by__label {
  max-width: 0;
  margin-right: 0;
  opacity: 0;
  transition:
    max-width 0.3s ease-in,
    margin-right 0.3s ease-in,
    opacity 0.2s ease-in;
}
.nx-created-by__name {
  max-width: 8rem;
  margin-left: 0.375rem;
  font-weight: 500;
  color: var(--nx-signature-ink);
  transition:
    max-width 0.3s ease-in 0.55s,
    margin-left 0.3s ease-in 0.55s,
    opacity 0.2s ease-in 0.65s;
}
.nx-created-by:hover .nx-created-by__name {
  max-width: 0;
  margin-left: 0;
  opacity: 0;
  transition:
    max-width 0.3s ease-in,
    margin-left 0.3s ease-in,
    opacity 0.2s ease-in;
}

/* La boîte masque le logotype par sa largeur : au repos seule la barre bleue
   dépasse, le reste est hors cadre (overflow du SVG laissé visible). */
.nx-created-by__logo-box {
  width: 1.25rem;
  height: 2rem;
  transition: width 0.35s ease-out 0.1s;
}
.nx-created-by:hover .nx-created-by__logo-box {
  width: 9rem;
  transition: width 0.35s ease-out 0.3s;
}
.nx-created-by__logo {
  display: block;
  width: 9rem;
  height: 2rem;
  max-width: none;
  overflow: visible;
  pointer-events: none;
}

.nx-logo__ne {
  opacity: 0;
  transition: opacity 0.2s ease-in;
}
.nx-created-by:hover .nx-logo__ne {
  opacity: 1;
  transition: opacity 0.25s ease-in 0.55s;
}
.nx-logo__x {
  transform: translate3d(-29.5%, 0, 0);
  transition: transform 0.5s ease-in 0.35s;
}
.nx-created-by:hover .nx-logo__x {
  transform: translate3d(0, 0, 0);
  transition: transform 0.5s ease-in 0.3s;
}
.nx-logo__calia {
  clip-path: polygon(0 0, 0 0, 0 100%, 0 100%);
  transition: clip-path 0.4s ease-in;
}
.nx-created-by:hover .nx-logo__calia {
  clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
  transition: clip-path 0.45s ease-in 0.4s;
}
.nx-created-by:hover .nx-logo__tri--green {
  animation: nx-tri-green 0.8s cubic-bezier(0.34, 1.56, 0.64, 1) 0.45s;
}
.nx-created-by:hover .nx-logo__tri--yellow {
  animation: nx-tri-yellow 0.8s cubic-bezier(0.34, 1.56, 0.64, 1) 0.45s;
}
@keyframes nx-tri-green {
  45% {
    transform: translate(3%, -13%);
  }
}
@keyframes nx-tri-yellow {
  45% {
    transform: translate(-3%, 13%);
  }
}

/* Le logotype est monochrome hors X : ses `fill` inline sont écrasés pour qu'il
   suive l'encre. --ink et pas --ink-2, ce dernier ne donnant que 4,15:1 sur
   fond sombre, sous le seuil AA de 4,5. */
.nx-created-by .nx-logo__ne path,
.nx-created-by .nx-logo__calia path {
  fill: var(--nx-signature-ink);
}

@media (prefers-reduced-motion: reduce) {
  .nx-created-by__label,
  .nx-created-by__name,
  .nx-created-by__logo-box,
  .nx-logo__ne,
  .nx-logo__x,
  .nx-logo__calia {
    transition: none;
  }
  .nx-created-by:hover .nx-logo__tri--green,
  .nx-created-by:hover .nx-logo__tri--yellow {
    animation: none;
  }
}


/* ===== tables.css ===== */
/*
    Tables — utilitaires pour les tableaux défilants (datatables, rappasoft…).

    .nx-table-sticky-right : épingle une colonne (th ET td) au bord droit d'un
    conteneur en overflow-x-auto. Fond opaque en token (suit le dark mode) et
    ombre de séparation à gauche pour signaler que la colonne survole le
    contenu qui défile dessous. Pensée pour la colonne d'actions des tables
    larges : le bouton reste atteignable sans scroller jusqu'au bout.

    Le dropdown d'actions placé dans une telle colonne doit être un
    <x-nexcalia.row-actions> (menu téléporté en position fixed) : un menu en
    position absolue serait clippé par l'overflow du conteneur.
*/
.nx-table-sticky-right {
    position: sticky;
    right: 0;
    z-index: 10;
    background: var(--surface);
    box-shadow: -10px 0 10px -10px rgba(43, 57, 72, 0.18);
}

thead .nx-table-sticky-right,
th.nx-table-sticky-right {
    background: var(--surface-2);
}


/* ===== shell.css ===== */
/* Chrome applicatif — shell, sidebar, topbar, brand, nav, footer utilisateur.

   Ces règles remplacent les utilities Tailwind que les vues du chrome
   portaient jusqu'en v2.21 : le package ne doit rien devoir au Tailwind de
   l'app consommatrice (cf. README « Frontière Tailwind / sémantique »).
   Les tokens vivent dans tokens.css, donc palettes et dark mode suivent. */

/* ───────────────────────── shell ───────────────────────── */

/* Ancre de positionnement pour le mesh, le backdrop mobile et la bulle de
   collapse, tous en absolute par rapport au shell. */
.nexcalia-shell {
  position: relative;
}

/* Halo radial derrière la sidebar en verre. Purement décoratif. */
.nx-shell-mesh {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  width: 18rem;
  z-index: 0;
  pointer-events: none;
}

.nx-shell-backdrop {
  position: fixed;
  inset: 0;
  z-index: 20;
  cursor: pointer;
}

/* ─────────────── bulle de collapse (seam sidebar / contenu) ─────────────── */

.nx-toggle-bubble {
  position: absolute;
  top: 28px;
  z-index: 30;
  display: grid;
  place-items: center;
  width: 1.75rem;
  height: 1.75rem;
  border-radius: 9999px;
  cursor: pointer;
  transition: all 0.3s cubic-bezier(0, 0, 0.2, 1);
}

.nx-bubble-halo {
  position: absolute;
  inset: 0;
  border-radius: 9999px;
  pointer-events: none;
}

.nx-bubble-chev {
  position: relative;
  transition: transform 0.3s cubic-bezier(0.5, 1.5, 0.5, 1);
}

.nx-bubble-chev.is-flipped {
  transform: rotate(180deg);
}

/* ───────────────────────── sidebar ───────────────────────── */

/* Reste un <aside> : les règles existantes qui ciblent l'élément
   (`aside:hover ~ .nx-toggle-bubble`, `aside:not(:hover) .nx-aurora`, …)
   continuent de matcher. */
.nx-sidebar {
  position: relative;
  display: flex;
  flex-direction: column;
  min-height: 0;
  overflow: hidden;
  z-index: 10;
}

.nx-sidebar-aurora {
  position: absolute;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
  z-index: 0;
}

.nx-sidebar-halo {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 10rem;
  pointer-events: none;
}

/* ───────────────────────── topbar ───────────────────────── */

/* Le hamburger, la cloche et le bouton bornes portaient
   `transition-all duration-200 hover:-translate-y-0.5 hover:shadow-md` : déjà
   couvert par `.icon-btn:hover`, qui gagnait de toute façon la cascade
   (0,3,0 contre 0,2,0). Rien à réimplémenter ici. */

.nexcalia-app .nx-burger-glyph {
  transition: transform 0.2s;
}
.nexcalia-app .nx-burger-glyph.is-open {
  transform: rotate(90deg);
}

.nexcalia-app .crumb .site {
  cursor: pointer;
  transition: color 0.15s;
}
.nexcalia-app .crumb .site:hover {
  color: var(--ink);
}

/* `group-hover:scale-110` d'origine n'a jamais agi : le bouton parent ne porte
   pas `.group`. Seul `inline-block` était vivant, on s'en tient là. */
.nexcalia-app .nx-kiosk-glyph {
  display: inline-block;
}

/* ───────────────────────── navigation ─────────────────────────

   Les états passaient par des ternaires Blade/Alpine crachant des utilities
   (`text-nx-ink font-semibold` vs `text-nx-ink2 hover:-translate-y-px`), et
   les survols par le mécanisme `group` / `group/sub` de Tailwind. Tout est
   ramené ici sur une seule classe d'état `.is-active` + des sélecteurs
   descendants. */

.nx-nav-scroll {
  flex: 1 1 0%;
  min-height: 0;
  overflow-y: auto;
  position: relative;
}

.nexcalia-app .nx-section-label {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 1rem 1rem 0.5rem;
  font-size: 0.625rem;
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-3);
}

.nexcalia-app .nx-section-rule {
  flex: 1 1 0%;
  height: 1px;
}

.nexcalia-app .nx-nav {
  display: flex;
  flex-direction: column;
  padding: 0 0.5rem;
  gap: 0.125rem;
}

/* ── item de premier niveau ── */

.nexcalia-app .nx-nav-item {
  position: relative;
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.5rem 0.625rem;
  border-radius: var(--radius-sm);
  font-size: 0.8125rem;
  line-height: 1;
  font-weight: 500;
  color: var(--ink-2);
  text-decoration: none;
  cursor: pointer;
  transition: all 0.15s cubic-bezier(0, 0, 0.2, 1);
}

.nexcalia-app .nx-nav-item:hover {
  color: var(--ink);
  transform: translateY(-1px);
}

.nexcalia-app .nx-nav-item.is-active {
  color: var(--ink);
  font-weight: 600;
  transform: none;
}

.nexcalia-app .nx-nav-ico {
  width: 1rem;
  height: 1rem;
  flex-shrink: 0;
  color: var(--ink-3);
  transition: all 0.2s cubic-bezier(0, 0, 0.2, 1);
}

.nexcalia-app .nx-nav-item:hover .nx-nav-ico {
  transform: scale(1.25);
  color: var(--ink-2);
}

.nexcalia-app .nx-nav-item.is-active .nx-nav-ico {
  color: var(--primary);
}

.nexcalia-app .nx-nav-label {
  flex: 1 1 0%;
}

.nexcalia-app .nx-nav-live {
  width: 0.375rem;
  height: 0.375rem;
  flex-shrink: 0;
  border-radius: 9999px;
  background: var(--ok);
  animation: nx-nav-live-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}

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

.nexcalia-app .nx-nav-count {
  padding: 0.125rem 0.375rem;
  border-radius: 9999px;
  font-size: 0.625rem;
  font-weight: 500;
  font-variant-numeric: tabular-nums;
  color: var(--ink-3);
  transition: all 0.2s cubic-bezier(0, 0, 0.2, 1);
}

.nexcalia-app .nx-nav-item:hover .nx-nav-count {
  transform: scale(1.1);
  padding-left: 0.5rem;
  padding-right: 0.5rem;
  color: var(--ink-2);
}

.nexcalia-app .nx-nav-item.is-active .nx-nav-count {
  color: var(--primary-deep);
}

.nexcalia-app .nx-nav-chev {
  color: var(--ink-3);
  transition: transform 0.2s;
}

.nexcalia-app .nx-nav-chev.is-open {
  transform: rotate(90deg);
}

/* Rangée de nav portant une action rapide (`trailing`) : le lien principal
   occupe la place restante, le bouton d'action reste à droite. */
.nexcalia-app .nx-nav-item-link {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.75rem;
  flex: 1 1 0%;
  min-width: 0;
  color: inherit;
  font: inherit;
  text-decoration: none;
}

.nexcalia-app .nx-nav-trailing {
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.5rem;
  height: 1.5rem;
  border-radius: var(--radius-sm);
  color: var(--ink-3);
  transition: all 0.15s;
}

.nexcalia-app .nx-nav-trailing:hover {
  color: var(--primary);
  transform: scale(1.1);
}

/* ── sous-menu inline ── */

.nexcalia-app .nx-submenu-inline {
  position: relative;
  padding-left: 0.75rem;
  margin-left: 0.75rem;
  margin-top: 0.125rem;
  margin-bottom: 0.375rem;
}

.nexcalia-app .nx-submenu-list {
  display: flex;
  flex-direction: column;
  gap: 0.125rem;
  padding: 0.25rem 0;
}

.nexcalia-app .nx-subnav-item {
  position: relative;
  display: flex;
  align-items: center;
  gap: 0.625rem;
  padding: 0.375rem 0.5rem 0.375rem 0.625rem;
  border-radius: var(--radius-sm);
  font-size: 0.75rem;
  line-height: 1;
  color: var(--ink-3);
  text-decoration: none;
  cursor: pointer;
  transition: all 0.15s cubic-bezier(0, 0, 0.2, 1);
}

.nexcalia-app .nx-subnav-item:hover {
  color: var(--ink);
  transform: translateX(2px);
}

.nexcalia-app .nx-subnav-item.is-active {
  color: var(--ink);
  font-weight: 600;
  transform: none;
}

.nexcalia-app .nx-subnav-connector {
  position: absolute;
  left: -0.75rem;
  top: 50%;
  width: 0.625rem;
  height: 1px;
}

.nexcalia-app .nx-subnav-dot {
  position: absolute;
  left: -14px;
  top: 50%;
  transform: translateY(-50%);
  width: 0.375rem;
  height: 0.375rem;
  border-radius: 9999px;
  background: var(--ink-3);
  transition: all 0.15s;
}

.nexcalia-app .nx-subnav-item:hover .nx-subnav-dot {
  background: var(--ink-2);
}

.nexcalia-app .nx-subnav-item.is-active .nx-subnav-dot {
  background: var(--primary);
}

.nexcalia-app .nx-subnav-ico {
  width: 0.875rem;
  height: 0.875rem;
  flex-shrink: 0;
  color: var(--ink-3);
  transition: transform 0.15s;
}

.nexcalia-app .nx-subnav-item:hover .nx-subnav-ico {
  transform: scale(1.1);
  color: var(--ink-2);
}

.nexcalia-app .nx-subnav-item.is-active .nx-subnav-ico {
  color: var(--primary);
}

.nexcalia-app .nx-subnav-label {
  flex: 1 1 0%;
}

.nexcalia-app .nx-subnav-count {
  padding: 0.125rem 0.25rem;
  border-radius: 0.25rem;
  font-size: 0.59375rem;
  font-weight: 500;
  font-variant-numeric: tabular-nums;
  color: var(--ink-3);
  min-width: 18px;
  text-align: center;
}

.nexcalia-app .nx-subnav-item:hover .nx-subnav-count {
  color: var(--ink-2);
}

/* ───────────────────── sélecteur de workspace ─────────────────────

   La card vit dans l'aside (scopée), le popover est téléporté dans <body>
   et sort donc de `.nexcalia-app` : ses règles restent non scopées, comme
   `.nx-site-popover` et `.dot-status` qui existaient déjà. */

.nexcalia-app .nx-site-switcher {
  position: relative;
  display: flex;
  align-items: center;
  gap: 0.625rem;
  margin: 0.75rem 0.625rem 0.5rem;
  padding: 0.625rem 0.75rem;
  border-radius: var(--radius);
  cursor: pointer;
  transition: all 0.2s cubic-bezier(0, 0, 0.2, 1);
}

.nexcalia-app .nx-site-switcher:hover {
  transform: translateY(-2px) scale(1.01);
}

.nexcalia-app .nx-site-avatar,
.nexcalia-app .nx-site-avatar-fallback {
  width: 1.75rem;
  height: 1.75rem;
  flex-shrink: 0;
  border-radius: var(--radius-sm);
}

.nexcalia-app .nx-site-avatar {
  object-fit: contain;
}

.nexcalia-app .nx-site-avatar-fallback {
  display: grid;
  place-items: center;
  color: var(--nx-white);
  font-size: 0.6875rem;
  font-weight: 600;
  letter-spacing: -0.025em;
}

.nexcalia-app .nx-site-text {
  display: flex;
  flex-direction: column;
  min-width: 0;
  flex: 1 1 0%;
  line-height: 1.25;
}

.nexcalia-app .nx-site-name {
  font-size: 0.78125rem;
  font-weight: 600;
  color: var(--ink);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.nexcalia-app .nx-site-meta {
  margin-top: 0.125rem;
  font-size: 0.65625rem;
  color: var(--ink-3);
}

.nexcalia-app .nx-site-chev {
  color: var(--ink-3);
  transition: transform 0.15s;
}

.nexcalia-app .nx-site-chev.is-open {
  transform: rotate(180deg);
}

/* ── popover (téléporté) ── */

.nx-site-popover {
  border-radius: 0.5rem;
  padding: 0.375rem;
}

.nx-site-search {
  position: relative;
  margin-bottom: 0.375rem;
}

.nx-site-search-ico {
  position: absolute;
  left: 0.625rem;
  top: 50%;
  transform: translateY(-50%);
  color: var(--ink-3);
  pointer-events: none;
}

.nx-site-search-input {
  width: 100%;
  padding: 0.375rem 0.5rem 0.375rem 2rem;
  border-radius: var(--radius-sm);
  font-size: 0.75rem;
  outline: none;
  transition: all 0.15s;
}

.nx-site-search-clear {
  position: absolute;
  right: 0.5rem;
  top: 50%;
  transform: translateY(-50%);
  padding: 0.125rem;
  color: var(--ink-3);
  cursor: pointer;
}

.nx-site-search-clear:hover {
  color: var(--ink);
}

.nx-site-list {
  max-height: 280px;
  overflow-y: auto;
  margin: 0 -4px;
  padding: 0 4px;
}

.nx-site-option {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  padding: 0.375rem 0.5rem;
  border-radius: var(--radius-sm);
  font-size: 0.75rem;
  color: var(--ink);
  text-decoration: none;
  transition: background-color 0.1s;
}

.nx-site-option.is-current {
  font-weight: 600;
}

.nx-site-option .dot-status {
  flex-shrink: 0;
}

.nx-site-option-avatar,
.nx-site-option-fallback {
  width: 1.5rem;
  height: 1.5rem;
  flex-shrink: 0;
  border-radius: 0.25rem;
}

.nx-site-option-avatar {
  object-fit: contain;
}

.nx-site-option-fallback {
  display: grid;
  place-items: center;
  color: var(--nx-white);
  font-size: 0.59375rem;
  font-weight: 600;
  letter-spacing: -0.025em;
}

.nx-site-option-text {
  display: flex;
  flex-direction: column;
  min-width: 0;
  flex: 1 1 0%;
  line-height: 1.25;
}

.nx-site-option-name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.nx-site-option-meta {
  font-size: 0.625rem;
  color: var(--ink-3);
}

.nx-site-option-check {
  flex-shrink: 0;
  color: var(--primary);
}

.nx-site-empty {
  padding: 1.5rem 0.75rem;
  text-align: center;
  font-size: 0.75rem;
  color: var(--ink-3);
}

.nx-site-empty-term {
  font-weight: 500;
  color: var(--ink-2);
}

.nx-site-sep {
  height: 1px;
  margin: 0.375rem 0.25rem;
}

.nx-site-link {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.375rem 0.5rem;
  border-radius: var(--radius-sm);
  font-size: 0.75rem;
  color: var(--ink-2);
  text-decoration: none;
  cursor: pointer;
}

.nx-site-link:hover {
  background: var(--hover);
}

/* Transition d'ouverture des popovers téléportés (remplace les classes
   Tailwind passées à x-transition). */
.nx-pop-enter {
  transition:
    opacity 0.15s cubic-bezier(0, 0, 0.2, 1),
    transform 0.15s cubic-bezier(0, 0, 0.2, 1);
}

.nx-pop-from {
  opacity: 0;
  transform: translateY(-0.25rem);
}

.nx-pop-to {
  opacity: 1;
  transform: translateY(0);
}

/* ───────────────────── footer utilisateur ─────────────────────

   Même découpe que le sélecteur de workspace : la pilule est dans l'aside
   (scopée), le popover-menu est téléporté dans <body> (non scopé). */

.nexcalia-app .nx-footer {
  position: relative;
  margin-top: auto;
  display: flex;
  align-items: center;
  gap: 0.625rem;
  padding: 0.75rem;
  cursor: pointer;
}

.nexcalia-app .nx-footer-avatar-wrap {
  position: relative;
}

.nexcalia-app .nx-footer-avatar {
  width: 2rem;
  height: 2rem;
  border-radius: 9999px;
  display: grid;
  place-items: center;
  color: var(--nx-white);
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: -0.025em;
}

.nx-presence-dot {
  position: absolute;
  bottom: -0.125rem;
  right: -0.125rem;
  width: 0.625rem;
  height: 0.625rem;
  border-radius: 9999px;
  background: var(--ok);
}

.nexcalia-app .nx-footer-text {
  display: flex;
  flex-direction: column;
  line-height: 1.25;
  min-width: 0;
  flex: 1 1 0%;
}

.nexcalia-app .nx-footer-name {
  font-size: 0.78125rem;
  font-weight: 600;
  color: var(--ink);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.nexcalia-app .nx-footer-meta {
  margin-top: 0.125rem;
  font-size: 0.65625rem;
  color: var(--ink-3);
}

.nexcalia-app .nx-footer-help {
  width: 1.5rem;
  height: 1.5rem;
  display: grid;
  place-items: center;
  border-radius: var(--radius-sm);
  font-size: 0.75rem;
  color: var(--ink-3);
  transition: all 0.15s;
}

.nexcalia-app .nx-footer-help:hover {
  background: var(--hover);
  color: var(--ink);
}

/* ── popover-menu (téléporté) ── */

.nx-user-menu-avatar-wrap {
  position: relative;
  flex-shrink: 0;
}

.nx-user-menu-avatar {
  width: 2.25rem;
  height: 2.25rem;
  border-radius: 9999px;
  display: grid;
  place-items: center;
  color: var(--nx-white);
  font-size: 0.8125rem;
  font-weight: 600;
  letter-spacing: -0.025em;
}

.nx-user-menu-ident {
  display: flex;
  flex-direction: column;
  line-height: 1.25;
  min-width: 0;
}

.nx-user-menu-name {
  font-size: 0.8125rem;
  font-weight: 600;
  color: var(--ink);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.nx-user-menu-email {
  font-size: 0.6875rem;
  color: var(--ink-3);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.nx-user-menu-role {
  margin-top: 0.25rem;
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  font-size: 0.625rem;
  font-weight: 500;
  color: var(--primary);
}

.nx-user-menu-role-dot {
  width: 0.375rem;
  height: 0.375rem;
  border-radius: 9999px;
  background: var(--primary);
}

.nx-user-menu-item-text {
  display: flex;
  flex-direction: column;
  min-width: 0;
  flex: 1 1 0%;
  line-height: 1.25;
  gap: 0.125rem;
}

.nx-user-menu-item-label {
  font-size: 0.78125rem;
}

.nx-user-menu-item-sub {
  font-size: 0.65625rem;
  color: var(--ink-3);
}

/* ── interrupteur jour / nuit ── */

.nexcalia-app .nx-dark-toggle {
  position: relative;
  width: 3rem;
  height: 1.5rem;
  flex-shrink: 0;
  border-radius: 9999px;
  overflow: hidden;
  transition: all 0.3s cubic-bezier(0, 0, 0.2, 1);
}

.nexcalia-app .nx-dark-stars {
  position: absolute;
  inset: 0;
  opacity: 0;
  transition: opacity 0.3s;
}

.nexcalia-app .nx-dark-stars.is-on {
  opacity: 1;
}

.nexcalia-app .nx-dark-star {
  position: absolute;
  border-radius: 9999px;
  background: var(--nx-white);
}

.nexcalia-app .nx-dark-star:nth-child(1) {
  top: 0.25rem;
  left: 0.5rem;
  width: 1px;
  height: 1px;
  box-shadow: 0 0 2px var(--nx-white);
}

.nexcalia-app .nx-dark-star:nth-child(2) {
  top: 0.75rem;
  left: 0.875rem;
  width: 0.125rem;
  height: 0.125rem;
  opacity: 0.7;
}

.nexcalia-app .nx-dark-star:nth-child(3) {
  top: 0.375rem;
  left: 1.25rem;
  width: 1px;
  height: 1px;
  opacity: 0.6;
}

.nexcalia-app .nx-dark-knob {
  position: absolute;
  top: 0.125rem;
  left: 0.125rem;
  width: 1.25rem;
  height: 1.25rem;
  border-radius: 9999px;
  display: grid;
  place-items: center;
  transition: all 0.3s cubic-bezier(0.5, 1.5, 0.5, 1);
}

.nexcalia-app .nx-dark-knob.is-on {
  left: 26px;
}

.nexcalia-app .nx-dark-glyph {
  opacity: 0;
  transition: opacity 0.2s;
}

.nexcalia-app .nx-dark-glyph.is-on {
  opacity: 1;
}

/* Les deux derniers glyphes se superposent au premier dans la même cellule
   de grille — ils étaient en `absolute` côté Tailwind. */
.nexcalia-app .nx-dark-glyph + .nx-dark-glyph {
  position: absolute;
}

/* ───────────────────────── brand ───────────────────────── */

/* Volontairement non scopées `.nexcalia-app` : le docblock du composant
   annonce un usage autonome (écran d'auth, modale « à propos »). */

.nx-brand {
  position: relative;
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0 1rem;
  height: 3.5rem;
  flex-shrink: 0;
  overflow: hidden;
}

.nx-brand-logo {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  min-width: 0;
}

.nx-brand-img {
  display: block;
  height: 30px;
  width: auto;
}

.nx-brand-name {
  font-weight: 600;
  font-size: 0.9375rem;
  letter-spacing: -0.025em;
}

.nx-brand-mark {
  margin-left: auto;
  margin-right: auto;
  flex-shrink: 0;
  width: 2.5rem;
  height: 2.5rem;
  display: grid;
  place-items: center;
  transition: transform 0.2s;
}
.nx-brand-mark:hover {
  transform: scale(1.05);
}

.nx-brand-mark-img {
  display: block;
  height: 1.5rem;
  width: auto;
}


/* ===== resource-row.css ===== */
/* ─────────────────────────────────────────────────────────────────────────
 Resource-row — enrichissements applicatifs de la coquille de liste partagée
 (poignée de tri intégrée, liseré d'accent, repli d'avatar, état atténué,
 rangée de pastilles, bloc « trailing »). Le composant Blade override vit dans
 resources/views/components/nexcalia/resource-row.blade.php. Ces classes sont
 nouvelles (absentes du package) : elles s'appliquent depuis app.css sans
 !important. À upstreamer dans nexcalia/ui (components.css) une fois validées.
 ───────────────────────────────────────────────────────────────────────── */

/* La vignette devient un contexte de positionnement pour empiler
 image + repli + poignée. Le package ne pose pas `position` → additif. */
.nexcalia-app .nx-resource-marker {
  position: relative;
}
.nexcalia-app .nx-resource-avatar-img {
  position: absolute;
  inset: 0;
  z-index: 1;
}

/* Repli affiché quand l'image d'avatar échoue (onerror la retire) : icône
 teintée ou initiales sur fond doux. */
.nexcalia-app .nx-resource-fallback {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}
.nexcalia-app .nx-resource-fallback-initials {
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--primary-soft);
  color: var(--primary-deep);
  font-weight: 600;
  font-size: 0.8125rem;
  letter-spacing: 0.01em;
}

/* Poignée de tri en overlay sur la vignette, révélée au survol de la ligne. */
.nexcalia-app .nx-resource-grip {
  position: absolute;
  inset: 0;
  z-index: 2;
  display: grid;
  place-items: center;
  border-radius: inherit;
  background: var(--surface);
  border: 1px solid var(--line);
  color: var(--ink-3);
  cursor: grab;
  opacity: 0;
  transition:
    opacity 0.15s ease-out,
    color 0.15s;
}
.nexcalia-app .nx-resource-grip:active {
  cursor: grabbing;
}
.nexcalia-app .nx-resource-row:hover .nx-resource-grip {
  opacity: 1;
}
.nexcalia-app .nx-resource-grip:hover {
  color: var(--ink);
}

/* Liseré d'accent (couleur de service) affleurant le bord gauche. Sélecteur
 volontairement spécifique (> .nx-resource-accent) pour battre la règle
 package `.nx-resource-row > * { position: relative }` chargée après app.css. */
.nexcalia-app .nx-resource-row > .nx-resource-accent {
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: 4px;
  z-index: 1;
}
.nexcalia-app .nx-resource-row.has-accent {
  padding-left: 18px;
}

/* Nom-lien : hérite de la couleur, se teinte en primaire au survol. */
.nexcalia-app .nx-resource-name-link {
  color: inherit;
  text-decoration: none;
  transition: color 0.15s;
}
.nexcalia-app .nx-resource-name-link:hover {
  color: var(--primary);
}
.nexcalia-app .nx-resource-name-suffix {
  margin-left: 6px;
  font-weight: 400;
  font-size: 0.75rem;
  color: var(--ink-3);
}

/* Rangée de pastilles sous le nom (services). */
.nexcalia-app .nx-resource-badges {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
  margin-top: 6px;
}

/* Bloc intermédiaire avant les actions (canaux + toggles des services). */
.nexcalia-app .nx-resource-trailing {
  display: flex;
  align-items: center;
  gap: 12px;
  flex-shrink: 0;
}

/* État atténué (service indisponible) : on grise vignette + contenu, restauré
 au survol pour rester consultable. Les actions restent pleinement lisibles. */
.nexcalia-app .nx-resource-row.is-dimmed .nx-resource-marker,
.nexcalia-app .nx-resource-row.is-dimmed .nx-resource-info,
.nexcalia-app .nx-resource-row.is-dimmed .nx-resource-trailing,
.nexcalia-app .nx-resource-row.is-dimmed .nx-resource-accent {
  opacity: 0.5;
  filter: grayscale(1);
  transition:
    opacity 0.2s,
    filter 0.2s;
}
.nexcalia-app .nx-resource-row.is-dimmed:hover .nx-resource-marker,
.nexcalia-app .nx-resource-row.is-dimmed:hover .nx-resource-info,
.nexcalia-app .nx-resource-row.is-dimmed:hover .nx-resource-trailing,
.nexcalia-app .nx-resource-row.is-dimmed:hover .nx-resource-accent {
  opacity: 1;
  filter: none;
}


/* ===== animations.css ===== */
/* Bibliothèque d'animations Nexcalia.

   Vivait jusqu'en v2.21 dans un <style> inline du layout `adminv3` de RdvBiz,
   alors que les vues du package l'appliquent (`.nx-anim-fadeup` sur brand et
   topbar, `.nx-stagger` / `.nx-anim-slidein` / `.nx-active-breath` sur la nav,
   `.nx-row-slide` sur les lignes cliquables, `.nx-press` un peu partout) : les
   animations étaient donc absentes de tout layout autre qu'adminv3. Remontées
   ici, elles suivent le package.

   Volontairement non scopées `.nexcalia-app` : ces classes sont posées aussi
   bien sur des éléments applicatifs que sur des overlays téléportés.

   Importé APRÈS buttons.css : à spécificité égale, `.nx-press:active` doit
   l'emporter sur `.btn:active` et remplacer son retour à translateY(0). */

@keyframes nx-fade-in-up {
  from {
    opacity: 0;
    transform: translateY(8px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes nx-slide-in-left {
  from {
    opacity: 0;
    transform: translateX(-12px);
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}

@keyframes nx-pop-in {
  0% {
    opacity: 0;
    transform: scale(0.6);
  }
  60% {
    opacity: 1;
    transform: scale(1.08);
  }
  100% {
    transform: scale(1);
  }
}

@keyframes nx-wiggle {
  0%,
  100% {
    transform: rotate(0);
  }
  15% {
    transform: rotate(-10deg);
  }
  30% {
    transform: rotate(10deg);
  }
  45% {
    transform: rotate(-7deg);
  }
  60% {
    transform: rotate(7deg);
  }
  75% {
    transform: rotate(-3deg);
  }
}

@keyframes nx-breath {
  0%,
  100% {
    box-shadow:
      0 1px 0 rgba(43, 57, 72, 0.05),
      0 1px 3px rgba(43, 57, 72, 0.06),
      inset 0 0 0 1px color-mix(in oklab, var(--primary-soft) 60%, transparent);
  }
  50% {
    box-shadow:
      0 1px 0 rgba(43, 57, 72, 0.05),
      0 4px 12px color-mix(in oklab, var(--primary) 18%, transparent),
      inset 0 0 0 1px color-mix(in oklab, var(--primary-soft) 90%, transparent);
  }
}

@keyframes nx-glow {
  0%,
  100% {
    box-shadow: 0 0 0 0 var(--primary-soft);
  }
  50% {
    box-shadow: 0 0 0 8px transparent;
  }
}

@keyframes nx-bounce-x {
  0%,
  100% {
    transform: translateX(0);
  }
  50% {
    transform: translateX(4px);
  }
}

@keyframes nx-spin-slow {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

@keyframes nx-dot-pulse {
  0%,
  100% {
    box-shadow: 0 0 0 3px var(--ok-soft);
  }
  50% {
    box-shadow: 0 0 0 8px color-mix(in oklab, var(--ok-soft) 50%, transparent);
  }
}

/* Sonnerie de cloche — secousse amortie, rejouée toutes les 4 s. */
@keyframes nx-ring {
  0% {
    transform: rotate(0);
  }
  1% {
    transform: rotate(30deg);
  }
  3% {
    transform: rotate(-28deg);
  }
  5% {
    transform: rotate(34deg);
  }
  7% {
    transform: rotate(-32deg);
  }
  9% {
    transform: rotate(30deg);
  }
  11% {
    transform: rotate(-28deg);
  }
  13% {
    transform: rotate(26deg);
  }
  15% {
    transform: rotate(-24deg);
  }
  17% {
    transform: rotate(22deg);
  }
  19% {
    transform: rotate(-20deg);
  }
  21% {
    transform: rotate(18deg);
  }
  23% {
    transform: rotate(-16deg);
  }
  25% {
    transform: rotate(14deg);
  }
  27% {
    transform: rotate(-12deg);
  }
  29% {
    transform: rotate(10deg);
  }
  31% {
    transform: rotate(-8deg);
  }
  33% {
    transform: rotate(6deg);
  }
  35% {
    transform: rotate(-4deg);
  }
  37% {
    transform: rotate(2deg);
  }
  39% {
    transform: rotate(-1deg);
  }
  41% {
    transform: rotate(1deg);
  }
  43%,
  100% {
    transform: rotate(0);
  }
}

.nx-anim-fadeup {
  animation: nx-fade-in-up 0.5s ease-out both;
}
.nx-anim-slidein {
  animation: nx-slide-in-left 0.45s ease-out both;
}
.nx-anim-popin {
  animation: nx-pop-in 0.4s cubic-bezier(0.5, 1.5, 0.5, 1) both;
}
.nx-anim-breath {
  animation: nx-breath 3s ease-in-out infinite;
}
.nx-anim-glow {
  animation: nx-glow 2s ease-in-out infinite;
}
.nx-anim-wiggle {
  animation: nx-wiggle 0.8s ease-in-out;
}
.nx-anim-bouncex {
  animation: nx-bounce-x 1.5s ease-in-out infinite;
}

/* Décale l'entrée des enfants directs — la nav de la sidebar s'en sert pour
   faire tomber ses items en cascade. */
.nx-stagger > *:nth-child(1) {
  animation-delay: 0.05s;
}
.nx-stagger > *:nth-child(2) {
  animation-delay: 0.1s;
}
.nx-stagger > *:nth-child(3) {
  animation-delay: 0.15s;
}
.nx-stagger > *:nth-child(4) {
  animation-delay: 0.2s;
}
.nx-stagger > *:nth-child(5) {
  animation-delay: 0.25s;
}
.nx-stagger > *:nth-child(6) {
  animation-delay: 0.3s;
}
.nx-stagger > *:nth-child(7) {
  animation-delay: 0.35s;
}
.nx-stagger > *:nth-child(8) {
  animation-delay: 0.4s;
}
.nx-stagger > *:nth-child(9) {
  animation-delay: 0.45s;
}
.nx-stagger > *:nth-child(10) {
  animation-delay: 0.5s;
}

.nx-lift {
  transition:
    transform 0.2s ease-out,
    box-shadow 0.2s ease-out;
}
.nx-lift:hover {
  transform: translateY(-2px);
  box-shadow:
    0 8px 24px rgba(43, 57, 72, 0.1),
    0 2px 4px rgba(43, 57, 72, 0.06);
}

.nx-row-slide td > * {
  transition: transform 0.15s ease-out;
}
.nx-row-slide td {
  transition: background-color 0.15s ease-out;
}
.nx-row-slide:hover td > * {
  transform: translateX(4px);
}

.nx-active-breath {
  animation: nx-breath 3.5s ease-in-out infinite;
}

.nx-dot-pulse {
  animation: nx-dot-pulse 2s ease-in-out infinite;
}

.nx-bell {
  display: inline-block;
  transform-origin: 50% 0;
}
.nx-bell:hover {
  animation: nx-wiggle 0.7s ease-in-out;
}
.nx-bell-ring {
  transform-origin: 50% 4px;
  animation: nx-ring 4s 0.7s ease-in-out infinite;
}

.nx-press {
  transition: transform 0.1s ease-out;
}
.nx-press:active {
  transform: scale(0.95);
}

.nx-search:focus-within {
  box-shadow:
    0 0 0 3px var(--primary-soft),
    0 1px 2px rgba(43, 57, 72, 0.06);
  border-color: var(--primary-soft) !important;
}

@media (prefers-reduced-motion: reduce) {
  .nx-press {
    transition: none;
  }
  .nx-press:active {
    transform: none;
  }
}


/* `.nexcalia-app` is a pure CSS scope — it gates every Nexcalia component
   (.nx-checkbox, .nx-select, .nx-toggle, .icon-btn, .btn, .nx-tooltip, …) so
   the library doesn't leak onto pages that don't use it. Hosts can drop it
   high (e.g. on <body>) to make every teleported modal / toast / slide-over
   pick up the design system for free.

   The shell grid (sidebar + main, 100vh, overflow:clip) was historically
   bolted onto this same class — which meant scoping the components forced
   the host into the shell layout. We now move the structural rules to a
   dedicated `.nexcalia-shell` class. `<x-nexcalia.shell>` applies both
   classes on the same div so existing callers keep their behaviour. */
.nexcalia-shell {
  display: grid;
  grid-template-columns: var(--sidebar-w, 248px) 1fr;
  height: 100vh;
  overflow: clip;
  transition: grid-template-columns 0.3s cubic-bezier(0.5, 0.2, 0.2, 1);
}

.nexcalia-app .main {
  overflow: clip;
}

.nexcalia-app .sidebar {
  background: var(--surface-2);
  border-right: 1px solid var(--line);
  display: flex;
  flex-direction: column;
  min-height: 0;
}
.nexcalia-app .sb-brand {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 18px 16px 14px;
  border-bottom: 1px solid var(--line);
}
.nexcalia-app .sb-brand .name {
  font-weight: 600;
  font-size: 1rem;
  letter-spacing: -0.01em;
}
.nexcalia-app .sb-brand .sub {
  font-size: 0.6875rem;
  color: var(--ink-3);
  margin-left: auto;
  letter-spacing: 0.06em;
  text-transform: uppercase;
}

.nexcalia-app .site-switcher {
  margin: 12px 12px 8px;
  padding: 12px 14px;
  border: 1px solid transparent;
  border-radius: var(--radius);
  background: var(--surface);
  display: flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  position: relative;
  box-shadow: 0 1px 2px rgba(43, 57, 72, 0.05);
}
.nexcalia-app .site-switcher:hover {
  box-shadow: 0 2px 6px rgba(43, 57, 72, 0.08);
}
.nexcalia-app .site-switcher .dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--primary);
}
.nexcalia-app .site-switcher .col {
  display: flex;
  flex-direction: column;
  min-width: 0;
  flex: 1;
}
.nexcalia-app .site-switcher .a {
  font-size: 0.875rem;
  font-weight: 600;
  color: var(--ink);
}
.nexcalia-app .site-switcher .b {
  font-size: 0.75rem;
  color: var(--ink-3);
  letter-spacing: 0.02em;
}

.nexcalia-app .site-popover {
  position: absolute;
  top: calc(100% + 4px);
  left: 0;
  right: 0;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow-md);
  padding: 4px;
  z-index: 50;
}
.nexcalia-app .site-popover .item {
  padding: 6px 8px;
  display: flex;
  align-items: center;
  gap: 8px;
  border-radius: var(--radius-sm);
  font-size: 0.75rem;
  cursor: pointer;
}
.nexcalia-app .site-popover .item:hover {
  background: var(--hover);
}
.nexcalia-app .site-popover .item .meta {
  margin-left: auto;
  font-size: 0.75rem;
  color: var(--ink-3);
}
.nexcalia-app .site-popover .sep {
  height: 1px;
  background: var(--line);
  margin: 4px 0;
}

.nexcalia-app .sb-section {
  font-size: 0.6875rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-3);
  padding: 18px 18px 8px;
  font-weight: 600;
}
.nexcalia-app .sb-nav {
  display: flex;
  flex-direction: column;
  padding: 0 10px;
}
.nexcalia-app .sb-nav .item {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 10px 12px;
  font-size: 0.9375rem;
  color: var(--ink-2);
  border-radius: var(--radius-sm);
  cursor: pointer;
  position: relative;
  text-decoration: none;
}
.nexcalia-app .sb-nav .item:hover {
  background: var(--hover);
  color: var(--ink);
}
.nexcalia-app .sb-nav .item.active {
  background: var(--surface);
  color: var(--ink);
  font-weight: 600;
  box-shadow: 0 1px 2px rgba(43, 57, 72, 0.06);
}
.nexcalia-app .sb-nav .item.active .ico {
  color: var(--primary);
}
.nexcalia-app .sb-nav .item .ico {
  width: 18px;
  height: 18px;
  color: var(--ink-3);
  flex-shrink: 0;
}
.nexcalia-app .sb-nav .item .count {
  margin-left: auto;
  font-size: 0.75rem;
  color: var(--ink-3);
  font-variant-numeric: tabular-nums;
  background: var(--bg-2);
  padding: 2px 8px;
  border-radius: 999px;
}
.nexcalia-app .sb-nav .item.active .count {
  background: var(--surface-2);
  color: var(--ink-2);
}
.nexcalia-app .sb-nav .item .dot-live {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--ok);
  box-shadow: 0 0 0 3px var(--ok-soft);
  margin-left: auto;
}

.nexcalia-app .sb-foot {
  margin-top: auto;
  padding: 14px;
  border-top: 1px solid var(--line);
  display: flex;
  align-items: center;
  gap: 8px;
}
.nexcalia-app .sb-foot .avatar {
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--primary), var(--primary-deep));
  color: white;
  display: grid;
  place-items: center;
  font-size: 0.8125rem;
  font-weight: 600;
  letter-spacing: -0.02em;
}
.nexcalia-app .sb-foot .who {
  display: flex;
  flex-direction: column;
  line-height: 1.2;
  min-width: 0;
}
.nexcalia-app .sb-foot .who .a {
  font-size: 0.875rem;
  font-weight: 600;
}
.nexcalia-app .sb-foot .who .b {
  font-size: 0.75rem;
  color: var(--ink-3);
}
.nexcalia-app .sb-foot .help {
  margin-left: auto;
  color: var(--ink-3);
  font-size: 0.6875rem;
  padding: 4px 6px;
  border-radius: 6px;
  cursor: pointer;
}
.nexcalia-app .sb-foot .help:hover {
  background: var(--hover);
  color: var(--ink);
}

.nexcalia-app .main {
  display: flex;
  flex-direction: column;
  min-width: 0;
  min-height: 0;
}
.nexcalia-app .topbar {
  height: 3.5rem;
  border-bottom: 1px solid var(--line);
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 0 16px;
  background: var(--surface);
  flex-shrink: 0;
}
.nexcalia-app .crumb {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 0.75rem;
  color: var(--ink-2);
}
.nexcalia-app .crumb .sep {
  color: var(--ink-3);
}
.nexcalia-app .crumb .cur {
  color: var(--ink);
  font-weight: 600;
}

.nexcalia-app .search {
  appearance: none;
  margin-left: auto;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 4px 10px;
  border: 1px solid var(--line);
  background: var(--bg);
  border-radius: var(--radius);
  width: 320px;
  font-size: 0.8125rem;
  color: var(--ink-3);
  text-align: left;
  cursor: pointer;
  font-family: inherit;
  transition:
    border-color 0.15s,
    box-shadow 0.15s;
}
.nexcalia-app .search:hover {
  border-color: color-mix(in oklab, var(--primary) 25%, var(--line));
}
.nexcalia-app .search .kbd {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 0.625rem;
  padding: 1px 5px;
  border: 1px solid var(--line);
  border-radius: 4px;
  background: var(--surface);
}
.nexcalia-app .tb-actions {
  display: flex;
  align-items: center;
  gap: 6px;
}

.nexcalia-app .icon-btn {
  appearance: none;
  width: 34px;
  height: 34px;
  border: 1px solid var(--line);
  background: var(--surface);
  border-radius: var(--radius-sm);
  color: var(--ink-2);
  display: grid;
  place-items: center;
  cursor: pointer;
  position: relative;

  transition:
    background-color 0.15s,
    color 0.15s,
    transform 0.18s ease-out,
    box-shadow 0.18s ease-out;
  box-shadow: 0 1px 0 rgba(43, 57, 72, 0.04);
}
.nexcalia-app .icon-btn:hover {
  background: var(--hover);
  color: var(--ink);
  transform: translateY(-1px);
  box-shadow:
    0 1px 0 rgba(43, 57, 72, 0.04),
    0 4px 12px rgba(43, 57, 72, 0.1);
}
.nexcalia-app .icon-btn:active {
  transform: translateY(0);
  transition-duration: 0.08s;
}
.nexcalia-app .icon-btn .badge {
  position: absolute;
  top: -5px;
  right: -5px;
  background: var(--danger);
  color: white;
  font-size: 0.5625rem;
  font-weight: 700;
  line-height: 1;
  letter-spacing: -0.02em;
  min-width: 16px;
  padding: 3px 5px;
  border-radius: 999px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.22);
  font-variant-numeric: tabular-nums;

  max-width: 28px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  line-height: 1;
}

.nexcalia-app .icon-btn .badge.badge-dot {
  min-width: 8px;
  width: 8px;
  height: 8px;
  padding: 0;
  top: -2px;
  right: -2px;
  background: var(--primary);
  border-width: 1.5px;
}

/* Pulsing badge — used by <x-nexcalia.icon-button pulse> when the counter
   needs to grab the user's attention (queue length, items waiting approval, …).
   The badge itself is unchanged; we layer a soft ::before halo that scales
   out and fades. pointer-events:none keeps the click target intact. */
@keyframes nx-badge-ping {
  0% {
    transform: scale(1);
    opacity: 0.6;
  }
  75%,
  100% {
    transform: scale(2.2);
    opacity: 0;
  }
}
.nexcalia-app .icon-btn .badge.badge-pulse::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: inherit;
  pointer-events: none;
  z-index: -1;
  animation: nx-badge-ping 1.5s cubic-bezier(0, 0, 0.2, 1) infinite;
}
@media (prefers-reduced-motion: reduce) {
  .nexcalia-app .icon-btn .badge.badge-pulse::before {
    animation: none;
  }
}

/* Primary tone — CTA variant used by <x-nexcalia.icon-button tone="primary">.
   Keeps the same 34px box as the neutral variant so an icon-button row stays
   aligned, only the fill changes (primary surface + inverse foreground). */
.nexcalia-app .icon-btn.primary {
  background: var(--primary);
  border-color: var(--primary);
  color: var(--surface);
}
.nexcalia-app .icon-btn.primary:hover {
  background: var(--primary-deep);
  border-color: var(--primary-deep);
  color: var(--surface);
}
.nexcalia-app .icon-btn.primary:focus-visible {
  background: var(--primary);
  border-color: var(--primary);
  color: var(--surface);
}

/* extracted to parts/buttons.css */

.nexcalia-app .content {
  flex: 1;
  overflow: auto;
  min-height: 0;
}

/* extracted to parts/pills.css, parts/cards.css, parts/kpi.css */
.nexcalia-app .tbl {
  width: 100%;
  border-collapse: separate;
  border-spacing: 0;
  font-size: var(--fs-body);
}
.nexcalia-app .tbl thead th {
  text-align: left;
  font-weight: 500;
  font-size: var(--fs-xs);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--ink-3);
  padding: 6px var(--pad-x);
  background: var(--surface-2);
  border-bottom: 1px solid var(--line);
  position: sticky;
  top: 0;
  z-index: 1;
}
.nexcalia-app .tbl tbody td {
  padding: var(--pad-y) var(--pad-x);
  border-bottom: 1px solid var(--line);
  height: var(--row-h);
  vertical-align: middle;
}
.nexcalia-app .tbl tbody tr:hover td {
  background: var(--hover);
  cursor: pointer;
}
.nexcalia-app .tbl tbody tr.selected td {
  background: var(--primary-tint);
}
.nexcalia-app .tbl .num {
  font-variant-numeric: tabular-nums;
  text-align: right;
}
.nexcalia-app .tbl .muted {
  color: var(--ink-3);
}
.nexcalia-app .tbl .mono {
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
}

.nexcalia-app .avatar-sm {
  width: 22px;
  height: 22px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  font-size: 0.625rem;
  font-weight: 600;
  color: white;
  flex-shrink: 0;
}

.nexcalia-app .nx-avatar {
  border-radius: 50%;
  display: grid;
  place-items: center;
  font-weight: 600;
  letter-spacing: -0.01em;
  color: white;
  flex-shrink: 0;
  font-family: "Inter Tight", sans-serif;
}
.nexcalia-app .cust-cell {
  display: flex;
  align-items: center;
  gap: 8px;
}
.nexcalia-app .cust-cell .name {
  font-weight: 500;
}
.nexcalia-app .cust-cell .id {
  font-family: var(--font-mono);
  font-size: 0.625rem;
  color: var(--ink-3);
}

.nexcalia-app .scrim {
  position: fixed;
  inset: 0;
  z-index: 100;
  display: flex;
  justify-content: flex-end;
  background:
    radial-gradient(
      120% 80% at 50% 30%,
      color-mix(in oklab, var(--primary) 12%, transparent),
      transparent 55%
    ),
    radial-gradient(
      140% 100% at 50% 50%,
      rgba(11, 16, 32, 0.18),
      rgba(11, 16, 32, 0.55) 75%
    );
  backdrop-filter: blur(10px) saturate(160%);
  -webkit-backdrop-filter: blur(10px) saturate(160%);
  animation: nexcalia-fade 220ms ease-out;
}
[data-palette="dark"] .nexcalia-app .scrim {
  background:
    radial-gradient(
      120% 80% at 50% 30%,
      color-mix(in oklab, var(--primary) 18%, transparent),
      transparent 55%
    ),
    radial-gradient(
      140% 100% at 50% 50%,
      rgba(0, 0, 0, 0.35),
      rgba(0, 0, 0, 0.75) 75%
    );
}
@keyframes nexcalia-fade {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}
.nexcalia-app .panel {
  width: 520px;
  background: var(--surface);
  border-left: 1px solid var(--line);
  height: 100%;
  display: flex;
  flex-direction: column;
  box-shadow:
    0 24px 60px rgba(0, 0, 0, 0.18),
    0 4px 12px rgba(0, 0, 0, 0.08),
    inset 1px 0 0 rgba(255, 255, 255, 0.7);
  animation: nexcalia-slide 280ms cubic-bezier(0.2, 0.8, 0.2, 1);
  position: relative;
}
.nexcalia-app .panel::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  width: 1px;
  background: linear-gradient(
    180deg,
    transparent,
    rgba(255, 255, 255, 0.9) 30%,
    rgba(255, 255, 255, 0.9) 70%,
    transparent
  );
  pointer-events: none;
  z-index: 2;
}
[data-palette="dark"] .nexcalia-app .panel {
  box-shadow:
    0 24px 60px rgba(0, 0, 0, 0.55),
    0 6px 18px rgba(0, 0, 0, 0.4),
    inset 1px 0 0 rgba(255, 255, 255, 0.06);
}
[data-palette="dark"] .nexcalia-app .panel::before {
  background: linear-gradient(
    180deg,
    transparent,
    rgba(255, 255, 255, 0.18) 30%,
    rgba(255, 255, 255, 0.18) 70%,
    transparent
  );
}
@keyframes nexcalia-slide {
  from {
    transform: translateX(20px);
    opacity: 0;
  }
  to {
    transform: translateX(0);
    opacity: 1;
  }
}
.nexcalia-app .panel-hd {
  padding: 14px 18px;
  border-bottom: 1px solid var(--line);
  display: flex;
  align-items: center;
  gap: 10px;
}
.nexcalia-app .panel-hd .title {
  font-size: 0.9375rem;
  font-weight: 600;
}
.nexcalia-app .panel-hd .x {
  margin-left: auto;
}
.nexcalia-app .panel-body {
  flex: 1;
  overflow: auto;
  padding: 18px;
  display: flex;
  flex-direction: column;
  gap: 18px;
}
.nexcalia-app .panel-foot {
  border-top: 1px solid var(--line);
  padding: 12px 18px;
  display: flex;
  gap: 8px;
  align-items: center;
}

.wep-slide-over-backdrop {
  background:
    radial-gradient(
      120% 80% at 50% 30%,
      color-mix(in oklab, var(--primary) 12%, transparent),
      transparent 55%
    ),
    radial-gradient(
      140% 100% at 50% 50%,
      rgba(11, 16, 32, 0.18),
      rgba(11, 16, 32, 0.55) 75%
    ) !important;
  backdrop-filter: blur(10px) saturate(160%) !important;
  -webkit-backdrop-filter: blur(10px) saturate(160%) !important;
}
[data-palette="dark"] .wep-slide-over-backdrop {
  background:
    radial-gradient(
      120% 80% at 50% 30%,
      color-mix(in oklab, var(--primary) 18%, transparent),
      transparent 55%
    ),
    radial-gradient(
      140% 100% at 50% 50%,
      rgba(0, 0, 0, 0.35),
      rgba(0, 0, 0, 0.75) 75%
    ) !important;
}
.wep-slide-over-container-inner-content {
  background: var(--surface) !important;
  color: var(--ink);
  font-family: var(--font-sans);
  padding-top: 0 !important;
  padding-bottom: 0 !important;
  overflow-y: auto !important;
  box-shadow:
    0 24px 60px rgba(0, 0, 0, 0.18),
    0 4px 12px rgba(0, 0, 0, 0.08),
    inset 1px 0 0 rgba(255, 255, 255, 0.7) !important;
  position: relative;
}
.wep-slide-over-container-inner-content::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  width: 1px;
  background: linear-gradient(
    180deg,
    transparent,
    rgba(255, 255, 255, 0.9) 30%,
    rgba(255, 255, 255, 0.9) 70%,
    transparent
  );
  pointer-events: none;
  z-index: 2;
}
[data-palette="dark"] .wep-slide-over-container-inner-content {
  background: color-mix(in oklab, var(--surface) 92%, white) !important;
  box-shadow:
    0 24px 60px rgba(0, 0, 0, 0.55),
    0 6px 18px rgba(0, 0, 0, 0.4),
    inset 1px 0 0 rgba(255, 255, 255, 0.06) !important;
}
[data-palette="dark"] .wep-slide-over-container-inner-content::before {
  background: linear-gradient(
    180deg,
    transparent,
    rgba(255, 255, 255, 0.18) 30%,
    rgba(255, 255, 255, 0.18) 70%,
    transparent
  );
}

.nx-slideover {
  display: flex;
  flex-direction: column;
  height: 100%;
  color: var(--ink);
}
.nx-slideover-hd {
  padding: 14px 18px;
  border-bottom: 1px solid var(--line);
  display: flex;
  align-items: center;
  gap: 10px;
  background: var(--surface);
  flex-shrink: 0;
}
.nx-slideover-title {
  font-size: 0.9375rem;
  font-weight: 600;
  color: var(--ink);
}
.nx-slideover-close {
  margin-left: auto !important;
}
.nx-slideover-body {
  flex: 1;
  overflow-y: auto;
  padding: 18px;
  display: flex;
  flex-direction: column;
  gap: 18px;
}
.nx-slideover-foot {
  border-top: 1px solid var(--line);
  padding: 12px 18px;
  display: flex;
  gap: 8px;
  align-items: center;
  background: var(--surface);
  flex-shrink: 0;
}
.nx-slideover-foot-spacer {
  flex: 1;
}

.nx-slideover .btn {
  appearance: none;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 38px;
  padding: 0 16px;
  border: 1px solid var(--line);
  background: var(--surface);
  color: var(--ink);
  border-radius: var(--radius-sm);
  font-size: 0.8125rem;
  font-weight: 500;
  cursor: pointer;
  transition:
    background-color 0.15s,
    transform 0.1s,
    box-shadow 0.15s;
  font-family: inherit;
  line-height: 1;
  white-space: nowrap;
}
.nx-slideover .btn:hover {
  background: var(--hover);
  transform: translateY(-1px);
  box-shadow:
    0 1px 0 rgba(43, 57, 72, 0.04),
    0 4px 12px rgba(43, 57, 72, 0.1);
}
.nx-slideover .btn:active {
  transform: scale(0.97);
}
.nx-slideover .btn.ghost {
  border-color: transparent;
  background: transparent;
}
.nx-slideover .btn.ghost:hover {
  background: var(--hover);
}
.nx-slideover .btn.primary,
.nx-slideover .btn.accent {
  background: var(--primary);
  border-color: var(--primary);
  color: white;
  box-shadow:
    0 1px 0 rgba(0, 0, 0, 0.06),
    inset 0 1px 0 rgba(255, 255, 255, 0.18);
}
.nx-slideover .btn.primary:hover,
.nx-slideover .btn.accent:hover {
  background: var(--primary-deep);
  border-color: var(--primary-deep);
}

.nx-slideover .icon-btn {
  appearance: none;
  width: 30px;
  height: 30px;
  display: inline-grid;
  place-items: center;
  border: 1px solid var(--line);
  background: var(--surface);
  color: var(--ink-2);
  border-radius: var(--radius-sm);
  cursor: pointer;
  transition:
    background-color 0.15s,
    color 0.15s,
    transform 0.1s,
    border-color 0.15s;
  position: relative;
}
.nx-slideover .icon-btn:hover {
  background: var(--hover);
  color: var(--ink);
  transform: translateY(-1px);
}

.nx-slideover .field {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.nx-slideover .field .lbl {
  font-size: 0.625rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-3);
  font-weight: 600;
}
.nx-slideover .field .val {
  font-size: 0.8125rem;
  color: var(--ink);
}
.nx-slideover .grid-2 {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
}

.nx-slideover .card {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
}

.nx-slideover .pill {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 2px 8px;
  border-radius: 999px;
  font-size: 0.6875rem;
  font-weight: 500;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  border: 1px solid transparent;
}
.nx-slideover .pill .d {
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: currentColor;
}
.nx-slideover .pill.ok {
  background: var(--ok-soft);
  color: var(--ok-deep);
}
.nx-slideover .pill.warn {
  background: var(--warn-soft);
  color: var(--warn);
}
.nx-slideover .pill.info {
  background: var(--info-soft);
  color: var(--info);
}
.nx-slideover .pill.danger {
  background: var(--danger-soft);
  color: var(--danger);
}
.nx-slideover .pill.neutral {
  background: var(--neutral-soft);
  color: var(--ink-2);
}
.nx-slideover .pill.accent {
  background: var(--primary-soft);
  color: var(--primary-deep);
}
.nx-slideover .pill.outline {
  background: var(--neutral-soft);
  border-color: transparent;
  color: var(--ink-2);
}

.nx-slideover .avatar-sm {
  border-radius: 50%;
  display: grid;
  place-items: center;
  font-weight: 600;
  color: white;
  flex-shrink: 0;
}

.nx-slideover .timeline {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding-left: 4px;
}
.nx-slideover .timeline .ev {
  display: grid;
  grid-template-columns: 60px 18px 1fr;
  gap: 8px;
  align-items: start;
  font-size: 0.75rem;
}
.nx-slideover .timeline .t {
  color: var(--ink-3);
  font-size: 0.625rem;
  font-family: var(--font-mono);
  padding-top: 2px;
}
.nx-slideover .timeline .marker {
  position: relative;
  display: grid;
  place-items: center;
  padding-top: 4px;
}
.nx-slideover .timeline .marker::before {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: 50%;
  width: 1px;
  background: var(--line);
  transform: translateX(-50%);
}
.nx-slideover .timeline .ev:last-child .marker::before {
  display: none;
}
.nx-slideover .timeline .dot {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--ink-3);
  border: 2px solid var(--surface);
  box-shadow: 0 0 0 1px var(--line);
  position: relative;
  z-index: 1;
}
.nx-slideover .timeline .ev.done .dot {
  background: var(--ok);
  box-shadow: 0 0 0 1px var(--ok);
}
.nx-slideover .timeline .ev.now .dot {
  background: var(--primary);
  box-shadow:
    0 0 0 1px var(--primary),
    0 0 0 4px var(--primary-soft);
}
.nx-slideover .timeline .body .a {
  font-weight: 500;
  color: var(--ink);
}
.nx-slideover .timeline .body .b {
  font-size: 0.625rem;
  color: var(--ink-3);
  margin-top: 1px;
}

.nexcalia-app .field {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.nexcalia-app .field .lbl {
  font-size: 0.625rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-3);
  font-weight: 600;
}
.nexcalia-app .field .val {
  font-size: 0.8125rem;
  color: var(--ink);
}
.nexcalia-app .field .input {
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  background: var(--surface);
  padding: 6px 10px;
  font-size: 0.9375rem;
  height: 30px;
}
.nexcalia-app .grid-2 {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
}
.nexcalia-app .grid-3 {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 10px;
}

.nexcalia-app .timeline {
  display: flex;
  flex-direction: column;
  gap: 0;
}
.nexcalia-app .timeline .ev {
  display: grid;
  grid-template-columns: 60px 16px 1fr;
  gap: 10px;
  padding: 6px 0;
  font-size: 0.75rem;
  position: relative;
}
.nexcalia-app .timeline .ev .t {
  color: var(--ink-3);
  font-variant-numeric: tabular-nums;
  font-size: 0.6875rem;
  padding-top: 2px;
}
.nexcalia-app .timeline .ev .marker {
  display: flex;
  align-items: flex-start;
  justify-content: center;
  position: relative;
}
.nexcalia-app .timeline .ev .marker::before {
  content: "";
  position: absolute;
  top: 14px;
  bottom: -8px;
  left: 50%;
  width: 1px;
  background: var(--line);
  transform: translateX(-0.5px);
}
.nexcalia-app .timeline .ev:last-child .marker::before {
  display: none;
}
.nexcalia-app .timeline .ev .dot {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--surface);
  border: 1.5px solid var(--ink-3);
  margin-top: 4px;
  position: relative;
  z-index: 1;
}
.nexcalia-app .timeline .ev.done .dot {
  background: var(--ok);
  border-color: var(--ok);
}
.nexcalia-app .timeline .ev.now .dot {
  background: var(--primary);
  border-color: var(--primary);
  box-shadow: 0 0 0 3px var(--primary-soft);
}
.nexcalia-app .timeline .ev .body .a {
  color: var(--ink);
}
.nexcalia-app .timeline .ev .body .b {
  color: var(--ink-3);
  font-size: 0.6875rem;
  margin-top: 1px;
}

.nx-feed {
  display: flex;
  flex-direction: column;
  gap: 0;
}
.nx-feed-item {
  position: relative;
  display: grid;
  grid-template-columns: 40px 1fr;
  gap: 14px;
  padding-bottom: 22px;
  transition: transform 0.2s ease-out;
}
.nx-feed-item:last-child {
  padding-bottom: 0;
}

.nx-feed-item::before {
  content: "";
  position: absolute;
  left: 19.5px;
  top: 40px;
  bottom: 2px;
  width: 2px;
  background: linear-gradient(
    180deg,
    color-mix(in oklab, var(--line) 80%, transparent) 0%,
    var(--line) 30%,
    var(--line) 70%,
    color-mix(in oklab, var(--line) 80%, transparent) 100%
  );
  pointer-events: none;
  border-radius: 2px;
}
.nx-feed-item:last-child::before {
  display: none;
}

.nx-feed-marker {
  position: relative;
  z-index: 1;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  color: white;
  flex-shrink: 0;
  background: color-mix(in oklab, var(--ink-3) 55%, var(--surface));
  box-shadow: 0 0 0 4px var(--surface);
  transition:
    transform 0.2s ease-out,
    box-shadow 0.2s ease-out;
}
.nx-feed-item:hover .nx-feed-marker {
  transform: scale(1.06);
  box-shadow:
    0 0 0 4px var(--surface),
    0 2px 8px rgba(43, 57, 72, 0.12);
}

.nx-feed-marker.tone-neutral {
  background: color-mix(in oklab, var(--ink-3) 55%, var(--surface));
}
.nx-feed-marker.tone-ok {
  background: var(--ok);
}
.nx-feed-marker.tone-info {
  background: var(--info);
}
.nx-feed-marker.tone-warn {
  background: var(--warn);
}
.nx-feed-marker.tone-danger {
  background: var(--danger);
}
.nx-feed-marker.tone-accent {
  background: var(--primary);
}

.nx-feed-marker svg {
  position: relative;
  z-index: 1;
}

.nx-feed-marker.has-avatar {
  background: transparent;
}
.nx-feed-avatar-img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: 50%;
  position: relative;
  z-index: 1;
}
.nx-feed-marker .avatar-sm {
  box-shadow: none;
}

.nx-feed-content {
  min-width: 0;
  padding-top: 10px;
  display: flex;
  flex-direction: column;
  gap: 3px;
}
.nx-feed-title-row {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}
.nx-feed-title {
  font-size: 0.84375rem;
  color: var(--ink);
  line-height: 1.35;
  font-weight: 500;
  letter-spacing: -0.005em;
}
.nx-feed-count {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 26px;
  height: 18px;
  padding: 0 7px;
  border-radius: 999px;
  background: var(--surface-2);
  color: var(--ink-3);
  font-size: 0.65625rem;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  line-height: 1;
}
.nx-feed-subtitle {
  font-size: 0.71875rem;
  color: var(--ink-3);
  line-height: 1.35;
  font-variant-numeric: tabular-nums;
}
.nx-feed-body {
  margin-top: 12px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.nx-feed-action {
  position: absolute;
  bottom: -2px;
  left: -2px;
  z-index: 2;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  background: var(--surface);
  color: var(--ink-2);
  box-shadow: 0 0 0 1.5px var(--surface);
}
.nx-feed-action.tone-neutral {
  background: var(--surface);
  color: var(--ink-2);
  box-shadow:
    0 0 0 1.5px var(--surface),
    inset 0 0 0 1px var(--line-2);
}
.nx-feed-action.tone-ok {
  background: var(--nx-puertorico);
  color: white;
}
.nx-feed-action.tone-info {
  background: var(--info);
  color: white;
}
.nx-feed-action.tone-warn {
  background: var(--warn);
  color: white;
}
.nx-feed-action.tone-danger {
  background: var(--nx-tall-poppy);
  color: white;
}
.nx-feed-action.tone-accent {
  background: var(--primary);
  color: white;
}

.nx-feed-change {
  position: relative;
  overflow: hidden;
  display: grid;
  grid-template-columns: 130px 1fr;
  align-items: center;
  gap: 14px;
  padding: 10px 14px;
  background: color-mix(in oklab, var(--surface-2) 70%, var(--surface));
  border: 1px solid color-mix(in oklab, var(--line) 60%, transparent);
  border-radius: var(--radius-sm);
  font-size: 0.78125rem;
  transition:
    border-color 0.15s,
    background-color 0.15s,
    box-shadow 0.15s;
}
.nx-feed-change::before {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(
    320px 180px at calc(var(--nx-mx, 50) * 1%) 25%,
    color-mix(in oklab, var(--primary) 14%, transparent),
    transparent 70%
  );
  opacity: 0;
  transition: opacity 0.25s ease-out;
  pointer-events: none;
}
.nx-feed-change:hover::before {
  opacity: 1;
}

.nx-feed-change:has(.nx-feed-change-from:hover)::before,
.nx-feed-change:has(.nx-feed-change-to:hover)::before {
  opacity: 0;
}
.nx-feed-change > * {
  position: relative;
}
.nx-feed-change:hover {
  background: var(--surface-2);
  border-color: color-mix(in oklab, var(--primary) 30%, var(--line));
  box-shadow:
    0 1px 0 rgba(43, 57, 72, 0.04),
    0 4px 10px rgba(43, 57, 72, 0.06);
}
.nx-feed-change-field {
  font-weight: 600;
  color: var(--ink);
  font-size: 0.71875rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}
.nx-feed-change-value {
  text-align: center;
  color: var(--ink);
  font-size: 0.8125rem;
  font-weight: 500;
  padding: 2px 8px;
}
.nx-feed-change-row {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: 10px;
  min-width: 0;
}
.nx-feed-change-from {
  color: color-mix(in oklab, var(--nx-tall-poppy) 65%, var(--ink-2));

  background: color-mix(in oklab, var(--nx-tall-poppy) 12%, var(--surface));
  padding: 3px 10px;
  border-radius: 4px;
  text-decoration: line-through;
  text-decoration-thickness: 1px;
  text-decoration-color: color-mix(
    in oklab,
    var(--nx-tall-poppy) 50%,
    transparent
  );
  font-size: 0.75rem;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  text-align: center;
}
.nx-feed-change-to {
  color: color-mix(in oklab, var(--nx-puertorico) 80%, var(--ink));

  background: color-mix(in oklab, var(--nx-puertorico) 18%, var(--surface));
  padding: 3px 10px;
  border-radius: 4px;
  font-weight: 500;
  font-size: 0.75rem;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  text-align: center;
}

.nx-feed-change-arrow {
  width: 22px;
  height: 22px;
  border-radius: 50%;
  border: 1px solid var(--line);
  display: inline-grid;
  place-items: center;
  color: var(--ink-3);
  background: var(--surface);
  flex-shrink: 0;
}

[data-palette="dark"] .nx-feed-marker {
  box-shadow:
    0 0 0 4px var(--surface),
    0 2px 6px rgba(0, 0, 0, 0.4),
    inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
[data-palette="dark"] .nx-feed-item:hover .nx-feed-marker {
  box-shadow:
    0 0 0 4px var(--surface),
    0 4px 12px rgba(0, 0, 0, 0.55),
    inset 0 1px 0 rgba(255, 255, 255, 0.14);
}

.nexcalia-app .cal-toolbar {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 24px;
  border-bottom: 1px solid var(--line);
  background: var(--surface);
}
.nexcalia-app .seg {
  display: flex;
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  overflow: hidden;
  background: var(--surface);
}
.nexcalia-app .seg .opt {
  padding: 4px 10px;
  font-size: 0.75rem;
  color: var(--ink-2);
  border-right: 1px solid var(--line);
  cursor: pointer;
  font-weight: 500;
}
.nexcalia-app .seg .opt:last-child {
  border-right: 0;
}
.nexcalia-app .seg .opt.active {
  background: var(--ink);
  color: var(--surface);
}
.nexcalia-app .seg .opt:not(.active):hover {
  background: var(--hover);
}

.nexcalia-app .cal-week {
  display: grid;
  grid-template-columns: 56px repeat(7, 1fr);
  background: var(--surface);
  flex: 1;
  min-height: 0;
}
.nexcalia-app .cal-week .corner,
.nexcalia-app .cal-week .day-hd {
  border-bottom: 1px solid var(--line);
  border-right: 1px solid var(--line);
  padding: 12px 14px;
  font-size: 0.6875rem;
  color: var(--ink-3);
  background: var(--surface-2);
  position: sticky;
  top: 0;
  z-index: 2;
}
.nexcalia-app .cal-week .day-hd {
  display: flex;
  align-items: baseline;
  gap: 6px;
}
.nexcalia-app .cal-week .day-hd .num {
  font-size: 1rem;
  font-weight: 600;
  color: var(--ink);
}
.nexcalia-app .cal-week .day-hd .name {
  color: var(--ink-2);
  font-size: 0.6875rem;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
.nexcalia-app .cal-week .day-hd.today .num {
  color: var(--primary);
}
.nexcalia-app .cal-week .day-hd.today {
  background: var(--primary-tint);
}
.nexcalia-app .cal-week .hour-lbl {
  border-right: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  font-size: 0.625rem;
  color: var(--ink-3);
  padding: 2px 6px;
  text-align: right;
  font-variant-numeric: tabular-nums;
  background: var(--surface);
}
.nexcalia-app .cal-week .cell {
  border-right: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  position: relative;
  height: 56px;
  background: transparent;
}
.nexcalia-app .cal-week .cell.weekend {
  background: rgba(0, 0, 0, 0.015);
}
.nexcalia-app .cal-week .cell:hover {
  background: var(--hover);
}

.nexcalia-app .cal-evt {
  position: absolute;
  left: 2px;
  right: 2px;
  padding: 4px 6px;
  border-radius: 4px;
  font-size: 0.6875rem;
  background: var(--primary-tint);
  border-left: 2px solid var(--primary);
  color: var(--primary-deep);
  overflow: hidden;
  cursor: pointer;
  line-height: 1.3;
  z-index: 2;
}
.nexcalia-app .cal-evt .who {
  font-weight: 600;
  font-size: 0.6875rem;
}
.nexcalia-app .cal-evt .what {
  font-size: 0.625rem;
  opacity: 0.8;
}
.nexcalia-app .cal-evt.tone-info {
  background: var(--info-soft);
  border-color: var(--info);
  color: var(--info);
}
.nexcalia-app .cal-evt.tone-ok {
  background: var(--ok-soft);
  border-color: var(--ok);
  color: var(--ok);
}
.nexcalia-app .cal-evt.tone-warn {
  background: var(--warn-soft);
  border-color: var(--warn);
  color: var(--warn);
}
.nexcalia-app .cal-evt.tone-neutral {
  background: var(--neutral-soft);
  border-color: var(--ink-3);
  color: var(--ink-2);
}
.nexcalia-app .cal-evt:hover {
  filter: brightness(0.97);
  transform: translateX(1px);
}

.nexcalia-app .now-line {
  position: absolute;
  left: 0;
  right: 0;
  height: 1px;
  background: var(--primary);
  z-index: 3;
  pointer-events: none;
}
.nexcalia-app .now-line::before {
  content: "";
  position: absolute;
  left: -4px;
  top: -4px;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--primary);
}

.nexcalia-app .cal-month {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  background: var(--surface);
  flex: 1;
}
.nexcalia-app .cal-month .hd {
  padding: 12px 14px;
  font-size: 0.6875rem;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--ink-3);
  border-bottom: 1px solid var(--line);
  border-right: 1px solid var(--line);
  background: var(--surface-2);
}
.nexcalia-app .cal-month .mc {
  border-right: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  padding: 6px;
  min-height: 92px;
  display: flex;
  flex-direction: column;
  gap: 3px;
  position: relative;
}
.nexcalia-app .cal-month .mc .d {
  font-size: 0.6875rem;
  font-weight: 500;
  font-variant-numeric: tabular-nums;
  color: var(--ink-2);
  margin-bottom: 2px;
}
.nexcalia-app .cal-month .mc.other .d {
  color: var(--ink-3);
  opacity: 0.5;
}
.nexcalia-app .cal-month .mc.today .d {
  color: white;
  background: var(--primary);
  border-radius: 50%;
  width: 20px;
  height: 20px;
  display: grid;
  place-items: center;
}
.nexcalia-app .cal-month .mc .mevt {
  font-size: 0.625rem;
  padding: 1px 5px;
  border-radius: 3px;
  background: var(--primary-tint);
  color: var(--primary-deep);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  border-left: 2px solid var(--primary);
}
.nexcalia-app .cal-month .mc .mevt.tone-info {
  background: var(--info-soft);
  color: var(--info);
  border-color: var(--info);
}
.nexcalia-app .cal-month .mc .mevt.tone-ok {
  background: var(--ok-soft);
  color: var(--ok);
  border-color: var(--ok);
}
.nexcalia-app .cal-month .mc .mevt.tone-warn {
  background: var(--warn-soft);
  color: var(--warn);
  border-color: var(--warn);
}
.nexcalia-app .cal-month .mc .more {
  font-size: 0.625rem;
  color: var(--ink-3);
  padding: 0 4px;
}

.nexcalia-app .queue-grid {
  display: grid;
  grid-template-columns: 1fr 320px;
  gap: 16px;
  padding: 16px 24px;
}
.nexcalia-app .queue-board {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 12px;
}
.nexcalia-app .counter {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 12px;
  display: flex;
  flex-direction: column;
  gap: 8px;
  min-height: 168px;
  position: relative;
  overflow: hidden;
}
.nexcalia-app .counter.idle::after {
  content: "";
  position: absolute;
  inset: 0;
  background: repeating-linear-gradient(
    45deg,
    transparent,
    transparent 8px,
    rgba(0, 0, 0, 0.012) 8px,
    rgba(0, 0, 0, 0.012) 16px
  );
  pointer-events: none;
}
.nexcalia-app .counter .hd {
  display: flex;
  align-items: center;
  gap: 8px;
}
.nexcalia-app .counter .hd .num {
  font-family: var(--font-mono);
  font-size: 0.625rem;
  padding: 2px 6px;
  background: var(--bg-2);
  border-radius: 4px;
  color: var(--ink-2);
}
.nexcalia-app .counter .hd .agent {
  font-size: 0.6875rem;
  font-weight: 600;
}
.nexcalia-app .counter .hd .status {
  margin-left: auto;
}
.nexcalia-app .counter .ticket {
  font-family: var(--font-mono);
  font-size: 1.5rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  color: var(--ink);
}
.nexcalia-app .counter .visitor {
  font-size: 0.75rem;
  color: var(--ink-2);
}
.nexcalia-app .counter .meta {
  font-size: 0.6875rem;
  color: var(--ink-3);
  display: flex;
  gap: 8px;
  margin-top: auto;
}

.nexcalia-app .ticket-list {
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 10px;
}
.nexcalia-app .ticket-row {
  display: grid;
  grid-template-columns: auto 1fr auto;
  gap: 10px;
  align-items: center;
  padding: 8px;
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  background: var(--surface);
  font-size: 0.75rem;
}
.nexcalia-app .ticket-row .code {
  font-family: var(--font-mono);
  font-weight: 600;
  font-size: 0.8125rem;
  padding: 2px 8px;
  background: var(--bg-2);
  border-radius: 4px;
}
.nexcalia-app .ticket-row .who .a {
  font-weight: 500;
}
.nexcalia-app .ticket-row .who .b {
  color: var(--ink-3);
  font-size: 0.6875rem;
}
.nexcalia-app .ticket-row .wait {
  text-align: right;
  font-variant-numeric: tabular-nums;
  font-size: 0.6875rem;
  color: var(--ink-3);
}
.nexcalia-app .ticket-row.priority {
  border-left: 3px solid var(--primary);
}
.nexcalia-app .ticket-row.alert {
  border-color: var(--warn);
  background: var(--warn-soft);
}

.nexcalia-app .qmode-seg {
  display: inline-flex;
  background: var(--bg-2);
  border-radius: 8px;
  padding: 3px;
  gap: 2px;
}
.nexcalia-app .qmode-seg .opt {
  padding: 5px 12px;
  font-size: 0.75rem;
  font-weight: 500;
  border-radius: 6px;
  color: var(--ink-2);
  cursor: pointer;
  display: flex;
  align-items: center;
  gap: 6px;
}
.nexcalia-app .qmode-seg .opt.active {
  background: var(--surface);
  color: var(--ink);
  box-shadow: var(--shadow-sm);
}

.nexcalia-app .console {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 340px;
  gap: 16px;
  padding: 16px 24px;
  min-height: 0;
}
.nexcalia-app .now-card {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  padding: 22px 24px;
  position: relative;
  overflow: hidden;
  box-shadow: var(--shadow-sm);
}
.nexcalia-app .now-card::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    radial-gradient(
      800px 240px at -10% -40%,
      var(--primary-tint),
      transparent 60%
    ),
    radial-gradient(
      500px 180px at 110% -40%,
      var(--primary-soft),
      transparent 60%
    );
  opacity: 0.55;
  pointer-events: none;
}
.nexcalia-app .now-card > * {
  position: relative;
}
.nexcalia-app .now-card::after {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 2px;
  background: linear-gradient(
    90deg,
    var(--primary) 0%,
    var(--primary-deep) 100%
  );
}
.nexcalia-app .now-head {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 14px;
}
.nexcalia-app .now-head .live {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--primary);
  box-shadow: 0 0 0 3px var(--primary-soft);
  animation: nexcalia-pulse 2s ease-in-out infinite;
}
@keyframes nexcalia-pulse {
  0%,
  100% {
    box-shadow: 0 0 0 3px var(--primary-soft);
  }
  50% {
    box-shadow: 0 0 0 6px var(--primary-soft);
  }
}
.nexcalia-app .now-head .lbl {
  font-size: 0.625rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-weight: 600;
  color: var(--primary-deep);
}
.nexcalia-app .now-head .timer {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 0.9375rem;
  color: var(--ink-2);
  font-variant-numeric: tabular-nums;
  padding: 3px 8px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 6px;
}

.nexcalia-app .now-body {
  display: grid;
  grid-template-columns: auto 1fr auto;
  gap: 18px;
  align-items: center;
}
.nexcalia-app .now-body .big-ticket {
  font-family: var(--font-mono);
  font-size: 4rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  line-height: 0.95;
  color: var(--primary-deep);
  padding: 4px 18px 4px 0;
  border-right: 1px dashed var(--line-2);
}
.nexcalia-app .now-body .big-ticket .pos {
  display: block;
  font-size: 0.625rem;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-3);
  margin-top: 6px;
  font-family: var(--font-sans);
}
.nexcalia-app .now-body .who-block .name {
  font-size: 1.25rem;
  font-weight: 600;
  letter-spacing: -0.01em;
  display: flex;
  align-items: center;
  gap: 8px;
}
.nexcalia-app .now-body .who-block .meta {
  font-size: 0.75rem;
  color: var(--ink-2);
  margin-top: 4px;
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
}
.nexcalia-app .now-body .who-block .meta span {
  display: inline-flex;
  align-items: center;
  gap: 4px;
}

.nexcalia-app .now-prog {
  margin-top: 14px;
  display: grid;
  grid-template-columns: 1fr auto auto;
  gap: 12px;
  align-items: center;
  font-size: 0.6875rem;
  color: var(--ink-3);
}
.nexcalia-app .now-prog .bar {
  height: 6px;
  background: var(--surface);
  border-radius: 999px;
  overflow: hidden;
  border: 1px solid var(--line);
}
.nexcalia-app .now-prog .bar .fill {
  height: 100%;
  background: var(--primary);
  border-radius: 999px;
}
.nexcalia-app .now-prog .bar .fill.over {
  background: var(--warn);
}
.nexcalia-app .now-prog .num {
  font-family: var(--font-mono);
  color: var(--ink-2);
  font-variant-numeric: tabular-nums;
}

.nexcalia-app .now-actions {
  margin-top: 16px;
  display: flex;
  gap: 8px;
}
.nexcalia-app .action-big {
  appearance: none;
  border: 1px solid var(--line);
  background: var(--surface);
  border-radius: var(--radius-sm);
  padding: 10px 14px;
  font-size: 0.9375rem;
  font-weight: 500;
  color: var(--ink);
  display: inline-flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
}
.nexcalia-app .action-big:hover {
  background: var(--hover);
}
.nexcalia-app .action-big.primary {
  background: var(--primary);
  border-color: var(--primary);
  color: white;
  box-shadow:
    0 1px 0 rgba(0, 0, 0, 0.04),
    0 4px 12px color-mix(in oklab, var(--primary) 35%, transparent);
}
.nexcalia-app .action-big.primary:hover {
  background: var(--primary-deep);
  border-color: var(--primary-deep);
}
.nexcalia-app .action-big.lg {
  padding: 12px 18px;
  font-size: 0.875rem;
  font-weight: 600;
}
.nexcalia-app .action-big.danger {
  color: var(--danger);
}
.nexcalia-app .action-big.danger:hover {
  background: var(--danger-soft);
  border-color: var(--danger-soft);
}
.nexcalia-app .action-big .kbd {
  font-family: var(--font-mono);
  font-size: 0.625rem;
  padding: 1px 5px;
  border: 1px solid currentColor;
  border-radius: 3px;
  opacity: 0.5;
  margin-left: 4px;
}

.nexcalia-app .next-list {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.nexcalia-app .next-row {
  display: grid;
  grid-template-columns: 28px auto 1fr auto auto;
  gap: 10px;
  align-items: center;
  padding: 12px 14px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  font-size: 0.75rem;
}
.nexcalia-app .next-row .pos {
  font-family: var(--font-mono);
  font-size: 0.625rem;
  color: var(--ink-3);
  text-align: center;
}
.nexcalia-app .next-row .code {
  font-family: var(--font-mono);
  font-weight: 600;
  font-size: 0.75rem;
  padding: 2px 7px;
  background: var(--bg-2);
  border-radius: 4px;
}
.nexcalia-app .next-row .who .a {
  font-weight: 500;
}
.nexcalia-app .next-row .who .b {
  color: var(--ink-3);
  font-size: 0.6875rem;
}
.nexcalia-app .next-row .eta {
  font-size: 0.625rem;
  font-variant-numeric: tabular-nums;
  color: var(--ink-3);
  text-align: right;
  font-family: var(--font-mono);
}
.nexcalia-app .next-row.priority {
  border-left: 3px solid var(--primary);
}
.nexcalia-app .next-row .skip {
  font-size: 0.625rem;
  color: var(--ink-3);
  padding: 2px 6px;
  border-radius: 4px;
  cursor: pointer;
}
.nexcalia-app .next-row .skip:hover {
  background: var(--hover);
  color: var(--ink-2);
}

.nexcalia-app .mini-stat {
  display: flex;
  flex-direction: column;
  padding: 10px 12px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
}
.nexcalia-app .mini-stat .l {
  font-size: 0.625rem;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--ink-3);
}
.nexcalia-app .mini-stat .v {
  font-size: 1.375rem;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  margin-top: 2px;
}

.nexcalia-app .service-chip {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px 10px;
  font-size: 0.75rem;
  background: var(--surface-2);
  border: 1px solid var(--line);
  border-radius: 999px;
  cursor: pointer;
}
.nexcalia-app .service-chip.on {
  background: var(--primary-tint);
  border-color: var(--primary-soft);
  color: var(--primary-deep);
  font-weight: 500;
}
.nexcalia-app .service-chip .swatch {
  width: 8px;
  height: 8px;
  border-radius: 50%;
}
.nexcalia-app .service-chip .ct {
  font-family: var(--font-mono);
  font-size: 0.625rem;
  color: var(--ink-3);
  margin-left: auto;
}
.nexcalia-app .service-chip.on .ct {
  color: var(--primary-deep);
}

.nexcalia-app .tpl-row {
  padding: 12px 14px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--line);
  background: var(--surface);
  font-size: 0.75rem;
  display: flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
}
.nexcalia-app .tpl-row:hover {
  background: var(--hover);
}
.nexcalia-app .tpl-row .ico {
  color: var(--ink-3);
}
.nexcalia-app .tpl-row .a {
  font-weight: 500;
}
.nexcalia-app .tpl-row .b {
  color: var(--ink-3);
  font-size: 0.6875rem;
}

.nexcalia-app .doc-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 6px;
}
.nexcalia-app .doc-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 12px 14px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  font-size: 0.75rem;
  cursor: pointer;
}
.nexcalia-app .doc-item .chk {
  width: 16px;
  height: 16px;
  border-radius: 4px;
  border: 1.5px solid var(--line-2);
  display: grid;
  place-items: center;
  flex-shrink: 0;
  color: transparent;
}
.nexcalia-app .doc-item.done {
  background: var(--ok-soft);
  border-color: var(--ok-soft);
}
.nexcalia-app .doc-item.done .chk {
  background: var(--ok);
  border-color: var(--ok);
  color: white;
}
.nexcalia-app .doc-item.done .lbl {
  color: var(--ok);
  text-decoration: line-through;
  text-decoration-thickness: 1px;
  opacity: 0.7;
}
.nexcalia-app .doc-item .lbl {
  flex: 1;
  color: var(--ink-2);
}
.nexcalia-app .doc-item .hint {
  font-size: 0.625rem;
  color: var(--ink-3);
}

.nexcalia-app .upnext {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 12px 16px;
  background: var(--surface-2);
  border: 1px dashed var(--line-2);
  border-radius: var(--radius);
  font-size: 0.75rem;
}
.nexcalia-app .upnext .arrow {
  color: var(--ink-3);
}
.nexcalia-app .upnext .code {
  font-family: var(--font-mono);
  font-weight: 600;
  font-size: 0.8125rem;
  padding: 3px 8px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 4px;
}
.nexcalia-app .upnext .who {
  font-weight: 500;
}
.nexcalia-app .upnext .svc {
  color: var(--ink-3);
}
.nexcalia-app .upnext .eta {
  margin-left: auto;
  font-size: 0.6875rem;
  color: var(--ink-3);
  font-variant-numeric: tabular-nums;
}

.nexcalia-app .kbd-bar {
  display: flex;
  gap: 14px;
  padding: 8px 16px;
  font-size: 0.6875rem;
  color: var(--ink-3);
  border-top: 1px dashed var(--line);
  background: var(--surface-2);
  border-bottom-left-radius: var(--radius-lg);
  border-bottom-right-radius: var(--radius-lg);
  margin: 16px -24px -22px;
  flex-wrap: wrap;
}
.nexcalia-app .kbd-bar .item {
  display: inline-flex;
  align-items: center;
  gap: 5px;
}
.nexcalia-app .kbd-bar .k {
  font-family: var(--font-mono);
  font-size: 0.625rem;
  padding: 1px 5px;
  border: 1px solid var(--line);
  background: var(--surface);
  border-radius: 3px;
  color: var(--ink-2);
}

.nexcalia-app .opt-toggle {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 10px;
  font-size: 0.6875rem;
  color: var(--ink-2);
  border: 1px solid var(--line);
  background: var(--surface);
  border-radius: 999px;
  cursor: pointer;
  min-height: 24px;
}
.nexcalia-app .opt-toggle.on {
  background: var(--primary-tint);
  color: var(--primary-deep);
  border-color: var(--primary-soft);
}
.nexcalia-app .opt-toggle .sw {
  width: 18px;
  height: 10px;
  background: var(--line-2);
  border-radius: 999px;
  position: relative;
  transition: background 0.15s;
}
.nexcalia-app .opt-toggle .sw::after {
  content: "";
  position: absolute;
  top: 1px;
  left: 1px;
  width: 8px;
  height: 8px;
  background: white;
  border-radius: 50%;
  transition: transform 0.15s;
}
.nexcalia-app .opt-toggle.on .sw {
  background: var(--primary);
}
.nexcalia-app .opt-toggle.on .sw::after {
  transform: translateX(8px);
}

.nexcalia-app .vis-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 360px;
  gap: 16px;
  padding: 16px 24px;
}
.nexcalia-app .vis-card {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 12px;
  display: grid;
  grid-template-columns: 36px 1fr auto;
  gap: 10px;
  align-items: start;
  cursor: pointer;
}
.nexcalia-app .vis-card:hover {
  background: var(--surface-2);
}
.nexcalia-app .vis-card .av {
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--primary), var(--primary-deep));
  color: white;
  display: grid;
  place-items: center;
  font-weight: 600;
  font-size: 0.75rem;
}
.nexcalia-app .vis-card .av.tone-info {
  background: linear-gradient(
    135deg,
    var(--info),
    color-mix(in oklab, var(--info) 35%, black)
  );
}
.nexcalia-app .vis-card .av.tone-ok {
  background: linear-gradient(
    135deg,
    var(--ok),
    color-mix(in oklab, var(--ok) 35%, black)
  );
}
.nexcalia-app .vis-card .av.tone-warn {
  background: linear-gradient(
    135deg,
    var(--warn),
    color-mix(in oklab, var(--warn) 35%, black)
  );
}
.nexcalia-app .vis-card .who .a {
  font-weight: 600;
  font-size: 0.8125rem;
  display: flex;
  align-items: center;
  gap: 6px;
}
.nexcalia-app .vis-card .who .b {
  color: var(--ink-3);
  font-size: 0.6875rem;
  margin-top: 2px;
}
.nexcalia-app .vis-card .who .host {
  font-size: 0.6875rem;
  color: var(--ink-2);
  margin-top: 4px;
  display: flex;
  gap: 6px;
  align-items: center;
}
.nexcalia-app .vis-card .who .host .h-av {
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: var(--ink);
  color: white;
  font-size: 0.5rem;
  font-weight: 600;
  display: grid;
  place-items: center;
}
.nexcalia-app .vis-card .meta {
  text-align: right;
  font-size: 0.6875rem;
  color: var(--ink-3);
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 4px;
}
.nexcalia-app .vis-card .meta .t {
  font-family: var(--font-mono);
  font-weight: 600;
  font-size: 0.8125rem;
  color: var(--ink);
}

.nexcalia-app .stage-rail {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 8px;
  padding: 16px 24px 0;
}
.nexcalia-app .stage-col {
  background: var(--surface-2);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  min-height: 200px;
  display: flex;
  flex-direction: column;
}
.nexcalia-app .stage-col .hd {
  padding: 12px 14px;
  font-size: 0.6875rem;
  font-weight: 600;
  display: flex;
  align-items: center;
  gap: 6px;
  border-bottom: 1px solid var(--line);
  letter-spacing: 0.01em;
}
.nexcalia-app .stage-col .hd .ct {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 0.625rem;
  color: var(--ink-3);
  background: var(--surface);
  padding: 2px 8px;
  border-radius: 4px;
  border: 1px solid var(--line);
}
.nexcalia-app .stage-col .body {
  padding: 6px;
  display: flex;
  flex-direction: column;
  gap: 6px;
  flex: 1;
}
.nexcalia-app .stage-card {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 6px;
  padding: 12px 14px;
  font-size: 0.75rem;
  display: flex;
  flex-direction: column;
  gap: 3px;
  position: relative;
}
.nexcalia-app .stage-card .name {
  font-weight: 600;
  font-size: 0.75rem;
}
.nexcalia-app .stage-card .sub {
  font-size: 0.6875rem;
  color: var(--ink-3);
}
.nexcalia-app .stage-card .row {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 0.625rem;
  color: var(--ink-3);
}
.nexcalia-app .stage-card.over {
  border-left: 3px solid var(--warn);
}
.nexcalia-app .stage-card.active {
  border-left: 3px solid var(--ok);
  background: linear-gradient(180deg, var(--ok-soft) 0%, var(--surface) 30%);
}

.nexcalia-app .badge-card {
  background: white;
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 14px;
  box-shadow: var(--shadow-md);
  position: relative;
  overflow: hidden;
}
.nexcalia-app .badge-card::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 36px;
  background: var(--ink);
}
.nexcalia-app .badge-card .hole {
  position: absolute;
  top: 8px;
  left: 50%;
  transform: translateX(-50%);
  width: 22px;
  height: 4px;
  background: rgba(255, 255, 255, 0.3);
  border-radius: 2px;
}
.nexcalia-app .badge-card .logo {
  position: relative;
  color: white;
  font-size: 0.625rem;
  letter-spacing: 0.06em;
  padding: 6px 0 14px;
  text-align: center;
  font-weight: 600;
}
.nexcalia-app .badge-card .photo {
  width: 88px;
  height: 88px;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--primary), var(--primary-deep));
  display: grid;
  place-items: center;
  color: white;
  font-size: 1.625rem;
  font-weight: 600;
  margin: 0 auto 10px;
  border: 4px solid white;
  margin-top: -32px;
  position: relative;
}
.nexcalia-app .badge-card .vname {
  font-size: 1rem;
  font-weight: 600;
  text-align: center;
}
.nexcalia-app .badge-card .vrole {
  font-size: 0.6875rem;
  color: var(--ink-3);
  text-align: center;
  margin-top: 2px;
}
.nexcalia-app .badge-card .vrow {
  display: flex;
  justify-content: space-between;
  font-size: 0.6875rem;
  padding: 8px 0;
  border-top: 1px dashed var(--line);
  margin-top: 10px;
}
.nexcalia-app .badge-card .vrow .l {
  color: var(--ink-3);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
.nexcalia-app .badge-card .vrow .v {
  font-weight: 600;
  font-family: var(--font-mono);
}
.nexcalia-app .badge-card .qr {
  width: 64px;
  height: 64px;
  background-image:
    linear-gradient(90deg, var(--ink) 1px, transparent 1px),
    linear-gradient(0deg, var(--ink) 1px, transparent 1px);
  background-size: 8px 8px;
  margin: 8px auto 4px;
  border: 1px solid var(--line);
  opacity: 0.85;
}

.nexcalia-app .vis-strip {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  background: var(--surface);
  border-bottom: 1px solid var(--line);
}
.nexcalia-app .vis-strip .cell {
  padding: 12px 16px;
  border-right: 1px solid var(--line);
  display: flex;
  flex-direction: column;
}
.nexcalia-app .vis-strip .cell:last-child {
  border-right: 0;
}
.nexcalia-app .vis-strip .cell .l {
  font-size: 0.625rem;
  color: var(--ink-3);
  letter-spacing: 0.04em;
  text-transform: uppercase;
}
.nexcalia-app .vis-strip .cell .v {
  font-size: 1.375rem;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  margin-top: 2px;
}
.nexcalia-app .vis-strip .cell .sub {
  font-size: 0.6875rem;
  color: var(--ink-3);
  margin-top: 2px;
}

.nexcalia-app .divider {
  height: 1px;
  background: var(--line);
  margin: 0;
}
.nexcalia-app .hstack {
  display: flex;
  align-items: center;
  gap: 8px;
}
.nexcalia-app .vstack {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.nexcalia-app .spacer {
  flex: 1;
}

.dot-status {
  position: relative;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  display: inline-block;
  vertical-align: middle;
}
.dot-status::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  pointer-events: none;
  will-change: transform, opacity;
}
.dot-status.ok {
  background: var(--ok);
  box-shadow: 0 0 0 2px var(--ok-soft);
}
.dot-status.warn {
  background: var(--warn);
  box-shadow: 0 0 0 2px var(--warn-soft);
}
.dot-status.idle {
  background: var(--ink-3);
}

.dot-status.ok::before {
  background: var(--ok);
  animation: nx-status-ripple 2.4s ease-out infinite;
}
.dot-status.warn::before {
  background: var(--warn);
  animation: nx-status-ripple 1.6s ease-out infinite;
}
.dot-status.idle::before {
  background: var(--ink-3);
  animation: nx-status-breath 3s ease-in-out infinite;
}

@keyframes nx-status-ripple {
  0% {
    transform: scale(1);
    opacity: 0.55;
  }
  80% {
    opacity: 0;
  }
  100% {
    transform: scale(3);
    opacity: 0;
  }
}
@keyframes nx-status-breath {
  0%,
  100% {
    transform: scale(1);
    opacity: 0.3;
  }
  50% {
    transform: scale(1.6);
    opacity: 0;
  }
}
@media (prefers-reduced-motion: reduce) {
  .dot-status::before {
    animation: none !important;
  }
}

.nx-text-gradient {
  color: var(--primary);
  background-image: linear-gradient(90deg, var(--primary), var(--primary-deep));
  -webkit-background-clip: text;
  background-clip: text;
}
@supports ((-webkit-background-clip: text) or (background-clip: text)) {
  .nx-text-gradient {
    -webkit-text-fill-color: transparent;
    color: transparent;
  }
}

.nx-text-gradient-diag {
  color: var(--primary);
  background-image: linear-gradient(
    135deg,
    var(--primary),
    var(--primary-deep)
  );
  -webkit-background-clip: text;
  background-clip: text;
}
@supports ((-webkit-background-clip: text) or (background-clip: text)) {
  .nx-text-gradient-diag {
    -webkit-text-fill-color: transparent;
    color: transparent;
  }
}

.nexcalia-app aside .group:not([style*="linear-gradient"]):hover {
  background: color-mix(in oklab, var(--surface) 90%, var(--primary-tint));
  box-shadow:
    0 1px 0 rgba(43, 57, 72, 0.03),
    inset 0 0 0 1px color-mix(in oklab, var(--line) 60%, transparent);
}

.nx-scroll {
  scrollbar-width: thin;
  scrollbar-color: color-mix(in oklab, var(--ink-3) 40%, transparent)
    transparent;
}
.nx-scroll::-webkit-scrollbar {
  width: 6px;
}
.nx-scroll::-webkit-scrollbar-track {
  background: transparent;
}
.nx-scroll::-webkit-scrollbar-thumb {
  background: color-mix(in oklab, var(--ink-3) 35%, transparent);
  border-radius: 3px;
}
.nx-scroll::-webkit-scrollbar-thumb:hover {
  background: color-mix(in oklab, var(--ink-3) 55%, transparent);
}

.nx-aurora {
  position: absolute;
  border-radius: 50%;
  filter: blur(48px);
  will-change: transform, translate, opacity;
  opacity: 0.7;

  mix-blend-mode: multiply;

  transition: translate 0.35s cubic-bezier(0.2, 0.8, 0.2, 1);
}

.nexcalia-app[data-palette="dark"] .nx-aurora {
  mix-blend-mode: screen;
  opacity: 0.55;
}

.nx-aurora-1 {
  top: -20%;
  left: -30%;
  width: 90%;
  height: 60%;
  background: radial-gradient(
    circle,
    color-mix(in oklab, var(--primary) 70%, transparent),
    transparent 65%
  );
  animation: nx-aurora-drift-a 18s ease-in-out infinite;
  translate: calc(var(--nx-mx, 0) * 220px) calc(var(--nx-my, 0) * 180px);
}
.nx-aurora-2 {
  bottom: -15%;
  right: -25%;
  width: 80%;
  height: 55%;
  background: radial-gradient(
    circle,
    color-mix(in oklab, var(--primary-deep) 60%, transparent),
    transparent 65%
  );
  animation: nx-aurora-drift-b 22s ease-in-out infinite;
  animation-delay: -6s;

  translate: calc(var(--nx-mx, 0) * -160px) calc(var(--nx-my, 0) * -130px);
}
.nx-aurora-3 {
  top: 30%;
  left: -15%;
  width: 70%;
  height: 45%;
  background: radial-gradient(
    circle,
    color-mix(
      in oklab,
      var(--accent-green, var(--nx-puertorico)) 55%,
      transparent
    ),
    transparent 65%
  );
  animation: nx-aurora-drift-c 26s ease-in-out infinite;
  animation-delay: -11s;
  opacity: 0.55;
  translate: calc(var(--nx-mx, 0) * 130px) calc(var(--nx-my, 0) * -140px);
}
@keyframes nx-aurora-drift-a {
  0%,
  100% {
    transform: translate(0%, 0%) scale(1);
  }
  25% {
    transform: translate(50%, 25%) scale(1.2);
  }
  50% {
    transform: translate(70%, -10%) scale(0.85);
  }
  75% {
    transform: translate(25%, -25%) scale(1.15);
  }
}
@keyframes nx-aurora-drift-b {
  0%,
  100% {
    transform: translate(0%, 0%) scale(1);
  }
  33% {
    transform: translate(-50%, -30%) scale(1.25);
  }
  66% {
    transform: translate(-25%, -60%) scale(0.8);
  }
}
@keyframes nx-aurora-drift-c {
  0%,
  100% {
    transform: translate(0%, 0%) scale(1);
  }
  40% {
    transform: translate(60%, 40%) scale(1.3);
  }
  80% {
    transform: translate(30%, 70%) scale(0.75);
  }
}

aside:not(:hover) .nx-aurora {
  animation-play-state: paused;
}
@media (prefers-reduced-motion: reduce) {
  .nx-aurora {
    animation: none !important;
  }
}

.nexcalia-app[data-collapsed="true"] aside {
  padding-bottom: 4px;
}
.nexcalia-app[data-collapsed="true"] [data-collapse-hide] {
  display: none !important;
}

/* Converse de [data-collapse-hide] : l'élément n'existe que dans la sidebar repliée.
   Une seule règle, scopée au non-replié : en replié aucune déclaration ne force
   `display`, donc la classe de l'élément (ex. `.nx-nav-icon-badge { display: inline-flex }`)
   s'applique normalement.

   Deux pièges évités ici :
   1. La forme à deux règles (`display: revert !important` côté replié) casse le
      composant : `revert` remonte la cascade au-delà de TOUT le calque auteur, pas
      seulement de la règle de masquage — un `<span class="nx-nav-icon-badge">`
      retombe sur `inline` (défaut UA) et perd son centrage flex.
   2. Le `:not()` est ancré sur `.nexcalia-shell`, pas sur `.nexcalia-app` : l'app
      consommatrice peut poser `.nexcalia-app` sur un ancêtre (jusqu'au <body>) qui
      ne porte évidemment pas `data-collapsed`, et le `:not()` y matcherait toujours,
      masquant l'élément même replié. Seule la racine du shell porte l'attribut. */
.nexcalia-shell:not([data-collapsed="true"]) [data-collapse-only] {
  display: none !important;
}

/* ─── Sidebar-only scale (prop :sidebar-scale="md|lg|xl" sur <x-nexcalia.shell>) ───
   Applique CSS `zoom` à l'aside pour scaler de façon cohérente texte + padding + gap
   + icônes, sans toucher au reste de l'app. Équivalent au data-scale global, mais
   scopé à la sidebar (utile quand le contenu principal est déjà à la bonne taille).
   `zoom` est aujourd'hui supporté Chrome/Edge/Safari/Firefox 126+. */
.nexcalia-app aside[data-sidebar-scale="md"] {
  zoom: 1.0625;
}
.nexcalia-app aside[data-sidebar-scale="lg"] {
  zoom: 1.125;
}
.nexcalia-app aside[data-sidebar-scale="xl"] {
  zoom: 1.25;
}

.nexcalia-app[data-collapsed="true"] aside .nx-nav-item {
  justify-content: center !important;
  padding: 8px !important;
  gap: 0 !important;
}
.nexcalia-app[data-collapsed="true"] aside .nx-site-switcher {
  margin: 12px auto 6px !important;
  padding: 10px !important;
  /* No width clamp: the hidden name/chevron leave only the 28px avatar, so
     10+28+10 settles at a square 48×48. Clamping to 40px squeezed the card
     into a 40×48 upright rectangle around the logo. */
  min-width: 40px !important;
  justify-content: center !important;
  gap: 0 !important;
}
.nexcalia-app[data-collapsed="true"] aside .nx-brand {
  justify-content: center !important;
  padding-left: 10px !important;
  padding-right: 10px !important;
}

.nexcalia-app .nx-brand::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 1px;
  background: linear-gradient(
    90deg,
    transparent 0%,
    rgba(255, 255, 255, 0.1) 25%,
    rgba(255, 255, 255, 0.1) 75%,
    transparent 100%
  );
  pointer-events: none;
  z-index: 1;
}
[data-palette="dark"] .nexcalia-app .nx-brand::after {
  background: linear-gradient(
    90deg,
    transparent 0%,
    rgba(255, 255, 255, 0.2) 25%,
    rgba(255, 255, 255, 0.2) 75%,
    transparent 100%
  );
}
.nexcalia-app[data-collapsed="true"] aside .nx-footer {
  justify-content: center !important;
  padding-left: 10px !important;
  padding-right: 10px !important;
  gap: 0 !important;
}
.nexcalia-app[data-collapsed="true"] aside .nx-submenu-inline {
  display: none !important;
}

.nexcalia-app[data-collapsed="true"] aside .nx-section-label {
  font-size: 0 !important;
  padding: 16px 0 10px !important;
  justify-content: center !important;
  gap: 0 !important;
  position: relative !important;
}
.nexcalia-app[data-collapsed="true"]
  aside
  .nx-section-label
  > span:first-child {
  display: none !important;
}
.nexcalia-app[data-collapsed="true"] aside .nx-section-label > span:last-child {
  flex: none !important;
  width: 28px !important;
  height: 1px !important;
  margin: 0 !important;
  opacity: 1 !important;
  background: linear-gradient(
    90deg,
    transparent,
    color-mix(in oklab, var(--ink-3) 50%, transparent) 30%,
    color-mix(in oklab, var(--ink-3) 50%, transparent) 70%,
    transparent
  ) !important;
}

.nexcalia-app[data-mobile="true"] {
  grid-template-columns: 1fr !important;
  overflow-x: hidden !important;
}
.nexcalia-app[data-mobile="true"] aside {
  position: fixed !important;
  top: 0;
  bottom: 0;
  left: 0;
  width: 280px !important;
  z-index: 30;
  transform: translateX(-100%);
  transition: transform 0.25s cubic-bezier(0.5, 0.2, 0.2, 1);
  box-shadow: none !important;
}
.nexcalia-app[data-mobile="true"][data-mobile-open="true"] aside {
  transform: translateX(0);
  box-shadow: 0 0 60px rgba(43, 57, 72, 0.2) !important;
}
.nexcalia-app[data-mobile="true"] .nx-toggle-bubble {
  display: none !important;
}
.nexcalia-app[data-mobile="true"]
  > div:first-of-type[class*="pointer-events-none"] {
  display: none;
}
.nexcalia-app[data-mobile="true"] .main {
  min-width: 0;
}
.nexcalia-app[data-mobile="true"] .topbar .search {
  display: none !important;
}
.nexcalia-app[data-mobile="true"] .topbar {
  padding: 0 12px !important;
  gap: 8px !important;
}
.nexcalia-app[data-mobile="true"] .topbar .crumb > span:not(.cur):not(.sep) {
  display: none;
}
.nexcalia-app[data-mobile="true"] .topbar .crumb > span.sep {
  display: none;
}
.nexcalia-app[data-tablet="true"] .topbar .search {
  width: 200px !important;
}

.nx-tooltip {
  position: fixed;
  background: var(--nx-pickled);
  color: var(--nx-white);
  padding: 7px 12px;
  font-size: 0.78125rem;
  font-weight: 500;
  border-radius: 8px;
  box-shadow:
    0 10px 28px rgba(11, 16, 32, 0.32),
    0 3px 8px rgba(11, 16, 32, 0.18);
  white-space: nowrap;
  transform: translateY(-50%);
  z-index: 9999;
  /* Don't intercept mouse events — the tooltip is teleported above
     siblings (including dropdown menus and the trigger wrapper). With
     pointer-events:auto it would steal hover/leave from the trigger and
     cause oscillating show/hide loops when the tooltip overlaps the
     dropdown opened from a wrapped trigger. */
  pointer-events: none;
}
.nx-tooltip::before {
  content: "";
  position: absolute;
  left: -5px;
  top: 50%;
  transform: translateY(-50%) rotate(45deg);
  width: 8px;
  height: 8px;
  background: var(--nx-pickled);
}

/* ───── Tooltip wrap (générique <x-nexcalia.tooltip>) ─────
   Le wrapper est inline pour ne pas casser le flow ; le tooltip est téléporté
   au <body>. Le placement (.nx-tooltip-bottom/top/left/right) override le
   transform et la flèche par rapport au défaut (right). */
.nx-tooltip-wrap {
  display: inline-flex;
  align-items: center;
}

/* Placement: bottom (tooltip sous l'élément, flèche en haut) */
.nx-tooltip.nx-tooltip-bottom {
  transform: translateX(-50%);
}
.nx-tooltip.nx-tooltip-bottom::before {
  left: var(--nx-tooltip-arrow-x, 50%);
  top: -4px;
  transform: translateX(-50%) rotate(45deg);
}

/* Placement: top (tooltip au-dessus, flèche en bas) */
.nx-tooltip.nx-tooltip-top {
  transform: translate(-50%, -100%);
}
.nx-tooltip.nx-tooltip-top::before {
  left: var(--nx-tooltip-arrow-x, 50%);
  top: auto;
  bottom: -4px;
  transform: translateX(-50%) rotate(45deg);
}

/* Placement: left (tooltip à gauche, flèche à droite) */
.nx-tooltip.nx-tooltip-left {
  transform: translate(-100%, -50%);
}
.nx-tooltip.nx-tooltip-left::before {
  left: auto;
  right: -5px;
  top: 50%;
  transform: translateY(-50%) rotate(45deg);
}

/* Placement: right — mêmes propriétés que .nx-tooltip par défaut (déjà
   défini ci-dessus pour usage sidebar repliée). Alias explicite pour
   clarté côté consommateur. */
.nx-tooltip.nx-tooltip-right {
  transform: translateY(-50%);
}

.nx-tooltip-menu {
  position: fixed;
  background: var(--surface);
  color: var(--ink);
  padding: 8px;
  border-radius: 10px;
  box-shadow:
    0 12px 32px rgba(43, 57, 72, 0.16),
    0 2px 6px rgba(43, 57, 72, 0.08),
    0 0 0 1px color-mix(in oklab, var(--line) 80%, transparent);
  min-width: 220px;
  max-height: calc(100vh - 32px);
  overflow-y: auto;
  z-index: 9999;
  /* Unlike .nx-tooltip this flyout is interactive (links + keep()/close()
     hover handlers): it MUST receive mouse events, otherwise it closes as
     soon as the pointer leaves the trigger and its items can never be
     clicked. No oscillation risk here — the menu is positioned beside the
     trigger (r.right + offset), never on top of it. */
  pointer-events: auto;
}
.nx-tooltip-menu::before {
  content: "";
  position: absolute;
  left: -5px;
  top: var(--arrow-y, 18px);
  transform: translateY(-50%) rotate(45deg);
  width: 8px;
  height: 8px;
  background: var(--surface);
  border-left: 1px solid color-mix(in oklab, var(--line) 80%, transparent);
  border-bottom: 1px solid color-mix(in oklab, var(--line) 80%, transparent);
}
.nx-tooltip-menu .header {
  font-size: 0.625rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--ink-3);
  padding: 6px 10px 8px;
  font-weight: 600;
  border-bottom: 1px solid color-mix(in oklab, var(--line) 70%, transparent);
  margin-bottom: 4px;
}
.nx-tooltip-menu .item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 10px;
  font-size: 0.78125rem;
  color: var(--ink-2);
  border-radius: 6px;
  text-decoration: none;
  transition: background-color 0.12s ease-out;
}
.nx-tooltip-menu .item:hover {
  background: var(--hover);
  color: var(--ink);
}
.nx-tooltip-menu .item .ico {
  color: var(--ink-3);
}
.nx-tooltip-menu .item .count {
  margin-left: auto;
  font-size: 0.625rem;
  color: var(--ink-3);
  background: var(--bg-2);
  padding: 1px 6px;
  border-radius: 999px;
  font-variant-numeric: tabular-nums;
}

.nx-site-popover {
  background: var(--surface) !important;
  isolation: isolate;
}
.nx-site-popover input:focus {
  background: var(--surface) !important;
  border-color: color-mix(in oklab, var(--primary) 70%, transparent) !important;
  box-shadow: 0 0 0 3px var(--primary-soft) !important;
}

.nx-user-menu {
  min-width: 280px !important;
  max-width: calc(100vw - 24px) !important;
  padding: 6px !important;
}
.nx-user-menu-head {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 10px 10px 12px;
}
.nx-user-menu-sep {
  height: 1px;
  background: color-mix(in oklab, var(--line) 70%, transparent);
  margin: 4px -6px;
}

.nx-user-menu-scale {
  padding: 8px 10px 10px;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.nx-user-menu-scale-label {
  font-size: 0.65625rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--ink-3);
}
.nx-user-menu-scale-seg {
  width: 100%;
  display: flex;
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  overflow: hidden;
  background: var(--surface);
}
.nx-user-menu-scale-seg .opt {
  flex: 1;
  display: grid;
  place-items: center;
  font-weight: 600;
  line-height: 1;
  height: 36px;
  padding: 0 !important;
  color: var(--ink-2);
  border-right: 1px solid var(--line);
  cursor: pointer;
  transition:
    background-color 0.12s,
    color 0.12s;
}
.nx-user-menu-scale-seg .opt:last-child {
  border-right: 0;
}
.nx-user-menu-scale-seg .opt:not(.active):hover {
  background: var(--hover);
  color: var(--ink);
}
.nx-user-menu-scale-seg .opt.active {
  background: var(--ink);
  color: var(--surface);
}
.nx-user-menu-scale-seg .opt:nth-child(1) {
  font-size: 0.6875rem !important;
}
.nx-user-menu-scale-seg .opt:nth-child(2) {
  font-size: 0.8125rem !important;
}
.nx-user-menu-scale-seg .opt:nth-child(3) {
  font-size: 1rem !important;
}
.nx-user-menu-scale-seg .opt:nth-child(4) {
  font-size: 1.1875rem !important;
}

/* ───── Roles scroller (footer utilisateur + popover) ─────
   Animation CSS-only qui défile une liste de rôles verticalement. Le nombre de rôles
   est lu depuis la variable CSS `--nx-roles-count` posée inline par le Blade.
   `steps()` donne des jumps instantanés (style afficheur digital) — chaque rôle
   est visible 3s, puis switch propre au suivant. */
.nx-user-roles-scroller {
  height: 1em;
  line-height: 1em;
  overflow: hidden;
  display: inline-block;
}
.nx-user-roles-scroller > span {
  display: block;
  animation: nx-user-roles-cycle calc(3s * var(--nx-roles-count, 1))
    steps(var(--nx-roles-count, 1)) infinite;
}
@keyframes nx-user-roles-cycle {
  from {
    transform: translateY(0);
  }
  to {
    transform: translateY(calc(-1em * var(--nx-roles-count, 1)));
  }
}

.nx-user-menu .item.danger {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 9px 10px;
  font-size: 0.78125rem;
  border-radius: 6px;
  text-decoration: none;
  transition: background-color 0.12s ease-out;
}
.nx-user-menu .item.danger:hover {
  background: color-mix(in oklab, var(--danger-soft) 50%, transparent);
}

.nx-user-menu::before {
  display: none;
}

/* Hide the in-sidebar fly-out tooltips/menus only when the sidebar is
   expanded. Previously the selectors `.nexcalia-app[data-collapsed="false"]
   .nx-tooltip` also matched <x-nexcalia.tooltip> spans teleported to <body>
   (itself a descendant of `.nexcalia-app`), hiding every generic tooltip
   on the page. Scoping to `aside` restricts the rule to its intended
   sidebar context. */
.nexcalia-app[data-collapsed="false"] aside .nx-tooltip,
.nexcalia-app[data-collapsed="false"] aside .nx-tooltip-menu {
  display: none;
}

.nexcalia-shell {
  transition: grid-template-columns 0.3s cubic-bezier(0.5, 0.2, 0.2, 1);
}

[data-palette="dark"] .nx-tooltip-menu,
[data-palette="dark"] .nx-site-popover {
  background: color-mix(in oklab, var(--surface) 92%, white) !important;
  box-shadow:
    0 18px 40px rgba(0, 0, 0, 0.65),
    0 4px 12px rgba(0, 0, 0, 0.45),
    0 0 0 1px rgba(255, 255, 255, 0.18),
    inset 0 1px 0 rgba(255, 255, 255, 0.06) !important;
  border-color: rgba(255, 255, 255, 0.18) !important;
}
[data-palette="dark"] .nx-tooltip-menu::before {
  background: color-mix(in oklab, var(--surface) 92%, white) !important;
  border-left-color: rgba(255, 255, 255, 0.18) !important;
  border-bottom-color: rgba(255, 255, 255, 0.18) !important;
}
[data-palette="dark"] .nx-tooltip-menu .header {
  border-bottom-color: rgba(255, 255, 255, 0.1) !important;
}
[data-palette="dark"] .nx-user-menu-sep {
  background: rgba(255, 255, 255, 0.1) !important;
}
[data-palette="dark"] .nx-site-popover input {
  background: rgba(255, 255, 255, 0.04) !important;
  border-color: rgba(255, 255, 255, 0.12) !important;
}
[data-palette="dark"] .nx-site-popover input:focus {
  background: rgba(255, 255, 255, 0.07) !important;
  box-shadow: 0 0 0 3px color-mix(in oklab, var(--primary) 35%, transparent) !important;
  border-color: color-mix(in oklab, var(--primary) 80%, transparent) !important;
}
[data-palette="dark"] .nx-toggle-bubble {
  box-shadow:
    0 0 0 1px rgba(255, 255, 255, 0.18),
    0 2px 6px rgba(0, 0, 0, 0.4) !important;
}
[data-palette="dark"] .nx-toggle-bubble:hover {
  box-shadow:
    0 4px 12px rgba(0, 0, 0, 0.5),
    0 0 0 1px color-mix(in oklab, var(--primary) 60%, transparent),
    0 0 0 4px color-mix(in oklab, var(--primary) 22%, transparent) !important;
  color: var(--primary) !important;
}

.nx-toggle-bubble {
  transform: translateY(-50%) scale(0.8);
  opacity: 0.4;
}

aside:hover ~ .nx-toggle-bubble,
.nx-toggle-bubble:focus-visible {
  opacity: 0.85;
  transform: translateY(-50%) scale(0.95);
}

.nx-toggle-bubble:hover {
  opacity: 1 !important;
  transform: translateY(-50%) scale(1) !important;
  box-shadow:
    0 4px 12px rgba(43, 57, 72, 0.18),
    0 0 0 1px color-mix(in oklab, var(--primary) 50%, transparent),
    0 0 0 4px var(--primary-soft),
    inset 0 1px 0 rgba(255, 255, 255, 0.6) !important;
  color: var(--primary) !important;
}
.nx-toggle-bubble:active {
  transform: translateY(-50%) scale(0.92) !important;
}
.nx-bubble-halo {
  box-shadow: 0 0 0 0 color-mix(in oklab, var(--primary) 35%, transparent);
}
.nx-toggle-bubble:hover .nx-bubble-halo {
  animation: nx-bubble-pulse 1.6s ease-in-out infinite;
}
@keyframes nx-bubble-pulse {
  0%,
  100% {
    box-shadow: 0 0 0 0 color-mix(in oklab, var(--primary) 35%, transparent);
  }
  50% {
    box-shadow: 0 0 0 8px transparent;
  }
}

.nx-modal-root {
  position: fixed;
  inset: 0;
  z-index: 1000;
  font-family: var(--font-sans);
}

.nx-modal-backdrop {
  position: absolute;
  inset: 0;
  background:
    radial-gradient(
      120% 80% at 50% 30%,
      color-mix(in oklab, var(--primary) 12%, transparent),
      transparent 55%
    ),
    radial-gradient(
      140% 100% at 50% 50%,
      rgba(11, 16, 32, 0.18),
      rgba(11, 16, 32, 0.55) 75%
    );
  backdrop-filter: blur(10px) saturate(160%);
  -webkit-backdrop-filter: blur(10px) saturate(160%);
  will-change: opacity;
}
.nx-modal-backdrop-enter {
  transition: opacity 0.22s ease-out;
}
.nx-modal-backdrop-enter-start {
  opacity: 0;
}
.nx-modal-backdrop-enter-end {
  opacity: 1;
}
.nx-modal-backdrop-leave {
  transition: opacity 0.18s ease-in;
}
.nx-modal-backdrop-leave-start {
  opacity: 1;
}
.nx-modal-backdrop-leave-end {
  opacity: 0;
}

.nx-modal-wrap {
  position: relative;
  z-index: 1;
  display: flex;
  align-items: safe center;
  justify-content: center;
  height: 100vh;
  height: 100dvh;
  padding: 24px 16px;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
}

.nx-modal-panel {
  position: relative;
  width: 100%;
  background: var(--surface);
  color: var(--ink);
  border-radius: 18px;
  box-shadow:
    0 24px 60px rgba(0, 0, 0, 0.18),
    0 4px 12px rgba(0, 0, 0, 0.08),
    0 0 0 1px color-mix(in oklab, var(--line) 70%, transparent),
    inset 0 1px 0 rgba(255, 255, 255, 0.7);
  overflow: hidden;
  text-align: left;
  will-change: transform, opacity;
}

.nx-modal-panel::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 1px;
  background: linear-gradient(
    90deg,
    transparent,
    rgba(255, 255, 255, 0.9) 40%,
    rgba(255, 255, 255, 0.9) 60%,
    transparent
  );
  pointer-events: none;
  z-index: 2;
}
.nx-modal-panel-enter {
  transition:
    opacity 0.28s ease-out,
    transform 0.28s cubic-bezier(0.34, 1.3, 0.4, 1);
}
.nx-modal-panel-enter-start {
  opacity: 0;
  transform: translateY(12px) scale(0.96);
}
.nx-modal-panel-enter-end {
  opacity: 1;
  transform: translateY(0) scale(1);
}
.nx-modal-panel-leave {
  transition:
    opacity 0.18s ease-in,
    transform 0.18s ease-in;
}
.nx-modal-panel-leave-start {
  opacity: 1;
  transform: translateY(0) scale(1);
}
.nx-modal-panel-leave-end {
  opacity: 0;
  transform: translateY(8px) scale(0.98);
}

[data-palette="dark"] .nx-modal-panel {
  background: color-mix(in oklab, var(--surface) 92%, white);
  box-shadow:
    0 24px 60px rgba(0, 0, 0, 0.55),
    0 6px 18px rgba(0, 0, 0, 0.4),
    0 0 0 1px rgba(255, 255, 255, 0.14),
    inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
[data-palette="dark"] .nx-modal-panel::before {
  background: linear-gradient(
    90deg,
    transparent,
    rgba(255, 255, 255, 0.18) 40%,
    rgba(255, 255, 255, 0.18) 60%,
    transparent
  );
}
[data-palette="dark"] .nx-modal-backdrop {
  background:
    radial-gradient(
      120% 80% at 50% 30%,
      color-mix(in oklab, var(--primary) 18%, transparent),
      transparent 55%
    ),
    radial-gradient(
      140% 100% at 50% 50%,
      rgba(0, 0, 0, 0.35),
      rgba(0, 0, 0, 0.75) 75%
    );
}

.nx-wizard {
  font-family: var(--font-sans);
  color: var(--ink);
}

.nx-overlay-head {
  position: relative;
  padding: 22px 24px 18px;
  overflow: hidden;
  border-bottom: 1px solid color-mix(in oklab, var(--line) 70%, transparent);
}
/* Compact header (CRUD / form modals): no eyebrow row, so trim the top/bottom
   padding that was sized to host the pill, and float the close button to the
   content's top-right corner. The button is a direct child of
   .nx-overlay-head-content (position: relative), so top/right anchor cleanly. */
.nx-overlay-head-compact {
  padding: 14px 24px 16px;
}
.nx-overlay-head-compact .nx-overlay-close {
  position: absolute;
  top: 0;
  right: 0;
  z-index: 2;
}
.nx-overlay-head-bg {
  position: absolute;
  inset: 0;
  background:
    radial-gradient(
      600px 200px at -10% -30%,
      color-mix(in oklab, var(--primary) 18%, transparent),
      transparent 60%
    ),
    radial-gradient(
      400px 180px at 110% -30%,
      color-mix(in oklab, var(--primary-deep) 16%, transparent),
      transparent 65%
    ),
    linear-gradient(
      180deg,
      color-mix(in oklab, var(--primary-tint) 80%, var(--surface)) 0%,
      var(--surface) 100%
    );
  pointer-events: none;
}
.nx-overlay-head-content {
  position: relative;
}
.nx-overlay-head-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 10px;
}
.nx-overlay-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-size: 0.65625rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--primary-deep);
  background: color-mix(in oklab, var(--primary-soft) 70%, transparent);
  padding: 4px 9px;
  border-radius: 999px;
  box-shadow: inset 0 0 0 1px
    color-mix(in oklab, var(--primary-soft) 80%, transparent);
}
.nx-overlay-close {
  appearance: none;
  width: 32px;
  height: 32px;
  border-radius: 8px;
  background: color-mix(in oklab, var(--surface) 70%, var(--bg-2));
  color: var(--ink-2);
  display: grid;
  place-items: center;
  cursor: pointer;
  box-shadow:
    inset 0 0 0 1px color-mix(in oklab, var(--line) 80%, transparent),
    0 1px 2px rgba(43, 57, 72, 0.06);
  transition:
    background-color 0.15s,
    color 0.15s,
    box-shadow 0.15s,
    transform 0.2s ease-out;
}
.nx-overlay-close:hover {
  background: var(--surface);
  color: var(--ink);
  transform: scale(1.15);
  box-shadow:
    inset 0 0 0 1px color-mix(in oklab, var(--line-2) 90%, transparent),
    0 4px 10px rgba(43, 57, 72, 0.12);
}
.nx-overlay-close:active {
  transform: scale(1.05);
}
.nx-overlay-title {
  font-size: 1.375rem;
  font-weight: 600;
  letter-spacing: -0.02em;
  margin: 0;
  line-height: 1.15;
}
.nx-overlay-sub {
  font-size: 0.78125rem;
  color: var(--ink-3);
  margin: 4px 0 18px;
}

.nx-wizard-stepper {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: nowrap;
}
.nx-wizard-step {
  appearance: none;
  background: transparent;
  border: none;
  padding: 4px 6px 4px 4px;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  border-radius: 8px;
  cursor: pointer;
  color: var(--ink-3);
  transition:
    color 0.15s,
    background-color 0.15s;
}
.nx-wizard-step:disabled {
  cursor: not-allowed;
  opacity: 0.6;
}
.nx-wizard-step.is-active {
  color: var(--primary-deep);
  font-weight: 600;
}
.nx-wizard-step.is-done {
  color: var(--ok);
}
.nx-wizard-step.is-active:not(:disabled):hover,
.nx-wizard-step.is-done:not(:disabled):hover {
  background: color-mix(in oklab, var(--primary-tint) 80%, transparent);
}
.nx-wizard-step-dot {
  width: 22px;
  height: 22px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  font-size: 0.6875rem;
  font-weight: 600;
  background: var(--surface);
  color: var(--ink-3);
  box-shadow: inset 0 0 0 1.5px var(--line-2);
  transition: all 0.2s ease-out;
}
.nx-wizard-step.is-active .nx-wizard-step-dot {
  background: var(--primary);
  color: white;
  box-shadow:
    inset 0 0 0 1.5px var(--primary),
    0 2px 6px color-mix(in oklab, var(--primary) 35%, transparent);
  transform: scale(1.06);
}
.nx-wizard-step.is-done .nx-wizard-step-dot {
  background: var(--ok);
  color: white;
  box-shadow: inset 0 0 0 1.5px var(--ok);
}
.nx-wizard-step-label {
  font-size: 0.71875rem;
  letter-spacing: 0.01em;
}
.nx-wizard-step-bar {
  flex: 1;
  height: 1.5px;
  background: var(--line-2);
  border-radius: 1px;
  transition: background 0.2s ease-out;
  min-width: 12px;
}
.nx-wizard-step-bar.is-done {
  background: var(--ok);
}

.nx-wizard-body {
  padding: 22px 24px;
  min-height: 280px;
  transition: opacity 0.2s ease-out;
}
.nx-wizard-section-title {
  font-size: 0.96875rem;
  font-weight: 600;
  color: var(--ink);
  letter-spacing: -0.01em;
}
.nx-wizard-section-sub {
  font-size: 0.78125rem;
  color: var(--ink-3);
  margin: 2px 0 16px;
}
.nx-wizard-row {
  display: flex;
  gap: 12px;
  margin-top: 16px;
  flex-wrap: wrap;
}

.nx-wizard-cards {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
  gap: 10px;
}
.nx-wizard-card {
  appearance: none;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 12px;
  display: flex;
  align-items: center;
  gap: 12px;
  cursor: pointer;
  transition: all 0.15s ease-out;
  text-align: left;
  color: var(--ink);
  font-family: inherit;
  position: relative;
}
.nx-wizard-card:hover {
  border-color: var(--primary-soft);
  background: color-mix(in oklab, var(--surface) 92%, var(--primary-tint));
  transform: translateY(-1px);
  box-shadow: 0 2px 8px rgba(43, 57, 72, 0.06);
}
.nx-wizard-card.is-selected {
  border-color: var(--primary);
  background: color-mix(in oklab, var(--surface) 88%, var(--primary-tint));
  box-shadow:
    0 4px 12px color-mix(in oklab, var(--primary) 14%, transparent),
    inset 0 0 0 1px color-mix(in oklab, var(--primary-soft) 80%, transparent);
}
.nx-wizard-card-dot {
  width: 14px;
  height: 14px;
  border-radius: 50%;
  flex-shrink: 0;
  box-shadow:
    0 1px 2px rgba(43, 57, 72, 0.18),
    inset 0 1px 0 rgba(255, 255, 255, 0.18);
}
.nx-wizard-card-content {
  flex: 1;
  min-width: 0;
}
.nx-wizard-card-title {
  font-size: 0.8125rem;
  font-weight: 500;
}
.nx-wizard-card-meta {
  font-size: 0.6875rem;
  color: var(--ink-3);
  display: flex;
  align-items: center;
  gap: 4px;
  margin-top: 2px;
}
.nx-wizard-card-check {
  color: var(--primary);
  display: grid;
  place-items: center;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: var(--primary-tint);
}

.nx-wizard-pills {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}
.nx-wizard-pill {
  appearance: none;
  background: var(--surface);
  border: 1px solid var(--line);
  color: var(--ink-2);
  padding: 6px 12px;
  border-radius: 999px;
  font-size: 0.75rem;
  font-weight: 500;
  cursor: pointer;
  transition: all 0.12s ease-out;
  font-family: inherit;
}
.nx-wizard-pill:hover {
  border-color: var(--primary-soft);
  color: var(--ink);
  background: color-mix(in oklab, var(--surface) 95%, var(--primary-tint));
}
.nx-wizard-pill.is-selected {
  background: var(--primary);
  border-color: var(--primary);
  color: white;
  box-shadow: 0 2px 6px color-mix(in oklab, var(--primary) 30%, transparent);
}

.nx-wizard-toggle {
  display: inline-flex;
  background: var(--bg-2);
  border-radius: 10px;
  padding: 4px;
  gap: 2px;
}
.nx-wizard-toggle-opt {
  appearance: none;
  background: transparent;
  border: none;
  padding: 7px 14px;
  border-radius: 7px;
  font-size: 0.78125rem;
  color: var(--ink-2);
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: inherit;
  font-weight: 500;
  transition: all 0.15s ease-out;
}
.nx-wizard-toggle-opt:hover {
  color: var(--ink);
}
.nx-wizard-toggle-opt.is-selected {
  background: var(--surface);
  color: var(--ink);
  box-shadow: var(--shadow-sm);
}

.nx-wizard-search {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 12px;
  background: var(--bg);
  border: 1px solid var(--line);
  border-radius: 8px;
  transition: all 0.15s ease-out;
}
.nx-wizard-search:focus-within {
  background: var(--surface);
  border-color: color-mix(in oklab, var(--primary) 60%, transparent);
  box-shadow: 0 0 0 3px var(--primary-soft);
}
.nx-wizard-search > input {
  flex: 1;
  border: none;
  outline: none;
  background: transparent;
  font-size: 0.8125rem;
  color: var(--ink);
  font-family: inherit;
}
.nx-wizard-search > svg {
  color: var(--ink-3);
}

.nx-wizard-customer-list {
  margin-top: 12px;
  display: flex;
  flex-direction: column;
  gap: 6px;
  max-height: 280px;
  overflow-y: auto;
  padding-right: 4px;
}
.nx-wizard-customer {
  appearance: none;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 8px;
  padding: 10px 12px;
  display: flex;
  align-items: center;
  gap: 12px;
  cursor: pointer;
  transition: all 0.12s ease-out;
  text-align: left;
  color: var(--ink);
  font-family: inherit;
  width: 100%;
}
.nx-wizard-customer:hover {
  background: color-mix(in oklab, var(--surface) 92%, var(--primary-tint));
  border-color: var(--primary-soft);
}
.nx-wizard-customer.is-selected {
  border-color: var(--primary);
  background: color-mix(in oklab, var(--surface) 88%, var(--primary-tint));
}
.nx-wizard-customer-content {
  flex: 1;
  min-width: 0;
}
.nx-wizard-customer-name {
  font-size: 0.8125rem;
  font-weight: 500;
  display: flex;
  align-items: center;
  gap: 6px;
}
.nx-wizard-customer-meta {
  font-size: 0.6875rem;
  color: var(--ink-3);
  margin-top: 2px;
}
.nx-wizard-empty {
  padding: 24px;
  text-align: center;
  color: var(--ink-3);
  font-size: 0.78125rem;
  font-style: italic;
  background: var(--bg-2);
  border-radius: 8px;
  margin-top: 12px;
}

.nx-wizard-agents {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(72px, 1fr));
  gap: 8px;
}
.nx-wizard-agent {
  appearance: none;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 10px 6px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  cursor: pointer;
  transition: all 0.15s ease-out;
  font-family: inherit;
}
.nx-wizard-agent:hover {
  border-color: var(--primary-soft);
  transform: translateY(-1px);
  box-shadow: 0 2px 8px rgba(43, 57, 72, 0.06);
}
.nx-wizard-agent.is-selected {
  border-color: var(--primary);
  background: color-mix(in oklab, var(--surface) 88%, var(--primary-tint));
  box-shadow:
    0 4px 12px color-mix(in oklab, var(--primary) 14%, transparent),
    inset 0 0 0 1px color-mix(in oklab, var(--primary-soft) 80%, transparent);
}
.nx-wizard-agent-name {
  font-size: 0.6875rem;
  color: var(--ink-2);
}
.nx-wizard-agent.is-selected .nx-wizard-agent-name {
  color: var(--primary-deep);
  font-weight: 600;
}

.nx-wizard-summary {
  border: 1px dashed var(--line-2);
  border-radius: 10px;
  padding: 14px 16px;
  background: color-mix(in oklab, var(--bg-2) 50%, var(--surface));
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.nx-wizard-summary-row {
  display: grid;
  grid-template-columns: 110px 1fr;
  gap: 12px;
  align-items: center;
  font-size: 0.8125rem;
}
.nx-wizard-summary-row .lbl {
  font-size: 0.625rem;
  color: var(--ink-3);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-weight: 600;
}
.nx-wizard-summary-row .val {
  display: flex;
  align-items: center;
  gap: 8px;
  color: var(--ink);
  font-weight: 500;
}

.nx-wizard-toggles {
  margin-top: 16px;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
}
.nx-wizard-toggle-row {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  padding: 10px 12px;
  border: 1px solid var(--line);
  border-radius: 8px;
  cursor: pointer;
  transition: background-color 0.12s ease-out;
}
.nx-wizard-toggle-row:hover {
  background: var(--hover);
}
.nx-wizard-toggle-row input[type="checkbox"] {
  margin-top: 2px;
  accent-color: var(--primary);
  width: 16px;
  height: 16px;
}
.nx-wizard-toggle-text {
  display: flex;
  flex-direction: column;
  gap: 1px;
}
.nx-wizard-toggle-label {
  font-size: 0.78125rem;
  font-weight: 500;
  color: var(--ink);
}
.nx-wizard-toggle-hint {
  font-size: 0.6875rem;
  color: var(--ink-3);
}

.nx-wizard-foot {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 14px 24px;
  border-top: 1px solid color-mix(in oklab, var(--line) 70%, transparent);
  background: color-mix(in oklab, var(--bg-2) 40%, var(--surface));
}
.nx-wizard-foot-spacer {
  flex: 1;
}

.nx-modal-panel .btn {
  appearance: none;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 38px;
  padding: 0 16px;
  border: 1px solid var(--line);
  background: var(--surface);
  color: var(--ink);
  border-radius: var(--radius-sm);
  font-size: 0.8125rem;
  font-weight: 500;
  cursor: pointer;
  transition:
    background-color 0.15s,
    transform 0.1s,
    box-shadow 0.15s;
  font-family: inherit;
  line-height: 1;
  white-space: nowrap;
}
.nx-modal-panel .btn:hover {
  background: var(--hover);
  transform: translateY(-1px);
  box-shadow:
    0 1px 0 rgba(43, 57, 72, 0.04),
    0 4px 12px rgba(43, 57, 72, 0.1);
}
.nx-modal-panel .btn:active {
  transform: scale(0.97);
}
.nx-modal-panel .btn.ghost {
  border-color: transparent;
  background: transparent;
}
.nx-modal-panel .btn.ghost:hover {
  background: var(--hover);
}
.nx-modal-panel .btn.primary,
.nx-modal-panel .btn.accent {
  background: var(--primary);
  border-color: var(--primary);
  color: white;
  box-shadow:
    0 1px 0 rgba(0, 0, 0, 0.06),
    inset 0 1px 0 rgba(255, 255, 255, 0.18);
}
.nx-modal-panel .btn.primary:hover,
.nx-modal-panel .btn.accent:hover {
  background: var(--primary-deep);
  border-color: var(--primary-deep);
}
.nx-modal-panel .btn.danger {
  background: var(--nx-tall-poppy);
  border-color: var(--nx-tall-poppy);
  color: white;
  box-shadow:
    0 1px 0 rgba(0, 0, 0, 0.06),
    inset 0 1px 0 rgba(255, 255, 255, 0.18);
}
.nx-modal-panel .btn.danger:hover {
  background: color-mix(in oklab, var(--nx-tall-poppy) 85%, black);
  border-color: color-mix(in oklab, var(--nx-tall-poppy) 85%, black);
}

.nx-modal-panel .field {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.nx-modal-panel .field .lbl {
  font-size: 0.625rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-3);
  font-weight: 600;
}
.nx-modal-panel .field .val {
  font-size: 0.8125rem;
  color: var(--ink);
}
/* Modal-scoped input styling. Targets nexcalia's own .nx-input-control class
   only — NOT bare input[type="text"]/textarea — so non-nexcalia inputs
   (e.g. caller-side Tailwind-utility inputs) inside a modal keep their own
   padding/border/utility classes and are not silently clobbered by a
   higher-specificity descendant selector. */
.nx-modal-panel .nx-input-control,
.nx-modal-panel textarea.nx-input-control {
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  background: var(--surface);
  padding: 8px 12px;
  font-size: 0.8125rem;
  height: 36px;
  color: var(--ink);
  font-family: inherit;
  transition:
    border-color 0.15s,
    box-shadow 0.15s,
    background-color 0.15s;
  outline: none;
}
.nx-modal-panel textarea.nx-input-control {
  height: auto;
  min-height: 64px;
}
/* Champs « nus » d'une modale : le contrôle EST l'élément visible, il porte donc
   lui-même l'anneau de focus. */
.nx-modal-panel .nx-input-control:focus,
.nx-modal-panel textarea.nx-input-control:focus {
  border-color: color-mix(in oklab, var(--primary) 60%, transparent);
  box-shadow: 0 0 0 3px var(--primary-soft);
}
/* Champs montés via <x-nexcalia.input> : le contrôle est transparent dans un
   shell .nx-input qui porte bordure et anneau (:focus-within, plus bas). Lui
   redonner un anneau dessinerait une seconde boîte à l'intérieur du shell. */
.nx-modal-panel .nx-input .nx-input-control:focus,
.nx-modal-panel .nx-input textarea.nx-input-control:focus {
  border-color: transparent;
  box-shadow: none;
}
.nx-modal-panel .grid-2 {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
}

.nx-modal-panel .pill {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 2px 8px;
  border-radius: 999px;
  font-size: 0.6875rem;
  font-weight: 500;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  border: 1px solid transparent;
}
.nx-modal-panel .pill .d {
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: currentColor;
}
.nx-modal-panel .pill.ok {
  background: var(--ok-soft);
  color: var(--ok-deep);
}
.nx-modal-panel .pill.warn {
  background: var(--warn-soft);
  color: var(--warn);
}
.nx-modal-panel .pill.info {
  background: var(--info-soft);
  color: var(--info);
}
.nx-modal-panel .pill.danger {
  background: var(--danger-soft);
  color: var(--danger);
}
.nx-modal-panel .pill.neutral {
  background: var(--neutral-soft);
  color: var(--ink-2);
}
.nx-modal-panel .pill.accent {
  background: var(--primary-soft);
  color: var(--primary-deep);
}
.nx-modal-panel .pill.outline {
  background: var(--neutral-soft);
  border-color: transparent;
  color: var(--ink-2);
}

.nx-modal-panel .avatar-sm {
  border-radius: 50%;
  display: grid;
  place-items: center;
  font-weight: 600;
  color: white;
  flex-shrink: 0;
}

.nx-savebar-wrap {
  position: fixed;
  bottom: 12px;
  left: 0;
  right: 0;
  margin: 0 auto;

  z-index: 9999;
  width: min(680px, calc(100vw - 24px));
  pointer-events: none;
}
.nx-savebar {
  pointer-events: auto;
  position: relative;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  min-height: 56px;
  padding: 10px 10px 10px 16px;
  border-radius: 14px;
  overflow: hidden;
  background: linear-gradient(
    90deg,
    color-mix(in oklab, var(--primary) 95%, transparent),
    var(--primary)
  );
  backdrop-filter: blur(4px);
  box-shadow:
    0 12px 32px rgba(11, 16, 32, 0.28),
    0 4px 12px rgba(11, 16, 32, 0.16),
    inset 0 1px 0 rgba(255, 255, 255, 0.18);
  color: white;
}

.nx-savebar::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(
    180deg,
    rgba(255, 255, 255, 0.2) 0%,
    transparent 50%
  );
  pointer-events: none;
}
.nx-savebar-content {
  position: relative;
  flex: 1;
  display: flex;
  align-items: center;
  gap: 12px;
  min-width: 0;
}
.nx-savebar-icon {
  width: 30px;
  height: 30px;
  flex-shrink: 0;
}
.nx-savebar-text {
  display: flex;
  flex-direction: column;
  gap: 1px;
  min-width: 0;
}
.nx-savebar-message {
  font-size: 0.84375rem;
  font-weight: 500;
  color: white;
  line-height: 1.25;
}
.nx-savebar-description {
  font-size: 0.71875rem;
  color: rgba(255, 255, 255, 0.75);
}
.nx-savebar-actions {
  position: relative;
  display: flex;
  align-items: center;
  gap: 8px;
  flex-shrink: 0;
}

.nx-savebar .nx-savebar-actions .btn {
  height: 34px !important;
  padding: 0 14px !important;
  font-size: 0.78125rem !important;
  border-radius: var(--radius-sm) !important;
  transition:
    background-color 0.15s,
    color 0.15s,
    transform 0.15s,
    box-shadow 0.15s !important;
}
.nx-savebar .nx-savebar-actions .btn.nx-savebar-ghost {
  background: rgba(255, 255, 255, 0.14) !important;
  color: white !important;
  border-color: transparent !important;
  box-shadow: none !important;
}
.nx-savebar .nx-savebar-actions .btn.nx-savebar-ghost:hover {
  background: rgba(255, 255, 255, 0.24) !important;
  transform: translateY(-1px) !important;
}
.nx-savebar .nx-savebar-actions .btn.nx-savebar-primary {
  background: white !important;
  color: var(--primary-deep) !important;
  border-color: white !important;
  font-weight: 600 !important;
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.18) !important;
}
.nx-savebar .nx-savebar-actions .btn.nx-savebar-primary:hover {
  background: rgba(255, 255, 255, 0.94) !important;
  border-color: rgba(255, 255, 255, 0.94) !important;
  transform: translateY(-1px) !important;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.22) !important;
}

@media (max-width: 480px) {
  .nx-savebar .nx-savebar-actions .btn.nx-savebar-ghost {
    display: none;
  }
  .nx-savebar {
    padding-left: 12px;
  }
}

.nx-ds-savebar-preview {
  margin-top: 12px;
  padding: 24px;
  background: var(--bg-2);
  border-radius: var(--radius);
  border: 1px dashed var(--line-2);
  display: flex;
  align-items: center;
  justify-content: center;
}

.nexcalia-app .nx-settings {
  display: grid;
  grid-template-columns: 232px 1fr;
  gap: 24px;
  min-height: 0;
  flex: 1;
  overflow: hidden;
}
.nexcalia-app .nx-settings-nav {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 4px 0;
  overflow-y: auto;
}
.nexcalia-app .nx-settings-nav-item {
  appearance: none;
  border: 0;
  background: transparent;
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 9px 12px;
  border-radius: var(--radius-sm);
  color: var(--ink-2);
  font-size: 0.8125rem;
  font-family: inherit;
  cursor: pointer;
  text-align: left;
  transition:
    background-color 0.15s,
    color 0.15s,
    transform 0.12s;
}
.nexcalia-app .nx-settings-nav-item:hover {
  background: var(--hover);
  color: var(--ink);
}
.nexcalia-app .nx-settings-nav-item.is-active {
  background: var(--surface);
  color: var(--ink);
  font-weight: 600;
  box-shadow:
    0 1px 0 rgba(43, 57, 72, 0.05),
    0 1px 2px rgba(43, 57, 72, 0.04);
}
.nexcalia-app .nx-settings-nav-item.is-active svg {
  color: var(--primary);
}
.nexcalia-app .nx-settings-nav-item .lbl {
  flex: 1;
}
.nexcalia-app .nx-settings-nav-item .count {
  font-size: 0.6875rem;
  font-variant-numeric: tabular-nums;
  color: var(--ink-3);
  background: var(--bg-2);
  padding: 2px 8px;
  border-radius: 999px;
  font-weight: 500;
}
.nexcalia-app .nx-settings-nav-item.is-active .count {
  background: var(--primary-soft);
  color: var(--primary-deep);
}
.nexcalia-app .nx-settings-content {
  min-width: 0;
  overflow-y: auto;

  padding: 4px 4px 0 0;
}

@media (max-width: 900px) {
  .nexcalia-app .nx-settings {
    grid-template-columns: 1fr;
  }
  .nexcalia-app .nx-settings-nav {
    flex-direction: row;
    overflow-x: auto;
    gap: 4px;
    padding-bottom: 8px;
    border-bottom: 1px solid var(--line);
  }
  .nexcalia-app .nx-settings-nav-item {
    flex-shrink: 0;
  }
}

.nexcalia-app .nx-settings-section {
  display: flex;
  flex-direction: column;
  gap: 12px;
  margin-bottom: 24px;
}
.nexcalia-app .nx-settings-section-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding-bottom: 10px;
  border-bottom: 1px solid color-mix(in oklab, var(--line) 70%, transparent);
}
.nexcalia-app .nx-settings-section-title {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 1.0625rem;
  font-weight: 600;
  color: var(--ink);
  letter-spacing: -0.01em;
}
.nexcalia-app .nx-settings-section-title svg {
  color: var(--primary);
}
.nexcalia-app .nx-settings-section-count {
  font-size: 0.6875rem;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  color: var(--primary-deep);
  background: var(--primary-soft);
  padding: 2px 8px;
  border-radius: 999px;
}
.nexcalia-app .nx-settings-section-actions {
  display: flex;
  align-items: center;
  gap: 6px;
}

.nexcalia-app .nx-resource-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.nexcalia-app .nx-resource-row {
  position: relative;
  overflow: hidden;
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 12px 14px;
  background: var(--surface);
  border: 1px solid color-mix(in oklab, var(--line) 70%, transparent);
  border-radius: var(--radius);
  transition:
    border-color 0.15s,
    box-shadow 0.15s,
    transform 0.12s;
}

.nexcalia-app .nx-resource-row::before {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(
    360px 200px at calc(var(--nx-mx, 50) * 1%) 25%,
    color-mix(in oklab, var(--primary) 16%, transparent),
    transparent 70%
  );
  opacity: 0;
  transition: opacity 0.25s ease-out;
  pointer-events: none;
}
.nexcalia-app .nx-resource-row:hover::before {
  opacity: 1;
}

.nexcalia-app .nx-resource-row:has(.icon-btn:hover)::before {
  opacity: 0;
}
.nexcalia-app .nx-resource-row:hover {
  border-color: color-mix(in oklab, var(--primary) 30%, var(--line));
  box-shadow:
    0 1px 0 rgba(43, 57, 72, 0.04),
    0 4px 12px rgba(43, 57, 72, 0.08);
}

.nexcalia-app .nx-resource-row > * {
  position: relative;
}

.nexcalia-app .nx-resource-marker {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  flex-shrink: 0;
  background: var(--bg-2);
}
.nexcalia-app .nx-resource-marker-empty {
  background: transparent;
}
.nexcalia-app .nx-resource-avatar-img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: 50%;
}
.nexcalia-app .nx-resource-silhouette {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: color-mix(in oklab, var(--ink-3) 60%, var(--surface));
  color: var(--surface);
  display: grid;
  place-items: center;
}
.nexcalia-app .nx-resource-icon {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  background: var(--bg-2);
  color: var(--ink-2);
}
.nexcalia-app .nx-resource-icon.tone-ok {
  background: color-mix(in oklab, var(--nx-puertorico) 20%, transparent);
  color: var(--nx-puertorico);
}
.nexcalia-app .nx-resource-icon.tone-info {
  background: color-mix(in oklab, var(--info) 20%, transparent);
  color: var(--info);
}
.nexcalia-app .nx-resource-icon.tone-warn {
  background: color-mix(in oklab, var(--warn) 20%, transparent);
  color: var(--warn);
}
.nexcalia-app .nx-resource-icon.tone-danger {
  background: color-mix(in oklab, var(--nx-tall-poppy) 20%, transparent);
  color: var(--nx-tall-poppy);
}
.nexcalia-app .nx-resource-icon.tone-accent {
  background: var(--primary-soft);
  color: var(--primary-deep);
}

.nexcalia-app .nx-resource-info {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.nexcalia-app .nx-resource-name {
  font-weight: 600;
  color: var(--ink);
  font-size: 0.875rem;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.nexcalia-app .nx-resource-meta {
  font-size: 0.75rem;
  color: var(--ink-3);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.nexcalia-app .nx-resource-pill-wrap {
  margin-top: 4px;
}

.nexcalia-app .nx-resource-pill-wrap .pill {
  font-size: 0.6875rem;
  padding: 1px 8px;
  font-weight: 600;
  letter-spacing: 0.02em;
}

.nexcalia-app .nx-resource-pill-wrap .pill.ok {
  color: var(--ok-deep);
}

.nexcalia-app .nx-resource-actions {
  display: flex;
  align-items: center;
  gap: 4px;
  flex-shrink: 0;
}
.nexcalia-app .nx-resource-action-danger:hover {
  background: color-mix(
    in oklab,
    var(--nx-tall-poppy) 14%,
    var(--surface)
  ) !important;
  color: var(--nx-tall-poppy) !important;
  border-color: color-mix(
    in oklab,
    var(--nx-tall-poppy) 45%,
    var(--line)
  ) !important;
}

@media (max-width: 640px) {
  .nexcalia-app .nx-resource-row {
    grid-template-columns: 40px 1fr;
    grid-template-rows: auto auto;
  }
  .nexcalia-app .nx-resource-actions {
    grid-column: 1 / -1;
    justify-content: flex-end;
  }
}

.nx-simple-modal {
  display: flex;
  flex-direction: column;
  color: var(--ink);
}
.nx-simple-modal-body {
  padding: 18px 24px 20px;
  font-size: 0.875rem;
  line-height: 1.55;
  color: var(--ink-2);
  background: var(--surface);
}
/* Opt-in : rythme vertical régulier entre les blocs du corps (champs, alertes,
   encarts). Non appliqué par défaut, le corps par défaut laissant chaque
   contenu gérer ses propres marges. */
.nx-simple-modal-body.nx-stack {
  display: grid;
  gap: var(--nx-stack-gap, 18px);
  align-content: start;
}
.nx-simple-modal-foot {
  display: flex;
  gap: 8px;
  align-items: center;
  justify-content: flex-end;
  padding: 12px 18px;
  border-top: 1px solid var(--line);
  background: color-mix(in oklab, var(--bg-2) 40%, var(--surface));
}

.nx-dropdown {
  position: relative;
  display: inline-flex;
}

.nx-dropdown .icon-btn.is-open {
  background: var(--hover) !important;
  color: var(--ink) !important;
  box-shadow:
    inset 0 0 0 1px color-mix(in oklab, var(--primary) 35%, var(--line)),
    0 0 0 3px var(--primary-soft) !important;
}

.nx-dropdown-menu {
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  /* Z-index élevé en défense secondaire. Le fix principal pour les hôtes
     qui imposent leur stacking context (FullCalendar, modaux, etc.) est
     que les consommateurs comme <x-nexcalia.split-button> téléportent
     le menu au <body> via x-teleport. */
  z-index: 9999;
  isolation: isolate;
  min-width: 240px;
  padding: 8px;
  background: var(--surface);
  color: var(--ink);
  border-radius: 12px;
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.6) inset,
    0 18px 40px rgba(43, 57, 72, 0.16),
    0 4px 12px rgba(43, 57, 72, 0.08),
    0 0 0 1px color-mix(in oklab, var(--line) 80%, transparent);
  overflow: hidden;
}
.nx-dropdown-menu.nx-dropdown-align-left {
  left: 0;
  right: auto;
}
.nx-dropdown-trigger-slot {
  display: inline-flex;
  cursor: pointer;
}
.nx-dropdown-trigger-slot.is-open .btn {
  background: var(--hover);
}

.nx-dropdown-menu::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 1px;
  background: linear-gradient(
    90deg,
    transparent,
    rgba(255, 255, 255, 0.9) 40%,
    rgba(255, 255, 255, 0.9) 60%,
    transparent
  );
  pointer-events: none;
}

.nx-dropdown-menu::after {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(
    140px 80px at 20% 0%,
    color-mix(in oklab, var(--primary) 10%, transparent),
    transparent 70%
  );
  pointer-events: none;
}
.nx-dropdown-menu > * {
  position: relative;
  z-index: 1;
}

.nx-dropdown-header {
  font-size: 0.625rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--ink-3);
  padding: 6px 10px 4px;
  font-weight: 600;
}
.nx-dropdown-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 10px;
  font-size: 0.8125rem;
  color: var(--ink-2);
  border-radius: 6px;
  text-decoration: none;
  cursor: pointer;
  transition:
    background-color 0.12s ease-out,
    color 0.12s ease-out;
}
.nx-dropdown-item .ico {
  color: var(--ink-3);
  display: grid;
  place-items: center;
  flex-shrink: 0;
  transition: color 0.12s;
}
.nx-dropdown-item:hover,
.nx-dropdown-item:focus-visible {
  background: color-mix(in oklab, var(--primary-soft) 45%, var(--surface));
  color: var(--ink);
  outline: none;
}
.nx-dropdown-item:focus-visible {
  box-shadow: inset 0 0 0 1.5px
    color-mix(in oklab, var(--primary) 70%, transparent);
}
.nx-dropdown-item:hover .ico,
.nx-dropdown-item:focus-visible .ico {
  color: var(--primary);
}
.nx-dropdown-item .lbl {
  flex: 1;
}
.nx-dropdown-sep {
  height: 1px;
  background: color-mix(in oklab, var(--line) 70%, transparent);
  margin: 6px -8px;
}
.nx-dropdown-item-danger {
  color: var(--nx-tall-poppy);
}
.nx-dropdown-item-danger .ico {
  color: var(--nx-tall-poppy);
}
.nx-dropdown-item-danger:hover,
.nx-dropdown-item-danger:focus-visible {
  background: color-mix(in oklab, var(--nx-tall-poppy) 10%, var(--surface));
  color: var(--nx-tall-poppy);
}
.nx-dropdown-item-danger:focus-visible {
  box-shadow: inset 0 0 0 1.5px
    color-mix(in oklab, var(--nx-tall-poppy) 70%, transparent);
}

.nx-dropdown-enter {
  transition:
    opacity 0.18s ease-out,
    transform 0.22s cubic-bezier(0.34, 1.3, 0.4, 1);
}
.nx-dropdown-enter-start {
  opacity: 0;
  transform: translateY(-6px) scale(0.96);
}
.nx-dropdown-enter-end {
  opacity: 1;
  transform: translateY(0) scale(1);
}
.nx-dropdown-leave {
  transition:
    opacity 0.12s ease-in,
    transform 0.12s ease-in;
}
.nx-dropdown-leave-start {
  opacity: 1;
  transform: translateY(0) scale(1);
}
.nx-dropdown-leave-end {
  opacity: 0;
  transform: translateY(-4px) scale(0.98);
}

[data-palette="dark"] .nx-dropdown-menu {
  background: color-mix(in oklab, var(--surface) 92%, white);
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.08) inset,
    0 18px 40px rgba(0, 0, 0, 0.55),
    0 4px 12px rgba(0, 0, 0, 0.35),
    0 0 0 1px rgba(255, 255, 255, 0.12);
}
[data-palette="dark"] .nx-dropdown-menu::before {
  background: linear-gradient(
    90deg,
    transparent,
    rgba(255, 255, 255, 0.18) 40%,
    rgba(255, 255, 255, 0.18) 60%,
    transparent
  );
}

.nexcalia-app .nx-version-badge {
  margin-left: auto;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 2px 8px;
  font-size: 0.625rem;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-3);
  text-decoration: none;
  border-radius: 999px;
  background: transparent;
  transition:
    color 0.18s ease-out,
    background-color 0.18s ease-out,
    box-shadow 0.18s ease-out,
    transform 0.18s ease-out;
}
.nexcalia-app .nx-version-badge:hover {
  color: var(--primary-deep);
  background: color-mix(in oklab, var(--primary) 12%, var(--surface));
  box-shadow:
    0 1px 0 rgba(43, 57, 72, 0.04),
    0 4px 12px color-mix(in oklab, var(--primary) 18%, transparent),
    inset 0 0 0 1px color-mix(in oklab, var(--primary) 30%, transparent);
  transform: translateY(-1px);
}
.nexcalia-app .nx-version-lbl {
  display: inline-flex;
  align-items: center;
}
.nexcalia-app .nx-version-arrow {
  display: inline-flex;
  align-items: center;
  width: 12px;
  opacity: 0;
  overflow: hidden;
  transform: translateX(-12px) scaleX(0);
  transform-origin: left center;
  transition:
    transform 0.18s ease-out,
    opacity 0.18s ease-out;
}
.nexcalia-app .nx-version-badge:hover .nx-version-arrow {
  opacity: 1;
  transform: translateX(0) scaleX(1);
}

.nexcalia-app .nx-field {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.nexcalia-app .nx-field-label {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 8px;
  font-size: 0.78125rem;
  font-weight: 600;
  color: var(--ink);
  cursor: default;
}
.nexcalia-app .nx-field-label .lbl {
  display: inline-flex;
  align-items: center;
  gap: 4px;
}
.nexcalia-app .nx-field-label .req {
  color: var(--primary);
  margin-left: 2px;
}
.nexcalia-app .nx-field-label .hint {
  font-size: 0.6875rem;
  font-weight: 500;
  color: var(--ink-3);
  text-transform: uppercase;
  letter-spacing: 0.06em;
}
.nexcalia-app .nx-field-help {
  font-size: 0.6875rem;
  color: var(--ink-3);
  line-height: 1.4;
}
/* --danger, pas --nx-tall-poppy : identiques en palette claire, mais en sombre
   le rouge de marque (#B22A36) devient illisible sur --surface. */
.nexcalia-app .nx-field-error {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-size: 0.6875rem;
  font-weight: 500;
  color: var(--danger);
  line-height: 1.3;
}

.nexcalia-app .nx-input {
  position: relative;
  display: flex;
  align-items: stretch;
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  background: var(--surface);
  transition:
    border-color 0.15s ease-out,
    box-shadow 0.15s ease-out,
    background-color 0.15s ease-out;
}
.nexcalia-app .nx-input:hover {
  border-color: color-mix(in oklab, var(--primary) 25%, var(--line));
}
.nexcalia-app .nx-input:focus-within {
  border-color: color-mix(in oklab, var(--primary) 70%, transparent);
  box-shadow: 0 0 0 3px var(--primary-soft);
}
.nexcalia-app .nx-input.is-invalid {
  border-color: color-mix(in oklab, var(--danger) 60%, var(--line));
}
.nexcalia-app .nx-input.is-invalid:focus-within {
  box-shadow: 0 0 0 3px color-mix(in oklab, var(--danger) 18%, transparent);
}

.nexcalia-app .nx-input-control {
  flex: 1;
  border: 0;
  background: transparent;
  color: var(--ink);
  font-family: inherit;
  font-size: 0.875rem;
  padding: 8px 12px;
  outline: none;
  min-width: 0;
  width: 100%;
}
.nexcalia-app .nx-input-control::placeholder {
  color: var(--ink-3);
}
.nexcalia-app .nx-input-control:disabled,
.nexcalia-app .nx-input-control[readonly] {
  color: var(--ink-3);
  cursor: not-allowed;
  background: var(--bg-2);
}
.nexcalia-app .nx-input-sm .nx-input-control {
  padding: 5px 10px;
  font-size: 0.8125rem;
}
.nexcalia-app .nx-input-md .nx-input-control {
  padding: 8px 12px;
  font-size: 0.875rem;
}
.nexcalia-app .nx-input-lg .nx-input-control {
  padding: 10px 14px;
  font-size: 0.9375rem;
}

.nexcalia-app .nx-input-icon,
.nexcalia-app .nx-input-action {
  display: inline-flex;
  align-items: center;
  color: var(--ink-3);
  flex-shrink: 0;
}
.nexcalia-app .nx-input-icon {
  padding-left: 10px;
}
.nexcalia-app .nx-input.has-icon .nx-input-control {
  padding-left: 6px;
}
.nexcalia-app .nx-input-action {
  padding-right: 4px;
  gap: 4px;
}
.nexcalia-app .nx-input.has-action .nx-input-control {
  padding-right: 4px;
}

.nexcalia-app .nx-textarea {
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  background: var(--surface);
  color: var(--ink);
  font-family: inherit;
  font-size: 0.875rem;
  padding: 8px 12px;
  line-height: 1.5;
  resize: vertical;
  min-height: 64px;
  transition:
    border-color 0.15s,
    box-shadow 0.15s;
  outline: none;
  width: 100%;
}
.nexcalia-app .nx-textarea:hover {
  border-color: color-mix(in oklab, var(--primary) 25%, var(--line));
}
.nexcalia-app .nx-textarea:focus {
  border-color: color-mix(in oklab, var(--primary) 70%, transparent);
  box-shadow: 0 0 0 3px var(--primary-soft);
}
.nexcalia-app .nx-textarea.is-invalid {
  border-color: color-mix(in oklab, var(--nx-tall-poppy) 60%, var(--line));
}

.nexcalia-app .nx-select {
  position: relative;
}
.nexcalia-app .nx-select .nx-input-control {
  appearance: none;
  -webkit-appearance: none;
  background: transparent;
  padding-right: 32px;
  cursor: pointer;
}
.nexcalia-app .nx-select-chevron {
  position: absolute;
  right: 10px;
  top: 50%;
  transform: translateY(-50%);
  pointer-events: none;
  color: var(--ink-3);
}

.nexcalia-app .nx-checkbox {
  display: inline-flex;
  align-items: flex-start;
  gap: 10px;
  cursor: pointer;
  user-select: none;
}
.nexcalia-app .nx-checkbox-input {
  position: absolute;
  opacity: 0;
  pointer-events: none;
  width: 0;
  height: 0;
}
.nexcalia-app .nx-checkbox-box {
  flex-shrink: 0;
  width: 18px;
  height: 18px;
  border: 1.5px solid var(--line-2);
  border-radius: 4px;
  background: var(--surface);
  display: grid;
  place-items: center;
  color: transparent;
  transition:
    background-color 0.15s,
    border-color 0.15s,
    color 0.15s,
    box-shadow 0.15s,
    transform 0.12s;
  margin-top: 1px;
}
/* Single-line checkboxes (no description) center the box with the label.
   The flex-start default + box margin-top stay for the label+description case,
   where the box must align to the first line. */
.nexcalia-app .nx-checkbox:not(:has(.nx-checkbox-hint)) {
  align-items: center;
}
.nexcalia-app .nx-checkbox:not(:has(.nx-checkbox-hint)) .nx-checkbox-box {
  margin-top: 0;
}
.nexcalia-app .nx-checkbox:hover .nx-checkbox-box {
  border-color: color-mix(in oklab, var(--primary) 40%, var(--line));
}
.nexcalia-app .nx-checkbox-input:focus-visible + .nx-checkbox-box {
  box-shadow: 0 0 0 3px var(--primary-soft);
}
.nexcalia-app .nx-checkbox-input:checked + .nx-checkbox-box {
  background: var(--primary);
  border-color: var(--primary);
  color: white;
}
.nexcalia-app .nx-checkbox.is-invalid .nx-checkbox-box {
  border-color: var(--nx-tall-poppy);
}
.nexcalia-app .nx-checkbox-text {
  display: flex;
  flex-direction: column;
  gap: 1px;
}
.nexcalia-app .nx-checkbox-label {
  font-size: 0.8125rem;
  color: var(--ink);
}
.nexcalia-app .nx-checkbox-hint {
  font-size: 0.6875rem;
  color: var(--ink-3);
}

.nexcalia-app .nx-toggle {
  display: inline-flex;
  align-items: flex-start;
  gap: 10px;
  cursor: pointer;
  user-select: none;
  min-height: 24px;
}
.nexcalia-app .nx-toggle-input {
  position: absolute;
  opacity: 0;
  pointer-events: none;
  width: 0;
  height: 0;
}
.nexcalia-app .nx-toggle-track {
  flex-shrink: 0;
  width: 34px;
  height: 20px;
  border-radius: 999px;
  background: color-mix(in oklab, var(--ink-3) 30%, var(--surface-2));
  position: relative;
  transition:
    background-color 0.2s ease-out,
    box-shadow 0.15s;
  margin-top: 2px;
}
.nexcalia-app .nx-toggle-thumb {
  position: absolute;
  top: 2px;
  left: 2px;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: var(--surface);
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.18);
  transition: transform 0.22s cubic-bezier(0.34, 1.3, 0.4, 1);
}
.nexcalia-app .nx-toggle-input:focus-visible + .nx-toggle-track {
  box-shadow: 0 0 0 3px var(--primary-soft);
}
.nexcalia-app .nx-toggle-input:checked + .nx-toggle-track {
  background: var(--primary);
}
.nexcalia-app .nx-toggle-input:checked + .nx-toggle-track .nx-toggle-thumb {
  transform: translateX(14px);
}
.nexcalia-app .nx-toggle-sm .nx-toggle-track {
  width: 28px;
  height: 16px;
}
.nexcalia-app .nx-toggle-sm .nx-toggle-thumb {
  width: 12px;
  height: 12px;
}
.nexcalia-app
  .nx-toggle-sm
  .nx-toggle-input:checked
  + .nx-toggle-track
  .nx-toggle-thumb {
  transform: translateX(12px);
}

.nexcalia-app .nx-toggle-lg .nx-toggle-track {
  width: 52px;
  height: 28px;
}
.nexcalia-app .nx-toggle-lg .nx-toggle-thumb {
  top: 3px;
  left: 3px;
  width: 22px;
  height: 22px;
  display: grid;
  place-items: center;
  overflow: hidden;
}
.nexcalia-app
  .nx-toggle-lg
  .nx-toggle-input:checked
  + .nx-toggle-track
  .nx-toggle-thumb {
  transform: translateX(24px);
}

.nexcalia-app .nx-toggle-thumb-icon {
  position: absolute;
  width: 12px !important;
  height: 12px !important;
  transition:
    opacity 0.18s ease-out,
    transform 0.22s cubic-bezier(0.34, 1.3, 0.4, 1);
}

.nexcalia-app .nx-toggle-thumb-icon-off {
  color: var(--ink-3);
  opacity: 1;
  transform: scale(1);
}
.nexcalia-app
  .nx-toggle-input:checked
  + .nx-toggle-track
  .nx-toggle-thumb-icon-off {
  opacity: 0;
  transform: scale(0.4) rotate(12deg);
}

.nexcalia-app .nx-toggle-thumb-icon-on {
  color: var(--primary);
  opacity: 0;
  transform: scale(0.4) rotate(-12deg);
}
.nexcalia-app
  .nx-toggle-input:checked
  + .nx-toggle-track
  .nx-toggle-thumb-icon-on {
  opacity: 1;
  transform: scale(1) rotate(0);
}

.nexcalia-app .nx-toggle-lg .nx-toggle-input:focus-visible + .nx-toggle-track {
  box-shadow: 0 0 0 3px color-mix(in oklab, var(--primary) 25%, transparent);
}

.nexcalia-app .nx-toggle-label-on {
  align-items: center;
}
.nexcalia-app .nx-toggle-label-on .nx-toggle-text {
  text-align: right;
}

.nexcalia-app .nx-toggle-text {
  display: flex;
  flex-direction: column;
  gap: 1px;
}
.nexcalia-app .nx-toggle-label {
  font-size: 0.8125rem;
  color: var(--ink);
}
.nexcalia-app .nx-toggle-hint {
  font-size: 0.6875rem;
  color: var(--ink-3);
}
.nexcalia-app .nx-toggle-lg .nx-toggle-label {
  font-size: 0.9375rem;
}

.nexcalia-app .nx-alert {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  padding: 12px 14px;
  border-radius: var(--radius-sm);
  border: 1px solid;
  font-size: 0.8125rem;
  line-height: 1.5;
  position: relative;
}
.nexcalia-app .nx-alert-icon {
  flex-shrink: 0;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  color: white;
  margin-top: 1px;
}
.nexcalia-app .nx-alert-body {
  flex: 1;
  min-width: 0;
}
.nexcalia-app .nx-alert-title {
  font-weight: 600;
  color: var(--ink);
  margin-bottom: 2px;
}
.nexcalia-app .nx-alert-text {
  color: var(--ink-2);
}
.nexcalia-app .nx-alert-actions {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-left: 8px;
  flex-shrink: 0;
}
.nexcalia-app .nx-alert-close {
  appearance: none;
  border: 0;
  background: transparent;
  color: var(--ink-3);
  cursor: pointer;
  padding: 4px;
  border-radius: 4px;
  display: grid;
  place-items: center;
  transition:
    background-color 0.15s,
    color 0.15s;
}
.nexcalia-app .nx-alert-close:hover {
  background: var(--hover);
  color: var(--ink);
}

.nexcalia-app .nx-alert-info {
  background: color-mix(in oklab, var(--info) 8%, var(--surface));
  border-color: color-mix(in oklab, var(--info) 30%, var(--line));
}
.nexcalia-app .nx-alert-info .nx-alert-icon {
  background: var(--info);
}

.nexcalia-app .nx-alert-ok {
  background: color-mix(in oklab, var(--nx-puertorico) 10%, var(--surface));
  border-color: color-mix(in oklab, var(--nx-puertorico) 35%, var(--line));
}
.nexcalia-app .nx-alert-ok .nx-alert-icon {
  background: var(--nx-puertorico);
}

.nexcalia-app .nx-alert-warn {
  background: color-mix(in oklab, var(--nx-highlight) 28%, var(--surface));
  border-color: color-mix(in oklab, var(--nx-highlight) 60%, var(--line));
}
.nexcalia-app .nx-alert-warn .nx-alert-icon {
  background: var(--nx-highlight);
  color: var(--nx-night-shadz);
}
.nexcalia-app .nx-alert-warn .nx-alert-title {
  color: var(--nx-night-shadz);
}

.nexcalia-app .nx-alert-danger {
  background: color-mix(in oklab, var(--nx-tall-poppy) 10%, var(--surface));
  border-color: color-mix(in oklab, var(--nx-tall-poppy) 35%, var(--line));
}
.nexcalia-app .nx-alert-danger .nx-alert-icon {
  background: var(--nx-tall-poppy);
}

.nexcalia-app .nx-tabs {
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.nexcalia-app .nx-tabs-head {
}
.nexcalia-app .nx-tabs-body {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.nexcalia-app .nx-tab-panel {
  animation: nx-fade-in 0.18s ease-out;
}
@keyframes nx-fade-in {
  from {
    opacity: 0;
    transform: translateY(2px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.nexcalia-app .nx-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  padding: 48px 24px;
  background: var(--surface);
  border: 1px dashed color-mix(in oklab, var(--line) 80%, transparent);
  border-radius: var(--radius);
  gap: 8px;
}
.nexcalia-app .nx-empty-icon {
  color: var(--ink-3);
  width: 64px;
  height: 64px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: color-mix(in oklab, var(--primary-soft) 60%, transparent);
  margin-bottom: 6px;
}
.nexcalia-app .nx-empty-icon svg {
  color: var(--primary-deep);
}
.nexcalia-app .nx-empty-title {
  font-size: 1.0625rem;
  font-weight: 600;
  color: var(--ink);
}
.nexcalia-app .nx-empty-message {
  font-size: 0.8125rem;
  color: var(--ink-3);
  max-width: 440px;
}
.nexcalia-app .nx-empty-cta {
  margin-top: 10px;
}

[data-flux-date-picker],
[data-flux-date-picker] dialog,
[data-flux-calendar] {
  --color-accent: var(--primary);
  --color-accent-foreground: var(--nx-white);
}

[data-flux-date-picker] [data-flux-input-button] {
  border-radius: var(--radius-sm);
  transition:
    border-color 0.15s,
    box-shadow 0.15s;
}
[data-flux-date-picker] [data-flux-input-button]:focus-within,
[data-flux-date-picker][data-open] [data-flux-input-button] {
  border-color: color-mix(in oklab, var(--primary) 70%, transparent) !important;
  box-shadow: 0 0 0 3px var(--primary-soft) !important;
}

[data-flux-date-picker] > dialog {
  border-radius: 12px !important;
  border: 0 !important;
  padding: 4px !important;
  background: var(--surface) !important;
  color: var(--ink) !important;
  overflow: hidden !important;
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.6) inset,
    0 18px 40px rgba(43, 57, 72, 0.16),
    0 4px 12px rgba(43, 57, 72, 0.08),
    0 0 0 1px color-mix(in oklab, var(--line) 80%, transparent) !important;
}

[data-flux-date-picker] > dialog::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 1px;
  background: linear-gradient(
    90deg,
    transparent,
    rgba(255, 255, 255, 0.9) 40%,
    rgba(255, 255, 255, 0.9) 60%,
    transparent
  );
  pointer-events: none;
  z-index: 2;
}

[data-flux-date-picker] > dialog::after {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(
    140px 80px at 20% 0%,
    color-mix(in oklab, var(--primary) 10%, transparent),
    transparent 70%
  );
  pointer-events: none;
  z-index: 1;
}
[data-flux-date-picker] > dialog > * {
  position: relative;
  z-index: 2;
}

[data-flux-date-picker] td button:hover:not([disabled]):not([data-selected]),
[data-flux-date-picker]
  [data-flux-calendar]
  td
  button:hover:not([disabled]):not([data-selected]) {
  background: color-mix(in oklab, var(--primary) 10%, transparent) !important;
  color: var(--primary-deep) !important;
}

[data-flux-date-picker] td[data-today] .size-1 {
  background: var(--primary) !important;
}

[data-flux-date-picker] td[data-in-range]:not([data-selected]) {
  background: var(--primary-soft) !important;
}

[data-flux-date-picker] td[data-selected] {
  background: transparent !important;
}
[data-flux-date-picker] td[data-selected] button {
  background: var(--primary) !important;
  color: white !important;
  width: 100% !important;
  aspect-ratio: 1 !important;
  border-radius: 8px !important;
  box-shadow: 0 2px 6px color-mix(in oklab, var(--primary) 30%, transparent) !important;
}

[data-flux-date-picker] ui-calendar-month select:hover,
[data-flux-date-picker] ui-calendar-year select:hover {
  background-color: color-mix(
    in oklab,
    var(--primary) 10%,
    transparent
  ) !important;
}

[data-flux-date-picker] ui-calendar-previous:hover,
[data-flux-date-picker] ui-calendar-next:hover,
[data-flux-date-picker] ui-calendar-today:hover {
  background: color-mix(in oklab, var(--primary) 10%, transparent) !important;
  color: var(--primary-deep) !important;
}

[data-flux-date-picker] ui-calendar-presets [data-flux-radio]:hover {
  background: color-mix(in oklab, var(--primary) 10%, transparent) !important;
  color: var(--primary-deep) !important;
}

[data-palette="dark"] [data-flux-date-picker] > dialog {
  background: color-mix(in oklab, var(--surface) 92%, white) !important;
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.08) inset,
    0 18px 40px rgba(0, 0, 0, 0.55),
    0 4px 12px rgba(0, 0, 0, 0.35),
    0 0 0 1px rgba(255, 255, 255, 0.12) !important;
}
[data-palette="dark"] [data-flux-date-picker] > dialog::before {
  background: linear-gradient(
    90deg,
    transparent,
    rgba(255, 255, 255, 0.18) 40%,
    rgba(255, 255, 255, 0.18) 60%,
    transparent
  );
}

.nexcalia-app .nx-sub-hover:hover {
  background: color-mix(in oklab, var(--surface) 50%, transparent);
}

.nexcalia-app .nx-sub-active {
  background: color-mix(in oklab, var(--surface) 70%, transparent);
  box-shadow: inset 0 0 0 1px
    color-mix(in oklab, var(--primary-soft) 35%, transparent);
}

