/* RoomHex panel design system · self-hosted, no external runtime deps.
   Tokenized: spacing/type/radius/weight/z/motion scales; every component
   consumes tokens so sizing and spacing stay consistent across panels. */

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body,h1,h2,h3,h4,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}
[inert]{pointer-events:none}
:focus-visible{outline:2px solid var(--ring);outline-offset:2px;border-radius:var(--r-xs)}
html,body{overflow-x:hidden}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* ---- theme tokens ---- */
:root{
  /* surfaces / borders / text */
  --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:#9aa8c7; --faint:#8592ad;
  /* brand / accent (themed per panel) */
  --brand:#3b82f6; --brand-2:#22d3ee; --accent:#8b5cf6; --accent-2:#22d3ee;
  /* status */
  --good:#34d399; --warn:#fbbf24; --danger:#fb7185; --info:#60a5fa;
  --good-2:#6ee7b7; --warn-2:#fcd34d; --danger-2:#e11d48; --danger-soft:#fda4af;
  --ring:#38bdf8;
  --on-brand:#ffffff; --on-danger:#1a0410; --on-good:#04231a; --on-hero:#cdd8f2; --on-hero-2:#dbe6ff;
  /* spacing scale (8px base, 4px half-steps) */
  --s-1:4px; --s-2:8px; --s-3:12px; --s-4:16px; --s-5:20px; --s-6:24px; --s-8:32px; --s-10:40px; --s-12:48px;
  /* type scale */
  --fs-3xs:10px; --fs-2xs:11px; --fs-xs:12px; --fs-sm:13px; --fs-base:14px; --fs-md:15px;
  --fs-lg:17px; --fs-xl:20px; --fs-2xl:24px; --fs-3xl:30px;
  /* radius scale */
  --r-xs:6px; --r-sm:8px; --r-md:10px; --r-lg:12px; --r-xl:16px; --r-2xl:20px; --r-full:999px;
  /* elevation */
  --shadow:0 24px 60px rgba(2,6,18,.5); --shadow-sm:0 6px 18px rgba(2,6,18,.35);
  /* z-index scale */
  --z-nav:60; --z-topbar:70; --z-scrim:80; --z-drawer:90; --z-menu:100; --z-modal:110; --z-toast:120;
  /* motion */
  --dur-fast:.15s; --dur:.2s; --dur-slow:.26s; --ease:cubic-bezier(.2,.7,.2,1);
  /* layout */
  --sidebar-w:274px; --sidebar-rail:64px; --topbar-h:64px; --page-max:1500px;
  --control-h:40px; /* single height for every interactive header control */
  /* hero gradient stops */
  --hero-a:#1e3a8a; --hero-b:#0b1226; --hero-c:#22d3ee;
  --scrim:rgba(4,7,16,.62);
  --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); font-size:var(--fs-base);
  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:var(--s-2);z-index:var(--z-toast);background:var(--brand);color:var(--on-brand);padding:var(--s-2) var(--s-4);border-radius:var(--r-sm)}
.skip-link:focus{left:var(--s-2)}

/* ---- 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:var(--z-nav);
}
.sidebar-head{display:flex;align-items:center;gap:var(--s-3);padding:var(--s-4) var(--s-4) var(--s-3)}
.brand{display:flex;align-items:center;gap:var(--s-3);min-width:0}
.brand-mark{width:40px;height:40px;display:grid;place-items:center;border-radius:var(--r-md);color:var(--on-brand)}
.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:var(--fs-2xs);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:var(--s-2) var(--s-3) var(--s-4);display:flex;flex-direction:column;gap:2px;scrollbar-width:thin}
.nav-item,.nav-parent{position:relative;display:flex;align-items:center;gap:var(--s-3);width:100%;padding:var(--s-2) var(--s-3);border-radius:var(--r-md);color:var(--muted);font-size:var(--fs-base);font-weight:500;transition:background var(--dur) var(--ease),color var(--dur) var(--ease),transform var(--dur) var(--ease)}
.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:var(--on-brand);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;left:3px;top:20%;bottom:20%;width:3px;border-radius:var(--r-full);background:var(--brand-2)}
.nav-caret{margin-left:auto;transition:transform var(--dur-slow) var(--ease)}.nav-caret .ic{width:16px;height:16px}
/* collapse: single inner wrapper so 0fr->1fr fully collapses ALL children */
.nav-children{display:grid;grid-template-rows:0fr;transition:grid-template-rows var(--dur-slow) var(--ease)}
.nav-children-inner{overflow:hidden;min-height:0;display:flex;flex-direction:column;gap:2px}
.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:var(--s-2);padding:var(--s-2) var(--s-3) var(--s-2) var(--s-8);border-radius:var(--r-md);color:var(--faint);font-size:var(--fs-sm)}
.nav-child:hover{color:var(--text);background:var(--surface-2)}
.nav-child.is-active{color:var(--text)}
.nav-child .nav-label{line-height:1.35}
.nav-dot{width:5px;height:5px;border-radius:var(--r-full);background:currentColor;opacity:.5;flex:none}
.nav-child.is-active .nav-dot{background:var(--brand-2);opacity:1;box-shadow:0 0 8px var(--brand-2)}

