:root{--bg: #0b0e14;--panel: #141925;--panel-2: #1c2333;--text: #d7dde8;--muted: #8b96a8;--accent: #4caf50;--border: #232b3d}*{box-sizing:border-box}html,body,#app{margin:0;height:100%;width:100%}body{font:13px/1.4 ui-monospace,SF Mono,Menlo,Consolas,monospace;color:var(--text);background:var(--bg);overflow:hidden}#app{display:grid;grid-template-rows:auto auto auto 1fr;position:relative}#nav{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:8px 14px;background:var(--panel);border-bottom:1px solid var(--border)}.nav-left{display:flex;align-items:center;gap:14px;flex-wrap:wrap}.logo{color:var(--accent);font-weight:700;letter-spacing:.5px}.packet-total{color:var(--text)}.proto-breakdown{display:flex;gap:8px;flex-wrap:wrap}.proto-chip{color:var(--muted)}.nav-right{display:flex;align-items:center;gap:10px}button{font:inherit}.load-btn{background:var(--panel-2);color:var(--text);border:1px solid var(--border);border-radius:6px;padding:5px 12px;cursor:pointer}.load-btn:disabled{opacity:.6;cursor:default}.upload-msg{font-size:12px;color:var(--muted);max-width:320px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.upload-msg.error{color:#ff8095}#filterbar{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:7px 14px;background:var(--panel-2);border-bottom:1px solid var(--border)}#filter-input{flex:1;background:var(--bg);border:1px solid var(--border);color:var(--text);border-radius:6px;padding:6px 10px}#filter-input.invalid{border-color:#ff5470}#filterbar button{background:var(--panel);color:var(--text);border:1px solid var(--border);border-radius:6px;padding:6px 12px;cursor:pointer}.filter-error{flex-basis:100%;color:#ff8095;font-size:12px}.filter-builder{flex-basis:100%;display:flex;gap:8px;align-items:center}.filter-builder select,.filter-builder input{background:var(--bg);border:1px solid var(--border);color:var(--text);border-radius:6px;padding:5px 8px}.filter-builder input{flex:1}#status{display:flex;gap:18px;padding:5px 14px;background:var(--panel);border-bottom:1px solid var(--border);color:var(--muted)}.status-sel{color:var(--accent)}#canvas-host{position:relative;min-height:0}#canvas-host canvas{display:block}#legend{position:absolute;left:14px;bottom:14px;background:#141925d9;border:1px solid var(--border);border-radius:8px;padding:8px 10px;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);max-width:200px}.legend-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:6px}.legend-title{color:var(--muted);text-transform:uppercase;font-size:11px;letter-spacing:.5px}.legend-mode,.legend-actions{display:flex;gap:4px}.legend-actions{margin-bottom:6px}.legend-mode button,.legend-actions button{background:var(--panel-2);color:var(--muted);border:1px solid var(--border);border-radius:4px;padding:2px 7px;font-size:11px;cursor:pointer}.legend-mode button.active,.legend-actions button.active{background:var(--accent);color:#07120a;border-color:var(--accent)}.legend-item{display:flex;align-items:center;gap:7px;width:100%;background:transparent;border:0;color:var(--text);padding:3px 4px;cursor:pointer;border-radius:4px}.legend-item:hover{background:var(--panel-2)}.legend-item.off{opacity:.4}.swatch{width:11px;height:11px;border-radius:2px;flex:none}#layers{position:absolute;right:14px;bottom:14px;background:#141925d9;border:1px solid var(--border);border-radius:8px;padding:8px 10px;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);width:180px}.layers-title{color:var(--muted);margin-bottom:6px;text-transform:uppercase;font-size:11px;letter-spacing:.5px}.layer-row{display:flex;align-items:center;gap:8px;padding:3px 0}.layer-row>span:first-child{flex:1;color:var(--text)}.switch{position:relative;display:inline-block;width:34px;height:18px;flex:none}.switch input{position:absolute;opacity:0;width:100%;height:100%;margin:0;cursor:pointer}.switch .slider{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--panel-2);border:1px solid var(--border);border-radius:999px;transition:background .15s}.switch .slider:before{content:"";position:absolute;width:12px;height:12px;left:2px;top:2px;background:var(--muted);border-radius:50%;transition:transform .15s,background .15s}.switch input:checked+.slider{background:var(--accent)}.switch input:checked+.slider:before{transform:translate(16px);background:#07120a}.label-layer{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;pointer-events:none}.g-label{position:absolute;left:0;top:0;white-space:nowrap;font-size:11px;line-height:1;text-shadow:0 0 3px #000,0 0 3px #000,0 0 3px #000;will-change:transform,opacity}.g-label-node{color:#e8eef7}.g-label-edge{color:#94a6bd;font-size:10px}#detail:empty{display:none}#detail{position:absolute;top:14px;right:14px;width:320px;max-height:calc(100% - 28px);display:flex;flex-direction:column;background:#141925eb;border:1px solid var(--border);border-radius:8px;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);overflow:hidden}.detail-header{display:flex;justify-content:space-between;align-items:flex-start;gap:8px;padding:10px 12px;border-bottom:1px solid var(--border)}.detail-title{color:var(--accent);font-weight:700;word-break:break-all}.detail-subtitle{color:var(--muted);font-size:11px;text-transform:capitalize;margin-top:2px}.detail-close{background:transparent;border:0;color:var(--muted);font-size:18px;line-height:1;cursor:pointer;padding:0 4px}.detail-close:hover{color:var(--text)}.detail-body{padding:8px 12px 12px;overflow-y:auto}.detail-field{display:flex;justify-content:space-between;gap:12px;padding:3px 0;color:var(--muted)}.detail-field .mono{color:var(--text);text-align:right;word-break:break-all}.peer-link,.peer-row{cursor:pointer}.peer-link:hover{color:var(--accent);text-decoration:underline}.detail-section{margin:12px 0 6px;color:var(--muted);text-transform:uppercase;font-size:11px;letter-spacing:.5px;border-top:1px solid var(--border);padding-top:8px}.detail-table{width:100%;border-collapse:collapse;font-size:12px}.detail-table th{text-align:left;color:var(--muted);font-weight:400;padding:2px 4px;position:sticky;top:0;background:var(--panel)}.detail-table td{padding:2px 4px;border-top:1px solid var(--border)}.detail-table .num{text-align:right}.detail-table .mono{word-break:break-all}.peer-row:hover td{background:var(--panel-2)}.detail-more,.detail-table .muted{color:var(--muted);font-size:11px;padding:6px 4px}.mono{font-family:inherit}.error{color:var(--text);padding:40px;text-align:center;line-height:1.8}.error code{background:var(--panel-2);padding:1px 6px;border-radius:4px;color:var(--accent)}
