/* The studio hub (docs/proposals/studio-hub.md). The binding look is design/prototype/hub.html: the same tokens, the
   full-width shell with the rail at the side and the content centred, the asterisk mark, a faded green dot for "live".
   No inline style anywhere: the CSP allows styles from this file and Google Fonts only. */
:root{
  font-size:16px;
  --canvas:#EDEDED; --rail:#F7F7F7; --surface:#FFFFFF; --tint:#FAFAFA; --surface-2:#F4F4F4; --surface-3:#ECECEC;
  --line:#EDEDED; --line-strong:#DFDFDF;
  --chart:#262626; --chart-2:#ADADAD; --hatch:#DDDDDD; --grid:#F2F2F2;
  --ink:#1E1E1E; --ink-b:#3B3B3B; --ink-2:#6A6A6A; --ink-3:#9B9B9B;
  --primary:#1C1C1C; --on-primary:#FFFFFF;
  --ok:#2F9E5E; --warn:#8A5300; --warn-soft:#FBF1DD; --crit:#B42318; --crit-soft:#FCEBE9;
  --shown:#3F8F62; --ring:#858585;
  --scrim:rgba(20,20,20,.28);
  --shadow-1:0 1px 2px rgba(0,0,0,.05), 0 0 0 1px rgba(0,0,0,.05);
  --shadow-2:0 22px 56px -22px rgba(0,0,0,.24), 0 1px 4px rgba(0,0,0,.05);
  --font-ui:'Google Sans','Segoe UI',system-ui,sans-serif;
  --font-mono:ui-monospace,'SF Mono',Menlo,Consolas,monospace;
  --r-s:8px; --r-m:12px; --r-l:18px;
  color-scheme:light;
}
@media (prefers-color-scheme: dark){ :root:not([data-theme="light"]){
  --canvas:#0A0A0A; --rail:#141414; --surface:#1A1A1A; --tint:#1F1F1F; --surface-2:#242424; --surface-3:#2E2E2E;
  --line:#292929; --line-strong:#3A3A3A;
  --chart:#EDEDED; --chart-2:#6C6C6C; --hatch:#3A3A3A; --grid:#252525;
  --ink:#F4F4F4; --ink-b:#DADADA; --ink-2:#A6A6A6; --ink-3:#787878;
  --primary:#F2F2F2; --on-primary:#161616;
  --ok:#4ADE80; --warn:#F2C14E; --warn-soft:#2E2610; --crit:#F58A80; --crit-soft:#351A17;
  --shown:#62B585; --ring:#787878;
  --scrim:rgba(0,0,0,.58);
  --shadow-1:0 1px 2px rgba(0,0,0,.5), 0 0 0 1px rgba(255,255,255,.06);
  --shadow-2:0 22px 56px -22px rgba(0,0,0,.8), 0 1px 4px rgba(0,0,0,.35);
  color-scheme:dark } }
:root[data-theme="dark"]{
  --canvas:#0A0A0A; --rail:#141414; --surface:#1A1A1A; --tint:#1F1F1F; --surface-2:#242424; --surface-3:#2E2E2E;
  --line:#292929; --line-strong:#3A3A3A;
  --chart:#EDEDED; --chart-2:#6C6C6C; --hatch:#3A3A3A; --grid:#252525;
  --ink:#F4F4F4; --ink-b:#DADADA; --ink-2:#A6A6A6; --ink-3:#787878;
  --primary:#F2F2F2; --on-primary:#161616;
  --ok:#4ADE80; --warn:#F2C14E; --warn-soft:#2E2610; --crit:#F58A80; --crit-soft:#351A17;
  --shown:#62B585; --ring:#787878;
  --scrim:rgba(0,0,0,.58);
  --shadow-1:0 1px 2px rgba(0,0,0,.5), 0 0 0 1px rgba(255,255,255,.06);
  --shadow-2:0 22px 56px -22px rgba(0,0,0,.8), 0 1px 4px rgba(0,0,0,.35);
  color-scheme:dark }

