/* ============================================================
   Orbit UI — component library (plain CSS)
   Light theme is the default. Add data-theme="dark" on any
   ancestor (e.g. <html data-theme="dark">) for the muted dark.
   All classes are namespaced with .ob- to avoid collisions.
   ============================================================ */

@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Manrope:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap');

/* ---------- Design tokens : LIGHT (default) ---------- */
:root {
  --ob-bg:#f5f7fb; --ob-surface:#ffffff; --ob-surface-2:#f1f5f9; --ob-surface-3:#e8eef6;
  --ob-border:#e6ebf2; --ob-border-strong:#cdd6e3;
  --ob-text:#0f1b2d; --ob-text-2:#52617a; --ob-text-3:#98a4b8;
  --ob-accent:#0e8aa3; --ob-accent-2:#0e7490; --ob-accent-hover:#0b7184; --ob-accent-soft:#e7f6f9; --ob-accent-ring:rgba(14,138,163,.22); --ob-on-accent:#ffffff;
  --ob-success:#2f9e6f; --ob-success-soft:#e9f7f0; --ob-warn:#c0820f; --ob-warn-soft:#fbf3e3; --ob-danger:#d05661; --ob-danger-soft:#fbecee; --ob-info:#3b6fb0; --ob-info-soft:#eaf1fa;
  --ob-shadow-sm:0 1px 2px rgba(15,23,42,.06),0 1px 1px rgba(15,23,42,.04);
  --ob-shadow-md:0 6px 18px rgba(15,23,42,.09),0 2px 5px rgba(15,23,42,.05);
  --ob-shadow-lg:0 20px 44px rgba(15,23,42,.13),0 6px 12px rgba(15,23,42,.07);
  --ob-c1:#0e8aa3; --ob-c2:#7a76ad; --ob-c3:#2f9e6f; --ob-c4:#c0820f; --ob-c5:#d05661;
  --ob-track:#e6ebf2; --ob-hairline:rgba(15,23,42,.05);
  /* radii */
  --ob-r-sm:6px; --ob-r-md:10px; --ob-r-lg:16px; --ob-r-pill:999px;
  /* fonts */
  --ob-font-display:'Space Grotesk',-apple-system,BlinkMacSystemFont,sans-serif;
  --ob-font-sans:'Manrope',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
  --ob-font-mono:'JetBrains Mono',ui-monospace,'SFMono-Regular',monospace;
}

/* ---------- Design tokens : DARK (muted) ---------- */
[data-theme="dark"] {
  --ob-bg:#141619; --ob-surface:#1b1d22; --ob-surface-2:#23262d; --ob-surface-3:#2d313a;
  --ob-border:#2a2e36; --ob-border-strong:#3b404a;
  --ob-text:#e7e9ec; --ob-text-2:#9aa1ac; --ob-text-3:#6a717c;
  --ob-accent:#5ba3b0; --ob-accent-2:#6f93b4; --ob-accent-hover:#6fb6c2; --ob-accent-soft:rgba(91,163,176,.12); --ob-accent-ring:rgba(91,163,176,.26); --ob-on-accent:#0c1418;
  --ob-success:#5fa882; --ob-success-soft:rgba(95,168,130,.13); --ob-warn:#cda35f; --ob-warn-soft:rgba(205,163,95,.13); --ob-danger:#cc7d85; --ob-danger-soft:rgba(204,125,133,.13); --ob-info:#7a9cc4; --ob-info-soft:rgba(122,156,196,.13);
  --ob-shadow-sm:0 1px 2px rgba(0,0,0,.3);
  --ob-shadow-md:0 6px 18px rgba(0,0,0,.34);
  --ob-shadow-lg:0 18px 42px rgba(0,0,0,.42);
  --ob-c1:#5ba3b0; --ob-c2:#8b86b8; --ob-c3:#5fa882; --ob-c4:#cda35f; --ob-c5:#cc7d85;
  --ob-track:#262a32; --ob-hairline:rgba(255,255,255,.045);
}

/* ---------- Optional page wrapper ---------- */
.orbit { font-family:var(--ob-font-sans); color:var(--ob-text); -webkit-font-smoothing:antialiased; }

/* shared box-sizing only for orbit components, to stay non-invasive */
[class^="ob-"], [class*=" ob-"], [class^="ob-"] *, [class*=" ob-"] * { box-sizing:border-box; }

/* ===========================================================
   KEYFRAMES
   =========================================================== */
@keyframes ob-spin { to { transform:rotate(360deg); } }
@keyframes ob-pulse { 0%,100%{opacity:1} 50%{opacity:.4} }
@keyframes ob-toast-in { from{transform:translateY(14px);opacity:0} to{transform:translateY(0);opacity:1} }
@keyframes ob-pop { from{transform:scale(.96) translateY(8px);opacity:0} to{transform:scale(1) translateY(0);opacity:1} }
@keyframes ob-fade { from{opacity:0} to{opacity:1} }

/* ===========================================================
   BUTTONS  —  .ob-btn
   =========================================================== */
.ob-btn{
  display:inline-flex; align-items:center; justify-content:center; gap:8px;
  font-family:var(--ob-font-sans); font-size:14px; font-weight:600; line-height:1;
  padding:11px 18px; border-radius:var(--ob-r-md); border:1px solid transparent;
  background:var(--ob-accent); color:var(--ob-on-accent);
  cursor:pointer; text-decoration:none; white-space:nowrap; user-select:none;
  transition:background .15s, border-color .15s, color .15s, box-shadow .15s, opacity .15s;
}
.ob-btn:hover{ background:var(--ob-accent-hover); }
.ob-btn:focus-visible{ outline:none; box-shadow:0 0 0 3px var(--ob-accent-ring); }
.ob-btn svg{ width:16px; height:16px; }

