diff --git a/src/web_ui/index.html b/src/web_ui/index.html index 08a9fda..2cfd72b 100644 --- a/src/web_ui/index.html +++ b/src/web_ui/index.html @@ -400,6 +400,52 @@ .sx-val{font-size:12px;color:var(--muted);white-space:nowrap;font-variant-numeric:tabular-nums} @media(max-width:760px){.sx-2col{grid-template-columns:1fr;gap:14px}.sx-hero{grid-column:span 2}} + /* ── Maintenance: "diagnostics console" ─────────────────────────────────── + Shares the sx-* section/eyebrow language but reads as a systems-health + readout: a pulsing verdict, per-subsystem status tiles, and instrument + panels. Status colour flows through --mx-c off a data-status attribute, + scoped to .mx-body so it can't leak onto other data-status nodes. */ + .mx-body{position:relative} + .mx-body [data-status=ok]{--mx-c:#4ade80} + .mx-body [data-status=warn]{--mx-c:#facc15} + .mx-body [data-status=bad]{--mx-c:#f87171} + .mx-body [data-status=pending]{--mx-c:var(--muted)} + .mx-hero{display:flex;align-items:center;gap:15px;border:1px solid var(--hair);border-radius:var(--radius); + padding:15px 17px;margin:9px 0 13px;position:relative;overflow:hidden; + background:radial-gradient(150% 130% at 0% 0%,color-mix(in srgb,var(--mx-c,var(--accent)) 16%,transparent),transparent 60%),linear-gradient(158deg,var(--card),var(--panel))} + .mx-pulse{flex-shrink:0;width:14px;height:14px;border-radius:50%;background:var(--mx-c,#4ade80); + box-shadow:0 0 10px var(--mx-c,#4ade80);animation:mxPulse 2.4s ease-out infinite} + @keyframes mxPulse{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--mx-c,#4ade80) 55%,transparent),0 0 10px var(--mx-c,#4ade80)}70%{box-shadow:0 0 0 13px transparent,0 0 10px var(--mx-c,#4ade80)}100%{box-shadow:0 0 0 0 transparent,0 0 10px var(--mx-c,#4ade80)}} + .mx-verdict{font-family:var(--font-display);font-weight:400;font-size:2.1rem;line-height:1} + .mx-verdict-sub{font-size:11px;color:var(--muted);letter-spacing:.04em;text-transform:uppercase;margin-top:3px} + + .mx-tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin-bottom:4px} + .mx-tile{position:relative;overflow:hidden;border:1px solid var(--hair);border-radius:var(--radius);padding:11px 13px; + background:linear-gradient(158deg,color-mix(in srgb,var(--card) 90%,transparent),color-mix(in srgb,var(--panel) 78%,transparent))} + .mx-tile::after{content:'';position:absolute;left:0;top:0;height:2px;width:100%;background:var(--mx-c,var(--muted))} + .mx-th{display:flex;align-items:center;gap:7px;font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--muted);font-weight:700} + .mx-dot{width:8px;height:8px;border-radius:50%;background:var(--mx-c,var(--muted));flex-shrink:0;box-shadow:0 0 7px var(--mx-c,transparent)} + .mx-tv{font-family:var(--font-display);font-weight:400;font-size:1.95rem;line-height:1.05;margin-top:5px} + + .mx-group{border:1px solid var(--hair);border-radius:var(--radius-sm);padding:10px 12px;margin-bottom:9px; + background:color-mix(in srgb,var(--card) 28%,transparent)} + .mx-group-h{font-weight:700;font-size:12.5px;margin-bottom:7px;display:flex;align-items:center;gap:8px} + .mx-group-h .mx-id{color:var(--muted);font-weight:400;font-variant-numeric:tabular-nums} + .mx-item{display:flex;align-items:center;gap:9px;font-size:12px;padding:5px 0; + border-bottom:1px solid color-mix(in srgb,var(--hair) 55%,transparent)} + .mx-group .mx-item:last-child{border-bottom:none} + .mx-item input[type=checkbox]{accent-color:var(--accent);flex-shrink:0} + .mx-item .mx-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} + .mx-item .mx-sub{color:var(--muted)} + .mx-conf{width:9px;height:9px;border-radius:50%;flex-shrink:0;box-shadow:0 0 6px currentColor} + .mx-pill{flex-shrink:0;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em; + padding:2px 9px;border-radius:999px;border:1px solid} + .mx-pill.keep{color:#4ade80;border-color:color-mix(in srgb,#4ade80 50%,transparent);background:color-mix(in srgb,#4ade80 13%,transparent)} + .mx-pill.remove{color:#f87171;border-color:color-mix(in srgb,#f87171 50%,transparent);background:color-mix(in srgb,#f87171 13%,transparent)} + .mx-prog{height:9px;border-radius:6px;overflow:hidden;border:1px solid var(--hair);background:color-mix(in srgb,var(--card) 55%,transparent)} + .mx-prog>i{display:block;height:100%;border-radius:6px;transition:width .35s ease; + background:linear-gradient(90deg,var(--accent),color-mix(in srgb,var(--accent) 38%,transparent))} + @media(prefers-reduced-motion:reduce){*{animation:none!important;transition-duration:.001ms!important}} @@ -2583,9 +2629,9 @@ function sxBoardSwitch(metric,btn){ /* ── Maintenance (library health) ───────────────────────────────── */ async function openMaintenance(){ const bg=document.createElement('div');bg.className='modal-bg';bg.onclick=e=>{if(e.target===bg)bg.remove()}; - bg.innerHTML=`