.sidebar-foot{padding:var(--s-3)}
.scope-card{display:flex;align-items:center;gap:var(--s-3);padding:var(--s-3);border:1px solid var(--border);border-radius:var(--r-lg);background:var(--surface)}
.scope-dot{width:9px;height:9px;border-radius:var(--r-full)}
.scope-title{font-size:var(--fs-sm);font-weight:600}.scope-sub{font-size:var(--fs-2xs);color:var(--faint)}
.sidebar-collapse .ic{transition:transform var(--dur) var(--ease)}

/* ---- desktop collapsible icon-rail (applies only above the drawer breakpoint) ---- */
@media(min-width:1081px){
  .app[data-rail]{--sidebar-w:var(--sidebar-rail)}
  .app[data-rail] .brand-text,.app[data-rail] .nav-label,.app[data-rail] .nav-caret,
  .app[data-rail] .scope-title,.app[data-rail] .scope-sub{display:none}
  .app[data-rail] .nav-children{display:none}
  .app[data-rail] .sidebar-head{flex-direction:column;gap:var(--s-2);align-items:center;padding:var(--s-3) 0}
  .app[data-rail] .brand{justify-content:center;gap:0}
  .app[data-rail] .sidebar-collapse{margin-left:0}
  .app[data-rail] .sidebar-collapse .ic{transform:rotate(-90deg)}
  .app[data-rail] .nav{padding:var(--s-2)}
  .app[data-rail] .nav-item,.app[data-rail] .nav-parent{justify-content:center;padding-left:0;padding-right:0}
  .app[data-rail] .nav-item:hover,.app[data-rail] .nav-parent:hover{transform:none}
  .app[data-rail] .nav-item.is-active::before{display:none}
  .app[data-rail] .sidebar-foot{padding:var(--s-2)}
  .app[data-rail] .scope-card{justify-content:center;padding:var(--s-2)}
}

/* ---- topbar ---- */
.topbar{position:sticky;top:0;z-index:var(--z-topbar);height:var(--topbar-h);display:flex;align-items:center;gap:var(--s-4);padding:0 var(--s-5);
  background:color-mix(in srgb,var(--bg-2) 82%,transparent);backdrop-filter:blur(14px);border-bottom:1px solid var(--border)}
.icon-btn.nav-open{display:none} /* hamburger: desktop hidden; shown only in the drawer breakpoint */
.icon-btn{width:var(--control-h);height:var(--control-h);display:grid;place-items:center;border-radius:var(--r-md);color:var(--muted);border:1px solid transparent;transition:var(--dur) var(--ease)}
.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:var(--r-sm);background:var(--danger);color:var(--on-danger);font-size:var(--fs-3xs);font-weight:700;display:grid;place-items:center}
.tenant{display:flex;align-items:center;gap:var(--s-3);min-width:0}
.tenant-badge{font-size:var(--fs-2xs);font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:var(--brand-2);border:1px solid var(--border-2);padding:4px var(--s-2);border-radius:var(--r-sm);background:color-mix(in srgb,var(--brand) 12%,transparent)}
.tenant-name{font-weight:600;font-size:var(--fs-base);display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:220px}
.tenant-scope{font-size:var(--fs-2xs);color:var(--faint)}
.search-trigger{display:flex;align-items:center;gap:var(--s-2);height:var(--control-h);margin-left:var(--s-2);padding:0 var(--s-3);border-radius:var(--r-md);border:1px solid var(--border);background:var(--surface);color:var(--muted);font-size:var(--fs-sm);min-width:220px;transition:var(--dur) var(--ease)}
.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:var(--fs-3xs);padding:2px 5px;border-radius:var(--r-xs);border:1px solid var(--border-2);background:var(--bg);color:var(--muted)}
.topbar-actions{margin-left:auto;display:flex;align-items:center;gap:var(--s-2)}
.health-pill{display:inline-flex;align-items:center;gap:var(--s-2);height:var(--control-h);font-size:var(--fs-xs);font-weight:600;padding:0 var(--s-3);border-radius:var(--r-full);border:1px solid var(--border);background:var(--surface)}
.pulse-dot{width:8px;height:8px;border-radius:var(--r-full);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:var(--s-2);height:var(--control-h);padding:0 var(--s-2) 0 4px;border-radius:var(--r-lg);border:1px solid transparent;transition:var(--dur) var(--ease)}
.user-btn:hover{border-color:var(--border);background:var(--surface-2)}
.avatar{width:30px;height:30px;border-radius:var(--r-sm);display:grid;place-items:center;font-size:var(--fs-2xs);font-weight:700;color:var(--on-brand);background:linear-gradient(135deg,var(--brand),var(--accent));flex:none}
.user-text{display:flex;flex-direction:column;line-height:1.15;min-width:0}
.user-name{font-size:var(--fs-xs);font-weight:600;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:120px}.user-role{font-size:var(--fs-3xs);color:var(--faint)}
.user-btn .ic{width:16px;height:16px;color:var(--faint)}