*{box-sizing:border-box}
html,body{height:100%}
body{margin:0;background:var(--surface);color:var(--ink-b);font-family:var(--font-ui);font-size:1rem;line-height:1.55;-webkit-font-smoothing:antialiased}
button,input,select{font:inherit;color:inherit}
button{cursor:pointer}
button:disabled{cursor:default;opacity:.55}
p{margin:0}
a{color:inherit}
:focus-visible{outline:2px solid var(--ink);outline-offset:2px;border-radius:8px}
.sprite{position:absolute;width:0;height:0;overflow:hidden}
.ic{width:20px;height:20px;flex:none;stroke:currentColor;fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}
.ic.sm{width:16px;height:16px}
.grow{flex:1;min-width:0}
.one{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.num{font-variant-numeric:tabular-nums}
.ta-end{text-align:end}
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}

/* the page is the container the narrow rules below measure, as the device frame was in the prototype */
#root{height:100%;container:app / inline-size}

/* shell: full width, rail at the side, content centred in what is left */
.app{position:relative;height:100%;display:grid;grid-template-columns:268px minmax(0,1fr);background:var(--surface);overflow:hidden}
.side{display:flex;flex-direction:column;gap:2px;padding:16px 14px 14px;background:var(--rail);border-inline-end:1px solid var(--line);min-height:0;overflow:auto}
.brand{display:flex;align-items:center;gap:11px;padding-block:8px;padding-inline:8px 12px;margin-block-end:12px;background:var(--surface);border:1px solid var(--line);border-radius:14px;color:var(--ink)}
.brand-tile{width:36px;height:36px;border-radius:10px;background:var(--primary);color:var(--on-primary);display:grid;place-items:center;flex:none}
.brand-tile svg{width:22px;height:22px}
.brand b{font-weight:500;font-size:1.06rem;display:block}
.brand small{color:var(--ink-2);font-size:.8rem}
.nav-h{font-size:.78rem;color:var(--ink-3);padding:16px 12px 6px}
.nav-i{display:flex;align-items:center;gap:12px;width:100%;min-height:42px;border:0;background:transparent;padding:0 12px;border-radius:10px;color:var(--ink-2);font-size:.97rem;text-align:start;text-decoration:none;transition:background-color .15s,color .15s}
.nav-i .ic{color:var(--ink-3)}
.nav-i:hover{background:var(--surface-3);color:var(--ink)}
.nav-i[aria-current="page"]{background:var(--surface);color:var(--ink);font-weight:500;box-shadow:var(--shadow-1)}
.nav-i[aria-current="page"] .ic,.nav-i:hover .ic{color:var(--ink)}
.count{margin-inline-start:auto;font-size:.75rem;background:var(--surface-3);color:var(--ink);border-radius:7px;min-width:22px;height:22px;display:grid;place-items:center;padding-inline:6px;font-weight:500;font-variant-numeric:tabular-nums}
.count.warn{background:var(--warn-soft);color:var(--warn)}
.side-foot{margin-block-start:auto;display:flex;flex-direction:column;gap:10px;padding-block-start:16px}
.user-row{display:flex;align-items:center;gap:11px;padding:6px;border-radius:12px;color:var(--ink)}
.user-row small{display:block;color:var(--ink-2);font-size:.8rem}
.avatar{width:34px;height:34px;border-radius:50%;background:var(--surface-3);color:var(--ink);display:grid;place-items:center;font-weight:500;flex:none;font-size:.9rem}
.main{display:grid;grid-template-rows:auto minmax(0,1fr);min-width:0;min-height:0;background:var(--surface)}
.top{display:flex;align-items:center;gap:10px;min-height:66px;padding:0 36px;border-block-end:1px solid var(--line);min-width:0}
.top-search{display:flex;align-items:center;gap:11px;border:0;background:transparent;color:var(--ink-3);padding:6px 2px;min-width:0}
.top-search:hover{color:var(--ink)}
.fresh{color:var(--ink-2);font-size:.86rem;white-space:nowrap}
.view{overflow:auto;min-height:0}
.screen{padding:36px 40px 72px;max-width:1180px;width:100%;margin-inline:auto;display:flex;flex-direction:column;gap:24px;animation:rise .3s cubic-bezier(.2,.7,.2,1)}
@keyframes rise{from{opacity:.4;transform:translateY(6px)}to{opacity:1;transform:none}}
.stack{display:flex;flex-direction:column;gap:24px}
.h-row{display:flex;flex-wrap:wrap;align-items:end;gap:12px}
.h-row > .grow{flex-basis:260px}
h2.title{font-size:1.9rem;line-height:1.2;font-weight:500;letter-spacing:-.02em;margin:0;color:var(--ink)}
.sub{color:var(--ink-2);margin-block-start:6px}
.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-l);padding:24px;min-width:0}
.card h3{font-size:1.06rem;font-weight:500;margin:0;color:var(--ink)}
.card h3.minor{font-size:1rem;margin-block-end:10px}
.card-h{display:flex;align-items:center;flex-wrap:wrap;gap:6px 10px;margin-block-end:14px;min-height:34px}
.card.bare{padding:0;border:0}
.grid{display:grid;gap:24px}
.two{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
.help{color:var(--ink-2);font-size:.875rem}
.err{color:var(--crit);font-size:.875rem}
.err:empty{display:none}
.link{color:var(--ink);font-weight:500;background:none;border:0;padding:0;font-size:.9rem;text-decoration:underline;text-decoration-color:var(--line-strong);text-underline-offset:4px}
.link:hover{text-decoration-color:var(--ink)}
.back{align-self:flex-start;display:inline-flex;gap:6px;align-items:center}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;border:1px solid var(--line-strong);background:var(--surface);color:var(--ink);padding:6px 14px;border-radius:var(--r-m);font-weight:500;white-space:nowrap;min-height:40px;font-size:.94rem;text-decoration:none;transition:background-color .15s,opacity .15s}
.btn:hover{background:var(--surface-2)}
.btn.primary{background:var(--primary);border-color:var(--primary);color:var(--on-primary)}
.btn.primary:hover{opacity:.86}
.btn.sm{min-height:32px;padding:3px 11px;font-size:.86rem;border-radius:9px}
.icon-btn{width:38px;height:38px;display:grid;place-items:center;border:0;background:transparent;border-radius:50%;color:var(--ink-2);flex:none}
.icon-btn:hover{background:var(--surface-2);color:var(--ink)}

