@import"https://fonts.googleapis.com/css2?family=Sora:wght@400;600;700&family=Space+Mono:wght@400;700&display=swap";:root{--bg-0: #061021;--bg-1: #10203f;--panel: rgba(10, 21, 45, .86);--panel-soft: rgba(13, 28, 57, .72);--panel-border: rgba(121, 170, 255, .22);--text: #eaf1ff;--muted: #a0b5df;--good: #55db95;--warn: #ffb84d;--danger: #f25f5c;--accent: #66a6ff;--radius: 16px}*,*:before,*:after{box-sizing:border-box}img,svg,canvas,iframe{max-width:100%}html,body{width:100%;max-width:100%;height:100%;min-height:100%;overflow:hidden;background-color:var(--bg-0)}body{margin:0;font-family:Sora,sans-serif;color:var(--text);background:radial-gradient(circle at 8% -20%,#1d4f9a,transparent 40%),radial-gradient(circle at 100% 120%,#844a2d,transparent 30%),linear-gradient(145deg,var(--bg-0),var(--bg-1));overscroll-behavior:none}#root{height:100%;min-height:100%;min-height:100dvh;width:100%}.app-shell{height:100%;min-height:100vh;min-height:100dvh;width:100%;position:relative;padding:1.1rem;padding-bottom:calc(1.1rem + env(safe-area-inset-bottom,0px));max-width:100%;overflow-y:auto;overflow-x:clip;-webkit-overflow-scrolling:touch;overscroll-behavior:contain}.backdrop{position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;background-image:linear-gradient(transparent 97%,#ffffff08 98%),linear-gradient(90deg,transparent 97%,rgba(255,255,255,.03) 98%);background-size:34px 34px;opacity:.35}.topbar{display:flex;justify-content:space-between;align-items:flex-start;gap:1rem;margin-bottom:1rem;position:relative;z-index:1}.kicker{margin:0;color:#8ec8ff;text-transform:uppercase;letter-spacing:.12em;font-size:.72rem}h1{margin:.2rem 0;font-size:clamp(1.45rem,3.6vw,2.45rem)}.subtitle{margin:0;color:var(--muted)}.status-row{display:flex;align-items:center;gap:.6rem}.pill,.pill-btn{border-radius:999px;font-size:.8rem;border:1px solid var(--panel-border);padding:.45rem .85rem;background:#111f3deb;color:var(--text)}.pill-btn{cursor:pointer;transition:border-color .14s ease}.pill-btn:hover{border-color:#b4d3ff}.pill-btn.active{border-color:#b4d3ff;background:#203a6ef2}.status-connected{color:var(--good)}.status-reconnecting,.status-offline{color:var(--warn)}.status-error{color:var(--danger)}.status-demo{color:#73f0df}.dashboard-stack{position:relative;z-index:1;display:grid;gap:1rem}.panel{background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:.95rem;-webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px);animation:rise .42s ease both}.panel-wide{width:100%}.panel,.panel-head,.metric,.load-card,.chart-wrap,.cmd-card,.row,.control-inline,.control-row,.prediction-head,.prediction-suggestions,.stack-list{min-width:0;max-width:100%}@keyframes rise{0%{transform:translateY(10px);opacity:0}to{transform:translateY(0);opacity:1}}.panel-head{display:flex;justify-content:space-between;align-items:flex-start;gap:.8rem;margin-bottom:.8rem}.panel-head h2{margin:0;font-size:1.02rem}.panel-subtitle{margin:.2rem 0 0;color:var(--muted);font-size:.83rem}.metrics-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(145px,1fr));gap:.55rem}.metrics-analytics .metric{min-height:76px}.metric{padding:.62rem;border-radius:11px;border:1px solid rgba(150,178,222,.16);background:var(--panel-soft)}.metric-label{color:var(--muted);font-size:.73rem}.metric-value{font-size:1rem;font-weight:600;margin-top:.08rem;overflow-wrap:anywhere}.metric-unit{color:var(--muted);font-size:.8rem}.load-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(290px,1fr));gap:.75rem}.ble-device-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:.8rem}.ble-device-card{border:1px solid rgba(150,178,222,.16);background:var(--panel-soft);border-radius:13px;padding:.8rem;display:grid;gap:.75rem}.ble-device-head{display:flex;justify-content:space-between;align-items:flex-start;gap:.8rem}.ble-device-head h3{margin:0;font-size:.96rem}.ble-device-head p{margin:.22rem 0 0;color:var(--muted);font-size:.78rem;word-break:break-all}.ble-signal-block{display:grid;justify-items:end;gap:.18rem;text-align:right}.ble-rssi{font-size:.9rem;font-weight:700}.ble-age{color:var(--muted);font-size:.75rem}.ble-device-tags{display:flex;gap:.4rem;flex-wrap:wrap}.ble-device-metrics{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.5rem}.ble-device-details{display:grid;gap:.45rem}.ble-device-detail{display:grid;gap:.14rem;padding:.55rem .62rem;border:1px solid rgba(150,178,222,.16);border-radius:11px;background:#07102373}.ble-device-detail span{color:var(--muted);font-size:.72rem}.ble-device-detail strong{font-size:.82rem;line-height:1.4;word-break:break-word}.load-card{border:1px solid rgba(150,178,222,.16);background:var(--panel-soft);border-radius:13px;padding:.7rem}.load-card-head{display:flex;justify-content:space-between;align-items:center;gap:.5rem}.load-card h3{margin:0;font-size:.95rem}.load-state{border-radius:999px;font-size:.75rem;font-weight:700;padding:.2rem .58rem}.load-state.on{color:var(--good);background:#55db952e}.load-state.off{color:var(--danger);background:#f25f5c33}.load-fault{border-radius:999px;font-size:.7rem;font-weight:700;padding:.18rem .5rem;color:#fff1f1;background:#f25f5c8c;text-transform:uppercase}.load-meta{margin-top:.3rem;display:flex;gap:.5rem;flex-wrap:wrap;color:var(--muted);font-size:.75rem}.load-readings{margin-top:.52rem;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.45rem}.control-row{margin-top:.55rem;display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.control-block{margin-top:.55rem}.control-block label{display:block;margin-bottom:.32rem;color:var(--muted);font-size:.8rem}.control-inline{display:grid;grid-template-columns:1fr 90px 92px;gap:.45rem;align-items:center}.threshold-grid{grid-template-columns:repeat(auto-fit,minmax(140px,1fr)) 90px}.threshold-grid .inline-field{display:grid;gap:.25rem;margin:0}.threshold-grid .inline-field span{font-size:.72rem;color:var(--muted)}.chart-grid{display:grid;grid-template-columns:1fr 1fr;gap:.8rem;margin-top:.8rem}.chart-wrap{border:1px solid rgba(150,178,222,.16);border-radius:12px;background:#08122673;padding:.4rem}.prediction-head{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.7rem}.prediction-head>div{border:1px solid rgba(150,178,222,.16);background:var(--panel-soft);border-radius:12px;padding:.58rem}.pred-label{color:var(--muted);font-size:.74rem}.pred-value{font-size:1.2rem;font-weight:700}.pred-meta{color:var(--muted);font-size:.82rem}.prediction-suggestions{margin-top:.8rem}.prediction-suggestions h3{margin:0 0 .45rem;font-size:.92rem}.history-controls{display:grid;gap:.55rem}.history-range-btns{grid-template-columns:repeat(auto-fit,minmax(94px,1fr));gap:.45rem}.history-series-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.45rem}.history-chart-scroll{width:100%;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;scrollbar-width:thin}.history-chart-scroll .recharts-wrapper{min-width:100%}.chart-static-legend{display:flex;flex-wrap:wrap;gap:.45rem;margin-bottom:.45rem}.legend-chip{display:inline-flex;align-items:center;gap:.38rem;border:1px solid rgba(150,178,222,.2);border-radius:999px;padding:.22rem .58rem;font-size:.75rem;color:var(--muted);background:#0a152d80}.legend-dot{width:9px;height:9px;border-radius:999px;display:inline-block}.legend-actual{background:#56e39f}.legend-current{background:#5ab3ff}.legend-energy,.legend-short{background:#ffd166}.legend-rf{background:#ee6c4d}.legend-lstm{background:#72efdd}.toggle-item{display:flex;align-items:center;gap:.45rem;color:var(--muted);font-size:.8rem;border:1px solid rgba(150,178,222,.2);border-radius:10px;padding:.38rem .5rem;background:#0a152d80}.toggle-item input[type=checkbox]{width:auto;margin:0}.risk-pill{border-radius:999px;padding:.34rem .65rem;font-size:.75rem}.risk-low{background:#55db952e;color:var(--good)}.risk-medium{background:#ffb84d33;color:var(--warn)}.risk-high{background:#f25f5c38;color:var(--danger)}.live-badge{display:inline-flex;align-items:center;border-radius:999px;padding:.14rem .45rem;font-size:.68rem;margin-left:.35rem;border:1px solid rgba(114,239,221,.35);background:#72efdd1f;color:#72efdd;white-space:nowrap}.cmd-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.8rem}.cmd-card{border:1px solid rgba(150,178,222,.16);background:var(--panel-soft);border-radius:12px;padding:.72rem}.cmd-card h3{margin:0 0 .55rem;font-size:.92rem}.scene-status-grid{margin-top:.6rem;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.45rem}.btn-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.45rem}.row{display:grid;grid-template-columns:1fr 1fr;align-items:center;gap:.45rem;margin-bottom:.46rem}.row label{color:var(--muted);font-size:.81rem}.field-note{color:#9fb4d8;font-size:.78rem;line-height:1.3}.row .field-note{grid-column:1 / -1}button,select,input{width:100%;border-radius:10px;border:1px solid rgba(150,178,222,.2);background:#0c1832;color:var(--text);padding:.48rem .58rem;font:inherit}button{cursor:pointer;transition:border-color .14s ease,transform 80ms ease}button:disabled,select:disabled,input:disabled{opacity:.56;cursor:not-allowed}button:hover{border-color:#b4d3ff}button:active{transform:translateY(1px)}.warn-btn{border-color:#f25f5c73;color:#ffd9d9}.danger-btn{border-color:#f25f5ccc;color:#ffe1e1;background:#5a0e1473}.ghost-btn{border-color:#96b2de59;color:#c7d6f6;background:transparent}.stack-list{margin:0;padding-left:1rem;max-height:220px;overflow:auto;font-size:.84rem;overflow-wrap:anywhere}.stack-list li{margin-bottom:.35rem}.empty{color:var(--muted)}.mono{font-family:Space Mono,monospace;color:#9dc4ff;font-size:.78rem;overflow-wrap:anywhere}.error-banner{margin-top:.8rem;color:#ffd6cc;border:1px solid rgba(242,95,92,.5);background:#f25f5c2b;padding:.65rem;border-radius:10px}.toast-stack{position:fixed;top:1rem;right:1rem;display:flex;flex-direction:column;gap:.6rem;z-index:1000}.toast{display:flex;align-items:center;gap:.8rem;padding:.7rem .9rem;border-radius:12px;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#141b2ceb;border:1px solid rgba(157,196,255,.25);color:#e8f0ff;font-size:.86rem;box-shadow:0 10px 24px #00000047;max-width:320px}.toast-warning{border-color:#ffc14d99;background:#2c200eeb;color:#ffe1a8}.toast-error{border-color:#f25f5c99;background:#361216eb;color:#ffd6cc}.toast-close{margin-left:auto;background:transparent;border:none;color:inherit;font-size:1rem;cursor:pointer}@media (max-width: 1020px){.chart-grid,.cmd-grid{grid-template-columns:1fr}.ble-hero-grid,.ble-hero-metrics,.ble-summary-grid{grid-template-columns:1fr 1fr}}@media (max-width: 760px){.app-shell{padding:.7rem}.topbar{flex-direction:column}.prediction-head,.load-grid,.row,.control-row,.btn-grid,.scene-status-grid,.metrics-grid{grid-template-columns:1fr}.history-range-btns,.history-series-grid{grid-template-columns:1fr 1fr}.control-inline{grid-template-columns:1fr}.load-card-head{flex-wrap:wrap;justify-content:flex-start}.toast-stack{top:auto;right:.7rem;bottom:.7rem;left:.7rem;align-items:stretch}.toast{max-width:none}.ble-hero-grid,.ble-hero-metrics,.ble-summary-grid,.sensor-node-readings-2,.sensor-node-meta,.ble-family-grid,.ble-sensor-grid,.sensor-support-grid{grid-template-columns:1fr}.sensor-node-ribbon,.ble-hero-card-head{flex-direction:column}.sensor-node-signal{text-align:left}}.ble-shell{background:radial-gradient(circle at 10% 0%,rgba(34,131,255,.26),transparent 28%),radial-gradient(circle at 100% 10%,rgba(45,205,160,.16),transparent 24%),linear-gradient(145deg,#07111f,#10203f 48%,#09111e)}.ble-backdrop{opacity:.22;background-size:42px 42px}.ble-hero{position:relative;z-index:1;display:grid;gap:1rem;margin-bottom:1rem}.ble-hero-copy{display:grid;gap:.55rem}.ble-subtitle{max-width:760px;line-height:1.5}.ble-status-row{flex-wrap:wrap}.ble-hero-grid{display:grid;grid-template-columns:1.5fr 1fr;gap:.9rem}.ble-hero-card{position:relative;overflow:hidden;border-radius:24px;padding:1rem;border:1px solid rgba(141,183,255,.18);background:linear-gradient(180deg,#0b152beb,#08101fe6);box-shadow:0 24px 60px #0000003d}.ble-hero-card:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(135deg,rgba(58,132,255,.16),transparent 42%);pointer-events:none}.ble-hero-card-main:after{content:"";position:absolute;right:-60px;bottom:-60px;width:220px;height:220px;border-radius:999px;background:radial-gradient(circle,rgba(46,197,255,.22),transparent 66%);pointer-events:none}.ble-hero-card-head{position:relative;z-index:1;display:flex;justify-content:space-between;gap:1rem;align-items:flex-start}.ble-hero-card h2{margin:.18rem 0 0;font-size:clamp(1.25rem,3vw,2rem)}.ble-card-eyebrow{margin:0;color:#93baff;text-transform:uppercase;letter-spacing:.16em;font-size:.7rem}.ble-health{display:inline-flex;align-items:center;justify-content:center;min-height:32px;padding:.42rem .75rem;border-radius:999px;border:1px solid rgba(255,255,255,.08);font-size:.78rem;font-weight:700}.ble-health-good{color:#d9fff0;background:#30bd8133}.ble-health-warn{color:#ffe7b8;background:#ffb84d2e}.ble-health-danger{color:#ffd6d6;background:#f25f5c33}.ble-health-muted{color:#d8e4ff;background:#8ca3d02e}.ble-hero-message{position:relative;z-index:1;margin:.85rem 0 0;max-width:58ch;color:#d9e7ff;line-height:1.55}.ble-hero-metrics{position:relative;z-index:1;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.6rem;margin-top:.95rem}.ble-summary-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.6rem;margin-top:.8rem}.ble-inline-meta{position:relative;z-index:1;margin-top:.9rem;display:flex;flex-wrap:wrap;gap:.55rem}.ble-inline-meta span{border-radius:999px;padding:.34rem .62rem;font-size:.78rem;color:#c0d5ff;border:1px solid rgba(141,183,255,.14);background:#0c172ea8}.ble-inline-meta-stack{align-items:flex-start;flex-direction:column}.ble-page-stack{gap:1rem}.ble-panel{border-radius:22px;padding:1rem;background:linear-gradient(180deg,#0c172eeb,#091224e0)}.ble-empty-state{display:grid;gap:.25rem;padding:1rem;border-radius:16px;border:1px dashed rgba(151,186,255,.24);background:#08122675;color:var(--muted)}.ble-family-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:.75rem}.ble-family-card{position:relative;overflow:hidden;min-height:132px;padding:.95rem;border-radius:18px;border:1px solid rgba(150,178,222,.16);background:linear-gradient(160deg,#0c1428f0,#0a1322e0);box-shadow:inset 0 0 0 1px #ffffff05}.ble-family-card:after{content:"";position:absolute;inset:auto -40px -50px auto;width:140px;height:140px;border-radius:999px;background:radial-gradient(circle,var(--sensor-glow),transparent 70%)}.ble-family-card:before{content:"";position:absolute;left:0;top:0;bottom:0;width:5px;background:var(--sensor-accent)}.ble-family-title,.ble-family-meta,.ble-family-count{position:relative;z-index:1}.ble-family-title{color:#cbdcff;font-size:.82rem;text-transform:uppercase;letter-spacing:.1em}.ble-family-count{margin-top:.7rem;font-size:clamp(2rem,4vw,2.8rem);font-weight:700}.ble-family-meta{color:var(--muted);font-size:.82rem}.ble-sensor-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:.95rem}.sensor-node-card{position:relative;overflow:hidden;display:grid;gap:.85rem;padding:.95rem;border-radius:22px;border:1px solid rgba(150,178,222,.16);background:linear-gradient(180deg,#0a1223f0,#09101fe6);box-shadow:0 22px 42px #00000038}.sensor-node-card:after{content:"";position:absolute;inset:auto -55px -75px auto;width:180px;height:180px;border-radius:999px;background:radial-gradient(circle,var(--sensor-glow),transparent 70%);pointer-events:none}.sensor-node-ribbon,.sensor-node-readings,.sensor-support-grid,.sensor-node-status,.sensor-node-meta{position:relative;z-index:1}.sensor-node-ribbon{display:flex;justify-content:space-between;gap:1rem;align-items:flex-start;padding:.85rem;border-radius:18px;background:var(--sensor-ribbon)}.sensor-node-kind{margin:0;color:#ecf4ffb8;font-size:.72rem;text-transform:uppercase;letter-spacing:.14em}.sensor-node-ribbon h3{margin:.16rem 0 0;font-size:1.08rem}.sensor-node-ribbon span{display:block;margin-top:.24rem;font-size:.78rem;color:#ecf4ffc7;word-break:break-all}.sensor-node-signal{text-align:right}.sensor-node-signal strong{display:block;font-size:.96rem}.sensor-node-signal span{margin-top:.2rem;text-transform:uppercase;letter-spacing:.08em;font-size:.7rem}.sensor-node-readings{display:grid;gap:.7rem}.sensor-node-readings-1{grid-template-columns:1fr}.sensor-node-readings-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sensor-reading-tile{min-height:124px;padding:.9rem;border-radius:18px;border:1px solid rgba(160,192,255,.14);background:#081224a6;display:grid;align-content:space-between}.sensor-reading-placeholder{align-content:center}.sensor-reading-label{color:#c3d7ff;font-size:.78rem;text-transform:uppercase;letter-spacing:.08em}.sensor-reading-value{font-size:clamp(1.8rem,5vw,3rem);font-weight:700;line-height:1}.sensor-reading-value span{margin-left:.22rem;font-size:.92rem;color:#b8ccf3}.sensor-support-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:.55rem}.sensor-support-item{display:grid;gap:.16rem;padding:.65rem .75rem;border-radius:14px;background:#070f1c99;border:1px solid rgba(147,183,255,.14)}.sensor-support-item span{color:var(--muted);font-size:.73rem}.sensor-support-item strong{font-size:.95rem}.sensor-node-status{display:grid;gap:.15rem;padding:.72rem .85rem;border-radius:16px;border:1px solid transparent}.sensor-node-status strong{font-size:.82rem;text-transform:uppercase;letter-spacing:.08em}.sensor-node-status span{font-size:.84rem;line-height:1.45}.sensor-node-status-good{background:#31b87f29;border-color:#31b87f57;color:#d6fff0}.sensor-node-status-warn{background:#ffb84d24;border-color:#ffb84d52;color:#ffe8bc}.sensor-node-status-danger{background:#f25f5c24;border-color:#f25f5c52;color:#ffd8d8}.sensor-node-status-muted{background:#829ccf24;border-color:#829ccf3d;color:#dbe7ff}.sensor-node-meta{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.55rem}.sensor-node-meta>div{display:grid;gap:.16rem;padding:.65rem .7rem;border-radius:14px;background:#08101e85;border:1px solid rgba(141,183,255,.12)}.sensor-node-meta span{color:var(--muted);font-size:.72rem}.sensor-node-meta strong{font-size:.84rem;line-height:1.45;overflow-wrap:anywhere}@media (max-width: 1020px){.ble-hero-grid,.ble-hero-metrics,.ble-summary-grid{grid-template-columns:1fr 1fr}}@media (max-width: 760px){.ble-hero-grid,.ble-hero-metrics,.ble-summary-grid,.sensor-node-readings-2,.sensor-node-meta,.ble-family-grid,.ble-sensor-grid,.sensor-support-grid{grid-template-columns:1fr}.sensor-node-ribbon,.ble-hero-card-head{flex-direction:column}.sensor-node-signal{text-align:left}}
