.netlab-canvas{background-color:var(--netsim-stage-bg);background-image:linear-gradient(to right, var(--netsim-grid-line) 1px, transparent 1px), linear-gradient(to bottom, var(--netsim-grid-line) 1px, transparent 1px);background-size:24px 24px}.netlab-canvas .react-flow{background:0 0}.netlab-canvas .react-flow__pane{touch-action:pan-y}.netlab-canvas .react-flow__node{touch-action:none;cursor:grab}.netlab-canvas .react-flow__node.dragging{cursor:grabbing}.netlab-canvas .react-flow__node:focus-visible{outline:none}.netlab-canvas .react-flow__node:focus-visible .netlab-node{box-shadow:0 0 0 2px var(--ring)}.netlab-canvas .react-flow__attribution{opacity:.55;background:0 0;padding:2px 8px;font-size:9px}.netlab-canvas .react-flow__attribution a{color:var(--muted-foreground)}.netlab-canvas .netlab-knob{border:2px solid var(--primary);background:var(--card);opacity:.45;cursor:crosshair;border-radius:999px;width:12px;height:12px;transition:opacity .12s,transform .12s}.netlab-canvas .react-flow__node:hover .netlab-knob,.netlab-canvas .react-flow__node.selected .netlab-knob{opacity:1}@media (pointer:coarse){.netlab-canvas .netlab-knob{opacity:.8;width:18px;height:18px}}.netlab-canvas .netlab-drop{border-radius:inherit;pointer-events:none;background:0 0;border:0;width:100%;min-width:0;height:100%;min-height:0;inset:0;transform:none}.netlab-canvas .netlab-drop--active{pointer-events:all}.netlab-canvas .netlab-drop--active.connectingto,.netlab-canvas .netlab-drop--active.valid{box-shadow:inset 0 0 0 2px var(--primary)}.netlab-canvas .react-flow__connection-path{stroke:var(--primary);stroke-width:2px;stroke-dasharray:6 4}.netlab-link__line{stroke:var(--netsim-cable-core);stroke-width:2px;fill:none;transition:stroke .16s}.netlab-link:hover .netlab-link__line{stroke:color-mix(in srgb, var(--primary) 55%, var(--netsim-cable-core))}.netlab-link[data-state=selected] .netlab-link__line{stroke:var(--primary);stroke-width:3px}.netlab-link[data-state=used] .netlab-link__line{stroke:color-mix(in srgb, var(--netsim-signal) 70%, var(--netsim-cable-core));stroke-width:2.5px}.netlab-link[data-state=active] .netlab-link__line{stroke:var(--netsim-signal);stroke-width:3.5px}.netlab-link[data-medium=wifi] .netlab-link__line{stroke:color-mix(in srgb, var(--primary) 55%, var(--netsim-cable-core));stroke-dasharray:2 6;stroke-linecap:round;stroke-width:2.5px}.netlab-link[data-medium=wifi][data-state=used] .netlab-link__line{stroke:color-mix(in srgb, var(--netsim-signal) 70%, var(--netsim-cable-core))}.netlab-link[data-medium=wifi][data-state=active] .netlab-link__line{stroke:var(--netsim-signal);stroke-width:3.5px}.netlab-link__label{font-family:var(--font-mono);fill:var(--muted-foreground);paint-order:stroke;stroke:var(--background);stroke-width:4px;stroke-linejoin:round;pointer-events:none;font-size:10px;font-weight:600}.netlab-link[data-state=selected] .netlab-link__label{fill:var(--primary)}.netlab-packet{border:2px solid var(--background);pointer-events:none;z-index:10;border-radius:999px;position:absolute;top:0;left:0}.netlab-packet[data-tone=request]{background:var(--netsim-signal);box-shadow:0 0 0 4px color-mix(in srgb, var(--netsim-signal) 28%, transparent)}.netlab-packet[data-tone=reply]{background:#00b6af;background:lab(66.7885% -47.5252 -9.34684);box-shadow:0 0 0 4px #00b6af47}.netlab-packet[data-tone=deliver]{background:#20b46b;background:lab(64.9452% -51.3418 26.5195);box-shadow:0 0 0 4px #20b46b47}.netlab-packet[data-tone=drop]{background:#ea3c3f;background:lab(53.7962% 66.4339 41.0992);box-shadow:0 0 0 4px #ea3c3f4d}@media (prefers-reduced-motion:reduce){.netlab-knob,.netlab-link__line{transition:none}}