/* ---- menus ---- */
.menu{position:relative}
.menu-panel{position:absolute;top:calc(100% + var(--s-2));right:0;width:280px;padding:var(--s-2);border-radius:var(--r-lg);border:1px solid var(--border-2);
  background:var(--bg-2);box-shadow:var(--shadow-sm);z-index:var(--z-menu);animation:pop var(--dur-fast) var(--ease)}
.menu-title{font-size:var(--fs-2xs);text-transform:uppercase;letter-spacing:.6px;color:var(--faint);padding:var(--s-2)}
.menu-link{display:flex;align-items:center;gap:var(--s-3);width:100%;padding:var(--s-2) var(--s-3);border-radius:var(--r-md);font-size:var(--fs-sm);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:var(--s-2) 2px}
.note{display:flex;gap:var(--s-3);align-items:flex-start;padding:var(--s-2);border-radius:var(--r-md)}
.note:hover{background:var(--surface-2)}
.note-dot{width:8px;height:8px;border-radius:var(--r-full);margin-top:5px;background:var(--info)}
.note-good .note-dot{background:var(--good)}.note-warn .note-dot{background:var(--warn)}.note-danger .note-dot{background:var(--danger)}
.note-title{font-size:var(--fs-sm);font-weight:600}.note-sub{font-size:var(--fs-2xs);color:var(--faint)}
.note-time{margin-left:auto;font-size:var(--fs-2xs);color:var(--faint)}

/* ---- page ---- */
.page{padding:var(--s-6) var(--s-6) var(--s-10);max-width:var(--page-max);width:100%;margin:0 auto;animation:enter .4s var(--ease)}
.pagehead{display:flex;align-items:flex-end;gap:var(--s-4);flex-wrap:wrap;margin-bottom:var(--s-6)}
.pagehead-main{min-width:0}
.crumbs{display:flex;align-items:center;gap:var(--s-2);font-size:var(--fs-xs);color:var(--faint);margin-bottom:var(--s-2)}
.crumbs a:hover{color:var(--text)}.crumb-sep{opacity:.5}
.crumb-current{color:var(--muted)}
.page-title{font-size:clamp(var(--fs-2xl),3.2vw,var(--fs-3xl));font-weight:700;letter-spacing:-.02em}
.page-sub{color:var(--muted);margin-top:var(--s-1);font-size:var(--fs-base)}
.pagehead .btn{margin-left:auto}

/* ---- buttons ---- */
.btn{display:inline-flex;align-items:center;gap:var(--s-2);padding:var(--s-2) var(--s-4);border-radius:var(--r-lg);font-size:var(--fs-sm);font-weight:600;border:1px solid transparent;transition:transform var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease),background var(--dur-fast) var(--ease);white-space:nowrap}
.btn .ic{width:17px;height:17px}
.btn:hover{transform:translateY(-1px)}
.btn:disabled,.btn[aria-disabled="true"]{opacity:.55;transform:none;cursor:not-allowed;box-shadow:none}
.btn-primary{color:var(--on-brand);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:var(--on-brand);background:linear-gradient(120deg,var(--danger-2),var(--danger))}
.btn-subtle{color:var(--muted);background:var(--surface-2)}
.btn-sm{padding:var(--s-1) var(--s-3);font-size:var(--fs-xs)}
.stepup-tag{font-size:var(--fs-3xs);font-weight:700;text-transform:uppercase;letter-spacing:.4px;padding:2px var(--s-1);border-radius:var(--r-xs);background:rgba(0,0,0,.25);border:1px solid rgba(255,255,255,.15)}

/* ---- hero ---- */
.hero{position:relative;overflow:hidden;border-radius:var(--r-2xl);padding:var(--s-8);margin-bottom:var(--s-6);
  border:1px solid var(--border-2);display:flex;gap:var(--s-6);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:var(--fs-2xs);font-weight:700;letter-spacing:.8px;text-transform:uppercase;color:var(--brand-2);margin-bottom:var(--s-2)}