/* figures */
.kpi-strip{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));padding:0;overflow:hidden}
.kpi-strip.boxed{border:1px solid var(--line);border-radius:var(--r-l);margin-block-end:20px}
.kpi{display:flex;align-items:center;gap:12px;padding:22px 24px;border-inline-start:1px solid var(--line);min-width:0}
.kpi:first-child{border-inline-start:0}
.kpi-t{display:flex;flex-direction:column;gap:6px;flex:1;min-width:0}
.kpi-l{color:var(--ink-b);font-size:.97rem}
.kpi-v{font-size:1.9rem;font-weight:500;line-height:1.1;letter-spacing:-.02em;color:var(--ink);font-variant-numeric:tabular-nums}
.kpi-d{font-size:.84rem;color:var(--ink-2)}
.kpi-i{width:38px;height:38px;border-radius:50%;border:1px solid var(--line);display:grid;place-items:center;color:var(--ink-2);flex:none}
.kpi-i .ic{width:18px;height:18px}
button.kpi{border:0;border-inline-start:1px solid var(--line);background:transparent;text-align:start;color:inherit;font:inherit;transition:background-color .15s}
button.kpi:first-child{border-inline-start:0}
button.kpi:hover{background:var(--tint)}
button.kpi:hover .kpi-i{border-color:var(--line-strong);color:var(--ink)}
.flash{animation:flash 1.6s ease-out 1}
@keyframes flash{0%,60%{box-shadow:0 0 0 4px var(--surface-3),0 0 0 5px var(--ink)}100%{box-shadow:0 0 0 0 transparent}}
.sheet{width:min(560px,100%);max-height:min(640px,90%);overflow:auto}
.sheet .rows .row{padding-inline:0}
.sheet .card-h{margin:0}
.filters{display:flex;flex-wrap:wrap;gap:10px;align-items:center}
.filters .select{width:auto;min-width:170px}

