/* RoomHex panel design system · self-hosted, no external runtime deps. */

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body,h1,h2,h3,p,ul,ol,figure{margin:0}
ul,ol{list-style:none;padding:0}
a{color:inherit;text-decoration:none}
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
img,svg{display:block;max-width:100%}
input,select,textarea{font:inherit;color:inherit}
[hidden]{display:none!important}
:focus-visible{outline:2px solid var(--ring);outline-offset:2px;border-radius:6px}

/* ---- theme tokens ---- */
:root{
  --bg:#070b16; --bg-2:#0a1020; --surface:rgba(20,28,48,.72); --surface-2:rgba(28,38,62,.6);
  --border:rgba(148,163,184,.16); --border-2:rgba(148,163,184,.28);
  --text:#eaf0ff; --muted:#93a1c0; --faint:#64708c;
  --brand:#3b82f6; --brand-2:#22d3ee; --accent:#8b5cf6; --accent-2:#22d3ee;
  --good:#34d399; --warn:#fbbf24; --danger:#fb7185; --info:#60a5fa;
  --ring:#38bdf8;
  --radius:18px; --radius-sm:12px; --shadow:0 24px 60px rgba(2,6,18,.5);
  --sidebar-w:274px; --topbar-h:64px;
  --hero-a:#1e3a8a; --hero-b:#0b1226; --hero-c:#22d3ee;
  --font:"Segoe UI",Inter,system-ui,-apple-system,BlinkMacSystemFont,Roboto,Helvetica,Arial,sans-serif;
  --mono:"SFMono-Regular",ui-monospace,"Cascadia Code",Consolas,monospace;
}
:root[data-panel="owner"]{
  --bg:#050d14; --bg-2:#071620; --brand:#14b8a6; --brand-2:#2dd4bf; --accent:#8b5cf6; --accent-2:#34d399;
  --ring:#2dd4bf; --hero-a:#0f766e; --hero-b:#071a24; --hero-c:#2dd4bf;
}
:root[data-panel="panel"]{
  --bg:#0a0714; --bg-2:#12081f; --brand:#a855f7; --brand-2:#22d3ee; --accent:#ec4899; --accent-2:#38bdf8;
  --ring:#c084fc; --hero-a:#6d28d9; --hero-b:#150826; --hero-c:#ec4899;
}

