/* Copied from mockup/src/part1-style.html (the approved design record); only the section at the end is new to the live page. */
/* MX1 Flight Deck mockup v3. Light-first glass dashboard in the MOSTAVIO four-colour palette (black, white, dark grey, award gold)
   plus greys derived from them. State is always glyph shape + words; gold is the only accent. The shell is the scroll container
   (rail, header and assistant stay put, only the canvas scrolls), the replay tick updates chart bodies in place, and the phone
   layout comes from a container query so the in-page phone preview and a real phone share one layout. */
:root{
  --bg:#FFFFFF; --ground-a:#F7F6F3; --ground-b:#ECEAE4; --sheet:rgba(255,255,255,.55); --panel:rgba(255,255,255,.78); --panel-solid:#FFFFFF; --panel-2:#F1EFEA;
  --fg:#0A0A0A; --muted:rgba(10,10,10,.6); --faint:rgba(10,10,10,.4); --line:rgba(10,10,10,.08); --line-2:rgba(10,10,10,.16); --edge:rgba(255,255,255,.7);
  --gold:#DABA6F; --gold-2:#C9A85C; --gold-dim:rgba(218,186,111,.22); --gold-glow:rgba(218,186,111,.45); --ink:#1C1C1C; --ink-fg:#FFFFFF;
  --shadow:0 1px 2px rgba(10,10,10,.04), 0 18px 40px -22px rgba(10,10,10,.22); --shadow-lift:0 2px 4px rgba(10,10,10,.05), 0 28px 50px -24px rgba(10,10,10,.3);
  --font:'Montserrat',system-ui,-apple-system,'Segoe UI',sans-serif; --mono:ui-monospace,'SF Mono',Menlo,Consolas,monospace;
  --r:18px; --r-s:10px; --ease:cubic-bezier(.2,.7,.2,1); color-scheme:light;
}
@media (prefers-color-scheme: dark){ :root:not([data-theme="light"]){
  --bg:#0A0A0A; --ground-a:#0E0E0E; --ground-b:#060606; --sheet:rgba(28,28,28,.45); --panel:rgba(28,28,28,.74); --panel-solid:#1C1C1C; --panel-2:#262626;
  --fg:#FFFFFF; --muted:rgba(255,255,255,.64); --faint:rgba(255,255,255,.42); --line:rgba(255,255,255,.09); --line-2:rgba(255,255,255,.18); --edge:rgba(255,255,255,.09);
  --gold:#DABA6F; --gold-2:#E6CC8A; --gold-dim:rgba(218,186,111,.18); --gold-glow:rgba(218,186,111,.35); --ink:#F2F2F2; --ink-fg:#0A0A0A;
  --shadow:0 1px 2px rgba(0,0,0,.4), 0 18px 40px -22px rgba(0,0,0,.8); --shadow-lift:0 2px 4px rgba(0,0,0,.5), 0 28px 50px -24px rgba(0,0,0,.9); color-scheme:dark; } }
:root[data-theme="dark"]{
  --bg:#0A0A0A; --ground-a:#0E0E0E; --ground-b:#060606; --sheet:rgba(28,28,28,.45); --panel:rgba(28,28,28,.74); --panel-solid:#1C1C1C; --panel-2:#262626;
  --fg:#FFFFFF; --muted:rgba(255,255,255,.64); --faint:rgba(255,255,255,.42); --line:rgba(255,255,255,.09); --line-2:rgba(255,255,255,.18); --edge:rgba(255,255,255,.09);
  --gold:#DABA6F; --gold-2:#E6CC8A; --gold-dim:rgba(218,186,111,.18); --gold-glow:rgba(218,186,111,.35); --ink:#F2F2F2; --ink-fg:#0A0A0A;
  --shadow:0 1px 2px rgba(0,0,0,.4), 0 18px 40px -22px rgba(0,0,0,.8); --shadow-lift:0 2px 4px rgba(0,0,0,.5), 0 28px 50px -24px rgba(0,0,0,.9); color-scheme:dark; }
*{box-sizing:border-box}
html,body{height:100%}
body{margin:0;color:var(--fg);font-family:var(--font);font-weight:400;font-size:13.5px;line-height:1.45;overflow:hidden;
  background:radial-gradient(1100px 560px at 8% -12%, var(--gold-dim), transparent 62%), radial-gradient(900px 520px at 100% 0%, rgba(28,28,28,.07), transparent 60%), linear-gradient(180deg,var(--ground-a),var(--ground-b));}
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer;-webkit-tap-highlight-color:transparent}
button:focus-visible,input:focus-visible,select:focus-visible,a:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
button:disabled{cursor:default;opacity:.55}
h1,h2,h3{margin:0;font-weight:600;text-wrap:balance}
h2{font-size:14px;letter-spacing:-.005em}
h3{font-size:10.5px;text-transform:uppercase;letter-spacing:.1em;color:var(--muted);font-weight:600}
.num{font-variant-numeric:tabular-nums}
.mono{font-family:var(--mono);font-size:12px}
.faint{color:var(--faint)} .gold{color:var(--gold)}
.logo-b,.logo-w{height:16px;width:auto;display:none}
:root .logo-b{display:block}
@media (prefers-color-scheme: dark){ :root:not([data-theme="light"]) .logo-b{display:none} :root:not([data-theme="light"]) .logo-w{display:block} }
:root[data-theme="dark"] .logo-b{display:none} :root[data-theme="dark"] .logo-w{display:block}

