/* moreweb dash — dark, restrained; palette matches the auth login screen.
   Spacing: the house scale (daemon/DESIGN.md) as tokens — every gap,
   padding, and margin is one of these seven steps:
     4 row · 8 tight · 12 compact · 16 base · 20 field · 24 section · 32 canvas */
@font-face{font-family:Poppins;font-weight:100;font-style:normal;font-display:swap;src:url(/fonts/poppins-100.woff2) format('woff2')}
@font-face{font-family:Poppins;font-weight:300;font-style:normal;font-display:swap;src:url(/fonts/poppins-300.woff2) format('woff2')}
@font-face{font-family:Poppins;font-weight:400;font-style:normal;font-display:swap;src:url(/fonts/poppins-400.woff2) format('woff2')}
@font-face{font-family:Poppins;font-weight:500;font-style:normal;font-display:swap;src:url(/fonts/poppins-500.woff2) format('woff2')}
@font-face{font-family:Poppins;font-weight:600;font-style:normal;font-display:swap;src:url(/fonts/poppins-600.woff2) format('woff2')}
@font-face{font-family:Silkscreen;font-style:normal;font-display:swap;src:url(/fonts/silkscreen-400.woff2) format('woff2')}

:root{
  color-scheme:dark;
  /* dash ↔ DESIGN.md (daemon) token mapping — user-panel roles:
     --bg canvas · --surface/--raised surface/surface-hover tiers ·
     --text text-main · --muted text-dim · --accent action-lavender ·
     --violet accent · --violet-soft panel-focus · --line border ·
     --line-input input-line · --line-hover border-hover ·
     --ok good · --bad danger · --bad-bg danger-bg ·
     --nav-on admin-active · --nav-on-text admin-active-text */
  --bg:#0a0a0c;--surface:#141417;--raised:#1a1a1f;--hover:#1b1b20;--text:#eeeef0;--muted:#aaaab5;
  --accent:#d19ae8;--accent-ink:#250e2d;--violet:#bf00ff;--violet-soft:#dea6ff;
  --line:#414149;--line-input:#4b4b55;--line-hover:#3d3d44;--edge:#2d2d32;--edge-row:#232329;
  --ok:#9bdcc2;--ok-line:#2e5945;
  --bad:#ffadb6;--bad-bg:#40252b;--bad-line:#72424b;--bad-text:#ffc7ce;
  --nav-on:#382042;--nav-on-text:#f0d6ff;
  --ink-2:#d4d4db;
  --accent-hover:#e3b7f4;--selection:#793b96;
  --callout-bg:#241a2b;--callout-line:#59396a;--well:#101014;
  --tile-ink:#c9c9d4;
  --glow:rgba(191,0,255,.8);--glow-dot:rgba(191,0,255,.7);
  --sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:20px;--sp-6:24px;--sp-7:32px;
  accent-color:var(--violet);
}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--text);font:14px/1.6 Poppins,system-ui,sans-serif}
a{color:var(--accent);text-underline-offset:4px}
:focus-visible{outline:2px solid var(--violet-soft);outline-offset:4px}
::selection{background:var(--selection);color:#fff}
input,select,textarea,button{font:inherit;color:var(--text)}
/* Field density per DESIGN.md admin spec: 42px minimum height, 9/11
   padding — the dash is an admin surface, not the compact user panel. */
input,select,textarea{background:var(--surface);border:1px solid var(--line);border-radius:5px;min-height:42px;padding:9px 11px;transition:border-color .15s ease,background-color .15s ease}
input:hover,select:hover,textarea:hover{border-color:var(--line-input)}
input:focus,select:focus,textarea:focus{border-color:var(--violet-soft)}
select{appearance:none;-webkit-appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23aaaab5' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center;padding-right:36px}
input::placeholder,textarea::placeholder{color:var(--muted)}
label{display:block;margin:0 0 var(--sp-2);font-weight:500;font-size:13px}
button{background:var(--accent);color:var(--accent-ink);border:1px solid var(--accent);border-radius:5px;font-weight:600;padding:9px 16px;min-height:42px;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,color .15s ease,opacity .15s ease}
button:hover{background:var(--accent-hover)}
button.ghost{background:var(--surface);border-color:var(--line);color:var(--text);font-weight:400}
button.ghost:hover{background:var(--hover);border-color:var(--line-hover)}
button.danger{background:transparent;border-color:var(--bad-line);color:var(--bad);font-weight:500}
button.danger:hover{background:var(--bad-bg)}
button:disabled{opacity:.55;cursor:default}
/* Visually hidden, available to screen readers (table action columns,
   icon-only buttons with no label). */
.vh{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
/* Skip link: off-screen until keyboard focus reveals it at the top. */
.skip{position:fixed;top:var(--sp-2);left:var(--sp-2);transform:translateY(-200%);transition:transform .15s ease;z-index:70}
.skip:focus{transform:translateY(0)}

.noscript{padding:40px;max-width:40ch;margin:0 auto;color:var(--muted)}
.fatal{min-height:100svh;display:grid;place-items:center;padding:var(--sp-6)}
.fatal div{max-width:46ch;text-align:center}
.fatal h1{font-weight:400;font-size:24px;margin:0 0 var(--sp-2)}
.fatal p{color:var(--muted)}

.shell{display:grid;grid-template-columns:220px 1fr;min-height:100svh}
.side{border-right:1px solid var(--edge);padding:var(--sp-7) var(--sp-5);display:flex;flex-direction:column;gap:var(--sp-6);position:sticky;top:0;height:100svh}
.brand{font-size:22px;font-weight:100;letter-spacing:-.03em;text-decoration:none;color:var(--text);padding-left:var(--sp-3);line-height:1.3}
.brand .m{text-shadow:0 0 15px var(--glow)}
.side nav{display:flex;flex-direction:column;gap:var(--sp-2)}
.side nav a{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-3) var(--sp-4);border-radius:6px;text-decoration:none;color:var(--muted);font-weight:400;transition:background-color .15s ease,color .15s ease}
.side nav a:hover{color:var(--text);background:var(--hover)}
.side nav a.active{color:var(--nav-on-text);background:var(--nav-on);font-weight:500}
.nav-ic{flex-shrink:0}
.who{margin-top:auto;font-size:12px;color:var(--muted)}
.who .email{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-bottom:var(--sp-2)}

main{padding:var(--sp-7) clamp(var(--sp-6),5vw,64px);max-width:980px;width:100%}
h1{font-size:24px;font-weight:500;letter-spacing:-.02em;line-height:1.25;margin:0 0 var(--sp-3)}
.sub{color:var(--muted);margin:0 0 var(--sp-7)}
.tab-head{display:flex;align-items:center;gap:var(--sp-3);margin:0 0 var(--sp-3)}
.tab-head h1{margin:0}
.tab-head h1:focus{outline:none}
.tab-head .iconbtn{margin-left:auto}
.iconbtn.spinning svg{animation:boot-spin .9s linear infinite}
.stale{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap;margin:0 0 var(--sp-5)}
.stale span{flex:1 1 240px}
.stale button{min-height:32px;padding:4px 12px}
h2{font-size:15px;font-weight:600;line-height:1.4;margin:var(--sp-7) 0 var(--sp-4);color:var(--ink-2)}
main > h2:first-child,.card h2:first-child{margin-top:0}

/* Containers carry the house signature: one corner cut top-left + one
   bottom-right (the status page's move at panel scale). */
.card{background:var(--surface);border:1px solid var(--edge);border-radius:6px;padding:var(--sp-6);margin-bottom:var(--sp-5)}
.grid > .card,.stats > .card{margin-bottom:0}
.card.pad0{padding:0}
.card h2:first-child{margin-top:0}
.grid{display:grid;gap:var(--sp-4)}
.grid.cols2{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}

.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr));gap:var(--sp-5);margin-bottom:var(--sp-7)}
.stat .n{font-size:26px;font-weight:300;line-height:1.3;font-variant-numeric:tabular-nums}
.stat .l{font-size:10px;color:var(--muted);text-transform:lowercase;letter-spacing:-.02em}
.stat .l,.chip{font-family:Silkscreen,sans-serif}
/* Share bars: one series, so one hue (accent) and no legend — the %
   beside each bar is the readable value, the bar only its shape. */