.hero-title{font-size:clamp(var(--fs-2xl),3.6vw,var(--fs-3xl));font-weight:700;letter-spacing:-.02em;line-height:1.1}
.hero-sub{color:var(--on-hero);margin-top:var(--s-3);font-size:var(--fs-md);max-width:52ch}
.hero-actions{display:flex;gap:var(--s-3);margin-top:var(--s-5);flex-wrap:wrap}
.hero-stats{position:relative;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--s-3);min-width:260px}
.hero-stat{padding:var(--s-4);border-radius:var(--r-lg);background:rgba(4,8,20,.42);border:1px solid var(--border);backdrop-filter:blur(6px)}
.hero-stat-val{font-size:var(--fs-2xl);font-weight:700;display:block;line-height:1}
.hero-stat-label{font-size:var(--fs-xs);color:var(--muted)}
.trend{font-size:var(--fs-2xs);font-weight:700;padding:2px var(--s-2);border-radius:var(--r-xs)}
.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:var(--s-4);margin-bottom:var(--s-6)}
.kpi{position:relative;overflow:hidden;padding:var(--s-5);border-radius:var(--r-xl);border:1px solid var(--border);background:var(--surface);transition:transform var(--dur) var(--ease),border-color var(--dur) var(--ease),box-shadow var(--dur) var(--ease)}
.kpi:hover{transform:translateY(-3px);border-color:var(--border-2);box-shadow:var(--shadow-sm)}
.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;gap:var(--s-2);margin-bottom:var(--s-3)}
.kpi-ic{width:34px;height:34px;border-radius:var(--r-md);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:var(--fs-2xl);font-weight:700;letter-spacing:-.02em}
.kpi-label{font-size:var(--fs-xs);color:var(--muted);margin-top:2px}
.kpi-spark{display:flex;align-items:flex-end;gap:2px;height:20px;margin-top:var(--s-2)}
.kpi-spark i{flex:1;background:color-mix(in srgb,var(--brand-2) 55%,transparent);border-radius:2px;min-height:2px}

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

/* ---- empty state (block-level) ---- */
.empty-block{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:var(--s-2);padding:var(--s-8) var(--s-4);color:var(--faint)}
.empty-block .ic{width:26px;height:26px;opacity:.7}
.empty-block strong{color:var(--muted);font-weight:600;font-size:var(--fs-sm)}
.empty-block span{font-size:var(--fs-xs);max-width:40ch}

/* ---- table ---- */
.table-wrap{overflow-x:auto;border-radius:var(--r-lg);border:1px solid var(--border)}
.table{width:100%;border-collapse:collapse;font-size:var(--fs-sm);min-width:520px}
.table th{text-align:left;font-size:var(--fs-2xs);text-transform:uppercase;letter-spacing:.5px;color:var(--faint);font-weight:700;padding:var(--s-3);border-bottom:1px solid var(--border);white-space:nowrap;background:color-mix(in srgb,var(--bg-2) 40%,transparent)}
.table td{padding:var(--s-3);border-bottom:1px solid var(--border);vertical-align:middle}
.table tbody tr:last-child td{border-bottom:0}
.table tbody tr{transition:background var(--dur-fast) var(--ease)}
.table tbody tr:hover{background:var(--surface-2)}
.table .col-actions{text-align:right;width:1%;white-space:nowrap}
.cell-lead{display:inline-flex;align-items:center;gap:var(--s-2)}
.cell-lead .ic{width:16px;height:16px;color:var(--faint)}
.cell-sub{display:block;font-size:var(--fs-2xs);color:var(--faint);margin-top:2px}
.data-actions{display:inline-flex;gap:var(--s-1);justify-content:flex-end}
.row-act{width:28px;height:28px;display:grid;place-items:center;border-radius:var(--r-sm);color:var(--faint);border:1px solid transparent}
.row-act:hover{color:var(--text);background:var(--surface-2);border-color:var(--border)}
.row-act .ic{width:15px;height:15px}
.table-foot{display:flex;align-items:center;justify-content:space-between;gap:var(--s-3);padding:var(--s-3) 2px 0;font-size:var(--fs-xs);color:var(--faint);flex-wrap:wrap}
.filter-bar{display:flex;align-items:center;gap:var(--s-2);flex-wrap:wrap;margin-bottom:var(--s-3)}
.filter-chip{display:inline-flex;align-items:center;gap:var(--s-1);font-size:var(--fs-xs);color:var(--muted);padding:var(--s-1) var(--s-3);border-radius:var(--r-full);border:1px solid var(--border-2);background:var(--surface)}
.filter-chip.is-on{color:var(--text);border-color:color-mix(in srgb,var(--brand) 45%,transparent);background:color-mix(in srgb,var(--brand) 14%,transparent)}
.chip{display:inline-flex;align-items:center;gap:var(--s-1);font-size:var(--fs-2xs);font-weight:600;padding:2px var(--s-2);border-radius:var(--r-full);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(160px,1fr));gap:var(--s-3)}
.mini{display:flex;flex-direction:column;gap:2px;padding:var(--s-4);border-radius:var(--r-lg);border:1px solid var(--border);background:var(--bg-2);transition:transform var(--dur) var(--ease),border-color var(--dur) var(--ease),box-shadow var(--dur) var(--ease)}
.mini:hover{transform:translateY(-3px);border-color:var(--border-2);box-shadow:var(--shadow-sm)}
.mini-ic{width:32px;height:32px;border-radius:var(--r-md);display:grid;place-items:center;color:var(--brand-2);background:color-mix(in srgb,var(--brand) 14%,transparent);margin-bottom:var(--s-2)}
.mini-ic .ic{width:18px;height:18px}
.mini-val{font-size:var(--fs-lg);font-weight:700}
.mini-label{font-size:var(--fs-xs);color:var(--muted)}.mini-sub{font-size:var(--fs-2xs);color:var(--faint)}

