:root,:root[data-theme=light]{--bg-0: #efe9dd;--bg-1: #f7f3ea;--bg-2: #fffdf7;--bg-3: #f1ead9;--fg-0: #2f2a22;--fg-1: #5d564a;--fg-2: #847b6b;--fg-2-text: #847b6b;--pin-dot-fill: #a89a82;--border: #ddd3c0;--border-strong: #c2b59c;--accent: #c05621;--accent-2: #2c7a73;--accent-dim: #e7c4a8;--ok: #5a7d3c;--warn: #b9790f;--err: #b3382e;--running: #b9790f;--node-header: #f5eedf;--canvas-bg: #ebe4d4;--canvas-dots: #cfc3aa;--edge-stroke: #9b8a6c;--scroll-thumb: #d4c8b0;--scroll-thumb-hover: #c2b59c;--probe-accent: #efe0d2;--handle-glow: color-mix(in srgb, var(--accent) 30%, transparent);--spectro-bg: #ffffff;--minimap-mask: rgba(239, 233, 221, .72);--minimap-node: #e3d9c4;--minimap-node-stroke: #c2b59c;--pin-radius: 6px;--row-h: 18px;--paper-shadow: 0 1px 2px rgba(73, 60, 38, .1), 0 4px 14px rgba(73, 60, 38, .08);--paper-shadow-lift: 0 2px 4px rgba(73, 60, 38, .12), 0 10px 28px rgba(73, 60, 38, .14)}*{box-sizing:border-box}html,body,#root{margin:0;padding:0;height:100%;width:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,PingFang SC,Arial,sans-serif;font-size:13px;background:var(--bg-0);color:var(--fg-0);overflow:hidden}:root{--mono: ui-monospace, "SF Mono", "Cascadia Code", "JetBrains Mono", Menlo, Consolas, "Liberation Mono", monospace;--serif: Georgia, "Times New Roman", "Songti SC", "SimSun", serif}button{font-family:inherit;font-size:12px;background:var(--bg-2);color:var(--fg-0);border:1px solid var(--border-strong);padding:4px 10px;border-radius:7px;cursor:pointer;box-shadow:0 1px #493c260f}button:hover{background:var(--bg-3)}button:active{background:var(--bg-1);box-shadow:none}button:disabled{opacity:.45;cursor:not-allowed;box-shadow:none}button.primary{background:var(--accent);border-color:var(--accent);color:#fff8ef}button.primary:hover{filter:brightness(1.06)}input,select,textarea{font-family:inherit;font-size:12px;background:#fffefa;color:var(--fg-0);border:1px solid var(--border-strong);padding:3px 6px;border-radius:6px;outline:none}input:focus,select:focus,textarea:focus{border-color:var(--accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 18%,transparent)}input::placeholder,textarea::placeholder{color:var(--fg-2-text);opacity:1}input[type=checkbox],input[type=radio]{accent-color:var(--accent);background:var(--bg-1);cursor:pointer;vertical-align:middle}:focus-visible{outline:2px solid var(--accent);outline-offset:1px}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:var(--bg-0)}::-webkit-scrollbar-thumb{background:var(--scroll-thumb);border-radius:5px}::-webkit-scrollbar-thumb:hover{background:var(--scroll-thumb-hover)}.app{display:grid;grid-template-rows:minmax(40px,auto) 1fr 24px;height:100vh}.app .toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:8px;row-gap:4px;min-height:40px;padding:4px 12px;background:var(--bg-1);border-bottom:1px solid var(--border-strong);position:relative;z-index:1}.app .status{background:var(--bg-1);border-top:1px solid var(--border-strong);font-size:11px;color:var(--fg-2-text);padding:0 8px;display:flex;align-items:center;gap:16px;position:relative;z-index:1}.toolbar .tb-brand{display:inline-flex;align-items:center;gap:7px}.toolbar .tb-brand strong{color:var(--fg-0);font-family:var(--serif);font-weight:700;font-size:14px;letter-spacing:.4px}.toolbar .tb-group{display:inline-flex;align-items:center;gap:6px}.toolbar .tb-spacer{flex:1}.toolbar .tb-btn{display:inline-flex;align-items:center;gap:5px;padding:3px 9px;font-size:12px;color:var(--fg-1);background:var(--bg-2);border:1px solid var(--border-strong);border-radius:7px;white-space:nowrap;transition:border-color .12s ease,background .12s ease,color .12s ease}.toolbar .tb-btn:hover{color:var(--fg-0);background:var(--bg-3);border-color:var(--accent)}.toolbar .tb-btn:active{background:var(--bg-1)}.toolbar .tb-btn:disabled{opacity:.45;cursor:not-allowed;color:var(--fg-2-text);background:var(--bg-2);border-color:var(--border)}.toolbar .tb-run{color:#fff8ef;background:var(--accent);border-color:var(--accent);font-weight:600;box-shadow:0 1px 3px color-mix(in srgb,var(--accent) 35%,transparent)}.toolbar .tb-run:hover{color:#fff8ef;background:var(--accent);border-color:var(--accent);filter:brightness(1.08)}.toolbar .tb-icon{line-height:1;font-size:12px;display:inline-flex}.toolbar .tb-sep{width:1px;height:18px;flex-shrink:0;background:var(--border-strong)}.toolbar .tb-path{font-family:var(--mono);font-size:11px;color:var(--fg-2-text);max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.toolbar .tb-user{font-size:12px;color:var(--fg-1);max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.app .body{display:grid;grid-template-columns:300px 1fr 380px;grid-template-rows:1fr;grid-template-areas:"pinned canvas side";min-height:0}.area-canvas{grid-area:canvas;min-height:0;min-width:0;position:relative}.area-pinned{grid-area:pinned;background:var(--bg-1);overflow:hidden;min-height:0;display:flex;flex-direction:row;border-right:1px solid var(--border-strong)}.area-side{grid-area:side;background:var(--bg-1);overflow:hidden;min-height:0;display:flex;flex-direction:row;border-left:1px solid var(--border-strong)}.row-resizer{height:6px;flex-shrink:0;cursor:row-resize;background:var(--border);transition:background .12s}.row-resizer:hover{background:var(--accent)}.col-resizer{width:6px;flex-shrink:0;cursor:col-resize;background:var(--border);transition:background .12s}.col-resizer:hover{background:var(--accent)}.pinned-rail,.side-rail{flex:1;min-width:0;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;background:var(--bg-1);cursor:pointer;position:relative;transition:background .12s ease,box-shadow .12s ease}.pinned-rail:hover{background:var(--bg-3);box-shadow:inset -2px 0 0 var(--accent)}.side-rail:hover{background:var(--bg-3);box-shadow:inset 2px 0 0 var(--accent)}.side-rail .rail-label{writing-mode:vertical-rl;text-orientation:mixed;font-size:11px;color:var(--fg-2-text);letter-spacing:2px;-webkit-user-select:none;user-select:none}.side-rail:hover .rail-label{color:var(--fg-0)}.pinned-rail .rail-label{writing-mode:vertical-rl;text-orientation:mixed;font-size:11px;color:var(--fg-2-text);letter-spacing:2px;-webkit-user-select:none;user-select:none}.pinned-rail:hover .rail-label{color:var(--fg-0)}.pinned-rail .rail-count{flex-shrink:0;min-width:16px;padding:1px 4px;text-align:center;border-radius:8px;font-family:var(--mono);font-size:10px;font-variant-numeric:tabular-nums;color:#fff8ef;background:var(--accent)}.pinned-header{flex-shrink:0;height:22px;display:flex;align-items:center;justify-content:flex-end;padding:0 4px;background:var(--bg-1);border-bottom:1px solid var(--border)}.pinned-collapse-btn{padding:0 6px;height:18px;line-height:1;font-size:13px;color:var(--fg-2-text);background:transparent;border:1px solid transparent;border-radius:5px;box-shadow:none}.pinned-collapse-btn:hover{color:var(--accent);border-color:var(--accent-dim);background:var(--bg-3)}.tabbar{display:flex;height:28px;background:var(--bg-3);border-bottom:1px solid var(--border-strong);align-items:stretch}.tabbar .tab{padding:0 14px;display:flex;align-items:center;cursor:pointer;color:var(--fg-1);border-right:1px solid var(--border);font-size:12px}.tabbar .tab.active{background:var(--bg-1);color:var(--fg-0);border-bottom:2px solid var(--accent)}.tabbar .tab:hover{color:var(--fg-0)}.tabbar .tab{gap:6px}.section-title{padding:6px 8px;font-family:var(--serif);font-size:12px;color:var(--fg-1);letter-spacing:.5px;border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:flex-start;gap:6px}.section-title:before{content:"";display:inline-block;width:4px;height:11px;flex-shrink:0;border-radius:2px;background:var(--accent)}.section-title .section-action{margin-left:auto}.section-title .section-action{font-size:10px;padding:0 6px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;letter-spacing:0}.empty-hint{color:var(--fg-2-text);padding:16px;font-size:12px;text-align:center}.react-flow{background:transparent;position:relative;z-index:1}.react-flow__controls{background:var(--bg-2);border:1px solid var(--border-strong);border-radius:8px;overflow:hidden;box-shadow:var(--paper-shadow)}.react-flow__controls-button{background:var(--bg-2);color:var(--fg-0);border-color:var(--border)}.react-flow__controls-button:hover{background:var(--bg-3)}.react-flow__controls-button svg{fill:var(--fg-1)}.react-flow__minimap{background:var(--bg-1)!important;border:1px solid var(--border-strong);border-radius:8px;box-shadow:var(--paper-shadow)}.react-flow__minimap-mask{fill:var(--minimap-mask)!important}.react-flow__minimap-node{fill:var(--minimap-node)!important;stroke:var(--minimap-node-stroke)!important}.react-flow__background circle{fill:var(--canvas-dots)!important}.react-flow__attribution{display:none}.reactflow-wrapper{width:100%;height:100%;min-width:0;min-height:0;position:relative;background:var(--canvas-bg)}.canvas-welcome{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;pointer-events:none;-webkit-user-select:none;user-select:none;opacity:.85}.canvas-welcome .cw-title{font-family:var(--serif);font-size:18px;font-weight:700;letter-spacing:2px;color:var(--fg-1)}.canvas-welcome .cw-rows{display:flex;flex-direction:column;align-items:center;gap:4px;font-size:12px;color:var(--fg-2-text)}.canvas-welcome .cw-rows strong{color:var(--accent);font-weight:600}.node-card{position:relative;width:130px;background:var(--bg-2);border:1px solid var(--border-strong);border-radius:7px;font-size:10px;box-sizing:border-box;-webkit-user-select:none;user-select:none;box-shadow:var(--paper-shadow);transition:box-shadow .12s ease,border-color .12s ease;cursor:grab}.node-card>.header,.node-card>.body{position:relative;z-index:1}.node-card:active,.react-flow__node.dragging .node-card{cursor:grabbing}.node-card:hover{border-color:var(--fg-2);box-shadow:var(--paper-shadow-lift)}.node-card.selected{border-color:var(--accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 30%,transparent),var(--paper-shadow-lift)}.node-card.state-running{border-color:var(--running);animation:paper-pulse 1.6s ease-in-out infinite}@keyframes paper-pulse{0%,to{box-shadow:0 0 0 1px color-mix(in srgb,var(--running) 25%,transparent),var(--paper-shadow)}50%{box-shadow:0 0 0 3px color-mix(in srgb,var(--running) 35%,transparent),var(--paper-shadow)}}.node-card.state-ok{box-shadow:inset 3px 0 0 var(--ok),var(--paper-shadow)}.node-card.state-failed{border-color:var(--err);box-shadow:inset 3px 0 0 var(--err),0 0 0 1px color-mix(in srgb,var(--err) 30%,transparent),var(--paper-shadow)}.node-card.state-compile_error{border-color:var(--warn)}.node-card.state-stale{filter:saturate(.6) opacity(.92);outline:1.5px dashed color-mix(in srgb,var(--warn) 70%,transparent);outline-offset:2px}.node-card.state-upstream_failed{opacity:.6;border-color:color-mix(in srgb,var(--err) 55%,var(--border-strong))}.node-card.disabled{opacity:.45}.node-card .freshness-tag{position:absolute;top:-9px;right:8px;z-index:3;padding:1px 6px;font-size:9px;line-height:1.4;letter-spacing:.3px;white-space:nowrap;border-radius:6px;border:1px solid transparent;pointer-events:none;background:var(--bg-2)}.node-card .freshness-tag.stale{color:#7c5407;background:#f8ecd2;border-color:color-mix(in srgb,var(--warn) 55%,transparent)}.node-card .freshness-tag.running{color:#7c5407;background:#f8ecd2;border-color:var(--running)}.node-card .freshness-tag.ok{color:#3c5526;background:#e7eed9;border-color:color-mix(in srgb,var(--ok) 55%,transparent);animation:fresh-fade 1.6s ease-out forwards}@keyframes fresh-fade{0%{opacity:0;transform:translateY(3px)}18%{opacity:1;transform:translateY(0)}72%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-1px)}}.node-card .header{position:relative;height:18px;background:var(--node-header);border-bottom:1px solid var(--border);border-radius:6px 6px 0 0;display:flex;align-items:center;padding:0 6px;gap:4px}.node-card .header .badge{width:6px;height:6px;border-radius:50%;flex-shrink:0}.node-card .header .title{flex:1;font-weight:600;letter-spacing:.2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.node-card .header .kind{font-family:var(--mono);font-size:8px;color:var(--fg-2-text);letter-spacing:.2px}.node-card .header .collapse-btn{width:12px;height:12px;flex-shrink:0;padding:0;display:inline-flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:4px;color:var(--fg-2-text);font-size:8px;line-height:1;cursor:pointer;box-shadow:none}.node-card .header .collapse-btn:hover{color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent)}.node-card.collapsed-node .header{border-radius:6px;border-bottom-color:transparent}.node-card .body{padding:3px 0;display:flex;flex-direction:column}.pin-row{height:var(--row-h);display:flex;align-items:center;padding:0 6px;position:relative;gap:4px}.pin-row.in{justify-content:flex-start}.pin-row.out{justify-content:flex-end}.pin-row .label{font-size:10px;color:var(--fg-1)}.pin-row .pin-type{font-family:var(--mono);font-size:8px;letter-spacing:.2px;line-height:1;min-width:0;max-width:64px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pin-dot{width:var(--pin-radius);height:var(--pin-radius);border-radius:50%;background:var(--pin-dot-fill);position:absolute;top:50%;pointer-events:none;z-index:1;box-shadow:0 0 0 2px var(--bg-2)}.pin-dot.in{left:0;transform:translate(-50%,-50%)}.pin-dot.out{right:0;transform:translate(50%,-50%)}.inline-preview{border-top:1px dashed var(--border);padding:3px 6px;color:var(--fg-1);font-family:var(--mono);font-size:9px;font-variant-numeric:tabular-nums;max-height:44px;overflow:hidden}.inline-preview:before{content:"▸";color:var(--accent)}.group-proxy{position:relative;width:172px;box-sizing:border-box;padding:8px 10px 9px;background:var(--bg-3);border:1px solid color-mix(in srgb,var(--accent-2) 45%,var(--border-strong));border-radius:9px;box-shadow:var(--paper-shadow);color:var(--fg-0);-webkit-user-select:none;user-select:none;cursor:grab}.group-proxy:active{cursor:grabbing}.group-proxy.selected{border-color:var(--accent-2);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent-2) 30%,transparent),var(--paper-shadow-lift)}.group-proxy .gp-head{display:flex;align-items:center;gap:6px;min-width:0}.group-proxy .gp-glyph{color:var(--accent-2);font-size:12px;line-height:1;flex-shrink:0}.group-proxy .gp-title{flex:1;min-width:0;font-weight:600;font-size:12px;letter-spacing:.2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.group-proxy .gp-sub{margin-top:3px;font-family:var(--mono);font-size:9px;letter-spacing:.3px;color:var(--fg-2-text)}.group-proxy .gp-actions{display:flex;gap:6px;margin-top:8px}.group-proxy .gp-btn{flex:1;height:18px;padding:0 6px;font-size:10px;line-height:1;color:var(--fg-1);background:var(--bg-2);border:1px solid color-mix(in srgb,var(--accent-2) 30%,var(--border-strong));border-radius:5px;cursor:pointer;box-shadow:none;transition:color .12s,background .12s,border-color .12s}.group-proxy .gp-btn:hover{color:var(--accent-2);background:color-mix(in srgb,var(--accent-2) 10%,var(--bg-2));border-color:var(--accent-2)}.group-proxy .react-flow__handle{opacity:1;width:9px;height:9px;border-radius:50%;background:color-mix(in srgb,var(--accent-2) 70%,transparent);box-shadow:0 0 0 2px var(--bg-2)}.react-flow__node.rf-group-frame{pointer-events:none}.group-frame{position:relative;box-sizing:border-box;border:1.5px dashed color-mix(in srgb,var(--accent-2) 50%,transparent);border-radius:10px;background:color-mix(in srgb,var(--accent-2) 5%,transparent);pointer-events:none}.group-frame .gf-bar{position:absolute;top:-1px;left:-1px;display:inline-flex;align-items:center;gap:6px;height:20px;padding:0 8px;background:color-mix(in srgb,var(--bg-1) 90%,var(--accent-2));border:1px solid color-mix(in srgb,var(--accent-2) 40%,var(--border-strong));border-radius:9px 9px 9px 0;color:var(--fg-1);font-size:11px;pointer-events:auto;max-width:calc(100% + 2px)}.group-frame .gf-glyph{color:var(--accent-2);font-size:11px;line-height:1;flex-shrink:0}.group-frame .gf-title{font-weight:600;letter-spacing:.2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:160px}.group-frame .gf-btn{height:15px;padding:0 6px;font-size:9px;line-height:1;color:var(--fg-2-text);background:transparent;border:1px solid color-mix(in srgb,var(--accent-2) 30%,var(--border-strong));border-radius:4px;cursor:pointer;flex-shrink:0;box-shadow:none;transition:color .12s,background .12s,border-color .12s}.group-frame .gf-btn:hover{color:var(--accent-2);background:color-mix(in srgb,var(--accent-2) 12%,transparent);border-color:var(--accent-2)}.react-flow__handle{width:14px;height:14px;background:transparent;border:none;opacity:0;border-radius:50%;z-index:2}.react-flow__handle.connecting,.react-flow__handle.connectingfrom,.react-flow__handle.connectingto,.react-flow__handle:hover{opacity:1;background:color-mix(in srgb,var(--accent) 50%,transparent)}.react-flow__handle-connecting{background:color-mix(in srgb,var(--accent) 50%,transparent)}.reactflow-wrapper.connecting .react-flow__handle{opacity:1;border-radius:50%;background:var(--handle-glow);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 35%,transparent)}.reactflow-wrapper.connecting .react-flow__handle:hover,.reactflow-wrapper.connecting .react-flow__handle.valid{background:color-mix(in srgb,var(--ok) 55%,transparent);box-shadow:0 0 0 2px color-mix(in srgb,var(--ok) 75%,transparent)}.react-flow__node:hover .react-flow__handle{opacity:.5}.react-flow__edge-path{stroke:color-mix(in srgb,var(--edge-color, var(--edge-stroke)) 55%,var(--edge-stroke));stroke-width:1.75;stroke-linecap:round}.react-flow__edge:hover .react-flow__edge-path{stroke:var(--accent);stroke-width:2.5;stroke-dasharray:5 9;animation:edge-flow 3s linear infinite}.react-flow__edge.selected .react-flow__edge-path{stroke:var(--accent)!important;stroke-width:3!important;stroke-dasharray:5 9;animation:edge-flow 1.2s linear infinite}@keyframes edge-flow{to{stroke-dashoffset:-28}}.node-card.probe .header{background:linear-gradient(90deg,var(--node-header) 0%,var(--probe-accent) 100%)}@media(prefers-reduced-motion:reduce){.node-card.state-running,.react-flow__edge-path,.node-card .freshness-tag.ok{animation:none!important}}.ctx-menu{position:fixed;z-index:100;width:336px;background:var(--bg-2);border:1px solid var(--border-strong);border-radius:10px;box-shadow:var(--paper-shadow-lift);display:flex;flex-direction:column;overflow:hidden}.ctx-menu .ctx-search{width:100%;border:none;border-bottom:1px solid var(--border);border-radius:0;background:transparent;color:var(--fg-0);font-size:13px;padding:9px 12px;box-shadow:none}.ctx-menu .ctx-search::placeholder{color:var(--fg-2-text)}.ctx-menu .ctx-search:focus{border-bottom-color:var(--accent);box-shadow:none}.ctx-menu .ctx-list{max-height:420px;overflow:auto;padding:4px 5px 6px}.ctx-menu .ctx-cat{display:flex;align-items:center;gap:6px;padding:9px 9px 7px;font-family:var(--serif);font-size:12.5px;color:var(--fg-1);letter-spacing:.5px;border-radius:6px;cursor:pointer;-webkit-user-select:none;user-select:none}.ctx-menu .ctx-cat:hover{background:var(--bg-3);color:var(--fg-0)}.ctx-menu .ctx-cat:before{content:"";flex-shrink:0;width:3px;height:10px;border-radius:2px;background:var(--accent)}.ctx-menu .ctx-caret{flex-shrink:0;width:11px;text-align:center;font-size:10px;color:var(--fg-2-text)}.ctx-menu .ctx-cat.expanded .ctx-caret{color:var(--accent)}.ctx-menu .ctx-count{margin-left:auto;font-family:var(--mono);font-size:11px;color:var(--fg-2-text);opacity:.7}.ctx-menu .ctx-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:3px;padding:1px 1px 5px}.ctx-menu .ctx-item{display:flex;flex-direction:column;align-items:center;gap:4px;padding:8px 3px 7px;border:1px solid transparent;border-radius:8px;cursor:pointer;color:var(--fg-1);-webkit-user-select:none;user-select:none}.ctx-menu .ctx-item:hover{background:var(--bg-3);color:var(--fg-0);border-color:var(--border)}.ctx-menu .ctx-item.active{background:var(--bg-3);color:var(--fg-0);border-color:color-mix(in srgb,var(--accent) 65%,var(--border))}.ctx-menu .ctx-ico{width:30px;height:30px;display:grid;place-items:center;border-radius:8px;background:color-mix(in srgb,currentColor 9%,transparent)}.ctx-menu .ctx-ico svg{display:block}.ctx-menu .ctx-name{font-size:12px;line-height:1.32;text-align:center;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-all}.ctx-empty{padding:14px 10px;text-align:center;color:var(--fg-2-text);font-size:11px}.inspector{display:flex;flex-direction:column;height:100%}.inspector .disabled-toggle{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--fg-1);cursor:pointer}.inspector .disabled-toggle input{margin:0}.inspector .intro-card{padding:8px 10px;background:var(--bg-2);border:1px solid var(--border);border-radius:8px;color:var(--fg-1);font-size:11px;line-height:1.5;box-shadow:0 1px 2px #493c260f}.inspector .intro-card .intro-title{color:var(--fg-0);font-weight:600}.intro-io{margin-top:7px;display:flex;flex-direction:column;gap:6px}.intro-io-group{display:flex;flex-direction:column;gap:2px}.intro-io-label{font-family:var(--serif);font-size:10px;color:var(--fg-2-text);letter-spacing:.6px}.intro-port{display:flex;align-items:center;gap:6px;font-size:11px;line-height:1.4}.intro-port .dot{flex-shrink:0;width:6px;height:6px;border-radius:50%}.intro-port .pname{color:var(--fg-1)}.intro-port .ptype{font-family:var(--mono);color:var(--fg-2-text);letter-spacing:.2px}.inspector .panel-body{flex:1;overflow:auto;padding:8px}.row{display:flex;align-items:center;gap:8px;margin-bottom:6px}.row .label{width:100px;color:var(--fg-1);font-size:11px;flex-shrink:0}.row .field{flex:1;min-width:0}.row .field.bound-field{display:flex;align-items:center;gap:6px}.row .field input,.row .field select,.row .field textarea{width:100%}.row .field .wav-upload{position:relative;display:flex;gap:4px;align-items:center}.wav-upload .wav-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px;color:var(--fg-1)}.wav-upload button{padding:2px 8px;white-space:nowrap;flex-shrink:0}.wav-upload button:disabled{opacity:.6;cursor:default}.wav-mine-popup{position:absolute;top:calc(100% + 2px);right:0;background:var(--bg-2);border:1px solid var(--border-strong);border-radius:8px;box-shadow:var(--paper-shadow-lift);min-width:200px;max-height:240px;overflow:auto;z-index:50}.wav-mine-empty{padding:6px 8px;font-size:11px;color:var(--fg-2-text)}.wav-mine-item{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:4px 8px;font-size:11px;cursor:pointer}.wav-mine-item:hover{background:var(--bg-3)}.wav-mine-item .wav-mine-fn{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--fg-0)}.wav-mine-item .wav-mine-sz{color:var(--fg-2-text);font-size:10px;flex-shrink:0}.bind-tag{display:inline-block;padding:1px 6px;background:color-mix(in srgb,var(--accent) 12%,transparent);color:var(--accent);border:1px solid color-mix(in srgb,var(--accent) 40%,transparent);border-radius:6px;font-family:var(--mono);font-size:11px}.bind-clear{padding:0 6px;background:transparent;border:1px solid var(--border-strong);color:var(--fg-2-text);box-shadow:none}.bind-clear:hover{color:var(--err);border-color:var(--err)}.bind-menu-wrap{position:relative;flex-shrink:0}.bind-menu-btn{padding:2px 8px;font-weight:600;color:var(--accent);background:var(--bg-2);border:1px solid var(--border-strong)}.bind-menu-btn:hover{background:var(--bg-3);border-color:var(--accent)}.bind-menu-popup{position:absolute;top:calc(100% + 2px);right:0;background:var(--bg-2);border:1px solid var(--border-strong);border-radius:8px;box-shadow:var(--paper-shadow-lift);min-width:160px;max-height:240px;overflow:auto;z-index:50}.bind-menu-item{display:flex;justify-content:space-between;align-items:center;padding:4px 8px;font-size:11px;cursor:pointer}.bind-menu-item:hover{background:var(--bg-3)}.bind-menu-item .vn{font-family:var(--mono);color:var(--accent)}.bind-menu-item .vt{color:var(--fg-2-text);font-size:10px}.preview-pane{flex:1;display:flex;flex-direction:column;height:100%;min-height:0}.scalar-big{font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:36px;color:var(--accent);text-align:center;padding:30px}.preview-empty{color:var(--fg-2-text);text-align:center;padding:30px}.plot-container{position:relative;width:100%;height:100%;min-height:120px;overflow:hidden}.spectrogram-canvas{background:var(--spectro-bg);display:block}.spectro-view{display:flex;flex-direction:column}.spectro-grid{display:grid;width:100%}.spectro-faxis{display:flex;flex-direction:column;justify-content:space-between;align-items:flex-end;padding-right:4px;box-sizing:border-box}.spectro-taxis{display:flex;justify-content:space-between;padding:2px 2px 0;box-sizing:border-box}.spectro-tick{font-size:9px;color:var(--fg-2-text);line-height:1;font-family:var(--mono)}.spectro-plot{position:relative;width:100%}.spectro-overlay{position:absolute;top:0;right:0;bottom:0;left:0;cursor:crosshair}.spectro-selrect{position:absolute;border:1.5px solid var(--accent-2);background:color-mix(in srgb,var(--accent-2) 18%,transparent);pointer-events:none}.spectro-bar{display:flex;align-items:center;gap:6px;padding:4px 6px;font-size:11px;color:var(--fg-1)}.spectro-readout{font-family:var(--mono);color:var(--fg-0)}.spectro-hint{color:var(--fg-2-text)}.audio-controls{display:flex;align-items:center;gap:6px;padding:4px 6px}.audio-btn{padding:2px 10px;font-size:11px;cursor:pointer;background:var(--bg-2);color:var(--accent-2);border:1px solid var(--border-strong);border-radius:7px}.audio-btn:hover{background:var(--bg-3)}.audio-btn:disabled{color:var(--fg-2-text);cursor:default;opacity:.6}.audio-btn.ghost{color:var(--fg-2-text)}.audio-ch{font-size:11px;background:var(--bg-2);color:var(--fg-1);border:1px solid var(--border-strong);border-radius:6px;padding:1px 4px}.preview-pin-tabs{flex:0 0 auto}.preview-pin-block{border-bottom:1px solid var(--border);padding:8px}.preview-pin-head{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--fg-1);margin-bottom:4px}.preview-pin-head .ppin-pin{color:var(--fg-0);font-family:var(--mono)}.preview-pin-head .ppin-meta{color:var(--fg-2-text)}.preview-summary{color:var(--fg-2-text);font-size:10px;margin-bottom:6px;font-family:var(--mono)}.pin-toggle{padding:2px 8px;font-size:11px}.pin-toggle.active{color:var(--warn);border-color:var(--warn)}.pinned-list{display:flex;flex-direction:column;height:100%;overflow:auto;padding:4px;gap:4px}.pinned-slot{background:var(--bg-2);border:1px solid var(--border);border-radius:8px;box-shadow:0 1px 2px #493c260f}.pinned-slot .head{display:flex;align-items:center;padding:4px 6px;border-bottom:1px solid var(--border);font-size:11px;color:var(--fg-1);gap:6px}.pinned-slot .head .title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-slot .head .title:hover{color:var(--accent)}.pinned-slot .head .pin-label{color:var(--fg-2-text)}.pinned-slot .head .pin-close{padding:0 6px;color:var(--fg-2-text);background:transparent;border:none;font-size:14px;line-height:1;box-shadow:none}.pinned-slot .head .pin-close:hover{color:var(--err)}.pinned-summary{padding:2px 6px;color:var(--fg-2-text);font-size:10px;font-family:var(--mono);border-bottom:1px dashed var(--border)}.variables-panel{padding:8px;display:flex;flex-direction:column;gap:8px;height:100%;overflow:hidden}.variables-panel .vp-toolbar{display:flex;gap:6px}.variables-panel .vp-table-wrap{flex:1;overflow:auto}.variables-panel .vp-table{width:100%}.variables-panel .vp-type{display:inline-block;padding:0 6px;background:var(--bg-3);border:1px solid var(--border);border-radius:6px;font-size:10px;color:var(--fg-1)}.variables-panel .vp-del{padding:0 6px;color:var(--fg-2-text)}.variables-panel .vp-del:hover{color:var(--err);border-color:var(--err)}.drawer-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#3f342047;z-index:999}.vars-drawer{position:fixed;top:0;right:0;bottom:0;z-index:1000;width:460px;max-width:92vw;background:var(--bg-1);border-left:1px solid var(--border-strong);box-shadow:-10px 0 30px #493c2638;display:flex;flex-direction:column;animation:drawer-in .18s ease-out}@keyframes drawer-in{0%{transform:translate(100%)}to{transform:translate(0)}}.vars-drawer .drawer-head{padding:10px 14px;border-bottom:1px solid var(--border-strong);font-weight:600;font-family:var(--serif);display:flex;align-items:center;justify-content:space-between}.vars-drawer .drawer-close{width:24px;height:24px;line-height:1;font-size:18px;cursor:pointer;color:var(--fg-2-text);background:transparent;border:1px solid transparent;border-radius:6px;box-shadow:none}.vars-drawer .drawer-close:hover{color:var(--err);border-color:var(--err)}.vars-drawer .drawer-body{flex:1;min-height:0;display:flex}.vars-drawer .drawer-body .variables-panel{flex:1}.label-edit{font:inherit;color:var(--fg-0);background:#fffefa;border:1px solid var(--accent);border-radius:5px;padding:0 4px;margin:0;width:auto;min-width:56px;max-width:220px;outline:none}.panel-head{flex:0 0 auto;height:22px;display:flex;align-items:center;gap:5px;padding:0 10px;font-size:11px;font-weight:600;letter-spacing:.3px;border-bottom:1px solid var(--border);background:var(--bg-1);color:var(--fg-1);-webkit-user-select:none;user-select:none}.panel-head .panel-head-ico{font-size:12px}.panel-head-tune{color:var(--accent)}.panel-head-scope{color:var(--accent-2)}.scope-tabs{display:inline-flex;gap:2px;margin-left:2px}.scope-tabs button{padding:0 8px;height:18px;font-size:11px;line-height:18px;background:transparent;border:1px solid transparent;color:var(--fg-2-text);border-radius:6px;box-shadow:none}.scope-tabs button:hover{color:var(--fg-0);background:var(--bg-3)}.scope-tabs button.active{color:var(--accent-2);border-color:var(--border-strong);background:var(--bg-2)}.source-view{display:flex;flex-direction:column;height:100%;min-height:0}.source-tabs{flex:0 0 auto;display:flex;align-items:center;gap:4px;padding:4px 8px;border-bottom:1px solid var(--border)}.source-tabs button{padding:2px 8px;font-size:11px;background:transparent;border:1px solid transparent;color:var(--fg-2-text);border-radius:6px;box-shadow:none}.source-tabs button:hover{color:var(--fg-0);background:var(--bg-3)}.source-tabs button.active{color:var(--accent);border-color:var(--border-strong);background:var(--bg-2)}.source-tabs .source-copy{color:var(--fg-1)}.source-code{flex:1;min-height:0;overflow:auto;margin:0;padding:10px 12px;font-family:var(--mono);font-size:12px;line-height:1.5;color:var(--fg-0);background:#fffefa;white-space:pre;-moz-tab-size:4;tab-size:4}.align-bar{position:absolute;top:10px;left:50%;transform:translate(-50%);z-index:8;display:flex;align-items:center;gap:3px;padding:4px 8px;background:var(--bg-2);border:1px solid var(--border-strong);border-radius:10px;box-shadow:var(--paper-shadow-lift)}.align-bar-count{font-size:11px;color:var(--fg-2-text);margin-right:4px}.align-bar button{width:26px;height:24px;padding:0;font-size:14px;line-height:1;background:var(--bg-2);border:1px solid var(--border);color:var(--fg-1);border-radius:6px;box-shadow:none}.align-bar button:hover{color:var(--accent);border-color:var(--accent-dim);background:var(--bg-3)}.align-bar-sep{width:1px;height:18px;background:var(--border-strong);margin:0 2px}.app .status{font-family:var(--mono);letter-spacing:.2px;font-variant-numeric:tabular-nums}.status .pill{display:inline-flex;align-items:center;padding:0 6px;height:18px;border-radius:9px;background:var(--bg-2);border:1px solid var(--border);font-size:11px;color:var(--fg-1);gap:4px}.status .pill .dot{width:6px;height:6px;border-radius:50%}.status .pill .dot.ok{background:var(--ok);color:var(--ok)}.status .pill .dot.run{background:var(--running);color:var(--running)}.status .pill .dot.fail{background:var(--err);color:var(--err)}.status .pill .dot.stale{background:var(--warn);color:var(--warn)}.status .sb-progress{display:inline-block;width:84px;height:5px;background:color-mix(in srgb,var(--fg-2) 20%,transparent);border:1px solid var(--border-strong);border-radius:3px;overflow:hidden;vertical-align:middle}.status .sb-progress .sb-progress-fill{display:block;height:100%;background:linear-gradient(90deg,var(--running),var(--ok));transition:width .3s ease}.dialog-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#3f342052;z-index:1000;display:flex;align-items:center;justify-content:center}.dialog{background:var(--bg-1);border:1px solid var(--border-strong);border-radius:12px;box-shadow:var(--paper-shadow-lift);min-width:480px;max-width:90vw;max-height:80vh;overflow:auto;display:flex;flex-direction:column}.dialog .head{padding:10px 14px;border-bottom:1px solid var(--border-strong);font-weight:600;font-family:var(--serif)}.dialog .body{padding:12px 14px;flex:1;overflow:auto}.dialog .foot{padding:10px 14px;border-top:1px solid var(--border);display:flex;gap:8px;justify-content:flex-end}.tab-search{position:absolute;top:30%;left:50%;transform:translate(-50%);width:480px;max-width:92vw;background:var(--bg-2);border:1px solid var(--border-strong);border-radius:12px;box-shadow:var(--paper-shadow-lift);z-index:100;overflow:hidden}.tab-search input{width:100%;padding:10px;border:none;border-bottom:1px solid var(--border);background:transparent;font-size:14px;box-shadow:none;border-radius:0}.tab-search .results{max-height:360px;overflow:auto}.tab-search .item{padding:6px 12px;cursor:pointer;display:flex;gap:8px;align-items:baseline}.tab-search .item.active{background:var(--bg-3);box-shadow:inset 2px 0 0 var(--accent)}.tab-search .item .label{color:var(--fg-0)}.tab-search .item .cat{color:var(--fg-2-text);font-size:10px}table.simple{width:100%;border-collapse:collapse;font-size:11px}table.simple th,table.simple td{padding:4px 6px;border-bottom:1px solid var(--border);text-align:left}table.simple th{color:var(--fg-2-text);background:var(--bg-3);font-weight:600}table.simple tr.pass td{color:var(--ok)}table.simple tr.fail td{color:var(--err)}.toasts{position:fixed;right:16px;bottom:40px;display:flex;flex-direction:column;gap:8px;z-index:2000;max-width:420px}.toast{padding:8px 12px;border-radius:9px;font-size:12px;color:var(--fg-0);background:var(--bg-2);border:1px solid var(--border-strong);box-shadow:var(--paper-shadow-lift);cursor:pointer;white-space:pre-wrap;word-break:break-word}.toast-error{border-left:3px solid var(--err)}.toast-success{border-left:3px solid var(--ok)}.toast-info{border-left:3px solid var(--accent)}.error-boundary{padding:16px;color:var(--err);font-size:12px;display:flex;flex-direction:column;gap:8px}.error-boundary .eb-msg{color:var(--fg-2-text);word-break:break-word}.error-boundary button{align-self:flex-start}
