:root{--bg-base:#0b1220;--bg-surface:#131c30;--bg-raised:#1b2640;--line:#2a3654;--line-bright:#3a4970;--text-primary:#e8edf7;--text-muted:#8390b0;--text-faint:#5b6788;--accent:#ff8a3d;--accent-dim:#c96b2e;--accent-glow:#ff8a3d59;--status-ok:#3ddc84;--status-ok-glow:#3ddc8459;--status-warn:#ffcc4d;--status-warn-glow:#ffcc4d59;--status-critical:#f56;--status-critical-glow:#ff556673;--status-offline:#5b6788;--bool-on:#4aa3ff;--bool-on-glow:#4aa3ff59;--severity-info:#4aa3ff;--severity-info-glow:#4aa3ff66;--heat-level-2:#ff9433;--heat-level-4:#c06bff;--font-display:"Space Grotesk", "Noto Sans TC", sans-serif;--font-body:"Inter", "Noto Sans TC", sans-serif;--font-mono:"JetBrains Mono", monospace;--radius-sm:4px;--radius-md:8px;--radius-lg:14px;--page-pad:28px 36px;--form-cols-2:1fr 1fr;--form-cols-3:repeat(3, 1fr)}@media (width<=768px){:root{--page-pad:16px 14px;--form-cols-2:minmax(0, 1fr);--form-cols-3:minmax(0, 1fr)}}*{box-sizing:border-box}html,body{background:var(--bg-base);color:var(--text-primary);font-family:var(--font-body);-webkit-font-smoothing:antialiased;margin:0;padding:0}#root{min-height:100vh}h1,h2,h3,h4{font-family:var(--font-display);letter-spacing:.01em;margin:0;font-weight:600}button{font-family:var(--font-body)}a{color:var(--accent);text-decoration:none}::selection{background:var(--accent-glow)}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.mono{font-family:var(--font-mono)}@media (width<=768px){input:not([type]),input[type=text],input[type=number],input[type=password],input[type=time],input[type=date],input[type=datetime-local],input[type=month],input[type=search],input[type=email],input[type=tel],input[type=url],select,textarea{min-height:42px;font-size:16px!important}[data-mobile-fill]>*{flex:140px;min-width:0}[data-mobile-fill]>button,[data-mobile-fill]>a{justify-content:center;align-items:center;min-height:42px;display:inline-flex}.touch-btn{min-height:42px}input[type=checkbox],input[type=radio]{min-height:0;margin-right:4px;transform:scale(1.25)}input[type=range]{min-height:0}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.001ms!important;animation-duration:.001ms!important}}@keyframes pulse-ring{0%{opacity:.7;box-shadow:0 0}70%{opacity:0;box-shadow:0 0 0 10px #0000}to{opacity:0;box-shadow:0 0 #0000}}@keyframes fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes alertToastIn{0%{opacity:0;transform:translate(24px)}to{opacity:1;transform:translate(0)}}@keyframes pulse{0%{opacity:.8;transform:scale(.9)}70%{opacity:0;transform:scale(1.6)}to{opacity:0;transform:scale(1.6)}}@keyframes marker-pop-in{0%{opacity:0;transform:translate(-50%,-46%)scale(.6)}60%{opacity:1;transform:translate(-50%,-50%)scale(1.06)}to{opacity:1;transform:translate(-50%,-50%)scale(1)}}@keyframes marker-alert-throb{0%,to{transform:scale(1)}50%{transform:scale(1.14)}}@keyframes preview-rise{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.fm-marker-icon{transition:transform .18s,filter .3s}.fm-marker-hoverable:hover .fm-marker-icon{transform:scale(1.15)}@keyframes alert-border-blink{0%,to{border-color:var(--blink-color,var(--status-critical));box-shadow:0 0 0 1px var(--blink-color,var(--status-critical)), 0 0 8px var(--blink-glow,var(--status-critical-glow))}50%{border-color:var(--line);box-shadow:0 0 0 1px #0000,0 0 #0000}}.alert-blink{animation:1s ease-in-out infinite alert-border-blink}.alert-blink-critical{--blink-color:var(--status-critical);--blink-glow:var(--status-critical-glow)}.alert-blink-warning{--blink-color:var(--status-warn);--blink-glow:#f0b43c66}.alert-blink-info{--blink-color:var(--severity-info);--blink-glow:var(--severity-info-glow)}@keyframes alert-legend-pulse{0%,to{opacity:1;text-shadow:0 0 6px var(--status-critical)}50%{opacity:.25;text-shadow:none}}.alert-pulse-legend{animation:1s ease-in-out infinite alert-legend-pulse}@keyframes iot-spin{to{transform:rotate(360deg)}}@keyframes iot-pulse{0%,to{opacity:1}50%{opacity:.3}}.readonly-guard input::placeholder,.readonly-guard textarea::placeholder{color:#0000}@keyframes iot-callpulse{0%{box-shadow:0 0 #34c7598c}70%{box-shadow:0 0 0 10px #34c75900}to{box-shadow:0 0 #34c75900}}.iot-appwin{background:var(--bg-base);pointer-events:auto;flex-direction:column;animation:.12s iot-appwin-in;display:flex;position:absolute;inset:0}@keyframes iot-appwin-in{0%{opacity:0}to{opacity:1}}.iot-appwin-head{background:var(--bg-surface);border-bottom:1px solid var(--line);flex-shrink:0;align-items:center;gap:10px;min-height:46px;padding:0 6px 0 14px;display:flex}.iot-appwin-title{min-width:0;color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:15px;font-weight:600;overflow:hidden}.iot-appwin-x{border-radius:var(--radius-sm);width:44px;height:44px;color:var(--text-primary);cursor:pointer;background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;font-size:20px;line-height:1;display:flex}.iot-appwin-x:active{background:var(--bg-raised)}.iot-appwin-body{-webkit-overflow-scrolling:touch;min-height:0;padding-bottom:env(safe-area-inset-bottom,0px);flex:1;position:relative;overflow:auto}.iot-appwin-frame{background:#0b1220;border:0;width:100%;height:100%;display:block}.iot-appwin-body.iot-appwin-body-frame{overflow:hidden}.spm-sheet{animation:.3s cubic-bezier(.2,.9,.25,1) spm-up}.spm-sheet.spm-closing{animation:.19s cubic-bezier(.4,0,1,1) forwards spm-down}@keyframes spm-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes spm-down{to{transform:translateY(100%)}}.spm-btn{-webkit-tap-highlight-color:transparent;touch-action:manipulation;-webkit-user-select:none;user-select:none;transition:transform .12s,opacity .15s,background-color .15s}.spm-btn:active:not(:disabled){transform:scale(.92)}.spm-btn:disabled{opacity:.4;cursor:default}.spm-key:active:not(:disabled){background:var(--line-bright)!important}.spm-row:active:not(:disabled){transform:scale(.98)}.spm-fadein{animation:.22s spm-fade}@keyframes spm-fade{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}.spm-ring:before,.spm-ring:after{content:"";border:2px solid #34c7598c;border-radius:50%;animation:2s cubic-bezier(.2,.6,.35,1) infinite spm-pulse;position:absolute;inset:0}.spm-ring:after{animation-delay:1s}.spm-ring.spm-ring-out:before,.spm-ring.spm-ring-out:after{border-color:#78a0ff80}@keyframes spm-pulse{0%{opacity:.9;transform:scale(1)}to{opacity:0;transform:scale(1.75)}}.spm-nudge{animation:1.6s ease-in-out infinite spm-nudge}@keyframes spm-nudge{0%,55%,to{transform:translateY(0)}65%{transform:translateY(-6px)}75%{transform:translateY(0)}85%{transform:translateY(-3px)}}.spm-sheet input[type=checkbox],.spm-sheet input[type=radio]{width:20px;height:20px;accent-color:var(--accent);flex-shrink:0}.spm-sheet input[type=range]{accent-color:var(--accent)}@media (prefers-reduced-motion:reduce){.spm-sheet,.spm-sheet.spm-closing,.spm-fadein,.spm-nudge,.spm-ring:before,.spm-ring:after{animation:none!important}.spm-btn{transition:none}}.spd-win{transform-origin:100% 100%;animation:.18s cubic-bezier(.2,.9,.25,1) spd-in}.spd-win.spd-closing{animation:.14s ease-in forwards spd-out}@keyframes spd-in{0%{opacity:0;transform:translateY(10px)scale(.97)}to{opacity:1;transform:none}}@keyframes spd-out{to{opacity:0;transform:translateY(10px)scale(.97)}}.spd-win input[type=checkbox],.spd-win input[type=radio]{width:18px;height:18px;accent-color:var(--accent);flex-shrink:0}.spd-win input[type=range]{accent-color:var(--accent)}@media (hover:hover){.spm-btn:hover:not(:disabled){filter:brightness(1.15)}.spm-key:hover:not(:disabled){background:var(--line)!important}}.spm-btn:focus-visible{outline:2px solid var(--accent);outline-offset:2px}@media (prefers-reduced-motion:reduce){.spd-win,.spd-win.spd-closing{animation:none!important}}