.ob-btn--secondary{ background:var(--ob-surface-2); color:var(--ob-text); border-color:var(--ob-border); }
.ob-btn--secondary:hover{ background:var(--ob-surface-3); border-color:var(--ob-border-strong); }
.ob-btn--outline{ background:transparent; color:var(--ob-text); border:1.5px solid var(--ob-border-strong); padding:10px 18px; }
.ob-btn--outline:hover{ border-color:var(--ob-accent); color:var(--ob-accent); background:transparent; }
.ob-btn--ghost{ background:transparent; color:var(--ob-text-2); }
.ob-btn--ghost:hover{ background:var(--ob-surface-2); color:var(--ob-text); }
.ob-btn--danger{ background:var(--ob-danger-soft); color:var(--ob-danger); }
.ob-btn--danger:hover{ background:var(--ob-danger); color:#fff; }

.ob-btn--sm{ font-size:12.5px; padding:7px 13px; border-radius:var(--ob-r-sm); }
.ob-btn--lg{ font-size:16px; padding:14px 24px; border-radius:12px; }
.ob-btn--icon{ padding:0; width:40px; height:40px; }
.ob-btn--icon.ob-btn--sm{ width:32px; height:32px; }
.ob-btn--block{ width:100%; }
.ob-btn:disabled,.ob-btn[disabled],.ob-btn.is-disabled{
  background:var(--ob-surface-2); color:var(--ob-text-3); border-color:var(--ob-border);
  cursor:not-allowed; pointer-events:none;
}
.ob-btn .ob-spin{ animation:ob-spin .8s linear infinite; }

/* ===========================================================
   FORM CONTROLS
   =========================================================== */
.ob-field{ display:flex; flex-direction:column; gap:7px; font-family:var(--ob-font-sans); }
.ob-label{ font-size:13px; font-weight:600; color:var(--ob-text); }
.ob-label--danger{ color:var(--ob-danger); }

.ob-input,.ob-textarea,.ob-select{
  width:100%; font-family:var(--ob-font-sans); font-size:14px; color:var(--ob-text);
  padding:11px 14px; border-radius:var(--ob-r-md);
  border:1px solid var(--ob-border-strong); background:var(--ob-surface-2);
  outline:none; transition:border-color .15s, box-shadow .15s, background .15s;
}
.ob-input::placeholder,.ob-textarea::placeholder{ color:var(--ob-text-3); }
.ob-input:focus,.ob-textarea:focus,.ob-select:focus{
  border-color:var(--ob-accent); box-shadow:0 0 0 3px var(--ob-accent-ring); background:var(--ob-surface);
}
.ob-textarea{ resize:vertical; min-height:84px; line-height:1.5; }
.ob-input--error{ border-color:var(--ob-danger); background:var(--ob-danger-soft); }
.ob-hint{ font-size:12px; color:var(--ob-text-2); display:flex; align-items:center; gap:5px; }
.ob-hint--error{ color:var(--ob-danger); }
.ob-hint svg{ width:13px; height:13px; }

/* input with leading icon */
.ob-input-group{ position:relative; }
.ob-input-group > svg{ position:absolute; left:13px; top:50%; transform:translateY(-50%); width:17px; height:17px; color:var(--ob-text-3); pointer-events:none; }
.ob-input-group .ob-input{ padding-left:40px; }

/* Select con chevron custom disegnato sul WRAPPER (.ob-select-wrap), NON come
   background-image della select. Motivo: su Chromium/Windows un background-image
   sulla select viene ereditato dagli <option> quando il menu è aperto (freccia
   ripetuta su ogni riga) e il reset sull'option viene ignorato dal browser.
   Mettendo il chevron su un contenitore, l'immagine non tocca mai gli <option>.
   Il wrapping è fatto a runtime da static/js/ob-select.js.
   La select nasconde la freccia nativa e non ha alcun background-image (incluso
   quello di .form-select di Bootstrap, presente sulle stesse select dei filtri). */
.ob-select{
  appearance:none !important; -webkit-appearance:none !important;
  cursor:pointer; padding-right:40px;
  background-image:none !important;
}
.ob-select-wrap{ position:relative; display:block; width:100%; }
.ob-select-wrap::after{
  content:""; position:absolute; right:13px; top:50%; margin-top:-8px;
  width:16px; height:16px; pointer-events:none;
  background:no-repeat center/contain;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2352617a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
}
[data-theme="dark"] .ob-select-wrap::after{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%239aa1ac' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
}
/* .form-select non-ob (es. menu "Mostra N" di DataTables): freccia nativa,
   senza background-image, così non ha lo stesso bug degli <option>. */
.form-select:not(.ob-select){
  appearance:auto !important; -webkit-appearance:auto !important;
  background-image:none !important;
}

/* checkbox & radio (style native inputs) */
.ob-check,.ob-radio{
  display:flex; align-items:center; gap:11px; cursor:pointer;
  font-family:var(--ob-font-sans); font-size:14px; font-weight:500; color:var(--ob-text);
}
.ob-check input,.ob-radio input{
  appearance:none; -webkit-appearance:none; margin:0; flex-shrink:0;
  width:20px; height:20px; border:2px solid var(--ob-border-strong); background:transparent;
  cursor:pointer; position:relative; transition:background .15s, border-color .15s;
}
.ob-check input{ border-radius:6px; }
.ob-radio input{ border-radius:50%; }
.ob-check input:checked,.ob-radio input:checked{ background:var(--ob-accent); border-color:var(--ob-accent); }
.ob-check input:checked::after{
  content:""; position:absolute; left:6px; top:2.5px; width:5px; height:9px;
  border:solid var(--ob-on-accent); border-width:0 2.4px 2.4px 0; transform:rotate(45deg);
}
.ob-radio input:checked::after{
  content:""; position:absolute; inset:0; margin:auto; width:8px; height:8px; border-radius:50%; background:var(--ob-on-accent);
}
.ob-check input:focus-visible,.ob-radio input:focus-visible{ outline:none; box-shadow:0 0 0 3px var(--ob-accent-ring); }

/* radio card (option with title + description) */
.ob-radio-card{
  display:flex; gap:12px; align-items:flex-start; cursor:pointer;
  padding:11px 14px; border-radius:12px; border:1px solid var(--ob-border);
  transition:border-color .15s, background .15s;
}
.ob-radio-card:has(input:checked){ border-color:var(--ob-accent); background:var(--ob-accent-soft); }
.ob-radio-card input{
  appearance:none;-webkit-appearance:none;margin:1px 0 0;flex-shrink:0;width:18px;height:18px;border-radius:50%;
  border:2px solid var(--ob-border-strong); position:relative; cursor:pointer; transition:border-color .15s;
}
.ob-radio-card input:checked{ border-color:var(--ob-accent); }
.ob-radio-card input:checked::after{ content:"";position:absolute;inset:0;margin:auto;width:8px;height:8px;border-radius:50%;background:var(--ob-accent); }
.ob-radio-card__title{ display:block; font-size:14px; font-weight:600; color:var(--ob-text); }
.ob-radio-card__desc{ display:block; font-size:12.5px; color:var(--ob-text-2); margin-top:2px; }

/* switch */
.ob-switch{ position:relative; display:inline-flex; flex-shrink:0; width:46px; height:26px; cursor:pointer; }
.ob-switch input{ appearance:none;-webkit-appearance:none; margin:0; position:absolute; inset:0; width:100%; height:100%; border-radius:var(--ob-r-pill); background:var(--ob-border-strong); cursor:pointer; transition:background .2s; }
.ob-switch input:checked{ background:var(--ob-accent); }
.ob-switch input:focus-visible{ outline:none; box-shadow:0 0 0 3px var(--ob-accent-ring); }
.ob-switch::after{
  content:""; position:absolute; top:3px; left:3px; width:20px; height:20px; border-radius:50%;
  background:#fff; box-shadow:0 1px 3px rgba(0,0,0,.35); pointer-events:none;
  transition:transform .2s cubic-bezier(.2,.8,.2,1);
}
.ob-switch:has(input:checked)::after{ transform:translateX(20px); }

/* range slider */
.ob-range{ width:100%; accent-color:var(--ob-accent); cursor:pointer; height:24px; }

/* ===========================================================
   BADGES · TAGS · CHIPS · AVATARS
   =========================================================== */
.ob-badge{
  display:inline-flex; align-items:center; gap:6px; font-family:var(--ob-font-sans);
  font-size:12.5px; font-weight:600; padding:5px 11px; border-radius:var(--ob-r-pill);
  background:var(--ob-surface-2); color:var(--ob-text-2);
}
.ob-badge .ob-badge__dot{ width:6px; height:6px; border-radius:50%; background:currentColor; }
.ob-badge--success{ background:var(--ob-success-soft); color:var(--ob-success); }
.ob-badge--warn{ background:var(--ob-warn-soft); color:var(--ob-warn); }
.ob-badge--danger{ background:var(--ob-danger-soft); color:var(--ob-danger); }
.ob-badge--info{ background:var(--ob-info-soft); color:var(--ob-info); }

.ob-tag{ display:inline-flex; align-items:center; font-family:var(--ob-font-mono); font-size:12px; font-weight:600; padding:4px 10px; border-radius:7px; background:var(--ob-surface-2); color:var(--ob-text-2); }
.ob-tag--accent{ background:var(--ob-accent-soft); color:var(--ob-accent); }
.ob-tag--solid{ background:var(--ob-c2); color:#fff; font-family:var(--ob-font-sans); font-weight:700; }

.ob-chip{ display:inline-flex; align-items:center; gap:7px; font-family:var(--ob-font-sans); font-size:13px; font-weight:600; color:var(--ob-text); padding:5px 7px 5px 12px; border-radius:var(--ob-r-pill); background:var(--ob-surface-2); border:1px solid var(--ob-border); }
.ob-chip__x{ display:inline-flex; align-items:center; justify-content:center; width:18px; height:18px; border:none; border-radius:50%; background:var(--ob-surface-3); color:var(--ob-text-2); cursor:pointer; padding:0; transition:background .15s,color .15s; }
.ob-chip__x:hover{ background:var(--ob-danger); color:#fff; }
.ob-chip__x svg{ width:11px; height:11px; }

.ob-count{ display:inline-flex; align-items:center; justify-content:center; min-width:22px; height:22px; padding:0 7px; border-radius:var(--ob-r-pill); background:var(--ob-danger); color:#fff; font-family:var(--ob-font-sans); font-size:12px; font-weight:700; }

.ob-avatar{ display:inline-grid; place-items:center; width:40px; height:40px; border-radius:50%; background:var(--ob-surface-3); color:var(--ob-text); font-family:var(--ob-font-sans); font-weight:700; font-size:14px; overflow:hidden; }
.ob-avatar img{ width:100%; height:100%; object-fit:cover; }
.ob-avatar--gradient{ background:linear-gradient(135deg,var(--ob-accent),var(--ob-c2)); color:#fff; }
.ob-avatar--lg{ width:54px; height:54px; font-size:18px; font-family:var(--ob-font-display); }
.ob-avatar--sm{ width:34px; height:34px; font-size:12px; }
.ob-avatar-wrap{ position:relative; display:inline-block; }
.ob-avatar-status{ position:absolute; bottom:1px; right:1px; width:13px; height:13px; border-radius:50%; background:var(--ob-success); border:2.5px solid var(--ob-surface); }
.ob-avatar-group{ display:inline-flex; }
.ob-avatar-group .ob-avatar{ border:2.5px solid var(--ob-surface); }
.ob-avatar-group .ob-avatar + .ob-avatar{ margin-left:-12px; }

/* ===========================================================
   CARDS
   =========================================================== */
.ob-card{ background:var(--ob-surface); border:1px solid var(--ob-border); border-radius:18px; box-shadow:var(--ob-shadow-sm); font-family:var(--ob-font-sans); color:var(--ob-text); overflow:hidden; }
.ob-card__body{ padding:24px; }
.ob-card__media{ height:120px; background:linear-gradient(135deg,var(--ob-accent),var(--ob-c2)); display:grid; place-items:center; }
.ob-card__title{ font-size:15.5px; font-weight:700; }
.ob-card__text{ font-size:13px; color:var(--ob-text-2); margin-top:5px; line-height:1.5; }
.ob-card-header{ display:flex; align-items:center; justify-content:space-between; padding:18px 22px; border-bottom:1px solid var(--ob-border); }

/* ===========================================================
   NAVIGATION
   =========================================================== */
/* tabs — CSS-only via radio inputs */
.ob-tabs{ font-family:var(--ob-font-sans); }
.ob-tabs > input{ position:absolute; opacity:0; pointer-events:none; }
.ob-tabs__bar{ display:inline-flex; gap:4px; padding:4px; background:var(--ob-surface-2); border-radius:12px; }
.ob-tabs__bar label{ padding:8px 18px; border-radius:9px; font-size:14px; font-weight:600; color:var(--ob-text-2); cursor:pointer; transition:color .15s, background .15s, box-shadow .15s; }
.ob-tabs__bar label:hover{ color:var(--ob-text); }
.ob-tabs__panels{ margin-top:18px; }
.ob-tabs__panel{ display:none; font-size:14px; line-height:1.6; color:var(--ob-text-2); animation:ob-fade .2s ease; }
/* up to 5 tabs */
.ob-tabs > input:nth-of-type(1):checked ~ .ob-tabs__bar label:nth-child(1),
.ob-tabs > input:nth-of-type(2):checked ~ .ob-tabs__bar label:nth-child(2),
.ob-tabs > input:nth-of-type(3):checked ~ .ob-tabs__bar label:nth-child(3),
.ob-tabs > input:nth-of-type(4):checked ~ .ob-tabs__bar label:nth-child(4),
.ob-tabs > input:nth-of-type(5):checked ~ .ob-tabs__bar label:nth-child(5){
  color:var(--ob-text); background:var(--ob-surface); box-shadow:var(--ob-shadow-sm);
}
.ob-tabs > input:nth-of-type(1):checked ~ .ob-tabs__panels .ob-tabs__panel:nth-child(1),
.ob-tabs > input:nth-of-type(2):checked ~ .ob-tabs__panels .ob-tabs__panel:nth-child(2),
.ob-tabs > input:nth-of-type(3):checked ~ .ob-tabs__panels .ob-tabs__panel:nth-child(3),
.ob-tabs > input:nth-of-type(4):checked ~ .ob-tabs__panels .ob-tabs__panel:nth-child(4),
.ob-tabs > input:nth-of-type(5):checked ~ .ob-tabs__panels .ob-tabs__panel:nth-child(5){ display:block; }

/* segmented control — CSS-only via radio inputs */
.ob-segmented{ display:inline-flex; border:1px solid var(--ob-border-strong); border-radius:var(--ob-r-md); overflow:hidden; font-family:var(--ob-font-sans); }
.ob-segmented input{ position:absolute; opacity:0; pointer-events:none; }
.ob-segmented label{ padding:8px 20px; font-size:14px; font-weight:600; color:var(--ob-text-2); background:var(--ob-surface); cursor:pointer; transition:background .15s, color .15s; }
.ob-segmented label + label{ border-left:1px solid var(--ob-border); }
.ob-segmented input:checked + label{ background:var(--ob-accent); color:var(--ob-on-accent); }

/* breadcrumb */
.ob-breadcrumb{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; font-family:var(--ob-font-sans); font-size:13.5px; }
.ob-breadcrumb a{ color:var(--ob-text-2); text-decoration:none; font-weight:500; transition:color .15s; }
.ob-breadcrumb a:hover{ color:var(--ob-accent); }
.ob-breadcrumb__sep{ color:var(--ob-text-3); }
.ob-breadcrumb__current{ color:var(--ob-text); font-weight:600; }

/* pagination */
.ob-pagination{ display:inline-flex; gap:6px; font-family:var(--ob-font-sans); }
.ob-page{ display:inline-grid; place-items:center; min-width:34px; height:34px; padding:0 6px; border-radius:9px; border:1px solid var(--ob-border); background:var(--ob-surface-2); color:var(--ob-text); font-size:14px; font-weight:600; cursor:pointer; transition:border-color .15s, background .15s; }
.ob-page:hover{ border-color:var(--ob-border-strong); }
.ob-page svg{ width:15px; height:15px; }
.ob-page.is-active{ background:var(--ob-accent); color:var(--ob-on-accent); border-color:transparent; }

/* ===========================================================
   FEEDBACK
   =========================================================== */
.ob-alert{ display:flex; gap:13px; align-items:flex-start; padding:15px 17px; border-radius:14px; font-family:var(--ob-font-sans); background:var(--ob-surface-2); border:1px solid var(--ob-border); }
.ob-alert svg{ width:19px; height:19px; flex-shrink:0; margin-top:1px; }
.ob-alert__title{ font-weight:700; font-size:14px; color:var(--ob-text); }
.ob-alert__text{ font-size:13px; color:var(--ob-text-2); margin-top:2px; line-height:1.5; }
.ob-alert--info{ background:var(--ob-info-soft); border-color:color-mix(in srgb,var(--ob-info) 28%,transparent); }
.ob-alert--info svg{ color:var(--ob-info); }
.ob-alert--success{ background:var(--ob-success-soft); border-color:color-mix(in srgb,var(--ob-success) 28%,transparent); }
.ob-alert--success svg{ color:var(--ob-success); }
.ob-alert--danger{ background:var(--ob-danger-soft); border-color:color-mix(in srgb,var(--ob-danger) 28%,transparent); }
.ob-alert--danger svg{ color:var(--ob-danger); }

/* progress bar */
.ob-progress{ height:8px; background:var(--ob-track); border-radius:var(--ob-r-pill); overflow:hidden; }
.ob-progress__bar{ height:100%; background:var(--ob-accent); border-radius:var(--ob-r-pill); transition:width .3s ease; }

/* spinner */
.ob-spinner{ width:28px; height:28px; color:var(--ob-accent); animation:ob-spin .8s linear infinite; }
.ob-spinner svg{ width:100%; height:100%; }

/* skeleton */
.ob-skeleton{ height:12px; border-radius:6px; background:var(--ob-surface-2); animation:ob-pulse 1.5s ease-in-out infinite; }

/* tooltip — pure CSS via [data-ob-tip] */
.ob-tip{ position:relative; display:inline-flex; }
.ob-tip::after{
  content:attr(data-ob-tip); position:absolute; bottom:calc(100% + 9px); left:50%; transform:translateX(-50%) translateY(4px);
  background:var(--ob-text); color:var(--ob-bg); padding:6px 11px; border-radius:8px;
  font-family:var(--ob-font-sans); font-size:12px; font-weight:600; white-space:nowrap; box-shadow:var(--ob-shadow-md);
  opacity:0; pointer-events:none; transition:opacity .15s, transform .15s;
}
.ob-tip::before{
  content:""; position:absolute; bottom:calc(100% + 4px); left:50%; transform:translateX(-50%) translateY(4px);
  border:5px solid transparent; border-top-color:var(--ob-text); opacity:0; transition:opacity .15s, transform .15s;
}
.ob-tip:hover::after,.ob-tip:hover::before{ opacity:1; transform:translateX(-50%) translateY(0); }

/* toast */
.ob-toast{ display:inline-flex; align-items:center; gap:12px; background:var(--ob-surface); border:1px solid var(--ob-border); box-shadow:var(--ob-shadow-lg); padding:14px 18px; border-radius:14px; font-family:var(--ob-font-sans); animation:ob-toast-in .3s cubic-bezier(.2,.8,.2,1); }
.ob-toast__icon{ display:grid; place-items:center; width:30px; height:30px; border-radius:8px; flex-shrink:0; background:var(--ob-success-soft); color:var(--ob-success); }
.ob-toast__icon svg{ width:17px; height:17px; }
.ob-toast__title{ font-weight:700; font-size:14px; color:var(--ob-text); }
.ob-toast__text{ font-size:12.5px; color:var(--ob-text-2); }

/* modal — pure CSS via checkbox toggle */
.ob-modal-toggle{ position:absolute; opacity:0; pointer-events:none; }
.ob-modal{ position:fixed; inset:0; z-index:90; display:none; place-items:center; padding:24px; background:rgba(10,14,20,.55); backdrop-filter:blur(3px); -webkit-backdrop-filter:blur(3px); animation:ob-fade .2s ease; }
.ob-modal-toggle:checked ~ .ob-modal{ display:grid; }
.ob-modal__overlay{ position:absolute; inset:0; cursor:pointer; }
.ob-modal__card{ position:relative; width:100%; max-width:420px; background:var(--ob-surface); border:1px solid var(--ob-border); border-radius:20px; box-shadow:var(--ob-shadow-lg); padding:28px; font-family:var(--ob-font-sans); animation:ob-pop .26s cubic-bezier(.2,.8,.2,1); }
.ob-modal__title{ font-family:var(--ob-font-display); font-size:21px; font-weight:600; color:var(--ob-text); margin:18px 0 8px; }
.ob-modal__text{ font-size:14px; line-height:1.6; color:var(--ob-text-2); margin:0 0 24px; }
.ob-modal__close{ position:absolute; top:20px; right:20px; display:grid; place-items:center; width:32px; height:32px; border-radius:9px; background:var(--ob-surface-2); color:var(--ob-text-2); cursor:pointer; }
.ob-modal__close:hover{ background:var(--ob-surface-3); color:var(--ob-text); }
.ob-modal__close svg{ width:16px; height:16px; }
.ob-modal__icon{ width:44px; height:44px; border-radius:12px; background:var(--ob-accent-soft); color:var(--ob-accent); display:grid; place-items:center; }

/* accordion — native <details> */
.ob-accordion{ font-family:var(--ob-font-sans); }
.ob-accordion__item{ border-top:1px solid var(--ob-border); }
.ob-accordion__item:first-child{ border-top:none; }
.ob-accordion__item summary{ display:flex; align-items:center; justify-content:space-between; gap:12px; padding:17px 18px; font-size:15px; font-weight:600; color:var(--ob-text); cursor:pointer; list-style:none; }
.ob-accordion__item summary::-webkit-details-marker{ display:none; }
.ob-accordion__item summary::after{ content:""; width:18px; height:18px; flex-shrink:0; background:no-repeat center/contain; background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%2352617a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E"); transition:transform .25s; }
[data-theme="dark"] .ob-accordion__item summary::after{ background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%239aa1ac' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E"); }
.ob-accordion__item[open] summary::after{ transform:rotate(180deg); }
.ob-accordion__body{ padding:0 18px 18px; font-size:14px; line-height:1.6; color:var(--ob-text-2); }

/* ===========================================================
   TABLE
   =========================================================== */
.ob-table{ width:100%; background:var(--ob-surface); border:1px solid var(--ob-border); border-radius:18px; box-shadow:var(--ob-shadow-sm); overflow:hidden; font-family:var(--ob-font-sans); border-collapse:separate; border-spacing:0; }
.ob-table thead th{ text-align:left; font-family:var(--ob-font-mono); font-size:11px; letter-spacing:.06em; text-transform:uppercase; color:var(--ob-text-3); font-weight:600; padding:12px 22px; background:var(--ob-surface-2); border-bottom:1px solid var(--ob-border); }
.ob-table tbody td{ padding:14px 22px; border-bottom:1px solid var(--ob-border); font-size:14px; color:var(--ob-text); vertical-align:middle; }
.ob-table tbody tr:last-child td{ border-bottom:none; }
.ob-table tbody tr{ transition:background .12s; }
.ob-table tbody tr:hover{ background:var(--ob-surface-2); }
.ob-table__user{ display:flex; align-items:center; gap:12px; }
.ob-table__name{ font-weight:600; font-size:14px; }
.ob-table__sub{ font-size:12px; color:var(--ob-text-3); }
.ob-table__muted{ color:var(--ob-text-2); }

/* ===========================================================
   CHARTS
   =========================================================== */
.ob-chart-legend{ display:flex; flex-wrap:wrap; gap:14px; }
.ob-chart-legend span{ display:inline-flex; align-items:center; gap:6px; font-family:var(--ob-font-sans); font-size:12px; color:var(--ob-text-2); }
.ob-chart-legend i{ width:9px; height:9px; border-radius:3px; display:inline-block; }
.ob-chart-axis{ display:flex; justify-content:space-between; font-family:var(--ob-font-mono); font-size:11px; color:var(--ob-text-3); margin-top:8px; }

/* bar chart */
.ob-bars{ display:flex; align-items:flex-end; justify-content:space-between; gap:14px; height:150px; }
.ob-bars__col{ flex:1; display:flex; flex-direction:column; align-items:center; gap:9px; height:100%; justify-content:flex-end; }
.ob-bars__bar{ width:100%; max-width:42px; background:var(--ob-surface-3); border-radius:8px 8px 3px 3px; transition:height .4s ease; }
.ob-bars__bar.is-active{ background:var(--ob-accent); }
.ob-bars__label{ font-family:var(--ob-font-mono); font-size:11px; color:var(--ob-text-3); }
.ob-bars__col.is-active .ob-bars__label{ color:var(--ob-accent); font-weight:600; }

/* donut center label helper */
.ob-donut{ position:relative; display:inline-grid; place-items:center; }
.ob-donut__center{ position:absolute; inset:0; display:grid; place-items:center; text-align:center; }
.ob-donut__value{ font-family:var(--ob-font-display); font-size:22px; font-weight:700; line-height:1; color:var(--ob-text); }
.ob-donut__label{ font-size:10px; color:var(--ob-text-3); }

/* generic helpers used by snippets */
.ob-mono{ font-family:var(--ob-font-mono); }
.ob-kpi__value{ font-family:var(--ob-font-display); font-size:34px; font-weight:700; letter-spacing:-.02em; color:var(--ob-text); }
.ob-trend{ display:inline-flex; align-items:center; gap:3px; font-size:12.5px; font-weight:700; padding:3px 8px; border-radius:var(--ob-r-pill); }
.ob-trend--up{ color:var(--ob-success); background:var(--ob-success-soft); }
.ob-trend--down{ color:var(--ob-danger); background:var(--ob-danger-soft); }
.ob-trend svg{ width:12px; height:12px; }

/* ===========================================================
   APP SHELL  —  layout sidebar + navbar + footer (richiede orbit-ui.js)
   =========================================================== */
.ob-shell{ display:flex; min-height:100vh; background:var(--ob-bg); color:var(--ob-text); font-family:var(--ob-font-sans); -webkit-font-smoothing:antialiased; }
.ob-shell__main{ flex:1; min-width:0; display:flex; flex-direction:column; min-height:100vh; }
.ob-shell__body{ flex:1; padding:28px 32px; }

/* ---------- SIDEBAR ---------- */
.ob-sidebar{
  --ob-sb-w:262px; --ob-sb-w-collapsed:76px;
  width:var(--ob-sb-w); flex-shrink:0; position:sticky; top:0; height:100vh; z-index:40;
  display:flex; flex-direction:column; background:var(--ob-surface);
  border-right:1px solid var(--ob-border);
  transition:width .22s cubic-bezier(.2,.8,.2,1), transform .26s cubic-bezier(.2,.8,.2,1);
}
.ob-sidebar__head{ display:flex; align-items:center; gap:11px; height:64px; padding:0 18px; flex-shrink:0; border-bottom:1px solid var(--ob-border); overflow:hidden; }
.ob-sidebar__logo{ display:flex; align-items:center; gap:10px; font-family:var(--ob-font-display); font-weight:700; font-size:18px; letter-spacing:-.02em; color:var(--ob-text); text-decoration:none; white-space:nowrap; }
.ob-sidebar__logo b{ color:var(--ob-accent); font-weight:700; }
.ob-sidebar__logo svg{ flex-shrink:0; }
.ob-sidebar__nav{ flex:1; overflow-y:auto; overflow-x:hidden; padding:16px 14px; display:flex; flex-direction:column; gap:3px; }
.ob-sidebar__foot{ flex-shrink:0; padding:12px 14px; border-top:1px solid var(--ob-border); display:flex; flex-direction:column; gap:3px; }

.ob-nav-label{ font-family:var(--ob-font-mono); font-size:10.5px; font-weight:600; letter-spacing:.13em; text-transform:uppercase; color:var(--ob-text-3); padding:14px 12px 6px; white-space:nowrap; }
.ob-nav-item{
  display:flex; align-items:center; gap:12px; padding:10px 12px; border-radius:var(--ob-r-md);
  font-size:14px; font-weight:600; color:var(--ob-text-2); text-decoration:none; cursor:pointer;
  border:none; background:none; width:100%; text-align:left; font-family:var(--ob-font-sans);
  white-space:nowrap; transition:background .14s, color .14s;
}
.ob-nav-item:hover{ background:var(--ob-surface-2); color:var(--ob-text); }
.ob-nav-item.is-active{ background:var(--ob-accent-soft); color:var(--ob-accent); }
.ob-nav-item svg{ width:19px; height:19px; flex-shrink:0; }
.ob-nav-item__label{ flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; }
.ob-nav-item .ob-badge,.ob-nav-item .ob-count{ margin-left:auto; flex-shrink:0; }

/* sottomenu espandibile */
.ob-nav-group{ display:flex; flex-direction:column; }
.ob-nav-item--parent .ob-nav-caret{ width:16px; height:16px; margin-left:auto; flex-shrink:0; color:var(--ob-text-3); transition:transform .2s; }
.ob-nav-group.is-open .ob-nav-item--parent{ color:var(--ob-text); }
.ob-nav-group.is-open .ob-nav-caret{ transform:rotate(90deg); }
.ob-nav-sub{ display:grid; grid-template-rows:0fr; transition:grid-template-rows .24s cubic-bezier(.2,.8,.2,1); }
.ob-nav-group.is-open .ob-nav-sub{ grid-template-rows:1fr; }
.ob-nav-sub__inner{ overflow:hidden; min-height:0; display:flex; flex-direction:column; gap:1px; padding-left:16px; margin:2px 0 2px 22px; border-left:1.5px solid var(--ob-border); }
.ob-nav-subitem{
  display:flex; align-items:center; gap:9px; padding:8px 12px; border-radius:var(--ob-r-md);
  font-size:13.5px; font-weight:550; color:var(--ob-text-2); text-decoration:none; cursor:pointer;
  white-space:nowrap; transition:background .14s, color .14s;
}
.ob-nav-subitem:hover{ background:var(--ob-surface-2); color:var(--ob-text); }
.ob-nav-subitem.is-active{ color:var(--ob-accent); font-weight:600; }
.ob-nav-subitem .ob-count,.ob-nav-subitem .ob-badge{ margin-left:auto; }
/* in modalità compressa i sottomenu non hanno senso: collassali */
.ob-sidebar--collapsed .ob-nav-sub,
.ob-sidebar--collapsed .ob-nav-caret{ display:none; }
.ob-sidebar--collapsed .ob-nav-item--parent{ justify-content:center; }

/* collapsed (icon-only) — desktop */
.ob-sidebar--collapsed{ width:var(--ob-sb-w-collapsed); }
.ob-sidebar--collapsed .ob-sidebar__logo span,
.ob-sidebar--collapsed .ob-nav-item__label,
.ob-sidebar--collapsed .ob-nav-item .ob-badge,
.ob-sidebar--collapsed .ob-nav-item .ob-count,
.ob-sidebar--collapsed .ob-nav-label{ display:none; }
.ob-sidebar--collapsed .ob-nav-item{ justify-content:center; padding:11px 0; }
.ob-sidebar--collapsed .ob-sidebar__head{ justify-content:center; padding:0; }
.ob-sidebar--collapsed .ob-sidebar__nav{ padding:16px 12px; }
.ob-sidebar--collapsed .ob-sidebar__foot{ padding:12px; }

/* backdrop for the mobile drawer (created by orbit-ui.js) */
.ob-backdrop{ position:fixed; inset:0; z-index:39; background:rgba(10,14,20,.5); backdrop-filter:blur(2px); -webkit-backdrop-filter:blur(2px); opacity:0; visibility:hidden; transition:opacity .26s, visibility .26s; }
.ob-backdrop.is-visible{ opacity:1; visibility:visible; }

@media (max-width:1024px){
  .ob-sidebar{ position:fixed; left:0; top:0; transform:translateX(-100%); box-shadow:var(--ob-shadow-lg); }
  .ob-sidebar.is-open{ transform:translateX(0); }
  .ob-sidebar--collapsed{ width:var(--ob-sb-w); } /* il drawer è sempre esteso */
  .ob-sidebar--collapsed .ob-sidebar__logo span,
  .ob-sidebar--collapsed .ob-nav-item__label,
  .ob-sidebar--collapsed .ob-nav-item .ob-badge,
  .ob-sidebar--collapsed .ob-nav-item .ob-count,
  .ob-sidebar--collapsed .ob-nav-label{ display:revert; }
  .ob-sidebar--collapsed .ob-nav-item{ justify-content:flex-start; padding:10px 12px; }
  .ob-sidebar--collapsed .ob-sidebar__head{ justify-content:flex-start; padding:0 18px; }
}

/* ---------- NAVBAR (topbar) ---------- */
.ob-navbar{
  position:sticky; top:0; z-index:30; display:flex; align-items:center; gap:16px;
  height:64px; padding:0 24px; flex-shrink:0;
  background:color-mix(in srgb,var(--ob-surface) 82%,transparent);
  backdrop-filter:blur(12px); -webkit-backdrop-filter:blur(12px);
  border-bottom:1px solid var(--ob-border);
}
.ob-navbar__title{ font-family:var(--ob-font-display); font-size:18px; font-weight:600; letter-spacing:-.01em; color:var(--ob-text); white-space:nowrap; }
.ob-navbar__sub{ font-size:12.5px; color:var(--ob-text-3); }
.ob-navbar__spacer{ flex:1; }
.ob-navbar__search{ max-width:340px; flex:1; }
.ob-navbar__actions{ display:flex; align-items:center; gap:6px; }

/* round icon button (navbar / toolbars) */
.ob-iconbtn{ position:relative; display:inline-grid; place-items:center; width:40px; height:40px; border-radius:var(--ob-r-md); border:none; background:transparent; color:var(--ob-text-2); cursor:pointer; transition:background .14s, color .14s; }
.ob-iconbtn:hover{ background:var(--ob-surface-2); color:var(--ob-text); }
.ob-iconbtn svg{ width:20px; height:20px; }
.ob-iconbtn__dot{ position:absolute; top:8px; right:9px; width:8px; height:8px; border-radius:50%; background:var(--ob-danger); border:2px solid var(--ob-surface); }
.ob-navbar-divider{ width:1px; height:26px; background:var(--ob-border); margin:0 4px; }

/* hamburger — visibile solo sotto 1024px */
.ob-burger{ display:none; }
@media (max-width:1024px){
  .ob-burger{ display:inline-grid; }
  .ob-navbar__search{ display:none; }
}

/* ---------- DROPDOWN / MENU (richiede orbit-ui.js) ---------- */
.ob-dropdown{ position:relative; display:inline-flex; }
.ob-menu{
  position:absolute; top:calc(100% + 8px); right:0; z-index:60; min-width:208px;
  background:var(--ob-surface); border:1px solid var(--ob-border); border-radius:14px;
  box-shadow:var(--ob-shadow-lg); padding:6px; opacity:0; visibility:hidden;
  transform:translateY(-6px) scale(.98); transform-origin:top right;
  transition:opacity .16s, transform .16s, visibility .16s; font-family:var(--ob-font-sans);
}
.ob-menu--left{ right:auto; left:0; transform-origin:top left; }
.ob-dropdown.is-open .ob-menu{ opacity:1; visibility:visible; transform:translateY(0) scale(1); }
.ob-menu__header{ padding:10px 12px 8px; }
.ob-menu__name{ font-size:13.5px; font-weight:700; color:var(--ob-text); }
.ob-menu__meta{ font-size:12px; color:var(--ob-text-3); margin-top:1px; }
.ob-menu-item{
  display:flex; align-items:center; gap:11px; width:100%; padding:9px 12px; border:none; background:none;
  border-radius:9px; font-family:var(--ob-font-sans); font-size:13.5px; font-weight:600; color:var(--ob-text);
  text-align:left; text-decoration:none; cursor:pointer; transition:background .12s, color .12s;
}
.ob-menu-item:hover{ background:var(--ob-surface-2); }
.ob-menu-item svg{ width:17px; height:17px; flex-shrink:0; color:var(--ob-text-3); }
.ob-menu-item:hover svg{ color:var(--ob-text-2); }
.ob-menu-item--danger{ color:var(--ob-danger); }
.ob-menu-item--danger svg{ color:var(--ob-danger); }
.ob-menu-item--danger:hover{ background:var(--ob-danger-soft); }
.ob-menu__sep{ height:1px; background:var(--ob-border); margin:6px 4px; }

/* ---------- TOAST REGION (creata da orbit-ui.js) ---------- */
.ob-toast-region{ position:fixed; bottom:24px; right:24px; z-index:100; display:flex; flex-direction:column; gap:12px; max-width:calc(100vw - 48px); pointer-events:none; }
.ob-toast-region .ob-toast{ pointer-events:auto; min-width:300px; }
.ob-toast--danger .ob-toast__icon{ background:var(--ob-danger-soft); color:var(--ob-danger); }
.ob-toast--warn .ob-toast__icon{ background:var(--ob-warn-soft); color:var(--ob-warn); }
.ob-toast--info .ob-toast__icon{ background:var(--ob-info-soft); color:var(--ob-info); }
.ob-toast__close{ display:grid; place-items:center; width:26px; height:26px; margin-left:auto; flex-shrink:0; border:none; border-radius:7px; background:transparent; color:var(--ob-text-3); cursor:pointer; }
.ob-toast__close:hover{ background:var(--ob-surface-2); color:var(--ob-text); }
.ob-toast__close svg{ width:14px; height:14px; }
.ob-toast.is-leaving{ animation:ob-toast-out .26s cubic-bezier(.4,0,1,1) forwards; }
@keyframes ob-toast-out{ to{ transform:translateY(8px); opacity:0; } }

/* ---------- FOOTER ---------- */
.ob-footer{
  flex-shrink:0; display:flex; align-items:center; justify-content:space-between; flex-wrap:wrap; gap:14px;
  padding:18px 32px; border-top:1px solid var(--ob-border); background:var(--ob-surface);
  font-family:var(--ob-font-sans); font-size:13px; color:var(--ob-text-3);
}
.ob-footer a{ color:var(--ob-text-2); text-decoration:none; font-weight:500; transition:color .14s; }
.ob-footer a:hover{ color:var(--ob-accent); }
.ob-footer__links{ display:flex; align-items:center; gap:20px; flex-wrap:wrap; }
.ob-footer__brand{ display:flex; align-items:center; gap:8px; font-weight:600; color:var(--ob-text-2); }
.ob-footer__brand svg{ flex-shrink:0; }
