*{box-sizing:border-box}body{color:#e6edf3;background:#0f1419;min-height:100vh;margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}#root{min-height:100vh}.app{max-width:900px;margin:0 auto;padding:32px 20px 60px}.login-gate{justify-content:center;align-items:center;min-height:100vh;padding:20px;display:flex}.login-card{background:#161b22;border:1px solid #30363d;border-radius:12px;flex-direction:column;gap:14px;width:100%;max-width:380px;padding:36px 32px;display:flex;box-shadow:0 20px 60px #0006}.login-title{letter-spacing:-.02em;text-align:center;margin:0;font-size:24px;font-weight:700}.login-subtitle{text-align:center;color:#8b949e;margin:0 0 8px;font-size:13px}.login-card label{flex-direction:column;gap:6px;display:flex}.login-card label span{color:#8b949e;font-size:12px}.login-card input{color:#e6edf3;background:#0d1117;border:1px solid #30363d;border-radius:6px;padding:10px 12px;font-family:ui-monospace,monospace;font-size:14px}.login-card input:focus{border-color:#3fb950;outline:none}.app-header{position:relative}.logout-btn{color:#8b949e;cursor:pointer;background:0 0;border:1px solid #30363d;border-radius:6px;padding:6px 12px;font-size:12px;position:absolute;top:0;right:0}.logout-btn:hover{color:#e6edf3;background:#21262d}.app-header{text-align:center;margin-bottom:24px}.app-header h1{letter-spacing:-.02em;margin:0 0 6px;font-size:28px}.app-header .subtitle{color:#8b949e;margin:0;font-size:14px}.tabs{gap:6px;margin:20px 0 12px;display:flex}.tab{color:#8b949e;cursor:pointer;background:#0d1117;border:1px solid #30363d;border-radius:8px;flex:1;padding:10px 14px;font-size:14px}.tab.active{color:#e6edf3;background:#1f2937;border-color:#3fb950}.panel{background:#161b22;border:1px solid #30363d;border-radius:10px;margin-bottom:16px;padding:22px}.panel h2{margin:0 0 14px;font-size:17px;font-weight:600}.subpanel{background:#0d1117;border:1px solid #21262d;border-radius:8px;margin-top:20px;padding:16px}.subpanel h3{color:#c9d1d9;align-items:center;gap:8px;margin:0 0 12px;font-size:14px;font-weight:600;display:flex}.subpanel h3 .icon{color:#79c0ff}.form-row{flex-wrap:wrap;align-items:flex-end;gap:12px;margin-bottom:12px;display:flex}.form-row label{color:#8b949e;flex-direction:column;flex:1;gap:4px;min-width:160px;font-size:12px;display:flex}.form-row input[type=text],.form-row input[type=number],.form-row input[type=password]{color:#e6edf3;background:#0d1117;border:1px solid #30363d;border-radius:6px;padding:8px 10px;font-family:ui-monospace,monospace;font-size:14px}.form-row input:focus{border-color:#3fb950;outline:none}.form-row input:disabled,.form-grid input:disabled{color:#6e7681;cursor:not-allowed;background:#1a1f25}.auto-tag{color:#fff;vertical-align:middle;background:#1f6feb;border-radius:3px;margin-left:6px;padding:1px 6px;font-size:10px;font-weight:600;display:inline-block}.form-row label.checkbox{color:#c9d1d9;flex-direction:row;flex:0;align-items:center;gap:6px;font-size:13px}.form-grid{grid-template-columns:1fr 1fr;gap:10px;margin-bottom:12px;display:grid}.form-grid label{color:#8b949e;flex-direction:column;gap:4px;font-size:12px;display:flex}.form-grid input{color:#e6edf3;background:#0d1117;border:1px solid #30363d;border-radius:6px;padding:8px 10px;font-family:ui-monospace,monospace;font-size:13px}.token-row{margin-bottom:16px}.token-row label{color:#8b949e;margin-bottom:4px;font-size:12px;display:block}.token-input-wrap{gap:6px;display:flex}.token-input-wrap input{color:#e6edf3;background:#0d1117;border:1px solid #30363d;border-radius:6px;flex:1;padding:8px 10px;font-family:ui-monospace,monospace;font-size:12px}.btn{color:#e6edf3;cursor:pointer;background:#21262d;border:1px solid #30363d;border-radius:6px;padding:8px 16px;font-size:13px;transition:all .15s}.btn:hover:not(:disabled){background:#30363d}.btn:disabled{opacity:.4;cursor:not-allowed}.btn-primary{color:#fff;background:#238636;border-color:#2ea043}.btn-primary:hover:not(:disabled){background:#2ea043}.btn-sm{padding:4px 10px;font-size:12px}.btn-stop{color:#fff;background:#da3633;border-color:#f85149}.icon{vertical-align:middle;flex-shrink:0}.success{color:#3fb950;align-items:center;gap:6px;font-weight:500;display:inline-flex}.error{color:#ffa198;background:#41151a;border:1px solid #f85149;border-radius:6px;align-items:flex-start;gap:8px;margin-top:10px;padding:10px;font-size:13px;display:flex}.error .icon{margin-top:1px}.warning{color:#e3b341;background:#2a1f05;border:1px solid #d29922;border-radius:6px;align-items:center;gap:8px;margin-top:12px;padding:10px 12px;font-size:13px;display:flex}.info-msg{color:#79c0ff;margin-top:10px;font-size:13px}.info-box{background:#0d2818;border:1px solid #238636;border-radius:6px;margin-top:10px;padding:10px;font-family:ui-monospace,monospace;font-size:12px;line-height:1.6}.info-box code{color:#3fb950}.info-box .token{color:#8b949e;font-size:11px}.status-row{align-items:center;gap:14px;display:flex}.hint{color:#6e7681;margin-top:8px;font-size:12px;font-style:italic}.lcd-buttons{flex-wrap:wrap;gap:8px;margin-top:4px;display:flex}.motor-pad{grid-template-columns:repeat(3,80px);gap:6px;margin-top:8px;display:grid}.motor-pad .btn{padding:14px 0;font-size:14px}.cam-preview{background:#000;border:1px solid #30363d;border-radius:6px;margin-top:12px;padding:10px;display:inline-block}.cam-preview img{max-width:320px;display:block}.sensor-grid{grid-template-columns:repeat(3,1fr);gap:10px;margin-top:12px;display:grid}.sensor-cell{text-align:center;background:#0d1117;border:1px solid #30363d;border-radius:6px;padding:12px}.sensor-cell span{color:#8b949e;margin-bottom:4px;font-size:12px;display:block}.sensor-cell b{color:#79c0ff;font-family:ui-monospace,monospace;font-size:20px}.prereq-hint{color:#d8c590;background:#1a1a0a;border:1px solid #4a3a18;border-radius:6px;align-items:flex-start;gap:8px;margin-bottom:12px;padding:8px 12px;font-size:12.5px;line-height:1.5;display:flex}.prereq-hint .icon{color:#ffd965;flex-shrink:0;margin-top:2px}.prereq-hint b{color:#ffe39a}.id-source-notice{color:#ffd9a3;background:#2a1f05;border:1px solid #d29922;border-radius:8px;align-items:flex-start;gap:10px;margin-bottom:16px;padding:12px 14px;font-size:13px;line-height:1.6;display:flex}.id-source-notice .icon{color:#ffd965;flex-shrink:0;margin-top:2px}.id-source-notice b{color:#ffe39a}.id-source-notice a{color:#79c0ff;text-decoration:none}.id-source-notice a:hover{text-decoration:underline}.hotspot-checklist{background:#2a1f05;border:1px solid #d29922;border-radius:8px;margin-bottom:14px;padding:14px 16px}.hotspot-checklist-title{color:#f0c674;align-items:center;gap:8px;margin-bottom:10px;font-size:14px;font-weight:700;display:flex}.hotspot-checklist-title .icon{color:#ffd965}.hotspot-checklist ul{color:#e6dab1;margin:0;padding-left:22px;font-size:13px;line-height:1.7}.hotspot-checklist li{margin:4px 0}.hotspot-checklist code{color:#ffd965;background:#1a1409;border:1px solid #6c4f1c;border-radius:4px;margin-left:6px;padding:1px 8px;font-family:ui-monospace,Consolas,monospace;font-size:12px;display:inline-block}.hotspot-checklist b{color:#ffe39a}.mqtt-connect-panel{padding:16px 18px}.mqtt-connect-row{flex-wrap:wrap;align-items:center;gap:14px;display:flex}.mqtt-broker-url{color:#8b949e;white-space:nowrap;text-overflow:ellipsis;background:#0d1117;border:1px solid #21262d;border-radius:4px;flex:1;padding:4px 8px;font-family:ui-monospace,Consolas,monospace;font-size:12px;overflow:hidden}.section-title{letter-spacing:-.01em;align-items:center;gap:10px;margin:28px 0 12px;font-size:18px;font-weight:700;display:flex}.step-num{color:#fff;background:#1f6feb;border-radius:50%;justify-content:center;align-items:center;width:26px;height:26px;font-size:13px;font-weight:700;display:inline-flex}.section-tag{color:#8b949e;background:#21262d;border-radius:999px;margin-left:6px;padding:2px 8px;font-size:11px;font-weight:600;display:inline-block}.boot-guide{background:#0d1117;border:1px solid #30363d;border-radius:8px;margin-bottom:16px;padding:14px 16px}.boot-guide-title{color:#e6edf3;margin-bottom:10px;font-size:14px;font-weight:700}.boot-steps{color:#c9d1d9;margin:0 0 12px;padding-left:22px;font-size:13px;line-height:1.7}.boot-steps li{margin:4px 0}.boot-steps b{color:#e6edf3}.boot-warning{color:#ffd9b3;background:#2d1b14;border:1px solid #6c3a25;border-radius:6px;align-items:flex-start;gap:8px;padding:10px 12px;font-size:12.5px;line-height:1.6;display:flex}.boot-warning .icon{color:#ffb380;margin-top:2px}.boot-warning b{color:#ffb380}.firmware-summary{background:#0d1117;border:1px solid #30363d;border-radius:6px;margin:14px 0;padding:12px 14px}.firmware-summary-title{color:#8b949e;margin-bottom:8px;font-size:12px}.firmware-summary ul{flex-direction:column;gap:4px;margin:0;padding:0;font-family:ui-monospace,Consolas,monospace;font-size:12px;list-style:none;display:flex}.firmware-summary li{color:#c9d1d9;gap:12px;display:flex}.firmware-summary code{color:#79c0ff;min-width:80px}.firmware-summary-name{color:#c9d1d9}.btn-large{width:100%;margin-top:12px;padding:14px 22px;font-size:15px}.progress-list{background:#0d1117;border:1px solid #30363d;border-radius:6px;margin-top:14px;padding:12px}.progress-header{margin-bottom:6px;font-size:13px;font-weight:600}.progress-bar-wrapper{background:#21262d;border-radius:4px;width:100%;height:8px;margin:6px 0;overflow:hidden}.progress-bar{background:linear-gradient(90deg,#2ea043,#3fb950);height:100%;transition:width .2s}.progress-text{color:#8b949e;font-family:ui-monospace,Consolas,monospace;font-size:12px}.modal-overlay{z-index:1000;background:#000000b3;justify-content:center;align-items:center;animation:.2s ease-out fadeIn;display:flex;position:fixed;inset:0}.modal-content{text-align:center;background:#161b22;border:1px solid #30363d;border-radius:12px;width:calc(100% - 40px);max-width:440px;padding:32px 28px;animation:.25s cubic-bezier(.34,1.56,.64,1) popIn;box-shadow:0 20px 60px #00000080}.modal-icon{justify-content:center;margin-bottom:12px;display:flex}.modal-icon-success{color:#3fb950}.modal-icon-warning{color:#ffd965}.modal-title{color:#56d364;letter-spacing:-.01em;margin:0 0 12px;font-size:22px;font-weight:700}.modal-desc{color:#c9d1d9;margin:0 0 24px;font-size:14px;line-height:1.6}.modal-content .btn{min-width:120px}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes popIn{0%{opacity:0;transform:scale(.92)translateY(-8px)}to{opacity:1;transform:scale(1)translateY(0)}}.toggle-section{color:#8b949e;cursor:pointer;text-align:left;background:#161b22;border:1px solid #30363d;border-radius:8px;align-items:center;gap:8px;width:100%;margin-top:8px;padding:12px 16px;font-size:14px;font-weight:600;display:flex}.toggle-section:hover{color:#e6edf3;background:#1c222a}.app-footer{text-align:center;color:#6e7681;margin-top:40px;font-size:12px}.footer-warning{color:#e3b341;align-items:center;gap:6px;display:inline-flex}
