*,:before,:after{box-sizing:border-box;margin:0;padding:0}:root{--bg:#0c0a09;--panel:#1c1917;--border:#44403c;--text:#e7e5e3;--text2:#a8a29e;--accent:oklch(70% .08 250);--green:oklch(75% .14 155);--red:oklch(65% .2 25);--idle:#57534e;--slate:oklch(55% .03 250);--origin:oklch(72% .14 300);--receiving:oklch(72% .12 230);--useless:oklch(72% .14 60);--hover:oklch(72% .12 320);--routing:oklch(65% .1 280);--border-subtle:#292524;--text3:#78716c;--font:"Ubuntu Sans Mono", monospace}html,body{background:var(--bg);height:100%;color:var(--text);font-family:var(--font);font-weight:400;overflow:hidden}#app{flex-direction:column;height:100vh;display:flex}#toolbar{background:var(--panel);border-bottom:1px solid var(--border);flex-shrink:0;align-items:center;gap:12px;min-height:44px;padding:8px 16px;display:flex}#main{flex:1;min-height:0;display:flex}#stats-panel{background:var(--panel);border-right:1px solid var(--border);flex-shrink:0;width:20%;min-width:180px;padding:12px;overflow-y:auto}#map-container{background:var(--bg);flex:1;position:relative}#event-log{background:var(--panel);border-left:1px solid var(--border);flex-direction:column;flex-shrink:0;width:20%;min-width:200px;padding:0;display:flex;overflow-y:auto}#timeline-bar{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border:1px solid var(--border);z-index:20;background:#0c0a09e6;border-radius:0;flex-direction:column;gap:8px;width:60%;min-width:280px;max-width:600px;padding:16px 20px;display:flex;position:absolute;bottom:24px;left:50%;transform:translate(-50%)}#toolbar label{font-family:var(--font);color:var(--text2);text-transform:uppercase;letter-spacing:.06em;cursor:pointer;font-size:13px;font-weight:400}#toolbar input[type=file]{display:none}#file-label{border:1px solid var(--border);background:var(--bg);color:var(--text);font-family:var(--font);cursor:pointer;padding:4px 10px;font-size:13px;font-weight:500;transition:border-color .15s}#file-label:hover{border-color:var(--text2)}#file-name{font-family:var(--font);color:var(--text2);text-overflow:ellipsis;white-space:nowrap;max-width:200px;font-size:12px;overflow:hidden}.tb-btn{background:var(--bg);border:1px solid var(--border);color:var(--text);font-family:var(--font);cursor:pointer;padding:4px 12px;font-size:13px;font-weight:500;transition:border-color .15s}.tb-btn:hover{border-color:var(--text2)}.tb-btn.active{border-color:var(--text);color:var(--text)}#speed-select,#msg-select{background:var(--bg);border:1px solid var(--border);color:var(--text);font-family:var(--font);padding:3px 6px;font-size:12px}.tb-toggle{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:6px;display:flex}.tb-toggle input{appearance:none;background:var(--border);cursor:pointer;border-radius:0;flex-shrink:0;width:28px;height:14px;transition:background .15s;position:relative}.tb-toggle input:after{content:"";background:var(--text2);border-radius:0;width:10px;height:10px;transition:transform .15s,background .15s;position:absolute;top:2px;left:2px}.tb-toggle input:checked{background:var(--text2)}.tb-toggle input:checked:after{background:var(--bg);transform:translate(14px)}.tb-toggle input:disabled{opacity:.3;cursor:default}.tb-toggle-label{font-family:var(--font);color:var(--text2);font-size:12px;transition:color .15s}.tb-toggle input:checked~.tb-toggle-label{color:var(--text)}#time-display{font-family:var(--font);color:var(--text);text-align:left;min-width:120px;font-size:13px;font-weight:600}.tb-sep{background:var(--border);width:1px;height:20px}#stats-panel h2{font-family:var(--font);text-transform:uppercase;letter-spacing:.1em;color:var(--text2);margin-bottom:8px;font-size:13px;font-weight:400}.stat-group{margin-bottom:16px}.stat-group h3{font-family:var(--font);text-transform:uppercase;letter-spacing:.06em;color:var(--text2);margin-bottom:4px;font-size:11px;font-weight:400}.stat-row{justify-content:space-between;padding:2px 0;font-size:12px;display:flex}.stat-row .label{color:var(--text2);font-weight:400}.stat-row .value{color:var(--text);font-weight:600}#country-dist{border-top:1px solid var(--border);flex-shrink:0;padding:8px 12px}#country-dist:empty{display:none}#country-dist h3,#bw-dist h3{font-family:var(--font);text-transform:uppercase;letter-spacing:.06em;color:var(--text2);margin-bottom:4px;font-size:11px;font-weight:400}#bw-dist{border-top:1px solid var(--border);flex-shrink:0;padding:8px 12px}#bw-dist:empty{display:none}.cd-row{align-items:center;gap:6px;padding:1px 0;font-size:10px;display:flex}.cd-label{width:22px;color:var(--text2);text-transform:uppercase;letter-spacing:.03em;flex-shrink:0}.cd-bar-bg{background:var(--border-subtle);flex:1;height:6px}.cd-bar{background:var(--text3);height:100%}.cd-count{text-align:right;width:24px;color:var(--text2);flex-shrink:0;font-weight:600}#charts-section{border-top:1px solid var(--border);margin-top:16px;padding-top:12px}.chart-wrap{margin-bottom:14px;position:relative}.chart-wrap h3{font-family:var(--font);text-transform:uppercase;letter-spacing:.06em;color:var(--text2);margin-bottom:4px;font-size:11px;font-weight:400}.chart-wrap svg{display:block;overflow:visible}.chart-tooltip{pointer-events:none;border:1px solid var(--border);font-size:10px;font-family:var(--font);color:var(--text);z-index:10;white-space:nowrap;background:#0c0a09f2;border-radius:0;padding:5px 8px;line-height:1.5;display:none;position:absolute}.chart-tooltip .tt-time{color:var(--text2);font-size:9px}#event-log-header{font-family:var(--font);text-transform:uppercase;letter-spacing:.1em;color:var(--text2);flex-shrink:0;justify-content:space-between;align-items:center;padding:12px 12px 8px;font-size:13px;font-weight:400;display:flex}#event-log-header .clear-filter{color:var(--text);cursor:pointer;letter-spacing:0;text-transform:none;font-size:11px;font-weight:500;display:none}#event-log-list{flex:1;font-size:11px;overflow-y:auto}.ev-entry{border-bottom:1px solid var(--border-subtle);cursor:default;gap:8px;padding:3px 12px;display:flex}.ev-entry:hover{background:var(--border-subtle);border-left:2px solid var(--text2);padding-left:10px}.ev-entry .ev-ts{color:var(--text2);flex-shrink:0;min-width:70px}.ev-entry .ev-node{color:var(--text);flex-shrink:0;min-width:28px}.ev-entry .ev-type{flex-shrink:0;min-width:24px;font-weight:600}.ev-entry .ev-detail{color:var(--text2);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ev-type-ph,.ev-type-ps{color:var(--slate)}.ev-type-ss{color:var(--text)}.ev-type-sd{color:var(--green)}.ev-type-cs,.ev-type-cr{color:var(--useless)}.ev-type-ce{color:var(--red)}.ev-type-sx{color:var(--text2)}.ev-type-ru{color:var(--routing)}.ev-type-po{color:var(--slate)}.ev-type-sp{color:var(--routing)}#event-type-filter{border-bottom:1px solid var(--border);flex-wrap:wrap;flex-shrink:0;align-items:center;gap:3px;padding:4px 12px 6px;display:flex}#event-type-filter:empty{display:none}.etf-actions{gap:3px;margin-right:4px;display:flex}.etf-action{border:1px solid var(--border);font-family:var(--font);color:var(--text2);cursor:pointer;background:0 0;border-radius:0;padding:1px 5px;font-size:9px;font-weight:400;transition:border-color .15s,color .15s}.etf-action:hover{border-color:var(--text2);color:var(--text)}.etf-tag{font-family:var(--font);border:1px solid var(--border);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:0;padding:1px 5px;font-size:10px;font-weight:600;transition:opacity .1s,border-color .1s}.etf-tag.off{opacity:.3}#tl-scrubber{align-items:center;gap:12px;width:100%;display:flex}#tl-track-wrap{flex:1;position:relative}#tl-track-wrap input[type=range]{appearance:none;background:var(--idle);cursor:pointer;border-radius:0;outline:none;width:100%;height:8px}#tl-scrubber input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--text2);cursor:pointer;border-radius:0;width:18px;height:18px}#tl-scrubber input[type=range]::-moz-range-thumb{background:var(--text2);cursor:pointer;border:none;border-radius:0;width:18px;height:18px}#tl-time{color:var(--text);text-align:right;flex-shrink:0;min-width:110px;font-size:13px;font-weight:600}#tl-markers{width:100%;height:6px;margin-top:14px;display:none;position:relative}#tl-markers:not(:empty){display:block}.tl-marker{cursor:pointer;border-radius:0;width:3px;height:6px;transition:height .1s,top .1s;position:absolute;top:0;transform:translate(-1px)}.tl-marker:hover{height:10px;top:-2px}#tl-legend{z-index:15;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);border:1px solid var(--border);background:#0c0a09cc;border-radius:0;flex-direction:column;gap:3px;padding:8px 12px;display:flex;position:absolute;bottom:24px;right:12px}#tl-legend:empty{display:none}#tl-legend-title{font-family:var(--font);text-transform:uppercase;letter-spacing:.08em;color:var(--text2);margin-bottom:2px;font-size:10px;font-weight:400}.tl-legend-item{font-size:10px;font-family:var(--font);color:var(--text2);letter-spacing:.03em;cursor:pointer;white-space:nowrap;align-items:center;gap:6px;font-weight:400;transition:color .15s;display:flex}.tl-legend-item:hover{color:var(--text)}.tl-legend-dot{border-radius:0;flex-shrink:0;width:6px;height:6px}.tl-legend-label{flex:1}.tl-legend-time{color:var(--text);text-align:right;margin-left:12px;font-weight:600}#node-legend{z-index:15;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);border:1px solid var(--border);background:#0c0a09cc;border-radius:0;flex-direction:column;gap:3px;padding:8px 12px;display:none;position:absolute;top:12px;right:12px}#node-legend.visible{display:flex}.nl-titlebar{justify-content:space-between;align-items:center;margin-bottom:2px;display:flex}.nl-title{font-family:var(--font);text-transform:uppercase;letter-spacing:.08em;color:var(--text2);font-size:10px;font-weight:400}#settings-btn{color:var(--text2);cursor:pointer;background:0 0;border:none;padding:0;line-height:0;transition:color .15s}#settings-btn:hover,#settings-btn.active{color:var(--text)}#legend-fills,#legend-rings{flex-direction:column;gap:3px;display:flex}#legend-fills:empty,#legend-rings:empty{display:none}.nl-section-label{font-family:var(--font);text-transform:uppercase;letter-spacing:.06em;color:var(--text3);margin-top:2px;font-size:9px;font-weight:400}.nl-item{color:var(--text2);letter-spacing:.02em;align-items:center;gap:6px;font-size:10px;font-weight:400;display:flex}.nl-dot{border-radius:0;flex-shrink:0;width:7px;height:7px}.nl-ring{box-sizing:border-box;background:0 0;border:2px solid;border-radius:0;flex-shrink:0;width:7px;height:7px}#load-progress{z-index:16;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);border:1px solid var(--border);background:#0c0a09e0;border-radius:0;flex-direction:column;gap:6px;min-width:220px;max-width:320px;padding:8px 12px;display:none;position:absolute;top:12px;left:12px}#load-progress.visible{display:flex}#lp-title{font-family:var(--font);text-transform:uppercase;letter-spacing:.08em;color:var(--text2);font-size:10px;font-weight:400}#lp-status{font-family:var(--font);color:var(--text);min-height:16px;font-size:11px;font-weight:400;line-height:1.4}#lp-bar{background:var(--border-subtle);height:6px;position:relative;overflow:hidden}#lp-fill{background:linear-gradient(90deg, var(--slate), var(--receiving));width:0%;transition:width .15s;position:absolute;inset:0 auto 0 0}#load-progress.indeterminate #lp-fill{width:35%;transition:none;animation:1.1s linear infinite lp-indeterminate}@keyframes lp-indeterminate{0%{transform:translate(-120%)}to{transform:translate(320%)}}#settings-panel{border-top:1px solid var(--border);margin-top:6px;padding-top:6px;display:none}#settings-panel.open{display:block}.sp-section{flex-direction:column;gap:6px;display:flex}.sp-section+.sp-section{border-top:1px solid var(--border);margin-top:6px;padding-top:6px}.sp-header{justify-content:space-between;align-items:center;margin-bottom:2px;display:flex}.sp-header>span:first-child{font-family:var(--font);text-transform:uppercase;letter-spacing:.06em;color:var(--text2);font-size:10px;font-weight:400}.sp-actions{gap:4px;display:flex}.sp-action{border:1px solid var(--border);font-family:var(--font);color:var(--text2);cursor:pointer;background:0 0;border-radius:0;padding:1px 6px;font-size:9px;font-weight:400;transition:border-color .15s,color .15s}.sp-action:hover{border-color:var(--text2);color:var(--text)}.sp-toggle{cursor:pointer;-webkit-user-select:none;user-select:none;font-family:var(--font);color:var(--text2);align-items:center;gap:6px;font-size:11px;display:flex}.sp-toggle input{appearance:none;background:var(--border);cursor:pointer;border-radius:0;flex-shrink:0;width:24px;height:12px;transition:background .15s;position:relative}.sp-toggle input:after{content:"";background:var(--text2);border-radius:0;width:8px;height:8px;transition:transform .15s,background .15s;position:absolute;top:2px;left:2px}.sp-toggle input:checked{background:var(--text2)}.sp-toggle input:checked:after{background:var(--bg);transform:translate(12px)}.sp-dot{border-radius:0;flex-shrink:0;width:6px;height:6px}.sp-label{transition:color .15s}.sp-toggle input:checked~.sp-label{color:var(--text)}#mode-switcher{z-index:15;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);border:1px solid var(--border);background:#0c0a09cc;border-radius:0;gap:0;display:flex;position:absolute;top:12px;left:50%;overflow:hidden;transform:translate(-50%)}.mode-tab{border:none;border-right:1px solid var(--border);font-family:var(--font);color:var(--text2);cursor:pointer;letter-spacing:.03em;background:0 0;padding:5px 14px;font-size:11px;font-weight:500;transition:color .15s,background .15s}.mode-tab:last-child{border-right:none}.mode-tab:hover{color:var(--text);background:#ffffff08}.mode-tab.active{color:var(--text);background:#ffffff0d}#map-container canvas{outline:none;width:100%;height:100%}#ring-canvas{pointer-events:none;z-index:1;position:absolute;top:0;left:0}#map-container .deck-tooltip{display:none!important}#empty-state{text-align:center;color:var(--text2);font-family:var(--font);z-index:10;pointer-events:none;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}#empty-state h1{color:var(--text);letter-spacing:.06em;margin-bottom:8px;font-size:24px;font-weight:400}#empty-state p{font-size:14px;font-weight:400}#load-example{pointer-events:auto;color:var(--accent);cursor:pointer;font-size:13px;font-family:var(--font);margin-top:12px;text-decoration:none;display:inline-block}#load-example:hover{text-decoration:underline}#tooltip{pointer-events:none;border:1px solid var(--border);font-size:11px;font-family:var(--font);color:var(--text);z-index:100;white-space:nowrap;background:#0c0a09f2;border-radius:0;min-width:140px;padding:6px 10px;line-height:1.5;display:none;position:absolute}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:var(--bg)}::-webkit-scrollbar-thumb{background:var(--border);border-radius:0}::-webkit-scrollbar-thumb:hover{background:var(--text3)}#decoder-picker{position:relative}#decoder-btn{font-size:12px}#decoder-btn .dd-badge{opacity:.5;margin-left:4px;font-size:9px}#decoder-btn .dd-custom-badge{color:var(--accent);margin-left:4px;font-size:9px}.dd-dropdown{background:var(--panel);border:1px solid var(--border);z-index:50;flex-direction:column;min-width:200px;margin-top:4px;display:none;position:absolute;top:100%;left:0}.dd-dropdown.open{display:flex}.dd-item{font-family:var(--font);color:var(--text2);cursor:pointer;justify-content:space-between;align-items:center;padding:6px 12px;font-size:12px;transition:background .1s,color .1s;display:flex}.dd-item:hover{background:var(--border-subtle);color:var(--text)}.dd-item.active{color:var(--text);font-weight:600}.dd-item .dd-remove{color:var(--text3);font-family:var(--font);cursor:pointer;background:0 0;border:none;padding:0 2px;font-size:14px;line-height:1;transition:color .1s}.dd-item .dd-remove:hover{color:var(--red)}.dd-divider{background:var(--border);height:1px;margin:2px 0}.dd-section-label{font-family:var(--font);text-transform:uppercase;letter-spacing:.06em;color:var(--text3);padding:6px 12px 2px;font-size:9px;font-weight:400}.dd-action{font-family:var(--font);color:var(--accent);cursor:pointer;padding:6px 12px;font-size:12px;transition:background .1s;display:block}.dd-action:hover{background:var(--border-subtle)}#dd-error{font-family:var(--font);color:var(--red);padding:6px 12px;font-size:11px;display:none}#dd-error.visible{display:block}#decoder-picker.prompt #decoder-btn{border-color:var(--red);color:var(--red)}