/* ---------- shell: rail | canvas | assistant, header across ---------- */
#root{height:100%;position:relative}
.frame{height:100%;padding:14px;container-type:inline-size;container-name:shell}
.shell{position:relative;height:100%;display:grid;grid-template-columns:76px minmax(0,1fr) 392px;grid-template-rows:auto auto minmax(0,1fr);
  background:var(--sheet);backdrop-filter:blur(22px) saturate(1.15);-webkit-backdrop-filter:blur(22px) saturate(1.15);border:1px solid var(--edge);border-radius:28px;box-shadow:0 40px 90px -40px rgba(10,10,10,.35), inset 0 1px 0 var(--edge);overflow:hidden}
.shell.nodock{grid-template-columns:76px minmax(0,1fr) 0}
.shell>*{min-width:0}
.top{grid-column:1/4;display:flex;align-items:center;gap:14px;padding:12px 20px;min-height:58px;border-bottom:1px solid var(--line)}
.top .brand{display:flex;align-items:center;gap:12px;white-space:nowrap}
.top .title{font-weight:600;letter-spacing:.01em}
.top .sub{color:var(--faint);font-size:12px;white-space:nowrap}
.top .grow{flex:1;min-width:0}
.strip{display:flex;gap:6px;overflow-x:auto;scrollbar-width:none;padding:2px 0}
.strip::-webkit-scrollbar{display:none}
.pill{flex:0 0 auto;display:inline-flex;align-items:center;gap:7px;height:32px;padding:0 11px 0 8px;background:var(--panel);border:1px solid var(--edge);box-shadow:0 1px 2px rgba(10,10,10,.04);border-radius:999px;font-size:12px;white-space:nowrap}
.pill b{font-weight:600}
.pill .pv{min-width:0;color:var(--muted)}
.chipbtn{height:36px;padding:0 13px;border:1px solid var(--line-2);border-radius:999px;font-size:12px;display:inline-flex;align-items:center;gap:8px;background:var(--panel);transition:border-color .2s,background .2s,transform .2s var(--ease)}
.chipbtn:hover{border-color:var(--fg)}
.chipbtn:active{transform:scale(.98)}
.chipbtn[aria-pressed="true"]{border-color:var(--gold);background:var(--gold-dim)}
.chipbtn svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
@keyframes pulse{0%{box-shadow:0 0 0 0 var(--gold-glow)}100%{box-shadow:0 0 0 9px rgba(218,186,111,0)}}