.w-share{width:32%;min-width:140px}
.share-cell{display:flex;align-items:center;gap:var(--sp-3)}
.share{flex:1;height:6px;background:var(--edge-row);border-radius:4px;overflow:hidden}
.share-bar{display:block;height:100%;background:var(--accent);border-radius:0 4px 4px 0;min-width:2px}
.share-n{width:4ch;text-align:right;color:var(--ink-2);font-size:12px}

table{width:100%;border-collapse:collapse;font-size:13px;font-variant-numeric:tabular-nums}
th{color:var(--muted);font-weight:500;text-align:left;padding:var(--sp-3) 12px;border-bottom:1px solid var(--edge);white-space:nowrap}
td{padding:var(--sp-3) 12px;border-bottom:1px solid var(--edge-row);vertical-align:middle}
tr:last-child td{border-bottom:0}
tr.revoked td{color:var(--muted)}
/* Wide tables scroll sideways inside their card instead of the page. */
.table-wrap{overflow-x:auto;scrollbar-width:thin;scrollbar-color:var(--edge) transparent}
.row-actions{display:flex;align-items:center;justify-content:flex-end;gap:var(--sp-2)}
.rm-btn{display:inline-flex;align-items:center;gap:var(--sp-2)}
td.mono,th.mono{overflow-wrap:anywhere}
.mono{font-family:ui-monospace,Menlo,monospace;font-size:12px}
.callout .mono,.copyline .mono{word-break:break-all}
/* The machine voice: Silkscreen, lowercase, for tiny labels the system
   says about itself (the old panel's .pixel recipe). Never body text. */
