:root{--bg-base: #08090d;--bg-card: #0e1018;--bg-input: #090b12;--bg-deep: #060710;--border-subtle: rgba(255, 255, 255, .04);--border-default: rgba(255, 255, 255, .07);--border-hover: rgba(255, 255, 255, .12);--text-primary: #e2e4ec;--text-secondary: #8890a8;--text-muted: #505470;--text-dim: #3a3f58;--accent: #00d4ff;--accent-dim: rgba(0, 212, 255, .08);--accent-border: rgba(0, 212, 255, .2);--success: #00e676;--error: #ff3d57;--font-ui: "Outfit", -apple-system, sans-serif;--font-mono: "IBM Plex Mono", "SF Mono", "Fira Code", monospace;font-family:var(--font-mono);line-height:1.5;font-weight:400;color-scheme:dark;color:var(--text-primary);background-color:var(--bg-base)}*{box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}body{margin:0;min-width:360px;min-height:100vh;background:radial-gradient(circle at 50% 0%,rgba(0,212,255,.03) 0%,transparent 50%),radial-gradient(circle,rgba(255,255,255,.02) 1px,transparent 1px);background-color:var(--bg-base);background-size:100% 100%,24px 24px}#app{max-width:680px;margin:0 auto;padding:2rem 1.5rem 3rem}.app-header{display:flex;align-items:center;gap:14px;margin-bottom:1.75rem;padding-bottom:1.5rem;border-bottom:1px solid var(--border-subtle);animation:fadeInUp .5s ease-out both}.logo-icon{flex-shrink:0;filter:drop-shadow(0 0 6px rgba(0,212,255,.3))}h1{font-family:var(--font-ui);font-size:1.75rem;font-weight:700;color:var(--text-primary);margin:0;letter-spacing:-.03em;line-height:1.1}.subtitle{font-family:var(--font-mono);font-size:.72rem;color:var(--text-muted);margin:.25em 0 0;letter-spacing:.05em}#status{padding:.45em 1em;border-radius:8px;font-family:var(--font-mono);font-size:.8rem;font-weight:500;margin-bottom:1.25rem;letter-spacing:.02em;transition:background-color .3s,color .3s,border-color .3s;border:1px solid transparent;animation:fadeInUp .5s ease-out .05s both}#status:before{content:"";display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:8px;vertical-align:middle;transition:all .3s}.status.disconnected{background:#ff3d570f;color:#ff6b7a;border-color:#ff3d571a}.status.disconnected:before{background:#ff3d57;box-shadow:0 0 6px #ff3d5780}.status.connecting{background:#ffab000f;color:#ffbf40;border-color:#ffab001a}.status.connecting:before{background:#ffab00;box-shadow:0 0 6px #ffab0080;animation:pulse-dot 1s ease-in-out infinite}.status.connected{background:#00e6760f;color:#40e88a;border-color:#00e6761a}.status.connected:before{background:#00e676;box-shadow:0 0 6px #00e67680}.status.uploading{background:#00d4ff0f;color:#40d8ff;border-color:#00d4ff1a}.status.uploading:before{background:var(--accent);box-shadow:0 0 6px #00d4ff80;animation:pulse-dot 1s ease-in-out infinite}.status.running{background:#00e6760f;color:#40e88a;border-color:#00e6761a}.status.running:before{background:#00e676;box-shadow:0 0 6px #00e67680;animation:pulse-dot .8s ease-in-out infinite}.setup-section{background:var(--bg-card);border:1px solid var(--border-default);border-radius:12px;padding:1.25rem 1.5rem;margin-bottom:.75rem;animation:fadeInUp .5s ease-out both}#start-section{animation-delay:.1s}.log-section{animation-delay:.15s}.about-section{animation-delay:.2s}.section-head{display:flex;align-items:center;gap:10px;margin-bottom:1rem}.section-head h2{margin:0}h2{font-family:var(--font-ui);font-size:.8rem;font-weight:600;color:var(--text-secondary);margin:0 0 1rem;text-transform:uppercase;letter-spacing:.08em;border:none;padding:0}.step-num{font-family:var(--font-ui);font-size:.6rem;font-weight:700;color:var(--accent);background:var(--accent-dim);border:1px solid var(--accent-border);border-radius:5px;padding:2px 7px;letter-spacing:.08em;line-height:1.4}button{border-radius:8px;border:1px solid var(--border-default);padding:.5em 1.1em;font-size:.82rem;font-weight:500;font-family:var(--font-mono);background:linear-gradient(180deg,#14182a,#0e1120);color:#b0b6d0;cursor:pointer;transition:all .2s ease;display:inline-flex;align-items:center;gap:6px;line-height:1.4}button:hover:not(:disabled){border-color:var(--border-hover);background:linear-gradient(180deg,#181d32,#121628);color:var(--text-primary)}button:active:not(:disabled){transform:translateY(1px)}button:disabled{opacity:.3;cursor:not-allowed}button svg{flex-shrink:0;opacity:.7}button:hover:not(:disabled) svg{opacity:1}button#btn-connect{background:linear-gradient(180deg,#00d4ff1f,#00d4ff0d);border-color:var(--accent-border);color:var(--accent)}button#btn-connect:hover:not(:disabled){background:linear-gradient(180deg,#00d4ff33,#00d4ff14);border-color:#00d4ff66;box-shadow:0 0 16px #00d4ff1a;color:var(--accent)}.btn-row{display:flex;gap:.5em;align-items:center;flex-wrap:wrap}select{background:var(--bg-input);color:var(--text-secondary);border:1px solid var(--border-default);border-radius:6px;padding:.35em .6em;font-family:var(--font-mono);font-size:.8rem;transition:border-color .2s}select:focus{outline:none;border-color:#00d4ff4d}label{font-size:.78rem;color:var(--text-muted);display:flex;align-items:center;gap:6px;text-transform:uppercase;letter-spacing:.04em;font-family:var(--font-mono)}input[type=file]{width:100%;font-family:var(--font-mono);font-size:.78rem;color:var(--text-muted)}input[type=file]::file-selector-button{font-family:var(--font-mono);font-size:.75rem;font-weight:500;padding:.4em .9em;border-radius:6px;border:1px solid var(--border-default);background:linear-gradient(180deg,#14182a,#0e1120);color:var(--text-secondary);cursor:pointer;margin-right:.75em;transition:all .2s}input[type=file]::file-selector-button:hover{border-color:var(--border-hover);color:var(--text-primary)}details{margin-top:.75rem}summary{font-family:var(--font-mono);font-size:.75rem;color:var(--text-muted);cursor:pointer;padding:.3em 0;-webkit-user-select:none;user-select:none;transition:color .2s;list-style:none}summary:before{content:"›";display:inline-block;margin-right:6px;transition:transform .2s}details[open] summary:before{transform:rotate(90deg)}summary::-webkit-details-marker{display:none}summary:hover{color:var(--text-secondary)}.details-body{margin-top:.5rem;padding:.75rem;background:#0003;border-radius:8px;border:1px solid var(--border-subtle);display:flex;flex-direction:column;gap:.5rem}progress{width:100%;height:3px;margin-top:.75rem;border-radius:2px;appearance:none;border:none}progress::-webkit-progress-bar{background:#ffffff0a;border-radius:2px}progress::-webkit-progress-value{background:linear-gradient(90deg,var(--accent),#00e5ff);border-radius:2px;box-shadow:0 0 8px #00d4ff66}progress::-moz-progress-bar{background:linear-gradient(90deg,var(--accent),#00e5ff);border-radius:2px}#firmware-panel{margin-top:1rem;padding:1rem 1.25rem;border-radius:10px;background:#ffab000d;border:1px solid rgba(255,171,0,.15)}#firmware-panel p{color:#ffbf40;margin:0 0 .75rem}#fw-version{font-family:var(--font-mono);font-size:.75rem;color:var(--text-muted);margin-top:.5rem}.about-body p{font-size:.8rem;color:var(--text-secondary);margin:0 0 .75rem;line-height:1.65}.about-body ul{margin:0;padding-left:1.1em;list-style:none}.about-body li{font-size:.78rem;color:var(--text-muted);line-height:1.8;position:relative;padding-left:.4em}.about-body li:before{content:"•";color:var(--accent);position:absolute;left:-1em;opacity:.5}#log{background:var(--bg-deep);border:1px solid var(--border-subtle);border-radius:8px;padding:.75rem 1rem;font-family:var(--font-mono);font-size:.72rem;max-height:180px;overflow-y:auto;white-space:pre-wrap;word-break:break-all;color:#5a8a6a;margin:0;box-shadow:inset 0 2px 6px #0000004d;line-height:1.6}#log::-webkit-scrollbar{width:4px}#log::-webkit-scrollbar-track{background:transparent}#log::-webkit-scrollbar-thumb{background:#ffffff14;border-radius:2px}#log::-webkit-scrollbar-thumb:hover{background:#ffffff24}code{background:#ffffff0a;padding:.15em .4em;border-radius:4px;font-size:.88em;font-family:var(--font-mono)}section p{font-size:.82rem;color:var(--text-muted);margin:0 0 .5em}@keyframes fadeInUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse-dot{0%,to{opacity:1}50%{opacity:.4}}@media(max-width:580px){#app{padding:1.25rem 1rem 2rem}.setup-section{padding:1rem 1.15rem}}body.waveform-active #app{max-width:none;padding:0;display:flex;flex-direction:column;height:100vh}body.waveform-active .setup-section,body.waveform-active .app-header,body.waveform-active #status{display:none!important}#waveform-section{display:none;flex-direction:column;flex:1;min-height:0;background:#0a0b10}#waveform-section.active{display:flex}.waveform-toolbar{display:flex;align-items:center;gap:8px;padding:5px 14px;background:linear-gradient(180deg,#101220,#0c0e18);border-bottom:1px solid rgba(255,255,255,.06);flex-shrink:0;min-height:42px}.waveform-toolbar .toolbar-group{display:flex;align-items:center;gap:4px}.waveform-toolbar .toolbar-separator{width:1px;height:20px;background:#ffffff0f;margin:0 4px}.waveform-toolbar button{border-radius:5px;border:1px solid rgba(255,255,255,.07);padding:4px 12px;font-size:.72rem;font-weight:600;font-family:var(--font-mono, "IBM Plex Mono", "SF Mono", monospace);background:linear-gradient(180deg,#14182a,#0e1120);color:#8890a8;cursor:pointer;transition:all .15s ease;letter-spacing:.04em;text-transform:uppercase;line-height:1.5}.waveform-toolbar button:hover:not(:disabled){border-color:#ffffff24;color:#c8cee0;background:linear-gradient(180deg,#181d32,#121628)}.waveform-toolbar button:active:not(:disabled){transform:translateY(1px)}.waveform-toolbar button:disabled{opacity:.25;cursor:not-allowed}.waveform-toolbar button.btn-record{border-color:#ff3d5726;color:#ff5070;position:relative;padding-left:24px}.waveform-toolbar button.btn-record:before{content:"";position:absolute;left:9px;top:50%;transform:translateY(-50%);width:7px;height:7px;border-radius:50%;background:#ff3d57;transition:box-shadow .3s}.waveform-toolbar button.btn-record:hover:not(:disabled){border-color:#ff3d574d;background:linear-gradient(180deg,#ff3d571a,#ff3d570a);color:#ff5070}.waveform-toolbar button.btn-record.recording{background:linear-gradient(180deg,#ff3d571f,#ff3d570d);border-color:#ff3d5759;color:#ff6b80}.waveform-toolbar button.btn-record.recording:before{animation:pulse-record 1.2s ease-in-out infinite;box-shadow:0 0 8px #ff3d5799}@keyframes pulse-record{0%,to{opacity:1;box-shadow:0 0 4px #ff3d5766}50%{opacity:.5;box-shadow:0 0 10px #ff3d5799}}.waveform-toolbar button.btn-stop{border-color:#ffa04026;color:#ffa040}.waveform-toolbar button.btn-stop:hover:not(:disabled){border-color:#ffa0404d;background:linear-gradient(180deg,#ffa0401a,#ffa0400a);color:#ffa040}.waveform-toolbar button.btn-clear{color:#6a7090}.waveform-toolbar button.btn-save,.waveform-toolbar button.btn-load{border-color:#82aaff26;color:#82aaff}.waveform-toolbar button.btn-save:hover:not(:disabled),.waveform-toolbar button.btn-load:hover:not(:disabled){border-color:#82aaff4d;background:linear-gradient(180deg,#82aaff1a,#82aaff0a);color:#82aaff}.waveform-toolbar button.btn-disconnect-small{margin-left:auto;color:#505470;font-size:.68rem;border-color:transparent;background:transparent;letter-spacing:.03em}.waveform-toolbar button.btn-disconnect-small:hover{color:#ff5070;border-color:#ff3d5726;background:#ff3d570a}.waveform-toolbar select{background:#0a0c14;color:#8890a8;border:1px solid rgba(255,255,255,.07);border-radius:4px;padding:3px 6px;font-family:var(--font-mono, "IBM Plex Mono", monospace);font-size:.72rem;letter-spacing:.02em;transition:border-color .2s}.waveform-toolbar select:focus{outline:none;border-color:#00d4ff40}.waveform-toolbar label{font-family:var(--font-mono, "IBM Plex Mono", monospace);font-size:.66rem;color:#505470;text-transform:uppercase;letter-spacing:.06em;display:flex;align-items:center;gap:5px}.toolbar-status{font-family:var(--font-mono, "IBM Plex Mono", monospace);font-size:.7rem;color:#505470;letter-spacing:.03em;padding:0 6px;white-space:nowrap}.toolbar-status.recording{color:#ff5070}.toolbar-status .sample-count{color:#6a7090;margin-left:4px}.toolbar-zoom{font-family:var(--font-mono, "IBM Plex Mono", monospace);font-size:.66rem;color:#3a4060;letter-spacing:.02em;padding:0 6px;white-space:nowrap}.waveform-container{flex:1;position:relative;min-height:0;overflow:hidden;background:#0a0b10}.waveform-canvas,.overlay-canvas{display:block;position:absolute;top:0;left:0}.waveform-scrollbar{height:8px;background:#08090d;border-top:1px solid rgba(255,255,255,.04);position:relative;flex-shrink:0;cursor:pointer}.waveform-scroll-thumb{position:absolute;top:1px;height:6px;background:#ffffff14;border-radius:3px;cursor:grab;transition:background .15s;min-width:20px}.waveform-scroll-thumb:hover{background:#ffffff24}.waveform-scroll-thumb:active{background:#fff3;cursor:grabbing}body.waveform-active #waveform-log{display:block}#waveform-log{display:none;background:#08090d;border-top:1px solid rgba(255,255,255,.04);padding:3px 14px;font-family:var(--font-mono, "IBM Plex Mono", monospace);font-size:.65rem;color:#3a4060;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex-shrink:0;max-height:20px;cursor:pointer}#waveform-log:hover{color:#505470;background:#0a0c14}.log-modal-overlay{position:fixed;inset:0;background:#0009;z-index:100;display:none;align-items:center;justify-content:center}.log-modal-overlay.visible{display:flex}.log-modal{background:#0e1020;border:1px solid rgba(255,255,255,.08);border-radius:8px;width:80%;max-width:720px;max-height:80vh;display:flex;flex-direction:column;box-shadow:0 16px 48px #00000080}.log-modal-header{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-bottom:1px solid rgba(255,255,255,.06);font-family:var(--font-mono, "IBM Plex Mono", monospace);font-size:.75rem;font-weight:600;color:#8890a8;text-transform:uppercase;letter-spacing:.06em}.log-modal-close{background:none;border:none;color:#505470;font-size:1.2rem;cursor:pointer;padding:0 4px;line-height:1}.log-modal-close:hover{color:#ff5070}.log-modal-content{flex:1;overflow-y:auto;padding:12px 16px;margin:0;font-family:var(--font-mono, "IBM Plex Mono", monospace);font-size:.68rem;line-height:1.6;color:#6a7090;white-space:pre-wrap;word-break:break-all}.log-modal-content .log-warn{color:#ffa040}.log-modal-content .log-error{color:#ff5070}.waveform-toolbar button.btn-channels{border-color:#34d39926;color:#34d399}.waveform-toolbar button.btn-channels:hover:not(:disabled){border-color:#34d3994d;background:linear-gradient(180deg,#34d3991a,#34d3990a);color:#34d399}.row-panel{background:#0e1020;border-bottom:1px solid rgba(255,255,255,.06);padding:8px 14px;flex-shrink:0;max-height:320px;overflow-y:auto}.row-panel-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;font-family:var(--font-mono, "IBM Plex Mono", monospace);font-size:.72rem;font-weight:600;color:#8890a8;text-transform:uppercase;letter-spacing:.06em}.panel-close-btn{background:none;border:none;color:#505470;font-size:1.1rem;cursor:pointer;padding:0 4px;line-height:1}.panel-close-btn:hover{color:#ff5070}.row-list{display:flex;flex-direction:column;gap:2px;margin-bottom:8px}.row-list-item{display:flex;align-items:center;gap:6px;padding:4px 8px;background:#ffffff05;border:1px solid rgba(255,255,255,.04);border-radius:4px;cursor:grab;transition:background .15s,border-color .15s,opacity .15s;-webkit-user-select:none;user-select:none}.row-list-item:hover{background:#ffffff0a;border-color:#ffffff14}.row-list-item.dragging{opacity:.4}.row-list-item.drop-above{border-top:2px solid rgba(52,211,153,.6)}.row-list-item.drop-below{border-bottom:2px solid rgba(52,211,153,.6)}.row-drag-handle{color:#3a4060;font-size:1rem;line-height:1;cursor:grab;flex-shrink:0;width:14px;text-align:center}.row-color-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.row-label{font-family:var(--font-mono, "IBM Plex Mono", monospace);font-size:.72rem;font-weight:600;color:#8890a8;white-space:nowrap;min-width:40px}.row-visibility-btn{margin-left:auto;background:none;border:1px solid rgba(255,255,255,.07);border-radius:3px;padding:1px 8px;font-family:var(--font-mono, "IBM Plex Mono", monospace);font-size:.62rem;font-weight:600;cursor:pointer;text-transform:uppercase;letter-spacing:.04em;transition:all .15s}.row-visibility-btn:hover{border-color:#ffffff26}.row-decoder-fields{display:flex;align-items:center;gap:6px;margin-left:auto;flex-wrap:wrap}.row-remove-btn{background:none;border:1px solid rgba(255,80,112,.15);border-radius:3px;padding:1px 6px;font-size:.8rem;color:#ff5070;cursor:pointer;line-height:1;flex-shrink:0}.row-remove-btn:hover{background:#ff507014;border-color:#ff50704d}.decoder-add-row{display:flex;align-items:center;gap:6px}.decoder-add-row select{background:#0a0c14;color:#8890a8;border:1px solid rgba(255,255,255,.07);border-radius:4px;padding:3px 6px;font-family:var(--font-mono, "IBM Plex Mono", monospace);font-size:.72rem}.decoder-add-row button{border-radius:4px;border:1px solid rgba(0,212,255,.2);padding:3px 10px;font-size:.7rem;font-weight:600;font-family:var(--font-mono, "IBM Plex Mono", monospace);background:#00d4ff0f;color:#00d4ff;cursor:pointer;text-transform:uppercase;letter-spacing:.04em}.decoder-add-row button:hover{background:#00d4ff1f;border-color:#00d4ff59}.decoder-field{display:flex;align-items:center;gap:4px}.decoder-field label{font-family:var(--font-mono, "IBM Plex Mono", monospace);font-size:.64rem;color:#505470;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap}.decoder-field select{background:#0a0c14;color:#8890a8;border:1px solid rgba(255,255,255,.07);border-radius:3px;padding:2px 4px;font-family:var(--font-mono, "IBM Plex Mono", monospace);font-size:.68rem}.measure-action-bar{position:absolute;top:36px;left:50%;transform:translate(-50%);z-index:10;display:none}.measure-action-bar.visible{display:flex;align-items:center;gap:4px;padding:4px 8px;background:#0a0b10e0;border:1px solid rgba(255,217,61,.2);border-radius:0;font-family:var(--font-mono, "IBM Plex Mono", "SF Mono", monospace);animation:actionbar-fadein .15s ease-out}@keyframes actionbar-fadein{0%{opacity:0;transform:translate(-50%) translateY(-4px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.measure-action-group{display:flex;align-items:center;gap:4px}.measure-action-bar button{border:1px solid rgba(255,217,61,.2);border-radius:0;padding:3px 10px;font-size:.68rem;font-weight:600;font-family:var(--font-mono, "IBM Plex Mono", "SF Mono", monospace);background:#ffd93d0f;color:#ffd93d;cursor:pointer;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap;transition:background .12s,border-color .12s}.measure-action-bar button:hover{background:#ffd93d24;border-color:#ffd93d66}.measure-action-bar button:active{background:#ffd93d38}.measure-action-bar button.action-save{border-color:#82aaff33;background:#82aaff0f;color:#82aaff}.measure-action-bar button.action-save:hover{background:#82aaff24;border-color:#82aaff66}.measure-action-bar button.action-save:active{background:#82aaff38}@media(max-width:640px){.waveform-toolbar{padding:4px 8px;gap:4px;flex-wrap:wrap;min-height:36px}.waveform-toolbar button{padding:3px 8px;font-size:.68rem}.waveform-toolbar .toolbar-separator{display:none}}