/* the lost-link banner: a full-width band directly under the header on every view, filled while the watchdog says the link is lost */
.lost{grid-row:2;grid-column:1/4;display:flex;align-items:center;gap:12px;padding:9px 20px;background:#1C1C1C;color:#FFFFFF;border-bottom:2px solid var(--gold);font-size:12.5px;letter-spacing:.03em}
.lost:empty{padding:0;border:0;min-height:0} /* empty between losses: still in the tree (a live region has to exist before it fills to be announced reliably), no height */
.lost b{font-weight:700;letter-spacing:.08em}
.lost>span{color:rgba(255,255,255,.72)} /* the note beside the label only: the count inside <b> keeps the label's colour */
.lost .st.fail{color:var(--gold);--gp:#1C1C1C}

.rail{grid-row:3;display:flex;flex-direction:column;align-items:center;gap:8px;padding:16px 0;border-right:1px solid var(--line)}
.rail button{position:relative;width:58px;height:58px;border-radius:16px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;color:var(--muted);font-size:10px;font-weight:600;letter-spacing:.04em;transition:background .2s,color .2s,transform .2s var(--ease)}
.rail button:hover{background:var(--panel);color:var(--fg)}
.rail button svg{width:20px;height:20px;stroke:currentColor;fill:none;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.rail button[aria-selected="true"]{background:var(--ink);color:var(--ink-fg);box-shadow:0 10px 24px -10px rgba(10,10,10,.5)}
.rail .cnt{position:absolute;top:6px;right:6px;background:var(--gold);color:#0A0A0A;border-radius:999px;font-size:9.5px;padding:1px 6px;font-weight:700}
.rail .spacer{flex:1}

.main{grid-row:3;min-width:0;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:18px 20px 28px}
.view{display:grid;gap:16px;align-content:start}
.row{display:grid;gap:16px;grid-template-columns:repeat(6,minmax(0,1fr))}
.span-6{grid-column:span 6} .span-3{grid-column:span 3} .span-2{grid-column:span 2} .span-4{grid-column:span 4}
.hero{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap;padding:2px 4px 0}
.hero h1{font-size:26px;font-weight:300;letter-spacing:-.01em;line-height:1.1}
.hero h1 b{font-weight:600}
.hero .meta{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.tag{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 11px;border-radius:999px;background:var(--panel);border:1px solid var(--edge);font-size:11.5px;color:var(--muted);box-shadow:0 1px 2px rgba(10,10,10,.04)}
.tag.gold{background:var(--gold-dim);border-color:transparent;color:var(--fg)}

/* ---------- panels ---------- */
.panel{position:relative;min-width:0;background:var(--panel);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border:1px solid var(--edge);border-radius:var(--r);padding:16px 18px;box-shadow:var(--shadow);transition:box-shadow .3s var(--ease),transform .3s var(--ease)}
.panel:hover{box-shadow:var(--shadow-lift)}
.panel .ph{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:10px}
.panel .ph .src{font-size:10.5px;color:var(--faint);font-family:var(--mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:55%}
.panel .body{min-width:0}
.panel.ai{border-color:var(--gold);box-shadow:0 0 0 4px var(--gold-dim), var(--shadow)}
.panel.ai::before{content:"added by the assistant";position:absolute;top:-10px;left:16px;background:var(--gold);color:#0A0A0A;font-size:9.5px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;padding:3px 9px;border-radius:999px}
.panel .close{position:absolute;top:10px;right:10px;width:30px;height:30px;border-radius:50%;color:var(--faint);display:none;align-items:center;justify-content:center;font-size:14px}
.panel.ai .close{display:flex}
.panel .close:hover{background:var(--panel-2);color:var(--fg)}
.panel.rise{animation:rise .5s var(--ease) both}
@keyframes rise{from{opacity:0;transform:translateY(10px) scale(.995)}to{opacity:1;transform:none}}
.panel.flash{animation:flash 1.6s var(--ease) 1}
@keyframes flash{0%{box-shadow:0 0 0 0 var(--gold-glow), var(--shadow)}40%{box-shadow:0 0 0 10px rgba(218,186,111,0), var(--shadow)}100%{box-shadow:0 0 0 4px var(--gold-dim), var(--shadow)}}
.view.enter .panel{animation:rise .45s var(--ease) both}
.view.enter .panel:nth-child(2){animation-delay:.04s}.view.enter .panel:nth-child(3){animation-delay:.08s}.view.enter .panel:nth-child(4){animation-delay:.12s}.view.enter .panel:nth-child(5){animation-delay:.16s}.view.enter .panel:nth-child(n+6){animation-delay:.2s}

/* KPI tiles */
.kpi{padding:14px 16px 12px}
.kpi .k{font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);font-weight:600;display:flex;align-items:center;justify-content:space-between;gap:6px;min-height:20px}
.kpi .v{font-size:28px;font-weight:300;line-height:1.05;margin-top:8px;display:flex;align-items:baseline;gap:6px;letter-spacing:-.01em;min-height:30px}
.kpi .v small{font-size:12px;color:var(--faint);font-weight:400}
.kpi .s{font-size:11px;color:var(--faint);margin-top:6px;min-height:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.kpi svg{width:100%;height:38px;display:block;margin-top:8px}
.kpi svg path.l{fill:none;stroke:var(--fg);stroke-width:1.4}
.kpi svg path.a{fill:url(#gk);stroke:none}
.kpi svg circle{fill:var(--gold);filter:drop-shadow(0 0 4px var(--gold-glow))}

/* glyphs (custom properties travel into <use> clones) */
.g{display:inline-flex;width:16px;height:16px;flex:0 0 16px}
.g svg{width:16px;height:16px;display:block}
.st{display:inline-flex;align-items:center;gap:7px;font-weight:600;font-size:11px;letter-spacing:.05em}
.st.ok{--gf:var(--fg);--gs:var(--fg);--gp:var(--bg);--gd:0}
.st.warn{color:var(--gold-2);--gf:none;--gs:var(--gold);--gp:var(--gold);--gd:0}
.st.fail{color:var(--gold-2);--gf:var(--gold);--gs:var(--gold);--gp:var(--bg);--gd:0}
.st.unk{color:var(--muted);--gf:none;--gs:var(--faint);--gp:var(--faint);--gd:3 2}
.st.man{color:var(--muted);--gf:none;--gs:var(--muted);--gp:transparent;--gd:0}

/* charts */
svg.chart{width:100%;height:auto;display:block;overflow:visible}
svg.chart text{font-family:var(--font);font-size:10px;fill:var(--muted)}
svg.chart text.b{fill:var(--fg);font-weight:600}
svg.chart .grid{stroke:var(--line)}
svg.chart .axis{stroke:var(--line-2)}
svg.chart .l1{stroke:var(--fg);fill:none;stroke-width:1.6;stroke-linejoin:round}
svg.chart .l2{stroke:var(--gold);fill:none;stroke-width:1.6;stroke-dasharray:4 3}
svg.chart .lf{fill:none;stroke:var(--fg);stroke-width:1.1;opacity:.55}
svg.chart .lf.hi{stroke:var(--gold);stroke-width:2;opacity:1}
svg.chart .lf.held{stroke:var(--gold);stroke-dasharray:3 4;opacity:.9}
/* Pixhawk vs Jetson: through Jetson solid ink, Pixhawk direct dashed gold, so the two never rely on colour alone */
.pvj{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px 22px}
.pvj h3{margin-bottom:6px}
.pvj svg.chart .lf{stroke-width:1.6;opacity:.9}
svg.chart .lf.px{stroke:var(--gold);stroke-width:2;stroke-dasharray:5 3;opacity:1}
svg.chart .area{fill:url(#ga)}
svg.chart .cursor{stroke:var(--gold);stroke-width:1.5}
svg.chart .dot{fill:var(--gold);filter:drop-shadow(0 0 5px var(--gold-glow))}
svg.chart .node{fill:var(--panel-solid);stroke:var(--line-2);stroke-width:1;filter:drop-shadow(0 6px 12px rgba(10,10,10,.08))}
svg.chart .node.att{stroke:var(--gold);stroke-width:1.5}
svg.chart .node.dim{stroke-dasharray:3 3}
svg.chart .nt{fill:var(--fg);font-weight:600;font-size:10.5px}
svg.chart .ns{fill:var(--faint);font-size:9.5px}
svg.chart .edge{fill:none;stroke-linecap:round}
svg.chart .edge.ok{stroke:var(--fg);opacity:.75}
svg.chart .edge.weak{stroke:var(--muted);opacity:.6}
svg.chart .edge.off{stroke:var(--line-2);stroke-dasharray:4 5}
svg.chart .edge.att{stroke:var(--gold)}
svg.chart .flow{fill:none;stroke:var(--bg);stroke-width:1.2;stroke-dasharray:2 9;stroke-linecap:round;animation:flow 1.4s linear infinite;opacity:.9}
svg.chart .flow.att{stroke:#0A0A0A}
@keyframes flow{to{stroke-dashoffset:-22}}
svg.chart .plane{fill:var(--panel-2);stroke:var(--line-2);opacity:.9}
.legend{display:flex;gap:14px;font-size:11px;color:var(--muted);margin-top:8px;flex-wrap:wrap}
.legend i{display:inline-block;width:18px;height:0;border-top:2px solid var(--fg);vertical-align:middle;margin-right:6px}
.legend i.d{border-top-style:dashed;border-color:var(--gold)}
.legend i.m{border-color:var(--muted);border-top-width:1px}
.legend i.o{border-top-style:dashed;border-color:var(--line-2)}
.cap{font-size:11.5px;color:var(--faint);margin-top:9px;line-height:1.5}
.cap b{color:var(--muted);font-weight:600}

/* aircraft model panel */
.model3d{position:relative;min-height:300px}
.model3d .stage{position:relative;width:100%;border-radius:14px;overflow:hidden;background:radial-gradient(60% 55% at 50% 62%, var(--panel-2), transparent 70%)}
.model3d .stage canvas.gl{display:block;width:100%!important;height:auto!important;cursor:grab}
.model3d .stage canvas.gl:active{cursor:grabbing}
.model3d .labels{position:absolute;inset:0;pointer-events:none}
.mlabel{position:absolute;left:0;top:0;display:inline-flex;align-items:center;gap:7px;height:24px;padding:0 9px;border-radius:999px;background:var(--panel-solid);border:1px solid var(--line-2);font-size:10.5px;white-space:nowrap;box-shadow:0 8px 18px -10px rgba(10,10,10,.45);transition:opacity .2s;font-variant-numeric:tabular-nums;will-change:transform}
.mlabel b{font-weight:700}
.mlabel .cur{color:var(--muted)}
.model3d .mctl{position:absolute;top:10px;right:10px;display:flex;gap:6px;z-index:2}
.model3d .mctl button{height:28px;padding:0 10px;border-radius:999px;background:var(--panel-solid);border:1px solid var(--line-2);font-size:11px;font-weight:600;color:var(--muted)}
.model3d .mctl button:hover{color:var(--fg);border-color:var(--fg)}
.model3d .mctl button[aria-pressed="true"]{border-color:var(--gold);background:var(--gold-dim);color:var(--fg)}
.model3d .loading{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:var(--faint);font-size:12px}
/* small multiples */
.sm{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:10px}
.sm .cell{background:var(--panel-solid);border:1px solid var(--line);border-radius:12px;padding:8px 10px 6px;min-width:0}
.sm .cell.held{border-color:var(--gold);background:var(--gold-dim)}
.sm .cell .h{display:flex;justify-content:space-between;align-items:baseline;font-size:10.5px;color:var(--muted);font-weight:600}
.sm .cell .h b{color:var(--fg);font-size:13px;font-weight:600}
.sm .cell svg{width:100%;height:40px;display:block;margin-top:4px}
.sm .cell svg path{fill:none;stroke:var(--fg);stroke-width:1.2}
.sm .cell.held svg path{stroke:var(--gold);stroke-dasharray:3 3}
.sm .cell svg circle{fill:var(--gold)}
.bars{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:6px;margin-top:4px}
.bars .b{text-align:center;min-width:0}
.bars .b .col{height:64px;display:flex;align-items:flex-end;background:linear-gradient(180deg,transparent,var(--line));border-radius:6px;padding:0 3px}
.bars .b .col i{display:block;width:100%;border-radius:4px 4px 2px 2px;background:linear-gradient(180deg,var(--ink),var(--fg));transition:height .15s linear}
.bars .b.held .col i{background:repeating-linear-gradient(135deg,var(--gold) 0 4px,transparent 4px 7px);border:1px solid var(--gold)}
.bars .b .n{font-size:11px;margin-top:5px;font-variant-numeric:tabular-nums}
.bars .b .p{font-size:10px;color:var(--faint)}

/* checks */
.pipe{display:flex;align-items:center;gap:0;overflow-x:auto;padding:6px 0 4px;scrollbar-width:none}
.pipe::-webkit-scrollbar{display:none}
.pn{display:flex;flex-direction:column;align-items:center;gap:7px;min-width:88px;flex:1}
.pn .d{width:36px;height:36px;border-radius:50%;border:1.5px solid var(--line-2);display:flex;align-items:center;justify-content:center;background:var(--panel-solid);box-shadow:0 6px 14px -8px rgba(10,10,10,.3)}
.pn .d svg{width:16px;height:16px}
.pn.done .d{background:var(--fg);border-color:var(--fg)} .pn.done .d svg path{stroke:var(--bg)}
.pn.fail .d{background:var(--gold);border-color:var(--gold);box-shadow:0 0 0 5px var(--gold-dim)} .pn.fail .d svg path{stroke:#0A0A0A}
.pn.warn .d{border-color:var(--gold)} .pn.warn .d svg path{stroke:var(--gold)}
.pn .l{font-size:10.5px;color:var(--muted);text-align:center;line-height:1.2;max-width:92px}
.pn.fail .l,.pn.warn .l{color:var(--fg);font-weight:600}
.pline{flex:1;height:1.5px;background:var(--line-2);min-width:12px;margin-bottom:24px}
.sec{border-top:1px solid var(--line);padding-top:12px;margin-top:12px}
.sec:first-of-type{border-top:0;padding-top:0;margin-top:0}
.sech{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:4px}
.sech .sum{font-size:11px;color:var(--muted)}
.item{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px;min-height:44px;padding:5px 10px;margin:0 -10px;border-radius:var(--r-s);text-align:left;width:calc(100% + 20px);transition:background .15s}
.item>span{min-width:0}
.item:hover{background:var(--panel-2)}
.item[aria-current="true"]{background:var(--panel-2);box-shadow:inset 3px 0 0 var(--gold)}
.item .t{font-weight:500}
.item .sub{display:block;color:var(--faint);font-size:11px}
.item .v{color:var(--muted);font-size:12px;white-space:nowrap;text-align:right}
.detail dl{display:grid;grid-template-columns:auto 1fr;gap:7px 14px;margin:12px 0 0}
.detail dt{color:var(--faint);font-size:10px;text-transform:uppercase;letter-spacing:.08em;padding-top:3px}
.detail dd{margin:0}
.ready{display:grid;grid-template-columns:auto minmax(0,1fr);gap:18px;align-items:center}
.ready .big{font-size:32px;font-weight:300;letter-spacing:-.01em;line-height:1}
.ready .big small{font-size:13px;color:var(--faint);font-weight:400;margin-left:4px}
.ready ul{margin:8px 0 0;padding:0;list-style:none;display:grid;gap:6px}
.ready li{display:flex;align-items:center;gap:8px;font-size:12.5px}
.btn{height:40px;padding:0 15px;border-radius:12px;border:1px solid var(--line-2);display:inline-flex;align-items:center;gap:8px;font-weight:600;font-size:12.5px;background:var(--panel-solid);transition:transform .2s var(--ease),background .2s,border-color .2s}
.btn:hover{border-color:var(--fg)}
.btn:active{transform:scale(.98)}
.btn.gold{background:var(--gold);color:#0A0A0A;border-color:var(--gold)}
.actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}

/* assistant dock */
.dock{grid-row:3;display:flex;flex-direction:column;min-height:0;border-left:1px solid var(--line);background:linear-gradient(180deg,rgba(255,255,255,.18),transparent 30%)}
.shell.nodock .dock{display:none}
.dock .dh{padding:14px 18px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;gap:8px}
.dock .dh .who{display:flex;align-items:center;gap:10px;font-weight:600}
.dock .dh .who i{width:9px;height:9px;border-radius:50%;background:var(--fg);display:inline-block;box-shadow:0 0 0 0 rgba(10,10,10,.25);animation:pulse 2.4s ease-out infinite}
.dock .dh .who span{font-weight:400;color:var(--faint);font-size:12px}
.dock .msgs{flex:1;overflow-y:auto;overscroll-behavior:contain;padding:16px 18px;display:grid;gap:12px;align-content:start}
.msg{display:grid;gap:5px;animation:rise .35s var(--ease) both}
.msg .who{font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--faint)}
.msg.you{justify-self:end;max-width:92%}
.msg.you .body{background:var(--ink);color:var(--ink-fg);border-radius:16px 16px 4px 16px;padding:10px 13px;font-size:13px;box-shadow:0 10px 22px -12px rgba(10,10,10,.5)}
.msg.ai .body{background:var(--panel);border:1px solid var(--edge);border-radius:16px 16px 16px 4px;padding:11px 13px;font-size:13px;box-shadow:var(--shadow)}
.msg .act{display:flex;flex-wrap:wrap;gap:6px;margin-top:9px}
.msg .act button{height:30px;padding:0 11px;border-radius:999px;border:1px solid var(--line-2);font-size:11.5px;background:var(--panel-solid);transition:border-color .2s}
.msg .act button:hover{border-color:var(--fg)}
.msg .act button.done{border-color:var(--gold);background:var(--gold-dim)}
.msg.act-line .body{display:flex;align-items:center;gap:10px;background:var(--gold-dim);border:0;font-size:12px;border-radius:12px;padding:8px 12px}
.msg.act-line .body b{font-weight:600}
.msg.act-line .body button{margin-left:auto;height:26px;padding:0 10px;border-radius:999px;border:1px solid var(--line-2);font-size:11px;background:var(--panel-solid)}
.cite{font-family:var(--mono);font-size:11px;background:var(--panel-2);border:1px solid var(--line);border-radius:5px;padding:0 5px;white-space:nowrap}
.dock .in{border-top:1px solid var(--line);padding:12px 18px 14px}
.dock .in .box{display:flex;gap:8px;align-items:center}
.dock .in input{flex:1;min-width:0;height:44px;border-radius:999px;border:1px solid var(--line-2);background:var(--panel-solid);color:var(--fg);padding:0 16px;font:inherit;transition:border-color .2s,box-shadow .2s}
.dock .in input:focus{border-color:var(--gold);box-shadow:0 0 0 4px var(--gold-dim);outline:none}
.dock .in input::placeholder{color:var(--faint)}
.dock .in .send{width:44px;height:44px;border-radius:50%;background:var(--gold);color:#0A0A0A;display:flex;align-items:center;justify-content:center;flex:0 0 44px;box-shadow:0 10px 20px -10px var(--gold-glow);transition:transform .2s var(--ease)}
.dock .in .send:hover{transform:translateY(-1px)}
.dock .in .send svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}
.dock .in .sugg{display:flex;flex-wrap:wrap;gap:6px;margin-top:9px}
.dock .in .sugg button{height:28px;padding:0 10px;border-radius:999px;border:1px solid var(--line);font-size:11px;color:var(--muted);background:var(--panel-solid)}
.dock .in .sugg button:hover{color:var(--fg);border-color:var(--fg)}

/* notes */
.note{border:1px dashed var(--line-2);border-radius:12px;padding:10px 12px;color:var(--muted);font-size:12px}

/* phone layout: driven by the shell's own width, so the in-page phone preview and a real phone match */
.fab,.sheetbar{display:none}
@container shell (max-width: 860px){
  .shell,.shell.nodock{grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto auto minmax(0,1fr) auto}
  .lost{grid-column:1;padding:8px 14px}
  .top{grid-column:1;padding:12px 14px 8px;min-height:0;border-bottom:0;gap:10px}
  .top .sub,.top .grow,.top .phone-toggle,.top .user{display:none}
  .top #signOut .lbl{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap} /* icon only on a phone; the name stays for screen readers */
  .top .brand{overflow:hidden}
  .top #signOut.err .lbl{position:static;width:auto;height:auto;clip-path:none}
  .top .brand{flex:1;min-width:0}
  .top .brand .title{font-size:13px}
  .strip-row{grid-row:3;grid-column:1;padding:0 14px 10px;border-bottom:1px solid var(--line)}
  .strip-row .strip{gap:6px}
  .rail{grid-row:5;grid-column:1;flex-direction:row;justify-content:space-around;border-right:0;border-top:1px solid var(--line);padding:6px 8px calc(6px + env(safe-area-inset-bottom,0px));gap:0;background:var(--panel)}
  .rail .spacer{display:none}
  .rail button{width:64px;height:52px;border-radius:14px}
  .rail .cnt{top:4px;right:8px}
  .main{grid-row:4;grid-column:1;padding:12px 12px 20px}
  .view{gap:12px}
  .row{gap:12px}
  .span-6,.span-3,.span-2,.span-4{grid-column:span 6}
  .kpis .span-6,.kpis .span-2,.kpis .kpi{grid-column:span 3}
  .hero h1{font-size:20px}
  .panel{padding:14px 14px;border-radius:16px}
  .panel .ph .src{display:none}
  .sm{grid-template-columns:repeat(3,minmax(0,1fr))}
  .pvj{grid-template-columns:minmax(0,1fr)}
  .bars{gap:4px}
  .bars .b .n{font-size:9.5px}
  .item{grid-template-columns:auto minmax(0,1fr);row-gap:2px}
  .item .v{grid-column:2;white-space:normal;text-align:left;color:var(--fg)}
  .dock{position:absolute;left:0;right:0;bottom:0;top:auto;height:76%;border-left:0;border-top:1px solid var(--line-2);border-radius:22px 22px 0 0;z-index:30;transform:translateY(102%);transition:transform .32s var(--ease);display:flex;background:var(--panel-solid);box-shadow:0 -20px 50px -20px rgba(10,10,10,.35)}
  .shell.nodock .dock{display:flex}
  .shell.dockopen .dock{transform:none}
  .sheetbar{display:block;width:44px;height:5px;border-radius:3px;background:var(--line-2);margin:10px auto 0}
  .dock .dh{padding-top:8px}
  .fab{display:flex;position:absolute;right:14px;bottom:calc(74px + env(safe-area-inset-bottom,0px));z-index:25;height:48px;padding:0 16px 0 14px;border-radius:999px;background:var(--gold);color:#0A0A0A;align-items:center;gap:8px;font-weight:600;font-size:13px;box-shadow:0 14px 30px -10px var(--gold-glow)}
  .fab svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
  .shell.dockopen .fab{display:none}
  .scrim{position:absolute;inset:0;background:rgba(10,10,10,.25);z-index:29;opacity:0;pointer-events:none;transition:opacity .3s}
  .shell.dockopen .scrim{opacity:1;pointer-events:auto}
}
@container shell (max-width: 1240px) and (min-width: 861px){
  .kpis .kpi{grid-column:span 2}
  .shell.hasdock .span-3{grid-column:span 6}
  .sm{grid-template-columns:repeat(4,minmax(0,1fr))}
}
@media (max-width: 860px){ .frame{padding:0} .shell{border-radius:0;border:0} }
.strip-row{display:none}
@container shell (max-width: 860px){ .strip-row{display:block} }

/* in-page phone preview: a 390 by 844 device frame; the shell inside gets the phone layout from the container query */
.frame.phone{display:grid;place-items:center;padding:16px}
.frame.phone .device{container-type:inline-size;container-name:shell;position:relative;width:390px;height:min(844px,calc(100vh - 32px));border-radius:48px;background:#1C1C1C;padding:12px;box-shadow:0 60px 120px -40px rgba(10,10,10,.6), inset 0 0 0 2px #3a3a3a}
.frame.phone .device::before{content:"";position:absolute;top:22px;left:50%;transform:translateX(-50%);width:110px;height:30px;border-radius:999px;background:#0A0A0A;z-index:40}
.frame.phone .shell{border-radius:38px;border:0;height:100%;grid-template-rows:auto auto auto minmax(0,1fr) auto}
.frame.phone .top{padding-top:62px}
.exitphone{position:absolute;top:16px;right:20px;z-index:50;height:40px;padding:0 16px;border-radius:999px;background:var(--fg);color:var(--bg);font-weight:600;font-size:12.5px;display:inline-flex;align-items:center;gap:8px;box-shadow:0 14px 30px -12px rgba(10,10,10,.5)}
.exitphone svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:2.2;stroke-linecap:round}

@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
.hidden{display:none!important}

/* ---------- live page additions (not in the mockup): sign-in, the cloud views' fields, tables and switch, a motor (label, ridge or line) gold only on hover ---------- */
.signwrap{height:100%;overflow-y:auto;display:grid;place-items:center;padding:16px}
.signcard{width:min(380px,100%);display:grid;gap:14px;background:var(--panel-solid);border:1px solid var(--edge);border-radius:var(--r);padding:24px 22px 22px;box-shadow:var(--shadow-lift);animation:rise .35s var(--ease) both}
.signcard .brand{display:flex;align-items:center;gap:10px;font-weight:600}
.signcard h1{font-size:24px;font-weight:300;letter-spacing:-.01em}
.signcard .btn{justify-content:center}
.signerr{min-height:18px}
.signerr .st{letter-spacing:0;font-size:12px;font-weight:500}
.top .user{color:var(--muted);font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:16ch}
.field{display:grid;gap:5px;min-width:0}
.field label{font-size:10.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);font-weight:600}
.field input,.field select{width:100%;min-width:0;height:42px;border-radius:12px;border:1px solid var(--line-2);background:var(--panel-solid);color:var(--fg);padding:0 12px;font:inherit;transition:border-color .2s,box-shadow .2s}
.field input:focus,.field select:focus{border-color:var(--gold);box-shadow:0 0 0 4px var(--gold-dim);outline:none}
.controls{display:flex;flex-wrap:wrap;gap:10px 12px;align-items:flex-end;margin-top:4px}
.controls .field{flex:1 1 120px}
.controls .field.grow{flex:3 1 220px}
.btns{display:flex;flex-wrap:wrap;gap:6px}
.chips{display:flex;flex-wrap:wrap;gap:6px;margin:12px 0 2px}
.chip{display:inline-flex;align-items:center;gap:4px;max-width:100%;height:30px;padding:0 3px 0 11px;border-radius:999px;background:var(--gold-dim);font-size:11.5px}
.chip>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chip button{flex:0 0 26px;width:26px;height:26px;border-radius:50%}
.chip button:hover{background:var(--panel-solid)}
.flist{display:grid;gap:16px}
.tags{display:flex;flex-wrap:wrap;gap:8px}
.spline{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;margin-top:10px;font-size:12.5px}
.tablewrap{overflow-x:auto;margin-top:10px}
.tbl{width:100%;border-collapse:collapse;font-size:12px}
.tbl th{text-align:left;font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--faint);font-weight:600;padding:6px 8px;border-bottom:1px solid var(--line-2)}
.tbl td{padding:8px;border-bottom:1px solid var(--line);vertical-align:middle}
.tbl td.name{word-break:break-all;min-width:12ch}
.tbl td .st{vertical-align:middle;margin-right:4px}
.btn.sm{height:30px;padding:0 11px;font-size:11.5px;border-radius:10px}
a{color:inherit;text-decoration-color:var(--gold);text-underline-offset:3px}
a.btn{text-decoration:none}
button.link{text-decoration:underline;text-decoration-color:var(--gold);text-underline-offset:3px}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
.bar{display:block;height:8px;border-radius:999px;background:var(--line);overflow:hidden;margin:8px 0 4px}
.bar i{display:block;height:100%;border-radius:inherit;background:var(--fg)}
.bar.hot i{background:var(--gold)}
.stat{font-size:28px;font-weight:300;letter-spacing:-.01em;line-height:1.05}
.stat small{font-size:12px;color:var(--faint);font-weight:400;margin-left:4px}
.switch{height:36px;padding:0 14px 0 8px;border:1px solid var(--line-2);border-radius:999px;display:inline-flex;align-items:center;gap:9px;font-size:12px;font-weight:600;background:var(--panel)}
.switch::before{content:"";flex:0 0 30px;height:18px;border-radius:999px;background:radial-gradient(circle at 9px 50%,var(--panel-solid) 6px,transparent 7px),var(--line-2)}
.switch[aria-checked="true"]{border-color:var(--gold);background:var(--gold-dim)}
.switch[aria-checked="true"]::before{background:radial-gradient(circle at 21px 50%,#0A0A0A 6px,transparent 7px),var(--gold)}
.warnline{display:flex;align-items:center;gap:8px;margin:10px 0 0;padding:9px 12px;border-radius:12px;background:var(--gold-dim);font-size:12.5px;font-weight:500}
.crumbs{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:12px 0 6px;font-size:12px;color:var(--muted)}
.picker{margin-top:14px}
.detail dd .st{vertical-align:-3px}
.picklist{list-style:none;margin:0;padding:0;display:grid;gap:2px;max-height:300px;overflow-y:auto}
.picklist button{width:100%;min-height:40px;padding:6px 10px;border-radius:var(--r-s);text-align:left;font-size:12.5px}
.picklist button:hover{background:var(--panel-2)}
.picklist button.sel{background:var(--gold-dim);box-shadow:inset 3px 0 0 var(--gold)}
#spNew{margin-top:12px}
@container shell (max-width: 860px){ /* after the base table rules, so these win */
  .tbl thead{display:none} /* a phone stacks each file: name across, then source and size, then status and download */
  .tbl tr{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:4px 10px;padding:9px 0;border-bottom:1px solid var(--line)}
  .tbl td{padding:0;border:0}
  .tbl td.name{grid-column:1/-1;order:-1}
}
.model3d .labels .mlabel{pointer-events:auto}
.model3d .labels .mlabel:hover{border-color:var(--gold);box-shadow:0 0 0 3px var(--gold-dim),0 8px 18px -10px rgba(10,10,10,.45)}
.model3d .labels .mlabel:hover b{color:var(--gold-2)}
svg.chart g.lane:hover path{fill:var(--gold);fill-opacity:.9}
svg.chart .lf-hit{fill:none;stroke:transparent;stroke-width:10}
svg.chart .lf-hit:hover+.lf,svg.chart .lf:hover{stroke:var(--gold);stroke-width:2;opacity:1}
.pvj svg.chart .lf-hit:hover+.lf:not(.px),.pvj svg.chart .lf:not(.px):hover{stroke:var(--fg);stroke-width:2.4} /* hovering the Jetson line never paints it Pixhawk gold */
