:root{--ink:#0b1826;--bg:#0a1420;--panel:#12233a;--panel-2:#0e1c2e;--rail:#0b1725;--gold:#c9a44c;--crimson:#d42a2a;--pss-red:#d42a2a;--terracotta:#d2695a;--ivory:#f4efe4;--txt:#f4efe4;--txt-2:#c7d2de;--txt-3:#aebccb;--muted:#93a6bc;--muted-2:#7d90a6;--line:#ffffff14;--line-strong:#ffffff24;--gold-line:#c9a44c66;--card-fill:#ffffff0a;--font-display:"Anuphan", "IBM Plex Sans Thai", system-ui, sans-serif;--font-body:"IBM Plex Sans Thai", "Anuphan", system-ui, sans-serif;--font-mono:"IBM Plex Mono", ui-monospace, monospace;font-family:var(--font-body);color:var(--txt)}*{box-sizing:border-box}body{background:var(--bg);color:var(--txt);margin:0}h1,h2,h3{font-family:var(--font-display);letter-spacing:-.01em;margin:0;font-weight:700}h2{font-size:22px}.muted{color:var(--muted)}.small{font-size:12px}.num{text-align:right;font-family:var(--font-mono);font-variant-numeric:tabular-nums}.card{background:var(--panel-2);border:1px solid var(--line);border-radius:16px;padding:18px}@keyframes pp-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.55;transform:scale(1.18)}}.pp-pulse{transform-origin:50%;animation:1.6s ease-in-out infinite pp-pulse}.login-wrap{background:radial-gradient(1200px 700px at 75% -10%, #c9a44c1a, transparent 60%), radial-gradient(900px 600px at 10% 110%, #d42a2a1a, transparent 60%), var(--ink);place-items:center;min-height:100vh;display:grid}.login-card{background:var(--panel-2);border:1px solid var(--line);border-radius:20px;flex-direction:column;gap:6px;width:360px;padding:28px;display:flex;box-shadow:0 40px 90px #00000080}.login-brand{align-items:center;gap:10px;margin-bottom:6px;display:flex}.login-card h2{font-size:26px}.login-card label{color:var(--txt-3);margin-top:10px;font-size:13px}.login-card input{border:1px solid var(--line-strong);color:var(--txt);font-family:var(--font-body);background:#ffffff0a;border-radius:10px;padding:10px 12px}.login-card input:focus{border-color:var(--gold);outline:none}.eyebrow{font-family:var(--font-mono);letter-spacing:.22em;text-transform:uppercase;color:var(--gold);font-size:11px}.btn.sso{text-align:center;background:var(--pss-red);color:#fff;margin-top:14px;text-decoration:none;display:block}.btn.sso:hover{filter:brightness(1.08)}.or-sep{color:var(--muted-2);align-items:center;gap:10px;margin:14px 0 2px;font-size:12px;display:flex}.or-sep:before,.or-sep:after{content:"";background:var(--line);flex:1;height:1px}.cobrand{align-items:center;gap:10px;margin-top:10px;display:flex}.pss-chip{background:#f4efe4;border-radius:9px;align-items:center;padding:6px 11px;display:inline-flex}.pss-chip img{display:block}.cobrand-x{color:var(--gold);font-size:16px}.cobrand-cpn{font-family:var(--font-display);letter-spacing:.02em;color:var(--txt);font-size:18px;font-weight:700}.login-foot{text-align:center;font-family:var(--font-mono);letter-spacing:.12em;color:var(--muted-2);text-transform:uppercase;margin-top:18px;font-size:11px}.login-foot b{color:var(--gold)}.powered{font-family:var(--font-mono);letter-spacing:.12em;color:var(--muted-2);text-transform:uppercase;margin-top:10px;font-size:10px}.powered b{color:var(--gold)}.err{color:var(--terracotta);margin-top:8px;font-size:13px}.btn{background:var(--gold);color:#1a1200;cursor:pointer;font-family:var(--font-body);border:0;border-radius:10px;margin-top:12px;padding:9px 15px;font-weight:600}.btn:hover{filter:brightness(1.07)}.btn:disabled{opacity:.55;cursor:default}.btn.ghost{color:var(--gold);border:1px solid var(--gold-line);background:0 0}.btn.ghost:hover{filter:none;background:#c9a44c1a}.btn.danger{color:var(--terracotta);background:0 0;border:1px solid #d2695a73}.btn.danger:hover{background:#d2695a1f}.btn-link{color:var(--gold);cursor:pointer;background:0 0;border:0;margin-top:8px;padding:0}.app{min-height:100vh;display:flex}.side{background:var(--rail);border-right:1px solid var(--line);flex-direction:column;width:246px;padding:18px 16px;display:flex}.side-brand{align-items:center;gap:10px;margin-bottom:4px;display:flex}.side-sub{font-family:var(--font-mono);letter-spacing:.18em;color:var(--muted-2);text-transform:uppercase;margin:0 0 18px 2px;font-size:10px}.side .field{flex-direction:column;gap:5px;margin-bottom:16px;display:flex}.side .field label{color:var(--muted);font-size:12px}.side select{border:1px solid var(--line-strong);background:var(--panel);color:var(--txt);font-family:var(--font-body);border-radius:10px;padding:9px 10px}.nav-group{font-family:var(--font-mono);color:var(--muted-2);letter-spacing:.16em;text-transform:uppercase;margin:14px 0 6px;font-size:11px}.nav{color:var(--txt-3);border:1px solid #0000;border-radius:10px;padding:9px 11px;font-size:14px;text-decoration:none;display:block}.nav:hover{color:var(--txt);background:#ffffff0a}.nav.active{color:var(--ivory);background:#d42a2a21;border-color:#d42a2a59;font-weight:600}.side-foot{border-top:1px solid var(--line);margin-top:auto;padding-top:16px;font-size:14px}.content{flex:1;padding:26px 30px;overflow:auto}.page-head{justify-content:space-between;align-items:center;gap:12px;margin-bottom:18px;display:flex}.page-head input[type=date],.page-head input[type=month]{border:1px solid var(--line-strong);background:var(--panel);color:var(--txt);font-family:var(--font-mono);border-radius:10px;padding:8px 11px}.stat-row{flex-wrap:wrap;gap:14px;margin-bottom:18px;display:flex}.stat{border-top:2px solid var(--gold)}.stat .muted{font-size:14px}.stat .big{font-family:var(--font-display);margin-top:4px;font-size:34px;font-weight:700}.tbl{border-collapse:collapse;background:var(--panel-2);border:1px solid var(--line);border-radius:14px;width:100%;overflow:hidden}.tbl th,.tbl td{border-bottom:1px solid var(--line);text-align:left;padding:9px 13px;font-size:14px}.tbl thead th{color:var(--muted);font-weight:600;font-family:var(--font-mono);letter-spacing:.04em;text-transform:uppercase;background:#ffffff08;font-size:12px}.tbl tbody tr:hover{background:#ffffff06}.tbl tfoot th{color:var(--ivory);background:#c9a44c14}.tbl td:first-child{font-family:var(--font-mono);color:var(--txt-2)}.hbar{background:var(--gold);border-radius:6px;min-width:2px;height:12px}.chart{align-items:flex-end;gap:4px;height:200px;margin-bottom:18px;display:flex}.bar-col{flex-direction:column;flex:1;justify-content:flex-end;align-items:center;height:100%;display:flex}.bar{background:linear-gradient(180deg, var(--gold), #c9a44c8c);border-radius:3px 3px 0 0;width:72%}.bar-label{font-family:var(--font-mono);color:var(--muted-2);margin-top:4px;font-size:10px}.pager{font-family:var(--font-mono);align-items:center;gap:12px;margin-top:14px;font-size:13px;display:flex}.tools{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.tools input{border:1px solid var(--line-strong);background:var(--panel);color:var(--txt);font-family:var(--font-mono);border-radius:10px;padding:8px 11px}.row-form{flex-wrap:wrap;align-items:flex-end;gap:12px;margin-bottom:8px;display:flex}.row-form label{color:var(--muted);margin-bottom:3px;font-size:12px;display:block}.card input,.card select{border:1px solid var(--line-strong);background:var(--panel);color:var(--txt);font-family:var(--font-body);border-radius:10px;padding:8px 11px}.card{margin-bottom:16px}.token-box{border-color:var(--gold-line);background:#c9a44c14;flex-wrap:wrap;align-items:center;gap:12px;display:flex}.token{font-family:var(--font-mono);border:1px solid var(--line);color:var(--gold);word-break:break-all;background:#00000059;border-radius:8px;padding:7px 11px}.site-picker{flex-wrap:wrap;align-items:center;gap:12px;margin:8px 0;display:flex}.chk{color:var(--txt-2);align-items:center;gap:4px;font-size:13px;display:inline-flex}.actions{flex-wrap:wrap;gap:6px;display:flex}.modal-overlay{z-index:50;background:#040a12b3;place-items:center;display:grid;position:fixed;inset:0}.modal{background:var(--panel-2);border:1px solid var(--line-strong);border-radius:18px;flex-direction:column;width:420px;max-width:92vw;padding:24px;display:flex;box-shadow:0 40px 90px #0009}.modal h3{margin-bottom:4px;font-size:19px}.modal label{color:var(--txt-3);margin-top:12px;margin-bottom:4px;font-size:13px}.modal input{border:1px solid var(--line-strong);background:var(--panel);color:var(--txt);font-family:var(--font-mono);border-radius:10px;padding:9px 11px}.modal input:focus{border-color:var(--gold);outline:none}.modal-actions{justify-content:flex-end;gap:10px;margin-top:18px;display:flex}.role-sel{border:1px solid var(--line-strong);background:var(--panel);color:var(--txt);font-family:var(--font-body);border-radius:8px;padding:5px 8px;font-size:13px}.fleet-alert{color:var(--terracotta);font-family:var(--font-mono);background:#d2695a1a;border:1px solid #d2695a66;border-radius:100px;padding:4px 12px;font-size:13px}.srctype{font-size:11px;font-family:var(--font-mono);border:1px solid var(--line-strong);border-radius:100px;padding:2px 8px}.srctype-pss{color:var(--gold);border-color:var(--gold-line)}.srctype-carpark{color:#37c9a3;border-color:#37c9a366}.srctype-parking_pg{color:#6aa9ff;border-color:#6aa9ff66}.tbl.heat td{text-align:center;border-radius:3px;padding:5px 6px;font-size:12px}.tbl.heat th{padding:5px 6px;font-size:12px}.fleet-map{border:1px solid var(--line);border-radius:16px;height:420px;overflow:hidden}.fleet-map-err{color:var(--terracotta);background:var(--panel);justify-content:center;align-items:center;font-size:14px;display:flex}.gmap-card{position:absolute}.gmap-pin{white-space:nowrap;color:var(--ivory);border:1px solid var(--gold-line);font-family:var(--font-body);background:#0b1826;border-radius:10px;padding:6px 10px;position:absolute;transform:translate(-50%,calc(-100% - 10px));box-shadow:0 4px 14px #00000059}.gmap-pin:after{content:"";border-top:6px solid #0b1826;border-left:6px solid #0000;border-right:6px solid #0000;position:absolute;bottom:-6px;left:50%;transform:translate(-50%)}.gmap-pin-alert{border-color:#d2695a99}.gmap-name{font-size:12px;font-weight:700}.gmap-stat{color:var(--txt-2);font-size:11px;font-family:var(--font-mono);margin-top:1px}.scroll-x{overflow-x:auto}.matrix th,.matrix td{white-space:nowrap;padding:4px 6px;font-size:12px}.live-pill{font-family:var(--font-mono);letter-spacing:.12em;color:var(--txt-3);border:1px solid #d42a2a59;border-radius:100px;align-items:center;gap:7px;padding:5px 12px;font-size:11px;display:inline-flex}.live-dot{background:var(--crimson);border-radius:50%;width:8px;height:8px}.mono{font-family:var(--font-mono)}.sync-grid{grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px;display:grid}.sync-card{flex-direction:column;gap:8px;display:flex}.sync-head{justify-content:space-between;align-items:flex-start;display:flex}.sync-name{font-family:var(--font-display);font-size:18px;font-weight:600}.sync-row{justify-content:space-between;padding:3px 0;font-size:14px;display:flex}.sync-tbl{border-collapse:collapse;width:100%;margin-top:6px}.sync-tbl th,.sync-tbl td{border-bottom:1px solid var(--line);text-align:left;padding:6px 8px;font-size:13px}.sync-tbl thead th{font-family:var(--font-mono);text-transform:uppercase;color:var(--muted-2);font-size:11px}.sync-tbl td:first-child{font-family:var(--font-mono);color:var(--txt-2)}.agent-err{color:var(--terracotta);font-size:12px;font-family:var(--font-mono);word-break:break-word;background:#d2695a1f;border:1px solid #d2695a59;border-radius:8px;padding:6px 9px}.srv-card{flex-direction:column;gap:12px;margin-bottom:16px;display:flex}.srv-item{align-items:center;gap:8px;font-size:15px;display:flex}.srv-item .dot{border-radius:50%;width:9px;height:9px;display:inline-block}.srv-db-head{justify-content:space-between;margin-bottom:6px;font-size:13px;display:flex}.srv-bar{background:#ffffff12;border-radius:8px;height:12px;overflow:hidden}.srv-bar-fill{border-radius:8px;height:100%}.srv-metrics{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px;display:grid}.dash-top{justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:18px;display:flex}.dash-site{color:var(--muted);margin-top:4px;font-size:13px}.kpi-row{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin-bottom:16px;display:grid}.kpi{background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:18px 20px}.kpi.kpi-alert{background:#d2695a14;border-color:#d2695a80}.kpi-label{color:var(--muted);font-size:14px}.kpi-val{font-family:var(--font-display);font-variant-numeric:tabular-nums;margin-top:4px;font-size:40px;font-weight:700;line-height:1.1}.kpi-val.gold{color:var(--gold)}.kpi-unit{color:var(--muted);margin-left:2px;font-size:20px}.kpi-sub{color:var(--muted-2);margin-top:6px;font-size:12px}.dash-grid{grid-template-columns:1.6fr 1fr;gap:18px;display:grid}.panel-head{color:var(--txt-2);justify-content:space-between;align-items:center;margin-bottom:12px;font-size:15px;display:flex}.zrow{align-items:center;gap:12px;padding:7px 0;display:flex}.zname{flex:none;width:110px;font-size:14px}.ztrack{background:#ffffff12;border-radius:8px;flex:1;height:14px;overflow:hidden}.zbar{background:linear-gradient(90deg, #c9a44c99, var(--gold));border-radius:8px;height:100%}.zval{text-align:right;width:64px;font-size:14px}.gate-scroll .zrow{padding:5px 0}.hourly{align-items:flex-end;gap:4px;height:160px;padding-top:8px;display:flex}.hcol{flex-direction:column;flex:1;align-items:center;height:100%;display:flex}.hbars{flex:1;justify-content:center;align-items:flex-end;gap:2px;width:100%;display:flex}.hbar{border-radius:3px 3px 0 0;width:45%;min-height:1px}.hbar-in{background:#37c9a3}.hbar-out{background:var(--terracotta)}.hlabel{color:var(--muted);margin-top:5px;font-size:10px}.hlgd{vertical-align:middle;border-radius:2px;width:9px;height:9px;margin-right:3px;display:inline-block}.hlgd-in{background:#37c9a3}.hlgd-out{background:var(--terracotta)}.gate-scroll .zname{white-space:nowrap;width:160px;overflow:visible}.feed{flex-direction:column;gap:8px;display:flex}.frow{background:#ffffff0a;border-radius:10px;align-items:center;gap:10px;padding:8px 10px;display:flex}.frow.in{background:#d42a2a14}.ftag{font-family:var(--font-mono);border-radius:6px;padding:2px 7px;font-size:11px;font-weight:600}.ftag.in{color:var(--pss-red);border:1px solid #d42a2a66}.ftag.out{color:var(--gold);border:1px solid var(--gold-line)}.fplate{letter-spacing:.05em;flex:1;font-size:15px}.fmeta{color:var(--muted);font-size:12px}@media (width<=900px){.kpi-row{grid-template-columns:repeat(2,1fr)}.dash-grid{grid-template-columns:1fr}}