/* status: shape and label first, colour only for a real warning and for live */
.dot{width:8px;height:8px;border-radius:50%;background:var(--ink);flex:none;display:inline-block}
.dot.live{background:var(--shown);opacity:.85}
.dot.down{background:var(--crit)}
.dot.idle{background:transparent;border:1.5px solid var(--ring)}
.chip{display:inline-flex;align-items:center;gap:6px;padding:2px 9px;border-radius:7px;font-size:.8rem;font-weight:500;background:var(--surface-2);color:var(--ink-2);white-space:nowrap}
.chip.warn{background:var(--warn-soft);color:var(--warn)}
.chip.crit{background:var(--crit-soft);color:var(--crit)}
.chip.line{background:transparent;border:1px solid var(--line-strong);color:var(--ink)}
.mark{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;flex:none;border:1px solid var(--line);color:var(--ink-2)}
.mark.warn{background:var(--warn-soft);border-color:transparent;color:var(--warn)}
.mark.crit{background:var(--crit-soft);border-color:transparent;color:var(--crit)}
/* The registry carries no brand colour, so a site's sign is its first letter on a neutral tile. */
.site-mark{width:34px;height:34px;border-radius:10px;display:grid;place-items:center;flex:none;background:var(--surface-3);color:var(--ink);font-weight:500;font-size:.8rem}
.site-mark.studio{background:var(--primary);color:var(--on-primary)}
.site-mark.studio svg{width:18px;height:18px}

/* rows */
.rows{display:flex;flex-direction:column}
.row{display:flex;align-items:center;gap:14px;padding:14px 4px;border:0;border-block-start:1px solid var(--line);background:transparent;width:100%;text-align:start;color:inherit;min-width:0}
.rows > .row:first-child{border-block-start:0}
button.row:hover{background:var(--tint)}
.row .t{font-weight:500;color:var(--ink)}
.row .s{color:var(--ink-2);font-size:.9rem}
.row-act{margin-inline-start:auto;flex:none}
.input.row-input{width:130px}
.row .detail{color:var(--ink-3);font-size:.84rem;overflow-wrap:anywhere}

/* table: one line per record, column dividers */
.tbl{display:flex;flex-direction:column;border:1px solid var(--line);border-radius:var(--r-l);background:var(--surface);overflow:hidden}
.tr{display:grid;align-items:stretch;min-height:60px;border-block-start:1px solid var(--line);background:transparent;width:100%;text-align:start;color:inherit;border-inline:0;border-block-end:0;padding:0;transition:background-color .15s}
.tr:first-child{border-block-start:0}
.td{display:flex;align-items:center;gap:10px;padding:0 16px;border-inline-start:1px solid var(--line);min-width:0;white-space:nowrap}
.td:first-child{border-inline-start:0}
.tr.head{min-height:48px;color:var(--ink);font-weight:500;background:var(--tint);font-size:.9rem}
button.tr:hover{background:var(--tint)}
.tr[aria-current="true"]{background:var(--tint);box-shadow:inset -3px 0 0 var(--ink)}
.td .t{font-weight:500;color:var(--ink)}
.td .s{color:var(--ink-2);font-size:.84rem}
.td-stack{flex-direction:column;align-items:flex-start;justify-content:center;gap:0}
.td .domain{text-align:end}
.fleet .tr{grid-template-columns:minmax(0,1.7fr) 120px minmax(0,1.1fr) minmax(0,1fr) 92px 92px 110px 150px}
.pol .tr{grid-template-columns:minmax(0,1.3fr) 230px 130px 120px 170px minmax(0,1.1fr)}
.act .tr{grid-template-columns:minmax(0,1.3fr) repeat(4,minmax(0,.8fr)) minmax(0,1.6fr)}
.meter{height:8px;border-radius:999px;background:var(--surface-3);overflow:hidden;width:100%;margin-block-start:6px}
.meter span{display:block;height:100%;width:0;background:var(--chart);border-radius:999px}
.meter.warn span{background:var(--warn)}