.pixel{font-family:Silkscreen,sans-serif;text-transform:lowercase;letter-spacing:-.02em}
.dim{color:var(--muted)}
.note{color:var(--muted);margin:var(--sp-2) 0 0}
.mt-compact{margin-top:var(--sp-3)}
.mt-base{margin-top:var(--sp-4)}
.callout-head{margin:0 0 var(--sp-2);font-weight:500}
.check-label{display:flex;gap:var(--sp-3);align-items:center;font-weight:400}
.check{min-height:0;width:18px}
.w-fixed{max-width:280px}
.w-pri{width:70px}
.w-act{width:170px}
.pill{display:inline-block;border:1px solid var(--line);border-radius:99px;padding:1px 10px;font-size:11px;color:var(--muted)}
.pill.on{border-color:var(--ok-line);color:var(--ok)}
.pill.off{border-color:var(--bad-line);color:var(--bad)}

form.stack{display:grid;gap:var(--sp-5);max-width:520px}
.row{display:flex;gap:var(--sp-3) var(--sp-4);flex-wrap:wrap;align-items:flex-end}
.row > *{flex:0 0 auto}
.row input,.row select{flex:1 1 180px}
.row-flex{flex:1 1 180px}
.row-wide{flex:2 1 220px}
.row-wide input{width:100%}
form.stack.pg-form{max-width:760px}
.pg-form .row{align-items:flex-start}
textarea{width:100%;min-height:110px;resize:vertical}
.hint{font-size:12px;color:var(--muted);margin:var(--sp-2) 0 0;line-height:1.5}
.callout{background:var(--callout-bg);border:1px solid var(--callout-line);border-radius:6px;padding:var(--sp-5);margin:var(--sp-5) 0}
.error-box{background:var(--bad-bg);border:1px solid var(--bad-line);color:var(--bad-text);border-radius:6px;padding:var(--sp-3) var(--sp-4);margin:var(--sp-3) 0;font-size:13px}
.form-error{animation:err-in .22s cubic-bezier(.16,1,.3,1)}
@keyframes err-in{from{opacity:0;transform:translateY(-4px)}}
pre{background:var(--well);border:1px solid var(--edge);border-radius:6px;padding:var(--sp-5);overflow:auto;font-size:12.5px;white-space:pre-wrap;word-break:break-word;min-height:52px;margin:0;scrollbar-width:thin;scrollbar-color:var(--edge) transparent}
pre::-webkit-scrollbar{width:10px;height:10px}
pre::-webkit-scrollbar-thumb{background:var(--edge);border-radius:5px}
pre::-webkit-scrollbar-track{background:transparent}
.actions{display:flex;gap:var(--sp-3);margin-top:var(--sp-4)}
.copyline{display:flex;gap:var(--sp-2);align-items:center;flex-wrap:wrap}
.copyline pre.grow{flex:1 1 240px;min-height:0}
.copy-btn{flex-shrink:0;display:inline-flex;align-items:center;gap:var(--sp-2)}

.toast{position:fixed;left:50%;bottom:24px;transform:translateX(-50%);background:var(--raised);border:1px solid var(--line);border-radius:6px;padding:var(--sp-3) var(--sp-5);font-size:13px;box-shadow:0 8px 30px rgba(0,0,0,.5);z-index:50;animation:toast-in .18s cubic-bezier(.16,1,.3,1)}
.toast.out{animation:toast-out .12s ease forwards}
.toast.bad{border-color:var(--bad-line);color:var(--bad-text)}
@keyframes toast-in{from{opacity:0;transform:translateX(-50%) translateY(6px)}}
@keyframes toast-out{to{opacity:0;transform:translateX(-50%) translateY(6px)}}