/* ---- feeds ---- */
.feed{display:flex;flex-direction:column;gap:2px}
.feed-item{display:flex;align-items:center;gap:var(--s-3);padding:var(--s-2);border-radius:var(--r-md);position:relative}
.feed-item:hover{background:var(--surface-2)}
.feed-ic{width:34px;height:34px;border-radius:var(--r-md);display:grid;place-items:center;flex:none;background:var(--surface-2)}
.feed-ic .ic{width:18px;height:18px}
.feed-title{font-size:var(--fs-sm);font-weight:600;display:block}
.feed-sub{font-size:var(--fs-xs);color:var(--faint)}
.feed-meta{font-size:var(--fs-2xs);color:var(--muted)}
.feed-right{margin-left:auto;display:flex;flex-direction:column;align-items:flex-end;gap:2px}
.feed-time{font-size:var(--fs-2xs);color:var(--faint);white-space:nowrap}
.feed-timeline .feed-item{padding-left:var(--s-6)}
.feed-timeline .feed-item::before{content:"";position:absolute;left:var(--s-2);top:0;bottom:0;width:2px;background:var(--border)}

/* ---- health meters ---- */
.health-list{display:flex;flex-direction:column;gap:var(--s-3)}
.health-row{display:grid;grid-template-columns:minmax(120px,180px) 1fr 48px;align-items:center;gap:var(--s-3)}
.health-name{font-size:var(--fs-sm);font-weight:600;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.health-sub{font-size:var(--fs-2xs);color:var(--faint)}
.meter{height:8px;border-radius:var(--r-full);background:var(--surface-2);overflow:hidden;position:relative}
.meter-fill{position:absolute;inset:0;width:var(--pct);border-radius:var(--r-full);background:linear-gradient(90deg,var(--brand),var(--brand-2));animation:grow 1s var(--ease) both}
.fill-good{background:linear-gradient(90deg,var(--good),var(--good-2))}
.fill-warn{background:linear-gradient(90deg,var(--warn),var(--warn-2))}
.fill-danger{background:linear-gradient(90deg,var(--danger),var(--danger-soft))}
.health-pct{font-size:var(--fs-xs);font-weight:700;text-align:right}

/* ---- matrix ---- */
.matrix th:first-child,.matrix td:first-child{font-weight:600}
.perm{font-size:var(--fs-2xs);font-weight:700;padding:3px var(--s-2);border-radius:var(--r-xs);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:var(--r-xl);padding:var(--s-5);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;gap:var(--s-3);margin-bottom:var(--s-2)}
.lic-state{font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:.6px;color:var(--good);padding:3px var(--s-2);border-radius:var(--r-xs);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:var(--s-4)}
.lic-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--s-3);margin-bottom:var(--s-4)}
.lic-k{display:block;font-size:var(--fs-2xs);color:var(--faint)}.lic-v{font-size:var(--fs-sm);font-weight:600}
.lic-features{display:flex;flex-wrap:wrap;gap:var(--s-2);margin-top:var(--s-3)}

/* ---- key/value detail ---- */
.keyval{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:var(--s-4)}
.keyval-k{display:block;font-size:var(--fs-2xs);color:var(--faint);text-transform:uppercase;letter-spacing:.4px}
.keyval-v{font-size:var(--fs-base);font-weight:600;margin-top:2px}

/* ---- code / snippet ---- */
.code-block{position:relative;background:var(--bg);border:1px solid var(--border);border-radius:var(--r-lg);padding:var(--s-4);overflow-x:auto}
.code-block pre{margin:0;font-family:var(--mono);font-size:var(--fs-sm);color:var(--text);white-space:pre;line-height:1.6}
.code-block+.code-block{margin-top:var(--s-3)}
.code-label{font-size:var(--fs-2xs);color:var(--faint);text-transform:uppercase;letter-spacing:.4px;margin-bottom:var(--s-2)}

/* ---- tabs ---- */
.tabs{display:flex;gap:var(--s-1);border-bottom:1px solid var(--border);margin-bottom:var(--s-4);flex-wrap:wrap}
.tab{padding:var(--s-2) var(--s-3);font-size:var(--fs-sm);font-weight:600;color:var(--muted);border-bottom:2px solid transparent;margin-bottom:-1px}
.tab:hover{color:var(--text)}
.tab.is-active{color:var(--text);border-bottom-color:var(--brand)}
.tabpanel[hidden]{display:none}
.dev-cap{display:flex;align-items:center;gap:var(--s-3);flex-shrink:0}
.dev-active{white-space:nowrap;font-variant-numeric:tabular-nums}
.dev-limit{width:88px;max-width:88px;text-align:center;font-variant-numeric:tabular-nums}

