.uplot,.uplot *,.uplot *:before,.uplot *:after{box-sizing:border-box}.uplot{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:1.5;width:min-content}.u-title{text-align:center;font-size:18px;font-weight:700}.u-wrap{position:relative;user-select:none}.u-over,.u-under{position:absolute}.u-under{overflow:hidden}.uplot canvas{display:block;position:relative;width:100%;height:100%}.u-axis{position:absolute}.u-legend{font-size:14px;margin:auto;text-align:center}.u-inline{display:block}.u-inline *{display:inline-block}.u-inline tr{margin-right:16px}.u-legend th{font-weight:600}.u-legend th>*{vertical-align:middle;display:inline-block}.u-legend .u-marker{width:1em;height:1em;margin-right:4px;background-clip:padding-box!important}.u-inline.u-live th:after{content:":";vertical-align:middle}.u-inline:not(.u-live) .u-value{display:none}.u-series>*{padding:4px}.u-series th{cursor:pointer}.u-legend .u-off>*{opacity:.3}.u-select{background:#00000012;position:absolute;pointer-events:none}.u-cursor-x,.u-cursor-y{position:absolute;left:0;top:0;pointer-events:none;will-change:transform}.u-hz .u-cursor-x,.u-vt .u-cursor-y{height:100%;border-right:1px dashed #607D8B}.u-hz .u-cursor-y,.u-vt .u-cursor-x{width:100%;border-bottom:1px dashed #607D8B}.u-cursor-pt{position:absolute;top:0;left:0;border-radius:50%;border:0 solid;pointer-events:none;will-change:transform;background-clip:padding-box!important}.u-axis.u-off,.u-select.u-off,.u-cursor-x.u-off,.u-cursor-y.u-off,.u-cursor-pt.u-off{display:none}:root{color-scheme:dark;font-family:system-ui,-apple-system,sans-serif;background:#111;color:#eee}*{box-sizing:border-box}body{margin:0}.app{display:flex;flex-direction:column;min-height:100vh;padding:1rem;gap:1rem}.topbar{display:flex;align-items:center;justify-content:space-between;gap:1rem}.topbar-left,.topbar-right{display:flex;align-items:center;gap:.75rem}.view-switcher{display:flex;align-items:center;gap:.5rem;font-size:1rem;font-weight:600;color:#ddd;padding:.2rem .6rem}.car-selector{position:relative}.car-selector-btn{display:inline-flex;align-items:center;gap:.5rem;background:#1c1c1c;color:#ddd;border:1px solid #2a2a2a;border-radius:4px;padding:.3rem .7rem;font:inherit;font-family:monospace;cursor:pointer;transition:background .15s,border-color .15s}.car-selector-btn:hover:not(:disabled){background:#2a2a2a}.car-selector-btn:disabled{opacity:.5;cursor:not-allowed}.car-selector-arrow{color:#888;font-size:.7rem}.car-selector-dot{width:.6rem;height:.6rem;border-radius:50%}.car-selector-dot.live{background:#4ade80;box-shadow:0 0 6px #4ade8099}.car-selector-dot.offline{background:#555}.car-selector-list{position:absolute;top:calc(100% + .25rem);right:0;min-width:18rem;background:#1c1c1c;border:1px solid #2a2a2a;border-radius:4px;list-style:none;padding:.25rem;margin:0;z-index:10;box-shadow:0 8px 24px #00000080}.car-selector-item{display:grid;grid-template-columns:auto 1fr auto;gap:.5rem;align-items:center;padding:.4rem .5rem;border-radius:3px;cursor:pointer}.car-selector-item:hover:not(.disabled){background:#ffffff0a}.car-selector-item.selected{background:#4ade801a}.car-selector-item.disabled{opacity:.45;cursor:not-allowed}.car-selector-name{font-family:monospace;color:#ddd}.car-selector-meta{font-size:.8rem;color:#888}.conn{display:flex;align-items:center;gap:.5rem;font-size:.9rem}.conn-dot{width:.7rem;height:.7rem;border-radius:50%;background:#888}.conn-connected .conn-dot{background:#4ade80}.conn-waiting-for-data .conn-dot{background:#fbbf24}.conn-stale .conn-dot{background:#fb923c}.conn-disconnected .conn-dot{background:#f87171}.conn-age{color:#888}.summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:.5rem}.stat{background:#1c1c1c;border:1px solid #2a2a2a;border-radius:6px;padding:.5rem .75rem}.stat>.stat-label{margin-bottom:.5rem}.stat-label{font-size:.85rem;color:#888}.stat-value{font-size:1rem;font-family:monospace}.stat-box-content{display:table}.stat-line{display:table-row;line-height:1.2rem}.stat-line>*{display:table-cell}.stat-line .stat-label{padding-right:.5rem}.airs{background:#1c1c1c;border:1px solid #2a2a2a;border-radius:6px;padding:.5rem .75rem;transition:background-color .3s ease-out,border-color .3s ease-out}.airs.air-warning{background-color:#f87171b3;border-color:#f87171e6;transition:background-color 5s linear,border-color 5s linear}.airs-label{font-size:.85rem;color:#888;margin-bottom:.5rem}.airs-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:.5rem}.air{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;border-radius:6px;background:#ffffff0a}.air-num{font-size:1.1rem;font-weight:600;color:#888}.air-state{font-family:monospace;font-size:1rem;letter-spacing:.05em}.air-open{background:#4ade8026}.air-open .air-num,.air-open .air-state{color:#4ade80}.air-closed{background:#fbbf2426}.air-closed .air-num,.air-closed .air-state{color:#fbbf24}.overlay{position:fixed;inset:0;background:#0000004d;backdrop-filter:blur(2px);display:flex;align-items:center;justify-content:center;z-index:1000}.overlay-card{background:#1c1c1c;border:1px solid #2a2a2a;border-radius:8px;padding:2rem 2.5rem;max-width:28rem;text-align:center;display:flex;flex-direction:column;align-items:center;gap:.5rem}.overlay-card h2{margin:.5rem 0 0;font-size:1.25rem}.overlay-card p{margin:0;color:#bbb}.overlay-error{margin-top:.5rem!important;padding:.5rem .75rem;background:#f871711f;border:1px solid rgba(248,113,113,.3);border-radius:4px;font-size:.85rem;color:#f87171!important;font-family:monospace;word-break:break-word}.overlay-spinner{width:2.5rem;height:2.5rem;border:3px solid rgba(255,255,255,.1);border-top-color:#4ade80;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}main{display:flex;flex-direction:column;gap:1rem}section{background:#1c1c1c;border:1px solid #2a2a2a;border-radius:6px;padding:.5rem}.chart{width:100%}.time-range{display:flex;align-items:center;gap:.4rem;font-size:.85rem}.time-range-label{color:#888;margin-right:.3rem}.time-range-btn{background:#1c1c1c;color:#ddd;border:1px solid #2a2a2a;border-radius:4px;padding:.3rem .7rem;font:inherit;cursor:pointer;transition:background .15s,border-color .15s}.time-range-btn:hover{background:#2a2a2a}.time-range-btn.active{background:#2a4a2a;border-color:#4ade80;color:#4ade80}.settings-bar{display:flex;flex-wrap:wrap;align-items:center;gap:1.5rem;font-size:.85rem;color:#ddd}.chart-section{display:grid;grid-template-columns:1fr 14rem;gap:.5rem .75rem;align-items:start}.chart-section-plot{min-width:0}@media (max-width: 720px){.chart-section{grid-template-columns:1fr}}.temp-filter{display:inline-flex;align-items:center;gap:.4rem;cursor:pointer;user-select:none}.temp-filter input[type=checkbox]{margin:0;cursor:pointer}.temp-filter-count{color:#fbbf24;font-family:monospace}.extremes{font-size:.85rem}.extremes-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:1px}.extremes-gap{text-align:center;color:#666;font-size:.75rem;padding:.35rem .4rem;font-style:italic}.extremes-row{display:grid;grid-template-columns:.75rem 1fr auto;gap:.5rem;align-items:center;padding:.25rem .4rem;border-radius:3px;cursor:pointer;user-select:none;transition:background .1s}.extremes-row:hover{background:#ffffff0a}.extremes-row.selected{background:#4ade801f;outline:1px solid rgba(74,222,128,.3)}.extremes-dot{width:.75rem;height:.75rem;border-radius:50%}.extremes-label{font-family:monospace;color:#ddd}.extremes-value{font-family:monospace;color:#bbb;text-align:right}.extremes-empty{color:#555;padding:.25rem .4rem}.u-title{color:#eee;font-weight:600}.u-wrap,.u-label{color:#bbb}.u-cursor-x,.u-cursor-y{background:#ffffff4d}.u-select{background:#ffffff1f;border:1px solid rgba(255,255,255,.25)}.view-switcher-btn{background:#1c1c1c;color:#bbb;border:1px solid #2a2a2a;border-radius:4px;padding:.3rem .7rem;font:inherit;font-weight:600;cursor:pointer;transition:background .15s,border-color .15s,color .15s}.view-switcher-btn:hover{background:#2a2a2a}.view-switcher-btn.active{background:#4ade801a;border-color:#4ade80;color:#4ade80}.can-explorer{display:flex;flex-direction:column;gap:.75rem;width:100%;max-width:600px;margin:0 auto}.can-search{width:100%;background:#1c1c1c;color:#eee;border:1px solid #2a2a2a;border-radius:4px;padding:.5rem .7rem;font:inherit}.can-search:focus{outline:none;border-color:#4ade80}.can-section-title{font-weight:600;color:#fbbf24;margin-bottom:.25rem}.can-favorites{background:#fbbf240f;border:1px solid rgba(251,191,36,.25);border-radius:4px;padding:.5rem .6rem}.can-fav-msg{color:#888;font-size:.85em}.can-empty{color:#777;padding:.4rem .2rem;font-style:italic}.can-tree{display:flex;flex-direction:column;gap:.3rem}.can-msg{background:#161616;border:1px solid #2a2a2a;border-radius:4px;overflow:hidden}.can-msg-header{display:grid;grid-template-columns:1.2rem 1fr auto auto auto;align-items:center;gap:.6rem;padding:.45rem .6rem;cursor:pointer}.can-msg-header:hover{background:#ffffff08}.can-msg-arrow{color:#888;font-size:.8rem}.can-msg-name{font-family:monospace;color:#eee;font-weight:600}.can-msg-id{font-family:monospace;color:#4ade80}.can-msg-dlc{font-family:monospace;color:#888;font-size:.85em}.can-age{color:#999;font-size:.85em;white-space:nowrap}.can-msg-signals{border-top:1px solid #2a2a2a;padding:.25rem .5rem .45rem}.can-signal{display:grid;grid-template-columns:1.6rem 1fr auto;align-items:center;gap:.5rem;padding:.25rem .4rem;border-radius:3px}.can-signal:hover{background:#ffffff0d}.can-favorites .can-signal:not(:last-child){border-bottom:1px solid rgba(251,191,36,.12)}.can-signal-name{font-family:monospace;color:#ccc}.can-signal-value{font-family:monospace;color:#eee;text-align:right}.can-signal-unit{color:#888}.can-star{background:none;border:none;cursor:pointer;color:#555;font-size:1rem;padding:0;line-height:1}.can-star:hover,.can-star.active{color:#fbbf24}.btn{display:inline-flex;align-items:center;gap:.45rem;background:#1c1c1c;color:#ddd;border:1px solid #2a2a2a;border-radius:4px;padding:.4rem .8rem;font:inherit;cursor:pointer;transition:background .15s,border-color .15s}.btn:hover:not(:disabled){background:#2a2a2a}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-live{border-color:#2f6f43}.btn-stop{border-color:#7f3030;color:#f3b4b4}.btn-icon{background:none;border:none;color:#888;font-size:1rem;cursor:pointer;padding:.3rem .5rem;border-radius:4px}.btn-icon:hover{background:#2a2a2a;color:#eee}.live-dot{width:.6rem;height:.6rem;border-radius:50%;background:#555}.live-dot.on{background:#4ade80;box-shadow:0 0 6px #4ade8099}.live-dot.off{background:#555}.archive{display:flex;flex-direction:column;gap:1rem;max-width:60rem;width:100%;margin:0 auto}.archive-header{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}.archive-header h1{font-size:1.4rem;margin:0}.archive-actions{display:flex;align-items:center;gap:.6rem}.archive-empty{color:#888;padding:3rem 1rem;text-align:center;border:1px dashed #2a2a2a;border-radius:6px}.archive-empty p{margin:.3rem 0}.session-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.5rem}.session-item{display:flex;align-items:center;justify-content:space-between;gap:1rem;background:#1a1a1a;border:1px solid #2a2a2a;border-radius:6px;padding:.7rem .9rem;cursor:pointer;transition:background .15s}.session-item:hover{background:#232323}.session-item-main{display:flex;align-items:center;gap:.6rem}.session-name{font-weight:600}.session-car-badge{font-family:monospace;font-size:.8rem;background:#262626;border:1px solid #333;border-radius:4px;padding:.1rem .4rem;color:#9ad}.session-badge{font-size:.7rem;color:#c8a24a;border:1px solid #5a4a20;border-radius:4px;padding:.05rem .35rem}.session-item-meta{display:flex;gap:.4rem;color:#888;font-size:.85rem;margin-top:.2rem}.session-header{display:flex;flex-direction:column;gap:.5rem;background:#1a1a1a;border:1px solid #2a2a2a;border-radius:6px;padding:.7rem .9rem}.session-header-top{display:flex;align-items:center;gap:.7rem;flex-wrap:wrap}.session-name-input{background:#111;color:#eee;border:1px solid #2a2a2a;border-radius:4px;padding:.35rem .6rem;font:inherit;font-weight:600;min-width:14rem}.session-note-input{background:#111;color:#ccc;border:1px solid #222;border-radius:4px;padding:.3rem .6rem;font:inherit;font-size:.9rem;width:100%}.session-meta{color:#888;font-size:.85rem}.session-header-actions{display:flex;align-items:center;gap:.5rem;margin-left:auto}.is-stale{opacity:.4;filter:grayscale(.6)}.stat-warn{margin-left:.3rem;color:#e0a23a;font-size:.85em}.dcu-panel{background:#1c1c1c;border:1px solid #2a2a2a;border-radius:6px;padding:.75rem 1rem 1rem}.dcu-panel-head{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:.75rem}.dcu-panel-head h3{margin:0;font-size:1.05rem}.dcu-empty{color:#888;margin:0}.dcu-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:.6rem}.dcu-cell{background:#161616;border:1px solid #2a2a2a;border-radius:5px;padding:.45rem .6rem}.dcu-cell-label{font-size:.8rem;color:#888;margin-bottom:.2rem}.dcu-cell-value{font-family:monospace;font-size:1.1rem}.dcu-cell-unit{color:#888;font-size:.85rem}.dcu-btn{background:#1c1c1c;color:#ddd;border:1px solid #2a2a2a;border-radius:4px;padding:.45rem .9rem;font:inherit;cursor:pointer}.dcu-btn:hover:not(:disabled){background:#2a2a2a}.dcu-btn:disabled{opacity:.5;cursor:not-allowed}.dcu-btn-primary{border-color:#2f6f43;background:#1d3d2a;color:#d8f3e0}.dcu-btn-primary:hover:not(:disabled){background:#265137}.dcu-modal-backdrop{position:fixed;inset:0;background:#0009;display:flex;align-items:center;justify-content:center;padding:1rem;z-index:100}.dcu-modal{background:#1a1a1a;border:1px solid #333;border-radius:8px;width:100%;max-width:440px;max-height:90vh;overflow:auto;display:flex;flex-direction:column}.dcu-modal-header{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;border-bottom:1px solid #2a2a2a;font-weight:600}.dcu-modal-close{background:none;border:none;color:#888;font-size:1.1rem;cursor:pointer}.dcu-modal-body{padding:1rem;display:flex;flex-direction:column;gap:.6rem}.dcu-modal-status{text-align:center;padding:1.5rem 1rem}.dcu-ok{color:#4ade80}.dcu-err{color:#f3b4b4}.dcu-edit-row{display:grid;grid-template-columns:1fr auto auto;align-items:center;gap:.6rem}.dcu-edit-label{color:#ccc}.dcu-edit-input{display:inline-flex;align-items:center;gap:.35rem}.dcu-edit-input input{width:5.5rem;background:#111;color:#eee;border:1px solid #333;border-radius:4px;padding:.35rem .5rem;font:inherit;text-align:right}.dcu-edit-unit{color:#888;font-size:.85rem;min-width:2rem}.dcu-edit-deviation{grid-column:1 / -1;justify-self:end;font-size:.75rem;color:#e0a23a;font-family:monospace}.dcu-modal-footer{display:flex;justify-content:flex-end;gap:.6rem;padding:.75rem 1rem;border-top:1px solid #2a2a2a}.dcu-confirm-text{margin:0 0 .5rem}.dcu-confirm-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.35rem}.dcu-confirm-list li{display:flex;justify-content:space-between;gap:1rem;border-bottom:1px solid #242424;padding-bottom:.3rem}.dcu-confirm-list strong{font-family:monospace}@media (max-width: 540px){.dcu-modal-backdrop{padding:0;align-items:stretch}.dcu-modal{max-width:none;max-height:100vh;border-radius:0}.dcu-edit-input input{width:6.5rem;padding:.5rem}.dcu-btn{padding:.6rem 1rem}}.flags{display:flex;flex-direction:column;gap:.4rem}.flag{padding:.4rem .6rem;border-radius:6px;font-size:1rem;letter-spacing:.02em}.flag-ok{background:#4ade8026;color:#4ade80}.flag-alarm{background:#f8717126;color:#f87171;font-weight:600}.flag-muted{color:#888}.amk-panel{background:#1c1c1c;border:1px solid #2a2a2a;border-radius:6px;padding:.75rem 1rem 1rem;margin-bottom:1rem}.amk-panel-head h3{margin:0 0 .75rem;font-size:1.05rem}.amk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:.6rem}.amk-card{background:#161616;border:1px solid #2a2a2a;border-radius:5px;padding:.6rem .7rem;display:flex;flex-direction:column;gap:.55rem}.amk-card-pos{font-weight:600;font-size:.95rem;color:#ccc;letter-spacing:.04em}.amk-temps{display:flex;flex-direction:column;gap:.2rem}.amk-temp{display:flex;justify-content:space-between;gap:.5rem}.amk-temp-label{color:#888;font-size:.85rem}.amk-temp-value{font-family:monospace}.amk-card .flags{flex-direction:row;flex-wrap:wrap;gap:.3rem}.amk-card .flag{padding:.2rem .45rem;font-size:.8rem;border-radius:4px}