@media(max-width:760px){
  .shell{grid-template-columns:minmax(0,1fr)}
  .side{position:static;height:auto;border-right:0;border-bottom:1px solid var(--edge);padding:var(--sp-4)}
  .side nav{flex-direction:row;overflow-x:auto;scrollbar-width:thin;scrollbar-color:var(--edge) transparent}
  .who{margin-top:var(--sp-1)}
  main{padding:var(--sp-6) var(--sp-4) 64px}
  /* Nav scrolls sideways; a fade on the right edge says there's more. */
  .side nav{-webkit-mask-image:linear-gradient(90deg,#000 85%,transparent);mask-image:linear-gradient(90deg,#000 85%,transparent);padding-right:var(--sp-6)}
  .side nav a{flex-shrink:0;min-height:44px}
  .who{display:flex;gap:var(--sp-3);align-items:baseline}
  .who .email{margin:0;min-width:0}
  /* Stacked tables: each row becomes a small card, cells label
     themselves from data-label. */
  table.stack-sm thead{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
  table.stack-sm tr{display:grid;grid-template-columns:auto 1fr;gap:var(--sp-1) var(--sp-4);padding:var(--sp-4);border-bottom:1px solid var(--edge-row)}
  table.stack-sm tr:last-child{border-bottom:0}
  table.stack-sm td{display:contents}
  table.stack-sm td[data-label]::before{content:attr(data-label);color:var(--muted);font-size:12px}
  table.stack-sm td:not([data-label]) > *{grid-column:1 / -1;justify-self:start;margin-top:var(--sp-2)}
  .rm-btn span{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
  .rm-btn{min-width:44px;justify-content:center;padding:0}
  .iconbtn{min-width:44px;min-height:44px}
  .col-pri{display:none}
}

/* Boot loader: the dash's loading screen — the m and a spinner, black.
   Lives in #app so the first render (shell, fatal) replaces it; stays
   on screen through the OAuth bounce and the token exchange. */
.boot{position:fixed;inset:0;z-index:60;background:#000;display:grid;place-content:center;justify-items:center;gap:var(--sp-6)}
.boot svg{filter:drop-shadow(0 0 15px var(--glow))}
.boot .loader{width:20px;height:20px;border:1px solid rgba(255,255,255,0.15);border-top-color:#fff;border-radius:50%;animation:boot-spin .9s linear infinite;will-change:transform}
@keyframes boot-spin{to{transform:rotate(360deg)}}

/* Provider rows — the launcher list: brand mark, name, status right, one
   click opens the configure popup. Marks sit bare on the row (no tile);
   connection state rides on the status dot. */
.prows{display:flex;flex-direction:column;gap:var(--sp-3);margin-top:var(--sp-5)}
/* display:flex would override the UA's hidden styling, so the search
   filter's row.hidden would do nothing — [hidden] re-asserts it. */
.prow[hidden]{display:none}
.prow{display:flex;align-items:center;gap:var(--sp-3);width:100%;min-width:0;text-align:left;padding:var(--sp-4) var(--sp-5);background:transparent;color:var(--text);border:1px solid var(--line);border-radius:6px;cursor:pointer;transition:background-color .15s ease,border-color .15s ease}
.prow:hover{background:var(--surface);border-color:var(--line-hover)}
.prow:active{transform:scale(.997)}
/* Rounded like the other row surfaces now — the global focus outline
   applies again, no inset-ring hack needed. */
.prow-add{border-style:dashed}
.prow-id{display:flex;align-items:center;gap:var(--sp-3);min-width:0}
/* Bare marks, no tile: connection state rides on the status dot. */
.plogo{width:28px;height:28px;flex-shrink:0;display:grid;place-items:center;color:var(--tile-ink)}
/* Mark sizes come from providerLogo's aspect-fit width/height
   attributes — no fixed square override, non-square marks keep proportions. */
.plogo svg{max-width:26px;max-height:26px}
.pname{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chip{font-family:Silkscreen,sans-serif;font-size:10px;color:var(--muted);border:1px solid var(--line);border-radius:3px;padding:2px var(--sp-2);flex-shrink:0;text-transform:lowercase;letter-spacing:-.02em}
.prow-status{margin-left:auto;color:var(--muted);font-size:13px;flex-shrink:0;white-space:nowrap}
.prow-status .mono{font-size:12.5px;color:var(--ink-2)}
.prow-status.on{color:var(--ink-2)}
.pdot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--violet);box-shadow:0 0 8px var(--glow-dot);margin-right:var(--sp-2);vertical-align:1px}
.prow-note{margin-left:auto;color:var(--muted);font-size:12.5px;flex-shrink:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pchev{flex-shrink:0;color:var(--muted);transition:transform .15s ease,color .15s ease}
/* Playground conversation: one block per turn, role in the machine voice. */
.pg-system summary{cursor:pointer;font-weight:500;font-size:13px;margin-bottom:var(--sp-2)}
.pg-system textarea{min-height:72px}
.pg-log{display:grid;gap:var(--sp-4)}
.pg-msg{display:grid;gap:var(--sp-1)}
.pg-role{font-size:10px;color:var(--muted)}
.pg-msg.user pre{background:var(--surface)}
.pg-msg.pending pre:empty::after{content:'…';color:var(--muted)}
.pg-msg.failed pre{border-color:var(--bad-line);color:var(--bad-text)}
.prow:hover .pchev{transform:translateX(2px);color:var(--ink-2)}
.pblurb{color:var(--muted);font-size:13px;max-width:64ch;margin:0 0 var(--sp-4)}
.pform{margin-top:var(--sp-6);display:grid;gap:var(--sp-4)}
.provider-search{max-width:280px;width:100%}

/* Provider popups — native <dialog>, body-mounted by D.modal. The
   scrim dims + blurs the page behind (dismissal context, the daemon
   drawer's move); the card is the house cut-corner surface at dialog
   scale (12px). Exits run ~2/3 of the enter duration so closing feels
   faster than opening. */
dialog.modal{background:var(--surface);color:var(--text);border:1px solid var(--edge);padding:0;width:min(520px,calc(100% - 32px));max-height:min(85dvh,640px);margin:auto;display:flex;flex-direction:column;clip-path:polygon(12px 0,100% 0,100% calc(100% - 12px),calc(100% - 12px) 100%,0 100%,0 12px)}
dialog.modal::backdrop{background:rgba(10,10,12,.7);backdrop-filter:blur(4px)}
dialog.modal[open]{animation:modal-in .18s cubic-bezier(.16,1,.3,1)}
dialog.modal[open]::backdrop{animation:backdrop-in .18s ease}
dialog.modal.closing{animation:modal-out .12s ease forwards}
dialog.modal.closing::backdrop{animation:backdrop-out .12s ease forwards}
@keyframes modal-in{from{opacity:0;transform:translateY(10px) scale(.985)}}
@keyframes modal-out{to{opacity:0;transform:translateY(6px) scale(.99)}}
@keyframes backdrop-in{from{opacity:0}}
@keyframes backdrop-out{to{opacity:0}}
.modal-head{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-5) var(--sp-6);border-bottom:1px solid var(--edge-row);flex-shrink:0}
.modal-title{display:flex;align-items:center;gap:var(--sp-3);min-width:0;flex:1;flex-wrap:wrap;font-size:15px;font-weight:500}
.modal-title .pname{white-space:normal;overflow:visible;text-overflow:clip}
.modal-body{padding:var(--sp-6);overflow:auto}
.modal-status{margin:0 0 var(--sp-3);color:var(--muted);font-size:13px}
.modal-status.on{color:var(--ink-2)}
.modal-actions{justify-content:flex-end}

/* Compact icon buttons (dialog close, key peek) — a square, transparent
   ghost; 32px keeps them past the 24px pointer-target floor. */
.iconbtn,.peek{min-height:32px;min-width:32px;padding:0;display:grid;place-items:center;background:transparent;border:1px solid transparent;color:var(--muted);cursor:pointer}
.iconbtn:hover,.peek:hover{color:var(--text);border-color:var(--line)}
.keyfield{position:relative;display:block}
.keyfield input{width:100%;padding-right:44px}
/* The UA [hidden] rule covers HTML only; SVG icons need it spelled out. */
.peek svg[hidden]{display:none}
.peek{position:absolute;right:var(--sp-1);top:50%;transform:translateY(-50%)}

@media(max-width:760px){
  .prow-status,.prow-note{display:none}
  .prow.on .pname::after{content:'';display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--violet);box-shadow:0 0 8px var(--glow-dot);margin-left:var(--sp-2);vertical-align:2px}
}

/* Reduced motion — one global gate: every transition and animation the
   dash runs (rows, buttons, dialogs, toasts, notices, the boot spinner)
   drops to an instant state change. Nothing loops, nothing slides. */
@media(prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important;scroll-behavior:auto !important}
}
