:root,:root[data-theme=light]{color-scheme:light;--surface-0: #f4f4f2;--surface-1: #fcfcfb;--surface-2: #efefec;--border: #dedcd5;--border-strong: #c3c2b7;--text-primary: #0b0b0b;--text-secondary: #52514e;--text-muted: #7c7a73;--series-1: #2a78d6;--series-2: #1baf7a;--status-good: #0ca30c;--status-warning: #fab219;--status-critical: #d03b3b;--occupied: #d03b3b;--vacant: #0ca30c;--asphalt: #d8d7d1;--asphalt-2: #cfcec7;--paint: #fbfbf9;--stopper: #8a8880;--stopper-top: #a5a39a;--sensor-body: #2f2e2b;--sensor-top: #4a4843;--tire: #2c2b28;--rim: #cfcec8;--glass: #cfe0ee;--stall-wall: #e7e6e1;--impact: #ff3d8b;--sign-bg: #f7f6f2;--fault-bg: #fdf3f3;--occ-yellow: #e0a800;--occ-blue: #2a78d6;--car: #f3f5fa;--grid: #e6e5e0;--shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 4px 12px rgba(0, 0, 0, .05);--radius: 12px}@media (prefers-color-scheme: dark){:root{color-scheme:dark;--surface-0: #121211;--surface-1: #1a1a19;--surface-2: #232322;--border: #33332f;--border-strong: #4a4a45;--text-primary: #ffffff;--text-secondary: #c3c2b7;--text-muted: #8f8e85;--series-1: #3987e5;--series-2: #199e70;--occupied: #e66767;--vacant: #2fbc2f;--asphalt: #2b2b29;--asphalt-2: #333330;--paint: #d7d6cf;--stopper: #55534c;--stopper-top: #6b695f;--sensor-body: #3b3a34;--sensor-top: #56544c;--tire: #0d0d0c;--rim: #8d8b84;--glass: #2f4356;--stall-wall: #201f1d;--impact: #ff4d97;--sign-bg: #2b2a27;--fault-bg: #2a1c1c;--occ-yellow: #fab219;--occ-blue: #3987e5;--car: #f4f6fb;--grid: #2c2c2a;--shadow: 0 1px 2px rgba(0, 0, 0, .3), 0 4px 12px rgba(0, 0, 0, .35)}}:root[data-theme=dark]{color-scheme:dark;--surface-0: #121211;--surface-1: #1a1a19;--surface-2: #232322;--border: #33332f;--border-strong: #4a4a45;--text-primary: #ffffff;--text-secondary: #c3c2b7;--text-muted: #8f8e85;--series-1: #3987e5;--series-2: #199e70;--occupied: #e66767;--vacant: #2fbc2f;--asphalt: #2b2b29;--asphalt-2: #333330;--paint: #d7d6cf;--stopper: #55534c;--stopper-top: #6b695f;--sensor-body: #3b3a34;--sensor-top: #56544c;--tire: #0d0d0c;--rim: #8d8b84;--glass: #2f4356;--stall-wall: #201f1d;--impact: #ff4d97;--sign-bg: #2b2a27;--fault-bg: #2a1c1c;--occ-yellow: #fab219;--occ-blue: #3987e5;--car: #f4f6fb;--grid: #2c2c2a;--shadow: 0 1px 2px rgba(0, 0, 0, .3), 0 4px 12px rgba(0, 0, 0, .35)}*{box-sizing:border-box}html,body{height:100%}body{margin:0;background:var(--surface-0);color:var(--text-primary);font-family:Pretendard,-apple-system,Segoe UI,Malgun Gothic,system-ui,sans-serif;font-size:13px;line-height:1.45;-webkit-font-smoothing:antialiased;transition:background-color .16s ease,color .16s ease}.app{max-width:1760px;height:100dvh;overflow:hidden;margin:0 auto;padding:8px 18px;display:flex;flex-direction:column;gap:8px}@media (max-width: 900px){.app{height:auto;min-height:100dvh;overflow:visible}}.header{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap}.header h1{font-size:17px;font-weight:650;margin:0;letter-spacing:-.01em}.header .sub{color:var(--text-muted);font-size:11px}.header-left{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}.header-right{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.conn{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--text-secondary)}.dot{width:8px;height:8px;border-radius:50%;flex:none}.dot.up{background:var(--status-good)}.dot.down{background:var(--status-critical)}.theme-toggle{display:flex;gap:2px;background:var(--surface-2);border:1px solid var(--border);padding:3px;border-radius:999px}.theme-toggle button{display:grid;place-items:center;width:28px;height:24px;border:0;border-radius:999px;background:transparent;color:var(--text-muted);cursor:pointer;padding:0}.theme-toggle button:hover{color:var(--text-secondary)}.theme-toggle button[aria-pressed=true]{background:var(--surface-1);color:var(--text-primary);box-shadow:var(--shadow)}.theme-toggle svg{width:14px;height:14px}.card{background:var(--surface-1);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:12px 14px;min-width:0}.card h2{font-size:13px;font-weight:600;margin:0 0 10px;color:var(--text-primary);letter-spacing:-.005em}.card h2 .hint{font-weight:400;color:var(--text-muted);font-size:11px;margin-left:7px}.spots{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}.spot{background:var(--surface-1);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:12px 14px;border-top:3px solid var(--slot-color, var(--border-strong));min-width:0}.spot-head{display:flex;align-items:center;justify-content:space-between;gap:12px}.spot-name{font-size:15px;font-weight:650;display:flex;align-items:center;gap:8px}.swatch{width:10px;height:10px;border-radius:3px;background:var(--slot-color);flex:none}.spot-loc{font-size:11px;color:var(--text-muted);font-weight:400}.state{display:inline-flex;align-items:center;gap:6px;white-space:nowrap;font-size:11.5px;font-weight:650;padding:3px 9px;border-radius:999px;border:1px solid currentColor}.state.occupied{color:var(--occupied)}.state.vacant{color:var(--vacant)}.state.unknown{color:var(--text-muted)}.state.fault{color:var(--status-critical)}.stall-figure{margin:8px 0 6px;border-radius:10px;overflow:hidden;background:var(--stall-wall);border:1px solid var(--border)}.stall-figure svg{display:block;width:100%;height:auto}.car{transition:transform .8s cubic-bezier(.32,.72,.3,1),opacity .4s ease}.sensor-wave{transform-box:fill-box;transform-origin:right center}.sensor-wave.active{animation:ping 2.1s ease-out infinite}.sensor-wave.active.w2{animation-delay:.7s}.sensor-wave.active.w3{animation-delay:1.4s}.sensor-wave.idle{opacity:0}@keyframes ping{0%{transform:scale(.55);opacity:.9}70%{transform:scale(1.15);opacity:0}to{transform:scale(1.15);opacity:0}}@media (prefers-reduced-motion: reduce){.car{transition:opacity .2s ease}.sensor-wave.active{animation:none;opacity:.4}}.stall-caption{display:flex;justify-content:center;gap:14px;padding:6px 8px;font-size:10.5px;color:var(--text-muted);border-top:1px solid var(--border);background:var(--surface-1)}.stall-caption span{display:inline-flex;align-items:center;gap:5px}.cap-mark{width:9px;height:9px;border-radius:2px;flex:none}.spot-meta{display:grid;grid-template-columns:repeat(2,1fr);gap:4px 14px}.meta-row{display:flex;justify-content:space-between;gap:8px;font-size:11.5px}.meta-row.wide{grid-column:1 / -1}.meta-row .k{color:var(--text-muted)}.meta-row .v{color:var(--text-secondary);font-variant-numeric:tabular-nums;font-weight:550}.meta-row .v.mono{font-size:10.5px;letter-spacing:.02em}.meta-row .v.fault{color:var(--status-critical);font-weight:700}.page{display:grid;grid-template-columns:320px 1fr;gap:8px;flex:1 1 auto;min-height:0}.page-right{display:flex;flex-direction:column;gap:8px;min-height:0}.history-card{display:flex;flex-direction:column;min-height:0;overflow:hidden}.history-scroll{margin-top:8px;overflow-y:auto}.history-scroll thead th{position:sticky;top:0;z-index:1;background:var(--surface-1)}.main-grid{display:grid;grid-template-columns:1.05fr 1.35fr 1fr;gap:10px;flex:1 1 auto;min-height:0}.main-grid>.card{display:flex;flex-direction:column;min-height:0;overflow:hidden}@media (max-width: 1500px){.page{grid-template-columns:280px 1fr}}@media (max-width: 1200px){.page{grid-template-columns:1fr}.history-card{max-height:40vh}.main-grid{grid-template-columns:1fr 1fr}}@media (max-width: 900px){.main-grid,.spots{grid-template-columns:1fr}}.fill{flex:1 1 auto;min-height:0;overflow-y:auto}.fill.chart{overflow:hidden;display:flex}.card-head{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-bottom:10px}.card-head h2{margin:0}.period-tabs{display:flex;gap:3px;background:var(--surface-2);padding:3px;border-radius:8px}.period-tabs button{border:0;background:transparent;color:var(--text-secondary);font:inherit;font-size:11.5px;font-weight:600;padding:4px 11px;border-radius:6px;cursor:pointer}.period-tabs button[aria-pressed=true]{background:var(--surface-1);color:var(--text-primary);box-shadow:var(--shadow)}.stat-tiles{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:10px}.tile{background:var(--surface-2);border-radius:9px;padding:9px 10px}.tile .label{font-size:10.5px;color:var(--text-muted);font-weight:600}.tile .value{font-size:19px;font-weight:680;letter-spacing:-.02em;margin-top:2px;font-variant-numeric:tabular-nums}.tile .foot{font-size:10px;color:var(--text-muted)}table.stats{width:100%;border-collapse:collapse;font-variant-numeric:tabular-nums}table.stats th,table.stats td{padding:6px;text-align:right}table.stats th:first-child,table.stats td:first-child{text-align:left}table.stats thead th{font-size:10.5px;font-weight:600;color:var(--text-muted);border-bottom:1px solid var(--border)}table.stats tbody td{border-bottom:1px solid var(--grid);font-size:12px;color:var(--text-secondary)}table.stats tbody tr:last-child td{border-bottom:0}table.stats tbody tr.total td{font-weight:650;color:var(--text-primary);border-top:1px solid var(--border-strong)}.sensor-cell{display:flex;align-items:center;gap:6px;color:var(--text-primary);font-weight:550}.legend{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-bottom:6px}.legend-item{display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--text-secondary)}.legend-swatch{width:10px;height:10px;border-radius:3px;flex:none}.chart-svg{display:block;width:100%;height:100%}.tick{font-size:10px;fill:var(--text-muted)}.gridline{stroke:var(--grid);stroke-width:1}.axis{stroke:var(--border-strong);stroke-width:1}.tooltip{position:fixed;pointer-events:none;z-index:20;background:var(--surface-1);border:1px solid var(--border-strong);border-radius:8px;box-shadow:var(--shadow);padding:8px 10px;font-size:12px;color:var(--text-primary);min-width:150px}.tooltip .t-title{font-weight:650;margin-bottom:5px}.tooltip .t-row{display:flex;align-items:center;gap:6px;justify-content:space-between}.tooltip .t-row .l{display:flex;align-items:center;gap:6px;color:var(--text-secondary)}.tooltip .t-row .v{font-variant-numeric:tabular-nums;font-weight:600}.log-tabs{display:flex;gap:3px;background:var(--surface-2);padding:3px;border-radius:8px}.log-tabs button{border:0;background:transparent;color:var(--text-secondary);font:inherit;font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:6px;cursor:pointer}.log-tabs button[aria-pressed=true]{background:var(--surface-1);color:var(--text-primary);box-shadow:var(--shadow)}table.log{width:100%;border-collapse:collapse;font-size:11.5px}.lot-side table.log{font-size:12.5px}.lot-side table.log th,.lot-side table.log td{padding:7px 8px}table.log th,table.log td{padding:5.5px 6px;text-align:left;border-bottom:1px solid var(--grid)}table.log thead th{font-size:10.5px;color:var(--text-muted);font-weight:600;border-bottom:1px solid var(--border)}table.log td{color:var(--text-secondary);font-variant-numeric:tabular-nums}table.log tbody tr:last-child td{border-bottom:0}.log-clickable .row-detail{cursor:pointer;transition:background .12s ease}.log-clickable .row-detail:hover{background:var(--surface-2)}.log-clickable .detail-cell{text-align:right;width:1%;color:var(--text-muted);font-weight:800;font-size:15px}.log-clickable .row-detail:hover .detail-cell{color:var(--accent, var(--occupied))}.periodic-toolbar{display:flex;align-items:center;gap:10px;padding:7px 0 6px}.sensor-select{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text-muted)}.sensor-select select{background:var(--surface-2);color:var(--text-primary);border:1px solid var(--border);border-radius:7px;padding:4px 9px;font-size:12px;max-width:200px;cursor:pointer}.history-scroll{overflow-x:auto}table.periodic-log{width:auto;min-width:100%}.periodic-log th,.periodic-log td{white-space:nowrap}.periodic-log td{padding-right:12px}.periodic-log .mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;letter-spacing:-.2px}.sd-modal{max-width:440px}.sd-h-tag{font-size:11px;font-weight:700;color:var(--text-muted);border:1px solid var(--grid);border-radius:999px;padding:1px 8px;margin-left:6px;vertical-align:middle}.sd-body{display:flex;flex-direction:column;gap:14px}.sd-block-head{display:flex;align-items:baseline;justify-content:space-between;font-weight:750;font-size:13px;margin-bottom:7px;padding-bottom:5px;border-bottom:1px solid var(--grid)}.sd-time{color:var(--text-muted);font-weight:500;font-size:12px}.sd-empty{color:var(--text-muted);font-size:13px;padding:12px 4px}.sd-meta{display:flex;flex-wrap:wrap;gap:6px 16px;margin-top:9px;font-size:12px;color:var(--text-muted)}.sd-meta b{color:var(--text-primary);font-weight:750;margin-left:3px}.sd-config{margin-top:11px;border-top:1px solid var(--grid);padding-top:9px}.sd-config-title{font-size:11px;color:var(--text-muted);margin-bottom:7px}.sd-config-grid{display:grid;grid-template-columns:1fr 1fr;gap:5px 14px;font-size:12px;color:var(--text-muted)}.sd-config-grid b{color:var(--text-secondary);font-weight:700;margin-left:3px}.badge{display:inline-flex;align-items:center;gap:5px;font-size:10.5px;font-weight:650;padding:1px 7px;border-radius:999px;border:1px solid currentColor}.badge.entry{color:var(--occupied)}.badge.exit{color:var(--vacant)}.empty{color:var(--text-muted);font-size:12px;padding:16px 0;text-align:center}.error-banner{background:color-mix(in srgb,var(--status-critical) 10%,var(--surface-1));border:1px solid var(--status-critical);color:var(--text-primary);border-radius:10px;padding:8px 12px;font-size:12.5px}.chart-box{flex:1 1 auto;min-width:0;min-height:0}.head-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end}.btn{display:inline-flex;align-items:center;gap:5px;border:1px solid var(--border-strong);background:var(--surface-2);color:var(--text-secondary);font:inherit;font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:7px;cursor:pointer;white-space:nowrap;text-decoration:none}.btn:hover:not(:disabled){color:var(--text-primary);border-color:var(--text-muted)}.btn:disabled{opacity:.45;cursor:not-allowed}.btn-excel{color:var(--status-good);border-color:color-mix(in srgb,var(--status-good) 45%,var(--border-strong))}.btn-excel:hover{color:var(--status-good);border-color:var(--status-good)}.controls{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:8px;padding-top:7px;border-top:1px solid var(--grid)}.controls-label{font-size:11px;color:var(--text-muted);margin-right:2px}.ctl-result{font-size:11px;font-weight:600}.ctl-result.ok{color:var(--status-good)}.ctl-result.ng{color:var(--status-critical)}.stat-tiles{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:10px;align-items:stretch}.tile{background:var(--surface-2);border-radius:9px;padding:9px 10px;display:flex;flex-direction:column;min-width:0}.tile .value{flex:1 1 auto;display:flex;align-items:center;white-space:nowrap;font-size:clamp(14px,1.35vw,19px)}.tile .foot{margin-top:auto}.status-panel{display:flex;flex-direction:column;gap:8px}.status-row{background:var(--surface-2);border-radius:9px;padding:8px 10px}.status-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:5px}.status-body{display:grid;grid-template-columns:1fr;gap:2px}.chip{font-size:10.5px;font-weight:650;padding:1px 8px;border-radius:999px;border:1px solid currentColor;white-space:nowrap}.chip.occupied{color:var(--occupied)}.chip.vacant{color:var(--vacant)}.chip.unknown{color:var(--text-muted)}.chip.fault{color:var(--status-critical)}.battery{display:inline-flex;align-items:center;gap:6px}.battery-track{width:42px;height:6px;border-radius:999px;overflow:hidden;background:var(--border);flex:none}.battery-fill{display:block;height:100%;border-radius:999px}.battery-fill.good{background:var(--status-good)}.battery-fill.warning{background:var(--status-warning)}.battery-fill.critical{background:var(--status-critical)}.alarm-box{margin-top:2px;border-top:1px solid var(--grid);padding-top:8px}.alarm-title{font-size:11px;font-weight:650;color:var(--text-muted);margin-bottom:6px}.alarm-none{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--status-good);font-weight:600}.alarm-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:5px}.alarm{display:flex;align-items:center;gap:6px;font-size:11.5px}.alarm.critical{color:var(--status-critical)}.alarm.warning{color:var(--status-warning)}.alarm-sensor{font-weight:700}.alarm-label{color:var(--text-secondary)}.badge.fault{color:var(--status-critical)}.badge.unknown{color:var(--text-muted)}.impact{animation:impact-shake 1.5s ease-in-out infinite;transform-box:fill-box;transform-origin:center}.impact-arc{animation:impact-pulse 1.5s ease-out infinite}.impact-arc.a2{animation-delay:.28s}@keyframes impact-shake{0%,62%,to{transform:translate(0)}66%{transform:translate(-1px,1px)}70%{transform:translate(1px,-1px)}74%{transform:translate(-1px)}78%{transform:translate(1px)}}@keyframes impact-pulse{0%{opacity:.15;transform:translateY(2px)}35%{opacity:1;transform:translateY(0)}to{opacity:.15;transform:translateY(-2px)}}@media (prefers-reduced-motion: reduce){.impact,.impact-arc{animation:none}}.sign-text{font-size:22px;font-weight:700;letter-spacing:.04em;fill:var(--text-primary)}.sign-text.placeholder{font-size:13px;font-weight:500;fill:var(--text-muted);letter-spacing:0}.spot.is-fault{border-top-color:var(--status-critical)}.spot.is-fault .spot-name,.spot.is-fault .spot-loc{opacity:.6}.stall-figure.is-fault{border-color:var(--status-critical)}.stall-figure.is-fault .car,.stall-figure.is-fault .sensor-wave,.stall-figure.is-fault .impact{animation:none}.fault-title{font-size:13px;font-weight:700;fill:var(--status-critical)}.fault-sub{font-size:10px;fill:var(--text-secondary)}.fault-overlay{animation:fault-blink 2.4s ease-in-out infinite}@keyframes fault-blink{0%,to{opacity:1}50%{opacity:.72}}@media (prefers-reduced-motion: reduce){.fault-overlay{animation:none}}.cap-fault{color:var(--status-critical);font-weight:700}.fault-banner{display:flex;align-items:center;gap:8px;background:color-mix(in srgb,var(--status-critical) 12%,var(--surface-1));border:1px solid var(--status-critical);border-radius:10px;padding:7px 12px;font-size:12.5px;font-weight:600;color:var(--text-primary)}.fault-banner svg{color:var(--status-critical);flex:none}.fault-banner .who{color:var(--status-critical);font-weight:700}.fault-banner .when{color:var(--text-muted);font-weight:400;margin-left:auto}.conn .fault-count{color:var(--status-critical);font-weight:700}.measured-line{display:flex;gap:12px;flex-wrap:wrap;margin-top:8px;padding-top:8px;border-top:1px solid var(--grid);font-size:11px;color:var(--text-muted)}.measured-line .ml-item{display:inline-flex;align-items:baseline;gap:4px}.measured-line b{color:var(--text-secondary);font-weight:650;font-variant-numeric:tabular-nums}.measured-line i{font-style:normal;color:var(--text-muted);font-size:10px}.btn-config{color:var(--series-1);border-color:color-mix(in srgb,var(--series-1) 45%,var(--border-strong))}.btn-config:hover:not(:disabled){color:var(--series-1);border-color:var(--series-1)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;background:#0000008c;display:grid;place-items:center;padding:20px;animation:modal-fade .12s ease}@keyframes modal-fade{0%{opacity:0}to{opacity:1}}.modal{background:var(--surface-1);border:1px solid var(--border-strong);border-radius:14px;box-shadow:0 12px 48px #0006;width:min(640px,100%);max-height:94vh;overflow:hidden;padding:14px 18px 12px}.modal-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:14px}.modal-head h3{margin:0;font-size:16px;font-weight:680}.modal-stall{color:var(--series-1)}.modal-sub{font-size:11px;color:var(--text-muted);margin-top:3px;font-variant-numeric:tabular-nums}.modal-close{border:0;background:var(--surface-2);color:var(--text-secondary);width:28px;height:28px;border-radius:8px;cursor:pointer;font-size:14px;flex:none}.modal-close:hover{color:var(--text-primary)}.measured-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}.measured{background:var(--surface-2);border-radius:9px;padding:6px 8px;text-align:center}.measured .ml{font-size:10.5px;color:var(--text-muted)}.measured .mv{font-size:15px;font-weight:680;margin-top:1px;font-variant-numeric:tabular-nums}.measured .mv .mu{font-size:10px;color:var(--text-muted);font-weight:400;margin-left:2px}.measured-caption{font-size:10px;color:var(--text-muted);text-align:center;margin:4px 0 8px}.settings-table{width:100%;border-collapse:collapse}.settings-table th{font-size:10px;font-weight:600;color:var(--text-muted);text-align:left;padding:4px 8px;border-bottom:1px solid var(--border)}.settings-table th:nth-child(2){text-align:right}.settings-table td{padding:5px 8px;border-bottom:1px solid var(--grid);vertical-align:middle}.settings-table tr:last-child td{border-bottom:0}.set-name{font-size:12.5px;font-weight:600;color:var(--text-primary);display:flex;align-items:center;gap:6px}.set-meta{font-size:9.5px;color:var(--text-muted);margin-top:0;font-variant-numeric:tabular-nums}.admin-tag{font-size:9px;font-weight:700;color:var(--series-1);border:1px solid color-mix(in srgb,var(--series-1) 45%,transparent);border-radius:4px;padding:0 4px}.set-current{text-align:right;font-variant-numeric:tabular-nums;font-weight:650;color:var(--text-secondary);font-size:13px;white-space:nowrap;padding-top:10px!important}.set-input{display:flex;gap:5px;align-items:center}.set-input input{width:82px;background:var(--surface-2);color:var(--text-primary);border:1px solid var(--border-strong);border-radius:6px;padding:4px 7px;font:inherit;font-size:12px;font-variant-numeric:tabular-nums}.set-input input:focus{outline:2px solid color-mix(in srgb,var(--series-1) 50%,transparent);outline-offset:-1px}.set-msg{font-size:10.5px;font-weight:600;margin-top:4px}.set-msg.ok{color:var(--status-good)}.set-msg.ng{color:var(--status-critical)}.modal-foot{font-size:10px;color:var(--text-muted);margin-top:8px;line-height:1.45}.range-bar{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:8px;padding-bottom:8px;border-bottom:1px solid var(--grid)}.quick-chips{display:flex;gap:2px;background:var(--surface-2);padding:2px;border-radius:7px}.quick-chips button{border:0;background:transparent;color:var(--text-secondary);font:inherit;font-size:11px;font-weight:600;padding:3px 9px;border-radius:5px;cursor:pointer}.quick-chips button[aria-pressed=true]{background:var(--surface-1);color:var(--text-primary);box-shadow:var(--shadow)}.range-bar input[type=datetime-local]{background:var(--surface-2);color:var(--text-primary);border:1px solid var(--border-strong);border-radius:6px;padding:3px 6px;font:inherit;font-size:11px;color-scheme:light dark;min-width:0;flex:1 1 140px;max-width:180px}.range-bar input:focus{outline:2px solid color-mix(in srgb,var(--series-1) 50%,transparent);outline-offset:-1px}.range-tilde{color:var(--text-muted);font-size:12px}.range-search{padding:4px 10px}.chart-empty{height:100%;min-height:120px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;color:var(--text-muted);font-size:12.5px}.chart-empty svg{color:var(--text-muted);opacity:.5}.lane-label{font-size:11px;fill:var(--text-secondary);font-weight:600}.lane-bg{fill:var(--surface-2)}.open-tag{font-size:9px;font-weight:700;color:var(--occupied);border:1px solid currentColor;border-radius:4px;padding:0 4px;margin-left:4px}.timepoint{display:inline-flex;align-items:center;gap:3px}.timepoint input[type=date],.timepoint select{background:var(--surface-2);color:var(--text-primary);border:1px solid var(--border-strong);border-radius:6px;padding:3px 5px;font:inherit;font-size:11px;color-scheme:light dark}.timepoint input[type=date]{min-width:0}.timepoint select{cursor:pointer}.timepoint input:focus,.timepoint select:focus{outline:2px solid color-mix(in srgb,var(--series-1) 50%,transparent);outline-offset:-1px}.site-tabs{display:flex;gap:4px;flex:1 1 auto;justify-content:center;flex-wrap:wrap}.site-tabs button{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--border);background:var(--surface-1);color:var(--text-secondary);font:inherit;font-size:12.5px;font-weight:600;padding:6px 14px;border-radius:999px;cursor:pointer}.site-tabs button:hover{color:var(--text-primary)}.site-tabs button.active{background:var(--series-1);border-color:var(--series-1);color:#fff}.site-tabs .tab-count{font-size:10.5px;font-weight:700;background:var(--surface-2);color:var(--text-muted);border-radius:999px;padding:1px 7px;min-width:20px;text-align:center}.site-tabs button.active .tab-count{background:#ffffff40;color:#fff}.lot-view{display:grid;grid-template-columns:270px 340px 1fr;gap:10px;flex:1 1 auto;min-height:0}@media (max-width: 1200px){.lot-view{grid-template-columns:240px 300px 1fr}}@media (max-width: 1000px){.lot-view{grid-template-columns:1fr}}.lot-side{overflow-y:auto;display:flex;flex-direction:column;gap:10px;min-height:0;background:var(--surface-1);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:12px}.lot-summary{display:flex;gap:8px}.lot-stat{flex:1;background:var(--surface-2);border-radius:10px;padding:10px;text-align:center}.lot-stat .v{font-size:30px;font-weight:720;letter-spacing:-.02em;font-variant-numeric:tabular-nums}.lot-stat .v .slash{font-size:15px;color:var(--text-muted);font-weight:600}.lot-stat .v.rate{color:var(--series-1)}.lot-stat .l{font-size:12px;color:var(--text-muted);margin-top:2px}.lot-counts{display:grid;grid-template-columns:1fr 1fr;gap:6px}.lc{font-size:12.5px;color:var(--text-secondary);display:flex;align-items:center;gap:5px}.lc b{font-size:15px;font-weight:700;font-variant-numeric:tabular-nums}.lc.vacant b{color:var(--occ-blue)}.lc.occupied b{color:var(--occ-yellow)}.lc.fault b{color:var(--status-critical)}.lc.unknown b{color:var(--text-muted)}.lot-legend{display:flex;flex-wrap:wrap;gap:8px 12px;padding:8px 0;border-top:1px solid var(--grid);border-bottom:1px solid var(--grid)}.lot-legend-item{display:inline-flex;align-items:center;gap:5px;font-size:11px;color:var(--text-secondary)}.stall-swatch{width:11px;height:11px;border-radius:3px;flex:none;border:1px solid transparent}.stall-swatch.vacant{background:color-mix(in srgb,var(--occ-blue) 22%,var(--surface-1));border-color:var(--occ-blue)}.stall-swatch.occupied{background:var(--occ-yellow)}.stall-swatch.fault{background:color-mix(in srgb,var(--status-critical) 22%,var(--surface-1));border-color:var(--status-critical)}.stall-swatch.unknown{background:var(--surface-2);border-color:var(--border-strong)}.lot-list{flex:1 1 auto;overflow-y:auto;display:flex;flex-direction:column;gap:2px;min-height:0}.lot-list-item{display:flex;align-items:center;gap:7px;width:100%;text-align:left;border:0;background:transparent;color:var(--text-secondary);cursor:pointer;font:inherit;font-size:11.5px;padding:4px 6px;border-radius:6px}.lot-list-item:hover{background:var(--surface-2)}.lli-no{font-weight:700;color:var(--text-primary);min-width:20px;font-variant-numeric:tabular-nums}.lli-name{flex:1 1 auto;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lli-state{font-size:10.5px;font-variant-numeric:tabular-nums}.lot-list-item.occupied .lli-state{color:var(--occupied)}.lot-list-item.fault .lli-state{color:var(--status-critical);font-weight:700}.lot-main{display:flex;flex-direction:column;min-height:0;background:var(--surface-1);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:12px 14px}.lot-main-head{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:8px}.lot-main-head h2{font-size:14px;font-weight:650;margin:0}.lot-err{color:var(--status-critical);font-size:12px;font-weight:600}.lot-map-wrap{flex:1 1 auto;min-height:0;display:flex;justify-content:flex-end}.lot-map{width:100%;height:100%;display:block}.lot-map-wrap{--surface-0: #121211;--surface-1: #1a1a19;--surface-2: #232322;--border-strong: #4a4a45;--grid: #2c2c2a;--text-muted: #8f8e85;--asphalt: #2b2b29;--asphalt-2: #333330;--sensor-body: #3b3a34;--sensor-top: #56544c;--stall-wall: #201f1d;--occ-yellow: #fab219;--occ-blue: #3987e5;--car: #f4f6fb;--impact: #ff4d97}.lot-view .lot-main{padding-right:10px}.lot-ground{fill:var(--asphalt);stroke:var(--border-strong);stroke-width:2}.lot-aisle{stroke:var(--paint);stroke-width:2;stroke-dasharray:10 10;opacity:.4}.lot-building{fill:var(--surface-2);stroke:var(--border-strong);stroke-width:1.5}.lot-solar{fill:color-mix(in srgb,#2f4d6e 60%,var(--surface-2));stroke:#3a5a80;stroke-width:1.5}.lot-solar-grid{stroke:#4a6f9e;stroke-width:1;opacity:.5}.lot-zone-label{fill:var(--text-muted);font-size:15px;font-weight:600}.lot-zone-label.solar{fill:#cfe0f2}.lot-entrance{color:var(--vacant)}.stall{cursor:pointer}.stall .stall-box{stroke-width:2;transition:fill .2s ease}.stall.vacant .stall-box{fill:color-mix(in srgb,var(--occ-blue) 15%,var(--surface-1));stroke:var(--occ-blue)}.stall.occupied .stall-box{fill:var(--surface-2);stroke:var(--occ-yellow)}.stall.fault .stall-box{fill:color-mix(in srgb,var(--status-critical) 14%,var(--surface-1));stroke:var(--status-critical);stroke-dasharray:5 4}.stall.unknown .stall-box{fill:var(--surface-2);stroke:var(--border-strong)}.stall:hover .stall-box{stroke-width:3}.stall-car{fill:var(--occupied);opacity:.9}.stall-no{font-size:22px;font-weight:800;pointer-events:none;paint-order:stroke;stroke:#1a1a19;stroke-width:4px;fill:#fff}.stall-no.comm-ok{fill:var(--status-good)}.stall-no.comm-fault{fill:var(--status-critical)}.stall-no.comm-wait{fill:var(--text-muted)}.lot-outline{fill:var(--asphalt);stroke:#8f97a3;stroke-width:3;stroke-linejoin:round;opacity:1}.lot-nameplate{fill:#d7d6cf;font-size:32px;font-weight:820;letter-spacing:1px;opacity:.9}.lot-nameplate tspan{fill:#d7d6cf}.lot-ramp-box{fill:color-mix(in srgb,var(--asphalt-2) 70%,#000 10%);stroke:#8f97a3;stroke-width:2}.lot-ramp-hatch{stroke:#6b7280;stroke-width:1.4;opacity:.7}.lot-ramp-label{fill:#c9d3e0;font-size:20px;font-weight:750;letter-spacing:1px}.lot-room-box{fill:color-mix(in srgb,var(--asphalt-2) 55%,#000 12%);stroke:#7e8794;stroke-width:1.6;stroke-dasharray:4 3}.lot-room-label{fill:#aab3c0;font-size:17px;font-weight:700}.stall-compact-mark{fill:#9aa4b2;font-size:15px;font-weight:700;pointer-events:none}.stall.compact .stall-box{stroke-dasharray:5 3}:root[data-theme=dark] .lot-outline,.lot-outline{fill-opacity:1}.lot-note-label{fill:var(--text-muted);font-size:15px;font-weight:600}.lot-entrance-arrow{color:#e0362f}.lot-entrance-label{fill:#e0362f;font-size:13px;font-weight:700}.stall-topcar{pointer-events:none}.stall-impact{pointer-events:none;animation:impact-blink 1.1s ease-in-out infinite}.impact-halo{fill:var(--impact);opacity:.25}@keyframes impact-blink{0%,to{opacity:1}50%{opacity:.35}}@media (prefers-reduced-motion: reduce){.stall-impact{animation:none}}.modal-figure{margin-bottom:8px}.modal-figure .stall-figure svg{max-height:118px}.stall-sensor-body{fill:var(--sensor-body);stroke:var(--sensor-top);stroke-width:1}.stall-sensor-led,.stall-sensor-led.live{fill:var(--status-good)}:root .stall-sensor-led:not(.live){fill:var(--text-muted)}.stall.fault .stall-sensor-led{fill:var(--status-critical)}.stall-impact{pointer-events:none}.lot-entrance-lane{color:#e0362f}.lot-lane-box{fill:color-mix(in srgb,#e0362f 12%,var(--surface-1));stroke:#e0362f;stroke-width:2;stroke-dasharray:7 5}.lot-lane-divider{stroke:#e0362f;stroke-width:2;stroke-dasharray:8 8;opacity:.6}.lot-main-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:8px;flex-wrap:wrap}.lmh-right{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.lot-daystat{border-top:1px solid var(--grid);padding-top:8px}.lds-title{font-size:11.5px;font-weight:650;color:var(--text-secondary);margin-bottom:6px}.lds-row{display:grid;grid-template-columns:repeat(3,1fr);gap:6px}.lds{background:var(--surface-2);border-radius:8px;padding:7px 6px;text-align:center}.lds-l{display:block;font-size:11px;color:var(--text-muted)}.lds-v{display:block;font-size:15px;font-weight:680;font-variant-numeric:tabular-nums;margin-top:2px}.lot-history{flex:1 1 auto;display:flex;flex-direction:column;min-height:0;border-top:1px solid var(--grid);padding-top:8px}.lh-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.lh-title{font-size:11.5px;font-weight:650;color:var(--text-secondary)}.lh-scroll{flex:1 1 auto;overflow-y:auto;min-height:0}.stall-dur{font-size:15px;font-weight:800;fill:#ffd23f;paint-order:stroke;stroke:#1a1a19;stroke-width:3.5px;letter-spacing:-.3px}.lot-full{position:fixed;top:0;right:0;bottom:0;left:0;z-index:60;background:var(--surface-0);display:flex;flex-direction:column;padding:12px 18px 16px;animation:modal-fade .12s ease}.lot-full-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:8px;flex-wrap:wrap}.lot-full-head h3{margin:0;font-size:16px;font-weight:680}.lot-full-body{flex:1 1 auto;min-height:0;display:flex;gap:20px}.lot-full-map{flex:1 1 auto;min-height:0;display:flex}.lot-full-map .lot-map-wrap{flex:1 1 auto}.lot-full-status{flex:0 0 300px;display:flex;flex-direction:column;gap:14px;padding:20px 18px;border:1px solid var(--grid);border-radius:14px;background:var(--surface-1);align-self:stretch;overflow:hidden}.lot-full-status .lfs-cap{font-size:14px;color:var(--text-muted);margin-top:2px}.lfs-hero{text-align:center;padding-bottom:12px;border-bottom:1px solid var(--grid)}.lfs-occ{font-size:76px;font-weight:820;line-height:1;color:var(--occ-yellow);letter-spacing:-2px}.lfs-occ .lfs-slash{font-size:40px;font-weight:700;color:var(--text-muted)}.lfs-rate{text-align:center;padding-bottom:12px;border-bottom:1px solid var(--grid)}.lfs-rate-v{font-size:56px;font-weight:820;line-height:1;color:var(--text);letter-spacing:-1px}.lfs-rate-v .lfs-pct{font-size:30px;font-weight:700;color:var(--text-muted);margin-left:2px}.lfs-counts{display:grid;grid-template-columns:1fr 1fr;gap:10px}.lfs-c{display:flex;flex-direction:column;align-items:center;gap:2px;padding:12px 6px;border-radius:10px;background:var(--surface-2);border-left:4px solid var(--grid)}.lfs-c b{font-size:30px;font-weight:800;line-height:1}.lfs-c span{font-size:12px;color:var(--text-muted)}.lfs-c.vacant{border-left-color:var(--occ-blue)}.lfs-c.vacant b{color:var(--occ-blue)}.lfs-c.occupied{border-left-color:var(--occ-yellow)}.lfs-c.occupied b{color:var(--occ-yellow)}.lfs-c.fault{border-left-color:var(--status-critical)}.lfs-c.fault b{color:var(--status-critical)}.lfs-c.unknown{border-left-color:var(--text-muted)}.lfs-c.unknown b{color:var(--text-muted)}.lfs-day{margin-top:auto;display:flex;flex-direction:column;gap:8px;padding-top:12px;border-top:1px solid var(--grid)}.lfs-drow{display:flex;align-items:baseline;justify-content:space-between}.lfs-drow span{font-size:13px;color:var(--text-muted)}.lfs-drow b{font-size:17px;font-weight:750}.lot-charts{display:flex;flex-direction:column;gap:5px;border-top:1px solid var(--grid);padding-top:7px;min-height:0}.mini-chart{background:var(--surface-2);border-radius:8px;padding:5px 8px 1px}.mini-title{font-size:12px;font-weight:650;color:var(--text-secondary);margin-bottom:2px}.mini-svg{display:block;width:100%;height:auto}.mini-svg .axis{stroke:var(--border-strong);stroke-width:1}.mini-val{font-size:8.5px;font-weight:700;fill:var(--text-secondary)}.mini-x{font-size:8px;fill:var(--text-muted)}.lot-entrance-label{font-size:16px;font-weight:700}.modal-controls{margin-bottom:8px}.modal-controls .controls{margin-top:0;padding-top:0;border-top:0}.app-clock{display:inline-flex;align-items:center;gap:7px;background:var(--surface-2);border:1px solid var(--border);border-radius:999px;padding:4px 12px}.refresh-dot{width:8px;height:8px;border-radius:50%;background:var(--status-good);flex:none;box-shadow:0 0 color-mix(in srgb,var(--status-good) 60%,transparent);animation:refresh-pulse 2s ease-out infinite}@keyframes refresh-pulse{0%{box-shadow:0 0 color-mix(in srgb,var(--status-good) 55%,transparent)}70%{box-shadow:0 0 0 7px transparent}to{box-shadow:0 0 0 0 transparent}}.refresh-label{font-size:11px;font-weight:600;color:var(--status-good)}.clock-time{font-size:12px;font-weight:600;color:var(--text-secondary);font-variant-numeric:tabular-nums;letter-spacing:.01em}@media (prefers-reduced-motion: reduce){.refresh-dot{animation:none}}.lot-main{padding:10px 10px 10px 12px}.lot-map-wrap{justify-content:center}.lot-legend-group{display:inline-flex;align-items:center;gap:8px}.llg-label{font-size:10px;color:var(--text-muted);font-weight:600;margin-right:2px}.num-swatch{display:inline-grid;place-items:center;width:18px;height:14px;font-size:10px;font-weight:800;border-radius:3px;background:var(--surface-2)}.num-swatch.ok{color:var(--status-good)}.num-swatch.fault{color:var(--status-critical)}.num-swatch.wait{color:var(--text-muted)}