/* forms */
.segc{display:inline-flex;flex-wrap:wrap;background:var(--surface-2);border-radius:var(--r-m);padding:3px;gap:2px}
.segc button{border:0;background:transparent;padding:5px 11px;color:var(--ink-2);border-radius:9px;font-size:.86rem;transition:background-color .15s,color .15s}
.segc button[aria-pressed="true"]{background:var(--surface);color:var(--ink);font-weight:500;box-shadow:var(--shadow-1)}
.input,.select{width:100%;border:1px solid var(--line-strong);background:var(--surface);border-radius:var(--r-m);padding:6px 12px;min-height:38px;color:var(--ink)}
.input:focus,.select:focus{outline:2px solid var(--ink);outline-offset:1px}
.field{display:flex;flex-direction:column;gap:6px;width:100%;text-align:start}
.field span{font-size:.875rem;color:var(--ink-b)}
.kv{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px 16px;align-items:center;margin:0}
.kv dt{color:var(--ink-2)}
.kv dd{margin:0;color:var(--ink);text-align:end;font-variant-numeric:tabular-nums}
.check{display:flex;align-items:center;gap:10px;padding:9px 0;border-block-start:1px solid var(--line)}
.check:first-child{border-block-start:0}
.check .ic{color:var(--ink-3)}
.check.no .ic{color:var(--warn)}
.code{display:flex;align-items:center;gap:10px;background:var(--surface-2);border-radius:var(--r-m);padding-block:8px;padding-inline:14px 8px;direction:ltr}
.code code{flex:1;min-width:0;font-family:var(--font-mono);font-size:.86rem;color:var(--ink);overflow-wrap:anywhere}

/* charts */
.chart{position:relative;min-width:0}
.plot{position:relative;direction:ltr}
.chart svg{display:block;max-width:100%;overflow:visible}
.legend{display:flex;flex-wrap:wrap;gap:6px 18px;font-size:.84rem;color:var(--ink-2);margin-block-end:12px}
.legend span{display:inline-flex;align-items:center;gap:8px}
.legend i{width:9px;height:9px;border-radius:50%;background:var(--chart);display:inline-block}
.legend i.dotted{background:var(--chart-2)}
.c-grid{stroke:var(--grid);stroke-width:1}
.c-axis{fill:var(--ink-3);font-size:.78rem;font-family:var(--font-ui);font-variant-numeric:tabular-nums}
.c-line{fill:none;stroke:var(--chart);stroke-width:2;stroke-linejoin:round;stroke-linecap:round}
.c-prev{fill:none;stroke:var(--chart-2);stroke-width:2.4;stroke-linejoin:round;stroke-linecap:round;stroke-dasharray:.1 6}
.c-hatch{stroke:var(--hatch);stroke-width:1}
.c-dot{fill:var(--chart);stroke:var(--surface);stroke-width:2}
.c-cross{stroke:var(--line-strong);stroke-width:1}
.c-col{fill:var(--chart);opacity:.82;transition:opacity .15s}
.c-col.on{opacity:1}
.c-end{fill:var(--ink);font-size:.8rem;font-weight:500;font-family:var(--font-ui)}
.tip{position:absolute;pointer-events:none;background:var(--primary);color:var(--on-primary);padding:8px 12px;border-radius:12px;font-size:.8rem;line-height:1.45;white-space:nowrap;transform:translate(-50%,-100%);direction:rtl;z-index:2}
.tip b{display:block;font-size:.94rem;font-weight:500}
.bars{display:flex;flex-direction:column;gap:16px}
.bar-row{display:grid;grid-template-columns:minmax(0,150px) minmax(0,1fr) 46px;gap:12px;align-items:center}
.bar-row > span:first-child{overflow-wrap:anywhere}
.bar-fill{height:10px;background:var(--chart);border-radius:999px;min-width:6px}
.bar-row .val{text-align:end;font-variant-numeric:tabular-nums;font-weight:500;font-size:.9rem;color:var(--ink)}

/* overlays */
.scrim{position:absolute;inset:0;background:var(--scrim);display:grid;place-items:center;padding:16px;z-index:20}
.dialog{background:var(--surface);border-radius:var(--r-l);box-shadow:var(--shadow-2);padding:26px;width:min(460px,100%);display:flex;flex-direction:column;gap:16px}
.dialog h3{margin:0;font-weight:500;font-size:1.2rem;color:var(--ink)}
.dialog .acts{display:flex;gap:10px;justify-content:flex-end;flex-wrap:wrap}
.toasts{position:absolute;inset-block-end:18px;inset-inline-start:50%;transform:translateX(50%);display:flex;flex-direction:column;gap:8px;z-index:30;width:min(520px,calc(100% - 32px));pointer-events:none}
.toast{background:var(--primary);color:var(--on-primary);padding:12px 16px;border-radius:14px;font-size:.9rem;box-shadow:var(--shadow-2)}