/* ---- forms ---- */
.form-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--s-4)}
.field{grid-column:span 12;display:flex;flex-direction:column;gap:var(--s-2)}
.field-section{grid-column:span 12;font-size:var(--fs-2xs);text-transform:uppercase;letter-spacing:.5px;color:var(--faint);font-weight:700;margin-top:var(--s-3);padding-bottom:var(--s-1);border-bottom:1px solid var(--border)}
.field label{font-size:var(--fs-xs);font-weight:600;color:var(--muted)}
.req{color:var(--danger)}
.field input,.field select,.field textarea{padding:var(--s-3);border-radius:var(--r-lg);border:1px solid var(--border-2);background:var(--bg-2);color:var(--text);font-size:var(--fs-md);transition:border-color var(--dur-fast) var(--ease),box-shadow var(--dur-fast) var(--ease)}
.field textarea{min-height:96px;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,.field select:disabled,.field textarea:disabled{opacity:.6}
.field-help{font-size:var(--fs-2xs);color:var(--faint)}
.pw-field{position:relative;display:flex;align-items:stretch}
.pw-field input{flex:1;padding-right:76px}
.pw-btn{position:absolute;top:0;height:100%;width:34px;display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;color:var(--muted);cursor:pointer;border-radius:var(--r-lg)}
.pw-btn:hover{color:var(--text)}
.pw-btn.is-on{color:var(--ring)}
.pw-btn .ic{width:18px;height:18px}
.pw-field [data-pw-toggle]{right:38px}
.pw-field [data-pw-generate]{right:4px}
.pw-field input[data-pw]:only-child,.pw-field input[data-pw]:last-child{padding-right:42px}
/* In-page modal for add/edit forms */
body.modal-open{overflow:hidden}
.modal-overlay{position:fixed;inset:0;z-index:120;display:flex;align-items:flex-start;justify-content:center;padding:5vh 16px;background:color-mix(in srgb,#000 62%,transparent);backdrop-filter:blur(4px);overflow-y:auto}
.modal-dialog{width:100%;max-width:760px;background:var(--bg-1,#101523);border:1px solid var(--border-2);border-radius:18px;box-shadow:0 24px 70px rgba(0,0,0,.55);display:flex;flex-direction:column;max-height:90vh;animation:modalIn .18s var(--ease,ease)}
@keyframes modalIn{from{opacity:0;transform:translateY(8px) scale(.99)}to{opacity:1;transform:none}}
.modal-head{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--border-2)}
.modal-title{margin:0;font-size:var(--fs-lg,18px);font-weight:700}
.modal-close{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;color:var(--muted);border-radius:10px;cursor:pointer}
.modal-close:hover{background:var(--bg-2);color:var(--text)}
.modal-close .ic{width:20px;height:20px}
.modal-body{padding:16px 20px 22px;overflow-y:auto}
/* Inside the modal the form cards are flat (the modal is the frame) */
.modal-body .card{background:transparent;border:none;box-shadow:none;padding:0;margin:0}
.modal-body .card:first-child .card-head{display:none} /* modal header already names it */
.modal-body .card + .card{margin-top:18px;padding-top:18px;border-top:1px solid var(--border-2)}
.modal-body .card-head>h2,.modal-body .card>h2{font-size:var(--fs-md,15px)}
.modal-loading{padding:40px 0;text-align:center;color:var(--muted)}
@media (max-width:640px){
  .modal-overlay{padding:0}
  .modal-dialog{max-width:none;min-height:100vh;max-height:100vh;border-radius:0;border:none}
  .modal-body .form-grid{grid-template-columns:1fr}
}
.switch{position:relative;display:inline-flex;width:46px;height:26px}
.switch input{position:absolute;opacity:0}
.switch-track{width:46px;height:26px;border-radius:var(--r-full);background:var(--surface-2);border:1px solid var(--border-2);position:relative;transition:var(--dur) var(--ease)}
.switch-track::after{content:"";position:absolute;top:2px;left:2px;width:20px;height:20px;border-radius:var(--r-full);background:var(--muted);transition:var(--dur) var(--ease)}
.switch input:checked+.switch-track{background:linear-gradient(90deg,var(--brand),var(--accent))}
.switch input:checked+.switch-track::after{transform:translateX(20px);background:var(--on-brand)}
.switch-row{display:flex;align-items:center;justify-content:space-between;gap:var(--s-3);padding:var(--s-3) 0;border-bottom:1px solid var(--border)}
.switch-row:last-child{border-bottom:0}
.switch-row .sr-title{font-size:var(--fs-sm);font-weight:600}
.switch-row .sr-sub{font-size:var(--fs-xs);color:var(--faint)}
.form-actions{display:flex;gap:var(--s-3);margin-top:var(--s-4);flex-wrap:wrap}

/* ---- banner ---- */
.banner{display:flex;align-items:center;gap:var(--s-4);padding:var(--s-4);border-radius:var(--r-lg);border:1px solid var(--border-2)}
.banner-ic{width:38px;height:38px;border-radius:var(--r-md);display:grid;place-items:center;flex:none}
.banner-ic .ic{width:20px;height:20px}
.banner-body{display:flex;flex-direction:column;min-width:0}.banner-body strong{font-size:var(--fs-base)}.banner-body span{font-size:var(--fs-xs);color:var(--muted)}
.banner-actions{margin-left:auto;display:flex;gap:var(--s-2);flex-wrap:wrap}
.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:var(--s-2);flex-wrap:wrap}
.wiz-step{display:flex;align-items:center;gap:var(--s-2);padding:var(--s-2) var(--s-4);border-radius:var(--r-lg);border:1px solid var(--border);background:var(--bg-2);color:var(--muted);font-size:var(--fs-sm);flex:1;min-width:130px}
.wiz-num{width:24px;height:24px;border-radius:var(--r-full);display:grid;place-items:center;font-size:var(--fs-xs);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:var(--on-brand)}
.wiz-step.is-done .wiz-num{background:var(--good);color:var(--on-good)}

/* ---- 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 (full-page) ---- */
.state{min-height:60vh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:var(--s-4);padding:var(--s-10)}
.state-orb{width:96px;height:96px;border-radius:var(--r-2xl);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:var(--fs-2xl);font-weight:700}
.state-sub{color:var(--muted);max-width:46ch}
.state-actions{margin-top:var(--s-2)}

/* ---- command palette ---- */
.palette{position:fixed;inset:0;z-index:var(--z-modal);display:grid;place-items:start center;padding-top:12vh;background:var(--scrim);backdrop-filter:blur(4px);animation:fade var(--dur-fast) var(--ease)}
.palette-card{width:min(620px,92vw);border-radius:var(--r-xl);border:1px solid var(--border-2);background:var(--bg-2);box-shadow:var(--shadow);overflow:hidden;animation:pop var(--dur) var(--ease)}
.palette-input{display:flex;align-items:center;gap:var(--s-3);padding:var(--s-4);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:var(--fs-md)}
.palette-input input:focus{outline:none}
.palette-list{max-height:52vh;overflow-y:auto;padding:var(--s-2)}
.palette-item{display:flex;align-items:center;gap:var(--s-3);padding:var(--s-3);border-radius:var(--r-md);color:var(--muted);cursor:pointer;font-size:var(--fs-sm)}
.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:var(--fs-2xs);color:var(--faint)}
.palette-empty{padding:var(--s-6);text-align:center;color:var(--faint);font-size:var(--fs-sm)}

/* ---- toast ---- */
.toast-host{position:fixed;right:var(--s-5);bottom:var(--s-5);z-index:var(--z-toast);display:flex;flex-direction:column;gap:var(--s-3)}
.toast{display:flex;align-items:center;gap:var(--s-3);padding:var(--s-3) var(--s-4);border-radius:var(--r-lg);border:1px solid var(--border-2);background:var(--bg-2);box-shadow:var(--shadow-sm);font-size:var(--fs-sm);animation:slidein var(--dur) var(--ease)}

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

.scrim{position:fixed;inset:0;background:var(--scrim);z-index:var(--z-scrim);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 (breakpoints: 640 / 820 / 1080) ---- */
@media(max-width:1080px){
  :root{--control-h:44px} /* larger touch targets on tablet/phone */
  .app{grid-template-columns:1fr}
  .app[data-rail]{--sidebar-w:274px} /* rail never applies to the mobile drawer */
  .sidebar{position:fixed;left:0;top:0;width:min(300px,86vw);transform:translateX(-105%);transition:transform var(--dur-slow) var(--ease);z-index:var(--z-drawer)}
  .app[data-open] .sidebar{transform:none}
  .icon-btn.nav-open{display:grid}
  /* search stays reachable as an icon-button that opens the palette */
  .search-trigger span,.search-trigger kbd{display:none}
  .search-trigger{min-width:0;width:var(--control-h);padding:0;justify-content:center;margin-left:0}
  .user-text{display:none}
  .nav-child{padding-top:var(--s-3);padding-bottom:var(--s-3)}
  /* tablet band: sidebar is a drawer, so relax cramped spans before full stack */
  .span-3,.span-4{grid-column:span 6}
  .span-7,.span-8,.span-9{grid-column:span 12}
}
@media(min-width:1081px){.scrim{display:none!important}}
@media(max-width:820px){
  .span-3,.span-4,.span-5,.span-6,.span-7,.span-8,.span-9{grid-column:span 12}
  .hero{padding:var(--s-5)}.hero-stats{grid-template-columns:repeat(2,1fr);width:100%}
  .field.span-6,.field.span-4{grid-column:span 12}
  .page{padding:var(--s-4) var(--s-4) var(--s-8)}
  .tenant-text{display:none}
  .keyval{grid-template-columns:repeat(2,1fr)}
}
@media(max-width:640px){
  .hero-stats{grid-template-columns:1fr}
  .kpi-row{grid-template-columns:repeat(2,1fr)}
  .health-row{grid-template-columns:1fr;gap:var(--s-1)}.meter{grid-column:1}
  .health-pill{display:none} /* system-health is a desktop-ops concern; drop the ambiguous bare dot on phones */
  .keyval{grid-template-columns:1fr}
  /* stacked table rows on phones for regular (non-matrix) tables */
  .table-stack{min-width:0}
  .table-stack thead{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
  .table-stack tbody tr{display:block;border:1px solid var(--border);border-radius:var(--r-md);margin-bottom:var(--s-3);padding:var(--s-2)}
  .table-stack tbody td{display:flex;justify-content:space-between;gap:var(--s-3);border:0;padding:var(--s-2);text-align:right}
  .table-stack tbody td::before{content:attr(data-label);color:var(--faint);font-size:var(--fs-2xs);text-transform:uppercase;letter-spacing:.4px;text-align:left}
  .table-stack .col-actions{justify-content:flex-end}
}

@media(prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}
  .pulse-dot,.orb,.login-aside-glow{animation:none!important}
}
/* Manual "reduced motion" toggle (data-theme-toggle), independent of the OS setting. */
:root.reduce-motion *,:root.reduce-motion *::before,:root.reduce-motion *::after{
  animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}
:root.reduce-motion .pulse-dot,:root.reduce-motion .orb,:root.reduce-motion .login-aside-glow{animation:none!important}

/* ---- 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:var(--s-12) var(--s-12);display:flex;flex-direction:column;justify-content:center;gap:var(--s-5);
  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:var(--s-3);margin-bottom:var(--s-2)}
.login-brand .brand-mark{width:44px;height:44px}.login-brand .brand-name{font-size:var(--fs-xl);font-weight:700}
.login-headline{position:relative;font-size:clamp(var(--fs-2xl),3vw,var(--fs-3xl));font-weight:700;letter-spacing:-.02em;max-width:16ch;line-height:1.12}
.login-tag{position:relative;color:var(--on-hero);max-width:44ch}
.login-points{position:relative;display:flex;flex-direction:column;gap:var(--s-3);margin-top:var(--s-3)}
.login-points li{display:flex;align-items:center;gap:var(--s-3);color:var(--on-hero-2);font-size:var(--fs-base)}
.login-points .ic{width:20px;height:20px;color:var(--brand-2)}
.login-card{display:flex;flex-direction:column;justify-content:center;gap:var(--s-5);padding:var(--s-12) clamp(var(--s-6),6vw,84px);max-width:560px;width:100%;margin:0 auto}
.login-card-head{display:flex;flex-direction:column;gap:var(--s-2);margin-bottom:var(--s-2)}
.login-mark{width:46px;height:46px;margin-bottom:var(--s-2)}
.login-card-head h2{font-size:var(--fs-2xl);font-weight:700}
.login-card-head p{color:var(--muted);font-size:var(--fs-base)}
.login-error{display:flex;align-items:center;gap:var(--s-3);padding:var(--s-3) var(--s-4);border-radius:var(--r-lg);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:var(--fs-sm)}
.login-error .ic{width:19px;height:19px;flex:none}
.login-form{display:flex;flex-direction:column;gap:var(--s-4)}
.login-form .field{display:flex;flex-direction:column;gap:var(--s-2)}
.login-form .field span{font-size:var(--fs-xs);font-weight:600;color:var(--muted)}
.login-form input{padding:var(--s-3) var(--s-4);border-radius:var(--r-lg);border:1px solid var(--border-2);background:var(--bg-2);color:var(--text);font-size:var(--fs-md)}
.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:var(--s-2);padding:var(--s-3) var(--s-4);font-size:var(--fs-base)}
.login-foot{color:var(--faint);font-size:var(--fs-xs);margin-top:var(--s-2)}
.menu-logout{width:100%}
@media(max-width:820px){
  .login{grid-template-columns:1fr}
  .login-aside{display:none}
  .login-card{min-height:100vh}
}

/* ---- login puzzle captcha ---- */
.cap{display:flex;flex-direction:column;gap:var(--s-2)}
.cap-label{font-size:var(--fs-xs);font-weight:600;color:var(--muted)}
.cap-frame{position:relative;border-radius:var(--r-lg);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 var(--dur) var(--ease)}
.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:var(--s-2);text-align:center;font-size:var(--fs-xs);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:var(--r-lg);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:var(--r-lg);background:linear-gradient(135deg,var(--brand),var(--accent));color:var(--on-brand);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:var(--r-full);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 var(--ease) both}
.login-form .field,.login-form .cap,.login-submit{animation:fieldIn .5s var(--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%}}