body{
  font-family:var(--font); color:var(--text); background:var(--bg);
  min-height:100vh; -webkit-font-smoothing:antialiased; line-height:1.5;
  background-image:
    radial-gradient(1100px 620px at 82% -8%, color-mix(in srgb,var(--brand) 20%,transparent), transparent 60%),
    radial-gradient(900px 560px at -6% 8%, color-mix(in srgb,var(--accent) 16%,transparent), transparent 55%);
  background-attachment:fixed;
}
.mono{font-family:var(--mono);font-size:.86em}
.skip-link{position:fixed;left:-999px;top:8px;z-index:120;background:var(--brand);color:#fff;padding:8px 14px;border-radius:8px}
.skip-link:focus{left:8px}

/* ---- app shell ---- */
.app{display:grid;grid-template-columns:var(--sidebar-w) 1fr;min-height:100vh}
.app-main{min-width:0;display:flex;flex-direction:column}

.sidebar{
  position:sticky;top:0;height:100vh;display:flex;flex-direction:column;
  background:linear-gradient(180deg,var(--bg-2),rgba(5,8,18,.9));
  border-right:1px solid var(--border);backdrop-filter:blur(12px);z-index:60;
}
.sidebar-head{display:flex;align-items:center;gap:10px;padding:16px 16px 12px}
.brand{display:flex;align-items:center;gap:11px;min-width:0}
.brand-mark{width:40px;height:40px;display:grid;place-items:center;border-radius:12px;color:#fff}
.brand-mark img{width:100%;height:100%;object-fit:contain;filter:drop-shadow(0 4px 12px color-mix(in srgb,var(--brand) 45%,transparent))}
.brand-mark .ic{width:22px;height:22px}
.brand-name{font-weight:700;letter-spacing:.3px}
.brand-kind{display:block;font-size:11px;color:var(--muted);max-width:170px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sidebar-collapse{margin-left:auto}
.sidebar-collapse .ic{transform:rotate(90deg)}

.nav{flex:1;overflow-y:auto;padding:8px 10px 16px;display:flex;flex-direction:column;gap:2px;scrollbar-width:thin}
.nav-item,.nav-parent{display:flex;align-items:center;gap:11px;width:100%;padding:9px 11px;border-radius:11px;color:var(--muted);font-size:14px;font-weight:500;transition:background .18s,color .18s,transform .18s}
.nav-item:hover,.nav-parent:hover{background:var(--surface-2);color:var(--text);transform:translateX(2px)}
.nav-ic{width:20px;height:20px;display:grid;place-items:center;flex:none}
.nav-ic .ic{width:19px;height:19px}
.nav-label{flex:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.nav-item.is-active{color:#fff;background:linear-gradient(100deg,color-mix(in srgb,var(--brand) 34%,transparent),color-mix(in srgb,var(--accent) 20%,transparent));box-shadow:inset 0 0 0 1px var(--border-2)}
.nav-item.is-active::before{content:"";position:absolute}
.nav-caret{margin-left:auto;transition:transform .22s}.nav-caret .ic{width:16px;height:16px}
.nav-children{display:grid;grid-template-rows:0fr;transition:grid-template-rows .24s ease;overflow:hidden}
.nav-children>*{min-height:0}
.nav-group.is-open .nav-children{grid-template-rows:1fr}
.nav-group.is-open .nav-caret{transform:rotate(180deg)}
.nav-child{display:flex;align-items:center;gap:9px;padding:7px 11px 7px 30px;border-radius:9px;color:var(--faint);font-size:13.2px}
.nav-child:hover{color:var(--text);background:var(--surface-2)}
.nav-child.is-active{color:#fff}
.nav-dot{width:5px;height:5px;border-radius:50%;background:currentColor;opacity:.5}
.nav-child.is-active .nav-dot{background:var(--brand-2);opacity:1;box-shadow:0 0 8px var(--brand-2)}

.sidebar-foot{padding:12px}
.scope-card{display:flex;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--border);border-radius:12px;background:var(--surface)}
.scope-dot{width:9px;height:9px;border-radius:50%}
.scope-title{font-size:13px;font-weight:600}.scope-sub{font-size:11px;color:var(--faint)}

/* ---- topbar ---- */
.topbar{position:sticky;top:0;z-index:50;height:var(--topbar-h);display:flex;align-items:center;gap:14px;padding:0 18px;
  background:color-mix(in srgb,var(--bg-2) 82%,transparent);backdrop-filter:blur(14px);border-bottom:1px solid var(--border)}
.nav-open{display:none}
.icon-btn{width:40px;height:40px;display:grid;place-items:center;border-radius:11px;color:var(--muted);border:1px solid transparent;transition:.18s}
.icon-btn:hover{color:var(--text);background:var(--surface-2);border-color:var(--border)}
.icon-btn .ic{width:20px;height:20px}
.has-badge{position:relative}
.badge{position:absolute;top:4px;right:4px;min-width:16px;height:16px;padding:0 4px;border-radius:8px;background:var(--danger);color:#1a0410;font-size:10px;font-weight:800;display:grid;place-items:center}
.tenant{display:flex;align-items:center;gap:10px;min-width:0}
.tenant-badge{font-size:11px;font-weight:800;letter-spacing:.6px;text-transform:uppercase;color:var(--brand-2);border:1px solid var(--border-2);padding:4px 9px;border-radius:8px;background:color-mix(in srgb,var(--brand) 12%,transparent)}
.tenant-name{font-weight:600;font-size:14px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:220px}
.tenant-scope{font-size:11.5px;color:var(--faint)}
.search-trigger{display:flex;align-items:center;gap:9px;margin-left:6px;padding:8px 12px;border-radius:11px;border:1px solid var(--border);background:var(--surface);color:var(--muted);font-size:13px;min-width:200px;transition:.18s}
.search-trigger:hover{border-color:var(--border-2);color:var(--text)}
.search-trigger .ic{width:17px;height:17px}
.search-trigger span{flex:1;text-align:left}
kbd{font-family:var(--mono);font-size:10.5px;padding:2px 5px;border-radius:6px;border:1px solid var(--border-2);background:var(--bg);color:var(--muted)}
.topbar-actions{margin-left:auto;display:flex;align-items:center;gap:8px}
.health-pill{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;font-weight:600;padding:7px 12px;border-radius:999px;border:1px solid var(--border);background:var(--surface)}
.pulse-dot{width:8px;height:8px;border-radius:50%;background:currentColor;animation:pulse 2s infinite}
.health-good{color:var(--good)}.health-warn{color:var(--warn)}.health-danger{color:var(--danger)}
.user-btn{display:flex;align-items:center;gap:9px;padding:5px 9px 5px 5px;border-radius:12px;border:1px solid transparent;transition:.18s}
.user-btn:hover{border-color:var(--border);background:var(--surface-2)}
.avatar{width:34px;height:34px;border-radius:10px;display:grid;place-items:center;font-size:12px;font-weight:800;color:#fff;background:linear-gradient(135deg,var(--brand),var(--accent))}
.user-name{font-size:13px;font-weight:600;display:block}.user-role{font-size:11px;color:var(--faint)}
.user-btn .ic{width:16px;height:16px;color:var(--faint)}

/* ---- menus ---- */
.menu{position:relative}
.menu-panel{position:absolute;top:calc(100% + 10px);right:0;width:280px;padding:8px;border-radius:14px;border:1px solid var(--border-2);
  background:var(--bg-2);box-shadow:var(--shadow);z-index:80;animation:pop .16s ease}
.menu-title{font-size:11px;text-transform:uppercase;letter-spacing:.6px;color:var(--faint);padding:6px 8px}
.menu-link{display:flex;align-items:center;gap:10px;width:100%;padding:9px 10px;border-radius:9px;font-size:13.5px;color:var(--muted);text-align:left}
.menu-link:hover{background:var(--surface-2);color:var(--text)}
.menu-link .ic{width:17px;height:17px}
.menu-link.danger{color:var(--danger)}
.menu-sep{height:1px;background:var(--border);margin:6px 2px}
.note{display:flex;gap:10px;align-items:flex-start;padding:9px 8px;border-radius:9px}
.note:hover{background:var(--surface-2)}
.note-dot{width:8px;height:8px;border-radius:50%;margin-top:5px;background:var(--info)}
.note-good .note-dot{background:var(--good)}.note-warn .note-dot{background:var(--warn)}
.note-title{font-size:13px;font-weight:600}.note-sub{font-size:11.5px;color:var(--faint)}
.note-time{margin-left:auto;font-size:11px;color:var(--faint)}

/* ---- page ---- */
.page{padding:22px 26px 40px;max-width:1500px;width:100%;margin:0 auto;animation:enter .4s ease}
.pagehead{display:flex;align-items:flex-end;gap:16px;flex-wrap:wrap;margin-bottom:20px}
.pagehead-main{min-width:0}
.crumbs{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--faint);margin-bottom:8px}
.crumbs a:hover{color:var(--text)}.crumb-sep{opacity:.5}
.page-title{font-size:clamp(1.5rem,3.2vw,2rem);font-weight:750;letter-spacing:-.02em}
.page-sub{color:var(--muted);margin-top:5px;font-size:14px}
.pagehead .btn{margin-left:auto}

/* ---- buttons ---- */
.btn{display:inline-flex;align-items:center;gap:8px;padding:10px 16px;border-radius:11px;font-size:13.5px;font-weight:600;border:1px solid transparent;transition:transform .16s,box-shadow .16s,background .16s;white-space:nowrap}
.btn .ic{width:17px;height:17px}
.btn:hover{transform:translateY(-1px)}
.btn-primary{color:#fff;background:linear-gradient(120deg,var(--brand),var(--accent));box-shadow:0 10px 26px color-mix(in srgb,var(--brand) 34%,transparent)}
.btn-ghost{color:var(--text);border-color:var(--border-2);background:var(--surface)}
.btn-ghost:hover{background:var(--surface-2)}
.btn-danger{color:#fff;background:linear-gradient(120deg,#e11d48,var(--danger))}
.btn-subtle{color:var(--muted);background:var(--surface-2)}
.stepup-tag{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.4px;padding:2px 6px;border-radius:6px;background:rgba(0,0,0,.25);border:1px solid rgba(255,255,255,.15)}

/* ---- hero ---- */
.hero{position:relative;overflow:hidden;border-radius:calc(var(--radius) + 4px);padding:30px;margin-bottom:22px;
  border:1px solid var(--border-2);display:flex;gap:26px;flex-wrap:wrap;align-items:center;justify-content:space-between;
  background:linear-gradient(120deg,var(--hero-a),var(--hero-b) 62%)}
.hero-glow{position:absolute;inset:0;background:radial-gradient(600px 260px at 78% 12%,color-mix(in srgb,var(--hero-c) 42%,transparent),transparent 60%);pointer-events:none}
.hero-body{position:relative;max-width:640px}
.hero-eyebrow{display:inline-block;font-size:11.5px;font-weight:700;letter-spacing:.8px;text-transform:uppercase;color:var(--brand-2);margin-bottom:10px}
.hero-title{font-size:clamp(1.6rem,3.6vw,2.5rem);font-weight:780;letter-spacing:-.02em;line-height:1.1}
.hero-sub{color:#cdd8f2;margin-top:10px;font-size:14.5px;max-width:52ch}
.hero-actions{display:flex;gap:10px;margin-top:18px;flex-wrap:wrap}
.hero-stats{position:relative;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;min-width:260px}
.hero-stat{padding:14px 16px;border-radius:14px;background:rgba(4,8,20,.42);border:1px solid var(--border);backdrop-filter:blur(6px)}
.hero-stat-val{font-size:1.7rem;font-weight:750;display:block;line-height:1}
.hero-stat-label{font-size:12px;color:var(--muted)}
.trend{font-size:11px;font-weight:700;padding:2px 7px;border-radius:7px}
.trend-up{color:var(--good);background:color-mix(in srgb,var(--good) 15%,transparent)}
.trend-down{color:var(--danger);background:color-mix(in srgb,var(--danger) 15%,transparent)}
.trend-flat{color:var(--muted);background:var(--surface-2)}

/* ---- KPI ---- */
.kpi-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin-bottom:20px}
.kpi{position:relative;overflow:hidden;padding:16px 18px;border-radius:var(--radius);border:1px solid var(--border);background:var(--surface);transition:transform .2s,border-color .2s}
.kpi:hover{transform:translateY(-3px);border-color:var(--border-2)}
.kpi::after{content:"";position:absolute;inset:0 0 auto 0;height:3px;background:linear-gradient(90deg,var(--brand),var(--accent));opacity:.85}
.kpi-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.kpi-ic{width:34px;height:34px;border-radius:10px;display:grid;place-items:center;color:var(--brand-2);background:color-mix(in srgb,var(--brand) 16%,transparent)}
.kpi-ic .ic{width:19px;height:19px}
.kpi-val{font-size:1.7rem;font-weight:760;letter-spacing:-.02em}
.kpi-label{font-size:12.5px;color:var(--muted);margin-top:2px}

/* ---- grid + cards ---- */
.grid{display:grid;grid-template-columns:repeat(12,1fr);gap:16px}
.card{grid-column:span 12;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:18px;backdrop-filter:blur(10px);animation:rise .45s ease both}
.span-3{grid-column:span 3}.span-4{grid-column:span 4}.span-6{grid-column:span 6}.span-8{grid-column:span 8}.span-12{grid-column:span 12}
.card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;margin-bottom:14px}
.card-title{font-size:15px;font-weight:680}
.card-sub{font-size:12px;color:var(--faint);margin-top:2px}
.card-note{font-size:12px;color:var(--faint);margin-top:10px}

/* ---- table ---- */
.table-wrap{overflow-x:auto;border-radius:12px}
.table{width:100%;border-collapse:collapse;font-size:13.4px;min-width:520px}
.table th{text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--faint);font-weight:700;padding:9px 12px;border-bottom:1px solid var(--border)}
.table td{padding:11px 12px;border-bottom:1px solid var(--border);vertical-align:top}
.table tr:last-child td{border-bottom:0}
.table tbody tr{transition:background .15s}
.table tbody tr:hover{background:var(--surface-2)}
.cell-sub{display:block;font-size:11.5px;color:var(--faint);margin-top:2px}
.chip{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;font-weight:650;padding:3px 9px;border-radius:999px;border:1px solid var(--border-2)}
.chip-good{color:var(--good);background:color-mix(in srgb,var(--good) 14%,transparent);border-color:color-mix(in srgb,var(--good) 30%,transparent)}
.chip-warn{color:var(--warn);background:color-mix(in srgb,var(--warn) 14%,transparent);border-color:color-mix(in srgb,var(--warn) 30%,transparent)}
.chip-danger{color:var(--danger);background:color-mix(in srgb,var(--danger) 14%,transparent);border-color:color-mix(in srgb,var(--danger) 30%,transparent)}
.chip-info{color:var(--info);background:color-mix(in srgb,var(--info) 14%,transparent);border-color:color-mix(in srgb,var(--info) 30%,transparent)}
.chip-brand{color:var(--brand-2);background:color-mix(in srgb,var(--brand) 16%,transparent);border-color:color-mix(in srgb,var(--brand) 30%,transparent)}
.chip-muted{color:var(--muted);background:var(--surface-2)}

/* ---- bento ---- */
.bento{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}
.mini{display:flex;flex-direction:column;gap:3px;padding:15px;border-radius:14px;border:1px solid var(--border);background:var(--bg-2);transition:transform .18s,border-color .18s}
.mini:hover{transform:translateY(-3px);border-color:var(--border-2)}
.mini-ic{width:32px;height:32px;border-radius:9px;display:grid;place-items:center;color:var(--brand-2);background:color-mix(in srgb,var(--brand) 14%,transparent);margin-bottom:6px}
.mini-ic .ic{width:18px;height:18px}
.mini-val{font-size:1.15rem;font-weight:720}
.mini-label{font-size:12px;color:var(--muted)}.mini-sub{font-size:11px;color:var(--faint)}

/* ---- feeds ---- */
.feed{display:flex;flex-direction:column;gap:3px}
.feed-item{display:flex;align-items:center;gap:12px;padding:10px 8px;border-radius:11px;position:relative}
.feed-item:hover{background:var(--surface-2)}
.feed-ic{width:34px;height:34px;border-radius:10px;display:grid;place-items:center;flex:none;background:var(--surface-2)}
.feed-ic .ic{width:18px;height:18px}
.feed-title{font-size:13.5px;font-weight:600;display:block}
.feed-sub{font-size:12px;color:var(--faint)}
.feed-time{margin-left:auto;font-size:11.5px;color:var(--faint);white-space:nowrap}
.feed-timeline .feed-item{padding-left:20px}
.feed-timeline .feed-item::before{content:"";position:absolute;left:6px;top:0;bottom:0;width:2px;background:var(--border)}

/* ---- health meters ---- */
.health-list{display:flex;flex-direction:column;gap:12px}
.health-row{display:grid;grid-template-columns:150px 1fr 48px;align-items:center;gap:12px}
.health-name{font-size:13px;font-weight:600;display:block}.health-sub{font-size:11px;color:var(--faint)}
.meter{height:8px;border-radius:999px;background:var(--surface-2);overflow:hidden;position:relative}
.meter-fill{position:absolute;inset:0;width:var(--pct);border-radius:999px;background:linear-gradient(90deg,var(--brand),var(--brand-2));animation:grow 1s ease both}
.fill-good{background:linear-gradient(90deg,var(--good),#6ee7b7)}
.fill-warn{background:linear-gradient(90deg,var(--warn),#fcd34d)}
.fill-danger{background:linear-gradient(90deg,var(--danger),#fda4af)}
.health-pct{font-size:12.5px;font-weight:700;text-align:right}

/* ---- matrix ---- */
.matrix td:first-child{font-weight:600}
.perm{font-size:11px;font-weight:700;padding:3px 8px;border-radius:7px;text-transform:capitalize}
.perm-yes{color:var(--good);background:color-mix(in srgb,var(--good) 15%,transparent)}
.perm-no{color:var(--faint);background:var(--surface-2)}
.perm-approval{color:var(--info);background:color-mix(in srgb,var(--info) 15%,transparent)}
.perm-stepup{color:var(--warn);background:color-mix(in srgb,var(--warn) 15%,transparent)}

/* ---- license card ---- */
.license-card{border-radius:16px;padding:20px;border:1px solid var(--border-2);background:linear-gradient(135deg,color-mix(in srgb,var(--brand) 18%,var(--bg-2)),var(--bg-2))}
.lic-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}
.lic-state{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.6px;color:var(--good);padding:3px 9px;border-radius:7px;background:color-mix(in srgb,var(--good) 15%,transparent)}
.lic-expired .lic-state,.lic-revoked .lic-state,.lic-invalid .lic-state{color:var(--danger);background:color-mix(in srgb,var(--danger) 15%,transparent)}
.lic-expiring .lic-state{color:var(--warn);background:color-mix(in srgb,var(--warn) 15%,transparent)}
.lic-plan{font-weight:700}
.lic-serial{color:var(--muted);margin-bottom:14px}
.lic-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;margin-bottom:14px}
.lic-k{display:block;font-size:11px;color:var(--faint)}.lic-v{font-size:13.5px;font-weight:600}
.lic-features{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px}

/* ---- forms ---- */
.form-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:14px}
.field{grid-column:span 12;display:flex;flex-direction:column;gap:6px}
.field label{font-size:12.5px;font-weight:600;color:var(--muted)}
.req{color:var(--danger)}
.field input,.field select,.field textarea{padding:10px 12px;border-radius:11px;border:1px solid var(--border-2);background:var(--bg-2);color:var(--text);transition:border-color .16s,box-shadow .16s}
.field textarea{min-height:92px;resize:vertical}
.field input:focus,.field select:focus,.field textarea:focus{outline:none;border-color:var(--ring);box-shadow:0 0 0 3px color-mix(in srgb,var(--ring) 22%,transparent)}
.field input:disabled{opacity:.6}
.field-help{font-size:11.5px;color:var(--faint)}
.switch{position:relative;display:inline-flex;width:46px;height:26px}
.switch input{position:absolute;opacity:0}
.switch-track{width:46px;height:26px;border-radius:999px;background:var(--surface-2);border:1px solid var(--border-2);position:relative;transition:.2s}
.switch-track::after{content:"";position:absolute;top:2px;left:2px;width:20px;height:20px;border-radius:50%;background:var(--muted);transition:.2s}
.switch input:checked+.switch-track{background:linear-gradient(90deg,var(--brand),var(--accent))}
.switch input:checked+.switch-track::after{transform:translateX(20px);background:#fff}
.form-actions{display:flex;gap:10px;margin-top:16px;flex-wrap:wrap}

/* ---- banner ---- */
.banner{display:flex;align-items:center;gap:14px;padding:14px 16px;border-radius:14px;border:1px solid var(--border-2)}
.banner-ic{width:38px;height:38px;border-radius:11px;display:grid;place-items:center;flex:none}
.banner-ic .ic{width:20px;height:20px}
.banner-body{display:flex;flex-direction:column}.banner-body strong{font-size:14px}.banner-body span{font-size:12.5px;color:var(--muted)}
.banner-actions{margin-left:auto}
.banner-info{background:color-mix(in srgb,var(--info) 10%,transparent)}.banner-info .banner-ic{color:var(--info);background:color-mix(in srgb,var(--info) 16%,transparent)}
.banner-good{background:color-mix(in srgb,var(--good) 10%,transparent)}.banner-good .banner-ic{color:var(--good);background:color-mix(in srgb,var(--good) 16%,transparent)}
.banner-warn{background:color-mix(in srgb,var(--warn) 10%,transparent)}.banner-warn .banner-ic{color:var(--warn);background:color-mix(in srgb,var(--warn) 16%,transparent)}
.banner-danger{background:color-mix(in srgb,var(--danger) 10%,transparent)}.banner-danger .banner-ic{color:var(--danger);background:color-mix(in srgb,var(--danger) 16%,transparent)}

/* ---- wizard ---- */
.wizard{display:flex;gap:8px;flex-wrap:wrap}
.wiz-step{display:flex;align-items:center;gap:9px;padding:9px 14px;border-radius:11px;border:1px solid var(--border);background:var(--bg-2);color:var(--muted);font-size:13px;flex:1;min-width:130px}
.wiz-num{width:24px;height:24px;border-radius:50%;display:grid;place-items:center;font-size:12px;font-weight:700;background:var(--surface-2);color:var(--muted)}
.wiz-step.is-current{border-color:var(--brand);color:var(--text)}
.wiz-step.is-current .wiz-num{background:linear-gradient(135deg,var(--brand),var(--accent));color:#fff}
.wiz-step.is-done .wiz-num{background:var(--good);color:#04231a}

/* ---- tone helpers ---- */
.tone-brand{color:var(--brand-2)}.tone-good{color:var(--good)}.tone-warn{color:var(--warn)}
.tone-danger{color:var(--danger)}.tone-info{color:var(--info)}.tone-muted{color:var(--muted)}

/* ---- states ---- */
.state{min-height:60vh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:14px;padding:40px}
.state-orb{width:96px;height:96px;border-radius:28px;display:grid;place-items:center;color:var(--brand-2);
  background:radial-gradient(circle at 30% 30%,color-mix(in srgb,var(--brand) 30%,transparent),var(--bg-2));border:1px solid var(--border-2)}
.state-orb .ic{width:44px;height:44px}
.state-denied .state-orb,.state-license_expired .state-orb{color:var(--warn)}
.state-title{font-size:1.8rem;font-weight:760}
.state-sub{color:var(--muted);max-width:46ch}
.state-actions{margin-top:6px}

/* ---- command palette ---- */
.palette{position:fixed;inset:0;z-index:130;display:grid;place-items:start center;padding-top:12vh;background:rgba(4,7,16,.6);backdrop-filter:blur(4px);animation:fade .16s ease}
.palette-card{width:min(620px,92vw);border-radius:16px;border:1px solid var(--border-2);background:var(--bg-2);box-shadow:var(--shadow);overflow:hidden;animation:pop .18s ease}
.palette-input{display:flex;align-items:center;gap:10px;padding:14px 16px;border-bottom:1px solid var(--border)}
.palette-input .ic{width:19px;height:19px;color:var(--faint)}
.palette-input input{flex:1;background:none;border:0;font-size:15px}
.palette-input input:focus{outline:none}
.palette-list{max-height:52vh;overflow-y:auto;padding:8px}
.palette-item{display:flex;align-items:center;gap:11px;padding:10px 12px;border-radius:10px;color:var(--muted);cursor:pointer;font-size:13.5px}
.palette-item:hover,.palette-item.is-active{background:var(--surface-2);color:var(--text)}
.palette-item .ic{width:17px;height:17px;color:var(--brand-2)}
.palette-item .pi-crumb{margin-left:auto;font-size:11px;color:var(--faint)}
.palette-empty{padding:22px;text-align:center;color:var(--faint);font-size:13px}

/* ---- toast ---- */
.toast-host{position:fixed;right:18px;bottom:18px;z-index:140;display:flex;flex-direction:column;gap:10px}
.toast{display:flex;align-items:center;gap:10px;padding:12px 16px;border-radius:12px;border:1px solid var(--border-2);background:var(--bg-2);box-shadow:var(--shadow);font-size:13.5px;animation:slidein .22s ease}

/* ---- footer ---- */
.app-footer{margin-top:auto;display:flex;align-items:center;gap:10px;padding:16px 26px;border-top:1px solid var(--border);color:var(--faint);font-size:12px;flex-wrap:wrap}
.foot-right{margin-left:auto}.dot-sep{opacity:.4}

.scrim{position:fixed;inset:0;background:rgba(3,6,15,.6);z-index:55;backdrop-filter:blur(2px)}

/* ---- animations ---- */
@keyframes pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.8)}}
@keyframes enter{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
@keyframes rise{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
@keyframes grow{from{width:0}}
@keyframes pop{from{opacity:0;transform:translateY(-6px) scale(.98)}to{opacity:1;transform:none}}
@keyframes fade{from{opacity:0}to{opacity:1}}
@keyframes slidein{from{opacity:0;transform:translateX(20px)}to{opacity:1;transform:none}}

/* ---- responsive ---- */
@media(max-width:1080px){
  .app{grid-template-columns:1fr}
  .sidebar{position:fixed;left:0;top:0;width:min(300px,86vw);transform:translateX(-105%);transition:transform .26s ease}
  .app[data-open] .sidebar{transform:none}
  .nav-open{display:grid}
  .search-trigger span,.search-trigger kbd{display:none}.search-trigger{min-width:0;padding:9px}
  .user-text{display:none}
}
@media(max-width:820px){
  .span-3,.span-4,.span-6,.span-8{grid-column:span 12}
  .hero{padding:22px}.hero-stats{grid-template-columns:repeat(2,1fr);width:100%}
  .health-row{grid-template-columns:110px 1fr 42px}
  .field.span-6{grid-column:span 12}
  .page{padding:18px 16px 34px}
  .tenant-text{display:none}
}
@media(max-width:520px){
  .hero-stats{grid-template-columns:1fr}
  .kpi-row{grid-template-columns:repeat(2,1fr)}
  .health-row{grid-template-columns:1fr;gap:6px}.meter{grid-column:1}
  .scrim{display:block}
}
@media not all and (max-width:520px){.scrim{display:none}}

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

/* ---- login ---- */
.login-body{display:grid;place-items:stretch;min-height:100vh}
.login{display:grid;grid-template-columns:1.05fr .95fr;min-height:100vh;width:100%}
.login-aside{position:relative;overflow:hidden;padding:56px 52px;display:flex;flex-direction:column;justify-content:center;gap:18px;
  background:linear-gradient(150deg,var(--hero-a),var(--hero-b) 70%);border-right:1px solid var(--border)}
.login-aside-glow{position:absolute;inset:0;background:radial-gradient(620px 300px at 78% 16%,color-mix(in srgb,var(--hero-c) 40%,transparent),transparent 60%);pointer-events:none}
.login-brand{position:relative;display:flex;align-items:center;gap:12px;margin-bottom:8px}
.login-brand .brand-mark{width:44px;height:44px}.login-brand .brand-name{font-size:1.3rem;font-weight:750}
.login-headline{position:relative;font-size:clamp(1.7rem,3vw,2.4rem);font-weight:770;letter-spacing:-.02em;max-width:16ch;line-height:1.12}
.login-tag{position:relative;color:#cdd8f2;max-width:44ch}
.login-points{position:relative;display:flex;flex-direction:column;gap:12px;margin-top:12px}
.login-points li{display:flex;align-items:center;gap:11px;color:#dbe6ff;font-size:14px}
.login-points .ic{width:20px;height:20px;color:var(--brand-2)}
.login-card{display:flex;flex-direction:column;justify-content:center;gap:18px;padding:56px clamp(24px,6vw,84px);max-width:560px;width:100%;margin:0 auto}
.login-card-head{display:flex;flex-direction:column;gap:6px;margin-bottom:6px}
.login-mark{width:46px;height:46px;margin-bottom:8px}
.login-card-head h2{font-size:1.7rem;font-weight:760}
.login-card-head p{color:var(--muted);font-size:14px}
.login-error{display:flex;align-items:center;gap:10px;padding:12px 14px;border-radius:12px;border:1px solid color-mix(in srgb,var(--danger) 40%,transparent);
  background:color-mix(in srgb,var(--danger) 12%,transparent);color:var(--danger);font-size:13.5px}
.login-error .ic{width:19px;height:19px;flex:none}
.login-form{display:flex;flex-direction:column;gap:14px}
.login-form .field{display:flex;flex-direction:column;gap:6px}
.login-form .field span{font-size:12.5px;font-weight:600;color:var(--muted)}
.login-form input{padding:12px 14px;border-radius:12px;border:1px solid var(--border-2);background:var(--bg-2);color:var(--text);font-size:15px}
.login-form input:focus{outline:none;border-color:var(--ring);box-shadow:0 0 0 3px color-mix(in srgb,var(--ring) 22%,transparent)}
.login-submit{justify-content:center;margin-top:6px;padding:12px 16px;font-size:14.5px}
.login-foot{color:var(--faint);font-size:12px;margin-top:6px}
.menu-logout{width:100%}
@media(max-width:860px){
  .login{grid-template-columns:1fr}
  .login-aside{display:none}
  .login-card{min-height:100vh}
}

/* ---- login puzzle captcha ---- */
.cap{display:flex;flex-direction:column;gap:9px}
.cap-label{font-size:12.5px;font-weight:600;color:var(--muted)}
.cap-frame{position:relative;border-radius:14px;overflow:hidden;border:1px solid var(--border-2);background:var(--bg-2);max-width:100%}
.cap-bg{display:block;user-select:none;-webkit-user-drag:none}
.cap-piece{position:absolute;filter:drop-shadow(0 3px 8px rgba(0,0,0,.55));cursor:grab;user-select:none;-webkit-user-drag:none;touch-action:none;transition:filter .2s}
.cap.is-armed .cap-piece{filter:drop-shadow(0 3px 11px color-mix(in srgb,var(--brand) 65%,transparent))}
.cap-hint{position:absolute;left:0;right:0;bottom:8px;text-align:center;font-size:12px;color:rgba(255,255,255,.88);text-shadow:0 1px 4px rgba(0,0,0,.7);pointer-events:none;transition:opacity .3s}
.cap-track{position:relative;height:44px;border-radius:12px;border:1px solid var(--border-2);background:var(--surface-2);overflow:hidden;max-width:100%}
.cap-fill{position:absolute;left:0;top:0;bottom:0;width:0;background:linear-gradient(90deg,color-mix(in srgb,var(--brand) 45%,transparent),color-mix(in srgb,var(--accent) 45%,transparent))}
.cap-handle{position:absolute;left:0;top:0;height:44px;width:46px;border:0;border-radius:12px;background:linear-gradient(135deg,var(--brand),var(--accent));color:#fff;display:grid;place-items:center;box-shadow:0 4px 14px rgba(0,0,0,.4);touch-action:none;cursor:grab}
.cap-handle .ic{width:20px;height:20px;transform:rotate(-90deg)}
.cap-handle.is-grab{cursor:grabbing}

/* ---- login motion (all panels get subtle motion; customer panels get more) ---- */
.login-aside-glow{animation:capGlow 14s ease-in-out infinite alternate}
.orb{position:absolute;border-radius:50%;filter:blur(34px);opacity:.42;pointer-events:none}
.orb-1{width:190px;height:190px;background:var(--brand);top:-46px;left:-34px;animation:floatA 19s ease-in-out infinite}
.orb-2{width:150px;height:150px;background:var(--accent);bottom:-34px;right:12%;animation:floatB 23s ease-in-out infinite}
.orb-3{width:96px;height:96px;background:var(--brand-2);top:42%;right:-24px;animation:floatA 16s ease-in-out infinite reverse}
.login-card{animation:loginIn .55s cubic-bezier(.2,.7,.2,1) both}
.login-form .field,.login-form .cap,.login-submit{animation:fieldIn .5s ease both}
.login-form .field:nth-of-type(2){animation-delay:.06s}
.login-form .cap{animation-delay:.12s}
.login-submit{animation-delay:.18s}
:root[data-panel="owner"] .orb,:root[data-panel="panel"] .orb{opacity:.6;filter:blur(30px)}
:root[data-panel="owner"] .login-headline,:root[data-panel="panel"] .login-headline{
  background:linear-gradient(90deg,#ffffff,var(--brand-2),#ffffff);background-size:220% auto;
  -webkit-background-clip:text;background-clip:text;color:transparent;animation:shimmer 6.5s linear infinite}
:root[data-panel="panel"] .login-aside{background:linear-gradient(135deg,var(--hero-a),var(--hero-b) 55%,#2a0d4a);background-size:200% 200%;animation:gradientDrift 16s ease infinite}
:root[data-panel="owner"] .login-aside{background:linear-gradient(135deg,var(--hero-a),var(--hero-b) 60%,#0a3b34);background-size:200% 200%;animation:gradientDrift 18s ease infinite}
@keyframes floatA{0%,100%{transform:translate(0,0)}50%{transform:translate(22px,-26px)}}
@keyframes floatB{0%,100%{transform:translate(0,0)}50%{transform:translate(-28px,20px)}}
@keyframes capGlow{0%{opacity:.55;transform:scale(1)}100%{opacity:1;transform:scale(1.16)}}
@keyframes loginIn{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
@keyframes fieldIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
@keyframes shimmer{to{background-position:220% center}}
@keyframes gradientDrift{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}}