/* login, registration and the ticket page */
.login{position:relative;height:100%;display:grid;place-items:center;background:var(--rail);padding:16px;overflow:auto}
.login-card{background:var(--surface);border:1px solid var(--line);border-radius:24px;padding:36px 32px;width:min(400px,100%);display:flex;flex-direction:column;gap:18px;align-items:center;text-align:center}
.login-card .brand-tile{width:52px;height:52px;border-radius:14px}
.login-card .brand-tile svg{width:30px;height:30px}
.login-card h2{margin:0;font-weight:500;font-size:1.4rem;color:var(--ink)}
.login-card .btn{width:100%;min-height:48px}
.login-card .site-mark{width:52px;height:52px;border-radius:14px;font-size:1.2rem}

/* narrow: the rail turns into a strip of tabs above the content */
@container app (max-width:1300px){
  .fleet .tr{grid-template-columns:minmax(0,1.6fr) 110px minmax(0,1fr) 92px 92px 150px}
  .fleet .c-pub,.fleet .c-visits{display:none}
  .pol .tr{grid-template-columns:minmax(0,1.3fr) 230px 130px minmax(0,1fr)}
  .pol .c-limit,.pol .c-model{display:none}
}
/* Below this the tables turn into one card per record: a label before each value, nothing cut. */
@container app (max-width:1080px){
  .kpi-strip{grid-template-columns:repeat(2,minmax(0,1fr))}
  .kpi:nth-child(3){border-inline-start:0}
  .kpi:nth-child(n+3){border-block-start:1px solid var(--line)}
  .tbl .tr.head{display:none}
  .tbl .tr{display:flex;flex-wrap:wrap;padding:12px 14px;gap:8px 18px;min-height:0}
  .tbl .td{border:0;padding:0;white-space:normal;gap:8px}
  .tbl .td:first-child{flex-basis:100%}
  .tbl .td-stack{min-width:140px}
  .fleet .c-pub,.fleet .c-visits,.pol .c-limit,.pol .c-model{display:flex}
  .td[data-l]::before{content:attr(data-l);color:var(--ink-3);font-size:.78rem}
  .td-stack[data-l]::before{margin-block-end:2px}
}
@container app (max-width:760px){
  .app{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr)}
  .side{flex-direction:row;overflow-x:auto;padding:10px 12px;border-inline-end:0;border-block-end:1px solid var(--line);gap:6px;scrollbar-width:none}
  .side .brand,.side .nav-h,.side .site-nav{display:none}
  .side .side-foot{margin:0;padding:0;margin-inline-start:auto}
  .side .user-row{padding:0}
  .side .user-row .avatar,.side .user-row .grow{display:none}
  .nav-i{width:auto;white-space:nowrap;min-height:38px}
  .top{padding:0 16px;min-height:56px}
  .screen{padding:22px 16px 48px;gap:18px}
  .stack{gap:18px}
  h2.title{font-size:1.5rem}
  .kpi-strip{grid-template-columns:repeat(2,minmax(0,1fr))}
  .kpi:nth-child(3){border-inline-start:0}
  .kpi:nth-child(n+3){border-block-start:1px solid var(--line)}
  .kpi{padding:16px}
  .kpi-v{font-size:1.5rem}
  .kpi-i{display:none}
  .two{grid-template-columns:minmax(0,1fr)}
  .card{padding:18px}
  .card.bare{padding:0}
  .rows .row{flex-wrap:wrap}
  .rows .row .grow{flex-basis:calc(100% - 48px)}
  .row-act{margin-inline-start:48px}
  .bar-row{grid-template-columns:minmax(0,110px) minmax(0,1fr) 40px}
}
@media (prefers-reduced-motion: reduce){ *{transition:none!important;animation:none!important} }
