*,*:before,*:after{margin:0;padding:0;box-sizing:border-box}:root{--primary: #2563eb;--primary-hover: #1d4ed8;--success: #059669;--success-hover: #047857;--danger: #dc2626;--danger-hover: #b91c1c;--warning: #d97706;--audio: #7c3aed;--dark: #111827;--gray-700: #374151;--gray-500: #6b7280;--gray-300: #d1d5db;--gray-200: #e5e7eb;--gray-100: #f3f4f6;--gray-50: #f9fafb;--border: #e5e7eb;--white: #ffffff;--sidebar-bg: #1e3a8a;--sidebar-dark: #172554;--mono: "JetBrains Mono", "Courier New", monospace;--accent: var(--primary);--accent-strong: var(--primary-hover);--accent-soft: rgba(37,99,235,.12);--accent-ring: rgba(37,99,235,.25);--success-soft: rgba(5,150,105,.12);--danger-soft: rgba(220,38,38,.12);--warning-soft: rgba(217,119,6,.12);--audio-soft: rgba(124,58,237,.12);--text: var(--dark);--text-dim: var(--gray-700);--text-mute: var(--gray-500);--surface: var(--white);--surface-strong: var(--white);--surface-elev: var(--gray-50);--surface-soft: var(--gray-100);--border-strong: var(--gray-300);--input-bg: var(--white);--input-border: var(--border);--input-focus: var(--primary);--shadow-sm: 0 1px 3px rgba(0,0,0,.06);--shadow-md: 0 1px 3px rgba(0,0,0,.06);--shadow-lg: 0 4px 24px rgba(0,0,0,.12);--code-bg: #0f1117}html{font-size:14px}html,body,#root{height:100%}body{font-family:Inter,-apple-system,BlinkMacSystemFont,sans-serif;background:var(--gray-100);color:var(--dark);line-height:1.5;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}[data-theme=dark]{--dark: #f9fafb;--gray-700: #d1d5db;--gray-500: #9ca3af;--gray-300: #4b5563;--gray-200: #374151;--gray-100: #1f2937;--gray-50: #111827;--border: #374151;--white: #1f2937;--text: #f9fafb;--text-dim: #d1d5db;--text-mute: #9ca3af;--surface: #1f2937;--surface-strong:#1f2937;--surface-elev: #111827;--surface-soft: #374151;--input-bg: #1f2937;--input-border: #374151;--shadow-md: 0 1px 3px rgba(0,0,0,.3);--code-bg: #0a0f1a}[data-theme=dark] body{background:#111827}[data-theme=dark] .card{background:#1f2937;border-color:#374151;box-shadow:0 1px 3px #0000004d}[data-theme=dark] .card-header{border-color:#374151}[data-theme=dark] input[type=text],[data-theme=dark] input[type=number],[data-theme=dark] input[type=file],[data-theme=dark] textarea,[data-theme=dark] select{background:#111827;border-color:#374151;color:#f9fafb}[data-theme=dark] .notice-info,[data-theme=dark] .alert-info{background:#2563eb26;border-color:#2563eb59;color:#93c5fd}[data-theme=dark] .notice-warning,[data-theme=dark] .alert-warning{background:#d9770626;border-color:#d9770659;color:#fde68a}[data-theme=dark] .notice-success,[data-theme=dark] .alert-success{background:#05966926;border-color:#05966959;color:#6ee7b7}[data-theme=dark] .notice-danger,[data-theme=dark] .alert-danger{background:#dc262626;border-color:#dc262659;color:#fca5a5}[data-theme=dark] .alert-audio{background:#7c3aed26;border-color:#7c3aed59;color:#c4b5fd}[data-theme=dark] .btn-secondary{background:#374151;color:#f9fafb}[data-theme=dark] .btn-ghost{background:transparent;color:#d1d5db;border-color:#374151}[data-theme=dark] button:not([class]):not([style]){background:#374151;color:#f9fafb}[data-theme=dark] .history-item{background:#111827;border-left-color:#2563eb;color:#f9fafb}[data-theme=dark] .history-item:hover{background:#374151}[data-theme=dark] .slot-btn{background:#1f2937;border-color:#374151;color:#f9fafb}[data-theme=dark] .slot-btn:hover{background:#1e3a5f;border-color:#2563eb;color:#93c5fd}[data-theme=dark] .step-num{background:#374151;border-color:#4b5563;color:#9ca3af}[data-theme=dark] .modal-card{background:#111827;border-color:#374151}[data-theme=dark] .modal-box{background:#1f2937;border-color:#374151}[data-theme=dark] .modal-log{background:#0a0f1a;border-color:#374151}[data-theme=dark] .fit-btn{background:#1f2937;border-color:#374151;color:#d1d5db}[data-theme=dark] .coord-display{background:#111827;border-color:#374151;color:#f9fafb}.page-header{margin-bottom:20px}.page-header h2{font-size:1.5rem;font-weight:700;letter-spacing:-.4px;color:var(--dark);margin-bottom:4px}.page-header p{color:var(--gray-500);font-size:.85rem}.card{background:var(--white);border:1px solid var(--border);border-radius:12px;padding:24px;margin-bottom:20px;box-shadow:0 1px 3px #0000000f;transition:box-shadow .2s}.card:hover{box-shadow:0 3px 10px #00000014}.card-header{display:flex;align-items:center;gap:10px;padding-bottom:16px;margin-bottom:20px;border-bottom:1px solid var(--border)}.card-header h3{font-size:1rem;font-weight:600;color:var(--dark)}.card-icon{font-size:1.2rem;width:20px;height:20px;color:var(--primary);flex-shrink:0}.card-icon svg,.card-icon.card-icon svg{width:20px;height:20px}svg.card-icon{width:20px;height:20px;font-size:unset}.card-icon-audio{color:var(--audio)}.grid-2{display:grid;grid-template-columns:repeat(auto-fit,minmax(420px,1fr));gap:18px;margin-bottom:18px}@media (max-width: 900px){.grid-2{grid-template-columns:1fr}}.full-width{grid-column:1 / -1}button,.btn{display:inline-flex;align-items:center;gap:6px;padding:9px 18px;border:none;border-radius:8px;font-size:.85rem;font-weight:600;font-family:inherit;cursor:pointer;transition:background .15s,transform .12s,box-shadow .15s;white-space:nowrap;background:var(--gray-100);color:var(--dark)}button:hover:not(:disabled),.btn:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 4px 10px #0000001f}button:active:not(:disabled),.btn:active:not(:disabled){transform:translateY(0)}button:disabled,.btn:disabled{opacity:.45;cursor:not-allowed;transform:none!important;box-shadow:none!important}.btn-primary{background:var(--primary);color:#fff}.btn-primary:hover:not(:disabled){background:var(--primary-hover)}.btn-success{background:var(--success);color:#fff}.btn-success:hover:not(:disabled){background:var(--success-hover)}.btn-danger{background:var(--danger);color:#fff}.btn-danger:hover:not(:disabled){background:var(--danger-hover)}.btn-warning{background:var(--warning);color:#fff}.btn-secondary{background:var(--gray-200);color:var(--dark);border:1px solid var(--border)}.btn-secondary:hover:not(:disabled){background:var(--gray-300)}.btn-ghost{background:transparent;color:var(--gray-700);border:1px solid var(--border)}.btn-ghost:hover:not(:disabled){background:var(--gray-100)}.btn-audio{background:var(--audio);color:#fff}.btn-audio:hover:not(:disabled){filter:brightness(1.08)}.btn-block{width:100%;justify-content:center}.btn-lg{padding:12px 22px;font-size:.9rem}.btn-row{display:flex;gap:10px;flex-wrap:wrap}.btn-icon{font-size:.95rem}.w100{width:100%}.btn.w100{justify-content:center}@keyframes ledCalShimmer{0%{background-position:-200% 0}to{background-position:200% 0}}.led-cal-loading td{background-image:linear-gradient(90deg,#3b82f600,#3b82f624,#3b82f600);background-size:200% 100%;animation:ledCalShimmer 1.4s ease-in-out infinite}input[type=text],input[type=number],input[type=file],textarea,select{width:100%;padding:9px 12px;border:1.5px solid var(--border);border-radius:7px;font-size:.85rem;font-family:inherit;background:var(--white);color:var(--dark);transition:border-color .15s,box-shadow .15s}input::placeholder,textarea::placeholder{color:var(--gray-500)}input:focus,textarea:focus,select:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 3px #2563eb1a}input:disabled,textarea:disabled,select:disabled{background:var(--gray-100);color:var(--gray-500);cursor:not-allowed}.input-group{margin:12px 0}.input-label,.form-label{display:block;font-weight:600;margin-bottom:6px;color:var(--gray-700);font-size:.82rem}.form-group{margin-bottom:14px}.form-group label{display:block;font-weight:600;font-size:.82rem;color:var(--gray-700);margin-bottom:6px}code{font-family:var(--mono);background:var(--gray-100);color:var(--dark);padding:2px 6px;border-radius:6px;font-size:.88em}kbd{font-family:inherit;background:var(--gray-100);border:1px solid var(--border);border-radius:6px;padding:1px 6px;font-size:.82em;color:var(--dark)}.notice,.alert{display:flex;align-items:center;gap:8px;padding:10px 14px;border-radius:8px;font-size:.84rem;margin-bottom:14px;border:1px solid var(--border);background:var(--gray-50);color:var(--dark)}.notice-info,.alert-info{background:#eff6ff;border-color:#bfdbfe;color:#1e40af}.notice-warning,.alert-warning{background:#fffbeb;border-color:#fde68a;color:#92400e}.notice-success,.alert-success{background:#ecfdf5;border-color:#a7f3d0;color:#065f46}.notice-danger,.alert-danger{background:#fef2f2;border-color:#fecaca;color:#991b1b}.alert-audio{background:#f5f3ff;border-color:#ddd6fe;color:#5b21b6}.notice-icon{font-size:.95rem;flex-shrink:0}.progress-bar,.progress-wrap{margin:16px 0}.progress-track{width:100%;height:6px;background:var(--gray-100);border-radius:6px;overflow:hidden}.progress-fill{height:100%;width:0%;background:linear-gradient(90deg,var(--primary),var(--success));transition:width .3s ease}.progress-text,.progress-label{text-align:center;font-weight:600;color:var(--gray-500);margin-top:6px;font-size:.82rem}.terminal{background:#0f1117;color:#e2e8f0;padding:16px 18px;border-radius:8px;min-height:220px;max-height:340px;overflow-y:auto;font-family:var(--mono);font-size:.8rem;line-height:1.6;white-space:pre-wrap;word-break:break-all}.terminal-line{display:block}.terminal-error{color:#f87171}.terminal-success{color:#34d399}.terminal-warning{color:#fbbf24}.terminal-info{color:#93c5fd}.terminal-sent{color:#c4b5fd}.log-error{color:#f87171}.log-warn{color:#fbbf24}.log-success{color:#34d399}.log-info{color:#60a5fa}.history-list{max-height:360px;overflow-y:auto;display:flex;flex-direction:column;gap:4px;margin-bottom:12px}.history-item{padding:8px 12px;background:var(--gray-100);border-left:3px solid var(--primary);border-radius:4px;font-family:var(--mono);font-size:.8rem;cursor:pointer;color:var(--dark);transition:background .15s,transform .15s;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.history-item:hover{background:var(--border);transform:translate(2px)}.empty-state{display:flex;flex-direction:column;align-items:center;padding:28px 20px;color:var(--gray-500);font-size:.85rem;text-align:center}.audio-drop-zone,.qc-drop-zone{border:2px dashed var(--gray-300);border-radius:8px;padding:24px 16px;text-align:center;cursor:pointer;transition:border-color .2s,background .2s;background:var(--gray-50);color:var(--gray-500)}.audio-drop-zone:hover,.audio-drop-zone.drag-over,.qc-drop-zone:hover,.qc-drop-zone.drag-over{border-color:var(--success);background:#0596690d}.waveform-canvas{display:block;width:100%;height:80px;border-radius:8px;background:#0f1117;margin:12px 0;border:1px solid var(--border)}.audio-controls{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:10px}.audio-controls audio{flex:1;min-width:180px;height:36px}.audio-status{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border-radius:999px;font-size:.78rem;font-weight:600;border:1px solid var(--border)}.audio-on{background:#ecfdf5;color:#065f46;border-color:#a7f3d0}.audio-off{background:#fef2f2;color:#991b1b;border-color:#fecaca}.canvas-wrapper{display:flex;flex-direction:column;align-items:center;gap:8px}.canvas-frame{position:relative;cursor:crosshair;border-radius:10px;overflow:visible;box-shadow:0 4px 16px #2563eb2e;display:block}.canvas-frame:focus{outline:none}.canvas-frame canvas{border-radius:10px!important}.coord-display{display:flex;gap:10px;font-family:var(--mono);font-size:.85rem;font-weight:600;color:var(--dark);background:var(--gray-100);padding:7px 14px;border-radius:8px;border:1px solid var(--border)}.coord-display span{color:var(--primary)}.fit-options{display:flex;gap:8px;flex-wrap:wrap}.fit-btn{padding:7px 14px;font-size:.8rem;font-weight:600;border:1.5px solid var(--border);border-radius:999px;background:var(--white);color:var(--gray-700);cursor:pointer;transition:all .15s ease;font-family:inherit}.fit-btn:hover{border-color:var(--primary);color:var(--primary)}.fit-btn.active{background:var(--primary);color:#fff;border-color:transparent}.canvas-label{font-size:.75rem;color:var(--gray-500);text-align:center}.step-list{list-style:none}.step-item{display:flex;align-items:flex-start;gap:10px;padding:10px 0;border-bottom:1px solid var(--border);font-size:.86rem}.step-item:last-child{border-bottom:none}.step-num{min-width:26px;height:26px;background:var(--gray-100);border:1px solid var(--border);border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.78rem;color:var(--gray-500);flex-shrink:0;transition:all .2s}.step-num.active,.step-num.active-audio{background:var(--primary);color:#fff;border-color:transparent;box-shadow:0 0 0 4px #2563eb2e}.step-num.done{background:var(--success);color:#fff;border-color:transparent}.step-num.error{background:var(--danger);color:#fff;border-color:transparent}.step-text{flex:1;line-height:1.5}.step-text strong{display:block;color:var(--dark);font-weight:600}.step-text em{color:var(--gray-500);font-style:normal;font-size:.9em}.slot-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}.slot-btn{padding:11px 10px;background:var(--gray-100);border:1.5px solid var(--border);border-radius:8px;font-size:.82rem;font-weight:600;color:var(--dark);cursor:pointer;transition:all .15s;text-align:center;font-family:inherit}.slot-btn:hover{background:#eff6ff;border-color:#bfdbfe;color:var(--primary)}.slot-btn.active{background:var(--primary);color:#fff;border-color:transparent}.slot-btn-audio:hover{background:#f5f3ff;border-color:#ddd6fe;color:var(--audio)}.slot-btn-audio.active{background:var(--audio);color:#fff;border-color:transparent}.slot-path{font-family:var(--mono);font-size:.74rem;color:var(--gray-500);margin-top:3px;word-break:break-all}.slot-btn.active .slot-path{color:#ffffffbf}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;z-index:1000;display:flex;align-items:center;justify-content:center;padding:16px}.modal-box{background:var(--white);border:1px solid var(--border);border-radius:12px;width:100%;max-width:820px;max-height:90vh;overflow-y:auto;box-shadow:0 20px 60px #0000002e}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:20px 22px 16px;border-bottom:1px solid var(--border)}.modal-header h2{color:var(--dark);font-size:1.1rem;font-weight:600}.modal-close{background:var(--gray-100);color:var(--gray-700);border:1px solid var(--border);border-radius:8px;padding:6px 12px;cursor:pointer;font-size:1rem}.modal-close:hover{background:var(--gray-200)}.modal-body{padding:18px 22px}.modal-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px}@media (max-width: 640px){.modal-grid{grid-template-columns:1fr}}.modal-card{background:var(--gray-50);border:1px solid var(--border);border-radius:10px;padding:18px}.modal-card-title{display:flex;align-items:center;gap:8px;font-size:.8rem;color:var(--gray-500);font-weight:700;text-transform:uppercase;letter-spacing:.06em;border-bottom:1px solid var(--border);padding-bottom:10px;margin-bottom:14px}.step-badge{background:var(--primary);color:#fff;border-radius:50%;width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;font-size:.72rem;font-weight:900;flex-shrink:0}.svc-badge{margin-left:auto;font-size:.7rem;padding:2px 8px;border-radius:999px;font-weight:700}.badge-on{background:#ecfdf5;color:#065f46;border:1px solid #a7f3d0}.badge-off{background:#fef2f2;color:#991b1b;border:1px solid #fecaca}.checkbox-group{display:flex;align-items:center;gap:8px}.checkbox-group input[type=checkbox]{width:auto;cursor:pointer;accent-color:var(--primary)}.checkbox-group label{margin:0;text-transform:none;font-weight:500;cursor:pointer;-webkit-user-select:none;user-select:none;font-size:.88rem;color:var(--dark)}.auto-filled{border-color:var(--success)!important;background:#ecfdf5!important}.auto-tag{position:absolute;right:10px;top:50%;transform:translateY(-50%);font-size:.62rem;background:var(--success);color:#fff;padding:2px 6px;border-radius:4px;font-weight:700;pointer-events:none}.progress-steps{display:flex;justify-content:space-between;margin:12px 0 5px;gap:5px}.step{flex:1;text-align:center;padding:5px 3px;border-radius:8px;font-size:.65rem;font-weight:700;background:var(--gray-100);color:var(--gray-500);border:1px solid var(--border);transition:all .3s}.step.active{background:#eff6ff;color:var(--primary);border-color:#bfdbfe}.step.done{background:#ecfdf5;color:var(--success);border-color:#a7f3d0}.step.error{background:#fef2f2;color:var(--danger);border-color:#fecaca}.alert-box{border-radius:8px;padding:9px 12px;font-size:.8rem;margin-top:10px;display:flex;gap:9px;align-items:flex-start;border:1px solid var(--border)}.modal-log{background:#0f1117;color:#34d399;padding:14px;border-radius:8px;font-family:var(--mono);height:180px;overflow-y:auto;font-size:.78rem;white-space:pre-wrap;line-height:1.6;border:1px solid var(--border)}.modal-log-line{margin:2px 0}.qc-table-wrap{overflow-x:auto;margin-bottom:28px}.qc-table-title{font-size:.88rem;font-weight:600;color:var(--dark);margin-bottom:10px;display:flex;align-items:center;gap:8px}.qc-table{width:100%;border-collapse:collapse;font-size:.84rem}.qc-table th{padding:10px 12px;background:var(--gray-100);border:1px solid var(--border);font-weight:600;color:var(--gray-700);white-space:nowrap}.qc-table td{padding:9px 12px;border:1px solid var(--border);color:var(--dark)}.qc-table tbody tr:hover{background:#fafafa}.qc-table td.text-center{text-align:center;font-family:var(--mono)}.cell-pass{background:#d1fae5!important;color:#065f46!important;font-weight:700}.cell-fail{background:#fee2e2!important;color:#991b1b!important;font-weight:700}.temp-tables-wrap{display:flex;gap:16px;flex-wrap:wrap;margin-bottom:24px}.temp-table-block{flex:0 1 auto;min-width:180px}.temp-table{width:100%;border-collapse:collapse;font-size:.82rem;box-shadow:0 1px 4px #00000012;border-radius:6px;overflow:hidden}.temp-table th{padding:8px 10px;background:var(--gray-100);border:1px solid var(--border);font-weight:600;color:var(--gray-700)}.temp-table td{padding:7px 10px;border:1px solid var(--border);font-family:var(--mono);font-size:.8rem;text-align:center}.temp-table tr:nth-child(2n){background:#fafafa}.section-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.section-title{font-size:.9rem;font-weight:600;color:var(--dark)}.specs-status{margin-top:12px;font-size:.82rem;color:var(--gray-500)}.meas-list{display:flex;flex-wrap:wrap;gap:8px}.meas-row{display:inline-flex;align-items:center;gap:6px;padding:4px 8px;background:var(--gray-100);border:1px solid var(--gray-200);border-radius:6px;white-space:nowrap}.meas-filename{font-family:var(--mono);font-weight:600;font-size:.82rem;color:var(--dark)}.meas-meta{font-size:.8rem;color:var(--gray-500)}.meas-actions{display:flex;gap:8px;flex-shrink:0}.meas-btn{padding:6px 14px;border:none;border-radius:6px;font-size:.8rem;font-weight:600;font-family:inherit;cursor:pointer;display:flex;align-items:center;gap:5px;transition:opacity .15s,transform .12s}.meas-btn:hover{opacity:.88;transform:translateY(-1px)}.meas-btn-dl{background:var(--success);color:#fff}.meas-btn-view{background:var(--warning);color:#fff}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--gray-300);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#9ca3af}.status-badge{display:inline-flex;align-items:center;gap:8px;padding:6px 14px;border-radius:20px;font-size:.82rem;font-weight:600;letter-spacing:.2px}.status-connected{background:#05966940;border:1px solid rgba(5,150,105,.4);color:#a7f3d0}.status-disconnected{background:#dc262633;border:1px solid rgba(220,38,38,.35);color:#fca5a5}.status-dot{width:8px;height:8px;border-radius:50%;background:currentColor}.status-connected .status-dot{animation:pulse 2s infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.4}}.mt-12{margin-top:12px}.mb-12{margin-bottom:12px}.mt-15{margin-top:15px}.mb-15{margin-bottom:15px}
