﻿/*
 * ION — Free Radicals Design System
 * Compiled from art/ion_login_screen.html + art/free-radicals-theme.html
 * Extended with full component library for the Ion application.
 */

@import url('https://fonts.googleapis.com/css2?family=Syne:wght@300;400;600;700;800&family=Space+Mono:ital,wght@0,400;0,700;1,400&family=Work+Sans:wght@300;400;500;600&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Noto+Naskh+Arabic:wght@400;500;600;700&family=Noto+Sans+Arabic:wght@300;400;500;600;700&display=swap');

/* ==========================================================================
   1. DESIGN TOKENS
   ========================================================================== */

:root {
  color-scheme: dark;

  /* --- Brand palette --- */
  --ion-brand-mark:    "™";        /* upgrade to "®" when registered; consumed by .ion-brand-tm::after */
  --ion-cyan:          #00e5ff;
  --ion-cyan-mid:      #00fff7;
  --ion-magenta:       #bf00ff;
  --ion-violet:        #7b00ff;
  --ion-violet-mid:    #8b5cf6;

  /* RGB triplets — lets rgba(var(--ion-cyan-rgb), alpha) work theme-wide.
     Every theme that changes --ion-cyan MUST also update --ion-cyan-rgb.  */
  --ion-cyan-rgb:      0, 229, 255;
  --ion-magenta-rgb:   191, 0, 255;

  /* --- Semantic colours --- */
  --ion-success:       #00ff9d;
  --ion-warning:       #ffb800;
  --ion-danger:        #ff3860;
  --ion-info:          var(--ion-cyan);

  /* --- Aliases for legacy/alt token names used by Svelte components.
     Keep these resolving to theme-aware tokens so light themes don't
     fall through to white-on-white fallback hex values. ----------------- */
  --ion-error:          var(--ion-danger);
  --ion-warn:           var(--ion-warning);
  --ion-green:          var(--ion-success);
  --ion-red:            var(--ion-danger);
  --ion-blue:           var(--ion-info);
  --ion-purple:         var(--ion-magenta);
  --ion-teal:           var(--ion-cyan);
  --ion-accent:         var(--ion-cyan);
  --ion-surface:        var(--ion-bg-surface);
  --ion-surface-2:      var(--ion-bg-surface-2);
  --ion-surface-hover:  var(--ion-bg-surface-2);
  --ion-bg-hover:       var(--ion-bg-surface-2);
  --ion-bg-selected:    var(--ion-bg-surface-3);
  --ion-text-secondary: var(--ion-text-muted);
  --ion-fg:             var(--ion-text);
  --ion-muted:          var(--ion-text-muted);
  --ion-font:           var(--ion-font-body);

  /* --- Backgrounds --- */
  --ion-bg:            #0a0a0f;
  --ion-bg-darker:     #050508;
  --ion-bg-surface:    rgba(255, 255, 255, 0.04);
  --ion-bg-surface-2:  rgba(255, 255, 255, 0.07);
  --ion-bg-surface-3:  rgba(255, 255, 255, 0.10);

  /* --- Text --- */
  --ion-text:          #e8e8f0;
  --ion-text-muted:    #9ca3af;
  --ion-text-dim:      rgba(255, 255, 255, 0.30);
  --ion-text-faint:    rgba(255, 255, 255, 0.12);

  /* --- Borders --- */
  --ion-border:        rgba(255, 255, 255, 0.08);
  --ion-border-mid:    rgba(255, 255, 255, 0.15);
  --ion-border-focus:  rgba(var(--ion-cyan-rgb), 0.50);
  --ion-border-hover:  rgba(var(--ion-cyan-rgb), 0.30);

  /* --- Gradients --- */
  --ion-gradient:      linear-gradient(135deg, var(--ion-cyan) 0%, var(--ion-violet) 50%, var(--ion-magenta) 100%);
  --ion-gradient-cm:   linear-gradient(135deg, var(--ion-cyan) 0%, var(--ion-magenta) 100%);
  --ion-gradient-cw:   linear-gradient(135deg, var(--ion-cyan) 0%, var(--ion-violet-mid) 100%);

  /* --- Glows --- */
  --ion-glow-cyan:     0 0 20px rgba(var(--ion-cyan-rgb), 0.25);
  --ion-glow-magenta:  0 0 20px rgba(var(--ion-magenta-rgb), 0.25);
  --ion-glow-focus:    0 0 0 3px rgba(var(--ion-cyan-rgb), 0.12), inset 0 0 16px rgba(var(--ion-cyan-rgb), 0.03);

  /* --- Typography --- */
  --ion-font-display:  'Syne', sans-serif;
  --ion-font-mono:     'Space Mono', monospace;
  --ion-font-body:     'Work Sans', sans-serif;

  /* Arabic / RTL stack — applied via html[lang^="ar"] or html.dir-rtl below.
     Falls through to the Latin stack when not in an RTL locale. */
  --ion-font-arabic:   'Noto Naskh Arabic', 'Noto Sans Arabic', 'Cairo', 'Tajawal', 'Amiri', 'Segoe UI', system-ui, sans-serif;

  /* Document direction. Read by JS via getComputedStyle when it needs to
     branch behaviour (e.g. animation directions, drawer dock side). */
  --ion-direction:     ltr;

  /* --- Sizing --- */
  --ion-radius:        2px;
  --ion-radius-md:     4px;
  --ion-radius-lg:     8px;

  /* --- Spacing --- */
  --ion-sp-1:  4px;
  --ion-sp-2:  8px;
  --ion-sp-3:  12px;
  --ion-sp-4:  16px;
  --ion-sp-5:  20px;
  --ion-sp-6:  24px;
  --ion-sp-8:  32px;
  --ion-sp-10: 40px;

  /* Aliases used by components added in the file system / workbook sections */
  --ion-space-1:   4px;
  --ion-space-2:   8px;
  --ion-space-3:   12px;
  --ion-space-4:   16px;
  --ion-space-5:   20px;
  --ion-space-6:   24px;
  --ion-space-7:   28px;
  --ion-space-8:   32px;
  --ion-space-10:  40px;
  --ion-space-12:  48px;

  /* --- Transitions --- */
  --ion-t:     0.22s ease;
  --ion-t-fast: 0.12s ease;

  /* --- Z-index scale --- */
  --ion-z-base:    1;
  --ion-z-panel:   10;
  --ion-z-overlay: 50;
  --ion-z-modal:   100;
  --ion-z-toast:   200;

  /* --- ion-compare (plan 16, commits 1, 5) ---
     Layout primitive + diff-mode tokens. Action tokens added in commit 6. */
  --ion-compare-gutter:        4px;
  --ion-compare-gutter-color:  var(--ion-border, #2a2a3a);
  --ion-compare-gutter-hover:  var(--ion-cyan, #00e5ff);
  --ion-diff-unchanged-opacity: 0.5;
  --ion-diff-changed:          var(--ion-warning, #ffb800);
  --ion-diff-added:            var(--ion-success, #00ff9d);
  --ion-diff-removed:          var(--ion-danger,  #ff3860);

  /* Action affordances (plan 16, commit 6) */
  --ion-action-bar-bg:         rgba(255, 255, 255, 0.03);
  --ion-action-menu-bg:        rgba(0, 0, 0, 0.92);
  --ion-action-pending-bg:     rgba(0, 0, 0, 0.85);

  /* Surface tiers — used by kernel picker, tooltips, and overlays.
     Named separately from bg-surface-* because they carry explicit
     hex fallbacks in older component code.  Override per-theme. */
  --ion-surface-3:             #16161f;
  --ion-surface-4:             #1a1a28;

  /* Popup chrome — floating menus and submenus.
     Centralised here so every theme can swap the dark glass in one place. */
  --ion-popup-bg:              rgba(10, 10, 20, 0.98);
  --ion-popup-sub-bg:          rgba(0, 0, 0, 0.40);
  --ion-popup-shadow:          0 8px 32px rgba(0, 0, 0, 0.60);
  --ion-popup-border:          var(--ion-border);
}

/* Diff-state helper classes for participants that opt to apply data-diff-state
   on rendered elements (ion-graph, future ion-table). Keep the rules generic
   so any descendant element with the attribute picks up the right colour. */
[data-diff-state="unchanged"] { opacity: var(--ion-diff-unchanged-opacity); }
[data-diff-state="matched"]   { opacity: var(--ion-diff-unchanged-opacity); }
[data-diff-state="changed"]   { outline: 2px solid var(--ion-diff-changed); }
[data-diff-state="added"]     { outline: 2px solid var(--ion-diff-added); }
[data-diff-state="removed"]   { outline: 2px solid var(--ion-diff-removed); }

/* ==========================================================================
   2. RESET & BASE
   ========================================================================== */

*, *::before, *::after {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html {
  font-size: 14px;
  -webkit-text-size-adjust: 100%;
  background: var(--ion-bg, #0a0a0f);
}

/* ── Resolution-based font scaling ─────────────────────────────────────────
   HiDPI screens (4K at 150 %+ Windows scaling = ≥1.25 dppx) keep 14 px;
   lower-DPI screens (1080p at 100 % = ~1 dppx) get a 15 px base.
   Because most UI text uses literal px values (not rem), we also explicitly
   bump the dense mono labels that are hardest to read at low DPI.         */
@media (max-resolution: 1.24dppx) {
  html { font-size: 15px; }

  /* Dense mono labels — bump by ~1 px each tier */
  .ion-notif-panel-title,
  .ion-notif-clear-btn,
  .ion-user-dropdown-role,
  .ion-admin-ws-pill             { font-size: 10px; }

  .ion-user-dropdown-notif-time,
  .ion-user-dropdown-notif-desc,
  .ion-user-dropdown-notif-details { font-size: 11px; }

  .ion-admin-status              { font-size: 12px; }
  .ion-debug-panel               { font-size: 12px; }
  .ion-notif-filter-btn          { font-size: 11px; }

  /* Topbar tabs */
  .ion-tab-label                 { font-size: 12px; }
  .ion-tab-icon                  { font-size: 13px; }
}

/* ── RTL / Arabic locale support ──────────────────────────────────────────
   Triggered by either:
     - <html lang="ar"> / lang="he" / lang="fa" / lang="ur"   (locale-driven)
     - <html dir="rtl"> / <html class="dir-rtl">              (explicit override)
   ion.js applies these automatically when the user picks an RTL locale.
   Components should prefer logical CSS properties (inset-inline-start,
   margin-inline-end, padding-block-end, etc.) over physical left/right —
   the few rules below are the global hooks for things logical properties
   can't express on their own.                                            */
html[lang="ar"],
html[lang^="ar-"],
html[lang="he"],
html[lang^="he-"],
html[lang="fa"],
html[lang^="fa-"],
html[lang="ur"],
html[lang^="ur-"],
html[dir="rtl"],
html.dir-rtl {
  --ion-direction: rtl;
  /* Arabic glyphs sit slightly taller than Latin; bump line-height so
     diacritics don't clip and ascenders/descenders breathe.            */
  --ion-line-height: 1.75;

  /* Swap the body/display fonts to the Arabic stack. Mono stays Latin —
     code/SQL is overwhelmingly Latin even in Arabic UIs, and Arabic
     monospace fonts are rare and inconsistent.                         */
  --ion-font-display:  var(--ion-font-arabic);
  --ion-font-body:     var(--ion-font-arabic);
}

/* When the document is RTL, mirror direction-implying SVG icons
   (back/forward arrows, sort glyphs, expand carets pointing inline).
   Components opt in by adding the .ion-icon-directional class.        */
html[dir="rtl"] .ion-icon-directional,
html.dir-rtl     .ion-icon-directional {
  transform: scaleX(-1);
}

/* Logical arrow glyphs — wrap an arrow character in
   <span class="ion-arrow-back">←</span> or <span class="ion-arrow-fwd">→</span>
   in any inline template, and the rendered glyph follows the writing
   mode. The default content matches LTR; the [dir="rtl"] override flips.
   Keeping the original text inside the span is good for screen readers,
   so we use ::before/::after to override the visual without removing
   the original glyph.                                                  */
.ion-arrow-back,
.ion-arrow-fwd {
  display: inline-block;
  font-style: normal;
  speak: never;
}
html[dir="rtl"] .ion-arrow-back,
html.dir-rtl     .ion-arrow-back,
html[dir="rtl"] .ion-arrow-fwd,
html.dir-rtl     .ion-arrow-fwd {
  transform: scaleX(-1);
}

body {
  font-family: var(--ion-font-body);
  background: var(--ion-bg);
  color: var(--ion-text);
  line-height: var(--ion-line-height, 1.6);
  overflow-x: hidden;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

a {
  color: var(--ion-cyan);
  text-decoration: none;
  transition: color var(--ion-t);
}
a:hover { color: #fff; }

/* Animated background grid (optional — add .ion-grid-bg to body) */
.ion-grid-bg::before {
  content: '';
  position: fixed;
  inset: 0;
  background-image:
    linear-gradient(rgba(var(--ion-cyan-rgb), 0.025) 1px, transparent 1px),
    linear-gradient(90deg, rgba(var(--ion-cyan-rgb), 0.025) 1px, transparent 1px);
  background-size: 60px 60px;
  animation: ion-grid-scroll 20s linear infinite;
  pointer-events: none;
  z-index: 0;
}
@keyframes ion-grid-scroll {
  0%   { transform: translate(0, 0); }
  100% { transform: translate(60px, 60px); }
}

/* ==========================================================================
   3. SCROLLBARS
   ========================================================================== */

::-webkit-scrollbar        { width: 6px; height: 6px; }
::-webkit-scrollbar-track  { background: var(--ion-bg-darker); }
::-webkit-scrollbar-thumb  {
  background: rgba(255, 255, 255, 0.12);
  border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover { background: rgba(var(--ion-cyan-rgb), 0.35); }

/* ==========================================================================
   4. TYPOGRAPHY
   ========================================================================== */

.ion-display {
  font-family: var(--ion-font-display);
  font-weight: 800;
  letter-spacing: -0.03em;
  line-height: 1.05;
}

.ion-mono {
  font-family: var(--ion-font-mono);
  font-size: 0.85em;
}

.ion-label-text {
  font-family: var(--ion-font-mono);
  font-size: 9px;
  letter-spacing: 0.20em;
  text-transform: uppercase;
  color: var(--ion-text-dim);
}

.ion-gradient-text {
  background: var(--ion-gradient-cm);
  background-size: 200% 100%;
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
  animation: ion-gradient-shift 6s linear infinite;
}

@keyframes ion-gradient-shift {
  0%   { background-position: 0% 0%; }
  100% { background-position: 200% 0%; }
}

/* ==========================================================================
   5. LAYOUT
   ========================================================================== */

.ion-container {
  max-width: 1400px;
  margin: 0 auto;
  padding: 0 var(--ion-sp-10);
}

/* ==========================================================================
   6. FORM CONTROLS — SHARED BASE
   ========================================================================== */

.ion-form-group {
  display: flex;
  flex-direction: column;
  gap: var(--ion-sp-2);
  margin-bottom: var(--ion-sp-4);
}

.ion-label {
  display: block;
  font-family: var(--ion-font-mono);
  font-size: 9px;
  letter-spacing: 0.20em;
  text-transform: uppercase;
  color: var(--ion-text-dim);
  user-select: none;
}

.ion-hint {
  font-family: var(--ion-font-mono);
  font-size: 10px;
  color: var(--ion-text-faint);
  margin-top: calc(-1 * var(--ion-sp-1));
}

.ion-error-text {
  font-family: var(--ion-font-mono);
  font-size: 10px;
  color: var(--ion-danger);
  margin-top: calc(-1 * var(--ion-sp-1));
}

/* ==========================================================================
   7. INPUT — text / email / password / number / url / tel / search
   ========================================================================== */

.ion-input {
  width: 100%;
  background: var(--ion-bg-surface);
  border: 1px solid var(--ion-border-mid);
  border-radius: var(--ion-radius);
  padding: 11px 14px;
  color: var(--ion-text);
  font-family: var(--ion-font-mono);
  font-size: 13px;
  outline: none;
  transition: border-color var(--ion-t), background var(--ion-t), box-shadow var(--ion-t);
  appearance: none;
}

.ion-input::placeholder { color: var(--ion-text-faint); }

.ion-input:hover {
  border-color: var(--ion-border-hover);
}

.ion-input:focus {
  border-color: var(--ion-border-focus);
  background: rgba(var(--ion-cyan-rgb), 0.04);
  box-shadow: var(--ion-glow-focus);
}

.ion-input--pw:focus {
  border-color: rgba(var(--ion-magenta-rgb), 0.50);
  background: rgba(var(--ion-magenta-rgb), 0.03);
  box-shadow: 0 0 0 3px rgba(var(--ion-magenta-rgb), 0.10), inset 0 0 16px rgba(var(--ion-magenta-rgb), 0.02);
}

.ion-input:disabled,
.ion-input[readonly] {
  opacity: 0.45;
  cursor: not-allowed;
}

.ion-input--sm { padding: 7px 10px; font-size: 12px; }
.ion-input--lg { padding: 14px 18px; font-size: 15px; }

.ion-input--error {
  border-color: var(--ion-danger);
  box-shadow: 0 0 0 3px rgba(255, 56, 96, 0.10);
}

/* Input with icon wrapper */
.ion-input-wrap {
  position: relative;
  display: flex;
  align-items: center;
}
.ion-input-wrap .ion-input {
  padding-inline-start: 38px;
}
.ion-input-icon {
  position: absolute;
  inset-inline-start: 12px;
  color: var(--ion-text-dim);
  pointer-events: none;
  display: flex;
  align-items: center;
}

/* ==========================================================================
   8. TEXTAREA
   ========================================================================== */

.ion-textarea {
  width: 100%;
  background: var(--ion-bg-surface);
  border: 1px solid var(--ion-border-mid);
  border-radius: var(--ion-radius);
  padding: 12px 14px;
  color: var(--ion-text);
  font-family: var(--ion-font-mono);
  font-size: 12px;
  line-height: 1.7;
  outline: none;
  resize: vertical;
  min-height: 100px;
  transition: border-color var(--ion-t), background var(--ion-t), box-shadow var(--ion-t);
}

.ion-textarea::placeholder { color: var(--ion-text-faint); }

.ion-textarea:hover { border-color: var(--ion-border-hover); }

.ion-textarea:focus {
  border-color: var(--ion-border-focus);
  background: rgba(var(--ion-cyan-rgb), 0.04);
  box-shadow: var(--ion-glow-focus);
}

/* Code textarea — no resize, fixed-height */
.ion-textarea--code {
  resize: none;
  font-size: 13px;
  tab-size: 2;
  line-height: 1.5;
}

/* ==========================================================================
   9. SELECT
   ========================================================================== */

.ion-select {
  width: 100%;
  background: var(--ion-bg-surface);
  border: 1px solid var(--ion-border-mid);
  border-radius: var(--ion-radius);
  padding: 11px 36px 11px 14px;
  color: var(--ion-text);
  font-family: var(--ion-font-mono);
  font-size: 13px;
  outline: none;
  cursor: pointer;
  appearance: none;
  -webkit-appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='rgba(255,255,255,0.3)' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 12px center;
  transition: border-color var(--ion-t), background-color var(--ion-t), box-shadow var(--ion-t);
}

.ion-select option {
  background: #111118;
  color: var(--ion-text);
}

.ion-select:hover { border-color: var(--ion-border-hover); }
.ion-select:focus {
  border-color: var(--ion-border-focus);
  box-shadow: var(--ion-glow-focus);
}

/* ==========================================================================
   10. CHECKBOX
   ========================================================================== */

.ion-checkbox-wrap {
  display: inline-flex;
  align-items: center;
  gap: var(--ion-sp-2);
  cursor: pointer;
  user-select: none;
}

.ion-checkbox {
  width: 16px;
  height: 16px;
  background: var(--ion-bg-surface);
  border: 1px solid var(--ion-border-mid);
  border-radius: var(--ion-radius);
  cursor: pointer;
  appearance: none;
  -webkit-appearance: none;
  position: relative;
  flex-shrink: 0;
  transition: background var(--ion-t), border-color var(--ion-t), box-shadow var(--ion-t);
}

.ion-checkbox:hover { border-color: var(--ion-border-hover); }

.ion-checkbox:focus-visible {
  outline: none;
  box-shadow: var(--ion-glow-focus);
}

.ion-checkbox:checked {
  background: var(--ion-gradient-cm);
  border-color: transparent;
}

.ion-checkbox:checked::after {
  content: '';
  position: absolute;
  inset-inline-start: 4px;
  top: 1.5px;
  width: 6px;
  height: 9px;
  border: 1.5px solid #000;
  border-top: none;
  border-inline-start: none;
  transform: rotate(40deg);
}

.ion-checkbox-label {
  font-family: var(--ion-font-mono);
  font-size: 11px;
  color: var(--ion-text-dim);
  letter-spacing: 0.06em;
}

/* ==========================================================================
   11. RADIO
   ========================================================================== */

.ion-radio-wrap {
  display: inline-flex;
  align-items: center;
  gap: var(--ion-sp-2);
  cursor: pointer;
  user-select: none;
}

.ion-radio {
  width: 16px;
  height: 16px;
  background: var(--ion-bg-surface);
  border: 1px solid var(--ion-border-mid);
  border-radius: 50%;
  cursor: pointer;
  appearance: none;
  -webkit-appearance: none;
  position: relative;
  flex-shrink: 0;
  transition: border-color var(--ion-t), box-shadow var(--ion-t);
}

.ion-radio:hover { border-color: var(--ion-border-hover); }

.ion-radio:focus-visible {
  outline: none;
  box-shadow: var(--ion-glow-focus);
}

.ion-radio:checked {
  border-color: var(--ion-cyan);
}

.ion-radio:checked::after {
  content: '';
  position: absolute;
  inset: 3px;
  border-radius: 50%;
  background: var(--ion-gradient-cm);
}

/* ==========================================================================
   12. TOGGLE SWITCH
   ========================================================================== */

.ion-toggle-wrap {
  display: inline-flex;
  align-items: center;
  gap: var(--ion-sp-2);
  cursor: pointer;
  user-select: none;
}

.ion-toggle {
  position: relative;
  width: 36px;
  height: 20px;
  cursor: pointer;
  appearance: none;
  -webkit-appearance: none;
  background: var(--ion-bg-surface-3);
  border: 1px solid var(--ion-border-mid);
  border-radius: 10px;
  transition: background var(--ion-t), border-color var(--ion-t), box-shadow var(--ion-t);
  flex-shrink: 0;
}

.ion-toggle::after {
  content: '';
  position: absolute;
  top: 2px;
  inset-inline-start: 2px;
  width: 14px;
  height: 14px;
  border-radius: 50%;
  background: var(--ion-text-dim);
  transition: transform var(--ion-t), background var(--ion-t);
}

.ion-toggle:checked {
  background: linear-gradient(135deg, var(--ion-cyan), var(--ion-magenta));
  border-color: transparent;
  box-shadow: 0 0 12px rgba(var(--ion-cyan-rgb), 0.20);
}

.ion-toggle:checked::after {
  transform: translateX(16px);
  background: #000;
}

.ion-toggle:focus-visible {
  outline: none;
  box-shadow: var(--ion-glow-focus);
}

/* ==========================================================================
   13. RANGE SLIDER
   ========================================================================== */

.ion-range {
  width: 100%;
  height: 4px;
  appearance: none;
  -webkit-appearance: none;
  background: var(--ion-bg-surface-3);
  border-radius: 2px;
  outline: none;
  cursor: pointer;
  accent-color: var(--ion-cyan);
}

.ion-range::-webkit-slider-thumb {
  -webkit-appearance: none;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: var(--ion-gradient-cm);
  cursor: pointer;
  box-shadow: 0 0 8px rgba(var(--ion-cyan-rgb), 0.40);
  transition: box-shadow var(--ion-t);
}

.ion-range::-webkit-slider-thumb:hover {
  box-shadow: 0 0 14px rgba(var(--ion-cyan-rgb), 0.60);
}

.ion-range::-moz-range-thumb {
  width: 16px;
  height: 16px;
  border: none;
  border-radius: 50%;
  background: var(--ion-gradient-cm);
  cursor: pointer;
}

/* ==========================================================================
   14. FILE DROP ZONE
   ========================================================================== */

.ion-file-drop {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--ion-sp-2);
  padding: var(--ion-sp-8);
  background: var(--ion-bg-surface);
  border: 1px dashed var(--ion-border-mid);
  border-radius: var(--ion-radius-md);
  cursor: pointer;
  text-align: center;
  transition: border-color var(--ion-t), background var(--ion-t);
}

.ion-file-drop:hover,
.ion-file-drop--active {
  border-color: var(--ion-border-focus);
  background: rgba(var(--ion-cyan-rgb), 0.04);
}

.ion-file-drop input[type="file"] {
  display: none;
}

.ion-file-drop-icon {
  font-size: 28px;
  opacity: 0.5;
}

.ion-file-drop-text {
  font-family: var(--ion-font-mono);
  font-size: 11px;
  color: var(--ion-text-dim);
  letter-spacing: 0.08em;
}

/* ==========================================================================
   15. BUTTONS
   ========================================================================== */

.ion-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--ion-sp-2);
  padding: 11px 24px;
  border: none;
  border-radius: var(--ion-radius);
  font-family: var(--ion-font-display);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  cursor: pointer;
  text-decoration: none;
  transition: transform var(--ion-t-fast), box-shadow var(--ion-t), background-position var(--ion-t), opacity var(--ion-t);
  user-select: none;
  white-space: nowrap;
  position: relative;
  overflow: hidden;
}

.ion-btn:disabled {
  opacity: 0.40;
  cursor: not-allowed;
  pointer-events: none;
}

.ion-btn:active { transform: scale(0.98); }

/* Shimmer overlay on hover */
.ion-btn::before {
  content: '';
  position: absolute;
  top: 0;
  inset-inline-start: -100%;
  width: 100%;
  height: 100%;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,0.12), transparent);
  transition: left 0.45s ease;
}
.ion-btn:hover::before { inset-inline-start: 100%; }

/* Primary */
.ion-btn-primary {
  background: var(--ion-gradient);
  background-size: 200% 100%;
  color: #000;
  box-shadow: 0 4px 24px rgba(var(--ion-cyan-rgb), 0.18), 0 4px 40px rgba(var(--ion-magenta-rgb), 0.12);
}
.ion-btn-primary:hover {
  background-position: 100% 0;
  box-shadow: 0 6px 32px rgba(var(--ion-cyan-rgb), 0.30), 0 6px 56px rgba(var(--ion-magenta-rgb), 0.20);
  transform: translateY(-1px);
}

/* Secondary */
.ion-btn-secondary {
  background: transparent;
  color: var(--ion-cyan);
  border: 1px solid var(--ion-cyan);
  box-shadow: 0 0 0 0 transparent;
}
.ion-btn-secondary:hover {
  background: rgba(var(--ion-cyan-rgb), 0.08);
  box-shadow: var(--ion-glow-cyan);
  transform: translateY(-1px);
}

/* Ghost */
.ion-btn-ghost {
  background: var(--ion-bg-surface);
  color: var(--ion-text-muted);
  border: 1px solid var(--ion-border);
}
.ion-btn-ghost:hover {
  background: var(--ion-bg-surface-2);
  color: var(--ion-text);
  border-color: var(--ion-border-mid);
}

/* Danger */
.ion-btn-danger {
  background: rgba(255, 56, 96, 0.12);
  color: var(--ion-danger);
  border: 1px solid rgba(255, 56, 96, 0.30);
}
.ion-btn-danger:hover {
  background: rgba(255, 56, 96, 0.20);
  box-shadow: 0 0 18px rgba(255, 56, 96, 0.25);
}

/* Icon-only */
.ion-btn-icon {
  padding: 8px;
  width: 36px;
  height: 36px;
  border-radius: var(--ion-radius);
}
.ion-btn-icon.ion-btn-sm { width: 28px; height: 28px; padding: 5px; }
.ion-btn-icon.ion-btn-lg { width: 44px; height: 44px; padding: 11px; }

/* Sizes */
.ion-btn-sm { padding: 7px 16px; font-size: 10px; }
.ion-btn-lg { padding: 14px 32px; font-size: 14px; }
.ion-btn-full { width: 100%; }

/* Button group */
.ion-btn-group {
  display: inline-flex;
  gap: 0;
}
.ion-btn-group .ion-btn {
  border-radius: 0;
}
.ion-btn-group .ion-btn:first-child { border-radius: var(--ion-radius) 0 0 var(--ion-radius); }
.ion-btn-group .ion-btn:last-child  { border-radius: 0 var(--ion-radius) var(--ion-radius) 0; }

/* ==========================================================================
   16. CARDS & PANELS
   ========================================================================== */

.ion-card {
  background: var(--ion-bg-surface);
  border: 1px solid var(--ion-border);
  border-radius: var(--ion-radius-md);
  padding: var(--ion-sp-6);
  position: relative;
  transition: border-color var(--ion-t), box-shadow var(--ion-t);
}

.ion-card:hover {
  border-color: var(--ion-border-hover);
  box-shadow: var(--ion-glow-cyan);
}

.ion-card-title {
  font-family: var(--ion-font-display);
  font-size: 16px;
  font-weight: 700;
  margin-bottom: var(--ion-sp-3);
}

/* Glass card — used for modals, login */
.ion-glass {
  background: rgba(0, 0, 0, 0.60);
  border: 1px solid var(--ion-border);
  border-radius: var(--ion-radius);
  backdrop-filter: blur(24px);
  -webkit-backdrop-filter: blur(24px);
  box-shadow:
    0 0 0 1px rgba(var(--ion-cyan-rgb), 0.07),
    0 32px 80px rgba(0, 0, 0, 0.55),
    inset 0 1px 0 rgba(255, 255, 255, 0.05);
}

/* Top gradient accent line */
.ion-card-accent::before {
  content: '';
  position: absolute;
  top: 0; inset-inline-start: 0; inset-inline-end: 0;
  height: 2px;
  background: var(--ion-gradient-cm);
  background-size: 200% 100%;
  animation: ion-gradient-shift 4s linear infinite;
  border-radius: var(--ion-radius) var(--ion-radius) 0 0;
}

/* Panel — full-height sidebar or content panel */
.ion-panel {
  background: rgba(0, 0, 0, 0.40);
  border-inline-end: 1px solid var(--ion-border);
  height: 100%;
  overflow-y: auto;
  position: relative;
}

/* ==========================================================================
   17. TAB BAR
   ========================================================================== */

.ion-tab-bar {
  display: flex;
  align-items: stretch;
  background: var(--ion-bg-darker);
  border-bottom: 1px solid var(--ion-border);
  overflow-x: auto;
  scrollbar-width: none;
  height: 36px;
  flex-shrink: 0;
}
.ion-tab-bar::-webkit-scrollbar { display: none; }

.ion-tab {
  display: inline-flex;
  align-items: center;
  gap: var(--ion-sp-2);
  padding: 0 var(--ion-sp-4);
  min-width: 140px;
  max-width: 220px;
  border-inline-end: 1px solid var(--ion-border);
  font-family: var(--ion-font-mono);
  font-size: 11px;
  color: var(--ion-text-dim);
  cursor: pointer;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  background: transparent;
  transition: background var(--ion-t), color var(--ion-t);
  user-select: none;
  position: relative;
}

.ion-tab:hover {
  background: var(--ion-bg-surface);
  color: var(--ion-text);
}

.ion-tab--active {
  background: var(--ion-bg);
  color: var(--ion-cyan);
  border-bottom: 2px solid var(--ion-cyan);
}

/* The title is the flexible element: it shrinks and ellipsises so the
   close button (flex-shrink: 0, below) is never pushed past the tab's
   max-width into the parent's overflow:hidden clip. min-width:0 is the
   load-bearing line — a flex item defaults to min-width:auto, which
   refuses to shrink below the intrinsic width of its nowrap text, so a
   long tab name would otherwise force the ✕ out of view. */
.ion-tab-title {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.ion-tab-close {
  margin-inline-start: auto;
  flex-shrink: 0;
  width: 16px;
  height: 16px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  opacity: 0;
  transition: opacity var(--ion-t), background var(--ion-t);
  font-size: 10px;
}
.ion-tab:hover .ion-tab-close { opacity: 0.6; }
.ion-tab-close:hover { opacity: 1 !important; background: rgba(255,255,255,0.1); }

.ion-tab-new {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  flex-shrink: 0;
  color: var(--ion-text-dim);
  cursor: pointer;
  font-size: 18px;
  font-weight: 300;
  transition: color var(--ion-t), background var(--ion-t);
}
.ion-tab-new:hover { color: var(--ion-cyan); background: var(--ion-bg-surface); }

/* ==========================================================================
   18. TOP BAR
   ========================================================================== */

.ion-top-bar {
  display: flex;
  align-items: center;
  height: 48px;
  padding: 0 var(--ion-sp-4);
  background: var(--ion-top-bar-bg, rgba(0, 0, 0, 0.60));
  border-bottom: 1px solid var(--ion-border);
  backdrop-filter: blur(10px);
  position: sticky;
  top: 0;
  z-index: var(--ion-z-panel);
  flex-shrink: 0;
}

/* Page-level fullscreen — toggled by ion.setFullscreen(token, active) when a
   component (workspace, cell-detail drawer, future viewers) takes over the
   viewport. We hide every piece of shell chrome that would otherwise bleed
   over the fullscreen element's edges; the requesting element supplies its
   own opaque background so the underlying page doesn't show through.
   ion.css class-based rules don't cascade into shadow DOM, but these targets
   all live in the main document so a single rule covers everything.

   Restoring the class removes all of these effects in one step — there is no
   per-component cleanup beyond `ion.setFullscreen(token, false)`. */
body.ion-fullscreen-active .ion-top-bar,
body.ion-fullscreen-active .ion-ambient-host,
body.ion-fullscreen-active .ion-agent-debug-drawer,
body.ion-fullscreen-active .ion-debug-panel {
  display: none !important;
}
body.ion-fullscreen-active .ion-app-main {
  padding: 0 !important;
}

.ion-top-bar-brand {
  font-family: var(--ion-font-display);
  font-size: 22px;
  font-weight: 800;
  letter-spacing: -0.03em;
  background: var(--ion-gradient-cm);
  background-size: 200% 100%;
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
  animation: ion-gradient-shift 6s linear infinite;
  line-height: 1;
  user-select: none;
}

/* Trademark / registered mark — upgrade ™ → ® by changing --ion-brand-mark in :root. */
.ion-brand-tm::after {
  content: var(--ion-brand-mark, "™");
  font-size: 0.45em;
  vertical-align: super;
  font-weight: 400;
  letter-spacing: 0;
  font-family: var(--ion-font-mono);
  color: var(--ion-text-muted, rgba(216, 216, 232, 0.55));
}

.ion-top-bar-spacer { flex: 1; }

.ion-top-bar-actions {
  display: flex;
  align-items: center;
  gap: var(--ion-sp-2);
}

/* ==========================================================================
   19. NAVIGATION (sidebar)
   ========================================================================== */

.ion-nav {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: var(--ion-sp-2);
}

.ion-nav-item {
  display: flex;
  align-items: center;
  gap: var(--ion-sp-2);
  padding: var(--ion-sp-2) var(--ion-sp-3);
  border-radius: var(--ion-radius);
  font-family: var(--ion-font-mono);
  font-size: 11px;
  color: var(--ion-text-muted);
  cursor: pointer;
  text-decoration: none;
  transition: background var(--ion-t), color var(--ion-t);
  user-select: none;
}

.ion-nav-item:hover {
  background: var(--ion-bg-surface-2);
  color: var(--ion-text);
}

.ion-nav-item--active {
  background: rgba(var(--ion-cyan-rgb), 0.08);
  color: var(--ion-cyan);
  border-inline-start: 2px solid var(--ion-cyan);
  padding-inline-start: calc(var(--ion-sp-3) - 2px);
}

.ion-nav-section {
  font-family: var(--ion-font-mono);
  font-size: 8px;
  letter-spacing: 0.25em;
  text-transform: uppercase;
  color: var(--ion-text-faint);
  padding: var(--ion-sp-3) var(--ion-sp-3) var(--ion-sp-1);
  user-select: none;
}

/* ==========================================================================
   20. TABLE
   ========================================================================== */

.ion-table-wrap {
  overflow-x: auto;
  border: 1px solid var(--ion-border);
  border-radius: var(--ion-radius-md);
}

.ion-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 13px;
}

.ion-table th {
  background: var(--ion-bg-surface-2);
  font-family: var(--ion-font-mono);
  font-size: 9px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--ion-text-dim);
  padding: 10px 14px;
  text-align: start;
  border-bottom: 1px solid var(--ion-border);
  white-space: nowrap;
}

.ion-table td {
  padding: 9px 14px;
  border-bottom: 1px solid var(--ion-border);
  color: var(--ion-text-muted);
  font-family: var(--ion-font-mono);
  font-size: 12px;
}

.ion-table tbody tr:hover td {
  background: var(--ion-bg-surface);
  color: var(--ion-text);
}

.ion-table tbody tr:last-child td { border-bottom: none; }

/* Numeric cells right-aligned */
.ion-table td.num,
.ion-table th.num { text-align: end; }

/* ==========================================================================
   21. BADGES & TAGS
   ========================================================================== */

.ion-badge {
  display: inline-flex;
  align-items: center;
  padding: 2px 8px;
  border-radius: 2px;
  font-family: var(--ion-font-mono);
  font-size: 9px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  font-weight: 700;
}

.ion-badge-cyan    { background: rgba(var(--ion-cyan-rgb), 0.12); color: var(--ion-cyan); }
.ion-badge-magenta { background: rgba(var(--ion-magenta-rgb), 0.12); color: var(--ion-magenta); }
.ion-badge-success { background: rgba(0, 255, 157, 0.12); color: var(--ion-success); }
.ion-badge-warning { background: rgba(255, 184, 0, 0.12); color: var(--ion-warning); }
.ion-badge-danger  { background: rgba(255, 56, 96, 0.12);  color: var(--ion-danger); }
.ion-badge-muted   { background: var(--ion-bg-surface-2);  color: var(--ion-text-dim); }

.ion-tag {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 3px 9px;
  border-radius: 99px;
  border: 1px solid var(--ion-border-mid);
  font-family: var(--ion-font-mono);
  font-size: 10px;
  color: var(--ion-text-dim);
  background: var(--ion-bg-surface);
  cursor: default;
  transition: border-color var(--ion-t), color var(--ion-t);
}
.ion-tag:hover { border-color: var(--ion-border-focus); color: var(--ion-text); }

/* ==========================================================================
   22. PROGRESS BAR
   ========================================================================== */

.ion-progress {
  width: 100%;
  height: 4px;
  background: var(--ion-bg-surface-3);
  border-radius: 2px;
  overflow: hidden;
}

.ion-progress-bar {
  height: 100%;
  background: var(--ion-gradient-cm);
  background-size: 200% 100%;
  border-radius: 2px;
  transition: width 0.4s ease;
  animation: ion-gradient-shift 3s linear infinite;
}

.ion-progress--indeterminate .ion-progress-bar {
  width: 40% !important;
  animation: ion-progress-slide 1.4s ease-in-out infinite, ion-gradient-shift 3s linear infinite;
}
@keyframes ion-progress-slide {
  0%   { transform: translateX(-150%); }
  100% { transform: translateX(350%); }
}

/* ==========================================================================
   23. SPINNER
   ========================================================================== */

.ion-spinner {
  display: inline-block;
  width: 20px;
  height: 20px;
  border: 2px solid var(--ion-border-mid);
  border-top-color: var(--ion-cyan);
  border-radius: 50%;
  animation: ion-spin 0.75s linear infinite;
}

.ion-spinner-sm { width: 14px; height: 14px; border-width: 1.5px; }
.ion-spinner-lg { width: 32px; height: 32px; border-width: 3px; }

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

/* ==========================================================================
   24. TOAST NOTIFICATIONS
   ========================================================================== */

.ion-toast-host {
  position: fixed;
  bottom: var(--ion-sp-6);
  inset-inline-end: var(--ion-sp-6);
  display: flex;
  flex-direction: column;
  gap: var(--ion-sp-2);
  z-index: var(--ion-z-toast);
  pointer-events: none;
}

.ion-toast {
  display: flex;
  align-items: flex-start;
  gap: var(--ion-sp-3);
  padding: var(--ion-sp-3) var(--ion-sp-4);
  min-width: 280px;
  max-width: 380px;
  background: rgba(10, 10, 20, 0.95);
  border: 1px solid var(--ion-border);
  border-radius: var(--ion-radius-md);
  backdrop-filter: blur(16px);
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
  pointer-events: all;
  animation: ion-toast-in 0.3s cubic-bezier(0.16, 1, 0.3, 1) both;
}

@keyframes ion-toast-in {
  from { opacity: 0; transform: translateX(32px); }
  to   { opacity: 1; transform: translateX(0); }
}

.ion-toast-icon { font-size: 16px; flex-shrink: 0; margin-top: 1px; }
.ion-toast-body { flex: 1; min-width: 0; }
.ion-toast-title {
  font-family: var(--ion-font-mono);
  font-size: 11px;
  font-weight: 700;
  color: var(--ion-text);
  margin-bottom: 2px;
}
.ion-toast-message {
  font-size: 12px;
  color: var(--ion-text-muted);
  line-height: 1.5;
}

.ion-toast--info    { border-inline-start: 3px solid var(--ion-cyan); }
.ion-toast--success { border-inline-start: 3px solid var(--ion-success); }
.ion-toast--warning { border-inline-start: 3px solid var(--ion-warning); }
.ion-toast--error   { border-inline-start: 3px solid var(--ion-danger); }

/* Toast: source badge */
.ion-toast-source {
  font-family: var(--ion-font-mono);
  font-size: 9px;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--ion-text-muted);
  margin-bottom: 2px;
}

/* Toast: expandable details */
.ion-toast-details {
  font-family: var(--ion-font-mono);
  font-size: 11px;
  color: var(--ion-text-muted);
  margin: 4px 0 0;
  padding: 4px 6px;
  background: rgba(0, 0, 0, 0.3);
  border-radius: 3px;
  white-space: pre-wrap;
  word-break: break-word;
  max-height: 200px;
  overflow-y: auto;
}

.ion-toast-expand {
  background: none;
  border: none;
  color: var(--ion-cyan);
  font-family: var(--ion-font-mono);
  font-size: 10px;
  cursor: pointer;
  padding: 2px 0;
  margin-top: 2px;
}
.ion-toast-expand:hover { text-decoration: underline; }

/* Global upload progress widget — singleton, fixed bottom-right */
#ion-upload-progress {
  position: fixed;
  bottom: calc(var(--ion-toast-offset, 80px) + 8px);
  inset-inline-end: 16px;
  z-index: 9100;
  display: flex;
  align-items: flex-start;
  gap: 10px;
  padding: 10px 14px;
  min-width: 220px;
  max-width: 320px;
  background: var(--ion-bg-surface-2, #1a1a2e);
  border: 1px solid var(--ion-cyan, #00e5ff);
  border-radius: var(--ion-radius-md, 8px);
  box-shadow: 0 4px 20px rgba(0,0,0,0.5);
  font-family: var(--ion-font-mono, monospace);
  font-size: 0.78rem;
  color: var(--ion-text, #e0e0e0);
}
#ion-upload-progress[hidden] { display: none; }
.ion-up-icon {
  font-size: 1rem;
  color: var(--ion-cyan, #00e5ff);
  flex-shrink: 0;
  margin-top: 1px;
}
.ion-up-body { flex: 1; min-width: 0; }
.ion-up-title {
  font-weight: 600;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  margin-bottom: 2px;
}
.ion-up-sub {
  color: var(--ion-text-muted, #888);
  margin-bottom: 6px;
}
.ion-up-bar-wrap {
  height: 3px;
  background: var(--ion-bg-surface-3, rgba(255,255,255,0.08));
  border-radius: 2px;
  overflow: hidden;
}
.ion-up-bar-fill {
  height: 100%;
  width: 0%;
  background: var(--ion-gradient-cm, linear-gradient(90deg, #00e5ff, #bf00ff));
  border-radius: 2px;
  transition: width 0.15s linear;
}

/* ==========================================================================
   24c. EXECUTION PROGRESS BAR
   ========================================================================== */

#ion-exec-progress {
  position: fixed;
  top: 0;
  inset-inline-start: 0;
  inset-inline-end: 0;
  height: 2px;
  z-index: var(--ion-z-toast);
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.4s ease;
}
#ion-exec-progress.active {
  opacity: 1;
}
.ion-exec-progress__fill {
  height: 100%;
  width: 0;
  background: linear-gradient(90deg, var(--ion-cyan), var(--ion-magenta));
  transition: width 0.3s ease-out;
  border-radius: 0 1px 1px 0;
}

/* ==========================================================================
   24b. NOTIFICATION PANEL
   ========================================================================== */

.ion-notif-bell {
  position: relative;
  cursor: pointer;
  font-size: 16px;
  padding: 4px 8px;
  color: var(--ion-text-muted);
  background: none;
  border: none;
}
.ion-notif-bell:hover { color: var(--ion-text); }

.ion-notif-badge {
  position: absolute;
  top: 0; inset-inline-end: 2px;
  /* Default = info/cyan; the worst-unread modifier below overrides it. Red is
     no longer the default — it now means an actual error is unread. */
  background: var(--ion-info);
  color: #fff;
  font-size: 9px;
  font-weight: 700;
  min-width: 14px; height: 14px;
  border-radius: 7px;
  display: flex; align-items: center; justify-content: center;
  padding: 0 3px;
}

/* Badge colour reflects the worst unread notification severity.
   error (red) > warning (orange) > success (green) > info (cyan). */
.ion-notif-badge--info    { background: var(--ion-info); }
.ion-notif-badge--success { background: var(--ion-success); color: var(--ion-bg); }
.ion-notif-badge--warning { background: var(--ion-warning); color: var(--ion-bg); }
.ion-notif-badge--error   { background: var(--ion-danger); }

.ion-notif-panel {
  position: fixed;
  top: 40px; inset-inline-end: 16px;
  width: 380px;
  max-height: 480px;
  overflow-y: auto;
  background: rgba(10, 10, 20, 0.97);
  border: 1px solid var(--ion-border);
  border-radius: var(--ion-radius-md);
  backdrop-filter: blur(16px);
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
  z-index: var(--ion-z-toast);
  padding: 8px 0;
}

.ion-notif-empty {
  padding: 24px;
  text-align: center;
  color: var(--ion-text-muted);
  font-size: 12px;
}

.ion-notif-item {
  display: flex;
  gap: 8px;
  padding: 8px 12px;
  border-bottom: 1px solid var(--ion-border);
}
.ion-notif-item:last-child { border-bottom: none; }
.ion-notif-unread { background: rgba(var(--ion-cyan-rgb), 0.04); }

.ion-notif-item-icon { font-size: 14px; flex-shrink: 0; margin-top: 2px; }
.ion-notif-item--error   .ion-notif-item-icon { color: var(--ion-danger); }
.ion-notif-item--warning .ion-notif-item-icon { color: var(--ion-warning); }
.ion-notif-item--success .ion-notif-item-icon { color: var(--ion-success); }
.ion-notif-item--info    .ion-notif-item-icon { color: var(--ion-cyan); }

.ion-notif-item-body { flex: 1; min-width: 0; }
.ion-notif-item-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 2px;
}
.ion-notif-item-source {
  font-family: var(--ion-font-mono);
  font-size: 9px;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--ion-text-muted);
}
.ion-notif-item-time {
  font-family: var(--ion-font-mono);
  font-size: 9px;
  color: var(--ion-text-muted);
}
.ion-notif-item-title {
  font-family: var(--ion-font-mono);
  font-size: 11px;
  font-weight: 700;
  color: var(--ion-text);
}
.ion-notif-item-desc {
  font-size: 11px;
  color: var(--ion-text-muted);
  line-height: 1.4;
}
.ion-notif-item-details {
  font-family: var(--ion-font-mono);
  font-size: 10px;
  color: var(--ion-text-muted);
  margin-top: 4px;
  padding: 4px 6px;
  background: rgba(0, 0, 0, 0.3);
  border-radius: 3px;
  white-space: pre-wrap;
  word-break: break-word;
  max-height: 120px;
  overflow-y: auto;
}

/* ==========================================================================
   25. MODAL
   ========================================================================== */

.ion-modal-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.70);
  backdrop-filter: blur(4px);
  z-index: var(--ion-z-modal);
  display: flex;
  align-items: center;
  justify-content: center;
  animation: ion-fade-in 0.2s ease both;
}

@keyframes ion-fade-in {
  from { opacity: 0; }
  to   { opacity: 1; }
}

.ion-modal {
  width: 100%;
  max-width: 520px;
  max-height: 90vh;
  overflow-y: auto;
  animation: ion-modal-in 0.3s cubic-bezier(0.16, 1, 0.3, 1) both;
}

@keyframes ion-modal-in {
  from { opacity: 0; transform: scale(0.95) translateY(16px); }
  to   { opacity: 1; transform: scale(1) translateY(0); }
}

.ion-modal-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: var(--ion-sp-5) var(--ion-sp-6);
  border-bottom: 1px solid var(--ion-border);
}
.ion-modal-title {
  font-family: var(--ion-font-display);
  font-size: 16px;
  font-weight: 700;
}
.ion-modal-close {
  background: none;
  border: none;
  color: var(--ion-text-muted);
  cursor: pointer;
  font-size: 18px;
  line-height: 1;
  padding: 0 var(--ion-sp-1);
  transition: color 0.15s;
}
.ion-modal-close:hover { color: var(--ion-text); }
.ion-modal-body    { padding: var(--ion-sp-6); }
.ion-modal-footer  {
  display: flex;
  justify-content: flex-end;
  gap: var(--ion-sp-2);
  padding: var(--ion-sp-4) var(--ion-sp-6);
  border-top: 1px solid var(--ion-border);
}
/* Live MM:SS countdown in the session-expiry warning modal. */
.ion-session-countdown {
  margin: var(--ion-sp-3) 0 0;
  font-family: var(--ion-font-mono);
  font-size: 22px;
  font-weight: 700;
  color: var(--ion-cyan);
  letter-spacing: 0.02em;
}

/* ==========================================================================
   26. ALERT BANNERS
   ========================================================================== */

.ion-alert {
  display: flex;
  align-items: flex-start;
  gap: var(--ion-sp-3);
  padding: var(--ion-sp-3) var(--ion-sp-4);
  border-radius: var(--ion-radius);
  border: 1px solid;
  font-size: 13px;
  line-height: 1.5;
  margin-bottom: var(--ion-sp-4);
}

.ion-alert--info    { border-color: rgba(var(--ion-cyan-rgb), 0.25); background: rgba(var(--ion-cyan-rgb), 0.05); color: var(--ion-cyan); }
.ion-alert--success { border-color: rgba(0,255,157,0.25); background: rgba(0,255,157,0.05); color: var(--ion-success); }
.ion-alert--warning { border-color: rgba(255,184,0,0.25); background: rgba(255,184,0,0.05); color: var(--ion-warning); }
.ion-alert--error   { border-color: rgba(255,56,96,0.25);  background: rgba(255,56,96,0.05);  color: var(--ion-danger); }

/* ==========================================================================
   27. CODE BLOCK
   ========================================================================== */

.ion-code {
  background: var(--ion-bg-darker);
  border: 1px solid var(--ion-border);
  border-radius: var(--ion-radius-md);
  padding: var(--ion-sp-4);
  font-family: var(--ion-font-mono);
  font-size: 12px;
  line-height: 1.7;
  color: var(--ion-text-muted);
  overflow-x: auto;
  tab-size: 2;
}

.ion-code-inline {
  font-family: var(--ion-font-mono);
  font-size: 0.88em;
  background: var(--ion-bg-surface-2);
  border: 1px solid var(--ion-border);
  border-radius: var(--ion-radius);
  padding: 1px 6px;
  color: var(--ion-cyan);
}

/* ==========================================================================
   28. DIVIDER
   ========================================================================== */

.ion-divider {
  border: none;
  border-top: 1px solid var(--ion-border);
  margin: var(--ion-sp-4) 0;
}

.ion-divider-label {
  display: flex;
  align-items: center;
  gap: var(--ion-sp-3);
  margin: var(--ion-sp-4) 0;
}
.ion-divider-label::before,
.ion-divider-label::after {
  content: '';
  flex: 1;
  border-top: 1px solid var(--ion-border);
}
.ion-divider-label span {
  font-family: var(--ion-font-mono);
  font-size: 9px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ion-text-faint);
  white-space: nowrap;
}

/* ==========================================================================
   29. LOGIN PAGE COMPONENTS
   ========================================================================== */

.ion-login-root {
  width: 100%;
  min-height: 100vh;
  background: var(--ion-bg-darker);
  display: flex;
  align-items: center;
  justify-content: center;
  position: relative;
  overflow: hidden;
  font-family: var(--ion-font-display);
}

canvas#ion-bg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}

/* Orbital rings */
.ion-orbital-rings {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  pointer-events: none;
}

.ion-ring {
  position: absolute;
  border-radius: 50%;
  border: 1px solid transparent;
}
.ion-ring-1 {
  width: 420px; height: 420px;
  border-color: rgba(var(--ion-cyan-rgb), 0.10);
  animation: ion-rotate 18s linear infinite;
}
.ion-ring-2 {
  width: 320px; height: 320px;
  border-color: rgba(var(--ion-magenta-rgb), 0.08);
  animation: ion-rotate 12s linear infinite reverse;
}
.ion-ring-3 {
  width: 520px; height: 220px;
  border-color: rgba(0, 200, 255, 0.05);
  animation: ion-rotate-3 20s linear infinite;
  transform: rotateX(70deg);
}

.ion-ring-dot {
  position: absolute;
  width: 5px; height: 5px;
  border-radius: 50%;
  top: -2.5px; inset-inline-start: calc(50% - 2.5px);
  box-shadow: 0 0 8px currentColor;
}
.ion-ring-1 .ion-ring-dot { background: var(--ion-cyan); color: var(--ion-cyan); }
.ion-ring-2 .ion-ring-dot { background: var(--ion-magenta); color: var(--ion-magenta); }

.ion-nucleus {
  position: absolute;
  width: 14px; height: 14px;
  border-radius: 50%;
  background: radial-gradient(circle, #fff 0%, var(--ion-cyan) 50%, var(--ion-magenta) 100%);
  box-shadow: 0 0 20px var(--ion-cyan), 0 0 40px var(--ion-magenta), 0 0 60px rgba(var(--ion-cyan-rgb), 0.3);
  animation: ion-nucleus-pulse 3s ease-in-out infinite;
  z-index: 2;
}

.ion-scan-line {
  position: absolute;
  inset-inline-start: 0; inset-inline-end: 0;
  height: 1px;
  background: linear-gradient(90deg, transparent, rgba(var(--ion-cyan-rgb), 0.12), rgba(var(--ion-magenta-rgb), 0.12), transparent);
  animation: ion-scan 8s linear infinite;
  z-index: 3;
  pointer-events: none;
}

/* Login card */
.ion-login-card {
  position: relative;
  z-index: 10;
  width: 380px;
  padding: 44px 40px 40px;
  animation: ion-card-in 1.2s cubic-bezier(0.16,1,0.3,1) both;
}

.ion-login-brand {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  margin-bottom: 36px;
}

.ion-login-eyebrow {
  font-family: var(--ion-font-mono);
  font-size: 9px;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.28);
  margin-bottom: 8px;
}

.ion-login-product {
  font-family: var(--ion-font-display);
  font-size: 52px;
  font-weight: 800;
  letter-spacing: -0.03em;
  line-height: 1;
  background: var(--ion-gradient);
  background-size: 200% 200%;
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
  animation: ion-login-product-shift 7s ease-in-out infinite;
}

@keyframes ion-login-product-shift {
  0%, 100% { background-position: 0% 50%; }
  50%       { background-position: 100% 50%; }
}

.ion-login-tagline {
  font-family: var(--ion-font-mono);
  font-size: 9px;
  letter-spacing: 0.12em;
  color: rgba(var(--ion-cyan-rgb), 0.40);
  margin-top: 6px;
  text-transform: uppercase;
}

.ion-login-footer {
  display: flex;
  align-items: center;
  justify-content: center;
  margin-top: var(--ion-sp-6);
  gap: 6px;
}
.ion-login-footer-text {
  font-family: var(--ion-font-mono);
  font-size: 9px;
  color: rgba(255,255,255,0.20);
  letter-spacing: 0.10em;
  text-transform: uppercase;
}
.ion-login-footer-link {
  font-family: var(--ion-font-mono);
  font-size: 9px;
  color: rgba(var(--ion-magenta-rgb), 0.55);
  letter-spacing: 0.10em;
  text-transform: uppercase;
  cursor: pointer;
  text-decoration: none;
  transition: color var(--ion-t);
}
.ion-login-footer-link:hover { color: rgba(var(--ion-magenta-rgb), 1); }

.ion-watermark {
  position: absolute;
  bottom: 20px;
  inset-inline-start: 50%;
  transform: translateX(-50%);
  font-family: var(--ion-font-mono);
  font-size: 8px;
  letter-spacing: 0.25em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.07);
  z-index: 5;
  white-space: nowrap;
}

