:root{--bg:#0d0f12;--side:#101216;--surface:#15181d;--surface2:#191d22;--surface3:#20252b;--line:#2a3037;--line2:#3a424b;--text:#f3f5f7;--muted:#949ca6;--dim:#626b75;--orange:#ff6b35;--orange2:#ff865b;--green:#45d19c;--red:#ff6875;--blue:#6aa6ff;font-family:Inter,"PingFang SC","Microsoft YaHei",Arial,sans-serif;color:var(--text);background:var(--bg)}
*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;min-width:320px;background:var(--bg)}button,input,select{font:inherit}button{cursor:pointer}a{color:inherit}.app-shell{display:grid;grid-template-columns:230px minmax(0,1fr);min-height:100vh}.sidebar{position:sticky;top:0;display:flex;flex-direction:column;height:100vh;padding:20px 14px;border-right:1px solid var(--line);background:var(--side)}.product-brand{display:flex;align-items:center;gap:11px;padding:2px 8px 26px;text-decoration:none}.brand-mark{display:grid;place-items:center;width:36px;height:36px;border-radius:8px;color:#111;background:var(--orange);font:900 11px/1 ui-monospace,Consolas,monospace}.product-brand strong,.product-brand small{display:block}.product-brand strong{font-size:15px}.product-brand small{margin-top:4px;color:var(--dim);font:700 9px/1 ui-monospace,Consolas,monospace;letter-spacing:.12em}.side-label{padding:11px 10px;color:#59616b;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.1em}.protocol-nav{display:grid;gap:4px}.protocol-nav-item{display:grid;grid-template-columns:34px 1fr auto;gap:10px;align-items:center;width:100%;min-height:58px;padding:8px 10px;border:1px solid transparent;border-radius:8px;color:#aab0b7;background:transparent;text-align:left}.protocol-nav-item:hover{background:#171a1f}.protocol-nav-item.active{border-color:#343b44;color:#fff;background:#1d2228}.nav-icon{display:grid;place-items:center;width:30px;height:30px;border:1px solid #353c45;border-radius:6px;color:#8e98a4;font:800 9px/1 ui-monospace,Consolas,monospace}.protocol-nav-item.active .nav-icon{border-color:rgba(255,107,53,.45);color:var(--orange);background:rgba(255,107,53,.08)}.protocol-nav-item strong,.protocol-nav-item small{display:block}.protocol-nav-item strong{font-size:13px}.protocol-nav-item small{margin-top:4px;color:#666f79;font-size:10px}.protocol-nav-item i{width:7px;height:7px;border-radius:50%;background:#555d66}.protocol-nav-item i.ready{background:var(--green)}.protocol-nav-item i.output{background:var(--orange);box-shadow:0 0 0 4px rgba(255,107,53,.1)}.protocol-nav-item i.failed{background:var(--red)}.side-note{margin:26px 8px 0;padding:15px;border:1px solid #252a31;border-radius:8px;background:#12151a}.side-note>span{color:#707883;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.09em}.side-note ol{margin:12px 0 0;padding-left:21px;color:#969da6;font-size:11px;line-height:2}.side-note li::marker{color:#59616b}.sidebar-footer{display:grid;gap:10px;margin-top:auto;padding:12px 8px 2px}.service-state{display:flex;align-items:center;gap:10px;margin-bottom:7px;padding:12px;border:1px solid var(--line);border-radius:8px;background:#15191d}.service-state>i{width:8px;height:8px;border-radius:50%;background:#d6a34d}.service-state>i.online{background:var(--green)}.service-state>i.offline{background:var(--red)}.service-state strong,.service-state small{display:block}.service-state strong{font-size:11px}.service-state small{margin-top:4px;color:#616a74;font:9px/1 ui-monospace,Consolas,monospace}.sidebar-footer>a{padding:2px 3px;color:#7e8791;font-size:11px;text-decoration:none}.sidebar-footer>a:hover{color:var(--text)}
.main-view{min-width:0}.app-header{display:flex;align-items:center;justify-content:space-between;min-height:82px;padding:15px 30px;border-bottom:1px solid var(--line);background:#111419}.app-header p,.panel-header p,.dialog-head p{margin:0 0 6px;color:#68717b;font:700 9px/1 ui-monospace,Consolas,monospace;letter-spacing:.13em}.app-header h1{margin:0;font-size:21px;letter-spacing:-.02em}.header-actions{display:flex;gap:8px}.button{display:inline-flex;align-items:center;justify-content:center;min-height:38px;padding:0 14px;border:1px solid var(--line2);border-radius:6px;color:#dce0e4;background:transparent;font-size:12px;font-weight:700;text-decoration:none}.button:hover{border-color:#59636e;background:#20252b}.button.primary{border-color:var(--orange);color:#111;background:var(--orange)}.button.primary:hover{background:var(--orange2)}.button.secondary{background:#22272d}.button.quiet{color:#abb2ba}.stream-entry{gap:8px;border-color:rgba(69,209,156,.48);color:#e8fff6;background:rgba(69,209,156,.08);white-space:nowrap}.stream-entry:hover,.stream-entry:focus-visible{border-color:var(--green);background:rgba(69,209,156,.15)}.stream-entry i{width:7px;height:7px;border-radius:50%;background:var(--green);box-shadow:0 0 0 4px rgba(69,209,156,.1)}.stream-entry small{padding:3px 5px;border-radius:4px;color:var(--green);background:rgba(69,209,156,.11);font:800 8px/1 ui-monospace,Consolas,monospace;letter-spacing:.08em}.control-strip{display:grid;grid-template-columns:minmax(380px,1fr) auto 170px;align-items:center;gap:22px;min-height:72px;padding:12px 30px;border-bottom:1px solid var(--line);background:#0f1216}.control-group{display:flex;align-items:center;gap:8px}.control-group>label{color:#717a84;font-size:11px}.control-group select{width:220px}.control-group button{height:36px;padding:0 12px;border:1px solid #414951;border-radius:6px;color:#d9dde0;background:#1a1e23;font-size:11px;font-weight:700}.control-group button:hover{border-color:var(--orange);color:var(--orange)}.route-preview{display:flex;align-items:center;gap:11px;color:#9aa2ab;font:11px/1 ui-monospace,Consolas,monospace}.route-preview b{color:#4d5660}.route-preview span:first-child,.route-preview span:nth-child(3){color:#e3e6e8}.strip-status{justify-self:end;text-align:right}.strip-status span,.strip-status strong{display:block}.strip-status span{color:#5e6771;font-size:9px;text-transform:uppercase;letter-spacing:.1em}.strip-status strong{margin-top:5px;color:#aab1b8;font-size:11px}
input,select{height:36px;padding:0 10px;border:1px solid #353d46;border-radius:5px;color:#e6e9eb;background:#111419;outline:0}input:focus,select:focus{border-color:#64717d;box-shadow:0 0 0 2px rgba(106,166,255,.08)}label{color:#7f8892;font-size:11px}.protocol-workbench{margin:22px 30px 14px;border:1px solid var(--line);border-radius:10px;background:var(--surface);box-shadow:0 18px 60px rgba(0,0,0,.15)}.workbench-header{display:flex;align-items:center;justify-content:space-between;padding:18px 20px;border-bottom:1px solid var(--line)}.protocol-heading{display:flex;align-items:center;gap:13px}.large-icon{display:grid;place-items:center;width:42px;height:42px;border:1px solid rgba(255,107,53,.4);border-radius:8px;color:var(--orange);background:rgba(255,107,53,.07);font:900 10px/1 ui-monospace,Consolas,monospace}.protocol-heading p{margin:0 0 5px;color:#69727c;font:700 9px/1 ui-monospace,Consolas,monospace;letter-spacing:.12em}.protocol-heading h2{margin:0;font-size:18px}.workbench-action{display:flex;align-items:center;gap:10px}.state-badge{padding:6px 9px;border-radius:999px;color:#9ca4ad;background:#22272d;font-size:10px}.state-badge.ready{color:var(--green);background:rgba(69,209,156,.08)}.state-badge.output{color:var(--orange);background:rgba(255,107,53,.1)}.state-badge.failed{color:var(--red);background:rgba(255,104,117,.08)}.connection-band{display:grid;grid-template-columns:1fr 1.1fr .8fr auto;gap:0;align-items:center;min-height:76px}.connection-band>div{min-width:0;padding:0 20px;border-right:1px solid var(--line)}.connection-band span,.connection-band code,.connection-band strong{display:block}.connection-band span{margin-bottom:7px;color:#626b75;font-size:9px;text-transform:uppercase;letter-spacing:.08em}.connection-band code{overflow:hidden;color:#b8c0c8;font-size:11px;text-overflow:ellipsis;white-space:nowrap}.connection-band strong{font-size:11px}.copy-button{margin:0 18px;padding:8px 10px;border:1px solid #39414a;border-radius:5px;color:#8e97a1;background:transparent;font-size:10px}.copy-button:hover{color:#fff}.mqtt-settings{border-top:1px solid var(--line)}.mqtt-settings[hidden]{display:none}.mqtt-settings summary{padding:12px 20px;color:#aab1b8;font-size:11px;cursor:pointer}.mqtt-settings summary span{margin-left:8px;color:#5f6872}.settings-form{display:grid;grid-template-columns:1.2fr .55fr .8fr .8fr .8fr auto;gap:10px;padding:6px 20px 18px}.settings-form label,.entity-meta label,.test-panel form>label,dialog label{display:flex;flex-direction:column;gap:7px}.settings-form .button{align-self:end}
.workspace-grid{display:grid;grid-template-columns:minmax(620px,1fr) 330px;gap:14px;margin:0 30px}.entity-panel,.test-panel,.activity-panel{border:1px solid var(--line);border-radius:10px;background:var(--surface)}.panel-header{display:flex;align-items:flex-start;justify-content:space-between;min-height:65px;padding:17px 20px;border-bottom:1px solid var(--line)}.panel-header h2{margin:0;font-size:17px}.panel-header>span{padding:6px 9px;border-radius:999px;color:var(--green);background:rgba(69,209,156,.07);font-size:10px}.panel-header .step-mark{color:#6d7680;background:#20252b;font:800 10px/1 ui-monospace,Consolas,monospace}.entity-panel form{padding:17px 20px}.entity-meta{display:grid;grid-template-columns:1.2fr repeat(3,.8fr);gap:10px}.value-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-top:17px}.value-grid label{display:block;padding:13px;border:1px solid #2d333a;border-radius:7px;background:#111419}.value-grid label>span{display:flex;justify-content:space-between;color:#8f98a2;font-size:10px}.value-grid b{color:#59626c;font-weight:500}.value-grid input{height:45px;margin-top:8px;padding:0;border:0;border-radius:0;border-bottom:1px solid #343b43;background:transparent;font:800 21px/1 ui-monospace,Consolas,monospace}.form-footer{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:16px;margin-top:17px}.form-footer>span{color:#5e6771;font-size:10px;text-align:right}.delete-button{border:0;color:#a8666e;background:transparent;font-size:10px}.test-panel{background:#12151a}.test-copy{margin:15px 20px;color:#929aa3;font-size:11px;line-height:1.65}.test-panel form{padding:0 20px}.payload-preview{margin:13px 0;padding:12px 13px;border:1px solid #2e353d;border-radius:7px;color:#87919b;background:#0d1013;font:10px/1.65 ui-monospace,Consolas,monospace}.payload-preview strong{color:#e3e6e8}.run-button{justify-content:space-between;width:100%;height:43px;padding:0 15px}.run-button small{font-size:9px;opacity:.65}.result-box{display:flex;gap:11px;margin:13px 20px 18px;padding:12px 13px;border:1px solid #2c3239;border-radius:7px;background:#181c21}.result-box>i{width:8px;height:8px;margin-top:4px;border-radius:50%;background:#68717a}.result-box strong,.result-box p{display:block}.result-box strong{font-size:11px}.result-box p{margin:4px 0 0;color:#69727c;font-size:10px;line-height:1.5}.result-box.success>i{background:var(--green)}.result-box.error>i{background:var(--red)}
.activity-panel{margin:14px 30px 30px;overflow:hidden}.activity-header{display:flex;align-items:center;justify-content:space-between;min-height:52px;padding:10px 16px;border-bottom:1px solid var(--line)}.activity-header>div:first-child{display:flex;align-items:baseline;gap:10px}.activity-header h2{margin:0;font-size:14px}.activity-header>div:first-child span{color:#606973;font-size:10px}.metric-row{display:flex;align-items:center;gap:17px;color:#68717b;font-size:10px}.metric-row b{margin-left:5px;color:#d4d8dc;font:800 11px/1 ui-monospace,Consolas,monospace}.metric-row button{border:0;color:#79828c;background:transparent;font-size:10px}.log-table{background:#101317}.log-head,.log-entry{display:grid;grid-template-columns:80px 64px 1fr;gap:12px;padding:0 16px}.log-head{align-items:center;height:30px;color:#555e68;background:#13171b;font-size:9px;text-transform:uppercase;letter-spacing:.08em}.log-list{max-height:174px;overflow-y:auto}.log-entry{align-items:center;min-height:31px;border-top:1px solid #232930;color:#929aa3;font-size:10px}.log-entry time,.log-level{color:#626b75;font:9px/1 ui-monospace,Consolas,monospace}.log-entry.success .log-level{color:var(--green)}.log-entry.error .log-level{color:var(--red)}.log-entry.warning .log-level{color:var(--orange)}.empty{margin:20px;color:#626b75;font-size:10px}
dialog{width:min(450px,calc(100vw - 30px));padding:0;border:1px solid #414953;border-radius:10px;color:var(--text);background:#171b20;box-shadow:0 30px 100px #000}dialog::backdrop{background:rgba(0,0,0,.72)}dialog form{padding:23px}dialog h2{margin:0;font-size:20px}.dialog-head{display:flex;justify-content:space-between}.dialog-head>button{border:0;color:#9098a1;background:transparent;font-size:22px}.dialog-head+ p{margin:18px 0;color:#9098a1;font-size:11px;line-height:1.6}dialog label{margin-top:13px}.dialog-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:22px}.toast{position:fixed;right:24px;bottom:24px;z-index:50;max-width:360px;padding:12px 15px;border:1px solid var(--line2);border-radius:7px;color:#fff;background:#23282e;opacity:0;transform:translateY(10px);transition:.2s;pointer-events:none;font-size:11px}.toast.show{opacity:1;transform:none}.toast.error{border-color:#823f49}.toast.success{border-color:#3f735f}
@media(max-width:1100px){.app-shell{grid-template-columns:196px minmax(0,1fr)}.sidebar{padding-right:10px;padding-left:10px}.control-strip{grid-template-columns:1fr auto}.route-preview{display:none}.workspace-grid{grid-template-columns:1fr}.test-panel{display:grid;grid-template-columns:240px 1fr;column-gap:20px;padding-bottom:16px}.test-panel .panel-header{grid-column:1/-1}.test-panel .test-copy{margin-bottom:0}.test-panel form{padding-top:15px}.result-box{align-self:end}.settings-form{grid-template-columns:repeat(3,1fr)}.value-grid{grid-template-columns:repeat(2,1fr)}}
@media(max-width:780px){.app-shell{display:block}.sidebar{position:static;display:grid;grid-template-columns:1fr auto;height:auto;padding:12px 15px;border-right:0;border-bottom:1px solid var(--line)}.product-brand{padding:0}.protocol-nav{grid-column:1/-1;grid-template-columns:repeat(3,1fr);margin-top:12px}.protocol-nav-item{grid-template-columns:30px 1fr;min-height:48px;padding:7px}.protocol-nav-item i{display:none}.protocol-nav-item small{display:none}.side-label,.side-note,.sidebar-footer .service-state,.sidebar-footer>a:last-child{display:none}.sidebar-footer{align-self:center;margin:0;padding:0}.sidebar-footer>a{font-size:10px}.app-header{padding:14px 17px}.app-header p{display:none}.control-strip{grid-template-columns:1fr;padding:10px 17px}.strip-status{display:none}.control-group{display:grid;grid-template-columns:auto 1fr auto;width:100%}.control-group select{width:100%}.protocol-workbench,.workspace-grid,.activity-panel{margin-right:17px;margin-left:17px}.connection-band{grid-template-columns:1fr 1fr}.connection-band>div{padding:13px 16px}.connection-band>div:nth-child(3){border-top:1px solid var(--line)}.copy-button{justify-self:end}.settings-form{grid-template-columns:1fr 1fr}.entity-meta{grid-template-columns:1fr 1fr}.test-panel{display:block;padding-bottom:0}.result-box{margin-bottom:18px}}
@media(max-width:520px){.protocol-nav-item{display:flex;justify-content:center}.protocol-nav-item>span:nth-child(2){display:none}.app-header{align-items:flex-start;flex-direction:column;gap:12px}.header-actions{display:grid;grid-template-columns:1fr 1fr;width:100%}.header-actions .button{width:100%}.header-actions .stream-entry{grid-column:1/-1}.control-group{grid-template-columns:1fr auto}.control-group>label{grid-column:1/-1}.workbench-header{align-items:flex-start;flex-direction:column;gap:14px}.workbench-action{width:100%;justify-content:space-between}.connection-band{grid-template-columns:1fr}.connection-band>div{border-right:0;border-top:1px solid var(--line)}.connection-band>div:first-child{border-top:0}.copy-button{margin:11px 16px 15px}.mqtt-settings summary span{display:none}.settings-form,.entity-meta,.value-grid{grid-template-columns:1fr}.form-footer{grid-template-columns:1fr}.form-footer>span{text-align:left}.form-footer .button{grid-row:1}.activity-header{align-items:flex-start;flex-direction:column;gap:9px}.metric-row{width:100%;justify-content:space-between}.log-head,.log-entry{grid-template-columns:58px 45px 1fr;padding-right:10px;padding-left:10px}}
@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;transition:none!important}}
