:root{--bg-primary:#0f1117;--bg-secondary:#1a1b26;--bg-card:#1e1f2e;--bg-card-hover:#252638;--bg-hover:#2a2b3d;--bg-input:#161722;--bg-surface:#232435;--text-primary:#e1e2e8;--text-secondary:#9d9fb0;--text-muted:#5c5e72;--accent:#3b82f6;--accent-light:#60a5fa;--accent-dim:#3b82f61f;--success:#22c55e;--success-dim:#22c55e1f;--warning:#f59e0b;--warning-dim:#f59e0b1f;--danger:#ef4444;--danger-dim:#ef44441f;--nozzle-color:#ef4444;--bed-color:#f59e0b;--border:#2a2b3d;--border-subtle:#1f2033;--radius:10px;--radius-sm:6px;--shadow:0 1px 3px #0000003d, 0 1px 2px #00000029;--shadow-lg:0 4px 12px #0000004d, 0 2px 4px #0003;--font:"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--font-mono:"JetBrains Mono", "SF Mono", "Fira Code", "Consolas", monospace;--header-height:52px;--sidebar-width:380px;--chart-grid:#a0a0b81f;--chart-label:#a0a0b8;--chart-series:#ab47bc;--chart-series-fill:#ab47bc1f;--chart-series-line:#ab47bc66;--chart-series-point:#ab47bc80;--chart-crosshair:#ffffff40;--chart-tooltip-bg:#1e1e2ceb;--chart-tooltip-border:#ffffff26;--chart-tooltip-text:#e0e0e8;--chart-above-avg:#ef5350;--chart-below-avg:#66bb6a;--chart-temp-fill:#2196f34d;--gcode-bg:#1e1e2e;--gcode-extrusion:#2196f3;--gcode-travel:#444460;--gcode-top-layer:#0ff;--gcode-last-segment:#fff;--gcode-unknown-tool:#888}:root[data-theme=light]{--bg-primary:#f4f5fa;--bg-secondary:#fff;--bg-card:#fff;--bg-card-hover:#f0f1f6;--bg-hover:#e8e9f0;--bg-input:#fff;--bg-surface:#f0f1f6;--text-primary:#16171f;--text-secondary:#4a4c5e;--text-muted:#7c7e92;--accent:#2563eb;--accent-light:#3b82f6;--accent-dim:#2563eb1a;--success:#15803d;--success-dim:#15803d1a;--warning:#b45309;--warning-dim:#b453091a;--danger:#b91c1c;--danger-dim:#b91c1c1a;--nozzle-color:#b91c1c;--bed-color:#b45309;--border:#d6d8e2;--border-subtle:#e8e9f0;--shadow:0 1px 3px #1012201a, 0 1px 2px #1012200f;--shadow-lg:0 4px 12px #1012201f, 0 2px 4px #10122014;--chart-grid:#3c3c5a24;--chart-label:#5c5e72;--chart-series:#8e24aa;--chart-series-fill:#8e24aa1a;--chart-series-line:#8e24aa59;--chart-series-point:#8e24aa80;--chart-crosshair:#00000040;--chart-tooltip-bg:#fffffff5;--chart-tooltip-border:#00000026;--chart-tooltip-text:#16171f;--chart-above-avg:#c62828;--chart-below-avg:#2e7d32;--chart-temp-fill:#1976d240;--gcode-bg:#eef0f6;--gcode-extrusion:#1976d2;--gcode-travel:#b0b4c8;--gcode-top-layer:#00838f;--gcode-last-segment:#212121;--gcode-unknown-tool:#757575}*{box-sizing:border-box;margin:0;padding:0}body{background:var(--bg-primary);color:var(--text-primary);font-family:var(--font);min-height:100vh;font-size:14px;line-height:1.5}#app-header{height:var(--header-height);background:var(--bg-secondary);border-bottom:1px solid var(--border);z-index:100;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);justify-content:space-between;align-items:center;padding:0 20px;display:flex;position:sticky;top:0}.header-left h1{color:var(--accent);letter-spacing:-.01em;font-size:16px;font-weight:600}.header-center{align-items:center;display:flex}.header-right{align-items:center;gap:8px;display:flex}.subtitle{color:var(--text-secondary);font-size:11px}.main-tabs{background:var(--bg-input);border-radius:var(--radius);gap:1px;padding:3px;display:flex}.main-tab{border-radius:calc(var(--radius) - 3px);color:var(--text-muted);cursor:pointer;white-space:nowrap;background:0 0;border:none;padding:6px 14px;font-size:12px;font-weight:500;transition:all .15s}.main-tab:hover{color:var(--text-primary);background:#ffffff0a}.main-tab.active{background:var(--accent);color:#fff}.status-badge{letter-spacing:.02em;border-radius:12px;padding:4px 12px;font-size:11px;font-weight:600}.status-badge.disconnected{background:var(--danger-dim);color:var(--danger)}.status-badge.connecting{background:var(--warning-dim);color:var(--warning)}.status-badge.connected{background:var(--success-dim);color:var(--success)}@keyframes pos-flash{0%{color:var(--success);transform:scale(1.15)}to{color:inherit;transform:scale(1)}}.pos-flash{animation:.6s ease-out pos-flash}#app{min-height:calc(100vh - var(--header-height));padding:0}.card{background:var(--bg-card);border-radius:var(--radius);box-shadow:var(--shadow);border:1px solid var(--border);padding:16px;transition:border-color .15s}.card:hover{border-color:var(--border-subtle)}.card.collapsed{max-height:48px;overflow:hidden}.card>h3,.card>.card-header,.card>.card-head,.card>.files-header,.card>.log-header{position:relative}.card>h3:after,.card>.card-header>h3:after,.card>.files-header>h3:after,.card>.log-header>h3:after{content:"▾";color:var(--text-muted);font-size:12px;transition:transform .2s;position:absolute;top:0;right:0}.card.collapsed>h3:after,.card.collapsed>.card-header>h3:after,.card.collapsed>.files-header>h3:after,.card.collapsed>.log-header>h3:after{transform:rotate(-90deg)}.card h3{color:var(--text-muted);text-transform:uppercase;letter-spacing:.6px;margin-bottom:12px;font-size:11px;font-weight:600}.card-header{justify-content:space-between;align-items:center;margin-bottom:12px;display:flex}.card-header h3{margin-bottom:0}.camera-header-actions{gap:4px;display:flex}.camera-header-actions .btn.active{background:var(--accent);color:var(--bg-primary)}.connect-card{max-width:400px;margin:80px auto;padding:32px}.connect-card h2{color:var(--accent);margin-bottom:20px;font-size:20px}.form-group{margin-bottom:16px}.form-group label{color:var(--text-secondary);margin-bottom:4px;font-size:12px;display:block}.form-group input{background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);width:100%;color:var(--text-primary);outline:none;padding:8px 12px;font-size:14px}.form-group input:focus{border-color:var(--accent)}.error-text{color:var(--danger);min-height:18px;margin-top:8px;font-size:12px}.btn{border-radius:var(--radius-sm);cursor:pointer;color:var(--text-primary);background:var(--bg-hover);border:none;justify-content:center;align-items:center;padding:8px 16px;font-size:13px;font-weight:500;transition:all .15s;display:inline-flex}.btn:hover{filter:brightness(1.15)}.btn:active{transform:scale(.97)}.btn-primary{background:var(--accent);color:#fff}.btn-success{background:var(--success);color:#fff}.btn-warning{background:var(--warning);color:#111}.btn-danger{background:var(--danger);color:#fff}#btn-estop{background:#b00;border:2px solid #f44;font-size:16px}#btn-estop:hover{background:#d00}.btn-ghost{color:var(--text-secondary);border:1px solid var(--border);background:0 0}.btn-sm{padding:4px 10px;font-size:11px}.btn-icon{border-radius:var(--radius);width:38px;height:38px;padding:0;font-size:18px}.cmd-pending{opacity:.5;pointer-events:none}.dashboard{height:calc(100vh - var(--header-height));flex-direction:column;display:flex;overflow:hidden}.dashboard-panels{flex:1;gap:0;min-height:0;display:flex}.dashboard-sidebar{width:var(--sidebar-width);border-right:1px solid var(--border);background:var(--bg-secondary);scrollbar-width:thin;scrollbar-color:var(--border) transparent;flex-direction:column;flex-shrink:0;gap:10px;min-width:260px;max-width:600px;padding:12px;transition:width .15s,min-width .15s,padding .15s,opacity .15s;display:flex;overflow:hidden auto}.dashboard-sidebar.sidebar-hidden{opacity:0;border-right:none;overflow:hidden;width:0!important;min-width:0!important;padding:0!important}.dashboard-sidebar.sidebar-hidden+.sidebar-resize-handle{display:none}.sidebar-resize-handle{cursor:col-resize;z-index:10;background:0 0;flex-shrink:0;width:5px;transition:background .15s;position:relative}.sidebar-resize-handle:hover,.sidebar-resize-handle.dragging{background:var(--accent)}.sidebar-resize-handle:before{content:"";position:absolute;inset:0 -4px}.dashboard-main{scrollbar-width:thin;scrollbar-color:var(--border) transparent;flex:1;grid-template-columns:repeat(auto-fill,minmax(500px,1fr));align-content:start;gap:14px;padding:16px;display:grid;overflow:hidden auto}.print-status-card{flex-direction:column;flex-shrink:0;gap:10px;display:flex}.print-status-top{align-items:flex-start;gap:12px;display:flex}.print-thumbnail-wrap{border-radius:var(--radius-sm);background:var(--bg-secondary);flex-shrink:0;justify-content:center;align-items:center;width:64px;height:64px;display:flex;overflow:hidden}.print-thumbnail{object-fit:cover;width:100%;height:100%}.print-thumbnail-placeholder{opacity:.3;font-size:32px}.thumbnail-dark{background:#484858!important}.print-info{flex:1;min-width:0}.print-file{white-space:nowrap;text-overflow:ellipsis;font-size:14px;font-weight:600;overflow:hidden}.print-status-badge{letter-spacing:.02em;border-radius:10px;margin:4px 0;padding:3px 12px;font-size:13px;font-weight:600;display:inline-block}.badge-printing{color:var(--accent);background:#2196f333}.badge-paused{color:var(--warning);background:#ffa72633}.badge-busy{color:#ce93d8;background:#9c27b033}.badge-error{color:var(--danger);background:#ef535033}.badge-idle{color:var(--text-secondary);background:#a0a0b826}.exception-banner{border-radius:var(--radius);background:var(--bg-card);border:1px solid var(--border);flex-direction:column;flex-shrink:0;gap:6px;margin:8px 12px;padding:8px 12px;display:flex}.exception-item{border-radius:var(--radius-sm);padding:6px 10px;font-size:13px}.exception-item.critical{color:var(--danger);border-left:3px solid var(--danger);background:#ef535026}.exception-item.warning{color:var(--warning);border-left:3px solid var(--warning);background:#ffa7261f}.ota-banner{border-radius:var(--radius);flex-shrink:0;margin:8px 12px;padding:10px 14px;font-size:14px;font-weight:600}.ota-banner-active{color:var(--danger);border:2px solid var(--danger);background:#ef444426;animation:1.6s ease-in-out infinite ota-banner-pulse}.ota-banner-done{background:var(--success-dim);color:var(--success);border:1px solid var(--success)}.ota-banner-failed{color:var(--danger);border:1px solid var(--danger);background:#ef44441f}@keyframes ota-banner-pulse{0%,to{opacity:1}50%{opacity:.72}}.print-progress-wrap{align-items:center;gap:10px;margin:4px 0;display:flex}.progress-text-lg{color:var(--accent);min-width:50px;font-size:22px;font-weight:700;font-family:var(--font-mono)}.progress-bar{background:var(--bg-input);border-radius:3px;flex:1;height:6px;overflow:hidden}.progress-fill{background:var(--accent);border-radius:3px;height:100%;transition:width .5s;position:relative;overflow:hidden}.progress-fill.active:after{content:"";background:linear-gradient(90deg,#0000 0%,#ffffff2e 40%,#ffffff47 50%,#ffffff2e 60%,#0000 100%);animation:2s infinite shimmer;position:absolute;inset:0}@keyframes shimmer{0%{transform:translate(-100%)}to{transform:translate(100%)}}.progress-fill.pulse,.progress-text-lg.pulse{animation:.4s ease-out progress-pulse}@keyframes progress-pulse{0%{filter:brightness(1.6)}to{filter:brightness()}}.print-meta{color:var(--text-secondary);flex-wrap:wrap;gap:12px;font-size:12px;display:flex}.print-details{flex-direction:column;gap:2px;display:flex}.print-actions{flex-shrink:0;justify-content:center;gap:8px;display:flex}.temp-grid{flex-direction:column;gap:12px;display:flex}.temp-item{flex-direction:column;gap:4px;display:flex}.temp-row{justify-content:space-between;align-items:flex-end;gap:8px;display:flex}.temp-label{color:var(--text-secondary);text-transform:uppercase;letter-spacing:.5px;font-size:11px}.temp-value{font-size:22px;font-weight:700;font-family:var(--font-mono);line-height:1.1}.temp-value .temp-target{color:var(--text-muted);font-size:14px;font-weight:400}.temp-bar-wrap{background:var(--bg-input);border-radius:2px;height:4px;overflow:hidden}.temp-bar{border-radius:2px;height:100%;transition:width .5s}.nozzle-bar{background:var(--nozzle-color)}.nozzle-bar.heating{animation:1.5s infinite pulse}.nozzle-bar.at-target{background:var(--success)}.bed-bar{background:var(--bed-color)}.bed-bar.heating{animation:1.5s infinite pulse}.bed-bar.at-target{background:var(--success)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.temp-control{flex-shrink:0;align-items:center;gap:4px;display:flex}.temp-control input{background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);width:56px;color:var(--text-primary);font-size:12px;font-family:var(--font-mono);padding:3px 6px}.temp-control input:focus{border-color:var(--accent);outline:none}.temp-presets{border-top:1px solid var(--border);flex-wrap:wrap;align-items:center;gap:4px;margin-top:10px;padding-top:10px;display:flex}.preset-label{color:var(--text-muted);margin-right:4px;font-size:11px}.temp-preset-btn{border-radius:14px;padding:3px 10px;font-size:11px}.canvas-grid{flex-direction:column;gap:12px;display:flex}.canvas-unit{flex-direction:column;gap:10px;display:flex}.canvas-unit-header{color:var(--text-secondary);font-size:13px;font-weight:600}.canvas-disconnected{opacity:.5}.canvas-device{background:var(--bg-secondary);border-radius:var(--radius);align-items:center;gap:12px;padding:16px;display:flex;position:relative}.canvas-hub{flex-direction:column;align-items:center;gap:4px;min-width:48px;display:flex}.canvas-hub-label{color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;font-size:9px}.canvas-hub-tubes{flex-direction:column;gap:3px;display:flex}.canvas-tube{border-radius:2px;width:32px;height:4px}.canvas-spools{flex:1;grid-template-columns:repeat(2,1fr);gap:12px;display:grid}.canvas-spool-slot{flex-direction:column;align-items:center;gap:4px;padding:4px;display:flex;position:relative}.spool-number{background:var(--text-muted);width:20px;height:20px;color:var(--bg-primary);z-index:1;border-radius:50%;justify-content:center;align-items:center;font-size:11px;font-weight:700;display:flex;position:absolute;top:-4px;left:-4px}.spool-ring{border:4px solid;border-radius:50%;justify-content:center;align-items:center;width:64px;height:64px;transition:all .3s;display:flex;position:relative}.spool-fill{opacity:.3;border-radius:50%;width:100%;height:100%}.spool-center{background:var(--bg-card);border:2px solid #ffffff1a;border-radius:50%;width:18px;height:18px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.spool-active-indicator{border:2px solid var(--accent);border-radius:50%;animation:1.5s infinite pulse;position:absolute;inset:-6px}.spool-active .spool-number{background:var(--accent)}.spool-empty .spool-ring{opacity:.3}.spool-label{color:var(--text-primary);text-align:center;font-size:11px;font-weight:600}.spool-temp{color:var(--text-muted);font-size:9px}.spool-actions{justify-content:center;gap:4px;margin-top:2px;display:flex}.spool-actions .btn{border-radius:10px;padding:2px 8px;font-size:9px}.canvas-extruder{justify-content:center;align-items:center;min-width:48px;display:flex}.extruder-icon{color:var(--text-muted);opacity:.6;font-size:32px}.canvas-actions{align-items:center;gap:8px;display:flex}.canvas-meta{color:var(--text-muted);font-size:12px}.toggle-inline{cursor:pointer;align-items:center;gap:8px;display:flex}.canvas-empty{color:var(--text-muted);text-align:center;padding:20px;font-style:italic}.mono-filament{padding:12px}.mono-filament-header{color:var(--text-secondary);margin-bottom:12px;font-size:13px;font-weight:600}.mono-filament-spool{align-items:center;gap:16px;display:flex}.mono-spool-ring{flex-shrink:0;width:52px;height:52px}.mono-filament-info{flex-direction:column;gap:2px;display:flex}.mono-filament-type{font-size:14px;font-weight:500}.mono-filament-temp{color:var(--text-muted);font-size:12px}.mono-filament-raw{color:var(--text-muted);margin-top:8px;font-size:11px}.mono-raw-field span{color:var(--text-secondary);font-weight:500}.camera-wrap{border-radius:var(--radius-sm);background:#000;min-height:200px;position:relative;overflow:hidden}.camera-img{cursor:pointer;width:100%;display:block}#camera-card.camera-expanded{grid-column:1/-1}#camera-card.camera-expanded .camera-img{object-fit:contain;max-height:60vh}.camera-overlay{color:var(--text-muted);justify-content:center;align-items:center;font-style:italic;display:flex;position:absolute;inset:0}.camera-modal{z-index:9999;cursor:pointer;background:#000000eb;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.camera-modal.hidden{display:none}.camera-modal-content{max-width:95vw;max-height:95vh;position:relative}.camera-modal-img{object-fit:contain;border-radius:8px;max-width:95vw;max-height:95vh}.camera-modal-close{background:var(--bg-card);width:32px;height:32px;color:var(--text);cursor:pointer;border:none;border-radius:50%;justify-content:center;align-items:center;font-size:20px;display:flex;position:absolute;top:-12px;right:-12px;box-shadow:0 2px 8px #00000080}.system-info{font-size:13px}.info-grid{flex-direction:column;gap:4px;display:flex}.info-row{border-bottom:1px solid var(--border);justify-content:space-between;padding:4px 0;display:flex}.info-row:last-child{border-bottom:none}.info-label{color:var(--text-secondary)}.info-value{color:var(--text-primary);font-family:var(--font-mono);text-align:right;word-break:break-all;font-size:12px}.info-placeholder{color:var(--text-muted);text-align:center;padding:20px;font-style:italic}.gcode-preview-wrap{position:relative}.gcode-preview-canvas{border-radius:4px;width:100%;height:350px;display:block}.gcode-preview-status{color:var(--text-secondary);pointer-events:none;background:#00000080;border-radius:4px;padding:2px 8px;font-size:11px;position:absolute;top:8px;left:8px}.gcode-preview-controls{padding:4px 0}.gcode-layer-slider{width:100%;accent-color:var(--accent);margin:0}.gcode-preview-info{color:var(--text-secondary);text-align:center;padding:2px 0;font-size:11px}.gcode-preview-actions{gap:4px;display:flex}.gcode-preview-actions .btn.active{background:var(--accent);color:#fff}.control-layout{flex-direction:column;gap:12px;display:flex}.move-section{align-items:center;gap:16px;display:flex}.move-xy-grid{grid-template-rows:repeat(3,38px);grid-template-columns:repeat(3,44px);gap:3px;display:grid}.move-z-col{flex-direction:column;gap:3px;display:flex}.move-btn{background:var(--bg-secondary);border:1px solid var(--border);border-radius:50%;width:44px;height:38px;font-size:11px;font-weight:600}.home-btn{background:var(--bg-hover);border-radius:50%;font-size:16px}.position-display{font-family:var(--font-mono);gap:24px;font-size:13px;display:flex}.home-dot{background:var(--danger,#e74c3c);vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;transition:background .3s;display:inline-block}.home-dot.homed{background:var(--success,#2ecc71)}.axis span{color:var(--accent);font-weight:600}.move-distance{gap:4px;display:flex}.dist-btn{background:var(--bg-secondary);border:1px solid var(--border);border-radius:16px;padding:4px 14px}.dist-btn.active{background:var(--accent);color:#fff;border-color:var(--accent)}.speed-control{align-items:center;gap:12px;display:flex}.speed-control label{color:var(--text-secondary);white-space:nowrap;font-size:12px}.speed-buttons{flex-wrap:wrap;gap:4px;display:flex}.speed-btn{background:var(--bg-secondary);border:1px solid var(--border);border-radius:16px;padding:4px 14px}.speed-btn.active{background:var(--accent);color:#fff;border-color:var(--accent)}.fan-grid{flex-direction:column;gap:14px;margin-bottom:16px;display:flex}.fan-item{flex-direction:column;gap:6px;display:flex}.fan-header{align-items:center;gap:8px;display:flex}.fan-icon{font-size:14px}.fan-label{color:var(--text-primary);flex:1;font-size:13px}.fan-adjust{align-items:center;gap:8px;display:flex}.fan-bar-wrap{background:var(--bg-input);border-radius:3px;flex:1;height:6px;overflow:hidden}.fan-bar{background:var(--accent);border-radius:3px;height:100%;transition:width .5s}.fan-value{text-align:right;width:40px;font-size:13px;font-family:var(--font-mono);color:var(--text-secondary)}.fan-rpm{color:var(--text-muted);font-size:11px;font-family:var(--font-mono);text-align:right;min-width:55px}.temp-range{color:var(--text-muted);margin-left:4px;font-size:11px}.speed-flow-live{flex-wrap:wrap;gap:16px;margin-bottom:16px;display:flex}.speed-flow-item{flex-direction:column;flex:1;gap:2px;min-width:80px;display:flex}.speed-flow-label{color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;font-size:11px}.speed-flow-value{font-size:16px;font-family:var(--font-mono);color:var(--text-primary)}.filament-usage-display{border-top:1px solid var(--border);margin-top:12px;padding-top:8px}.filament-usage-display:empty{display:none}.filament-usage-header{color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px;font-size:11px}.filament-usage-row{font-size:13px;font-family:var(--font-mono);align-items:center;gap:8px;padding:2px 0;display:flex}.filament-usage-swatch{border-radius:2px;flex-shrink:0;width:10px;height:10px}.filament-swatch{vertical-align:middle;border:1px solid #fff3;border-radius:3px;width:12px;height:12px;margin-right:2px;display:inline-block}.filament-usage-label{color:var(--text-secondary);flex:1}.filament-usage-val{text-align:right;min-width:60px;color:var(--text-primary)}.filament-usage-total{border-top:1px solid var(--border);margin-top:4px;padding-top:4px;font-weight:600}.fan-dec,.fan-inc{background:var(--bg-secondary);border:1px solid var(--border);border-radius:50%;width:28px;height:28px;padding:0;font-size:14px}.toggle{flex-shrink:0;width:40px;height:22px;display:inline-block;position:relative}.toggle input{opacity:0;width:0;height:0}.toggle-slider{cursor:pointer;background:var(--bg-input);border:1px solid var(--border);border-radius:22px;transition:all .2s;position:absolute;inset:0}.toggle-slider:before{content:"";background:var(--text-muted);border-radius:50%;width:16px;height:16px;transition:all .2s;position:absolute;bottom:2px;left:2px}.toggle input:checked+.toggle-slider{background:var(--accent);border-color:var(--accent)}.toggle input:checked+.toggle-slider:before{background:#fff;transform:translate(18px)}.led-control{border-top:1px solid var(--border);align-items:center;gap:8px;padding-top:10px;font-size:13px;display:flex}.led-control span:last-of-type{flex:1}.files-header{justify-content:space-between;align-items:center;margin-bottom:12px;display:flex}.files-header h3{margin-bottom:0}.files-header-actions{align-items:center;gap:8px;display:flex}.file-upload-label{cursor:pointer;align-items:center;gap:4px;display:inline-flex}.file-upload-label.disabled{opacity:.5;pointer-events:none}.upload-progress{color:var(--text-secondary);align-items:center;gap:8px;margin-bottom:4px;padding:6px 0;font-size:12px;display:flex}.upload-progress.hidden{display:none}.upload-progress-bar{background:var(--bg-input);border-radius:3px;flex:1;height:6px;overflow:hidden}.upload-progress-fill{background:var(--accent);border-radius:3px;height:100%;transition:width .2s}.upload-progress.upload-error .upload-progress-fill{background:var(--error)}.file-source-tabs{background:var(--bg-input);border-radius:var(--radius-sm);gap:2px;padding:2px;display:flex}.file-source-tab{color:var(--text-secondary);cursor:pointer;border-radius:var(--radius-sm);background:0 0;border:none;padding:3px 12px;font-size:11px;font-weight:500;transition:all .15s}.file-source-tab.active{background:var(--accent);color:#fff}.file-source-tab:hover:not(.active){color:var(--text-primary)}.file-list{flex-direction:column;gap:4px;max-height:400px;display:flex;overflow-y:auto}.file-item{background:var(--bg-secondary);border-radius:var(--radius-sm);flex-direction:column;gap:4px;padding:8px;transition:background .15s;display:flex}.file-item:hover{background:var(--bg-hover)}.file-item[data-type=file]{cursor:default}.file-item[data-type=file]:not(:has(.file-print-btn:hover)):hover{background:var(--bg-hover)}.file-name-row{align-items:center;min-width:0;display:flex}.file-name{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;font-weight:500;overflow:hidden}.file-cache-marker{opacity:.8;flex-shrink:0;margin-left:6px;font-size:11px}.file-item-body{align-items:center;gap:10px;display:flex}.file-icon{flex-shrink:0;justify-content:center;align-items:center;width:40px;height:40px;font-size:20px;display:flex}.file-inline-thumb{object-fit:cover;border-radius:var(--radius-sm);width:40px;height:40px}.thumb-img-fallback{object-fit:contain;opacity:.55;padding:2px}.file-details{flex:1;min-width:0}.file-size{color:var(--text-muted);font-size:11px}.file-empty{color:var(--text-muted);text-align:center;padding:20px;font-style:italic}.loading{color:var(--text-muted);text-align:center;padding:20px}.storage-capacity{align-items:center;gap:8px;margin-bottom:6px;padding:6px 0;display:flex}.capacity-bar{background:var(--bg-input);border-radius:3px;flex:1;height:6px;overflow:hidden}.capacity-fill{background:var(--accent);border-radius:3px;height:100%;transition:width .3s}.capacity-fill.capacity-high{background:var(--warning)}.capacity-fill.capacity-warn{background:var(--error)}.capacity-text{color:var(--text-muted);white-space:nowrap;font-size:11px}.file-popover{z-index:1000;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-md);pointer-events:auto;min-width:240px;max-width:320px;padding:12px;animation:.15s fadeIn;position:fixed;box-shadow:0 8px 24px #00000080}.file-popover-inner{flex-direction:column;gap:10px;display:flex}.file-popover-thumb{object-fit:contain;border-radius:var(--radius-sm);background:var(--bg-secondary);width:100%;max-height:180px}.file-popover-name{color:var(--text-primary);word-break:break-all;font-size:13px;font-weight:600;line-height:1.3}.file-popover-table{border-collapse:collapse;width:100%;font-size:12px}.file-popover-table td{padding:2px 0}.file-popover-table td:first-child{color:var(--text-muted);white-space:nowrap;padding-right:12px}.file-popover-table td:last-child{color:var(--text-primary)}.file-popover-actions{border-top:1px solid var(--border);flex-wrap:wrap;gap:6px;margin-top:6px;padding-top:8px;display:flex}.file-popover-actions .btn{padding:4px 10px;font-size:12px}.file-breadcrumb{flex-wrap:wrap;align-items:center;gap:2px;margin-bottom:6px;padding:4px 0;font-size:12px;display:flex}.breadcrumb-sep{color:var(--text-muted);margin:0 2px}.breadcrumb-current{color:var(--text-primary);font-weight:500}.file-actions{flex-shrink:0;gap:4px;display:flex}.file-item-folder{cursor:pointer}.file-item-folder:hover{background:var(--accent-light);background:color-mix(in srgb, var(--accent) 15%, transparent)}.file-thumbnail-popup{z-index:1000;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);max-width:200px;padding:6px;position:fixed;box-shadow:0 8px 24px #0006}.file-thumbnail-popup img{border-radius:var(--radius-sm);width:100%;height:auto;display:block}.timelapse-player-wrap{margin-bottom:10px;position:relative}.timelapse-video{border-radius:var(--radius-sm);background:#000;width:100%;max-height:300px}.timelapse-close-btn{position:absolute;top:8px;right:8px}.hidden{display:none!important}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:var(--bg-secondary)}::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}@media (width<=1200px){.dashboard-panels{flex-direction:column;overflow-y:auto}.dashboard-sidebar{border-right:none;border-bottom:1px solid var(--border);grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:8px;padding:8px;display:grid;overflow-y:visible;width:100%!important;min-width:100%!important;max-width:100%!important}.dashboard-sidebar.sidebar-hidden{display:none!important}.sidebar-resize-handle{display:none}.dashboard-main{grid-template-columns:repeat(auto-fill,minmax(400px,1fr));gap:10px;padding:8px;overflow-y:visible}.dashboard{overflow:auto}}@media (width<=800px){.dashboard-sidebar,.dashboard-main{grid-template-columns:1fr!important}.print-status-top{flex-direction:column;align-items:stretch}.print-meta{flex-wrap:wrap;gap:8px}.position-display{flex-wrap:wrap}#app-header{height:auto;min-height:var(--header-height);flex-wrap:wrap;gap:4px 8px;padding:6px 12px}.header-left{flex:1 1 0;min-width:0}.header-left h1,.subtitle{white-space:nowrap;text-overflow:ellipsis;display:block;overflow:hidden}.header-left h1{font-size:14px}.header-right{flex:none}.header-center{flex:100%;order:1;min-width:0}.main-tabs{width:100%;overflow-x:auto}.main-tab{flex:1 0 auto;min-width:44px;min-height:44px;padding:0 12px;font-size:13px}.header-right .btn,.svc-header-badge{min-width:44px;min-height:44px}#app-header .svc-header-wrap{position:static}#app-header .svc-dropdown{width:min(320px,100vw - 16px);top:100%;right:8px}.dashboard,#app .settings-page{height:auto;overflow:visible}#app .help-api td,#app .help-ports td{overflow-wrap:anywhere}#app .debug-state-section,#app .debug-log-section{min-width:0}.btn{min-height:40px;padding:8px 16px}.btn-sm{min-height:36px;padding:6px 12px;font-size:13px}.btn-icon{width:44px;height:44px}.file-item{gap:10px;padding:10px}.file-actions{gap:6px}.file-actions .btn{min-width:36px;min-height:36px;padding:6px 8px}.file-source-tab{padding:6px 14px;font-size:12px}.files-header{flex-wrap:wrap;gap:8px}.storage-capacity{flex-wrap:wrap}.control-group{gap:8px}.control-row{flex-wrap:wrap;gap:6px}.canvas-spools{gap:10px}.settings-dialog{max-width:100%;margin:0 8px}.settings-content{padding:12px}}@media (width<=480px){.dashboard-sidebar,.dashboard-main{padding:6px}.print-status-card,.exception-banner{margin:4px}.card{padding:12px}.subtitle{display:none}body .toast-container{max-width:none;left:8px;right:8px}}.log-card{grid-column:1/-1}.log-header{flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:8px;display:flex}.log-header h3{flex:1;margin:0}.log-controls{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.log-filter-input{background:var(--bg-input);border:1px solid var(--border);color:var(--text-primary);border-radius:4px;width:140px;padding:4px 8px;font-size:.8rem}.log-autoscroll-label{color:var(--text-secondary);cursor:pointer;align-items:center;gap:4px;font-size:.8rem;display:flex}.log-entries{background:var(--bg-primary);border-radius:var(--radius);height:320px;padding:4px;font-family:Menlo,Consolas,Courier New,monospace;font-size:.75rem;line-height:1.5;overflow-y:auto}.log-row{cursor:pointer;word-break:break-all;border-radius:3px;align-items:flex-start;gap:8px;padding:2px 6px;display:flex}.log-row:hover{background:var(--bg-hover)}.log-time{color:var(--text-muted);white-space:nowrap;min-width:80px}.log-dir{text-align:center;min-width:14px;font-weight:700}.log-sent .log-dir{color:var(--accent-light)}.log-recv .log-dir{color:var(--success)}.log-topic{color:var(--warning);white-space:nowrap;min-width:90px}.log-method{color:var(--accent);white-space:nowrap;min-width:50px;font-weight:600}.log-payload{color:var(--text-secondary);text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.log-payload.expanded{white-space:pre-wrap;background:var(--bg-secondary);border-radius:4px;width:100%;max-height:300px;margin-top:2px;padding:6px 8px;overflow-y:auto}.chart-wrap{border-top:1px solid var(--border);margin-top:12px;padding-top:8px}.chart-wrap-sm{border-top:none;margin-top:8px;padding-top:0}.chart-time-selector{justify-content:flex-end;gap:2px;margin-bottom:4px;display:flex}.chart-time-btn{color:var(--text-muted);cursor:pointer;background:0 0;border:none;border-radius:10px;padding:2px 8px;font-size:10px;font-weight:500;transition:all .15s}.chart-time-btn:hover{color:var(--text-primary)}.chart-time-btn.active{background:var(--accent);color:#fff}.live-chart{width:100%;height:160px;display:block}.live-chart-sm{height:80px}.toast-container{z-index:1000;pointer-events:none;flex-direction:column;gap:8px;max-width:380px;display:flex;position:fixed;top:56px;right:16px}.toast{border-radius:var(--radius);background:var(--bg-card);border:1px solid var(--border);box-shadow:var(--shadow);pointer-events:auto;align-items:center;gap:8px;padding:10px 14px;font-size:13px;animation:.25s toast-in;display:flex}.toast-info{border-left:3px solid var(--accent)}.toast-success{border-left:3px solid var(--success)}.toast-warning{border-left:3px solid var(--warning)}.toast-error{border-left:3px solid var(--danger)}.toast-icon{flex-shrink:0;font-size:14px}.toast-msg{color:var(--text-primary);flex:1}.toast-close{color:var(--text-muted);cursor:pointer;background:0 0;border:none;padding:2px 4px;font-size:12px}.toast-close:hover{color:var(--text-primary)}@keyframes toast-in{0%{opacity:0;transform:translate(20px)}to{opacity:1;transform:translate(0)}}.log-tabs{background:var(--bg-input);border-radius:var(--radius-sm);gap:2px;padding:2px;display:flex}.log-tab{color:var(--text-secondary);cursor:pointer;border-radius:var(--radius-sm);background:0 0;border:none;padding:4px 14px;font-size:12px;font-weight:500;transition:all .15s}.log-tab.active{background:var(--accent);color:#fff}.log-tab:hover:not(.active){color:var(--text-primary)}.log-tab-content{flex-direction:column;gap:6px;display:flex}.log-tab-content.hidden{display:none}.log-select{background:var(--bg-input);border:1px solid var(--border);color:var(--text-primary);border-radius:4px;padding:4px 8px;font-size:.8rem}.log-status-bar{color:var(--text-muted);justify-content:space-between;align-items:center;padding:2px 4px;font-size:11px;display:flex}.log-paused-badge{color:var(--danger);background:#ef535033;border-radius:8px;padding:2px 8px;font-size:10px;font-weight:600;animation:1.5s infinite pulse}.slog-row{border-radius:var(--radius-sm);cursor:pointer;border-left:3px solid #0000;padding:4px 8px;transition:background .1s}.slog-row:hover{background:var(--bg-hover)}.slog-row-header{font-size:.75rem;font-family:var(--font-mono);align-items:center;gap:8px;line-height:1.6;display:flex}.slog-icon{flex-shrink:0;font-size:12px}.slog-time{color:var(--text-muted);white-space:nowrap;min-width:80px}.slog-dir{text-align:center;min-width:14px;font-weight:700}.slog-sent .slog-dir{color:var(--accent-light)}.slog-recv .slog-dir{color:var(--success)}.slog-method{color:var(--accent);white-space:nowrap;min-width:120px;font-weight:600}.slog-topic{color:var(--warning);white-space:nowrap;min-width:80px}.slog-summary{color:var(--text-secondary);text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.slog-expand{color:var(--text-muted);text-align:center;flex-shrink:0;width:14px}.slog-type-status{border-left-color:var(--accent)}.slog-type-command{border-left-color:var(--accent-light)}.slog-type-response{border-left-color:var(--success)}.slog-type-heartbeat{border-left-color:var(--text-muted);opacity:.6}.slog-detail{white-space:pre-wrap;background:var(--bg-secondary);border-radius:var(--radius-sm);max-height:300px;color:var(--text-secondary);margin:4px 0 4px 22px;padding:8px 10px;font-size:.7rem;overflow-y:auto}.slog-diff{font-size:.7rem}.slog-pin-btn{cursor:pointer;opacity:.3;background:0 0;border:none;flex-shrink:0;padding:0 2px;font-size:10px;transition:opacity .15s}.slog-pin-btn:hover{opacity:.7}.slog-pin-btn.pinned{opacity:1}.slog-pinned{background:#2196f30f}.slog-pinned-section{border-bottom:1px solid var(--border);margin-bottom:4px;padding-bottom:4px}.slog-pinned-header{color:var(--text-muted);padding:2px 8px;font-size:10px;font-weight:600}.btn-active{background:var(--accent)!important;color:#fff!important;border-color:var(--accent)!important}.log-highlight{color:var(--text-primary);background:#ffa72659;border-radius:2px;padding:0 1px}.modal-overlay{z-index:2000;background:#0009;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal-content{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);width:380px;max-width:90vw;box-shadow:0 8px 32px #00000080}.modal-header{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;padding:12px 16px;display:flex}.modal-header h3{color:var(--text-primary);text-transform:none;letter-spacing:0;margin:0;font-size:14px}.modal-body{padding:16px}.modal-body .form-group{margin-bottom:12px}.modal-body .form-group:last-child{margin-bottom:0}.modal-body .form-group label{color:var(--text-secondary);margin-bottom:4px;font-size:12px;display:block}.modal-body select,.modal-body input[type=text],.modal-body input[type=number]{background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);width:100%;color:var(--text-primary);padding:6px 10px;font-size:13px}.modal-body input[type=color]{border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-input);cursor:pointer;width:48px;height:32px}.temp-range-row{align-items:center;gap:8px;display:flex}.temp-range-row input{width:80px}.temp-range-row span{color:var(--text-muted)}.fm-temp-info{color:var(--text-muted);font-size:.9em}.fm-color-row{align-items:flex-start;gap:10px;display:flex}.fm-color-presets{flex-wrap:wrap;gap:4px;max-width:220px;display:flex}.fm-swatch{cursor:pointer;border:1px solid var(--border);border-radius:3px;width:20px;height:20px;transition:transform .1s}.fm-swatch:hover{border-color:var(--text);transform:scale(1.2)}.modal-footer{border-top:1px solid var(--border);justify-content:flex-end;gap:8px;padding:12px 16px;display:flex}.svc-header-wrap{position:relative}.svc-header-badge{border:1px solid var(--border);background:var(--bg-input);color:var(--text-secondary);cursor:pointer;white-space:nowrap;border-radius:12px;align-items:center;gap:6px;padding:4px 10px;font-size:11px;font-weight:600;transition:all .15s;display:inline-flex}.svc-header-badge:hover{background:var(--bg-hover);border-color:var(--text-muted)}.svc-header-badge.svc-all-ok{border-color:#22c55e4d}.svc-header-badge.svc-has-err{color:var(--danger);border-color:#ef444466}#svc-header-dots{align-items:center;gap:3px;display:inline-flex}.svc-dropdown{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);width:320px;box-shadow:var(--shadow-lg);z-index:200;position:absolute;top:calc(100% + 8px);right:0;overflow:hidden}.svc-dropdown.hidden{display:none}.svc-dropdown-header{text-transform:uppercase;letter-spacing:.6px;color:var(--text-muted);border-bottom:1px solid var(--border);background:var(--bg-secondary);padding:10px 14px;font-size:11px;font-weight:600}.svc-dropdown-body{padding:6px}.svc-list{flex-direction:column;gap:2px;display:flex}.svc-firmware-warning{border-radius:var(--radius-sm);color:#ffb74d;background:#ff98001f;border:1px solid #ff980066;margin-bottom:6px;padding:8px 10px;font-size:.8rem;line-height:1.4}.svc-firmware-warning strong{color:#ff9800}.svc-item{background:var(--bg-input);border-radius:var(--radius-sm);align-items:center;gap:6px;padding:6px 10px;font-size:.82rem;display:flex}.svc-label{color:var(--text-muted);white-space:nowrap}.svc-value{color:var(--text-primary);margin-left:auto;font-weight:500}.status-dot{border-radius:50%;flex-shrink:0;width:7px;height:7px}.status-dot-ok{background:var(--success)}.status-dot-err{background:var(--danger)}.svc-loading{color:var(--text-muted);padding:8px 10px;font-size:.82rem}.svc-system-info{max-height:300px;overflow-y:auto}.ai-section{margin-bottom:12px}.ai-section h4{color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;margin:0 0 6px;font-size:.8rem}.ai-section summary{color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;cursor:pointer;margin-bottom:6px;font-size:.8rem}.ai-empty{color:var(--text-muted);padding:8px 0;font-size:.85rem}.ai-analysis{border-radius:var(--radius-sm);background:var(--bg-input);border-left:3px solid var(--border);margin-bottom:6px;padding:8px 10px}.ai-status-ok{border-left-color:#4caf50}.ai-status-warning{border-left-color:#ff9800}.ai-status-critical{border-left-color:#f44336}.ai-analysis-header{align-items:center;gap:8px;margin-bottom:4px;font-size:.85rem;display:flex}.ai-source{color:var(--text);background:var(--bg);border-radius:3px;padding:1px 6px;font-size:.75rem;font-weight:600}.ai-confidence{color:var(--primary);font-weight:500}.ai-time{color:var(--text-muted);margin-left:auto;font-size:.75rem}.ai-duration{color:var(--text-muted);font-size:.75rem}.ai-description{color:var(--text);margin-bottom:4px;font-size:.85rem}.ai-issues{flex-wrap:wrap;gap:4px;display:flex}.ai-issue{background:var(--bg);border-radius:3px;padding:2px 6px;font-size:.75rem}.ai-issue-warning{color:#ff9800}.ai-issue-critical{color:#f44336}.ai-no-issues{color:var(--text-muted);font-size:.75rem}.ai-label-details{margin-top:6px}.ai-label-details summary{color:var(--text-muted);cursor:pointer;-webkit-user-select:none;user-select:none;font-size:.75rem}.ai-label-scores{flex-direction:column;gap:3px;margin-top:4px;display:flex}.ai-label-row{align-items:flex-start;gap:6px;min-height:18px;padding:2px 0;font-size:.7rem;display:flex;position:relative}.ai-label-bar{opacity:.25;border-radius:2px;min-width:2px;height:100%;position:absolute;top:0;left:0}.ai-label-pct{text-align:right;font-variant-numeric:tabular-nums;width:32px;color:var(--text);z-index:1;flex-shrink:0}.ai-label-text{color:var(--text-muted);z-index:1;word-break:break-word}.ai-alert-item{background:var(--bg-input);border-radius:var(--radius-sm);border-left:3px solid var(--border);align-items:center;gap:6px;margin-bottom:4px;padding:6px 10px;font-size:.85rem;display:flex}.ai-alert-warning{border-left-color:#ff9800}.ai-alert-critical{border-left-color:#f44336}.ai-alert-desc{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.ai-alert-issues{color:var(--text-muted);font-size:.75rem}.ai-history-row{border-bottom:1px solid var(--border);align-items:center;gap:6px;padding:3px 6px;font-size:.8rem;display:flex}.ai-hist-desc{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text);flex:1;overflow:hidden}.ai-status-line{color:var(--text);margin-bottom:8px;font-size:.9rem;font-weight:500}.ai-config-info{background:var(--bg-input);border-radius:var(--radius-sm);flex-direction:column;gap:4px;padding:8px 10px;font-size:.8rem;display:flex}.ai-config-row{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.ai-config-on{color:#4caf50;font-weight:600}.ai-config-off{color:var(--text-muted)}.ai-config-detail{color:var(--text-muted);font-size:.75rem}.ai-charts-grid{grid-template-columns:1fr 1fr;gap:12px;margin-top:12px;display:grid}.ai-chart-wrap{border-top:none;margin-top:0;padding-top:0}.ai-chart-title{color:var(--text-muted);margin:0 0 4px;font-size:.8rem;font-weight:600}@media (width<=700px){.ai-charts-grid{grid-template-columns:1fr}}.event-log-entries{flex-direction:column;gap:2px;max-height:400px;display:flex;overflow-y:auto}.event-log-row{border-radius:var(--radius-sm);background:var(--bg-input);align-items:center;gap:8px;padding:4px 8px;font-size:.8rem;display:flex}.event-log-row:hover{background:var(--bg-hover,#ffffff0f)}.event-log-icon{flex-shrink:0;font-size:.9rem}.event-log-time{font-variant-numeric:tabular-nums;color:var(--text-muted);flex-shrink:0;min-width:70px}.event-log-desc{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.event-log-empty{color:var(--text-muted);text-align:center;padding:12px;font-size:.85rem}.event-success .event-log-desc{color:#4caf50}.event-warning .event-log-desc{color:#ff9800}.event-error .event-log-desc{color:#f44336}.event-info .event-log-desc{color:#58a6ff}.event-muted .event-log-desc{color:var(--text-muted)}.print-history-entries{flex-direction:column;gap:4px;max-height:400px;display:flex;overflow-y:auto}.history-entry{background:var(--card-bg);border:1px solid var(--border);border-radius:6px;padding:6px 10px}.history-entry-main{align-items:center;gap:8px;display:flex}.history-delete-btn{opacity:.6;flex-shrink:0;margin-left:auto}.history-delete-btn:hover{opacity:1;color:var(--danger)}.history-status{font-size:14px}.history-filename{text-overflow:ellipsis;white-space:nowrap;flex:1;font-weight:500;overflow:hidden}.history-entry-meta{color:var(--text-muted);gap:16px;margin-top:4px;padding-left:26px;font-size:.82em;display:flex}.history-pagination{justify-content:center;align-items:center;gap:8px;padding:8px 0 4px;display:flex}.history-page-info{color:var(--text-muted);font-size:.85em}.report-entry{background:var(--card-bg);border:1px solid var(--border);border-radius:6px;padding:6px 10px}.report-entry-main{align-items:center;gap:8px;display:flex}.report-filename{text-overflow:ellipsis;white-space:nowrap;flex:1;font-weight:500;overflow:hidden}.report-entry-meta{color:var(--text-muted);gap:16px;margin-top:4px;padding-left:26px;font-size:.82em;display:flex}.report-actions{gap:6px;margin-top:6px;padding-left:26px;display:flex}.report-active{color:var(--text);background:#2196f31f;border:1px solid #2196f34d;border-radius:6px;padding:8px 12px;font-size:.9em}.control-maintenance{border-top:1px solid var(--border);margin-top:12px;padding-top:12px}.control-maintenance h4{color:var(--text-secondary);margin:0 0 8px;font-size:.85em;font-weight:500}.maintenance-grid{grid-template-columns:1fr 1fr;gap:8px;display:grid}.maintenance-btn{text-align:center;flex-direction:column;align-items:center;gap:4px;padding:12px 8px;font-size:.85em;display:flex}.maintenance-icon{font-size:1.4em}.maintenance-active{background:var(--card-bg);text-align:center;border-radius:6px;margin-bottom:8px;padding:8px 12px}.maintenance-running{color:#58a6ff}.maintenance-ok{color:#4caf50}.maintenance-fail{color:#f44336}.settings-page{height:calc(100vh - var(--header-height));padding:20px;overflow-y:auto}.settings-page.hidden{display:none!important}.settings-page-inner{max-width:800px;margin:0 auto}.settings-page-title{color:var(--text-primary);margin-bottom:20px;font-size:18px;font-weight:600}.settings-section{margin-bottom:20px}.settings-section h3{color:var(--text-secondary);text-transform:uppercase;letter-spacing:.5px;margin-bottom:8px;font-size:13px;font-weight:600}.settings-hint{color:var(--text-muted);margin:0 0 8px;font-size:.8rem}.settings-hint code{background:var(--bg-input);border-radius:3px;padding:1px 4px;font-size:.75rem}.settings-card-list{flex-direction:column;gap:2px;display:flex}.settings-card-row{border-radius:var(--radius-sm);background:var(--bg-input);align-items:center;gap:8px;padding:6px 8px;display:flex}.settings-card-row:hover{background:#ffffff0d}.settings-drag-handle{cursor:grab;color:var(--text-muted);-webkit-user-select:none;user-select:none;font-size:14px}.settings-card-label{cursor:pointer;flex:1;align-items:center;gap:8px;font-size:.85rem;display:flex}.settings-card-label input[type=checkbox]{accent-color:var(--accent)}.settings-card-move{gap:2px;display:flex}.settings-card-move .btn{padding:1px 6px;font-size:10px;line-height:1}.settings-actions{gap:8px;margin-top:8px;display:flex}.settings-panel-heading{color:var(--text-secondary);border-bottom:1px solid var(--border);margin:12px 0 6px;padding-bottom:4px;font-size:12px;font-weight:600}.settings-panel-heading:first-of-type{margin-top:0}.settings-telegram-row{align-items:center;gap:8px;margin-bottom:8px;display:flex}.settings-telegram-field{margin-bottom:8px}.settings-telegram-field label{color:var(--text-muted);margin-bottom:4px;font-size:.8rem;display:block}.settings-input{background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);width:100%;padding:6px 10px;font-size:.85rem}.settings-input:disabled{opacity:.5}.settings-input-row{align-items:center;gap:8px;display:flex}.settings-input-row .settings-input{width:80px}.ai-label-config-list{flex-direction:column;gap:8px;display:flex;overflow-y:auto}.ai-label-config-row{background:var(--bg-input);border-radius:var(--radius-sm);grid-template-columns:1fr 120px 100px 70px 70px 36px;align-items:end;gap:6px;padding:8px;display:grid}.ai-label-config-delete .btn{color:var(--danger);padding:4px 8px;font-size:14px;line-height:1}.ai-label-config-delete .btn:hover{background:#ef535026}.ai-label-config-field label{color:var(--text-muted);margin-bottom:2px;font-size:.7rem;display:block}.ai-label-config-field .settings-input{padding:4px 6px;font-size:.8rem}.ai-label-config-field textarea.settings-input{resize:vertical;min-height:36px;font-family:inherit}@media (width<=700px){.ai-label-config-row{grid-template-columns:1fr 1fr}.ai-label-config-label{grid-column:1/-1}}.spool-calc{margin-top:8px}.spool-calc-grid{grid-template-columns:1fr 320px;align-items:start;gap:24px;display:grid}.spool-calc-viz{background:var(--bg-secondary);border-radius:var(--radius);border:1px solid var(--border);flex-direction:column;align-items:center;gap:16px;padding:20px;display:flex}.spool-svg{width:100%;max-width:420px;height:auto}.spool-calc-stats{grid-template-columns:repeat(4,1fr);gap:12px;width:100%;display:grid}.spool-stat{text-align:center;background:var(--bg-card);border-radius:var(--radius-sm);border:1px solid var(--border);padding:10px 6px}.spool-stat-value{color:var(--accent-light);font-variant-numeric:tabular-nums;font-size:22px;font-weight:700;display:block}.spool-stat-label{color:var(--text-muted);text-transform:uppercase;letter-spacing:.3px;margin-top:2px;font-size:11px;display:block}.spool-calc-inputs{background:var(--bg-card);border-radius:var(--radius);border:1px solid var(--border);padding:16px}.spool-calc-inputs h4{color:var(--text-secondary);text-transform:uppercase;letter-spacing:.4px;margin:14px 0 8px;font-size:12px;font-weight:600}.spool-calc-inputs h4:first-child{margin-top:0}.spool-calc-inputs .form-group{margin-bottom:10px}.spool-calc-inputs .form-group label{color:var(--text-secondary);margin-bottom:3px;font-size:12px;display:block}.input-with-unit{align-items:center;gap:6px;display:flex}.input-with-unit input{background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-primary);font-variant-numeric:tabular-nums;outline:none;flex:1;padding:6px 10px;font-size:14px}.input-with-unit input:focus{border-color:var(--accent)}.input-unit{color:var(--text-muted);min-width:28px;font-size:12px}.spool-calc-inputs .log-select{width:100%;padding:6px 10px;font-size:14px}.spool-calc-density{color:var(--text-muted);margin-top:12px;font-family:monospace;font-size:11px}@media (width<=700px){.spool-calc-grid{grid-template-columns:1fr}.spool-calc-stats{grid-template-columns:repeat(2,1fr)}}.help-section{margin-bottom:24px}.help-section h3{color:var(--accent);border-bottom:1px solid var(--border);margin-bottom:8px;padding-bottom:4px;font-size:15px;font-weight:600}.help-section h4{color:var(--text-secondary);margin:12px 0 6px;font-size:13px;font-weight:600}.help-section p{color:var(--text-secondary);margin:0 0 8px;font-size:13px;line-height:1.5}.help-section code{background:var(--bg-input);border-radius:3px;padding:1px 5px;font-size:12px}.help-section pre{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius);margin:6px 0 12px;padding:10px 12px;overflow-x:auto}.help-section pre code{color:var(--text-primary);background:0 0;padding:0;font-size:12px;line-height:1.6}.help-api,.help-ports{border-collapse:collapse;width:100%;margin-bottom:12px;font-size:12px}.help-api th,.help-ports th{text-align:left;background:var(--bg-secondary);color:var(--text-secondary);text-transform:uppercase;letter-spacing:.3px;border-bottom:1px solid var(--border);padding:6px 8px;font-size:11px;font-weight:600}.help-api td,.help-ports td{border-bottom:1px solid var(--border);color:var(--text-primary);padding:5px 8px}.help-api tr:hover,.help-ports tr:hover{background:var(--bg-secondary)}.print-dialog-overlay{z-index:10000;background:#000000b3;justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}.print-dialog{background:var(--bg-card);border:1px solid var(--border);border-radius:8px;flex-direction:column;width:100%;max-width:440px;max-height:90vh;display:flex;box-shadow:0 8px 32px #00000080}.print-dialog-header{border-bottom:1px solid var(--border);color:var(--text-primary);justify-content:space-between;align-items:center;padding:12px 16px;font-size:14px;font-weight:600;display:flex}.print-dialog-close{color:var(--text-secondary);cursor:pointer;background:0 0;border:none;padding:0 4px;font-size:20px;line-height:1}.print-dialog-close:hover{color:var(--text-primary)}.print-dialog-body{flex:1;padding:16px;overflow-y:auto}.print-dialog-file-info{gap:12px;margin-bottom:16px;display:flex}.print-dialog-thumbnail{background:var(--bg-secondary);border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;width:96px;height:96px;display:flex;overflow:hidden}.print-dialog-thumbnail img{object-fit:cover;width:100%;height:100%}.print-dialog-no-thumb{color:var(--text-muted);text-align:center;font-size:11px}.print-dialog-meta{flex:1;min-width:0}.print-dialog-filename{color:var(--text-primary);word-break:break-word;margin-bottom:6px;font-size:13px;font-weight:600}.print-dialog-meta-row{color:var(--text-secondary);font-size:12px}.print-dialog-meta-row span+span:before{content:" · "}.print-dialog-section{margin-bottom:14px}.print-dialog-section-title{text-transform:uppercase;letter-spacing:.3px;color:var(--text-muted);margin-bottom:8px;font-size:11px;font-weight:600}.print-dialog-auto-refill{color:var(--text-primary);justify-content:space-between;align-items:center;margin-bottom:10px;font-size:12px;display:flex}.print-dialog-mappings{flex-direction:column;gap:6px;display:flex}.print-mapping-row{align-items:center;gap:8px;display:flex}.print-mapping-gcode{text-align:center;border-radius:4px;flex-shrink:0;width:80px;padding:4px 8px;font-size:11px;font-weight:600}.print-mapping-arrow{color:var(--text-muted);flex-shrink:0;font-size:14px}.print-mapping-tray{flex:1;min-width:0}.print-mapping-trays{flex:1;gap:8px;display:flex}.print-mapping-select{border:1px solid var(--border);cursor:pointer;appearance:auto;border-radius:4px;width:100%;padding:4px 8px;font-size:12px;font-weight:600}.print-mapping-select:focus{outline:1px solid var(--accent)}.print-spool-grid{flex-shrink:0;grid-template-rows:1fr 1fr;grid-template-columns:1fr 1fr;gap:4px;display:grid}.print-spool{cursor:pointer;border:2px solid #0000;border-radius:6px;flex-direction:column;justify-content:center;align-items:center;width:44px;height:44px;transition:border-color .15s,transform .15s;display:flex;position:relative;overflow:hidden}.print-spool:hover:not(.print-spool-empty){border-color:var(--text-secondary);transform:scale(1.1)}.print-spool-selected{box-shadow:0 0 8px var(--accent);transform:scale(1.05);border-color:var(--accent)!important}.print-spool-color{background:var(--spool-color,#434343);border-radius:4px;position:absolute;inset:0}.print-spool-empty{opacity:.3;cursor:default}.print-spool-empty .print-spool-color{background:#434343}.print-spool-num{z-index:1;text-shadow:0 0 4px #0009;font-size:13px;font-weight:800;line-height:1;position:relative}.print-spool-type{z-index:1;text-shadow:0 0 3px #0009;text-transform:uppercase;letter-spacing:.3px;font-size:8px;font-weight:700;line-height:1;position:relative}.print-dialog-settings{flex-direction:column;gap:10px;display:flex}.print-dialog-setting label:first-child{color:var(--text-secondary);margin-bottom:6px;font-size:12px;display:block}.print-dialog-bed-toggle{border:1px solid var(--border);border-radius:6px;gap:0;display:flex;overflow:hidden}.print-bed-btn{background:var(--bg-secondary);color:var(--text-secondary);cursor:pointer;border:none;flex:1;padding:8px 12px;font-size:12px;font-weight:600;transition:background .15s,color .15s}.print-bed-btn:not(:last-child){border-right:1px solid var(--border)}.print-bed-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.print-bed-btn.active{background:var(--accent);color:#fff}.print-dialog-checkboxes{flex-wrap:wrap;gap:12px;display:flex}.print-dialog-checkbox{cursor:pointer;color:var(--text-primary);-webkit-user-select:none;user-select:none;align-items:center;gap:8px;font-size:12px;display:flex}.print-dialog-checkbox input[type=checkbox]{appearance:none;border:2px solid var(--border);background:var(--bg-secondary);cursor:pointer;border-radius:4px;flex-shrink:0;width:18px;height:18px;transition:background .15s,border-color .15s;position:relative}.print-dialog-checkbox input[type=checkbox]:checked{background:var(--accent);border-color:var(--accent)}.print-dialog-checkbox input[type=checkbox]:checked:after{content:"";border:2px solid #fff;border-width:0 2px 2px 0;width:6px;height:10px;position:absolute;top:1px;left:4px;transform:rotate(45deg)}.print-dialog-checkbox input[type=checkbox]:hover{border-color:var(--accent)}.print-dialog-footer{border-top:1px solid var(--border);justify-content:flex-end;gap:8px;padding:12px 16px;display:flex}.print-dialog-footer .btn-primary{min-width:100px}.print-dialog-precache{padding:8px 16px 4px}.print-dialog-precache-bar{background:var(--bg-input);border-radius:2px;height:4px;margin-bottom:4px;overflow:hidden}.print-dialog-precache-fill{background:var(--accent);border-radius:2px;height:100%;transition:width .3s}.print-dialog-precache-text{color:var(--text-secondary);font-size:11px}.debug-panel{flex-direction:column;gap:12px;display:flex}.debug-controls{flex-wrap:wrap;align-items:center;gap:8px;padding:8px 0;display:flex}.debug-controls .log-filter-input{min-width:200px}.debug-split{grid-template-columns:1fr 1fr;gap:16px;min-height:500px;display:grid}@media (width<=900px){.debug-split{grid-template-columns:1fr}}.debug-state-section,.debug-log-section{flex-direction:column;gap:4px;display:flex}.debug-state-section h3,.debug-log-section h3{color:var(--text-secondary);align-items:center;gap:8px;margin:0;font-size:14px;display:flex}.debug-log-count{color:var(--text-secondary);font-size:11px;font-weight:400}.debug-state-tree{background:var(--bg-card);border:1px solid var(--border);border-radius:8px;max-height:70vh;padding:8px;font-family:SF Mono,Fira Code,Cascadia Code,monospace;font-size:12px;line-height:1.6;overflow:auto}.debug-change-log{background:var(--bg-card);border:1px solid var(--border);border-radius:8px;max-height:70vh;padding:8px;font-family:SF Mono,Fira Code,Cascadia Code,monospace;font-size:11px;line-height:1.5;overflow:auto}.debug-node{cursor:default;white-space:nowrap}.debug-toggle{cursor:pointer;text-align:center;width:14px;color:var(--text-secondary);-webkit-user-select:none;user-select:none;font-size:10px;display:inline-block}.debug-toggle:hover{color:var(--accent)}.debug-key{color:#79c0ff;margin-right:4px}.debug-key:after{content:":";color:var(--text-secondary);margin-right:4px}.debug-node>.debug-key:after{content:""}.debug-meta{color:var(--text-secondary);font-size:11px}.debug-leaf{white-space:nowrap;border-radius:3px;padding:1px 0;transition:background .3s}.debug-number{color:#d2a8ff}.debug-string{color:#a5d6ff}.debug-boolean{color:#ff7b72}.debug-null{color:#8b949e;font-style:italic}.debug-changed{animation:3s ease-out forwards debug-flash;background:#ffd54f26!important}@keyframes debug-flash{0%{background:#ffd54f4d}to{background:0 0}}.debug-empty{color:var(--text-secondary);text-align:center;padding:16px;font-style:italic}.debug-log-entry{border-bottom:1px solid var(--border);flex-wrap:wrap;align-items:baseline;gap:6px;padding:2px 4px;display:flex}.debug-log-entry:hover{background:var(--bg-input)}.debug-log-time{color:var(--text-secondary);flex-shrink:0;font-size:10px}.debug-log-path{color:#79c0ff;text-overflow:ellipsis;flex-shrink:0;max-width:250px;overflow:hidden}.debug-log-old{color:#f85149;text-overflow:ellipsis;max-width:150px;text-decoration:line-through;overflow:hidden}.debug-log-arrow{color:var(--text-secondary);flex-shrink:0}.debug-log-new{color:#3fb950;text-overflow:ellipsis;max-width:200px;overflow:hidden}.debug-controls .log-paused-badge{color:#fff;background:#f85149;animation:2s ease-in-out infinite debug-pulse}@keyframes debug-pulse{0%,to{opacity:1}50%{opacity:.5}}#debug-log-toggle.active{color:#fff;background:#f85149}.debug-watch{cursor:pointer;opacity:.3;-webkit-user-select:none;user-select:none;margin-left:4px;font-size:10px;transition:opacity .15s}.debug-leaf:hover .debug-watch,.debug-node:hover>.debug-watch{opacity:1}.debug-watch-icon{margin-right:2px;font-size:10px}.debug-watched{flex-wrap:wrap;align-items:center;gap:8px;padding:4px 0;display:flex}.debug-watched-label{color:var(--text-secondary);flex-shrink:0;font-size:12px}.debug-watched-list{flex-wrap:wrap;align-items:center;gap:4px;display:flex}.debug-watched-tag{font-size:11px;font-family:var(--font-mono);color:#79c0ff;cursor:pointer;background:#58a6ff26;border:1px solid #58a6ff4d;border-radius:12px;align-items:center;gap:4px;padding:2px 8px;transition:background .15s;display:inline-flex}.debug-watched-tag:hover{color:#f85149;background:#f8514933;border-color:#f8514966}.debug-empty-inline{color:var(--text-secondary);font-size:11px;font-style:italic}.debug-hint{color:var(--text-secondary);font-size:11px;font-weight:400}.debug-log-watched{background:#58a6ff0d}.debug-log-badge{flex-shrink:0;font-size:10px}.settings-row{align-items:center;gap:12px;padding:6px 0;display:flex}.settings-row label{color:var(--text-secondary);min-width:120px;font-size:13px}.list-controls{flex-wrap:wrap;align-items:center;gap:6px;padding:6px 0 8px;display:flex}.list-controls .list-filter{background:var(--bg-input);border:1px solid var(--border);color:var(--text-primary);border-radius:4px;flex:140px;min-width:120px;padding:4px 8px;font-size:.8rem}.list-controls .list-select{background:var(--bg-input);border:1px solid var(--border);color:var(--text-primary);border-radius:4px;padding:4px 8px;font-size:.8rem}.list-sort{flex-wrap:wrap;gap:4px;display:flex}.list-sort-btn{background:var(--bg-input);border:1px solid var(--border);color:var(--text-secondary);cursor:pointer;white-space:nowrap;border-radius:4px;padding:4px 8px;font-size:.75rem}.list-sort-btn:hover{color:var(--text-primary);border-color:var(--accent-light)}.list-sort-btn.active{background:var(--accent-dim);border-color:var(--accent);color:var(--text-primary);font-weight:600}.list-count{color:var(--text-muted);white-space:nowrap;margin-left:auto;font-size:.72rem}.print-queue-controls{flex-wrap:wrap;align-items:center;gap:6px;padding:6px 0 8px;display:flex}.print-queue-hint{color:var(--text-muted);flex:100%;font-size:.75rem}.print-queue-hint.is-warning{color:var(--warning)}.print-queue-active{color:var(--text-secondary);padding:4px 8px;font-size:12px}.print-queue-pos{color:var(--text-muted);text-align:right;min-width:1.5em;font-size:11px}.print-dialog-queue-note{color:var(--warning);margin:0 0 6px;font-size:12px}