/* OAuth2 provider buttons */
.ion-oauth-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--ion-sp-2);
  width: 100%;
  padding: 14px 32px;
  background: var(--ion-bg-surface);
  border: 1px solid var(--ion-border-mid);
  border-radius: var(--ion-radius);
  color: var(--ion-text-muted);
  font-family: var(--ion-font-mono);
  font-size: 14px;
  font-weight: 600;
  letter-spacing: 0.04em;
  cursor: pointer;
  text-decoration: none;
  transition: border-color var(--ion-t), background var(--ion-t), color var(--ion-t);
  margin-bottom: var(--ion-sp-2);
}
.ion-oauth-btn:hover {
  border-color: var(--ion-border-focus);
  background: var(--ion-bg-surface-2);
  color: var(--ion-text);
}
.ion-oauth-btn-icon {
  height: 32px;
}

/* ==========================================================================
   30. APPLICATION SHELL
   ========================================================================== */

.ion-app {
  display: flex;
  flex-direction: column;
  height: 100vh;
  overflow: hidden;
}

.ion-app-body {
  display: flex;
  flex: 1;
  overflow: hidden;
}

.ion-app-sidebar {
  width: 220px;
  flex-shrink: 0;
  border-inline-end: 1px solid var(--ion-border);
  overflow-y: auto;
  background: rgba(0, 0, 0, 0.30);
  transition: width var(--ion-t);
}
.ion-app-sidebar--collapsed { width: 48px; }

