:root{--bg:#0d0d1a;--surface:#13132b;--surface-2:#1a1a38;--border:#2a2a50;--accent:#00d4ff;--accent-dim:#008fb3;--success:#00e676;--warning:#ffab00;--danger:#f44;--text:#dde1f0;--text-dim:#7a7fa0;--radius:10px;--radius-sm:6px;--font-mono:"Cascadia Code", "Fira Code", "JetBrains Mono", "Consolas", monospace;--shadow:0 4px 24px #00000080}*,:before,:after{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth}body{background:var(--bg);color:var(--text);min-height:100vh;font-family:Segoe UI,system-ui,-apple-system,sans-serif;font-size:14px;line-height:1.6}h2{color:var(--accent);text-transform:uppercase;letter-spacing:.08em;margin-bottom:14px;font-size:1rem;font-weight:600}h3{color:var(--text-dim);margin-bottom:8px;font-size:.9rem}label{color:var(--text-dim);font-size:.85rem}code,.mono{font-family:var(--font-mono);font-size:.85rem}#browser-warning{border-bottom:2px solid var(--warning);color:var(--warning);text-align:center;background:#3a1a00;padding:10px 24px;font-weight:600;display:none}header{background:var(--surface-2);border-bottom:1px solid var(--border);z-index:200;padding:12px 24px;position:sticky;top:0}.header-inner{flex-wrap:wrap;align-items:center;gap:16px;max-width:1400px;margin:0 auto;display:flex}.logo{color:var(--accent);letter-spacing:.04em;flex-shrink:0;font-size:1.4rem;font-weight:700}.logo sup{vertical-align:super;opacity:.7;font-size:.55em}.subtitle{color:var(--text-dim);font-size:.85rem}.header-right{align-items:center;gap:12px;margin-left:auto;display:flex}.dot{background:var(--text-dim);border-radius:50%;flex-shrink:0;width:10px;height:10px;transition:background .3s}.dot.connected{background:var(--success);box-shadow:0 0 8px var(--success)}.dot.connecting{background:var(--warning);animation:1s infinite pulse}.dot.disconnected{background:#555}@keyframes pulse{0%,to{opacity:1}50%{opacity:.3}}#conn-label{color:var(--text-dim);min-width:100px;font-size:.85rem}.btn{border-radius:var(--radius-sm);cursor:pointer;white-space:nowrap;border:1px solid #0000;padding:7px 16px;font-size:.85rem;font-weight:600;line-height:1.4;transition:background .2s,opacity .2s,transform .1s}.btn:active{transform:scale(.97)}.btn:disabled{opacity:.4;cursor:not-allowed;transform:none}.btn-primary{background:var(--accent);color:#000;border-color:var(--accent)}.btn-secondary{color:var(--accent);border-color:var(--accent-dim);background:0 0}.btn-danger{color:var(--danger);border-color:var(--danger);background:0 0}.btn-warning{color:var(--warning);border-color:var(--warning);background:0 0}.btn-ghost{color:var(--text-dim);border-color:var(--border);background:0 0}.btn-tiny{padding:3px 8px;font-size:.75rem}.btn-primary:not(:disabled):hover{background:var(--accent-dim);border-color:var(--accent-dim)}.btn-secondary:not(:disabled):hover{background:#00d4ff1a}.btn-danger:not(:disabled):hover{background:#ff44441a}.btn-warning:not(:disabled):hover{background:#ffab001a}.btn-ghost:not(:disabled):hover{background:var(--surface-2)}main{grid-template-columns:1fr 1fr;grid-template-areas:"status settings""scan scan""devices devices""ops ops""script script""log log""capture capture";gap:16px;max-width:1400px;margin:0 auto;padding:20px 20px 60px;display:grid}.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:20px}.card-actions{border-top:1px solid var(--border);flex-wrap:wrap;gap:10px;margin-top:16px;padding-top:14px;display:flex}#card-status{grid-area:status}#card-settings{grid-area:settings}#card-scan{grid-area:scan}#card-devices{grid-area:devices}#card-ops{grid-area:ops}#card-script{grid-area:script}#card-log{grid-area:log}#card-capture{grid-area:capture}.stat-grid{grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:12px;display:grid}.stat-item{background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-sm);padding:10px 12px}.stat-item label{color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em;margin-bottom:4px;font-size:.75rem;display:block}.stat-item .val{font-family:var(--font-mono);color:var(--text);font-size:1rem;font-weight:600}.pin-high{color:var(--success)}.pin-low{color:var(--danger)}.settings-row{flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:14px;display:flex}.settings-row label{min-width:130px}.settings-apply-row{justify-content:flex-end;margin-top:4px;margin-bottom:4px;display:flex}.radio-group,.checkbox-group{flex-wrap:wrap;align-items:center;gap:14px;display:flex}.pullup-selects{flex-wrap:wrap;align-items:center;gap:20px;display:flex}.pullup-signal{align-items:center;gap:8px;display:flex}.pullup-signal-label{color:var(--text-dim);letter-spacing:.04em;min-width:28px;font-size:.8rem;font-weight:700}.pullup-sel{background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);cursor:pointer;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%237a7fa0'/%3E%3C/svg%3E");background-position:right 10px center;background-repeat:no-repeat;outline:none;min-width:190px;padding:6px 28px 6px 10px;font-size:.85rem;transition:border-color .2s}.pullup-sel:focus{border-color:var(--accent)}.pullup-sel:disabled{opacity:.45;cursor:not-allowed}.radio-label,.check-label{cursor:pointer;color:var(--text);align-items:center;gap:6px;font-size:.9rem;display:flex}.radio-label input[type=radio],.check-label input[type=checkbox]{accent-color:var(--accent);cursor:pointer;width:15px;height:15px}.scan-header{flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:14px;display:flex}.scan-legend{color:var(--text-dim);flex-wrap:wrap;gap:16px;font-size:.8rem;display:flex}.legend-dot{vertical-align:middle;border-radius:2px;width:10px;height:10px;margin-right:4px;display:inline-block}.legend-dot.active{background:var(--surface-2);border:1px solid var(--border)}.legend-dot.found{background:var(--accent)}.legend-dot.reserved{background:#333}.scan-table-wrap{overflow-x:auto}.scan-table{border-collapse:collapse;font-family:var(--font-mono);font-size:.8rem}.scan-table th{color:var(--text-dim);text-align:center;padding:4px 8px;font-weight:400}.scan-table td{text-align:center;vertical-align:middle;border-radius:var(--radius-sm);cursor:default;-webkit-user-select:none;user-select:none;width:42px;height:36px;transition:background .2s}.addr-cell{background:var(--surface-2);border:1px solid var(--border);color:var(--text-dim)}.addr-cell.found{border-color:var(--accent);color:var(--accent);cursor:pointer;background:#00d4ff2e;font-weight:700;animation:.3s ease-out found-pop;box-shadow:inset 0 0 8px #00d4ff26}.addr-cell.found:hover{background:#00d4ff47}.addr-cell.reserved{color:#333;background:0 0;border:1px solid #222}@keyframes found-pop{0%{opacity:.5;transform:scale(.8)}to{opacity:1;transform:scale(1)}}.scan-summary{color:var(--text-dim);min-height:20px;margin-top:10px;font-size:.85rem}.scan-summary .found-count{color:var(--accent);font-weight:600}[title]{position:relative}.tabs{border-bottom:1px solid var(--border);flex-wrap:wrap;gap:4px;margin-bottom:18px;padding-bottom:12px;display:flex}.tab-btn{border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-dim);cursor:pointer;background:0 0;padding:6px 14px;font-size:.82rem;font-weight:600;transition:all .15s}.tab-btn:hover{background:var(--surface-2);color:var(--text)}.tab-btn.active{background:var(--accent);color:#000;border-color:var(--accent)}.tab-pane{display:none}.tab-pane.active{display:block}.form-grid{grid-template-columns:120px 1fr;align-items:center;gap:10px 12px;margin-bottom:12px;display:grid}.form-grid label{color:var(--text-dim);font-size:.85rem}.inp{background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);font-family:var(--font-mono);outline:none;width:100%;padding:7px 10px;font-size:.9rem;transition:border-color .2s}.inp:focus{border-color:var(--accent-dim)}.inp.narrow{max-width:120px}.inp.medium{max-width:200px}input[type=number].inp{max-width:100px}.inp::placeholder{color:#444}.result-wrap{background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-sm);min-height:46px;margin-top:14px;padding:12px}.result-label{color:var(--text-dim);text-transform:uppercase;letter-spacing:.05em;justify-content:space-between;align-items:center;margin-bottom:6px;font-size:.75rem;display:flex}.result-hex{font-family:var(--font-mono);color:var(--text);word-break:break-all;font-size:.9rem;line-height:1.8}.result-hex .byte-hex{color:#7dd3fc}.result-hex .byte-dec{color:#a0a0c0;font-size:.78rem}.result-hex .byte-char{color:#86efac}.result-ack{color:var(--success);font-weight:600;font-family:var(--font-mono)}.result-nack{color:var(--danger);font-weight:600;font-family:var(--font-mono)}.result-err{color:var(--danger);font-size:.85rem;font-style:italic}.log-header{justify-content:space-between;align-items:center;margin-bottom:10px;display:flex}.log-container{border:1px solid var(--border);border-radius:var(--radius-sm);background:#080813;height:220px;overflow:hidden}.log-container .xterm{height:100%;padding:6px}.capture-wave-header{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;margin-top:12px;display:flex}.capture-window-group{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.capture-window-label{color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em;font-size:.78rem}.capture-wave-wrap{border:1px solid var(--border);border-radius:var(--radius-sm);background:#0b1020;height:170px;margin-top:8px;padding:8px}.device-info{flex-wrap:wrap;gap:6px;margin-top:6px;display:flex}.device-badge{border:1px solid var(--accent-dim);cursor:default;background:#00d4ff1f;border-radius:20px;align-items:center;gap:6px;padding:3px 10px;font-size:.8rem;display:inline-flex}.device-badge .addr{color:var(--accent);font-family:var(--font-mono);font-weight:700}.device-badge .name{color:var(--text-dim)}.toggle{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:8px;display:flex}.toggle input{display:none}.toggle-track{background:var(--border);border-radius:9px;width:34px;height:18px;transition:background .2s;position:relative}.toggle input:checked+.toggle-track{background:var(--accent)}.toggle-track:after{content:"";background:#fff;border-radius:50%;width:14px;height:14px;transition:transform .2s;position:absolute;top:2px;left:2px}.toggle input:checked+.toggle-track:after{transform:translate(16px)}.toggle-label{color:var(--text-dim);font-size:.82rem}.flex-row{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.ml-auto{margin-left:auto}.mt-10{margin-top:10px}.hidden{display:none!important}.text-dim{color:var(--text-dim)}@media (max-width:900px){main{grid-template-columns:1fr;grid-template-areas:"status""settings""scan""devices""ops""log""capture"}}@media (max-width:500px){.scan-table{font-size:.7rem}.scan-table td{width:34px;height:30px}}.dev-picker-row{flex-wrap:wrap;align-items:flex-end;gap:14px;margin-bottom:12px;display:flex}.dev-picker-row .form-group{flex-direction:column;gap:4px;min-width:180px;display:flex}.dev-picker-row .form-group label{color:var(--text-dim);text-transform:uppercase;letter-spacing:.05em;font-size:.78rem}.dev-picker-row select{background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);cursor:pointer;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%237a7fa0'/%3E%3C/svg%3E");background-position:right 10px center;background-repeat:no-repeat;outline:none;min-width:220px;padding:6px 28px 6px 10px;font-size:.9rem;transition:border-color .2s}.dev-picker-row select:focus{border-color:var(--accent)}.dev-picker-row select:disabled{opacity:.45;cursor:not-allowed}.dev-description{color:var(--text-dim);background:var(--surface-2);border-left:3px solid var(--accent);border-radius:0 var(--radius-sm) var(--radius-sm) 0;margin-bottom:14px;padding:6px 10px;font-size:.85rem}.dev-reg-table-wrap{border:1px solid var(--border);border-radius:var(--radius-sm);overflow-x:auto}.dev-reg-table{border-collapse:collapse;width:100%;font-size:.85rem}.dev-reg-table th{background:var(--surface-2);color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em;text-align:left;border-bottom:1px solid var(--border);white-space:nowrap;padding:8px 10px;font-size:.72rem}.dev-reg-table td{vertical-align:top;border-bottom:1px solid #1a1a33;padding:7px 10px}.dev-reg-table tr:last-child td{border-bottom:none}.dev-reg-table tr:hover td{background:#ffffff08}.dev-reg-table details summary{cursor:pointer;align-items:baseline;gap:8px;list-style:none;display:flex}.dev-reg-table details summary::marker{display:none}.dev-reg-table details summary::-webkit-details-marker{display:none}.dev-reg-table details summary:before{content:"▶";color:var(--accent);flex-shrink:0;font-size:.65rem;transition:transform .15s}.dev-reg-table details[open] summary:before{transform:rotate(90deg)}.dev-reg-table details .reg-desc{color:var(--text-dim);font-size:.8rem}.bit-table{flex-direction:column;gap:3px;margin-top:6px;padding-left:14px;display:flex}.bit-row{grid-template-columns:56px 100px 1fr;gap:6px;font-size:.78rem;line-height:1.4;display:grid}.bit-pos{font-family:var(--font-mono);color:var(--accent);white-space:nowrap;font-size:.75rem}.bit-name{color:var(--text);font-weight:600}.bit-desc{color:var(--text-dim)}.access-badge{letter-spacing:.05em;white-space:nowrap;border-radius:4px;padding:2px 7px;font-size:.72rem;font-weight:700;display:inline-block}.access-R{color:var(--accent);background:#00d6ff1f;border:1px solid #00d6ff4d}.access-W{color:var(--warning);background:#ffab001f;border:1px solid #ffab004d}.access-RW{color:var(--success);background:#00e6761f;border:1px solid #00e6764d}.reg-val{font-family:var(--font-mono);color:var(--accent);min-width:54px}.reg-actions{flex-wrap:wrap;align-items:center;gap:6px;min-width:160px;display:flex}.reg-write-group{align-items:center;gap:4px;display:flex}.reg-write-input{width:66px;font-family:var(--font-mono);background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);padding:4px 6px;font-size:.82rem}.reg-write-input:focus{border-color:var(--warning);outline:none}.btn-xs{border-radius:4px;padding:3px 9px;font-size:.78rem}.dev-poll-bar{background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-sm);flex-wrap:wrap;align-items:center;gap:14px;margin-top:12px;padding:10px 14px;display:flex}.poll-bar-label{color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em;white-space:nowrap;font-size:.78rem}.poll-rate-group{flex-wrap:wrap;align-items:center;gap:8px;display:flex}#poll-slider{appearance:none;background:var(--border);cursor:pointer;border-radius:2px;outline:none;width:160px;height:4px}#poll-slider::-webkit-slider-thumb{-webkit-appearance:none;background:var(--accent);cursor:pointer;border-radius:50%;width:14px;height:14px}#poll-slider::-moz-range-thumb{background:var(--accent);cursor:pointer;border:none;border-radius:50%;width:14px;height:14px}.poll-rate-num{width:64px;font-family:var(--font-mono);background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);text-align:right;padding:4px 6px;font-size:.85rem}.poll-rate-num:focus{border-color:var(--accent);outline:none}#poll-unit{background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text);cursor:pointer;padding:4px 6px;font-size:.85rem}.poll-rate-label{font-family:var(--font-mono);color:var(--accent);white-space:nowrap;min-width:80px;font-size:.82rem}.poll-counter{font-family:var(--font-mono);color:var(--success);white-space:nowrap;margin-left:auto;font-size:.82rem}.poll-col{text-align:center;width:32px}.poll-col input[type=checkbox],.poll-cb{cursor:pointer;width:15px;height:15px;accent-color:var(--accent)}@keyframes poll-flash{0%{color:#fff;background:#00d6ff59}to{background:0 0}}.reg-val.flash{animation:.5s ease-out forwards poll-flash}.fmt-badge{font-family:var(--font-mono);color:var(--text-dim);white-space:nowrap;font-size:.75rem}.poll-chart-wrap{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);height:260px;margin-top:14px;padding:12px 16px 8px;position:relative}#poll-chart{display:block;width:100%!important;height:100%!important}.dev-scripts-bar{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);margin-top:14px;padding:10px 14px 12px}.scripts-bar-header{align-items:center;margin-bottom:8px;display:flex}.scripts-bar-label{text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);font-size:.75rem;font-weight:600}.dev-scripts-list{grid-template-columns:repeat(4,1fr);gap:8px;display:grid}.btn-script{white-space:nowrap;text-overflow:ellipsis;text-align:center;padding:6px 10px;font-size:.8rem;font-weight:600;overflow:hidden}.script-toolbar{flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:10px;display:flex}.mode-toggle{border:1px solid var(--border);border-radius:var(--radius-sm);display:flex;overflow:hidden}.mode-toggle .btn{opacity:.55;border:none;border-radius:0;margin:0}.mode-toggle .btn.active{background:var(--accent);color:var(--bg);opacity:1}.script-editor{resize:vertical;background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-sm);width:100%;min-height:180px;color:var(--text);font-family:var(--font-mono);box-sizing:border-box;outline:none;padding:10px 12px;font-size:.85rem;line-height:1.5;transition:border-color .2s}.script-editor:focus{border-color:var(--accent-dim)}.script-editor::placeholder{color:#444}.script-hint{min-height:1.2em;margin-top:8px;font-size:.8rem}.xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;inset:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;inset:0}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre;font-family:monospace}.xterm .xterm-accessibility-tree>div{transform-origin:0;width:-moz-fit-content;width:fit-content}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{display:none;position:absolute}.xterm .xterm-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow,#000) 0 6px 6px -6px inset;display:block;top:0;left:3px}.xterm .xterm-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset;display:block;top:3px;left:0}.xterm .xterm-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset}
