.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #555;--xy-background-pattern-lines-color-default: #333;--xy-background-pattern-cross-color-default: #333;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1;touch-action:none}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}/**
 * Copyright (c) 2014 The xterm.js authors. All rights reserved.
 * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
 * https://github.com/chjj/term.js
 * @license MIT
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *
 * Originally forked from (with the author's permission):
 *   Fabrice Bellard's javascript vt100 for jslinux:
 *   http://bellard.org/jslinux/
 *   Copyright (c) 2011 Fabrice Bellard
 *   The original design remains. The terminal itself
 *   has been extended to include xterm CSI codes, among
 *   other features.
 */.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.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{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{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;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}:root{--canvas: #E7ECF1;--grid: #C3CDD6;--panel: #FFFFFF;--panel-2: #F3F6F8;--panel-3: #E9EEF2;--input: #FFFFFF;--ink: #1C2A39;--muted: #5A6A7A;--line: #D3DBE2;--line-2: #E6EBEF;--accent: #1F5FA8;--accent-ink: #fff;--accent-soft: rgba(31,95,168,.1);--copper: #2F3A44;--fibre: #E07B12;--serial: #B23A6B;--ok: #2E9E5B;--bad: #C8443A;--warn: #C98A10;--idle: #A3AFBA;--t1: #2E9E5B;--t2: #C9A20E;--t3: #E07B12;--t4: #D0362B;--c-rx: #1F7FD1;--c-tx: #8C4FD6;--icon-body: #DCE7F2;--icon-line: #2E4A66;--icon-mark: #1F5FA8;--icon-screen: #9EC3E6;--term: #14202B;--term-ink: #DCE6EE;--shadow: 0 12px 34px rgba(28,42,57,.2);--shadow-s: 0 2px 8px rgba(28,42,57,.1);--minimap-mask: rgba(228,233,238,.6);--label-bg: rgba(255,255,255,.88);--font: "IBM Plex Sans", system-ui, sans-serif;--mono: "IBM Plex Mono", ui-monospace, monospace;color-scheme:light}:root[data-theme=dark]{--canvas: #0E151C;--grid: #223040;--panel: #151F29;--panel-2: #111A23;--panel-3: #1B2733;--input: #0F1821;--ink: #E2EAF2;--muted: #8FA1B3;--line: #2A3947;--line-2: #1F2B37;--accent: #5B9BE6;--accent-ink: #08121C;--accent-soft: rgba(91,155,230,.14);--copper: #A9B8C6;--fibre: #F0943A;--serial: #E0709C;--ok: #3DBA70;--bad: #EF6A5F;--warn: #E5B23A;--idle: #5C6E80;--t1: #3DBA70;--t2: #E5C23A;--t3: #F0943A;--t4: #F25C50;--c-rx: #4DA3F0;--c-tx: #B183F0;--icon-body: #23384D;--icon-line: #A9C3DC;--icon-mark: #6FB0F5;--icon-screen: #2F5578;--term: #0A1118;--shadow: 0 14px 40px rgba(0,0,0,.55);--shadow-s: 0 2px 10px rgba(0,0,0,.4);--minimap-mask: rgba(14,21,28,.65);--label-bg: rgba(21,31,41,.9);color-scheme:dark}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{font:14px/1.45 var(--font);color:var(--ink);background:var(--canvas)}button,input,select,textarea{font:inherit;color:inherit}button,a.btn{background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:5px 10px;cursor:pointer;color:var(--ink);text-decoration:none;display:inline-flex;align-items:center;gap:6px}button:hover:not(:disabled),a.btn:hover{border-color:var(--accent)}button:disabled{opacity:.45;cursor:default}button.primary{background:var(--accent);color:var(--accent-ink);border-color:var(--accent)}button.big{padding:9px 16px;font-size:15px}button.danger,.danger{color:var(--bad)}button.link{border:0;background:none;color:var(--accent);padding:2px 4px}button.link.danger{color:var(--bad)}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}input,select,textarea{border:1px solid var(--line);border-radius:6px;padding:4px 8px;background:var(--input);min-width:0}textarea{font-family:var(--mono);font-size:12.5px;width:100%;resize:vertical}kbd{font:11px var(--mono);padding:1px 5px;border:1px solid var(--line);border-bottom-width:2px;border-radius:4px;background:var(--panel-2);color:var(--muted)}.mono{font-family:var(--mono);font-size:12.5px}.hint{color:var(--muted);font-size:12.5px;margin:6px 0}.error{color:var(--bad)}.empty{color:var(--muted);padding:18px;text-align:center}.row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:6px 0}.row.between{justify-content:space-between}.nowrap{flex-wrap:nowrap;white-space:nowrap}.col{display:flex;flex-direction:column;gap:4px;margin:6px 0}.chk{display:inline-flex;align-items:center;gap:5px;white-space:nowrap}.narrow{width:70px}.grow{flex:1}.ico{flex:none}.icon-btn{border:0;background:none;padding:4px;color:var(--muted)}.icon-btn:hover{color:var(--ink)}.warn-t{color:var(--warn)}.bad-t{color:var(--bad)}.sw{display:inline-block;width:10px;height:8px;margin-right:5px;border-radius:2px}.app{display:grid;height:100%;grid-template-columns:116px 1fr;grid-template-rows:50px 1fr 28px;grid-template-areas:"top top" "pal canvas" "status status"}.app-side{grid-template-columns:116px 1fr 480px;grid-template-areas:"top top top" "pal canvas side" "status status status"}.top{grid-area:top;display:flex;align-items:center;gap:4px;padding:0 10px;background:var(--panel);border-bottom:1px solid var(--line);overflow-x:auto;scrollbar-width:thin}.brand{display:flex;align-items:center;gap:7px;font-weight:600;letter-spacing:-.01em;margin-right:8px;color:var(--ink);font-size:16px}.brand svg{fill:var(--accent);stroke:var(--accent);stroke-width:1.8}.labsel{max-width:200px;margin-right:2px}.sep{width:1px;height:24px;background:var(--line);margin:0 5px;flex:none}.tb{border:1px solid transparent;background:none;padding:6px 7px;border-radius:7px;color:var(--ink);flex:none}.tb:hover:not(:disabled){background:var(--panel-3);border-color:transparent}.tb.on{background:var(--accent-soft);color:var(--accent)}.tb-primary{background:var(--accent);color:var(--accent-ink);padding:6px 12px}.tb-primary:hover:not(:disabled){background:var(--accent);filter:brightness(1.08)}.tb-text{font-weight:500}.save-state{color:var(--muted);font-size:12.5px;margin-right:6px;white-space:nowrap}.save-state.saving{color:var(--warn)}.mode{display:inline-flex;border:1px solid var(--line);border-radius:7px;overflow:hidden;flex:none;margin:0 4px}.mode button{border:0;border-radius:0;padding:5px 12px;background:var(--panel)}.mode button.on{background:var(--ink);color:var(--panel)}.palette{grid-area:pal;background:var(--panel-2);border-right:1px solid var(--line);padding:8px;overflow-y:auto}.palette h3{font-size:11px;font-weight:600;color:var(--muted);margin:10px 2px 6px;text-transform:uppercase;letter-spacing:.06em}.pal{position:relative;display:flex;flex-direction:column;align-items:center;gap:2px;width:100%;padding:6px 2px;margin-bottom:6px;background:var(--panel);font-size:12.5px;border-radius:8px;transition:transform .12s,box-shadow .12s}.pal:hover:not(:disabled){transform:translateY(-1px);box-shadow:var(--shadow-s)}.pal-k{position:absolute;top:4px;right:4px;font-size:9.5px;padding:0 4px}.pal.tool{flex-direction:row;justify-content:flex-start;gap:6px;padding:6px}.pal.tool.on{border-color:var(--accent);box-shadow:inset 3px 0 0 var(--accent)}.tool-copper{color:var(--copper)}.tool-fibre{color:var(--fibre)}.tool-serial{color:var(--serial)}.arrow{width:28px;text-align:center;font-size:18px}.canvas{grid-area:canvas;position:relative;overflow:hidden}.react-flow__pane{cursor:default}.dev{position:relative;display:flex;flex-direction:column;align-items:center;width:76px;padding:4px 0;border-radius:10px;transition:background .2s,box-shadow .2s}.dev-icon{transition:transform .2s,filter .3s}.dev:hover .dev-icon{transform:translateY(-1px)}.dev-label{display:inline-flex;align-items:center;gap:4px;font-size:12.5px;font-weight:500;background:var(--label-bg);padding:0 6px;border-radius:4px;margin-top:-2px;white-space:nowrap}.dev-dot{width:7px;height:7px;border-radius:50%;background:var(--idle)}.dev-off svg{filter:saturate(.35);opacity:.8}.dev-running .dev-dot{background:var(--ok);box-shadow:0 0 0 3px #2e9e5b2e}.dev-running .dev-icon{filter:drop-shadow(0 3px 6px rgba(46,158,91,.2))}.dev-paused .dev-dot{background:var(--warn)}.dev-exited .dev-dot{background:var(--bad)}.dev-sel{background:var(--accent-soft);box-shadow:0 0 0 1.5px var(--accent)}.dev-pick{background:#e07b122e;outline:2px dashed var(--fibre)}.dev-hit{animation:hit 1.6s ease-out}@keyframes hit{0%{box-shadow:0 0 0 0 var(--accent)}40%{box-shadow:0 0 0 14px #1f5fa800}to{box-shadow:none}}.dev-cpu{position:absolute;top:-6px;right:-2px;font:600 10.5px var(--mono);padding:0 5px;border-radius:8px;background:var(--ok);color:#fff;z-index:2}.dev-cpu.warm{background:var(--warn);color:#1c1c1c}.dev-cpu.hot{background:var(--bad)}.dev-badge{font-size:10.5px;color:var(--muted)}.if-label{font:11px var(--mono);fill:var(--muted);paint-order:stroke;stroke:var(--canvas);stroke-width:3px}.react-flow__node:focus-visible .dev{outline:2px solid var(--accent)}.react-flow__node.selected{box-shadow:none}.react-flow__controls{box-shadow:var(--shadow-s);border-radius:8px;overflow:hidden}.react-flow__controls button{background:var(--panel);border-color:var(--line);color:var(--ink);fill:var(--ink);border-radius:0}.react-flow__minimap{background:var(--panel);border:1px solid var(--line);border-radius:8px;overflow:hidden}.cable-sel{fill:none;stroke:var(--accent);stroke-width:10;opacity:.18}.cable-imp-glow{fill:none;stroke:var(--warn);stroke-width:9;opacity:.22;animation:glow 1.6s ease-in-out infinite}@keyframes glow{50%{opacity:.05}}.cable-flow{fill:none;stroke:#ffffffd9;stroke-width:2;stroke-dasharray:2 14;stroke-linecap:round;animation:flow linear infinite;pointer-events:none}:root[data-theme=dark] .cable-flow{stroke:#0a1016bf}@keyframes flow{to{stroke-dashoffset:-32}}.edge-tags{position:absolute;display:flex;flex-direction:column;align-items:center;gap:2px;pointer-events:none;z-index:4}.etag{font:500 10.5px var(--mono);padding:1px 6px;border-radius:9px;white-space:nowrap;box-shadow:var(--shadow-s)}.etag.mini{box-shadow:none;margin-left:6px}.etag-down{background:var(--bad);color:#fff}.etag-imp{background:var(--warn);color:#1d1600}.etag-rate{background:var(--panel);color:var(--ink);border:1px solid var(--line)}.legend{position:absolute;right:14px;top:10px;display:flex;align-items:center;gap:6px;background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:4px 10px;font-size:11.5px;box-shadow:var(--shadow-s);z-index:4}.lg{width:16px;height:4px;border-radius:2px}.lg1{background:var(--t1)}.lg2{background:var(--t2)}.lg3{background:var(--t3)}.lg4{background:var(--t4)}.alignbar{position:absolute;top:10px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:2px;background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:3px 8px;box-shadow:var(--shadow);z-index:6}.alignbar .hint{margin:0 6px 0 2px}.react-flow__node-area{pointer-events:none!important}.react-flow__node-area .ann-handle,.react-flow__node-area .react-flow__resize-control,.react-flow__node-area .ann-colors{pointer-events:all}.ann-area{width:100%;height:100%;border:2px dashed var(--ac);border-radius:14px;background:color-mix(in srgb,var(--ac) 7%,transparent)}.ann-area.sel{border-style:solid}.ann-handle{display:inline-block;margin:-1px 0 0 12px;transform:translateY(-50%);background:var(--ac);color:#fff;font-size:12.5px;font-weight:600;padding:2px 10px;border-radius:10px;cursor:move;max-width:calc(100% - 24px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ann-handle input{width:200px;padding:0 4px;color:var(--ink)}.ann-note{width:100%;height:100%;background:color-mix(in srgb,var(--ac) 30%,var(--panel));border:1px solid color-mix(in srgb,var(--ac) 60%,transparent);border-radius:4px 4px 14px;padding:8px 10px;box-shadow:var(--shadow-s);font-size:13px;overflow:hidden;position:relative}.ann-note.sel{box-shadow:0 0 0 2px var(--accent),var(--shadow-s)}.ann-text{white-space:pre-wrap;height:100%;overflow:auto}.ann-edit{width:100%;height:100%;border:0;background:transparent;font:13px var(--font);resize:none;padding:0}.ann-colors{position:absolute;bottom:-30px;left:0;display:flex;gap:4px;background:var(--panel);border:1px solid var(--line);padding:4px 6px;border-radius:12px;box-shadow:var(--shadow-s)}.ann-c{width:16px;height:16px;border-radius:50%;padding:0;background:var(--ac);border:2px solid var(--panel)}.ann-c.on{box-shadow:0 0 0 2px var(--ink)}.ac-yellow{--ac: #E2B417}.ac-blue{--ac: #2F78C4}.ac-green{--ac: #2E9E5B}.ac-orange{--ac: #E07B12}.ac-purple{--ac: #8C4FD6}.ac-red{--ac: #D0453B}.ac-grey{--ac: #6B7C8E}.welcome{max-width:1060px;margin:0 auto;padding:6vh 28px 40px;height:100%;overflow:auto}.hero{padding:30px 32px;border-radius:18px;background:radial-gradient(120% 140% at 0% 0%,var(--accent-soft),transparent 60%),var(--panel);border:1px solid var(--line);box-shadow:var(--shadow-s);margin-bottom:26px}.welcome h1{font-size:34px;line-height:1.12;font-weight:600;letter-spacing:-.025em;margin:0 0 10px}.welcome h2{font-size:15px;font-weight:600;margin:22px 0 10px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em}.welcome .hero p{color:var(--muted);font-size:15.5px;max-width:680px}.tpl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:14px}.tpl{display:flex;flex-direction:column;align-items:stretch;text-align:left;gap:4px;padding:14px;background:var(--panel);border:1px solid var(--line);border-radius:12px}.tpl-btn{cursor:pointer;transition:transform .15s,box-shadow .15s,border-color .15s}.tpl-btn:hover{transform:translateY(-2px);box-shadow:var(--shadow);border-color:var(--accent)}.tpl h3{margin:6px 0 0;font-size:15px}.tpl p{margin:0;color:var(--muted);font-size:13px}.mini{width:100%;height:110px;background:var(--panel-2);border-radius:8px}.mini-l{stroke:var(--muted);stroke-width:1.4;opacity:.7}.labcards{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px}.labcard{flex-direction:column;align-items:flex-start;padding:12px 14px;border-radius:10px;gap:2px}.labcard b{font-size:14.5px}.labcard .hint{margin:0}.linkpanel{position:absolute;left:14px;bottom:14px;width:380px;max-height:calc(100% - 28px);overflow:auto;background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:10px 14px;z-index:7;box-shadow:var(--shadow)}.linkpanel header{display:flex;align-items:center;gap:8px;margin-bottom:4px}.linkpanel header h3{margin:0;font-size:14px;flex:1}.linkpanel section{border-top:1px solid var(--line-2);padding:6px 0 8px}.linkpanel h4{margin:4px 0;font-size:12px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}.linkpanel label{display:inline-flex;align-items:center;gap:6px}.lp-live{display:grid;grid-template-columns:1fr 1fr auto;gap:8px;align-items:center;background:var(--panel-2);border-radius:8px;padding:8px 10px;margin:6px 0}.lp-live>div{display:flex;flex-direction:column}.lp-live .hint{margin:0;font-size:11.5px}.presets{display:flex;flex-wrap:wrap;gap:5px;margin:4px 0 8px}.preset{font-size:12px;padding:3px 9px;border-radius:14px}.preset.on{background:var(--warn);border-color:var(--warn);color:#1d1600}.lp-fields{display:grid;grid-template-columns:1fr 1fr;gap:6px 12px}.lp-fields label span:first-child{width:68px;font-size:12.5px}.lp-fields input{width:76px}.seg{display:inline-flex;border:1px solid var(--line);border-radius:7px;overflow:hidden}.seg button{border:0;border-radius:0;padding:4px 10px;font-size:12.5px;border-right:1px solid var(--line);background:var(--panel)}.seg button:last-child{border-right:0}.seg button.on{background:var(--accent);color:var(--accent-ink)}.seg button.on.ok{background:var(--ok);color:#fff}.seg button.on.bad{background:var(--bad);color:#fff}.win{position:absolute;width:min(920px,calc(100% - 24px));height:min(620px,calc(100% - 20px));min-width:420px;min-height:260px;display:flex;flex-direction:column;background:var(--panel);border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow);resize:both;overflow:hidden;animation:pop .14s ease-out}.win-max{top:6px!important;right:6px!important;bottom:6px!important;left:6px!important;width:auto!important;height:auto!important;resize:none}@keyframes pop{0%{transform:scale(.98);opacity:0}}.win-head{display:flex;align-items:center;gap:8px;padding:6px 8px 6px 10px;background:#1c2a39;color:#fff;cursor:move;-webkit-user-select:none;user-select:none}:root[data-theme=dark] .win-head{background:#0b121a;border-bottom:1px solid var(--line)}.win-head h2{font-size:14px;margin:0;font-weight:600}.win-head svg{--icon-body: #3B5672;--icon-line: #DCE6EE;--icon-mark: #F2C14E}.win-x,.win-btn{background:none;border:0;color:#fff;font-size:18px;line-height:1;padding:0 6px}.win-btn{margin-left:auto;font-size:15px;opacity:.8}.pill{font-size:11.5px;padding:1px 7px;border-radius:10px;background:#3b4d60;color:#fff}.pill-running{background:var(--ok)}.pill-paused{background:var(--warn);color:#1c1c1c}.tabs{display:flex;gap:2px;padding:6px 8px 0;background:var(--panel-2);border-bottom:1px solid var(--line)}.tabs button{border:1px solid transparent;border-bottom:0;border-radius:6px 6px 0 0;background:none;padding:6px 14px}.tabs button.on{background:var(--panel);border-color:var(--line);margin-bottom:-1px;font-weight:600}.win-body{padding:10px 12px;overflow:auto;flex:1;min-height:0}.box{border:1px solid var(--line);border-radius:8px;margin:0 0 10px;padding:6px 10px 10px}.box legend{font-weight:600;font-size:13px;padding:0 4px}.cfg{display:grid;grid-template-columns:1fr 1fr;gap:12px}.cfg-side h3{font-size:13px;margin:0 0 6px}.eq{background:var(--term);color:var(--term-ink);font:12px/1.5 var(--mono);padding:8px 10px;border-radius:6px;max-height:300px;overflow:auto;white-space:pre-wrap;margin:0 0 8px}.eq-out{color:#9fb3c4}.eq-bad{color:#ff9c8f}.term{height:100%;min-height:300px;background:var(--term);border-radius:6px;padding:6px}.grid{width:100%;border-collapse:collapse;font-size:13px}.grid th{text-align:left;font-weight:600;color:var(--muted);border-bottom:1px solid var(--line);padding:4px 6px;position:sticky;top:0;background:var(--panel);font-size:12px}.grid td{border-bottom:1px solid var(--line-2);padding:4px 6px;vertical-align:middle}.grid.compact td,.grid.compact th{padding:3px 5px}.grid tr.clickable{cursor:pointer}.grid tr.clickable:hover td{background:var(--accent-soft)}.grid tr.dim td{opacity:.55}.led{display:inline-block;width:9px;height:9px;border-radius:50%;margin-right:6px;background:var(--idle)}.led-up{background:var(--ok)}.led-down{background:var(--bad)}.led-warn{background:var(--warn)}.desk{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:12px;padding:8px}.desk .tile{display:flex;flex-direction:column;align-items:center;gap:8px;padding:16px 8px;border-radius:10px}.app-ico{width:48px;height:48px;display:grid;place-items:center;border-radius:10px;background:var(--icon-body);color:var(--icon-line);font:600 13px var(--mono)}.back{margin-bottom:8px}.form .row input{width:200px}.form .row{justify-content:space-between;max-width:460px}.browser .url{flex:1}.browser iframe{width:100%;height:340px;border:1px solid var(--line);border-radius:6px;background:#fff}.mon-views{margin-bottom:10px}.mon-top{display:flex;gap:18px;align-items:center;flex-wrap:wrap;margin-bottom:10px}.gauge{display:flex;align-items:center;gap:8px}.gauge-bg{fill:none;stroke:var(--line-2);stroke-width:6}.gauge-t{font:600 14px var(--mono);fill:var(--ink)}.gauge-l{font-weight:600}.gauge .hint{margin:0}.mon-spark{flex-direction:column;align-items:flex-start;padding:6px 10px;border-radius:10px;margin-left:auto}.mon-spark .hint{margin:0;font-size:11.5px}.spark{display:block}.spark-base{stroke:var(--line)}.ptable{margin-bottom:12px}.ptable h4{margin:4px 0;font-size:13px}.schip{display:inline-block;padding:0 7px;border-radius:9px;font:500 11.5px var(--mono)}.s-ok{background:#2e9e5b29;color:var(--ok)}.s-warn{background:#c98a1029;color:var(--warn)}.s-bad{background:#c8443a26;color:var(--bad)}.chip{border-radius:12px;padding:2px 10px;font-size:12px;border-color:var(--c, var(--line));box-shadow:inset 4px 0 0 var(--c, var(--accent))}.chip.off{opacity:.4;text-decoration:line-through}.rtag{display:inline-block;width:16px;text-align:center;border-radius:3px;margin-right:3px;font-weight:600;color:#fff;background:var(--muted)}.rt-ospf{background:#138a7e}.rt-bgp{background:#1f5fa8}.rt-connected{background:#2e9e5b}.rt-static{background:#8c4fd6}.rt-local,.rt-kernel{background:#6b7c8e}.routes td{font-size:12.5px}.chart{position:relative;width:100%}.chart svg{display:block}.chart-empty{display:grid;place-items:center;color:var(--muted);background:var(--panel-2);border-radius:8px}.grid-line{stroke:var(--line-2)}.axis{font:10.5px var(--mono);fill:var(--muted)}.hover-line{stroke:var(--muted);stroke-dasharray:3 3}.chart-tip{position:absolute;top:8px;background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:6px 9px;font-size:12px;box-shadow:var(--shadow-s);pointer-events:none;min-width:150px}.chart-legend{display:flex;gap:14px;font-size:12px;color:var(--muted);padding:2px 0 0 64px}.stats{display:flex;flex-direction:column;gap:4px;margin-top:8px}.stat{display:flex;gap:16px;align-items:center;font-size:13px}.stat b{font-family:var(--mono);font-weight:500}.sim,.dash{grid-area:side;display:flex;flex-direction:column;background:var(--panel);border-left:1px solid var(--line);min-height:0}.dash{overflow-y:auto}.dash-head{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--panel);z-index:1}.dash-head h2{font-size:15px;margin:0}.dash-head .hint{margin:0;flex:1}.kpis{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;padding:10px 12px}.kpi{background:var(--panel-2);border:1px solid var(--line-2);border-radius:10px;padding:8px 10px;position:relative;overflow:hidden}.kpi:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--line)}.kpi-ok:before{background:var(--ok)}.kpi-warn:before{background:var(--warn)}.kpi-bad:before{background:var(--bad)}.kpi-v{font:600 18px var(--mono);letter-spacing:-.02em}.kpi-l{font-size:11.5px;color:var(--muted)}.kpi-s{font-size:11px;color:var(--muted)}.dash-sec{padding:6px 12px 10px;border-top:1px solid var(--line-2)}.dash-sec h3{font-size:12px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin:6px 0;display:flex;gap:8px;align-items:baseline}.dash-sec h3 .hint{text-transform:none;letter-spacing:0;margin:0}.proto-sum{gap:16px;font-size:13px}.toplink{display:grid;grid-template-columns:1fr auto 74px;align-items:center;gap:8px;width:100%;border:0;border-bottom:1px solid var(--line-2);border-radius:0;padding:5px 2px;background:none;text-align:left;font-size:12.5px}.toplink:hover{background:var(--accent-soft)}.tl-rate{text-align:right}.cpubar{display:grid;grid-template-columns:90px 1fr 50px 60px;gap:8px;align-items:center;width:100%;border:0;background:none;padding:3px 2px;font-size:12.5px;text-align:left}.cpubar:hover{background:var(--accent-soft)}.bar{height:7px;background:var(--line-2);border-radius:4px;overflow:hidden}.bar span{display:block;height:100%;background:var(--ok);border-radius:4px;transition:width .6s}.bar span.warm{background:var(--warn)}.bar span.hot{background:var(--bad)}.activity{font-size:12.5px;max-height:200px;overflow:auto}.act{padding:2px 0 2px 8px;border-left:3px solid var(--line);margin-bottom:3px}.act-ok{border-color:var(--ok)}.act-bad{border-color:var(--bad)}.act-warn{border-color:var(--warn)}.sim-bar,.sim-pdu,.sim-filters{display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding:8px 10px;border-bottom:1px solid var(--line)}.sim-pdu span{font-weight:600;font-size:13px}.sim-pdu input{width:150px}.rec.on{background:var(--bad);color:#fff;border-color:var(--bad)}.speed{display:inline-flex;align-items:center;gap:4px;font-size:12.5px}.speed input{width:70px}.sim-list{flex:1;overflow:auto;min-height:120px}.ev td{cursor:pointer;white-space:nowrap}.ev td.info{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:160px}.ev tr.cur td{background:var(--accent-soft)}.pdu{border-top:2px solid var(--line);max-height:42%;overflow:auto;padding:8px 10px}.pdu h3{font-size:13px;margin:0 0 6px}.pdu details{border:1px solid var(--line);border-radius:6px;margin-bottom:4px}.pdu summary{padding:4px 8px;cursor:pointer;font-weight:500}.layer-n{display:inline-block;min-width:34px;font:11px var(--mono);color:var(--muted)}.kv{width:100%;border-collapse:collapse;font-size:12px}.kv td{padding:2px 8px;border-top:1px solid var(--line-2);vertical-align:top}.kv td:first-child{color:var(--muted);width:38%}.status{grid-area:status;display:flex;align-items:center;gap:12px;padding:0 10px;background:var(--panel);border-top:1px solid var(--line);font-size:12.5px}.status .msg{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status .counts{color:var(--muted);white-space:nowrap}.logpane{position:fixed;left:0;right:0;bottom:28px;max-height:40vh;overflow:auto;background:var(--panel);border-top:1px solid var(--line);padding:8px 12px;z-index:50;font-size:13px;box-shadow:var(--shadow)}.logpane>div{padding:2px 0 2px 8px;border-left:3px solid var(--line);margin-bottom:3px}.logpane .log-ok{border-color:var(--ok)}.logpane .log-bad{border-color:var(--bad)}.logpane pre{font:11.5px var(--mono);background:var(--panel-2);padding:6px;max-height:220px;overflow:auto;white-space:pre-wrap}.toasts{position:fixed;right:14px;top:60px;display:flex;flex-direction:column;gap:8px;z-index:200;width:340px;pointer-events:none}.toast{pointer-events:all;display:flex;gap:10px;align-items:flex-start;background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:10px 10px 10px 12px;box-shadow:var(--shadow);animation:slide .2s ease-out;font-size:13px}@keyframes slide{0%{transform:translate(20px);opacity:0}}.toast-dot{width:9px;height:9px;border-radius:50%;margin-top:5px;background:var(--accent);flex:none}.toast-ok .toast-dot{background:var(--ok)}.toast-bad .toast-dot{background:var(--bad)}.toast-warn .toast-dot{background:var(--warn)}.toast-body{flex:1}.toast-sub{color:var(--muted);font-size:12px;margin-top:2px}.toast-x{border:0;background:none;padding:2px;color:var(--muted)}.busy{position:fixed;top:0;right:0;bottom:0;left:0;background:color-mix(in srgb,var(--canvas) 75%,transparent);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);display:grid;place-content:center;justify-items:center;z-index:300}.spinner{width:34px;height:34px;border:3px solid var(--line);border-top-color:var(--accent);border-radius:50%;animation:spin .9s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.modal-back{position:fixed;top:0;right:0;bottom:0;left:0;background:#080e1473;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);display:grid;place-items:center;z-index:150;animation:fade .12s}@keyframes fade{0%{opacity:0}}.modal{width:min(560px,calc(100vw - 32px));max-height:calc(100vh - 60px);display:flex;flex-direction:column;background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow);animation:pop .15s ease-out}.modal-wide{width:min(980px,calc(100vw - 32px))}.modal-head{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--line)}.modal-head h2{margin:0;font-size:16px}.modal-body{padding:14px 16px;overflow:auto}.modal-foot{padding:10px 16px;border-top:1px solid var(--line);display:flex;justify-content:flex-end;gap:8px}.mgr-tabs{margin-bottom:14px}.menu{position:fixed;min-width:210px;background:var(--panel);border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow);padding:5px;z-index:250;animation:pop .1s ease-out}.menu-i{display:flex;align-items:center;gap:9px;width:100%;border:0;background:none;padding:6px 9px;border-radius:6px;text-align:left;font-size:13px}.menu-i:hover:not(:disabled){background:var(--accent-soft)}.menu-i span{flex:1}.menu-i.danger{color:var(--bad)}.menu-sep{height:1px;background:var(--line);margin:4px 2px}.menu-h{font-size:11px;color:var(--muted);padding:5px 9px 2px;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap}.pal-back{place-items:start center;padding-top:12vh}.cmdk{width:min(620px,calc(100vw - 32px));background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow);overflow:hidden;animation:pop .12s ease-out}.cmdk-in{display:flex;align-items:center;gap:10px;padding:12px 14px;border-bottom:1px solid var(--line);color:var(--muted)}.cmdk-in input{flex:1;border:0;background:none;font-size:16px;padding:2px;color:var(--ink)}.cmdk-in input:focus-visible{outline:none}.cmdk-list{max-height:50vh;overflow:auto;padding:6px}.cmdk-i{display:flex;align-items:center;gap:10px;width:100%;border:0;background:none;padding:7px 10px;border-radius:8px;text-align:left}.cmdk-i.on{background:var(--accent-soft)}.cmdk-l{flex:1;font-weight:500}.cmdk-i .hint{margin:0}.keys td:first-child{white-space:nowrap}.keys kbd{margin-right:2px}.snaps td{font-size:13px}.diff-h{font-size:14px;margin:16px 0 6px}.diffs details{border:1px solid var(--line);border-radius:8px;margin-bottom:6px;overflow:hidden}.diffs summary{padding:6px 10px;cursor:pointer;display:flex;gap:10px;align-items:center;background:var(--panel-2)}.dstat{font:600 11px var(--mono);padding:0 6px;border-radius:4px;text-transform:uppercase}.d-changed{background:#c98a102e;color:var(--warn)}.d-added{background:#2e9e5b2e;color:var(--ok)}.d-removed{background:#c8443a29;color:var(--bad)}pre.diff{margin:0;font:12px/1.45 var(--mono);max-height:380px;overflow:auto;background:var(--panel)}pre.diff div{padding:0 10px;white-space:pre}pre.diff .d-add{background:#2e9e5b24}pre.diff .d-del{background:#c8443a21}pre.diff .d-hunk{color:var(--accent);background:var(--accent-soft)}pre.diff .d-file{color:var(--muted)}.share section{border-bottom:1px solid var(--line-2);padding:6px 0 12px}.share h3{font-size:14px;display:flex;align-items:center;gap:6px;margin:6px 0}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:1ms!important;transition-duration:1ms!important}.cable-flow{display:none}}@media (max-width: 1100px){.app-side{grid-template-columns:96px 1fr 380px}}@media (max-width: 900px){.app,.app-side{grid-template-columns:84px 1fr;grid-template-rows:auto 1fr 42vh 28px;grid-template-areas:"top top" "pal canvas" "side side" "status status"}.cfg{grid-template-columns:1fr}.kpis{grid-template-columns:repeat(2,1fr)}}.settings{display:grid;grid-template-columns:190px 1fr;gap:18px;min-height:420px}.set-nav{display:flex;flex-direction:column;gap:2px;border-right:1px solid var(--line);padding-right:10px}.set-nav button{border:0;background:none;justify-content:flex-start;padding:7px 10px;border-radius:8px}.set-nav button.on{background:var(--accent-soft);color:var(--accent);font-weight:600}.set-body h3{margin:2px 0 10px;font-size:15px}.set-f{display:grid;grid-template-columns:210px 1fr;gap:12px;align-items:start;padding:8px 0;border-bottom:1px solid var(--line-2)}.set-l{font-weight:500;padding-top:4px}.set-c{display:flex;flex-direction:column;align-items:flex-start;gap:3px}.set-c .hint{margin:0}.set-c input[type=checkbox]{width:18px;height:18px;margin-top:5px}input.wide{width:min(420px,100%)}.narrow2{width:90px}.rules td{padding:3px 4px}.rules input:not([type]),.rules input[type=text]{width:100%;min-width:90px}.rules select{max-width:210px}.probe-t{width:110px;margin-top:3px}.secstate{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:8px;background:#c8443a1f;color:var(--bad);font-weight:600;margin:8px 0 6px}.secstate.on{background:#2e9e5b24;color:var(--ok)}code{font:12.5px var(--mono);background:var(--panel-2);padding:1px 5px;border-radius:4px}.bell{position:relative}.bell .badge{position:absolute;top:1px;right:0;min-width:16px;height:16px;padding:0 4px;border-radius:8px;font:600 10px/16px var(--mono);background:var(--warn);color:#1d1600}.bell.crit .badge{background:var(--bad);color:#fff;animation:pulseb 1.6s ease-in-out infinite}@keyframes pulseb{50%{box-shadow:0 0 0 5px #c8443a00;transform:scale(1.08)}}.notif-bar{padding:0 12px}.notif-list{padding:4px 12px 12px;display:flex;flex-direction:column;gap:6px}.alert{display:flex;gap:10px;align-items:flex-start;padding:8px 10px;border:1px solid var(--line);border-left-width:4px;border-radius:8px;background:var(--panel);font-size:13px}.al-critical{border-left-color:var(--bad)}.al-warning{border-left-color:var(--warn)}.al-info{border-left-color:var(--accent)}.alert.resolved{opacity:.7;border-left-color:var(--ok)}.alert.acked{opacity:.8}.al-dot{width:9px;height:9px;border-radius:50%;margin-top:5px;background:var(--muted);flex:none}.al-critical.firing .al-dot{background:var(--bad);box-shadow:0 0 0 3px #c8443a33}.al-warning.firing .al-dot{background:var(--warn)}.alert.resolved .al-dot{background:var(--ok)}.al-body{flex:1;min-width:0}.al-top{display:flex;gap:6px;align-items:center;flex-wrap:wrap}.al-body .hint{margin:2px 0 0}.dev-alert{position:absolute;top:-6px;left:2px;width:17px;height:17px;border-radius:50%;display:grid;place-items:center;font:700 11px var(--font);color:#fff;background:var(--warn);z-index:2;box-shadow:0 0 0 2px var(--panel)}.dev-al-critical .dev-alert{background:var(--bad);animation:pulseb 1.6s ease-in-out infinite}.dev-al-critical .dev-icon{filter:drop-shadow(0 0 6px rgba(200,68,58,.55))}.tg-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px 12px;margin-bottom:8px}.tg-grid label{display:flex;flex-direction:column;gap:3px;font-size:12.5px;color:var(--muted)}.tg-grid select,.tg-grid .seg{color:var(--ink)}.job{border:1px solid var(--line-2);border-radius:8px;padding:6px 9px;margin-bottom:6px;font-size:13px}.job .hint{margin:0 0 0 8px}.job .bar{margin:6px 0 2px}.job-r{margin-top:4px;font-weight:500}.job-failed{border-color:#c8443a66}.login{min-height:100vh;display:grid;place-items:center;background:radial-gradient(90% 90% at 20% 10%,var(--accent-soft),transparent 60%),var(--canvas)}.login-card{width:320px;display:flex;flex-direction:column;gap:12px;padding:26px;background:var(--panel);border:1px solid var(--line);border-radius:16px;box-shadow:var(--shadow)}.login-card .brand{font-size:20px;justify-content:center;margin:0 0 6px}.login-card input{padding:8px 10px;font-size:15px}.modal-xwide{width:min(1240px,calc(100vw - 32px))}.settings>*{min-width:0}.rules-wrap{overflow-x:auto}.rules td:nth-child(2) input{width:150px;min-width:0}.rules select{max-width:190px}.rules .narrow2{width:80px}.dev-poweroff svg{filter:grayscale(1);opacity:.45}.dev-poweroff .dev-dot{background:#20262c;box-shadow:inset 0 0 0 1.5px var(--idle)}.pill-off{background:#3b4d60}.hw{margin-bottom:14px}.hw-head{justify-content:space-between;flex-wrap:wrap;gap:10px}.hw-body{display:flex;gap:14px;align-items:flex-start;flex-wrap:wrap;margin-top:6px}.hp,.hw-lib{-webkit-user-select:none;user-select:none}.hp{flex:1 1 520px;background:linear-gradient(#3a4652,#2b343d);border-radius:8px;padding:10px 12px 12px;color:#dfe7ee;box-shadow:inset 0 1px #ffffff14,var(--shadow-s)}.hp-row{display:flex;gap:12px;align-items:center}.hp-tag{font:600 11px var(--mono);padding:2px 6px;background:#00000059;border-radius:3px;letter-spacing:.04em}.hp-ports{display:flex;flex-wrap:wrap;gap:4px 6px}.hp-port{display:inline-flex;flex-direction:column;align-items:center;gap:1px;cursor:default}.hp-port i{display:block;width:16px;height:13px;border-radius:2px;background:#11161b;border:1px solid #5a6774;position:relative}.hp-copper i:after{content:"";position:absolute;left:5px;right:5px;bottom:-1px;height:3px;background:#11161b;border:1px solid #5a6774;border-top:0}.hp-fibre i{width:18px;height:9px;border-radius:1px;border-color:#b9781f}.hp-serial i{width:22px;height:10px;border-radius:5px 5px 2px 2px;border-color:#a35a7c}.hp-port small{font:9.5px var(--mono);color:#9fb0bf}.hp-up i{background:#1e5d38;box-shadow:0 0 0 2px #3dba708c}.hp-down i{background:#5d221e;box-shadow:0 0 0 2px #ef6a5f80}.hp-idle i{background:#3a4652;box-shadow:0 0 0 2px #a3afba73}.hw-legend .hp-port{vertical-align:middle;margin:0 2px 0 8px}.hw-legend .hp-port i{background:#11161b}.hw-legend .hp-up i{background:#1e5d38}.hw-legend .hp-down i{background:#5d221e}.hp-slots{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.hp-slot{flex:1 1 200px;min-height:64px;border:1.5px dashed #6c7a87;border-radius:6px;padding:6px 8px;display:flex;flex-direction:column;gap:5px;position:relative;background:#0000002e}.hp-slot.full{border-style:solid;border-color:#8696a4;background:linear-gradient(#46525e,#39434d)}.hp-slot.drop{border-color:var(--accent);background:#5b9be62e}.hp-sid{font:600 10px var(--mono);color:#a9b7c4;text-transform:uppercase;letter-spacing:.06em}.hp-mname{font-size:12px;font-weight:600}.hp-x{position:absolute;top:4px;right:6px;font-size:11.5px;color:#ff9d94!important}.hp-pick{background:#00000059;color:#dfe7ee;border:1px solid #6c7a87;border-radius:4px;font-size:12px;padding:3px}.hw-lib{flex:0 1 210px;display:flex;flex-direction:column;gap:6px}.hw-lib h4{margin:0 0 2px;font-size:12px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted)}.hw-mod{border:1px solid var(--line);border-radius:6px;padding:6px 8px;background:var(--panel-2);cursor:grab;display:flex;flex-direction:column;font-size:12.5px}.hw-mod:hover{border-color:var(--accent)}.hw-mod.locked{cursor:not-allowed;opacity:.55}.power{gap:8px}.power .pw-led{width:9px;height:9px;border-radius:50%;background:var(--ok);box-shadow:0 0 6px var(--ok)}.power.off .pw-led{background:#20262c;box-shadow:inset 0 0 0 1.5px var(--idle)}.portmenu{position:fixed;z-index:260;width:290px;max-height:380px;display:flex;flex-direction:column;background:var(--panel);border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow);animation:pop .1s ease-out}.portmenu header{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid var(--line-2)}.portmenu header .hint{flex:1}.pm-list{overflow:auto;padding:4px}.pm-group{font:600 10.5px var(--font);text-transform:uppercase;letter-spacing:.06em;color:var(--muted);padding:6px 8px 2px}.pm-item{display:grid;grid-template-columns:26px 1fr auto;align-items:center;gap:8px;width:100%;border:0;background:none;padding:4px 8px;border-radius:6px;text-align:left;font-size:12.5px}.pm-item:hover:not(:disabled){background:var(--accent-soft)}.pm-item .hp-port i{background:#11161b}.pm-item.off{opacity:.45}.cli{display:flex;flex-direction:column;gap:6px;height:100%}.cli-bar{gap:10px}.cli .term{flex:1;min-height:300px}.labs-tbl tr.cur td{background:var(--accent-soft)}.reach-wrap{overflow:auto;max-height:340px}.reach{border-collapse:separate;border-spacing:2px;font-size:11.5px}.reach th{font-weight:500;text-align:left;white-space:nowrap;padding:2px 6px}.reach thead th{vertical-align:bottom}.reach .rv{writing-mode:vertical-rl;transform:rotate(180deg);display:inline-block;max-height:90px}.reach .rc{min-width:34px;height:24px;text-align:center;border-radius:4px;font:600 11px var(--mono)}.reach .rc.ok{background:#2e9e5b33;color:var(--ok)}.reach .rc.bad{background:#c8443a33;color:var(--bad)}.reach .rc.na{background:var(--panel-3);color:var(--muted)}.reach .rc.self{background:repeating-linear-gradient(45deg,var(--panel-3) 0 4px,transparent 4px 8px)}.cfgx{display:grid;grid-template-columns:212px 1fr;grid-template-rows:minmax(0,1fr) auto;margin:-10px -12px;height:calc(100% + 20px);min-height:0}.cfgx-nolog{grid-template-rows:minmax(0,1fr)}.cfgx-load{padding:20px}.cfgx-nav{grid-row:1;overflow:auto;background:var(--panel-2);border-right:1px solid var(--line);padding:6px 0 10px}.cfgx-g{display:flex;align-items:center;gap:6px;font:600 10.5px var(--font);text-transform:uppercase;letter-spacing:.07em;color:var(--muted);padding:10px 12px 3px}.cfgx-i{display:flex;align-items:center;gap:7px;width:100%;border:0;border-radius:0;background:none;padding:5px 12px 5px 14px;text-align:left;font-size:13px;border-left:3px solid transparent}.cfgx-i:hover{background:var(--accent-soft)}.cfgx-i.on{background:var(--panel);border-left-color:var(--accent);font-weight:600}.cfgx-i .led{margin:0;flex:0 0 auto}.cfgx-t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cfgx-i .hint{font-size:11px;font-family:var(--mono);max-width:90px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cfgx-main{grid-row:1;overflow:auto;padding:12px 16px 16px;min-width:0}.cfgx .ioslog{grid-column:1 / -1;border-top:1px solid var(--line);background:var(--panel-2);padding:4px 10px 8px}.ioslog-h{gap:10px;font-size:12px;margin-bottom:3px}.ioslog pre{margin:0;background:var(--term);color:var(--term-ink);font:12px/1.45 var(--mono);padding:6px 10px;border-radius:6px;height:110px;overflow:auto;white-space:pre-wrap}.page h3{margin:0 0 10px;font-size:16px}.page h4{margin:18px 0 6px;font-size:12px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted)}.fx{display:grid;grid-template-columns:150px 1fr;gap:10px;align-items:start;padding:6px 0;border-bottom:1px solid var(--line-2)}.fx-l{font-size:13px;font-weight:500;padding-top:5px}.fx-c{min-width:0;display:flex;flex-direction:column;gap:4px;align-items:flex-start}.fx-c textarea{width:min(460px,100%)}.fx-c input[type=checkbox]{width:17px;height:17px;margin-top:5px}.ipmask{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap}.ipmask input{width:140px;font-family:var(--mono)}input.bad,select.bad{border-color:var(--bad);box-shadow:0 0 0 2px #c8443a26}.applybar{display:flex;align-items:center;gap:8px;padding:10px 0 2px;position:sticky;bottom:-16px;background:var(--panel)}.statline{display:flex;flex-wrap:wrap;align-items:center;gap:6px;font-size:12.5px;color:var(--muted);margin:-4px 0 8px}.statline .led{margin:0}.banner{background:var(--accent-soft);border:1px solid var(--line);border-radius:6px;padding:6px 10px;font-size:12.5px;margin:0 0 10px}.formrow{display:flex;flex-wrap:wrap;gap:8px;align-items:flex-end;margin:8px 0}.formrow label{display:flex;flex-direction:column;gap:2px;font-size:11.5px;color:var(--muted)}.formrow input,.formrow select{color:var(--ink)}.subbox{border:1px solid var(--line);border-radius:8px;padding:4px 12px 10px;margin-top:14px;background:var(--panel-2)}.vpick{display:flex;flex-wrap:wrap;gap:4px 14px}.runcfg{max-height:340px}.tblwrap{overflow-x:auto}.fwr input.addr{width:104px;font-family:var(--mono);font-size:12px}.fwr input:not(.addr):not(.narrow){width:104px}.fwr input.narrow{width:66px}.fwr td,.fwr th{padding:3px!important}.fwr select{padding:2px 4px}.fwr td{white-space:nowrap}.fwr .newrow td{background:var(--panel-2)}select.act-accept{color:var(--ok)}select.act-drop,select.act-reject{color:var(--bad)}.syslog-pre{height:220px;max-height:none}.empty-hint{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;pointer-events:none}.empty-hint div{background:var(--panel);border:1px dashed var(--line);border-radius:12px;padding:18px 22px;max-width:420px;color:var(--muted);font-size:13.5px;box-shadow:var(--shadow-s)}.empty-hint b{color:var(--ink)}.empty-hint ol{margin:8px 0 0;padding-left:20px}.sfp-box{margin:10px 0 4px}.sfp-box summary{cursor:pointer;font-weight:600;font-size:13px}.sfp-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:4px 14px;margin-top:6px}.sfp-grid .mono{min-width:70px}.led-off{background:transparent;box-shadow:inset 0 0 0 1.5px var(--idle)}.led-idle{background:var(--idle)}.svc h3{margin:0}.svc h4{margin:16px 0 4px;font-size:13px}.svc-head{display:flex;align-items:center;gap:10px;padding-bottom:8px;margin-bottom:10px;border-bottom:1px solid var(--line)}.svc-state{font-size:12px;padding:1px 8px;border-radius:10px;background:var(--panel-2);color:var(--muted);white-space:nowrap}.svc-up{background:color-mix(in srgb,var(--ok) 16%,transparent);color:var(--ok)}.svc-down{background:color-mix(in srgb,var(--bad) 14%,transparent);color:var(--bad)}.svc-preview{width:100%;height:140px;border:1px solid var(--line);border-radius:6px;background:#fff}.svc textarea.mono{font:12px var(--mono);width:100%}.svc table.grid input,.svc table.grid select{width:100%;min-width:0}.fx-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:0 18px}.fx-grid .fx{grid-template-columns:120px minmax(0,1fr)}.fx-grid .fx-c,.fx-grid .fx-c input,.svc .fx-c textarea{width:100%}.filearea{border:1px dashed var(--line);border-radius:8px;padding:6px 8px}.svc-out{margin-top:12px;max-height:140px;overflow:auto}.chip.on{background:var(--accent-soft);font-weight:600}.tabsrow{gap:6px;flex-wrap:wrap;margin:8px 0}.acebuilder{border:1px dashed var(--line);border-radius:8px;padding:6px 10px;margin:10px 0;display:flex;flex-direction:column;gap:6px}.acebuilder .row input.wide{flex:1}.formrow .row{display:flex;gap:4px}.acct{position:relative}.acct-btn{display:inline-flex;align-items:center;gap:6px}.avatar{width:24px;height:24px;border-radius:50%;background:var(--accent);color:var(--accent-ink);display:inline-grid;place-items:center;font:600 12px var(--font)}.acct-menu{position:absolute;right:0;top:calc(100% + 6px);min-width:240px;background:var(--panel);border:1px solid var(--line);border-radius:10px;box-shadow:0 10px 30px #00000040;padding:6px;z-index:50;display:flex;flex-direction:column}.acct-menu .hint{padding:6px 8px 8px;border-bottom:1px solid var(--line);margin-bottom:4px}.acct-menu button{display:flex;align-items:center;gap:8px;border:0;background:none;text-align:left;padding:7px 8px;border-radius:6px}.acct-menu button:hover{background:var(--accent-soft)}.admin-users td{vertical-align:middle}.admin-users .row{gap:10px;flex-wrap:wrap}.invite-made{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.invite-made .mono{word-break:break-all}.login-card h3{margin:4px 0}