.ion-app-main {
  flex: 1;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

.ion-content-area {
  flex: 1;
  overflow: hidden;
  position: relative;
  display: flex;
  flex-direction: column;
}

/* Single shared animated backdrop behind all tabs — initialised once in ion.js
   and survives tab/file navigations. Replaces the per-tab canvas that used to
   live inside new_tab.html and would reset on every navigation. */
.ion-app-bg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  z-index: 0;
}

/* Per-tab content panels (created dynamically by ion.js) */
.ion-tab-content {
  flex: 1;
  min-height: 0;
  overflow: auto;
  position: relative;
  /* Above the shared .ion-app-bg backdrop. */
  z-index: 1;
  padding: var(--ion-sp-6);
  display: flex;
  flex-direction: column;
}

/* HTMX loading indicator */
.ion-content-area.htmx-request::after {
  content: '';
  position: absolute;
  top: 0; inset-inline-start: 0; inset-inline-end: 0;
  height: 2px;
  background: var(--ion-gradient-cm);
  background-size: 200% 100%;
  animation: ion-gradient-shift 1s linear infinite, ion-progress-slide 1.2s ease-in-out infinite;
}

/* ==========================================================================
   31. HTMX INTEGRATION
   ========================================================================== */

/* Hide elements while HTMX is swapping */
.htmx-swapping { opacity: 0; transition: opacity 0.15s ease; }
.htmx-settling  { opacity: 0; }
.htmx-added     { animation: ion-fade-in 0.25s ease both; }

/* Indicator shown on htmx-request parent */
[hx-indicator].htmx-request .ion-spinner,
[data-hx-indicator].htmx-request .ion-spinner { display: inline-block; }
.ion-spinner { display: none; }

/* ==========================================================================
   32. KEYFRAMES
   ========================================================================== */

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

@keyframes ion-rotate-3 {
  from { transform: rotateX(70deg) rotateZ(0deg); }
  to   { transform: rotateX(70deg) rotateZ(360deg); }
}

@keyframes ion-nucleus-pulse {
  0%, 100% {
    transform: scale(1);
    box-shadow: 0 0 20px var(--ion-cyan), 0 0 40px var(--ion-magenta);
  }
  50% {
    transform: scale(1.4);
    box-shadow: 0 0 30px var(--ion-cyan), 0 0 60px var(--ion-magenta), 0 0 80px rgba(var(--ion-cyan-rgb), 0.4);
  }
}

@keyframes ion-scan {
  0%   { top: -1px; opacity: 0; }
  5%   { opacity: 1; }
  95%  { opacity: 1; }
  100% { top: 100%; opacity: 0; }
}

@keyframes ion-card-in {
  from { opacity: 0; transform: translateY(20px) scale(0.97); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}

/* ==========================================================================
   33. RESPONSIVE
   ========================================================================== */

@media (max-width: 768px) {
  .ion-app-sidebar { display: none; }
  .ion-login-card  { width: 100%; max-width: 380px; padding: 36px 24px; }
  .ion-container   { padding: 0 var(--ion-sp-4); }
}

/* ==========================================================================
   34. PAGE-LEVEL BODY VARIANTS
   Keeps body styles in CSS rather than inline.
   ========================================================================== */

body.ion-page-login {
  margin: 0;
  overflow: hidden;
}

body.ion-page-app {
  display: flex;
  flex-direction: column;
  height: 100vh;
  overflow: hidden;
  background: transparent;
}

/* ==========================================================================
   35. TOP BAR — APP VARIANT
   Tabs sit flush inside the top bar on the same line as the logo.
   Apply .ion-top-bar--app alongside .ion-top-bar.
   ========================================================================== */

.ion-top-bar--app {
  align-items: stretch;
  height: 44px;
  padding: 0;
}

.ion-top-bar-logo {
  display: flex;
  align-items: center;
  gap: var(--ion-sp-2);
  padding: 0 var(--ion-sp-3) 0 14px;
  flex-shrink: 0;
  border-inline-end: 1px solid var(--ion-border);
}

/* Themeable via --ion-logo-height */
.ion-top-bar-logo img {
  height: var(--ion-logo-height, 32px);
  width: auto;
}

/* Tab bar fills the remaining width when inside a top bar */
.ion-top-bar--app .ion-tab-bar {
  flex: 1;
  height: 100%;
  border-bottom: none;
  background: transparent;
  min-width: 0;
}

/* Actions area right-hand side */
.ion-top-bar--app .ion-top-bar-actions {
  padding: 0 var(--ion-sp-2);
  border-inline-start: 1px solid var(--ion-border);
}

/* ==========================================================================
   36. APP MAIN
   ========================================================================== */

/* position:relative needed for the HTMX progress bar overlay */
.ion-app-main { position: relative; }

/* ==========================================================================
   38. LOGIN PAGE ADDITIONAL COMPONENTS
   ========================================================================== */

/* Themeable via --ion-login-logo-height */
.ion-login-logo {
  height: var(--ion-login-logo-height, 300px);
  width: auto;
  align-self: center;
}

.ion-login-product-name {
  margin: 0 auto;
}

.ion-login-form-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: var(--ion-sp-6);
}

/* ==========================================================================
   39. UTILITIES
   ========================================================================== */

/* Inline form wrapper (e.g. logout button inside a <form>) */
.ion-form-inline { display: inline; }

/* Absolute progress bar overlay at top of a position:relative container */
.ion-progress--overlay {
  position: absolute;
  top: 0; inset-inline-start: 0; inset-inline-end: 0;
  height: 2px;
  opacity: 0;
  transition: opacity 0.2s;
}
.ion-progress--overlay.is-loading { opacity: 1; }

/* Native hidden attribute — explicit so any display override needs !important */
[hidden] { display: none !important; }

/* ==========================================================================
   TWO-TREE FILE SYSTEM — Folder view, App tiles, Mode panel
   ========================================================================== */

/* --------------------------------------------------------------------------
   Mode switcher panel
   -------------------------------------------------------------------------- */

.ion-modebar {
  position: fixed;
  z-index: var(--ion-z-overlay, 200);
  display: flex;
  gap: var(--ion-space-1);
  padding: var(--ion-space-2);
  background: rgba(10, 10, 15, 0.85);
  backdrop-filter: blur(12px);
  border: 1px solid rgba(255,255,255,0.08);
  border-radius: var(--ion-radius-lg);
  box-shadow: 0 4px 24px rgba(0,0,0,0.5);
}

.ion-modebar--left {
  flex-direction: column;
  top: 50%;
  inset-inline-start: var(--ion-space-4);
  transform: translateY(-50%);
}

.ion-modebar--right {
  flex-direction: column;
  top: 50%;
  inset-inline-end: var(--ion-space-4);
  inset-inline-start: auto;
  transform: translateY(-50%);
}

.ion-modebar--top {
  flex-direction: row;
  top: calc(var(--ion-top-bar-height, 48px) + var(--ion-space-2));
  inset-inline-start: 50%;
  transform: translateX(-50%);
}

.ion-modebar-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border: none;
  border-radius: var(--ion-radius-md);
  background: transparent;
  color: var(--ion-text-muted);
  cursor: pointer;
  transition: background 0.15s, color 0.15s;
  font-size: 1rem;
}
/* SVG icons inside modebar buttons scale with the button and inherit its colour */
.ion-modebar-btn svg,
.ion-modebar-btn > svg {
  display: block;
  width: 20px;
  height: 20px;
  flex-shrink: 0;
}

.ion-modebar-btn:hover {
  background: rgba(255,255,255,0.08);
  color: var(--ion-text);
}

.ion-modebar-btn--active {
  background: rgba(var(--ion-cyan-rgb), 0.15);
  color: var(--ion-cyan);
  box-shadow: 0 0 0 1px var(--ion-cyan);
}

/* Run→Stop toggle: while a workbook run is in flight, its Run action button
   turns red and its glyph is overlaid with a ■ so it reads as "stop the run". */
.ion-modebar-btn--stopping {
  position: relative;
  color: var(--ion-danger, #ea5455);
  box-shadow: inset 0 0 0 1px rgba(234, 84, 85, 0.5);
}
.ion-modebar-btn--stopping > * { opacity: 0.25; }
.ion-modebar-btn--stopping::after {
  content: '\25A0'; /* ■ */
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--ion-danger, #ea5455);
  font-size: 12px;
  pointer-events: none;
}

/* Unsaved-changes indicator on save button — toggles cyan glow and pulsing animation */
.ion-modebar-btn--dirty {
  position: relative;
  color: var(--ion-cyan, #00e5ff);
  animation: ion-pulse-glow 2s ease-in-out infinite;
}

@keyframes ion-pulse-glow {
  0%, 100% {
    text-shadow: 0 0 0 0 rgba(var(--ion-cyan-rgb), 0.4),
                 0 0 4px 0 rgba(var(--ion-cyan-rgb), 0.3);
  }
  50% {
    text-shadow: 0 0 0 4px rgba(var(--ion-cyan-rgb), 0.1),
                 0 0 8px 4px rgba(var(--ion-cyan-rgb), 0.2);
  }
}

.ion-modebar-btn--danger:hover {
  color: var(--ion-error, #ff4444);
  background: rgba(255, 68, 68, 0.12);
}

.ion-modebar-group { position: relative; }

.ion-modebar-divider {
  border: none;
  border-top: 1px solid rgba(255,255,255,0.08);
  margin: var(--ion-space-1, 4px) 0;
}
.ion-modebar--top .ion-modebar-divider {
  border-top: none;
  border-inline-start: 1px solid rgba(255,255,255,0.08);
  margin: 0 var(--ion-space-1, 4px);
  align-self: stretch;
}

/* Flyout menu from (+) button */
.ion-modebar-flyout {
  position: absolute;
  inset-inline-start: calc(100% + 8px);
  top: 0;
  min-width: 160px;
  background: rgba(10, 10, 15, 0.95);
  backdrop-filter: blur(12px);
  border: 1px solid rgba(255,255,255,0.08);
  border-radius: var(--ion-radius-lg, 10px);
  box-shadow: 0 4px 24px rgba(0,0,0,0.5);
  padding: var(--ion-space-1, 4px) 0;
  z-index: 210;
}

/* When modebar is on right, flyout should open to the left */
.ion-modebar--right .ion-modebar-flyout {
  inset-inline-start: auto;
  inset-inline-end: calc(100% + 8px);
}

/* When modebar is on top, flyout opens downward */
.ion-modebar--top .ion-modebar-flyout {
  inset-inline-start: 0;
  top: calc(100% + 8px);
}

.ion-modebar-flyout-btn {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  padding: 6px 14px;
  border: none;
  background: transparent;
  color: var(--ion-text-muted);
  font-family: var(--ion-font-mono, 'Space Mono', monospace);
  font-size: 12px;
  text-align: start;
  cursor: pointer;
  white-space: nowrap;
  transition: background 0.1s, color 0.1s;
}

.ion-modebar-flyout-btn:hover {
  background: rgba(255,255,255,0.08);
  color: var(--ion-text);
}

.ion-modebar-flyout-hr {
  border: none;
  border-top: 1px solid rgba(255,255,255,0.08);
  margin: 4px 0;
}

/* Selection action group (hidden when no files selected) */
.ion-modebar-selection { display: flex; flex-direction: column; gap: var(--ion-space-1, 4px); }
.ion-modebar--top .ion-modebar-selection { flex-direction: row; }

/* Drag-to-dock docking points overlay */
.ion-docking-overlay {
  position: fixed;
  top: 0;
  inset-inline-start: 0;
  width: 100%;
  height: 100%;
  z-index: 199;
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.15s;
}

.ion-docking-overlay.show {
  opacity: 1;
}

.ion-docking-svg {
  width: 100%;
  height: 100%;
}

.ion-docking-point {
  fill: var(--ion-cyan, #00e5ff);
  opacity: 0.3;
  transition: opacity 0.1s, r 0.1s;
}

.ion-docking-point--active {
  opacity: 1;
  r: 6px;
  filter: drop-shadow(0 0 4px var(--ion-cyan, #00e5ff));
}

/* Modebar during drag */
.ion-modebar--dragging {
  opacity: 0.7;
  pointer-events: none;
  cursor: grabbing;
}

/* Reposition button is a drag handle */
.ion-modebar-cycle button {
  cursor: grab;
  transition: transform 0.1s;
}

.ion-modebar-cycle button:active {
  cursor: grabbing;
  transform: scale(1.05);
}

.ion-modebar--dragging .ion-modebar-cycle button {
  cursor: grabbing;
}

/* Modebar docking — positioned via clamped --dock-x / --dock-y pixel vars */
.ion-modebar--docked {
  position: fixed !important;
  transform: none !important;
  right: auto !important;
  bottom: auto !important;
}

/* Top edge: horizontal bar flush below navbar */
.ion-modebar--docked.ion-modebar--dock-top {
  flex-direction: row !important;
  top: calc(var(--ion-top-bar-height, 48px) + var(--ion-space-2, 8px)) !important;
  left: var(--dock-x, 25%) !important;
}

/* Bottom edge: horizontal bar flush to bottom */
.ion-modebar--docked.ion-modebar--dock-bottom {
  flex-direction: row !important;
  top: auto !important;
  bottom: var(--ion-space-4, 16px) !important;
  left: var(--dock-x, 25%) !important;
}

/* Left edge: vertical bar flush to left */
.ion-modebar--docked.ion-modebar--dock-left {
  flex-direction: column !important;
  top: var(--dock-y, 50%) !important;
  left: var(--ion-space-4, 16px) !important;
}

/* Right edge: vertical bar flush to right */
.ion-modebar--docked.ion-modebar--dock-right {
  flex-direction: column !important;
  top: var(--dock-y, 50%) !important;
  left: auto !important;
  right: var(--ion-space-4, 16px) !important;
}

/* --------------------------------------------------------------------------
   File info panel (slides in from right on file click)
   -------------------------------------------------------------------------- */
.ion-info-panel {
  position: absolute;
  top: 0; inset-inline-end: 0; bottom: 0;
  width: 300px;
  max-width: 80%;
  background: rgba(10, 10, 15, 0.92);
  backdrop-filter: blur(12px);
  border-inline-start: 1px solid rgba(255,255,255,0.08);
  box-shadow: -4px 0 24px rgba(0,0,0,0.4);
  z-index: 150;
  overflow-y: auto;
  padding: var(--ion-space-4, 16px);
  transform: translateX(100%);
  transition: transform 0.2s ease-out;
}
.ion-info-panel--open { transform: translateX(0); }

.ion-info-panel-close {
  position: absolute;
  top: 8px; inset-inline-end: 8px;
  border: none;
  background: transparent;
  color: var(--ion-text-muted, #888);
  cursor: pointer;
  font-size: 16px;
  padding: 4px 8px;
  border-radius: 3px;
}
.ion-info-panel-close:hover {
  color: var(--ion-text, #e8e8f0);
  background: rgba(255,255,255,0.08);
}

.ion-info-header {
  display: flex;
  align-items: center;
  gap: var(--ion-space-3, 12px);
  margin-bottom: var(--ion-space-4, 16px);
  padding-inline-end: 24px;
}
.ion-info-icon { font-size: 2rem; }
.ion-info-name {
  font-family: var(--ion-font-display, 'Syne', sans-serif);
  font-size: 1rem;
  font-weight: 600;
  color: var(--ion-text, #e8e8f0);
  word-break: break-word;
}

.ion-info-body { display: flex; flex-direction: column; gap: var(--ion-space-2, 8px); }

.ion-info-actions {
  display: flex;
  gap: var(--ion-space-2, 8px);
  padding: 0 0 var(--ion-space-1, 4px);
}

.ion-info-row {
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.ion-info-label {
  font-family: var(--ion-font-mono, 'Space Mono', monospace);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ion-text-muted, #888);
}
.ion-info-value {
  font-size: 13px;
  color: var(--ion-text, #e8e8f0);
  word-break: break-word;
}
.ion-info-badges {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
}
.ion-info-badges .ion-badge {
  font-size: 10px;
  padding: 2px 6px;
}

/* --------------------------------------------------------------------------
   New-tab page
   -------------------------------------------------------------------------- */

.ion-newtab-page {
  position: relative;
  width: 100%;
  min-height: 100%;
}

.ion-newtab-sidebar,
.ion-newtab {
  position: relative;
  z-index: 1;
}

.ion-newtab {
  padding: var(--ion-sp-6) var(--ion-sp-8);
  max-width: 1200px;
  margin: 0 auto;
  width: 100%;
}

.ion-newtab-hero {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  min-height: 60vh;
  padding: var(--ion-sp-8) 0 var(--ion-sp-6);
  text-align: center;
}

.ion-newtab-logo {
  height: var(--ion-login-logo-height, 300px);
  width: auto;
  margin-bottom: var(--ion-sp-4);
}

.ion-newtab-title {
  font-family: var(--ion-font-display);
  font-size: 52px;
  font-weight: 800;
  letter-spacing: -0.03em;
  line-height: 1;
  background: var(--ion-gradient-cm);
  background-size: 200% 100%;
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
  margin-bottom: 6px;
}

.ion-newtab-tagline {
  font-family: var(--ion-font-mono);
  font-size: 9px;
  letter-spacing: 0.12em;
  color: rgba(var(--ion-cyan-rgb), 0.40);
  text-transform: uppercase;
  margin-bottom: var(--ion-sp-6);
}

/* Greeting — async agent-populated, above chat */
.ion-newtab-greeting {
  font-family: var(--ion-font-body);
  font-size: 1rem;
  color: var(--ion-text-muted);
  margin-bottom: var(--ion-sp-4);
  min-height: 1.5em;
}

/* Chat messages — scrollable history above the input */
.ion-chat-messages {
  display: flex;
  flex-direction: column;
  gap: var(--ion-sp-2);
  max-height: 300px;
  overflow-y: auto;
  margin-bottom: var(--ion-sp-3);
  scrollbar-width: thin;
  scrollbar-color: var(--ion-border) transparent;
}

.ion-chat-messages:empty {
  display: none;
}

.ion-chat-msg {
  font-family: var(--ion-font-body);
  font-size: 0.875rem;
  line-height: 1.5;
  padding: var(--ion-sp-2) var(--ion-sp-3);
  border-radius: var(--ion-radius-lg);
  max-width: 85%;
  word-wrap: break-word;
}

.ion-chat-msg-user {
  align-self: flex-end;
  background: rgba(var(--ion-cyan-rgb), 0.10);
  color: var(--ion-text);
}

.ion-chat-msg-assistant {
  text-align: start;
  align-self: flex-start;
  background: var(--ion-bg-surface-2);
  color: var(--ion-text);
}

/* Pondering indicator — animated gradient bar while waiting for agent response */
.ion-chat-pondering {
  align-self: flex-start;
  width: 120px;
  height: 4px;
  border-radius: 2px;
  margin: var(--ion-sp-2) var(--ion-sp-3);
  background: linear-gradient(
    90deg,
    transparent 0%,
    var(--ion-cyan) 30%,
    var(--ion-magenta) 70%,
    transparent 100%
  );
  background-size: 200% 100%;
  animation: ion-ponder 1.8s ease-in-out infinite;
  opacity: 0.7;
}

@keyframes ion-ponder {
  0%   { background-position: 100% 0; opacity: 0.4; }
  50%  { background-position: 0% 0;   opacity: 1; }
  100% { background-position: 100% 0; opacity: 0.4; }
}

/* Streaming cursor — blinking block at the end of an in-progress message */
.ion-chat-streaming::after {
  content: '\2588';  /* full block character */
  animation: ion-blink 0.8s step-end infinite;
  color: var(--ion-cyan);
}
@keyframes ion-blink {
  0%, 100% { opacity: 1; }
  50%      { opacity: 0; }
}

/* Chat input — full-width prompt with mic + drag/drop */
.ion-newtab-chat {
  width: 100%;
  max-width: 680px;
  margin-bottom: var(--ion-sp-6);
  position: relative;
}

.ion-newtab-chat-input {
  display: flex;
  align-items: center;
  background: var(--ion-bg-surface-2);
  border: 1px solid var(--ion-border-mid);
  border-radius: var(--ion-radius-lg);
  padding: var(--ion-sp-4) var(--ion-sp-5);
  gap: var(--ion-sp-3);
  transition: border-color 0.2s, box-shadow 0.2s;
}

.ion-newtab-chat-input:focus-within {
  border-color: var(--ion-border-focus);
  box-shadow: 0 0 0 2px rgba(var(--ion-cyan-rgb), 0.10);
}

.ion-newtab-chat-input.ion-newtab-chat-dragover {
  border-color: var(--ion-cyan);
  box-shadow: 0 0 16px rgba(var(--ion-cyan-rgb), 0.15);
  background: rgba(var(--ion-cyan-rgb), 0.04);
}

.ion-newtab-chat-input input {
  flex: 1;
  background: transparent;
  border: none;
  outline: none;
  color: var(--ion-text);
  font-family: var(--ion-font-body);
  font-size: 0.9375rem;
  line-height: 1.5;
  min-width: 0;
}

.ion-newtab-chat-input input::placeholder {
  color: var(--ion-text-dim);
}

.ion-newtab-chat-mic {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background: transparent;
  border: none;
  color: var(--ion-text-dim);
  cursor: pointer;
  transition: color 0.2s, background 0.2s;
  padding: 0;
}

.ion-newtab-chat-mic:hover {
  color: var(--ion-cyan);
  background: rgba(var(--ion-cyan-rgb), 0.08);
}

.ion-newtab-chat-mic svg {
  width: 16px;
  height: 16px;
}

/* Sidebar tiles — pinned to left edge of page, outside centred content */
.ion-newtab-sidebar {
  position: absolute;
  inset-inline-start: 0;
  top: 50%;
  transform: translateY(-50%);
  display: flex;
  flex-direction: column;
  gap: var(--ion-sp-2);
  padding: var(--ion-sp-4);
  z-index: 10;
}

.ion-newtab-tile {
  width: 72px;
  height: 72px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 6px;
  border-radius: var(--ion-radius-lg);
  cursor: pointer;
  transition: background 0.12s;
  text-decoration: none;
  padding: 0;
}

.ion-newtab-tile:hover {
  background: rgba(255, 255, 255, 0.06);
}

.ion-newtab-tile-icon {
  width: 24px;
  height: 24px;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--ion-text-muted);
}

.ion-newtab-tile-icon svg {
  width: 24px;
  height: 24px;
}

.ion-newtab-tile:hover .ion-newtab-tile-icon {
  color: var(--ion-cyan);
}

.ion-newtab-tile-label {
  font-family: var(--ion-font-mono);
  font-size: 9px;
  font-weight: 500;
  color: var(--ion-text-dim);
  letter-spacing: 0.03em;
  text-transform: uppercase;
}

.ion-newtab-tile:hover .ion-newtab-tile-label {
  color: var(--ion-text);
}

.ion-newtab-quicklinks {
  display: flex;
  gap: var(--ion-space-3);
  margin-bottom: 0;
}

/* Connectivity indicator — three-state traffic-light dot in the top bar.
 *  red    (.ion-connectivity--failed)   — browser→ION WebSocket not connected
 *  orange (.ion-connectivity--degraded) — ION connected, but ION→Gluon is down
 *  green  (.ion-connectivity--connected)— full stack healthy
 *  default (amber)                      — connecting / unknown
 */
.ion-connectivity {
  display: inline-block;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: var(--ion-amber, #f59e0b);
  box-shadow: 0 0 6px var(--ion-amber, #f59e0b);
  flex-shrink: 0;
  align-self: center;
  transition: background 0.3s, box-shadow 0.3s;
}
.ion-connectivity--connected {
  background: #22c55e;
  box-shadow: 0 0 6px #22c55e;
}
.ion-connectivity--degraded {
  background: #f97316;
  box-shadow: 0 0 6px #f97316;
}
.ion-connectivity--failed {
  background: #ef4444;
  box-shadow: 0 0 6px #ef4444;
}

.ion-newtab-section {
  margin-bottom: var(--ion-sp-8);
}

.ion-newtab-heading {
  font-family: var(--ion-font-display);
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ion-text-muted);
  margin-bottom: var(--ion-space-3);
  padding-bottom: var(--ion-space-2);
  border-bottom: 1px solid rgba(255,255,255,0.06);
}

/* --------------------------------------------------------------------------
   App tiles (apps/ tree — bold, launch-screen aesthetic)
   -------------------------------------------------------------------------- */

.ion-apps-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
  gap: var(--ion-space-3);
}

.ion-app-tile {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--ion-space-2);
  padding: var(--ion-space-4) var(--ion-space-3);
  background: linear-gradient(135deg, rgba(var(--ion-cyan-rgb), 0.08), rgba(var(--ion-magenta-rgb), 0.08));
  border: 1px solid rgba(var(--ion-cyan-rgb), 0.2);
  border-radius: var(--ion-radius-lg);
  cursor: pointer;
  transition: transform 0.15s, border-color 0.15s, box-shadow 0.15s;
  user-select: none;
  text-align: center;
}

.ion-app-tile:hover {
  transform: translateY(-2px);
  border-color: var(--ion-cyan);
  box-shadow: 0 4px 20px rgba(var(--ion-cyan-rgb), 0.2);
}

.ion-app-tile:active { transform: translateY(0); }

/* Favourites tile — adds a positioned unpin button */
.ion-app-tile--fav { position: relative; }

.ion-app-tile-unpin {
  position: absolute;
  top: var(--ion-space-1);
  inset-inline-end: var(--ion-space-1);
  display: none;
  width: 18px;
  height: 18px;
  padding: 0;
  font-size: 0.65rem;
  line-height: 18px;
  text-align: center;
  background: rgba(255,255,255,0.08);
  border: 1px solid rgba(255,255,255,0.15);
  border-radius: 50%;
  color: var(--ion-text-faint);
  cursor: pointer;
  transition: background 0.1s, color 0.1s;
}

.ion-app-tile--fav:hover .ion-app-tile-unpin { display: block; }

.ion-app-tile-unpin:hover {
  background: rgba(255, 77, 77, 0.2);
  border-color: #ff4d4d;
  color: #ff4d4d;
}

.ion-app-tile-icon {
  font-size: 2.5rem;
  line-height: 1;
  filter: drop-shadow(0 0 6px rgba(var(--ion-cyan-rgb), 0.5));
}

.ion-app-tile-name {
  font-family: var(--ion-font-display);
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--ion-text);
  word-break: break-word;
}

/* App category folder tiles — less prominent than app tiles */
.ion-app-folder-tile {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--ion-space-2);
  padding: var(--ion-space-3);
  background: rgba(255,255,255,0.03);
  border: 1px solid rgba(255,255,255,0.08);
  border-radius: var(--ion-radius-lg);
  cursor: pointer;
  transition: background 0.15s, border-color 0.15s;
  user-select: none;
  text-align: center;
}

.ion-app-folder-tile:hover {
  background: rgba(255,255,255,0.06);
  border-color: rgba(255,255,255,0.16);
}

.ion-app-folder-icon { font-size: 1.75rem; line-height: 1; }

.ion-app-folder-name {
  font-size: 0.78rem;
  color: var(--ion-text-muted);
  word-break: break-word;
}

/* --------------------------------------------------------------------------
   File tiles (files/ tree — large-icon Explorer aesthetic)
   -------------------------------------------------------------------------- */

.ion-folder-grid {
  display: grid;
  gap: var(--ion-space-2);
}

.ion-folder-grid--files {
  grid-template-columns: repeat(auto-fill, minmax(125px, 1fr));
}

.ion-folder-grid--apps {
  grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
}

.ion-file-tile {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--ion-space-2);
  padding: var(--ion-space-4) var(--ion-space-3);
  border-radius: var(--ion-radius-md);
  cursor: pointer;
  transition: background 0.12s;
  user-select: none;
  text-align: center;
  position: relative;
}

.ion-file-tile:hover {
  background: rgba(255,255,255,0.06);
}

.ion-file-tile:active {
  background: rgba(var(--ion-cyan-rgb), 0.1);
}

/* Selection state (Ctrl/Shift + click) */
.ion-file-tile--selected {
  background: rgba(var(--ion-cyan-rgb), 0.13);
  outline: 1px solid rgba(var(--ion-cyan-rgb), 0.45);
  outline-offset: -1px;
  border-radius: var(--ion-radius-md);
}
.ion-file-tile--selected:hover {
  background: rgba(var(--ion-cyan-rgb), 0.2);
}

.ion-file-tile-icon {
  font-size: 2.8rem;
  line-height: 1;
}

.ion-file-tile-name {
  font-size: 0.8rem;
  color: var(--ion-text);
  word-break: break-word;
  max-width: 110px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* SVG file-type icons */
.ion-ficon {
  width: 2.8rem;
  height: 2.8rem;
  transition: filter 0.15s;
}
.ion-file-tile:hover .ion-ficon,
.ion-app-tile:hover .ion-ficon {
  filter: brightness(1.3) drop-shadow(0 0 4px rgba(255,255,255,0.15));
}
.ion-file-tile--selected .ion-ficon {
  filter: brightness(1.4) drop-shadow(0 0 6px rgba(var(--ion-cyan-rgb), 0.3));
}

/* Git status badges */
.ion-git-badge {
  position: absolute;
  top: 4px;
  inset-inline-end: 4px;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  font-size: 0.6rem;
  font-weight: 700;
  font-family: var(--ion-font-mono);
  display: flex;
  align-items: center;
  justify-content: center;
  line-height: 1;
  pointer-events: none;
}
.ion-git-added    { background: rgba(46, 160, 67, 0.25); color: #3fb950; }
.ion-git-modified { background: rgba(210, 153, 34, 0.25); color: #d29922; }
.ion-git-deleted  { background: rgba(248, 81, 73, 0.25); color: #f85149; }

.ion-git-count {
  position: absolute;
  top: -2px;
  inset-inline-end: -2px;
  min-width: 16px;
  height: 16px;
  border-radius: 8px;
  padding: 0 4px;
  font-size: 0.6rem;
  font-weight: 700;
  font-family: var(--ion-font-mono);
  background: rgba(var(--ion-cyan-rgb), 0.2);
  color: var(--ion-cyan);
  display: flex;
  align-items: center;
  justify-content: center;
  line-height: 1;
  pointer-events: none;
}

/* Empty-folder "create new" placeholder tile */
.ion-file-tile--new-placeholder {
  border: 1px dashed var(--ion-text-muted, #888) !important;
  opacity: 0.5;
  cursor: pointer;
  transition: opacity 0.15s, border-color 0.15s;
}
.ion-file-tile--new-placeholder:hover {
  opacity: 1;
  border-color: var(--ion-cyan, #00e5ff) !important;
}
.ion-file-tile--new-placeholder .ion-file-tile-icon {
  font-size: 1.8rem;
  color: var(--ion-text-muted, #888);
}
.ion-file-tile--new-placeholder:hover .ion-file-tile-icon {
  color: var(--ion-cyan, #00e5ff);
}

/* Inline new-file placeholder tile (from toolbar create) */
.ion-file-tile--new {
  border: 1px dashed var(--ion-cyan, #00e5ff) !important;
  background: rgba(var(--ion-cyan-rgb), 0.04);
  animation: ion-tile-pulse 1.5s ease-in-out infinite;
}
.ion-file-tile--new.ion-file-tile--saving {
  opacity: 0.5;
  pointer-events: none;
}
@keyframes ion-tile-pulse {
  0%, 100% { border-color: var(--ion-cyan, #00e5ff); }
  50% { border-color: rgba(var(--ion-cyan-rgb), 0.3); }
}
.ion-file-tile-input {
  font-family: var(--ion-font-mono, 'Space Mono', monospace);
  font-size: 0.72rem;
  color: var(--ion-text, #e8e8f0);
  background: transparent;
  border: none;
  border-bottom: 1px solid var(--ion-cyan, #00e5ff);
  outline: none;
  width: 80px;
  padding: 2px 0;
  text-align: center;
}
.ion-file-tile-input::placeholder {
  color: var(--ion-text-muted, #888);
  font-style: italic;
}

/* File-type picker that appears below the (+) New tile */
.ion-tile-type-picker {
  position: absolute;
  top: 100%;
  inset-inline-start: 50%;
  transform: translateX(-50%);
  margin-top: 4px;
  min-width: 140px;
  background: rgba(10, 10, 15, 0.95);
  backdrop-filter: blur(12px);
  border: 1px solid rgba(255,255,255,0.08);
  border-radius: var(--ion-radius-lg, 10px);
  box-shadow: 0 4px 24px rgba(0,0,0,0.5);
  padding: 4px 0;
  z-index: 210;
}
.ion-tile-type-btn {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  padding: 6px 14px;
  border: none;
  background: transparent;
  color: var(--ion-text-muted, #888);
  font-family: var(--ion-font-mono, 'Space Mono', monospace);
  font-size: 12px;
  text-align: start;
  cursor: pointer;
  white-space: nowrap;
  transition: background 0.1s, color 0.1s;
}
.ion-tile-type-btn:hover {
  background: rgba(255,255,255,0.08);
  color: var(--ion-text, #e8e8f0);
}
/* Small SVG icons inside menu buttons. `.ws-ficon` is included because the
   workspace-owned create menu reuses the workspace ICONS set (ws-ficon class). */
.ion-tile-type-btn .ion-ficon,
.ion-tile-type-btn .ws-ficon,
.ion-modebar-flyout-btn .ion-ficon {
  width: 1.1rem;
  height: 1.1rem;
  flex-shrink: 0;
}
.ion-tile-type-hr {
  border: none;
  border-top: 1px solid rgba(255,255,255,0.08);
  margin: 4px 0;
}

/* --------------------------------------------------------------------------
   Folder view layout
   -------------------------------------------------------------------------- */

.ion-folder-view {
  padding: var(--ion-space-5) var(--ion-space-6);
  width: 90%;
  margin: 0;
}

.ion-folder-breadcrumb {
  display: flex;
  align-items: center;
  gap: var(--ion-space-1);
  margin-bottom: var(--ion-space-4);
  font-size: 0.8rem;
}

.ion-breadcrumb-link {
  color: var(--ion-text-muted);
  text-decoration: none;
  cursor: pointer;
  transition: color 0.12s;
  /* Isolate user-supplied path segments so a Hebrew/Arabic filename in
     an LTR breadcrumb (or vice-versa) doesn't reorder neighbouring
     punctuation like the slash separators. */
  unicode-bidi: isolate;
}

.ion-breadcrumb-link:hover { color: var(--ion-cyan); }

.ion-breadcrumb-sep { color: rgba(255,255,255,0.2); }

.ion-breadcrumb-current {
  color: var(--ion-text);
  font-weight: 600;
}

/* Bidi isolation for user-supplied strings (filenames, paths, tab titles,
   SQL snippets, agent output). Each container gets its own embedding so
   mixed-direction text doesn't smear into the surrounding chrome.        */
.ion-tab-title,
.ion-tab-label,
.ion-folder-title,
.ion-breadcrumb-current,
.ion-breadcrumb-sep,
.ion-bdi,
.ion-file-tile-name,
.ion-file-tile-meta,
.ion-app-tile-name,
.ion-info-panel-value,
.ion-cell-id-badge,
.ion-toast-title,
.ion-toast-desc,
.ion-notif-title,
.ion-notif-desc,
.ion-notif-details,
.ion-user-dropdown-username,
.ion-user-dropdown-notif-title,
.ion-user-dropdown-notif-desc,
.ion-tab-pierce-path,
.ion-tab-pierce-label,
.ion-watermark {
  unicode-bidi: isolate;
}

/* Code / SQL / structured query text is always LTR. Even an Arabic UI
   shell renders SQL and code samples left-to-right (and any embedded
   Arabic identifiers within them stay isolated via bidi-override).    */
code,
pre,
kbd,
samp,
.ion-code,
.ion-sql,
.ion-debug-panel__log,
.ion-agent-debug-drawer__detail,
.ion-debug-line,
.ion-cell-code,
.ion-richtext-pre,
.ion-cell-richtext code,
.ion-cell-richtext pre,
.ion-generic-code {
  direction: ltr;
  unicode-bidi: isolate;
  text-align: start;
}

.ion-folder-title {
  font-family: var(--ion-font-display);
  font-size: 1.4rem;
  font-weight: 700;
  margin-bottom: var(--ion-space-3);
}

.ion-folder-description {
  background: rgba(255,255,255,0.03);
  border-inline-start: 3px solid var(--ion-cyan);
  padding: var(--ion-space-3) var(--ion-space-4);
  border-radius: 0 var(--ion-radius-md) var(--ion-radius-md) 0;
  margin-bottom: var(--ion-space-5);
  color: var(--ion-text-muted);
  font-size: 0.9rem;
  line-height: 1.6;
}

.ion-folder-actions {
  display: flex;
  align-items: center;
  gap: var(--ion-space-2);
  margin-bottom: var(--ion-space-4);
}

/* Upload label styled as a button (wraps hidden <input type="file">) */
.ion-upload-label {
  cursor: pointer;
}
.ion-upload-label input[type="file"] {
  display: none;
}

/* Drag-over highlight for the folder grid drop zone */
.ion-folder-grid--dragover {
  outline: 2px dashed var(--ion-cyan);
  outline-offset: -3px;
  background: rgba(var(--ion-cyan-rgb), 0.04);
  border-radius: var(--ion-radius-md);
}

/* --------------------------------------------------------------------------
   Inline forms (rename, new item)
   -------------------------------------------------------------------------- */

.ion-inline-form {
  display: flex;
  align-items: center;
  gap: var(--ion-space-2);
  padding: var(--ion-space-2);
}

.ion-input-sm {
  height: 28px;
  font-size: 0.8rem;
  padding: 0 var(--ion-space-2);
}

/* --------------------------------------------------------------------------
   Context menu
   -------------------------------------------------------------------------- */

.ion-ctx-menu {
  position: fixed;
  z-index: var(--ion-z-modal, 300);
  min-width: 160px;
  background: rgba(10, 10, 15, 0.95);
  backdrop-filter: blur(16px);
  border: 1px solid rgba(255,255,255,0.1);
  border-radius: var(--ion-radius-md);
  box-shadow: 0 8px 32px rgba(0,0,0,0.6);
  padding: var(--ion-space-1) 0;
}

.ion-ctx-item {
  display: block;
  width: 100%;
  padding: var(--ion-space-2) var(--ion-space-3);
  background: none;
  border: none;
  color: var(--ion-text);
  font-size: 0.83rem;
  text-align: start;
  cursor: pointer;
  transition: background 0.1s;
}

.ion-ctx-item:hover { background: rgba(255,255,255,0.06); }

.ion-ctx-item--danger { color: #ff4d4d; }
.ion-ctx-item--danger:hover { background: rgba(255, 77, 77, 0.1); }

.ion-ctx-divider {
  border: none;
  border-top: 1px solid rgba(255,255,255,0.06);
  margin: var(--ion-space-1) 0;
}

/* --------------------------------------------------------------------------
   Config / permissions forms
   -------------------------------------------------------------------------- */

.ion-config-form {
  max-width: 680px;
  margin: var(--ion-space-6) auto;
  padding: var(--ion-space-6);
  background: rgba(255,255,255,0.02);
  border: 1px solid rgba(255,255,255,0.07);
  border-radius: var(--ion-radius-lg);
}

.ion-textarea {
  width: 100%;
  min-height: 120px;
  background: rgba(0,0,0,0.3);
  border: 1px solid rgba(255,255,255,0.1);
  border-radius: var(--ion-radius-md);
  color: var(--ion-text);
  font-family: var(--ion-font-body);
  font-size: 0.875rem;
  padding: var(--ion-space-2) var(--ion-space-3);
  resize: vertical;
  transition: border-color 0.15s;
}

.ion-textarea:focus {
  outline: none;
  border-color: var(--ion-cyan);
}

.ion-textarea--code {
  font-family: var(--ion-font-mono);
  font-size: 0.8rem;
  min-height: 180px;
}

.ion-form-actions {
  display: flex;
  gap: var(--ion-space-2);
  margin-top: var(--ion-space-4);
}

/* --------------------------------------------------------------------------
   Error / empty panes
   -------------------------------------------------------------------------- */

.ion-error-pane {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--ion-space-3);
  padding: var(--ion-space-12);
  color: var(--ion-text-muted);
  text-align: center;
}

.ion-error-icon { font-size: 2.5rem; }

.ion-content-stub {
  padding: var(--ion-space-8);
  text-align: center;
  color: var(--ion-text-muted);
}

.ion-muted { color: var(--ion-text-muted); }
.ion-mono  { font-family: var(--ion-font-mono); font-size: 0.8rem; }

/* --------------------------------------------------------------------------
   Text / code editor
   -------------------------------------------------------------------------- */

.ion-text-editor {
  display: flex;
  flex-direction: column;
  height: 100%;
  padding: var(--ion-space-4);
}

.ion-text-editor form {
  display: flex;
  flex-direction: column;
  flex: 1;
  gap: var(--ion-space-3);
}

.ion-editor-area {
  flex: 1;
  min-height: 60vh;
  resize: none;
  tab-size: 2;
}

.ion-editor-actions {
  display: flex;
  gap: var(--ion-space-2);
  padding: var(--ion-space-2) 0;
  border-top: 1px solid rgba(255,255,255,0.06);
}

/* --------------------------------------------------------------------------
   Raw file view
   -------------------------------------------------------------------------- */

.ion-file-raw {
  padding: var(--ion-space-4);
  overflow: auto;
}

.ion-code {
  background: rgba(0,0,0,0.3);
  border: 1px solid rgba(255,255,255,0.06);
  border-radius: var(--ion-radius-md);
  color: var(--ion-text);
  font-family: var(--ion-font-mono);
  font-size: 0.8rem;
  line-height: 1.6;
  padding: var(--ion-space-4);
  overflow: auto;
  white-space: pre;
  margin: 0;
}

/* --------------------------------------------------------------------------
   Workbook view
   -------------------------------------------------------------------------- */

.ion-workbook {
  display: flex;
  flex-direction: column;
  width: 100%;
}
.ion-workbook--edit,
.ion-workbook--layout {
  max-width: 100%;
  width: 100%;
  padding: 0;
}

.ion-workbook--run {
  max-width: 100%;
  width: 100%;
  padding: 0;
}

.ion-run-toolbar {
  display: flex;
  align-items: center;
  gap: var(--ion-space-3);
  padding: var(--ion-space-2) var(--ion-space-4);
  border-bottom: 1px solid var(--ion-border);
  flex-shrink: 0;
}

.ion-workbook-header {
  margin-bottom: var(--ion-space-6);
  border-bottom: 1px solid rgba(255,255,255,0.07);
  padding-bottom: var(--ion-space-4);
}

.ion-workbook-title {
  font-family: var(--ion-font-display);
  font-size: 1.6rem;
  font-weight: 700;
  color: var(--ion-text);
  margin: 0;
}

.ion-workbook-cells {
  display: flex;
  flex-direction: column;
  gap: var(--ion-space-4);
}

.ion-cell {
  background: rgba(255,255,255,0.02);
  border: 1px solid rgba(255,255,255,0.07);
  border-radius: var(--ion-radius-lg);
  overflow: hidden;
}

.ion-cell--rich-text {
  padding: var(--ion-space-4) var(--ion-space-6);
  line-height: 1.7;
}

.ion-cell--rich-text p      { margin: 0 0 var(--ion-space-3); }
.ion-cell--rich-text h1,
.ion-cell--rich-text h2,
.ion-cell--rich-text h3     { margin: var(--ion-space-4) 0 var(--ion-space-2); }
.ion-cell--rich-text ul,
.ion-cell--rich-text ol     { padding-inline-start: var(--ion-space-6); }
.ion-cell--rich-text code   { font-family: var(--ion-font-mono); font-size: 0.85em;
                               background: rgba(0,0,0,0.3); border-radius: 3px;
                               padding: 1px 4px; }

.ion-cell-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: var(--ion-space-2) var(--ion-space-4);
  border-bottom: 1px solid rgba(255,255,255,0.07);
  background: rgba(0,0,0,0.15);
}

.ion-cell-label {
  font-family: var(--ion-font-mono);
  font-size: 0.75rem;
  color: var(--ion-text-muted);
  text-transform: uppercase;
  letter-spacing: 0.08em;
}

.ion-cell-output {
  padding: var(--ion-space-3) var(--ion-space-4);
  min-height: 48px;
}

/* --------------------------------------------------------------------------
   Cell display outputs (matplotlib, plotly, seaborn, HTML)
   -------------------------------------------------------------------------- */

.ion-cell-display {
  display: flex;
  flex-direction: column;
  gap: var(--ion-space-3);
  padding: var(--ion-space-2) 0;
}

.ion-display-output {
  border-radius: var(--ion-radius);
  overflow: hidden;
}

.ion-display-img {
  max-width: 100%;
  height: auto;
  display: block;
  border-radius: var(--ion-radius);
}

.ion-display-svg {
  max-width: 100%;
  overflow: auto;
}

.ion-display-svg svg {
  max-width: 100%;
  height: auto;
}

.ion-display-plotly {
  width: 100%;
  min-height: 400px;
}

.ion-display-iframe {
  width: 100%;
  min-height: 300px;
  border: none;
  border-radius: var(--ion-radius);
  background: var(--ion-surface);
}

.ion-display-text {
  font-family: var(--ion-font-mono);
  font-size: 0.85rem;
  padding: var(--ion-space-3);
  background: var(--ion-surface);
  border-radius: var(--ion-radius);
  overflow-x: auto;
  margin: 0;
  white-space: pre-wrap;
  word-break: break-word;
}

/* ── Streaming stdout / stderr ───────────────────────────────────────── */

.ion-cell-stream {
  font-family: var(--ion-font-mono);
  font-size: 0.85rem;
  padding: var(--ion-space-2) var(--ion-space-3);
  background: var(--ion-surface);
  border-radius: var(--ion-radius);
  max-height: 200px;
  overflow-y: auto;
  white-space: pre-wrap;
  word-break: break-word;
}

.ion-stream-stdout {
  color: var(--ion-text);
}

.ion-stream-stderr {
  color: var(--ion-danger, #ff4444);
}

/* ── Cell execution status (View mode) ──────────────────────────────── */

.ion-cell[data-status="queued"] {
  opacity: 0.7;
}
.ion-cell[data-status="running"] {
  border-inline-start: 2px solid var(--ion-cyan, #00e5ff);
}
.ion-cell[data-status="ok"] {
  border-inline-start: 2px solid var(--ion-success, #28c76f);
}
.ion-cell[data-status="error"] {
  border-inline-start: 2px solid var(--ion-danger, #ea5455);
}
.ion-cell[data-status="skipped"] {
  opacity: 0.5;
}

/* --------------------------------------------------------------------------
   Data table view
   -------------------------------------------------------------------------- */

.ion-data-view {
  padding: var(--ion-space-4);
  overflow: auto;
}

.ion-table-scroll {
  overflow-x: auto;
}

.ion-table {
  border-collapse: collapse;
  width: 100%;
  font-size: 0.85rem;
}

.ion-table th,
.ion-table td {
  padding: var(--ion-space-1) var(--ion-space-3);
  text-align: start;
  border-bottom: 1px solid rgba(255,255,255,0.06);
  white-space: nowrap;
  max-width: 300px;
  overflow: hidden;
  text-overflow: ellipsis;
}

.ion-table th {
  font-family: var(--ion-font-mono);
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--ion-text-muted);
  border-bottom-color: rgba(255,255,255,0.12);
  position: sticky;
  top: 0;
  background: var(--ion-bg);
}

.ion-table tbody tr:hover {
  background: rgba(255,255,255,0.03);
}

/* --------------------------------------------------------------------------
   Document view
   -------------------------------------------------------------------------- */

.ion-document-view {
  padding: var(--ion-space-8);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--ion-space-6);
}

.ion-document-actions {
  display: flex;
  gap: var(--ion-space-2);
}

/* --------------------------------------------------------------------------
   Inline media viewers (PDF, image, video, audio)

   Containers fill the workspace right panel and centre their media so
   small images/videos look balanced and large ones fit edge-to-edge.
   Native browser controls (PDF toolbar, video controls, audio scrubber)
   appear automatically — we deliberately avoid styling those so the
   browser's accessible defaults stand.
   -------------------------------------------------------------------------- */

.ion-media-view {
  flex: 1;
  min-height: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--ion-bg, #0a0a0f);
  overflow: hidden;
}

.ion-media-view--pdf,
.ion-media-view--video {
  /* Edge-to-edge for PDF and video — they have their own padding/UI. */
  padding: 0;
}

.ion-media-view--image {
  padding: var(--ion-space-4, 8px);
}

.ion-media-view--audio {
  flex-direction: column;
  gap: var(--ion-space-4, 8px);
  padding: var(--ion-space-8, 16px);
}

.ion-media-pdf {
  width: 100%;
  height: 100%;
  min-height: 0;
  border: none;
  background: var(--ion-bg-surface, #14141a);
}

.ion-media-image {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
  /* Subtle border + shadow so transparent PNGs/SVGs are still visible
     against the dark background. */
  border-radius: var(--ion-radius-md, 4px);
  box-shadow: 0 0 0 1px var(--ion-border, rgba(255, 255, 255, 0.08));
}

.ion-media-video {
  max-width: 100%;
  max-height: 100%;
  width: 100%;
  height: 100%;
  background: #000;
  outline: none;
}

.ion-media-audio {
  width: 100%;
  max-width: 720px;
}

.ion-media-audio-name {
  font-size: 12px;
  color: var(--ion-text-dim, #999);
  text-align: center;
  word-break: break-all;
}

/* Fallback shown inside <embed> when the browser refuses to render. */
.ion-document-fallback {
  padding: var(--ion-space-8, 16px);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--ion-space-2, 4px);
}

/* --------------------------------------------------------------------------
   Kernel status indicator (workbook modebar slot)
   Injected by KernelBar.svelte into .ion-modebar-kernel-slot.
   Colors: red = no kernel, orange = no/invalid env, cyan = all good.
   -------------------------------------------------------------------------- */

.ion-modebar-kernel-slot {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 44px;
  padding: var(--ion-space-1, 4px) 0;
}

.ion-kernel-ind {
  display: block;
  width: 14px;
  height: 14px;
  border-radius: 3px;
  border: 1.5px solid currentColor;
  background: transparent;
  cursor: pointer;
  padding: 0;
  transition: box-shadow 0.15s, background 0.15s;
}

.ion-kernel-ind:hover {
  box-shadow: 0 0 6px currentColor;
  background: color-mix(in srgb, currentColor 18%, transparent);
}

.ion-kernel-ind--none {
  color: var(--ion-red, #ff1744);
  background: color-mix(in srgb, var(--ion-red, #ff1744) 35%, transparent);
}

.ion-kernel-ind--warn {
  color: var(--ion-yellow, #ffb300);
  background: color-mix(in srgb, var(--ion-yellow, #ffb300) 35%, transparent);
}

.ion-kernel-ind--ok {
  color: var(--ion-cyan, #00e5ff);
  background: color-mix(in srgb, var(--ion-cyan, #00e5ff) 35%, transparent);
}

/* --------------------------------------------------------------------------
   Kernel picker overlay (portaled to document.body — light DOM)
   -------------------------------------------------------------------------- */

.ion-kernel-picker {
  position: fixed;
  width: 340px;
  max-height: 440px;
  overflow-y: auto;
  background: var(--ion-surface-3, #16161f);
  border: 1px solid var(--ion-border, #1e1e2e);
  border-radius: var(--ion-radius, 6px);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.55);
  z-index: 9999;
  font-size: 0.82rem;
  color: var(--ion-text, #e0e0e0);
}

.ion-kernel-picker .picker-kernel-row {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.55rem 0.85rem;
  font-size: 0.8rem;
  font-family: var(--ion-font-mono, monospace);
  text-transform: capitalize;
}
.ion-kernel-picker .picker-kernel-row--none { color: var(--ion-red,    #ff1744); background: color-mix(in srgb, var(--ion-red,    #ff1744) 10%, transparent); }
.ion-kernel-picker .picker-kernel-row--warn { color: var(--ion-yellow, #ffb300); background: color-mix(in srgb, var(--ion-yellow, #ffb300) 10%, transparent); }
.ion-kernel-picker .picker-kernel-row--ok   { color: var(--ion-cyan,   #00e5ff); background: color-mix(in srgb, var(--ion-cyan,   #00e5ff) 10%, transparent); }

.ion-kernel-picker .picker-kernel-dot {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: currentColor;
  flex-shrink: 0;
}
.ion-kernel-picker .picker-kernel-label { flex: 1; }

.ion-kernel-picker .picker-restart-btn {
  all: unset;
  cursor: pointer;
  display: flex;
  align-items: center;
  color: inherit;
  opacity: 0.6;
  border-radius: 3px;
  padding: 2px;
}
.ion-kernel-picker .picker-restart-btn:hover { opacity: 1; background: rgba(255,255,255,0.1); }

.ion-kernel-picker .picker-error {
  padding: 0.45rem 0.85rem;
  font-size: 0.75rem;
  color: var(--ion-red, #ff1744);
  background: color-mix(in srgb, var(--ion-red, #ff1744) 8%, transparent);
  border-top: 1px solid var(--ion-border, #1e1e2e);
  font-family: var(--ion-font-mono, monospace);
  white-space: pre-wrap;
  word-break: break-word;
}

.ion-kernel-picker .picker-sep {
  border: none;
  border-top: 1px solid var(--ion-border, #1e1e2e);
  margin: 0;
}

.ion-kernel-picker .picker-loading {
  display: flex;
  justify-content: center;
  padding: 0.75rem;
  color: var(--ion-text-muted, #888);
}

@keyframes ion-kernel-spin { to { transform: rotate(360deg); } }
.ion-kernel-picker .picker-spin { animation: ion-kernel-spin 0.8s linear infinite; }

.ion-kernel-picker .env-empty {
  padding: 0.55rem 0.85rem;
  font-size: 0.75rem;
  color: var(--ion-text-muted, #888);
  font-style: italic;
}
.ion-kernel-picker .env-empty--err { color: var(--ion-red, #ff1744); font-style: normal; }

.ion-kernel-picker .env-item {
  padding: 0.65rem 0.85rem;
  border-bottom: 1px solid var(--ion-border, #1e1e2e);
  cursor: default;
  transition: background 0.1s;
}
.ion-kernel-picker .env-item:last-child { border-bottom: none; }
.ion-kernel-picker .env-item--ready     { cursor: pointer; }
.ion-kernel-picker .env-item--ready:hover { background: var(--ion-surface-4); }
.ion-kernel-picker .env-item--current {
  background: var(--ion-surface-4);
  border-inline-start: 2px solid var(--ion-cyan, #00e5ff);
}
.ion-kernel-picker .env-item--unready {
  cursor: pointer;
  border-inline-start: 2px solid rgba(239, 68, 68, 0.6);
}
.ion-kernel-picker .env-item--unready:hover { background: rgba(239, 68, 68, 0.06); }

.ion-kernel-picker .env-header {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  margin-bottom: 0.2rem;
}
.ion-kernel-picker .env-dname { font-weight: 600; flex: 1; }

.ion-kernel-picker .env-current-badge {
  font-size: 0.65rem;
  background: var(--ion-cyan, #00e5ff);
  color: #000;
  border-radius: 3px;
  padding: 0.05rem 0.3rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

.ion-kernel-picker .env-meta {
  display: flex;
  gap: 0.35rem;
  font-size: 0.72rem;
  color: var(--ion-text-muted, #888);
  margin-bottom: 0.2rem;
}
.ion-kernel-picker .env-sep { opacity: 0.5; }

.ion-kernel-picker .env-pkgs {
  font-size: 0.7rem;
  color: var(--ion-text-dim, #666);
  line-height: 1.5;
  margin-top: 0.15rem;
}
.ion-kernel-picker .env-pkg-line {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Package tooltip — fixed to the right of the picker, escapes overflow clipping */
.env-pkg-tooltip {
  position: fixed;
  width: 240px;
  background: var(--ion-surface-3);
  border: 1px solid var(--ion-border);
  border-radius: var(--ion-radius, 6px);
  box-shadow: var(--ion-popup-shadow);
  padding: 0.65rem 0.85rem;
  z-index: 10000;
  font-size: 0.78rem;
  color: var(--ion-text);
  pointer-events: auto;
}
.env-pkg-tooltip .tooltip-name {
  font-weight: 600;
  font-size: 0.8rem;
  margin-bottom: 0.4rem;
}
.env-pkg-tooltip .tooltip-desc {
  font-size: 0.72rem;
  color: var(--ion-text-muted, #888);
  margin-bottom: 0.5rem;
  line-height: 1.35;
}
.env-pkg-tooltip .tooltip-empty {
  font-size: 0.72rem;
  color: var(--ion-text-muted, #888);
  font-style: italic;
}
.env-pkg-tooltip .tooltip-group { margin-bottom: 0.45rem; }
.env-pkg-tooltip .tooltip-group:last-child { margin-bottom: 0; }
.env-pkg-tooltip .tooltip-label {
  display: block;
  font-family: var(--ion-font-mono, monospace);
  font-size: 0.68rem;
  color: var(--ion-cyan, #00e5ff);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  margin-bottom: 0.2rem;
}
.env-pkg-tooltip .tooltip-pkgs {
  display: flex;
  flex-wrap: wrap;
  gap: 0.2rem 0.35rem;
}
.env-pkg-tooltip .tooltip-pkg {
  font-family: var(--ion-font-mono, monospace);
  font-size: 0.7rem;
  background: rgba(255, 255, 255, 0.06);
  border-radius: 3px;
  padding: 0.05rem 0.35rem;
}

/* --------------------------------------------------------------------------
   Mode bar cycle button (position toggle)
   -------------------------------------------------------------------------- */

.ion-modebar-cycle {
  margin-top: auto;
}

/* --------------------------------------------------------------------------
   Context menu overlay
   -------------------------------------------------------------------------- */

.ion-ctx-overlay {
  position: fixed;
  z-index: 9999;
}

/* ==========================================================================
   40. FORM COMPONENTS — EXTENDED
   Fills out coverage for every remaining HTML form element type.
   ========================================================================== */

/* --------------------------------------------------------------------------
   Number input — suppress native spinners
   -------------------------------------------------------------------------- */

.ion-input[type="number"]::-webkit-inner-spin-button,
.ion-input[type="number"]::-webkit-outer-spin-button {
  -webkit-appearance: none;
  margin: 0;
}
.ion-input[type="number"] { -moz-appearance: textfield; }

/* --------------------------------------------------------------------------
   Search input — style the native clear (×) button
   -------------------------------------------------------------------------- */

.ion-input[type="search"]::-webkit-search-cancel-button {
  -webkit-appearance: none;
  width: 14px;
  height: 14px;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='M1 1l12 12M13 1L1 13' stroke='rgba(255,255,255,0.3)' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center;
  cursor: pointer;
  opacity: 0.6;
  transition: opacity var(--ion-t);
}
.ion-input[type="search"]::-webkit-search-cancel-button:hover { opacity: 1; }

/* --------------------------------------------------------------------------
   Date / time inputs — dark colour-scheme + tinted picker icon
   -------------------------------------------------------------------------- */

.ion-input[type="date"],
.ion-input[type="time"],
.ion-input[type="datetime-local"],
.ion-input[type="month"],
.ion-input[type="week"] {
  color-scheme: dark;
}

.ion-input[type="date"]::-webkit-calendar-picker-indicator,
.ion-input[type="time"]::-webkit-calendar-picker-indicator,
.ion-input[type="datetime-local"]::-webkit-calendar-picker-indicator,
.ion-input[type="month"]::-webkit-calendar-picker-indicator,
.ion-input[type="week"]::-webkit-calendar-picker-indicator {
  filter: invert(0.7) sepia(1) hue-rotate(160deg) saturate(2);
  opacity: 0.55;
  cursor: pointer;
  transition: opacity var(--ion-t);
}
.ion-input[type="date"]::-webkit-calendar-picker-indicator:hover,
.ion-input[type="time"]::-webkit-calendar-picker-indicator:hover,
.ion-input[type="datetime-local"]::-webkit-calendar-picker-indicator:hover,
.ion-input[type="month"]::-webkit-calendar-picker-indicator:hover,
.ion-input[type="week"]::-webkit-calendar-picker-indicator:hover {
  opacity: 1;
}

/* --------------------------------------------------------------------------
   Color input
   -------------------------------------------------------------------------- */

.ion-color {
  width: 40px;
  height: 36px;
  padding: 3px;
  background: var(--ion-bg-surface);
  border: 1px solid var(--ion-border-mid);
  border-radius: var(--ion-radius);
  cursor: pointer;
  appearance: none;
  -webkit-appearance: none;
  outline: none;
  transition: border-color var(--ion-t), box-shadow var(--ion-t);
}
.ion-color::-webkit-color-swatch-wrapper { padding: 0; border-radius: 1px; }
.ion-color::-webkit-color-swatch        { border: none; border-radius: 1px; }
.ion-color::-moz-color-swatch           { border: none; border-radius: 1px; }
.ion-color:hover  { border-color: var(--ion-border-hover); }
.ion-color:focus  { border-color: var(--ion-border-focus); box-shadow: var(--ion-glow-focus); }
.ion-color:disabled { opacity: 0.40; cursor: not-allowed; pointer-events: none; }

/* Color + hex-value display pair */
.ion-color-wrap {
  display: inline-flex;
  align-items: center;
  gap: var(--ion-sp-2);
}
.ion-color-value {
  font-family: var(--ion-font-mono);
  font-size: 11px;
  color: var(--ion-text-muted);
  letter-spacing: 0.08em;
}

/* --------------------------------------------------------------------------
   Multi-select
   -------------------------------------------------------------------------- */

.ion-select--multi {
  height: auto;
  min-height: 120px;
  padding: var(--ion-sp-2);
  background-image: none;   /* remove the chevron arrow */
}
.ion-select--multi option {
  padding: var(--ion-sp-1) var(--ion-sp-2);
  border-radius: var(--ion-radius);
  margin-bottom: 2px;
  background: #111118;
  color: var(--ion-text);
}
.ion-select--multi option:checked {
  background: rgba(var(--ion-cyan-rgb), 0.15);
  color: var(--ion-cyan);
}

/* --------------------------------------------------------------------------
   Inline file input (non-drop-zone; wraps hidden <input type="file">)
   -------------------------------------------------------------------------- */

.ion-file-input {
  display: inline-flex;
  align-items: center;
  gap: var(--ion-sp-2);
  cursor: pointer;
  user-select: none;
}
.ion-file-input input[type="file"] {
  width: 0.1px;
  height: 0.1px;
  opacity: 0;
  overflow: hidden;
  position: absolute;
  z-index: -1;
}
.ion-file-input-label {
  display: inline-flex;
  align-items: center;
  gap: var(--ion-sp-2);
  padding: 7px 14px;
  background: var(--ion-bg-surface);
  border: 1px solid var(--ion-border-mid);
  border-radius: var(--ion-radius);
  font-family: var(--ion-font-mono);
  font-size: 11px;
  letter-spacing: 0.08em;
  color: var(--ion-text-muted);
  transition: border-color var(--ion-t), background var(--ion-t), color var(--ion-t);
}
.ion-file-input:hover .ion-file-input-label,
.ion-file-input input[type="file"]:focus + .ion-file-input-label {
  border-color: var(--ion-border-hover);
  background: var(--ion-bg-surface-2);
  color: var(--ion-text);
}
.ion-file-input-filename {
  font-family: var(--ion-font-mono);
  font-size: 11px;
  color: var(--ion-text-dim);
  max-width: 200px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* --------------------------------------------------------------------------
   Input group (input + prefix/suffix addon or button)
   -------------------------------------------------------------------------- */

.ion-input-group {
  display: flex;
  align-items: stretch;
  width: 100%;
}
.ion-input-group .ion-input { flex: 1; min-width: 0; }
.ion-input-group .ion-input:not(:first-child) {
  border-radius: 0 var(--ion-radius) var(--ion-radius) 0;
  border-inline-start: none;
}
.ion-input-group .ion-input:not(:last-child) {
  border-radius: var(--ion-radius) 0 0 var(--ion-radius);
}
.ion-input-group .ion-input:only-child { border-radius: var(--ion-radius); }

.ion-input-addon {
  display: inline-flex;
  align-items: center;
  padding: 0 12px;
  background: var(--ion-bg-surface-2);
  border: 1px solid var(--ion-border-mid);
  font-family: var(--ion-font-mono);
  font-size: 12px;
  color: var(--ion-text-dim);
  white-space: nowrap;
  flex-shrink: 0;
}
.ion-input-group .ion-input-addon:first-child {
  border-radius: var(--ion-radius) 0 0 var(--ion-radius);
  border-inline-end: none;
}
.ion-input-group .ion-input-addon:last-child {
  border-radius: 0 var(--ion-radius) var(--ion-radius) 0;
  border-inline-start: none;
}
.ion-input-group .ion-btn:first-child { border-radius: var(--ion-radius) 0 0 var(--ion-radius); }
.ion-input-group .ion-btn:last-child  { border-radius: 0 var(--ion-radius) var(--ion-radius) 0; }

/* --------------------------------------------------------------------------
   Fieldset / legend
   -------------------------------------------------------------------------- */

.ion-fieldset {
  border: 1px solid var(--ion-border);
  border-radius: var(--ion-radius-md);
  padding: var(--ion-sp-5) var(--ion-sp-5) var(--ion-sp-4);
  margin: 0 0 var(--ion-sp-4);
}
.ion-legend {
  font-family: var(--ion-font-mono);
  font-size: 9px;
  letter-spacing: 0.20em;
  text-transform: uppercase;
  color: var(--ion-text-dim);
  padding: 0 var(--ion-sp-2);
  float: none;
  width: auto;
}

/* --------------------------------------------------------------------------
   Meter element
   -------------------------------------------------------------------------- */

.ion-meter {
  width: 100%;
  height: 8px;
  appearance: none;
  -webkit-appearance: none;
  background: var(--ion-bg-surface-3);
  border: none;
  border-radius: 4px;
  overflow: hidden;
}
.ion-meter::-webkit-meter-bar {
  background: var(--ion-bg-surface-3);
  border: none;
  border-radius: 4px;
}
.ion-meter::-webkit-meter-optimum-value        { background: var(--ion-success); border-radius: 4px; }
.ion-meter::-webkit-meter-suboptimum-value     { background: var(--ion-warning); border-radius: 4px; }
.ion-meter::-webkit-meter-even-less-good-value { background: var(--ion-danger);  border-radius: 4px; }
.ion-meter::-moz-meter-bar { border-radius: 4px; }
.ion-meter:-moz-meter-optimum::-moz-meter-bar          { background: var(--ion-success); }
.ion-meter:-moz-meter-sub-optimum::-moz-meter-bar      { background: var(--ion-warning); }
.ion-meter:-moz-meter-sub-sub-optimum::-moz-meter-bar  { background: var(--ion-danger); }

/* --------------------------------------------------------------------------
   Output element
   -------------------------------------------------------------------------- */

.ion-output {
  display: inline-block;
  font-family: var(--ion-font-mono);
  font-size: 13px;
  color: var(--ion-cyan);
  background: rgba(var(--ion-cyan-rgb), 0.06);
  border: 1px solid rgba(var(--ion-cyan-rgb), 0.15);
  border-radius: var(--ion-radius);
  padding: 4px 10px;
}

/* --------------------------------------------------------------------------
   Indeterminate checkbox state
   -------------------------------------------------------------------------- */

.ion-checkbox:indeterminate {
  background: rgba(var(--ion-cyan-rgb), 0.15);
  border-color: var(--ion-cyan);
}
.ion-checkbox:indeterminate::after {
  content: '';
  position: absolute;
  inset-inline-start: 3px;
  top: 6px;
  width: 8px;
  height: 1.5px;
  background: var(--ion-cyan);
  transform: none;
  border: none;
}

/* --------------------------------------------------------------------------
   Radio group / Checkbox group containers
   -------------------------------------------------------------------------- */

.ion-radio-group,
.ion-checkbox-group {
  display: flex;
  flex-direction: column;
  gap: var(--ion-sp-2);
}
.ion-radio-group--inline,
.ion-checkbox-group--inline {
  flex-direction: row;
  flex-wrap: wrap;
  gap: var(--ion-sp-4);
}

/* --------------------------------------------------------------------------
   Horizontal form row (label on left, control on right)
   -------------------------------------------------------------------------- */

.ion-form-row {
  display: grid;
  grid-template-columns: 160px 1fr;
  align-items: center;
  gap: var(--ion-sp-4);
  margin-bottom: var(--ion-sp-3);
}
.ion-form-row .ion-label { margin: 0; text-align: end; }

@media (max-width: 480px) {
  .ion-form-row { grid-template-columns: 1fr; }
  .ion-form-row .ion-label { text-align: start; }
}

/* --------------------------------------------------------------------------
   Consistent disabled states — remaining elements not covered in §6-13
   -------------------------------------------------------------------------- */

.ion-select:disabled,
.ion-select[aria-disabled="true"] {
  opacity: 0.45;
  cursor: not-allowed;
  pointer-events: none;
}
.ion-checkbox:disabled,
.ion-radio:disabled,
.ion-toggle:disabled {
  opacity: 0.40;
  cursor: not-allowed;
  pointer-events: none;
}
.ion-range:disabled { opacity: 0.40; cursor: not-allowed; }
.ion-textarea:disabled,
.ion-textarea[readonly] {
  opacity: 0.45;
  cursor: not-allowed;
  resize: none;
}

/* --------------------------------------------------------------------------
   Native <progress> element
   Maps the native element to the same look as .ion-progress / .ion-progress-bar
   -------------------------------------------------------------------------- */

progress.ion-progress {
  appearance: none;
  -webkit-appearance: none;
  display: block;
  overflow: hidden;
}

/* WebKit */
progress.ion-progress::-webkit-progress-bar {
  background: var(--ion-bg-surface-3);
  border-radius: 2px;
}
progress.ion-progress::-webkit-progress-value {
  background: var(--ion-gradient-cm);
  background-size: 200% 100%;
  border-radius: 2px;
  animation: ion-gradient-shift 3s linear infinite;
}

/* Firefox */
progress.ion-progress::-moz-progress-bar {
  background: var(--ion-gradient-cm);
  background-size: 200% 100%;
  border-radius: 2px;
  animation: ion-gradient-shift 3s linear infinite;
}

/* --------------------------------------------------------------------------
   HTML constraint-validation visual states
   Only applied when the form has been interacted with (.ion-form--validated
   on the <form>) to avoid red borders on load.
   -------------------------------------------------------------------------- */

.ion-form--validated .ion-input:invalid,
.ion-input--error {
  border-color: var(--ion-danger);
  box-shadow: 0 0 0 3px rgba(255, 56, 96, 0.10);
}

.ion-form--validated .ion-input:valid:not(:placeholder-shown) {
  border-color: rgba(0, 255, 157, 0.40);
}

.ion-form--validated .ion-textarea:invalid {
  border-color: var(--ion-danger);
  box-shadow: 0 0 0 3px rgba(255, 56, 96, 0.10);
}

.ion-form--validated .ion-textarea:valid:not(:placeholder-shown) {
  border-color: rgba(0, 255, 157, 0.40);
}

.ion-form--validated .ion-select:invalid {
  border-color: var(--ion-danger);
  box-shadow: 0 0 0 3px rgba(255, 56, 96, 0.10);
}

/* --------------------------------------------------------------------------
   Required field label marker
   Add .ion-label--required to show the asterisk; never hardcode it in HTML.
   -------------------------------------------------------------------------- */

.ion-label--required::after {
  content: ' *';
  color: var(--ion-danger);
  font-size: 11px;
  line-height: 1;
}

/* --------------------------------------------------------------------------
   Range slider with <datalist> tick marks
   -------------------------------------------------------------------------- */

.ion-range-wrap {
  position: relative;
  width: 100%;
}

.ion-range-ticks {
  display: flex;
  justify-content: space-between;
  padding: 0 8px;
  margin-top: var(--ion-sp-1);
}

.ion-range-tick {
  font-family: var(--ion-font-mono);
  font-size: 9px;
  color: var(--ion-text-faint);
  letter-spacing: 0.05em;
  text-align: center;
}

/* --------------------------------------------------------------------------
   Select size variants (mirrors .ion-input--sm / --lg)
   -------------------------------------------------------------------------- */

.ion-select--sm { padding: 7px 32px 7px 10px; font-size: 12px; }
.ion-select--lg { padding: 14px 40px 14px 18px; font-size: 15px; }

/* ==========================================================================
   ADMIN DASHBOARD — Shared Components
   Used by gluon, neutrino, and reactive admin pages.
   ========================================================================== */

/* ── Admin layout shell ──────────────────────────────────────────────────── */
.ion-admin-body {
  height: 100vh;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

.ion-admin-main {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 12px;
  padding: 12px;
  overflow-y: auto;
  flex: 1;
  min-height: 0;
}

/* ── Admin tab bar ───────────────────────────────────────────────────────── */
.ion-admin-tab-bar {
  display: flex;
  align-items: center;
  border-bottom: 1px solid var(--ion-border, #222);
  background: #080808;
  flex-shrink: 0;
  padding: 0 8px;
  gap: 0;
}

.ion-admin-tab-btn {
  background: none;
  border: none;
  border-bottom: 2px solid transparent;
  color: var(--ion-text-muted, #888);
  font-family: var(--ion-font-mono);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .05em;
  text-transform: uppercase;
  padding: 8px 14px;
  cursor: pointer;
  transition: color .15s;
}
.ion-admin-tab-btn:hover { color: var(--ion-text, #e5e5e5); }
.ion-admin-tab-btn.active { color: var(--ion-cyan, #22d3ee); border-bottom-color: var(--ion-cyan, #22d3ee); }

.ion-admin-tab-panel { display: none; flex: 1; overflow-y: auto; }
.ion-admin-tab-panel.active {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 12px;
  padding: 12px;
}
.ion-admin-tab-panel.active.full { display: block; padding: 12px; }

/* ── Admin console ───────────────────────────────────────────────────────── */
.ion-admin-console {
  border-top: 1px solid var(--ion-border);
  display: flex;
  flex-direction: column;
  height: 160px;
  flex-shrink: 0;
  min-height: 64px;
  max-height: 80vh;
}

.ion-admin-console-drag {
  height: 5px;
  cursor: ns-resize;
  background: var(--ion-border, #222);
  flex-shrink: 0;
  transition: background .12s;
  user-select: none;
}
.ion-admin-console-drag:hover,
.ion-admin-console-drag.dragging { background: var(--ion-cyan, #22d3ee); }

.ion-admin-console-out {
  flex: 1;
  overflow-y: auto;
  padding: 8px 14px;
  background: #000;
  color: var(--ion-success);
  font-family: var(--ion-font-mono);
  font-size: 12px;
  line-height: 1.7;
  white-space: pre-wrap;
}

.ion-admin-console-row {
  display: flex;
  border-top: 1px solid var(--ion-border);
  background: #000;
}

.ion-admin-console-ps {
  padding: 7px 6px 7px 14px;
  color: var(--ion-cyan);
  font-family: var(--ion-font-mono);
  font-size: 12px;
  user-select: none;
}

.ion-admin-console-inp {
  flex: 1;
  background: #000;
  color: var(--ion-text);
  border: none;
  outline: none;
  font-family: var(--ion-font-mono);
  font-size: 12px;
  padding: 7px 4px;
}

.ion-admin-ws-pill {
  font-family: var(--ion-font-mono);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: .04em;
  padding: 2px 8px;
  border-radius: 9px;
  border: 1px solid currentColor;
  opacity: .7;
  cursor: default;
  margin-inline-end: 8px;
  color: var(--ion-danger, #ef4444);
  transition: color .3s, border-color .3s;
}

/* ── Admin item list ─────────────────────────────────────────────────────── */
.ion-admin-list { list-style: none; padding: 0; margin: 0; }
.ion-admin-list li {
  padding: 5px 0;
  border-bottom: 1px solid var(--ion-border);
  font-family: var(--ion-font-mono);
  font-size: 12px;
  color: var(--ion-text-muted);
  cursor: pointer;
}
.ion-admin-list li:hover code { color: var(--ion-cyan); }
.ion-admin-list li:last-child { border: none; }

/* ── Admin status badges ─────────────────────────────────────────────────── */
.ion-admin-status {
  font-family: var(--ion-font-mono);
  font-size: 11px;
  font-weight: 600;
  padding: 2px 8px;
  border-radius: 2px;
  letter-spacing: .04em;
}
.ion-admin-status--ok   { background: rgba(34,197,94,.15);  color: #22c55e; }
.ion-admin-status--err  { background: rgba(239,68,68,.15);  color: #ef4444; }
.ion-admin-status--warn { background: rgba(234,179,8,.15);  color: #eab308; }
.ion-admin-status--dim  { background: rgba(100,100,100,.12); color: #666; }

/* ── Admin trace panel (gluon) ───────────────────────────────────────────── */
.ion-admin-trace-tags {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  padding: 6px 0;
  min-height: 28px;
}

.ion-admin-trace-tag {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 2px 8px;
  background: var(--ion-cyan, #0ff);
  color: #000;
  border-radius: 3px;
  font-family: var(--ion-font-mono);
  font-size: 11px;
  cursor: pointer;
  user-select: none;
}
.ion-admin-trace-tag:hover { opacity: .75; }

/* ── Admin summary bar ───────────────────────────────────────────────────── */
.ion-admin-summary {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 6px 14px;
  border-bottom: 1px solid var(--ion-border, #222);
  background: #050505;
  font-size: 11px;
  flex-wrap: wrap;
  flex-shrink: 0;
}

.ion-admin-summary-item {
  font-family: var(--ion-font-mono);
  font-size: 11px;
  color: var(--ion-text-muted, #aaa);
}
.ion-admin-summary-item.status-ok  { color: #22c55e; }
.ion-admin-summary-item.status-warn { color: #eab308; }
.ion-admin-summary-sep { color: var(--ion-border, #444); }

/* ── Admin form controls ─────────────────────────────────────────────────── */
.ion-admin-form { display: flex; flex-direction: column; gap: 6px; }

.ion-admin-form-input {
  background: #0a0a0a;
  border: 1px solid var(--ion-border, #333);
  color: var(--ion-text, #e5e5e5);
  padding: 5px 8px;
  font-family: var(--ion-font-mono);
  font-size: 11px;
  border-radius: 2px;
  outline: none;
  width: 100%;
  box-sizing: border-box;
}
.ion-admin-form-input:focus { border-color: var(--ion-cyan, #22d3ee); }

.ion-admin-form-btn {
  background: var(--ion-cyan, #22d3ee);
  color: #000;
  border: none;
  padding: 5px 14px;
  font-size: 11px;
  font-weight: 700;
  cursor: pointer;
  border-radius: 2px;
  align-self: flex-start;
  letter-spacing: .04em;
}
.ion-admin-form-btn:hover { opacity: .85; }

/* ── Admin dim label ─────────────────────────────────────────────────────── */
.ion-admin-dim { opacity: .5; font-size: 12px; font-family: var(--ion-font-mono); }

/* ── Admin modal ─────────────────────────────────────────────────────────── */
.ion-admin-modal-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(0,0,0,.78);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 100;
}
.ion-admin-modal-backdrop[hidden] { display: none; }

.ion-admin-modal {
  background: #0d0d0d;
  border: 1px solid var(--ion-border, #333);
  border-radius: 3px;
  display: flex;
  flex-direction: column;
  min-width: 520px;
  max-width: 82vw;
  max-height: 82vh;
}

.ion-admin-modal-hdr {
  display: flex;
  align-items: center;
  padding: 10px 14px;
  border-bottom: 1px solid var(--ion-border, #333);
  flex-shrink: 0;
  gap: 10px;
}

.ion-admin-modal-title {
  font-family: var(--ion-font-mono);
  font-size: 12px;
  color: var(--ion-text, #e5e5e5);
  flex: 1;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.ion-admin-modal-close {
  background: none;
  border: none;
  color: var(--ion-text-muted, #888);
  cursor: pointer;
  font-size: 16px;
  line-height: 1;
  padding: 0 2px;
  flex-shrink: 0;
}
.ion-admin-modal-close:hover { color: var(--ion-text, #e5e5e5); }

.ion-admin-modal-body { padding: 14px; overflow-y: auto; display: flex; flex-direction: column; gap: 10px; }

/* ==========================================================================
   JOBS
   ========================================================================== */

.ion-jobs-container { display: flex; flex-direction: column; gap: var(--ion-sp-4); padding: var(--ion-sp-4); height: 100%; }
.ion-jobs-toolbar { display: flex; align-items: center; gap: var(--ion-sp-3); flex-wrap: wrap; }
.ion-jobs-list { display: flex; flex-direction: column; gap: var(--ion-sp-2); overflow-y: auto; flex: 1; }

.ion-jobs-card {
  display: flex; align-items: center; gap: var(--ion-sp-3);
  padding: var(--ion-sp-3) var(--ion-sp-4);
  background: var(--ion-bg-surface);
  border: 1px solid var(--ion-border);
  border-radius: var(--ion-radius-md);
  cursor: pointer;
  transition: border-color 0.15s, background 0.15s;
}
.ion-jobs-card:hover { border-color: var(--ion-border-hover); background: var(--ion-bg-surface-2); }

.ion-jobs-name { font-family: var(--ion-font-mono); font-size: 13px; color: var(--ion-text); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ion-jobs-schedule { font-family: var(--ion-font-mono); font-size: 11px; color: var(--ion-text-muted); }
.ion-jobs-tags { display: flex; gap: var(--ion-sp-1); flex-wrap: wrap; }
.ion-jobs-tag { font-size: 10px; padding: 1px 6px; border-radius: 9999px; background: var(--ion-bg-surface-3); color: var(--ion-text-muted); font-family: var(--ion-font-mono); }

.ion-jobs-status { display: inline-flex; align-items: center; gap: 4px; font-size: 10px; font-family: var(--ion-font-mono); text-transform: uppercase; letter-spacing: 0.08em; }
.ion-jobs-status--active  { color: var(--ion-success); }
.ion-jobs-status--paused  { color: var(--ion-warning); }
.ion-jobs-status--failed  { color: var(--ion-danger); }

.ion-jobs-progress { width: 120px; height: 4px; background: var(--ion-bg-surface-3); border-radius: 2px; overflow: hidden; }
.ion-jobs-progress-bar { height: 100%; background: var(--ion-gradient-cw); transition: width 0.3s ease; }

.ion-jobs-actions { display: flex; gap: var(--ion-sp-1); }
.ion-jobs-actions .ion-btn { padding: 4px 8px; font-size: 11px; }

.ion-jobs-empty { text-align: center; padding: var(--ion-sp-8); color: var(--ion-text-dim); font-family: var(--ion-font-mono); font-size: 13px; }

/* ==========================================================================
   TASKS
   ========================================================================== */

.ion-tasks-container { display: flex; flex-direction: column; gap: var(--ion-sp-4); padding: var(--ion-sp-4); height: 100%; }
.ion-tasks-toolbar { display: flex; align-items: center; gap: var(--ion-sp-3); flex-wrap: wrap; }
.ion-tasks-views { display: flex; gap: 2px; background: var(--ion-bg-surface); border-radius: var(--ion-radius-md); padding: 2px; }
.ion-tasks-view-btn { padding: 4px 10px; border: none; background: none; color: var(--ion-text-muted); font-family: var(--ion-font-mono); font-size: 11px; cursor: pointer; border-radius: var(--ion-radius); transition: background 0.15s, color 0.15s; }
.ion-tasks-view-btn:hover { color: var(--ion-text); }
.ion-tasks-view-btn--active { background: var(--ion-bg-surface-3); color: var(--ion-cyan); }

.ion-tasks-list { display: flex; flex-direction: column; gap: 1px; overflow-y: auto; flex: 1; }

.ion-tasks-row {
  display: grid;
  grid-template-columns: 24px 1fr 100px 80px 100px 90px;
  align-items: center;
  gap: var(--ion-sp-2);
  padding: var(--ion-sp-2) var(--ion-sp-3);
  background: var(--ion-bg-surface);
  border: 1px solid transparent;
  cursor: pointer;
  transition: border-color 0.15s, background 0.15s;
  font-size: 12px;
}
.ion-tasks-row:hover { border-color: var(--ion-border); background: var(--ion-bg-surface-2); }

.ion-tasks-checkbox { width: 14px; height: 14px; border: 1px solid var(--ion-border-mid); border-radius: 2px; background: none; cursor: pointer; transition: border-color 0.15s; }
.ion-tasks-checkbox:hover { border-color: var(--ion-cyan); }
.ion-tasks-checkbox--done { background: var(--ion-success); border-color: var(--ion-success); }

.ion-tasks-title { font-family: var(--ion-font-body); color: var(--ion-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ion-tasks-title--done { text-decoration: line-through; color: var(--ion-text-muted); }

.ion-tasks-assignee { font-family: var(--ion-font-mono); font-size: 11px; color: var(--ion-text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.ion-tasks-priority { font-family: var(--ion-font-mono); font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; }
.ion-tasks-priority--critical { color: var(--ion-danger); }
.ion-tasks-priority--high { color: var(--ion-warning); }
.ion-tasks-priority--medium { color: var(--ion-cyan); }
.ion-tasks-priority--low { color: var(--ion-text-dim); }

.ion-tasks-status-badge { display: inline-block; padding: 2px 8px; border-radius: 9999px; font-family: var(--ion-font-mono); font-size: 10px; background: var(--ion-bg-surface-3); color: var(--ion-text-muted); }
.ion-tasks-status-badge--done { background: rgba(0, 255, 157, 0.12); color: var(--ion-success); }
.ion-tasks-status-badge--in-progress { background: rgba(var(--ion-cyan-rgb), 0.12); color: var(--ion-cyan); }
.ion-tasks-status-badge--review { background: rgba(139, 92, 246, 0.12); color: var(--ion-violet-mid); }

.ion-tasks-due { font-family: var(--ion-font-mono); font-size: 11px; color: var(--ion-text-muted); }
.ion-tasks-due--overdue { color: var(--ion-danger); }
.ion-tasks-due--soon { color: var(--ion-warning); }

.ion-tasks-empty { text-align: center; padding: var(--ion-sp-8); color: var(--ion-text-dim); font-family: var(--ion-font-mono); font-size: 13px; }

/* ==========================================================================
   KANBAN
   ========================================================================== */

.ion-kanban-container { display: flex; flex-direction: column; gap: var(--ion-sp-4); padding: var(--ion-sp-4); height: 100%; }
.ion-kanban-toolbar { display: flex; align-items: center; gap: var(--ion-sp-3); }

.ion-kanban-board { display: flex; gap: var(--ion-sp-3); overflow-x: auto; flex: 1; padding-bottom: var(--ion-sp-2); }

.ion-kanban-column {
  display: flex; flex-direction: column;
  min-width: 260px; max-width: 320px; flex: 1;
  background: var(--ion-bg-surface);
  border: 1px solid var(--ion-border);
  border-radius: var(--ion-radius-md);
  overflow: hidden;
}

.ion-kanban-column-header {
  display: flex; align-items: center; gap: var(--ion-sp-2);
  padding: var(--ion-sp-3) var(--ion-sp-3);
  border-bottom: 1px solid var(--ion-border);
  font-family: var(--ion-font-mono);
  font-size: 11px; text-transform: uppercase; letter-spacing: 0.1em;
  color: var(--ion-text-muted);
}
.ion-kanban-column-count { font-size: 10px; padding: 1px 6px; border-radius: 9999px; background: var(--ion-bg-surface-3); color: var(--ion-text-dim); }

.ion-kanban-cards { display: flex; flex-direction: column; gap: var(--ion-sp-2); padding: var(--ion-sp-2); overflow-y: auto; flex: 1; min-height: 60px; }

.ion-kanban-card {
  padding: var(--ion-sp-3);
  background: var(--ion-bg);
  border: 1px solid var(--ion-border);
  border-radius: var(--ion-radius-md);
  cursor: grab;
  transition: border-color 0.15s, box-shadow 0.15s;
}
.ion-kanban-card:hover { border-color: var(--ion-border-hover); }
.ion-kanban-card--dragging { opacity: 0.5; border-color: var(--ion-cyan); box-shadow: var(--ion-glow-cyan); }
.ion-kanban-card-drop-target { border: 2px dashed var(--ion-cyan); background: rgba(var(--ion-cyan-rgb), 0.04); }

.ion-kanban-card-title { font-family: var(--ion-font-body); font-size: 13px; color: var(--ion-text); margin-bottom: var(--ion-sp-1); }
.ion-kanban-card-meta { display: flex; align-items: center; gap: var(--ion-sp-2); font-family: var(--ion-font-mono); font-size: 10px; color: var(--ion-text-dim); }
.ion-kanban-card-priority { font-size: 10px; font-family: var(--ion-font-mono); text-transform: uppercase; letter-spacing: 0.06em; }

.ion-kanban-empty { display: flex; align-items: center; justify-content: center; flex: 1; color: var(--ion-text-dim); font-family: var(--ion-font-mono); font-size: 12px; padding: var(--ion-sp-4); }

/* ==========================================================================
   GANTT
   ========================================================================== */

.ion-gantt-container { display: flex; flex-direction: column; gap: var(--ion-sp-4); padding: var(--ion-sp-4); height: 100%; }
.ion-gantt-toolbar { display: flex; align-items: center; gap: var(--ion-sp-3); }
.ion-gantt-zoom { display: flex; gap: 2px; background: var(--ion-bg-surface); border-radius: var(--ion-radius-md); padding: 2px; }
.ion-gantt-zoom-btn { padding: 4px 10px; border: none; background: none; color: var(--ion-text-muted); font-family: var(--ion-font-mono); font-size: 11px; cursor: pointer; border-radius: var(--ion-radius); transition: background 0.15s, color 0.15s; }
.ion-gantt-zoom-btn:hover { color: var(--ion-text); }
.ion-gantt-zoom-btn--active { background: var(--ion-bg-surface-3); color: var(--ion-cyan); }

.ion-gantt-viewport { display: flex; flex: 1; overflow: auto; position: relative; }

.ion-gantt-sidebar { min-width: 200px; max-width: 240px; border-inline-end: 1px solid var(--ion-border); flex-shrink: 0; }
.ion-gantt-sidebar-header { padding: var(--ion-sp-2) var(--ion-sp-3); font-family: var(--ion-font-mono); font-size: 10px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--ion-text-dim); border-bottom: 1px solid var(--ion-border); height: 32px; display: flex; align-items: center; }
.ion-gantt-sidebar-row { padding: var(--ion-sp-1) var(--ion-sp-3); font-family: var(--ion-font-body); font-size: 12px; color: var(--ion-text); height: 36px; display: flex; align-items: center; border-bottom: 1px solid var(--ion-border); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.ion-gantt-timeline { flex: 1; position: relative; overflow: hidden; }
.ion-gantt-header { display: flex; height: 32px; border-bottom: 1px solid var(--ion-border); background: var(--ion-bg-surface); position: sticky; top: 0; z-index: 1; }
.ion-gantt-header-cell { font-family: var(--ion-font-mono); font-size: 10px; color: var(--ion-text-dim); text-align: center; border-inline-end: 1px solid var(--ion-border); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }

.ion-gantt-rows { position: relative; }
.ion-gantt-row { height: 36px; border-bottom: 1px solid var(--ion-border); position: relative; }

.ion-gantt-bar {
  position: absolute; top: 6px; height: 24px;
  background: var(--ion-gradient-cw);
  border-radius: var(--ion-radius);
  cursor: pointer;
  transition: opacity 0.15s;
  min-width: 8px;
  display: flex; align-items: center; padding: 0 6px;
  font-family: var(--ion-font-mono); font-size: 10px; color: var(--ion-bg); overflow: hidden; white-space: nowrap; text-overflow: ellipsis;
}
.ion-gantt-bar:hover { opacity: 0.85; }

.ion-gantt-bar-resize { position: absolute; top: 0; inset-inline-end: 0; width: 6px; height: 100%; cursor: ew-resize; }

.ion-gantt-today { position: absolute; top: 0; bottom: 0; width: 2px; background: var(--ion-danger); z-index: 2; opacity: 0.7; }

.ion-gantt-dependency { stroke: var(--ion-text-dim); stroke-width: 1.5; fill: none; marker-end: url(#gantt-arrow); }

.ion-gantt-empty { display: flex; align-items: center; justify-content: center; flex: 1; color: var(--ion-text-dim); font-family: var(--ion-font-mono); font-size: 13px; }

/* ==========================================================================
   GRAPH COMPONENT (<ion-graph>)
   ========================================================================== */

.ion-graph { display: flex; flex-direction: column; width: 100%; height: 100%; background: var(--ion-bg); color: var(--ion-text); font-family: var(--ion-font-body); position: relative; outline: none; overflow: hidden; border-radius: var(--ion-radius-md); }
.ion-graph-body { flex: 1; display: flex; position: relative; overflow: hidden; }
.ion-graph-canvas { flex: 1; position: relative; cursor: grab; min-height: 200px; }
.ion-graph-canvas:active { cursor: grabbing; }

.ion-graph-toolbar { display: flex; align-items: center; justify-content: space-between; padding: var(--ion-space-1) var(--ion-space-2); background: var(--ion-bg-surface); border-bottom: 1px solid var(--ion-text-faint); gap: var(--ion-space-2); flex-shrink: 0; }
.ion-graph-toolbar-left, .ion-graph-toolbar-center, .ion-graph-toolbar-right { display: flex; align-items: center; gap: 6px; }

.ion-graph-search { background: var(--ion-bg-darker); border: 1px solid var(--ion-text-faint); color: var(--ion-text); font-family: var(--ion-font-mono); font-size: 12px; padding: 3px 8px; border-radius: var(--ion-radius); width: 180px; outline: none; }
.ion-graph-search:focus { border-color: var(--ion-cyan); }

.ion-graph-stat { font-family: var(--ion-font-mono); font-size: 11px; color: var(--ion-text-muted); }
.ion-graph-stat--active { color: var(--ion-success); }
.ion-graph-stat--gpu { color: var(--ion-cyan); font-weight: 600; }

.ion-graph-btn { background: var(--ion-bg-surface-2); border: 1px solid var(--ion-text-faint); color: var(--ion-text); font-family: var(--ion-font-mono); font-size: 12px; padding: 2px 8px; border-radius: var(--ion-radius); cursor: pointer; line-height: 1.4; }
.ion-graph-btn:hover { background: var(--ion-bg-surface); border-color: var(--ion-cyan); }
.ion-graph-btn--sm { padding: 0 4px; font-size: 11px; }
.ion-graph-btn--primary { background: rgba(var(--ion-cyan-rgb), 0.15); border-color: var(--ion-cyan); color: var(--ion-cyan); }
.ion-graph-btn--danger { background: rgba(255, 56, 96, 0.15); border-color: var(--ion-danger); color: var(--ion-danger); }

.ion-graph-detail { width: 260px; background: var(--ion-bg-surface); border-inline-start: 1px solid var(--ion-text-faint); padding: var(--ion-space-3); overflow-y: auto; flex-shrink: 0; }
.ion-graph-detail-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--ion-space-2); }
.ion-graph-detail-label { font-family: var(--ion-font-mono); font-size: 13px; color: var(--ion-cyan); font-weight: 600; }
.ion-graph-detail-key { font-family: var(--ion-font-mono); font-size: 12px; color: var(--ion-text); word-break: break-all; margin-bottom: var(--ion-space-1); }
.ion-graph-detail-id { font-family: var(--ion-font-mono); font-size: 11px; color: var(--ion-text-muted); margin-bottom: var(--ion-space-3); }
.ion-graph-detail-section-title { font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--ion-text-muted); margin-bottom: 6px; }
.ion-graph-detail-prop { display: flex; align-items: center; gap: 4px; margin-bottom: 4px; font-family: var(--ion-font-mono); font-size: 11px; }
.ion-graph-detail-prop-key { color: var(--ion-text-muted); min-width: 60px; }
.ion-graph-detail-prop-value { color: var(--ion-text); word-break: break-all; }
.ion-graph-detail-actions { margin-top: var(--ion-space-3); padding-top: var(--ion-space-3); border-top: 1px solid var(--ion-text-faint); }

.ion-graph-edit-panel { position: absolute; top: 48px; inset-inline-end: 12px; width: 280px; background: var(--ion-bg-surface); border: 1px solid var(--ion-text-faint); border-radius: var(--ion-radius-md); padding: var(--ion-space-3); z-index: 10; backdrop-filter: blur(8px); }
.ion-graph-edit-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--ion-space-3); font-family: var(--ion-font-mono); font-size: 13px; }
.ion-graph-edit-form { display: flex; flex-direction: column; gap: var(--ion-space-2); }
.ion-graph-edit-label { display: flex; flex-direction: column; gap: 3px; font-family: var(--ion-font-mono); font-size: 11px; color: var(--ion-text-muted); }
.ion-graph-edit-input { background: var(--ion-bg-darker); border: 1px solid var(--ion-text-faint); color: var(--ion-text); font-family: var(--ion-font-mono); font-size: 12px; padding: 4px 8px; border-radius: var(--ion-radius); }
.ion-graph-edit-input:focus { border-color: var(--ion-cyan); outline: none; }

.ion-graph-context-menu { position: absolute; background: var(--ion-bg-surface); border: 1px solid var(--ion-text-faint); border-radius: var(--ion-radius-md); padding: var(--ion-space-1) 0; z-index: 20; min-width: 160px; backdrop-filter: blur(8px); }
.ion-graph-context-menu-item { padding: 4px 12px; font-family: var(--ion-font-mono); font-size: 12px; cursor: pointer; }
.ion-graph-context-menu-item:hover { background: var(--ion-bg-surface-2); }

.ion-graph-loading { position: absolute; top: 50%; inset-inline-start: 50%; transform: translate(-50%, -50%); color: var(--ion-cyan); font-family: var(--ion-font-mono); font-size: 14px; pointer-events: none; }

/* ==========================================================================
   THEME VARIANTS
   Override design tokens per theme class on <html>.
   ========================================================================== */

/* Deep Blue — cool indigo palette */
html.theme-deep-blue {
  --ion-cyan:          #60a5fa;
  --ion-cyan-mid:      #93c5fd;
  --ion-magenta:       #818cf8;
  --ion-violet:        #6366f1;
  --ion-cyan-rgb:      96, 165, 250;
  --ion-magenta-rgb:   129, 140, 248;
  --ion-bg:            #050b1e;
  --ion-bg-darker:     #020510;
  --ion-bg-surface:    rgba(96, 165, 250, 0.06);
  --ion-bg-surface-2:  rgba(96, 165, 250, 0.10);
  --ion-bg-surface-3:  rgba(96, 165, 250, 0.14);
  --ion-border:        rgba(96, 165, 250, 0.10);
  --ion-border-mid:    rgba(96, 165, 250, 0.20);
  --ion-border-focus:  rgba(96, 165, 250, 0.50);
  --ion-gradient-cm:   linear-gradient(135deg, #60a5fa 0%, #818cf8 100%);
}

/* Midnight — very low-contrast, maximum dark */
html.theme-midnight {
  --ion-cyan:          #4ade80;
  --ion-cyan-mid:      #86efac;
  --ion-magenta:       #a78bfa;
  --ion-violet:        #7c3aed;
  --ion-cyan-rgb:      74, 222, 128;
  --ion-magenta-rgb:   167, 139, 250;
  --ion-bg:            #010104;
  --ion-bg-darker:     #000002;
  --ion-bg-surface:    rgba(255, 255, 255, 0.03);
  --ion-bg-surface-2:  rgba(255, 255, 255, 0.05);
  --ion-bg-surface-3:  rgba(255, 255, 255, 0.08);
  --ion-border:        rgba(255, 255, 255, 0.06);
  --ion-border-mid:    rgba(255, 255, 255, 0.10);
  --ion-text-muted:    #6b7280;
  --ion-gradient-cm:   linear-gradient(135deg, #4ade80 0%, #a78bfa 100%);
}

/* Stealth — terminal green-on-black */
html.theme-stealth {
  --ion-cyan:          #00ff41;
  --ion-cyan-mid:      #39ff14;
  --ion-magenta:       #00ff41;
  --ion-violet:        #00cc33;
  --ion-cyan-rgb:      0, 255, 65;
  --ion-magenta-rgb:   0, 255, 65;
  --ion-bg:            #000300;
  --ion-bg-darker:     #000100;
  --ion-bg-surface:    rgba(0, 255, 65, 0.05);
  --ion-bg-surface-2:  rgba(0, 255, 65, 0.09);
  --ion-bg-surface-3:  rgba(0, 255, 65, 0.13);
  --ion-border:        rgba(0, 255, 65, 0.12);
  --ion-border-mid:    rgba(0, 255, 65, 0.22);
  --ion-border-focus:  rgba(0, 255, 65, 0.55);
  --ion-text:          #d0ffd8;
  --ion-text-muted:    #4a7a50;
  --ion-gradient-cm:   linear-gradient(135deg, #00ff41 0%, #00cc33 100%);
}

/* Light — clean day-mode palette */
html.theme-light {
  color-scheme: light;

  --ion-cyan:          #0077a8;
  --ion-cyan-mid:      #0099cc;
  --ion-magenta:       #9400d3;
  --ion-violet:        #5500cc;
  --ion-violet-mid:    #6d28d9;
  --ion-cyan-rgb:      0, 119, 168;
  --ion-magenta-rgb:   148, 0, 211;

  /* Semantic — darker/more-saturated so they read on a white background */
  --ion-success:       #16a34a;
  --ion-warning:       #d97706;
  --ion-danger:        #dc2626;
  --ion-info:          #0077a8;

  --ion-bg:            #f0f0f5;
  --ion-bg-darker:     #e0e0ea;
  --ion-bg-surface:    rgba(0, 0, 0, 0.04);
  --ion-bg-surface-2:  rgba(0, 0, 0, 0.07);
  --ion-bg-surface-3:  rgba(0, 0, 0, 0.11);

  --ion-text:          #1a1a2e;
  --ion-text-muted:    #52525f;
  --ion-text-dim:      rgba(0, 0, 0, 0.40);
  --ion-text-faint:    rgba(0, 0, 0, 0.12);

  --ion-border:        rgba(0, 0, 0, 0.08);
  --ion-border-mid:    rgba(0, 0, 0, 0.16);
  --ion-border-focus:  rgba(0, 119, 168, 0.50);
  --ion-border-hover:  rgba(0, 119, 168, 0.30);

  --ion-gradient:      linear-gradient(135deg, #0077a8 0%, #5500cc 50%, #9400d3 100%);
  --ion-gradient-cm:   linear-gradient(135deg, #0077a8 0%, #9400d3 100%);
  --ion-gradient-cw:   linear-gradient(135deg, #0077a8 0%, #6d28d9 100%);

  --ion-glow-cyan:     0 0 20px rgba(0, 119, 168, 0.12);
  --ion-glow-magenta:  0 0 20px rgba(148, 0, 211, 0.12);
  --ion-glow-focus:    0 0 0 3px rgba(0, 119, 168, 0.15), inset 0 0 16px rgba(0, 119, 168, 0.03);

  /* Space Mono is high-ink-density; on white it looks heavy.
     Switch to a lighter system mono for better readability. */
  --ion-font-mono:     ui-monospace, 'Cascadia Code', Consolas, 'SFMono-Regular', monospace;

  /* Surface tiers for kernel picker / tooltips */
  --ion-surface-3:     rgba(0, 0, 0, 0.05);
  --ion-surface-4:     rgba(0, 0, 0, 0.08);

  /* Popup chrome — light glass instead of near-black */
  --ion-popup-bg:      rgba(250, 250, 255, 0.98);
  --ion-popup-sub-bg:  rgba(0, 0, 0, 0.04);
  --ion-popup-shadow:  0 8px 32px rgba(0, 0, 0, 0.14);
  --ion-popup-border:  rgba(0, 0, 0, 0.10);

  /* Action affordances */
  --ion-action-bar-bg:      rgba(0, 0, 0, 0.03);
  --ion-action-menu-bg:     rgba(250, 250, 255, 0.96);
  --ion-action-pending-bg:  rgba(245, 245, 250, 0.94);

  --ion-top-bar-bg:         rgba(240, 240, 245, 0.96);
}

/* --- Light theme: hardcoded dark overrides --- */

/* Scrollbars */
html.theme-light ::-webkit-scrollbar-track       { background: var(--ion-bg-darker); }
html.theme-light ::-webkit-scrollbar-thumb       { background: rgba(0, 0, 0, 0.18); }
html.theme-light ::-webkit-scrollbar-thumb:hover { background: rgba(0, 119, 168, 0.40); }

/* Animated grid */
html.theme-light .ion-grid-bg::before {
  background-image:
    linear-gradient(rgba(0, 119, 168, 0.05) 1px, transparent 1px),
    linear-gradient(90deg, rgba(0, 119, 168, 0.05) 1px, transparent 1px);
}

/* Glass card / login card */
html.theme-light .ion-glass {
  background: rgba(255, 255, 255, 0.80);
  box-shadow: 0 0 0 1px rgba(0, 119, 168, 0.10), 0 32px 80px rgba(0, 0, 0, 0.12), inset 0 1px 0 rgba(255,255,255,0.9);
}

/* Opaque panel sidebar */
html.theme-light .ion-panel {
  background: rgba(255, 255, 255, 0.55);
}

/* Select — swap white SVG arrow for a dark one */
html.theme-light .ion-select {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='rgba(0,0,0,0.45)' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
}
html.theme-light .ion-select option { background: #f5f5fa; color: #1a1a2e; }

/* Date / time inputs — override the hardcoded dark color-scheme */
html.theme-light .ion-input[type="date"],
html.theme-light .ion-input[type="time"],
html.theme-light .ion-input[type="datetime-local"],
html.theme-light .ion-input[type="month"],
html.theme-light .ion-input[type="week"] { color-scheme: light; }
html.theme-light .ion-input[type="date"]::-webkit-calendar-picker-indicator,
html.theme-light .ion-input[type="time"]::-webkit-calendar-picker-indicator,
html.theme-light .ion-input[type="datetime-local"]::-webkit-calendar-picker-indicator,
html.theme-light .ion-input[type="month"]::-webkit-calendar-picker-indicator,
html.theme-light .ion-input[type="week"]::-webkit-calendar-picker-indicator { filter: none; opacity: 0.55; }

/* Button secondary hover */
html.theme-light .ion-btn-secondary:hover { background: rgba(0, 119, 168, 0.08); }

/* Tab close */
html.theme-light .ion-tab-close:hover { background: rgba(0, 0, 0, 0.10) !important; }

/* Mode-switcher bar */
html.theme-light .ion-modebar {
  background: rgba(240, 240, 245, 0.92);
  border-color: rgba(0, 0, 0, 0.12);
  box-shadow: 0 4px 24px rgba(0, 0, 0, 0.12);
}
html.theme-light .ion-modebar-btn:hover         { background: rgba(0, 0, 0, 0.08); }
html.theme-light .ion-modebar-flyout-btn:hover  { background: rgba(0, 0, 0, 0.08); }
html.theme-light .ion-modebar-flyout-hr         { border-top-color: rgba(0, 0, 0, 0.10); }

/* File info panel */
html.theme-light .ion-info-panel {
  background: rgba(245, 245, 250, 0.96);
  border-inline-start-color: rgba(0, 0, 0, 0.12);
  box-shadow: -4px 0 24px rgba(0, 0, 0, 0.10);
}
html.theme-light .ion-info-panel-close:hover { background: rgba(0, 0, 0, 0.08); }

/* App tiles */
html.theme-light .ion-app-tile {
  background: linear-gradient(135deg, rgba(0, 119, 168, 0.08), rgba(148, 0, 211, 0.08));
  border-color: rgba(0, 119, 168, 0.25);
}
html.theme-light .ion-app-tile:hover { box-shadow: 0 4px 20px rgba(0, 119, 168, 0.18); }
html.theme-light .ion-app-tile-icon  { filter: drop-shadow(0 0 6px rgba(0, 119, 168, 0.30)); }

/* App folder tiles (were invisible on light bg) */
html.theme-light .ion-app-folder-tile {
  background: rgba(0, 0, 0, 0.04);
  border-color: rgba(0, 0, 0, 0.12);
}
html.theme-light .ion-app-folder-tile:hover {
  background: rgba(0, 0, 0, 0.07);
  border-color: rgba(0, 119, 168, 0.30);
}

/* Login page text */
html.theme-light .ion-login-brand   { color: rgba(0, 0, 0, 0.45); }
html.theme-light .ion-login-tagline { color: rgba(0, 119, 168, 0.70); }
html.theme-light .ion-login-footer-text { color: rgba(0, 0, 0, 0.35); }
html.theme-light .ion-watermark     { color: rgba(0, 0, 0, 0.12); }

/* Link hover — #fff is invisible on light bg */
html.theme-light a:hover { color: var(--ion-cyan); }

/* User dropdown — text that uses hardcoded colour tokens */
html.theme-light .ion-user-dropdown-username { color: var(--ion-text); }
html.theme-light .ion-user-dropdown-item { color: var(--ion-text-muted); }
html.theme-light .ion-user-dropdown-item:hover { background: var(--ion-bg-surface-2); color: var(--ion-text); }
html.theme-light .ion-user-dropdown-item--admin:hover { background: rgba(0, 119, 168, 0.08); }
html.theme-light .ion-user-dropdown-divider { background: var(--ion-border); }

/* Notification filter pills */
html.theme-light .ion-notif-filter-btn.active {
  border-color: var(--ion-cyan);
  background: rgba(0, 119, 168, 0.08);
  color: var(--ion-cyan);
}

/* Theme/lang picker active option */
html.theme-light .ion-picker-option.active {
  background: rgba(0, 119, 168, 0.08);
  border-color: rgba(0, 119, 168, 0.30);
  color: var(--ion-cyan);
}

/* Kernel picker — hover/current rows */
html.theme-light .ion-kernel-picker .ion-kernel-picker-header { background: var(--ion-bg-darker); }

/* Top bar — light surface instead of dark glass */
html.theme-light .ion-top-bar { color: var(--ion-text); }
html.theme-corporate-light .ion-top-bar { color: var(--ion-text); }
html.theme-prism .ion-top-bar            { color: var(--ion-text); }
html.theme-standard .ion-top-bar         { color: var(--ion-text); }

/* ==========================================================================
   NOTIFICATION PANEL — header + "More" button extensions
   ========================================================================== */

.ion-notif-panel-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 8px 12px 6px;
  border-bottom: 1px solid var(--ion-border);
  flex-shrink: 0;
}
.ion-notif-panel-title {
  font-family: var(--ion-font-mono);
  font-size: 10px;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  color: var(--ion-text-dim);
}
.ion-notif-clear-btn {
  font-family: var(--ion-font-mono);
  font-size: 10px;
  background: none;
  border: none;
  color: var(--ion-text-muted);
  cursor: pointer;
  padding: 2px 4px;
}
.ion-notif-clear-btn:hover { color: var(--ion-danger); }

.ion-notif-more-btn {
  display: block;
  width: 100%;
  padding: 8px 12px;
  font-family: var(--ion-font-mono);
  font-size: 11px;
  color: var(--ion-cyan);
  background: none;
  border: none;
  border-top: 1px solid var(--ion-border);
  cursor: pointer;
  text-align: center;
}
.ion-notif-more-btn:hover { background: var(--ion-bg-surface); }

/* ==========================================================================
   USER MENU
   ========================================================================== */

.ion-user-menu {
  position: relative;
}

.ion-user-btn {
  position: relative; /* anchor for the unread badge */
  display: flex;
  align-items: center;
  background: none;
  border: 1px solid var(--ion-border);
  border-radius: var(--ion-radius);
  padding: 4px 6px;
  cursor: pointer;
  color: var(--ion-text-muted);
  transition: border-color var(--ion-t), color var(--ion-t), filter var(--ion-t);
}
.ion-user-btn:hover {
  border-color: var(--ion-border-focus);
  filter: brightness(1.2) drop-shadow(0 0 4px rgba(var(--ion-cyan-rgb), 0.2));
}

/* SVG user icon — same 24×24 viewBox as file-tile icons */
.ion-user-icon {
  width: 22px;
  height: 22px;
  display: block;
  color: var(--ion-cyan);
  transition: filter var(--ion-t), color var(--ion-t);
}

.ion-user-dropdown {
  position: fixed;
  top: 48px;
  inset-inline-end: 8px;
  z-index: 950;
  width: 220px;
  background: var(--ion-popup-bg);
  border: 1px solid var(--ion-popup-border);
  border-radius: var(--ion-radius-md);
  backdrop-filter: blur(16px);
  box-shadow: var(--ion-popup-shadow);
  z-index: var(--ion-z-toast);
  padding: 6px 0;
  animation: ion-fade-in 0.15s ease both;
}

.ion-user-dropdown-header {
  padding: 10px 14px 8px;
  border-bottom: 1px solid var(--ion-border);
  margin-bottom: 4px;
}
.ion-user-dropdown-username {
  font-family: var(--ion-font-mono);
  font-size: 12px;
  font-weight: 700;
  color: var(--ion-text);
  display: block;
  margin-bottom: 2px;
}
.ion-user-dropdown-role {
  font-family: var(--ion-font-mono);
  font-size: 9px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ion-cyan);
}

.ion-user-dropdown-item {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  padding: 7px 14px;
  background: none;
  border: none;
  color: var(--ion-text-muted);
  font-family: var(--ion-font-mono);
  font-size: 12px;
  cursor: pointer;
  text-align: start;
  transition: background var(--ion-t), color var(--ion-t);
  white-space: nowrap;
  text-decoration: none;
}
.ion-user-dropdown-item:hover { background: var(--ion-bg-surface-2); color: var(--ion-text); }
.ion-user-dropdown-item--admin { color: var(--ion-cyan); }
.ion-user-dropdown-item--admin:hover { background: rgba(var(--ion-cyan-rgb), 0.06); }
.ion-user-dropdown-item--danger { color: var(--ion-danger); }
.ion-user-dropdown-item--danger:hover { background: rgba(255, 56, 96, 0.08); }

.ion-user-dropdown-item-icon { font-size: 13px; width: 16px; text-align: center; flex-shrink: 0; }

.ion-user-dropdown-divider {
  height: 1px;
  background: var(--ion-border);
  margin: 4px 0;
}

/* Notifications section inside the user dropdown */
.ion-user-dropdown-notif-header {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 6px 14px 4px;
  font-family: var(--ion-font-mono);
  font-size: 9px;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  color: var(--ion-text-dim);
}
.ion-user-dropdown-notif-count {
  margin-inline-start: auto;
  background: var(--ion-danger);
  color: #fff;
  font-size: 9px;
  font-weight: 700;
  min-width: 14px;
  height: 14px;
  border-radius: 7px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0 3px;
}
.ion-user-dropdown-notif-item {
  display: flex;
  align-items: flex-start;
  gap: 7px;
  padding: 5px 14px;
  cursor: default;
  border-inline-start: 2px solid transparent;
  transition: background var(--ion-t);
}
.ion-user-dropdown-notif-item:hover { background: var(--ion-bg-surface); }
.ion-user-dropdown-notif-item.ion-notif-unread { border-inline-start-color: var(--ion-cyan); }
.ion-user-dropdown-notif-icon { font-size: 11px; flex-shrink: 0; padding-top: 1px; }
.ion-notif-item--error   .ion-user-dropdown-notif-icon { color: var(--ion-danger); }
.ion-notif-item--warning .ion-user-dropdown-notif-icon { color: var(--ion-warning); }
.ion-notif-item--success .ion-user-dropdown-notif-icon { color: var(--ion-success); }
.ion-notif-item--info    .ion-user-dropdown-notif-icon { color: var(--ion-cyan); }
.ion-user-dropdown-notif-body {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 1px;
}
.ion-user-dropdown-notif-title {
  font-family: var(--ion-font-mono);
  font-size: 11px;
  color: var(--ion-text);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.ion-user-dropdown-notif-time {
  font-family: var(--ion-font-mono);
  font-size: 9px;
  color: var(--ion-text-muted);
}
.ion-user-dropdown-notif-desc,
.ion-user-dropdown-notif-details {
  display: none;
  font-family: var(--ion-font-mono);
  font-size: 10px;
  color: var(--ion-text-muted);
  margin: 0;
  white-space: pre-wrap;
  word-break: break-word;
  max-height: 120px;
  overflow-y: auto;
}
.ion-user-dropdown-notif-desc { line-height: 1.35; padding-top: 2px; }
.ion-user-dropdown-notif-details {
  padding: 4px 6px;
  background: var(--ion-bg);
  border-radius: var(--ion-radius-sm);
  margin-top: 2px;
}
.ion-user-dropdown-notif-item:hover .ion-user-dropdown-notif-desc,
.ion-user-dropdown-notif-item:hover .ion-user-dropdown-notif-details { display: block; }
.ion-user-dropdown-notif-item:hover .ion-user-dropdown-notif-title {
  white-space: normal;
  word-break: break-word;
}

/* Max-height + scroll for the dropdown when notifications fill it */
.ion-user-dropdown {
  max-height: 85vh;
  overflow-y: auto;
}

/* Sub-menu (theme picker inline) */
.ion-user-dropdown-sub { position: relative; }
.ion-user-dropdown-item--has-sub { justify-content: space-between; }
.ion-user-dropdown-submenu {
  display: none;
  flex-direction: column;
  background: var(--ion-popup-sub-bg);
  border-top: 1px solid var(--ion-border);
  border-bottom: 1px solid var(--ion-border);
}
.ion-user-dropdown-sub.open .ion-user-dropdown-submenu { display: flex; }
.ion-user-dropdown-sub.open .ion-user-dropdown-item--has-sub .ion-user-dropdown-arrow {
  transform: rotate(90deg);
}
.ion-user-dropdown-arrow { transition: transform 0.15s; display: inline-block; }
.ion-theme-option { padding-inline-start: 30px !important; font-size: 11px !important; }
.ion-theme-option.active { color: var(--ion-cyan) !important; }
.ion-lang-option { padding-inline-start: 30px !important; font-size: 11px !important; }
.ion-lang-option.active { color: var(--ion-cyan) !important; }

/* ==========================================================================
   NOTIFICATIONS MODAL (75 % screen)
   ========================================================================== */

.ion-modal--notifications {
  width: 75vw;
  max-width: 75vw;
  height: 75vh;
  max-height: 75vh;
  display: flex;
  flex-direction: column;
}
.ion-modal--notifications .ion-modal-body {
  flex: 1;
  overflow-y: auto;
  padding: var(--ion-sp-3) var(--ion-sp-4);
}
.ion-notif-modal-filters {
  display: flex;
  gap: var(--ion-sp-2);
  flex-wrap: wrap;
  margin-bottom: var(--ion-sp-3);
}
.ion-notif-filter-btn {
  padding: 3px 10px;
  border-radius: 99px;
  border: 1px solid var(--ion-border);
  background: none;
  color: var(--ion-text-muted);
  font-family: var(--ion-font-mono);
  font-size: 10px;
  cursor: pointer;
  transition: all var(--ion-t);
}
.ion-notif-filter-btn:hover { border-color: var(--ion-cyan); color: var(--ion-cyan); }
.ion-notif-filter-btn.active { border-color: var(--ion-cyan); background: rgba(var(--ion-cyan-rgb), 0.08); color: var(--ion-cyan); }
.ion-notif-modal-list { display: flex; flex-direction: column; }
.ion-notif-modal-item {
  display: flex;
  gap: 10px;
  padding: 10px 4px;
  border-bottom: 1px solid var(--ion-border);
}
.ion-notif-modal-item:last-child { border-bottom: none; }
.ion-notif-modal-item-date {
  font-family: var(--ion-font-mono);
  font-size: 10px;
  color: var(--ion-text-muted);
  white-space: nowrap;
  min-width: 80px;
}

/* ==========================================================================
   DEBUG CONSOLE — PERSISTENT BOTTOM PANEL
   ========================================================================== */

/* Panel sits in the body flex column; height:0 when closed. */
.ion-debug-panel {
  flex-shrink: 0;
  height: 0;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  background: var(--ion-bg-darker);
  border-top: 1px solid var(--ion-border);
  font-family: var(--ion-font-mono);
  font-size: 11px;
  transition: height 0.18s ease;
  z-index: 200;
}
.ion-debug-panel--open {
  height: 280px;
}

/* Drag handle — thin strip at the top */
.ion-debug-panel__handle {
  flex-shrink: 0;
  height: 5px;
  cursor: ns-resize;
  background: var(--ion-border);
  transition: background 0.15s;
}
.ion-debug-panel__handle:hover { background: var(--ion-cyan); }

/* Toolbar row */
.ion-debug-panel__toolbar {
  display: flex;
  align-items: center;
  gap: var(--ion-sp-2);
  padding: 3px 8px;
  border-bottom: 1px solid var(--ion-border);
  flex-shrink: 0;
  height: 30px;
}
.ion-debug-panel__title {
  font-size: 10px;
  color: var(--ion-text-muted);
  text-transform: uppercase;
  letter-spacing: 0.07em;
  white-space: nowrap;
  margin-inline-end: var(--ion-sp-1);
}
.ion-debug-panel__filter {
  flex: 1;
  height: 20px;
  font-size: 11px;
  font-family: var(--ion-font-mono);
  background: var(--ion-bg-raised);
  border: 1px solid var(--ion-border);
  color: var(--ion-text);
  border-radius: 3px;
  padding: 0 6px;
  outline: none;
}
.ion-debug-panel__filter:focus { border-color: var(--ion-cyan); }

/* Log area */
.ion-debug-panel__log {
  flex: 1;
  overflow-y: auto;
  padding: 0;
}

/* Log rows */
.ion-debug-entry {
  display: flex;
  gap: 6px;
  padding: 2px 8px;
  border-bottom: 1px solid rgba(255,255,255,0.03);
  align-items: baseline;
  min-height: 18px;
}
.ion-debug-entry:hover { background: var(--ion-bg-raised); }
.ion-debug-ts {
  color: var(--ion-text-muted);
  font-size: 10px;
  white-space: nowrap;
  flex-shrink: 0;
  min-width: 66px;
}
.ion-debug-dir { flex-shrink: 0; font-size: 10px; min-width: 12px; }
.ion-debug-dir--in  { color: var(--ion-cyan); }
.ion-debug-dir--out { color: #ff6b6b; }
.ion-debug-dir--\.  { color: #555; }
.ion-debug-cat {
  font-size: 10px;
  flex-shrink: 0;
  min-width: 62px;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  font-weight: 600;
}
.ion-debug-label {
  color: var(--ion-text-muted);
  flex-shrink: 0;
  min-width: 130px;
  white-space: nowrap;
}
.ion-debug-text {
  color: var(--ion-text);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  flex: 1;
}
.ion-debug-empty {
  color: var(--ion-text-muted);
  padding: 16px 24px;
  font-size: 11px;
}
.ion-debug-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 16px;
  height: 16px;
  border-radius: 8px;
  background: var(--ion-cyan);
  color: var(--ion-bg);
  font-size: 9px;
  font-weight: 700;
  padding: 0 4px;
  margin-inline-start: 4px;
}

/* ==========================================================================
   AGENT DEBUG DRAWER
   Right-side sliding panel. Ctrl+D toggles open/closed.
   Two-pane layout: left chip list + right detail view.
   ========================================================================== */

.ion-agent-debug-drawer {
  position: fixed;
  top: 0;
  inset-inline-end: 0;
  bottom: 0;
  width: 0;
  overflow: hidden;
  display: flex;
  flex-direction: row;
  background: var(--ion-bg-darker);
  border-inline-start: 1px solid var(--ion-border);
  font-family: var(--ion-font-mono);
  font-size: 12px;
  transition: width 0.18s ease;
  z-index: 300;
}
.ion-agent-debug-drawer--open {
  width: 640px;
}

/* Left drag handle */
.ion-agent-debug-drawer__handle {
  flex-shrink: 0;
  width: 5px;
  cursor: ew-resize;
  background: var(--ion-border);
  transition: background 0.15s;
}
.ion-agent-debug-drawer__handle:hover { background: var(--ion-cyan); }

/* Inner column — fills remaining width */
.ion-agent-debug-drawer > *:not(.ion-agent-debug-drawer__handle) {
  min-width: 0;
  flex: 1;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

/* Toolbar */
.ion-agent-debug-drawer__toolbar {
  display: flex;
  align-items: center;
  gap: var(--ion-sp-2);
  padding: 4px 10px;
  border-bottom: 1px solid var(--ion-border);
  flex-shrink: 0;
  height: 32px;
}
.ion-agent-debug-drawer__title {
  font-size: 10px;
  color: var(--ion-text-muted);
  text-transform: uppercase;
  letter-spacing: 0.07em;
  white-space: nowrap;
  margin-inline-end: var(--ion-sp-1);
}
.ion-agent-debug-drawer__hint {
  font-size: 10px;
  color: var(--ion-border);
  border: 1px solid var(--ion-border);
  border-radius: 3px;
  padding: 1px 4px;
  white-space: nowrap;
}

/* Two-pane body */
.ion-agent-debug-drawer__body {
  display: flex;
  flex: 1;
  overflow: hidden;
  min-height: 0;
}

/* Left: turn chip list */
.ion-agent-debug-drawer__list {
  width: 220px;
  flex-shrink: 0;
  overflow-y: auto;
  border-inline-end: 1px solid var(--ion-border);
}

/* Right: message detail */
.ion-agent-debug-drawer__detail {
  flex: 1;
  overflow-y: auto;
  padding: 0;
  min-width: 0;
}

/* Turn chips */
.ion-agent-debug-chip {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 8px 10px;
  border-bottom: 1px solid rgba(255,255,255,0.04);
  cursor: pointer;
  transition: background 0.1s;
}
.ion-agent-debug-chip:hover { background: var(--ion-bg-raised); }
.ion-agent-debug-chip--active {
  background: rgba(var(--ion-cyan-rgb), 0.07);
  border-inline-start: 2px solid var(--ion-cyan);
}
.ion-agent-debug-chip__iter {
  font-size: 10px;
  color: var(--ion-cyan);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}
.ion-agent-debug-chip__label {
  color: var(--ion-text);
  font-size: 11px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.ion-agent-debug-chip__msgs {
  color: var(--ion-text-muted);
  font-size: 10px;
}
.ion-agent-debug-chip__ts {
  color: var(--ion-text-muted);
  font-size: 9px;
}

/* Detail pane */
.ion-agent-debug-detail-header {
  display: flex;
  align-items: center;
  gap: var(--ion-sp-2);
  padding: 6px 12px;
  border-bottom: 1px solid var(--ion-border);
  background: var(--ion-bg-raised);
  flex-shrink: 0;
}
.ion-agent-debug-detail-label {
  flex: 1;
  font-size: 11px;
  color: var(--ion-cyan);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Sections (System Prompt / Messages) */
.ion-agent-debug-section {
  padding: 0 0 8px 0;
}
.ion-agent-debug-section__title {
  font-size: 9px;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--ion-text-muted);
  padding: 6px 12px 4px;
  border-bottom: 1px solid rgba(255,255,255,0.04);
}

/* Per-message blocks */
.ion-agent-debug-msg {
  margin: 4px 8px;
  border: 1px solid var(--ion-border);
  border-radius: 4px;
  overflow: hidden;
}
.ion-agent-debug-msg__role {
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 0.07em;
  padding: 3px 8px;
  border-bottom: 1px solid var(--ion-border);
}
.ion-agent-debug-msg--user    .ion-agent-debug-msg__role { color: var(--ion-cyan); background: rgba(var(--ion-cyan-rgb), 0.06); }
.ion-agent-debug-msg--assistant .ion-agent-debug-msg__role { color: var(--ion-magenta); background: rgba(var(--ion-magenta-rgb), 0.06); }
.ion-agent-debug-msg--system  .ion-agent-debug-msg__role { color: #ff6b00; background: rgba(255,107,0,0.06); }
.ion-agent-debug-msg--tool    .ion-agent-debug-msg__role { color: #00ff88; background: rgba(0,255,136,0.06); }
.ion-agent-debug-msg__body {
  padding: 4px 0;
}

/* Tool-use / tool-result sub-blocks */
.ion-agent-debug-tool-use,
.ion-agent-debug-tool-result {
  margin: 2px 8px;
  padding: 4px 8px;
  background: rgba(255,255,255,0.03);
  border-radius: 3px;
}
.ion-agent-debug-tool-use__name {
  display: block;
  font-size: 10px;
  color: var(--ion-cyan);
  font-weight: 600;
  margin-bottom: 2px;
}
.ion-agent-debug-tool-result__id {
  display: block;
  font-size: 10px;
  color: #00ff88;
  margin-bottom: 2px;
}

/* Shared pre block */
.ion-agent-debug-pre {
  margin: 2px 8px;
  padding: 4px 6px;
  font-family: var(--ion-font-mono);
  font-size: 11px;
  color: var(--ion-text);
  white-space: pre-wrap;
  word-break: break-word;
  background: transparent;
  border: none;
  line-height: 1.5;
}

.ion-agent-debug-empty {
  color: var(--ion-text-muted);
  padding: 20px 16px;
  font-size: 11px;
  font-family: var(--ion-font-mono);
  line-height: 1.6;
}

/* ==========================================================================
   SYSTEM SETTINGS MODAL
   ========================================================================== */

.ion-modal--settings {
  width: 60vw;
  max-width: 720px;
  min-width: 340px;
  max-height: 80vh;
  display: flex;
  flex-direction: column;
}
.ion-modal--settings .ion-modal-body {
  flex: 1;
  overflow-y: auto;
  padding: var(--ion-sp-4) var(--ion-sp-6);
}

.ion-settings-section {
  border: 1px solid var(--ion-border);
  border-radius: var(--ion-radius);
  margin-bottom: var(--ion-sp-3);
  overflow: hidden;
}
.ion-settings-section-header {
  display: flex;
  align-items: center;
  gap: var(--ion-sp-2);
  width: 100%;
  padding: var(--ion-sp-3) var(--ion-sp-4);
  background: var(--ion-surface-2);
  border: none;
  cursor: pointer;
  font-family: var(--ion-font-display);
  font-size: 13px;
  font-weight: 600;
  color: var(--ion-text);
  text-align: start;
  transition: background var(--ion-transition);
}
.ion-settings-section-header:hover { background: var(--ion-surface-3); }
.ion-settings-section-arrow {
  margin-inline-start: auto;
  font-size: 12px;
  color: var(--ion-text-muted);
  transition: transform var(--ion-transition);
}
.ion-settings-section.open .ion-settings-section-arrow {
  transform: rotate(90deg);
}
.ion-settings-section-body {
  display: none;
  padding: var(--ion-sp-2) 0;
  background: var(--ion-surface);
}
.ion-settings-section.open .ion-settings-section-body {
  display: block;
}

.ion-settings-row {
  display: flex;
  align-items: baseline;
  padding: var(--ion-sp-2) var(--ion-sp-4);
  gap: var(--ion-sp-4);
  font-size: 12px;
}
.ion-settings-row:not(:last-child) {
  border-bottom: 1px solid var(--ion-border);
}
.ion-settings-key {
  flex: 0 0 200px;
  color: var(--ion-text-muted);
  font-family: var(--ion-font-mono);
}
.ion-settings-value {
  flex: 1;
  color: var(--ion-text);
  font-family: var(--ion-font-mono);
  word-break: break-all;
}
.ion-settings-value--bool-true  { color: var(--ion-cyan); }
.ion-settings-value--bool-false { color: var(--ion-text-muted); }
.ion-settings-loading {
  color: var(--ion-text-muted);
  padding: var(--ion-sp-6);
  text-align: center;
  font-size: 13px;
}

/* ==========================================================================
   LANGUAGE / THEME PICKER MODAL
   ========================================================================== */

.ion-picker-modal {
  width: 360px;
  max-width: 90vw;
}
.ion-picker-list {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: var(--ion-sp-3);
}
.ion-picker-option {
  display: flex;
  align-items: center;
  gap: var(--ion-sp-3);
  padding: var(--ion-sp-3) var(--ion-sp-4);
  border-radius: var(--ion-radius);
  cursor: pointer;
  border: 1px solid transparent;
  transition: all var(--ion-t);
  font-family: var(--ion-font-mono);
  font-size: 13px;
  color: var(--ion-text-muted);
}
.ion-picker-option:hover { background: var(--ion-bg-surface-2); color: var(--ion-text); border-color: var(--ion-border); }
.ion-picker-option.active { background: rgba(var(--ion-cyan-rgb), 0.06); color: var(--ion-cyan); border-color: rgba(var(--ion-cyan-rgb), 0.25); }
.ion-picker-option-check { margin-inline-start: auto; color: var(--ion-cyan); font-size: 14px; }

/* ==========================================================================
   UTILITY CLASSES — moved from inline styles
   ========================================================================== */

/* Flex layout utilities */
.ion-flex-grow {
  display: flex;
  flex-direction: column;
  flex: 1;
  min-height: 0;
}

.ion-flex-fill {
  flex: 1;
  min-height: 0;
}

.ion-flex-center {
  display: flex;
  align-items: center;
  gap: 6px;
}

/* Component sizing */
.ion-component-chart {
  width: 100%;
  height: 800px;
}

.ion-component-table {
  width: 100%;
}

.ion-component-graph {
  width: 100%;
  height: 800px;
}

.ion-component-board {
  width: 100%;
  height: 800px;
}

/* Cell styling overrides */
.ion-cell--input {
  border: 2px dashed var(--ion-border, #1e1e2e);
  border-radius: var(--ion-radius-md, 6px);
  padding: var(--ion-sp-3, 12px);
  margin: 4px 0;
}

.ion-cell--branch {
  padding: var(--ion-sp-2, 6px) var(--ion-sp-3, 12px);
  display: flex;
  flex-wrap: wrap;
  gap: var(--ion-sp-2, 6px);
  font-family: var(--ion-font-mono, 'Space Mono', monospace);
}

/* Inline text labels */
.ion-label-path {
  color: var(--ion-cyan, #00e5ff);
  font-family: var(--ion-font-mono, 'Space Mono', monospace);
  font-size: 12px;
}

.ion-label-ftype {
  color: var(--ion-text-muted, #9ca3af);
  font-size: 10px;
  text-transform: uppercase;
  margin-inline-start: var(--ion-sp-2, 8px);
}

.ion-badge-arm {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 2px 8px;
  border: 1px solid var(--ion-border, #1e1e2e);
  border-radius: var(--ion-radius, 2px);
  background: var(--ion-bg-elevated, #16161e);
  font-size: 11px;
}

.ion-badge-arm-index {
  color: var(--ion-magenta, #bf00ff);
  font-weight: bold;
}

/* Content rendering */
.ion-content-image {
  max-width: 100%;
}

/* Component stretch utilities */
.ion-component-stretch {
  width: 100%;
  flex: 1;
  min-height: 0;
}

.ion-component-full {
  width: 100%;
  height: 100%;
}

/* Flex container for full-height panels */
.ion-flex-row-full {
  display: flex;
  flex: 1;
  min-height: 0;
}

/* Spacing utilities */
.ion-mt-3 {
  margin-top: var(--ion-sp-3, 12px);
}

/* Color swatch/indicator */
.ion-color-swatch {
  display: inline-block;
  width: 12px;
  height: 12px;
  border-radius: var(--ion-radius, 2px);
  border: 1px solid rgba(255, 255, 255, 0.2);
}

/* ─── I8: Ambient assistant dock ─────────────────────────────────────── */
:root {
  --ion-ambient-width: 760px;
}

/* Ambient panel overlays content — no push */

/* Top-bar toggle button */
.ion-ambient-toggle-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  padding: 0;
  color: var(--ion-muted, #7a7a8a);
  border-radius: var(--ion-radius, 2px);
}
.ion-ambient-toggle-btn svg {
  width: 18px;
  height: 18px;
}
.ion-ambient-toggle-btn:hover,
body.ion-ambient-open .ion-ambient-toggle-btn {
  color: var(--ion-cyan, #00e5ff);
}
.ion-ambient-host {
  position: fixed;
  inset-inline-end: 0;
  top: 64px;
  bottom: 0;
  width: var(--ion-ambient-width);
  z-index: 900;
  pointer-events: auto;
  transition: width 120ms ease;
}
/* When collapsed, shrink to a small floating toggle on the middle-right
   edge instead of a full-height strip. Lower z-index below the info drawer
   (z-index: 150) so the drawer's close button is always reachable, and
   disable pointer events on the host itself so clicks fall through to
   whatever is behind — the shadow-DOM tab-toggle re-enables pointer events
   on itself so it remains clickable. */
.ion-ambient-host[data-collapsed="true"] {
  width: 32px;
  top: 50%;
  bottom: auto;
  height: 140px;
  transform: translateY(-50%);
  z-index: 140;
  pointer-events: none;
}
.ion-ambient-host[data-collapsed="true"] ion-ambient-assistant {
  pointer-events: auto;
}
.ion-ambient-host ion-ambient-assistant {
  display: block;
  height: 100%;
  width: 100%;
}

/* ==========================================================================
   CORPORATE & DATA-TOOL THEMES
   All themes below share the same class-based switching mechanism.
   Light-background themes each include the same set of hardcoded overrides
   that html.theme-light carries (link hover, dropdown glass, etc.)
   ========================================================================== */

/* ── Shared helper: apply to any light-background theme ──────────────────── */
/* Selector list is kept in sync whenever a new light-bg theme is added.     */
html.theme-corporate-light,
html.theme-prism,
html.theme-standard {
  color-scheme: light;
}

/* --------------------------------------------------------------------------
   1. CORPORATE LIGHT
   Conservative slate/blue palette. No neon, no glows.  System fonts.
   -------------------------------------------------------------------------- */
html.theme-corporate-light {
  --ion-cyan:          #1d4ed8;
  --ion-cyan-mid:      #2563eb;
  --ion-magenta:       #7c3aed;
  --ion-violet:        #5b21b6;
  --ion-violet-mid:    #6d28d9;
  --ion-cyan-rgb:      29, 78, 216;
  --ion-magenta-rgb:   124, 58, 237;

  --ion-success:       #15803d;
  --ion-warning:       #b45309;
  --ion-danger:        #b91c1c;
  --ion-info:          #1d4ed8;

  --ion-bg:            #f1f5f9;
  --ion-bg-darker:     #e2e8f0;
  --ion-bg-surface:    rgba(0, 0, 0, 0.04);
  --ion-bg-surface-2:  rgba(0, 0, 0, 0.07);
  --ion-bg-surface-3:  rgba(0, 0, 0, 0.10);

  --ion-text:          #0f172a;
  --ion-text-muted:    #475569;
  --ion-text-dim:      rgba(0, 0, 0, 0.38);
  --ion-text-faint:    rgba(0, 0, 0, 0.10);

  --ion-border:        rgba(0, 0, 0, 0.09);
  --ion-border-mid:    rgba(0, 0, 0, 0.16);
  --ion-border-focus:  rgba(29, 78, 216, 0.50);
  --ion-border-hover:  rgba(29, 78, 216, 0.28);

  --ion-gradient:      linear-gradient(135deg, #1d4ed8 0%, #5b21b6 50%, #7c3aed 100%);
  --ion-gradient-cm:   linear-gradient(135deg, #1d4ed8 0%, #7c3aed 100%);
  --ion-gradient-cw:   linear-gradient(135deg, #1d4ed8 0%, #6d28d9 100%);

  /* No neon glows in corporate context */
  --ion-glow-cyan:     none;
  --ion-glow-magenta:  none;
  --ion-glow-focus:    0 0 0 3px rgba(29, 78, 216, 0.18);

  --ion-font-display:  'Segoe UI', 'Inter', system-ui, -apple-system, sans-serif;
  --ion-font-body:     'Segoe UI', 'Inter', system-ui, -apple-system, sans-serif;
  --ion-font-mono:     ui-monospace, 'Cascadia Code', Consolas, 'SFMono-Regular', monospace;
  --ion-radius:        3px;
  --ion-radius-md:     5px;
  --ion-radius-lg:     8px;

  --ion-surface-3:     rgba(0, 0, 0, 0.05);
  --ion-surface-4:     rgba(0, 0, 0, 0.08);
  --ion-popup-bg:      rgba(248, 250, 252, 0.98);
  --ion-popup-sub-bg:  rgba(0, 0, 0, 0.04);
  --ion-popup-shadow:  0 8px 32px rgba(0, 0, 0, 0.12);
  --ion-popup-border:  rgba(0, 0, 0, 0.10);
  --ion-action-menu-bg:    rgba(248, 250, 252, 0.97);
  --ion-action-pending-bg: rgba(241, 245, 249, 0.95);

  --ion-top-bar-bg:        rgba(241, 245, 249, 0.97);
}
html.theme-corporate-light .ion-grid-bg::before {
  background-image:
    linear-gradient(rgba(var(--ion-cyan-rgb), 0.05) 1px, transparent 1px),
    linear-gradient(90deg, rgba(var(--ion-cyan-rgb), 0.05) 1px, transparent 1px);
}
html.theme-corporate-light a:hover          { color: var(--ion-cyan); }
html.theme-corporate-light ::-webkit-scrollbar-track       { background: var(--ion-bg-darker); }
html.theme-corporate-light ::-webkit-scrollbar-thumb       { background: rgba(0, 0, 0, 0.18); }
html.theme-corporate-light ::-webkit-scrollbar-thumb:hover { background: rgba(29, 78, 216, 0.40); }
html.theme-corporate-light .ion-glass { background: rgba(255,255,255,0.88); box-shadow: 0 0 0 1px rgba(29,78,216,0.08), 0 24px 64px rgba(0,0,0,0.10); }
html.theme-corporate-light .ion-panel { background: rgba(255,255,255,0.60); }
html.theme-corporate-light .ion-select { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='rgba(0,0,0,0.45)' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E"); }
html.theme-corporate-light .ion-select option { background: #f8fafc; color: #0f172a; }
html.theme-corporate-light .ion-modebar { background: rgba(241,245,249,0.94); border-color: rgba(0,0,0,0.10); box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
html.theme-corporate-light .ion-modebar-btn:hover        { background: rgba(0,0,0,0.07); }
html.theme-corporate-light .ion-modebar-flyout-btn:hover { background: rgba(0,0,0,0.07); }
html.theme-corporate-light .ion-info-panel { background: rgba(248,250,252,0.97); border-inline-start-color: rgba(0,0,0,0.10); }
html.theme-corporate-light .ion-app-tile { background: linear-gradient(135deg, rgba(29,78,216,0.07), rgba(124,58,237,0.07)); border-color: rgba(29,78,216,0.20); }
html.theme-corporate-light .ion-app-folder-tile { background: rgba(0,0,0,0.04); border-color: rgba(0,0,0,0.10); }

/* --------------------------------------------------------------------------
   2. CORPORATE DARK
   Deep navy / slate dark.  Professional, no neon.  System fonts.
   -------------------------------------------------------------------------- */
html.theme-corporate-dark {
  --ion-cyan:          #3b82f6;
  --ion-cyan-mid:      #60a5fa;
  --ion-magenta:       #8b5cf6;
  --ion-violet:        #7c3aed;
  --ion-violet-mid:    #a78bfa;
  --ion-cyan-rgb:      59, 130, 246;
  --ion-magenta-rgb:   139, 92, 246;

  --ion-success:       #22c55e;
  --ion-warning:       #f59e0b;
  --ion-danger:        #ef4444;
  --ion-info:          #3b82f6;

  --ion-bg:            #0f172a;
  --ion-bg-darker:     #0a0f1e;
  --ion-bg-surface:    rgba(255, 255, 255, 0.05);
  --ion-bg-surface-2:  rgba(255, 255, 255, 0.08);
  --ion-bg-surface-3:  rgba(255, 255, 255, 0.12);

  --ion-text:          #e2e8f0;
  --ion-text-muted:    #94a3b8;
  --ion-text-dim:      rgba(255, 255, 255, 0.30);
  --ion-text-faint:    rgba(255, 255, 255, 0.10);

  --ion-border:        rgba(255, 255, 255, 0.08);
  --ion-border-mid:    rgba(255, 255, 255, 0.14);
  --ion-border-focus:  rgba(59, 130, 246, 0.55);
  --ion-border-hover:  rgba(59, 130, 246, 0.30);

  --ion-gradient:      linear-gradient(135deg, #3b82f6 0%, #7c3aed 50%, #8b5cf6 100%);
  --ion-gradient-cm:   linear-gradient(135deg, #3b82f6 0%, #8b5cf6 100%);
  --ion-gradient-cw:   linear-gradient(135deg, #3b82f6 0%, #a78bfa 100%);

  --ion-glow-cyan:     0 0 18px rgba(59, 130, 246, 0.20);
  --ion-glow-magenta:  0 0 18px rgba(139, 92, 246, 0.20);
  --ion-glow-focus:    0 0 0 3px rgba(59, 130, 246, 0.20);

  --ion-font-display:  'Segoe UI', 'Inter', system-ui, -apple-system, sans-serif;
  --ion-font-body:     'Segoe UI', 'Inter', system-ui, -apple-system, sans-serif;
  --ion-font-mono:     ui-monospace, 'Cascadia Code', Consolas, 'SFMono-Regular', monospace;
  --ion-radius:        3px;
  --ion-radius-md:     5px;
}

/* --------------------------------------------------------------------------
   3. PRISM  (data-viz / dashboard style — clean white, blue + warm orange)
   Inspired by the Tableau colour language: crisp white canvas,
   informational blue, warm orange accent.
   -------------------------------------------------------------------------- */
html.theme-prism {
  --ion-cyan:          #1a6fc4;
  --ion-cyan-mid:      #2280d9;
  --ion-magenta:       #e8600a;
  --ion-violet:        #b54308;
  --ion-violet-mid:    #c94d0c;
  --ion-cyan-rgb:      26, 111, 196;
  --ion-magenta-rgb:   232, 96, 10;

  --ion-success:       #1a7a3f;
  --ion-warning:       #c47a15;
  --ion-danger:        #c0392b;
  --ion-info:          #1a6fc4;

  --ion-bg:            #ffffff;
  --ion-bg-darker:     #f4f6f9;
  --ion-bg-surface:    rgba(0, 0, 0, 0.03);
  --ion-bg-surface-2:  rgba(0, 0, 0, 0.06);
  --ion-bg-surface-3:  rgba(0, 0, 0, 0.09);

  --ion-text:          #1a1f2e;
  --ion-text-muted:    #4a5568;
  --ion-text-dim:      rgba(0, 0, 0, 0.38);
  --ion-text-faint:    rgba(0, 0, 0, 0.09);

  --ion-border:        rgba(0, 0, 0, 0.08);
  --ion-border-mid:    rgba(0, 0, 0, 0.14);
  --ion-border-focus:  rgba(26, 111, 196, 0.50);
  --ion-border-hover:  rgba(26, 111, 196, 0.28);

  --ion-gradient:      linear-gradient(135deg, #1a6fc4 0%, #a3370e 100%);
  --ion-gradient-cm:   linear-gradient(135deg, #1a6fc4 0%, #e8600a 100%);
  --ion-gradient-cw:   linear-gradient(135deg, #1a6fc4 0%, #c94d0c 100%);

  --ion-glow-cyan:     none;
  --ion-glow-magenta:  none;
  --ion-glow-focus:    0 0 0 3px rgba(26, 111, 196, 0.18);

  --ion-font-display:  'Inter', 'Segoe UI', system-ui, -apple-system, sans-serif;
  --ion-font-body:     'Inter', 'Segoe UI', system-ui, -apple-system, sans-serif;
  --ion-font-mono:     ui-monospace, 'Cascadia Code', Consolas, 'SFMono-Regular', monospace;
  --ion-radius:        4px;
  --ion-radius-md:     6px;
  --ion-radius-lg:     10px;

  --ion-surface-3:     rgba(0, 0, 0, 0.05);
  --ion-surface-4:     rgba(0, 0, 0, 0.08);
  --ion-popup-bg:      rgba(255, 255, 255, 0.99);
  --ion-popup-sub-bg:  rgba(0, 0, 0, 0.04);
  --ion-popup-shadow:  0 8px 28px rgba(0, 0, 0, 0.12);
  --ion-popup-border:  rgba(0, 0, 0, 0.09);
  --ion-action-menu-bg:    rgba(255, 255, 255, 0.98);
  --ion-action-pending-bg: rgba(244, 246, 249, 0.96);

  --ion-top-bar-bg:        rgba(244, 246, 249, 0.97);
}
html.theme-prism .ion-grid-bg::before {
  background-image:
    linear-gradient(rgba(var(--ion-cyan-rgb), 0.04) 1px, transparent 1px),
    linear-gradient(90deg, rgba(var(--ion-cyan-rgb), 0.04) 1px, transparent 1px);
}
html.theme-prism a:hover          { color: var(--ion-cyan); }
html.theme-prism ::-webkit-scrollbar-track       { background: var(--ion-bg-darker); }
html.theme-prism ::-webkit-scrollbar-thumb       { background: rgba(0, 0, 0, 0.16); }
html.theme-prism ::-webkit-scrollbar-thumb:hover { background: rgba(26, 111, 196, 0.38); }
html.theme-prism .ion-glass { background: rgba(255,255,255,0.90); box-shadow: 0 0 0 1px rgba(26,111,196,0.08), 0 24px 64px rgba(0,0,0,0.09); }
html.theme-prism .ion-panel { background: rgba(255,255,255,0.65); }
html.theme-prism .ion-select { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='rgba(0,0,0,0.45)' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E"); }
html.theme-prism .ion-select option { background: #fff; color: #1a1f2e; }
html.theme-prism .ion-modebar { background: rgba(244,246,249,0.95); border-color: rgba(0,0,0,0.09); box-shadow: 0 2px 12px rgba(0,0,0,0.07); }
html.theme-prism .ion-modebar-btn:hover        { background: rgba(0,0,0,0.06); }
html.theme-prism .ion-modebar-flyout-btn:hover { background: rgba(0,0,0,0.06); }
html.theme-prism .ion-info-panel { background: rgba(255,255,255,0.98); border-inline-start-color: rgba(0,0,0,0.09); }
html.theme-prism .ion-app-tile { background: linear-gradient(135deg, rgba(26,111,196,0.07), rgba(232,96,10,0.07)); border-color: rgba(26,111,196,0.20); }
html.theme-prism .ion-app-folder-tile { background: rgba(0,0,0,0.03); border-color: rgba(0,0,0,0.09); }

/* --------------------------------------------------------------------------
   4. ENTERPRISE  (BI / analytics platform style — dark navy, gold accent)
   Inspired by enterprise BI tools: authoritative navy canvas,
   golden-amber accent for KPIs, clean readable sans.
   -------------------------------------------------------------------------- */
html.theme-enterprise {
  --ion-cyan:          #f2c811;
  --ion-cyan-mid:      #f5d34a;
  --ion-magenta:       #3a96dd;
  --ion-violet:        #2475ba;
  --ion-violet-mid:    #4fa3e0;
  --ion-cyan-rgb:      242, 200, 17;
  --ion-magenta-rgb:   58, 150, 221;

  --ion-success:       #3cb371;
  --ion-warning:       #f2c811;
  --ion-danger:        #e05252;
  --ion-info:          #3a96dd;

  --ion-bg:            #1a2035;
  --ion-bg-darker:     #131729;
  --ion-bg-surface:    rgba(255, 255, 255, 0.05);
  --ion-bg-surface-2:  rgba(255, 255, 255, 0.08);
  --ion-bg-surface-3:  rgba(255, 255, 255, 0.12);

  --ion-text:          #dde3ee;
  --ion-text-muted:    #8a9ab5;
  --ion-text-dim:      rgba(255, 255, 255, 0.28);
  --ion-text-faint:    rgba(255, 255, 255, 0.09);

  --ion-border:        rgba(255, 255, 255, 0.08);
  --ion-border-mid:    rgba(255, 255, 255, 0.13);
  --ion-border-focus:  rgba(242, 200, 17, 0.55);
  --ion-border-hover:  rgba(242, 200, 17, 0.30);

  --ion-gradient:      linear-gradient(135deg, #f2c811 0%, #3a96dd 100%);
  --ion-gradient-cm:   linear-gradient(135deg, #f2c811 0%, #3a96dd 100%);
  --ion-gradient-cw:   linear-gradient(135deg, #f2c811 0%, #4fa3e0 100%);

  --ion-glow-cyan:     0 0 18px rgba(242, 200, 17, 0.18);
  --ion-glow-magenta:  0 0 18px rgba(58, 150, 221, 0.18);
  --ion-glow-focus:    0 0 0 3px rgba(242, 200, 17, 0.22);

  --ion-font-display:  'Segoe UI', 'Inter', system-ui, -apple-system, sans-serif;
  --ion-font-body:     'Segoe UI', 'Inter', system-ui, -apple-system, sans-serif;
  --ion-font-mono:     ui-monospace, 'Cascadia Code', Consolas, 'SFMono-Regular', monospace;
  --ion-radius:        3px;
  --ion-radius-md:     4px;
}

/* --------------------------------------------------------------------------
   5. STANDARD  (clean open-source / component-library style)
   Inspired by modern UI frameworks: pure white background,
   solid primary blue, generous border-radius, clear system typography.
   -------------------------------------------------------------------------- */
html.theme-standard {
  --ion-cyan:          #0d6efd;
  --ion-cyan-mid:      #3d8bfd;
  --ion-magenta:       #6f42c1;
  --ion-violet:        #5a32a3;
  --ion-violet-mid:    #7952b3;
  --ion-cyan-rgb:      13, 110, 253;
  --ion-magenta-rgb:   111, 66, 193;

  --ion-success:       #198754;
  --ion-warning:       #ffc107;
  --ion-danger:        #dc3545;
  --ion-info:          #0d6efd;

  --ion-bg:            #ffffff;
  --ion-bg-darker:     #f8f9fa;
  --ion-bg-surface:    rgba(0, 0, 0, 0.04);
  --ion-bg-surface-2:  rgba(0, 0, 0, 0.06);
  --ion-bg-surface-3:  rgba(0, 0, 0, 0.09);

  --ion-text:          #212529;
  --ion-text-muted:    #6c757d;
  --ion-text-dim:      rgba(0, 0, 0, 0.38);
  --ion-text-faint:    rgba(0, 0, 0, 0.09);

  --ion-border:        rgba(0, 0, 0, 0.10);
  --ion-border-mid:    rgba(0, 0, 0, 0.18);
  --ion-border-focus:  rgba(13, 110, 253, 0.50);
  --ion-border-hover:  rgba(13, 110, 253, 0.28);

  --ion-gradient:      linear-gradient(135deg, #0d6efd 0%, #5a32a3 50%, #6f42c1 100%);
  --ion-gradient-cm:   linear-gradient(135deg, #0d6efd 0%, #6f42c1 100%);
  --ion-gradient-cw:   linear-gradient(135deg, #0d6efd 0%, #7952b3 100%);

  --ion-glow-cyan:     none;
  --ion-glow-magenta:  none;
  --ion-glow-focus:    0 0 0 0.25rem rgba(13, 110, 253, 0.25);

  --ion-font-display:  'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --ion-font-body:     'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --ion-font-mono:     'SFMono-Regular', Menlo, Monaco, Consolas, 'Courier New', monospace;
  --ion-radius:        6px;
  --ion-radius-md:     8px;
  --ion-radius-lg:     12px;

  --ion-surface-3:     rgba(0, 0, 0, 0.05);
  --ion-surface-4:     rgba(0, 0, 0, 0.08);
  --ion-popup-bg:      rgba(255, 255, 255, 0.99);
  --ion-popup-sub-bg:  rgba(0, 0, 0, 0.04);
  --ion-popup-shadow:  0 0.5rem 1rem rgba(0, 0, 0, 0.15);
  --ion-popup-border:  rgba(0, 0, 0, 0.12);
  --ion-action-menu-bg:    rgba(255, 255, 255, 0.99);
  --ion-action-pending-bg: rgba(248, 249, 250, 0.97);

  --ion-top-bar-bg:        rgba(248, 249, 250, 0.97);
}
html.theme-standard .ion-grid-bg::before {
  background-image:
    linear-gradient(rgba(var(--ion-cyan-rgb), 0.04) 1px, transparent 1px),
    linear-gradient(90deg, rgba(var(--ion-cyan-rgb), 0.04) 1px, transparent 1px);
}
html.theme-standard a:hover          { color: var(--ion-cyan); }
html.theme-standard ::-webkit-scrollbar-track       { background: var(--ion-bg-darker); }
html.theme-standard ::-webkit-scrollbar-thumb       { background: rgba(0, 0, 0, 0.18); }
html.theme-standard ::-webkit-scrollbar-thumb:hover { background: rgba(13, 110, 253, 0.40); }
html.theme-standard .ion-glass { background: rgba(255,255,255,0.92); box-shadow: 0 0 0 1px rgba(0,0,0,0.09), 0 1rem 3rem rgba(0,0,0,0.10); }
html.theme-standard .ion-panel { background: rgba(255,255,255,0.65); }
html.theme-standard .ion-select { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='rgba(0,0,0,0.45)' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E"); }
html.theme-standard .ion-select option { background: #fff; color: #212529; }
html.theme-standard .ion-modebar { background: rgba(248,249,250,0.96); border-color: rgba(0,0,0,0.10); box-shadow: 0 2px 8px rgba(0,0,0,0.08); }
html.theme-standard .ion-modebar-btn:hover        { background: rgba(0,0,0,0.06); }
html.theme-standard .ion-modebar-flyout-btn:hover { background: rgba(0,0,0,0.06); }
html.theme-standard .ion-info-panel { background: rgba(255,255,255,0.98); border-inline-start-color: rgba(0,0,0,0.10); }
html.theme-standard .ion-app-tile { background: linear-gradient(135deg, rgba(13,110,253,0.07), rgba(111,66,193,0.07)); border-color: rgba(13,110,253,0.20); }
html.theme-standard .ion-app-folder-tile { background: rgba(0,0,0,0.04); border-color: rgba(0,0,0,0.10); }

/* ════════════════════════════════════════════════════════════════════════
   Subtable explorer (.ion-subt) + archive browser (.ion-arc)
   Main-document tab content rendered by content_routes::render_subtable_explorer
   and render_archive_browser. Tables are plain HTML (not the shadow-DOM
   datafileviewer), so they are styled here, scoped under their container.
   ════════════════════════════════════════════════════════════════════════ */
.ion-subt { display: flex; flex-direction: column; min-height: 0; }
.ion-subt-tabs { display: flex; gap: 0.25rem; flex-wrap: wrap; padding: 0.5rem 0.5rem 0; border-block-end: 1px solid var(--ion-border, #222); }
.ion-subt-tab { background: transparent; color: var(--ion-text-muted, #8a8a9a); border: 1px solid transparent; border-block-end: none; padding: 0.35rem 0.8rem; cursor: pointer; font-family: var(--ion-font-mono, 'Space Mono', monospace); font-size: 0.85rem; border-radius: 6px 6px 0 0; }
.ion-subt-tab:hover { color: var(--ion-cyan, #00e5ff); }
.ion-subt-tab--active { color: var(--ion-bg, #0a0a0f); background: var(--ion-cyan, #00e5ff); }
.ion-subt-panes { overflow: auto; flex: 1 1 auto; min-height: 0; padding: 0.5rem; }
.ion-subt .ion-dfv-meta { color: var(--ion-text-muted, #8a8a9a); font-family: var(--ion-font-mono, 'Space Mono', monospace); font-size: 0.8rem; margin: 0 0 0.4rem; }
.ion-subt table, .ion-arc table { border-collapse: collapse; width: 100%; font-size: 0.85rem; }
.ion-subt th, .ion-subt td, .ion-arc th, .ion-arc td { border: 1px solid var(--ion-border, #222); padding: 0.25rem 0.5rem; text-align: start; white-space: nowrap; }
.ion-subt th { position: sticky; inset-block-start: 0; background: var(--ion-surface, #14141c); color: var(--ion-cyan, #00e5ff); }
.ion-subt .ion-dfv-error { color: var(--ion-magenta, #bf00ff); }
.ion-arc { padding: 0.75rem; overflow: auto; }
.ion-arc-list { list-style: none; margin: 0; padding: 0; }
.ion-arc-row { padding: 0.15rem 0; }
.ion-arc-row a { color: var(--ion-cyan, #00e5ff); text-decoration: none; font-family: var(--ion-font-mono, 'Space Mono', monospace); font-size: 0.85rem; }
.ion-arc-row a:hover { text-decoration: underline; }

/* ==========================================================================
   Data Room — info-drawer management section + create/purge modals
   (plan ion/plans/dataroom-ui-integration.md). The drawer classes
   (ion-dr-info, ion-dr-roster, ion-dr-guest*) render the type-aware
   management block in the file info drawer; the form/warn classes are
   shared with the shell-side create/purge modals injected by ion.js.
   ========================================================================== */

/* Info-drawer data-room management section */
.ion-dr-info { margin-top: var(--ion-sp-4, 10px); }
.ion-info-section {
  border-top: 1px solid var(--ion-border);
  padding-top: var(--ion-sp-4, 10px);
  margin-top: var(--ion-sp-4, 10px);
}
.ion-info-section-title {
  font-family: var(--ion-font-display, 'Syne', sans-serif);
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--ion-magenta, #bf00ff);
  margin-bottom: 6px;
}
.ion-dr-roster { display: flex; flex-direction: column; gap: 4px; margin: 8px 0; }
.ion-dr-guest { display: flex; align-items: center; gap: 8px; font-size: 12px; }
.ion-dr-guest-name { font-weight: 600; }
.ion-dr-guest-modes {
  color: var(--ion-text-muted, #888);
  font-family: var(--ion-font-mono, 'Space Mono', monospace);
  flex: 1;
}
.ion-dr-empty { font-size: 12px; margin: 8px 0; }

/* Lifecycle badge */
.ion-dr-badge {
  display: inline-block;
  font-family: var(--ion-font-mono, 'Space Mono', monospace);
  font-size: 10px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  padding: 2px 8px;
  border-radius: 3px;
}
.ion-dr-badge--open    { background: rgba(0, 255, 136, 0.14); color: #00ff88; }
.ion-dr-badge--pending { background: rgba(255, 170, 0, 0.14);  color: #ffaa00; }
.ion-dr-badge--closed  { background: rgba(255, 56, 96, 0.14);  color: var(--ion-danger, #ff3860); }

/* Invite form (info-drawer management section) */
.ion-dr-invite {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-top: var(--ion-sp-4, 10px);
  padding-top: var(--ion-sp-4, 10px);
  border-top: 1px solid var(--ion-border);
}
.ion-dr-modes { display: flex; flex-wrap: wrap; gap: 12px; font-size: 12px; }
.ion-dr-modes label { display: inline-flex; align-items: center; gap: 4px; }

/* Create / purge modal forms (shared with ion.js-injected modals) */
.ion-dr-form { display: flex; flex-direction: column; gap: 12px; }
.ion-dr-field { display: flex; flex-direction: column; gap: 4px; }
.ion-dr-field > span { font-size: 11px; color: var(--ion-text-muted, #888); }
.ion-dr-field-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.ion-dr-check { display: flex; align-items: center; gap: 8px; font-size: 13px; }

/* NDA acceptance gate — rendered in place of content for a gated required room
   (server-rendered by render_nda_gate_pane; lives in the main document DOM). */
.ion-nda-gate { max-width: 760px; margin: 0 auto; padding: 32px 24px; display: flex; flex-direction: column; gap: 20px; }
.ion-nda-gate-head { display: flex; align-items: flex-start; gap: 16px; }
.ion-nda-gate-icon { font-size: 28px; line-height: 1; }
.ion-nda-gate h2 { margin: 0 0 4px; }
.ion-nda-gate-doc { border: 1px solid var(--ion-border, #2a2a35); border-radius: var(--ion-radius, 8px); overflow: hidden; }
.ion-nda-gate-doc-title { padding: 10px 14px; background: var(--ion-surface, #14141c); border-bottom: 1px solid var(--ion-border, #2a2a35); font-size: 12px; }
.ion-nda-gate-doc ion-rich-text { display: block; padding: 16px; max-height: 50vh; overflow: auto; }
.ion-nda-gate-actions { display: flex; justify-content: flex-end; }
.ion-nda-gate--notice { align-items: center; text-align: center; }
.ion-nda-gate-plain { margin: 0; padding: 16px; max-height: 50vh; overflow: auto; white-space: pre-wrap; font-family: var(--ion-font-body, sans-serif); font-size: 14px; line-height: 1.5; }
.ion-dr-warn {
  background: rgba(255, 56, 96, 0.08);
  border: 1px solid rgba(255, 56, 96, 0.25);
  border-radius: 4px;
  padding: 8px 10px;
  font-size: 12px;
  color: var(--ion-danger, #ff3860);
}
.ion-dr-warn-target { font-family: var(--ion-font-mono, 'Space Mono', monospace); font-size: 12px; margin: 6px 0; }
