.topbar{height:64px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;align-items:center;padding:0 28px;position:sticky;top:0;z-index:50;box-shadow:0 1px 2px rgba(0,0,0,.05)}
.brand{width:360px;display:flex;align-items:baseline;gap:10px;font-weight:900;font-size:22px}.brand small{font-size:12px;color:var(--muted);font-weight:700}.nav{flex:1;display:flex;align-items:center;justify-content:center;gap:10px;height:100%}.nav a{height:100%;display:flex;align-items:center;padding:0 20px;border-bottom:3px solid transparent;font-size:16px;font-weight:800;color:#111827}.nav a.active{color:var(--accent);border-color:var(--accent)}html[data-theme="dark"] .nav a{color:var(--text)}.userbox{display:flex;align-items:center;justify-content:flex-end;gap:10px;min-width:360px}.clock-pill{border:1px solid #90caf9;color:#1976d2;background:#eef7ff;border-radius:999px;padding:5px 10px;font-weight:800;font-size:12px}.avatar{width:34px;height:34px;border-radius:50%;background:#6d4c41;color:#fff;display:grid;place-items:center;font-weight:900}.logout{font-size:12px;color:var(--muted)}
.container{width:100%;max-width:none;min-height:calc(100vh - 64px);padding:22px 26px 36px}.page-title{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;margin:0 0 16px}.page-title h1{margin:0;font-size:24px}.page-title p{margin:6px 0 0;color:var(--muted);font-weight:600}.section-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}.section-head h1,.section-head h2,.section-head h3{margin:0}.section-head h2{font-size:18px}.grid{display:grid;gap:14px}.panel,.card,.kpi{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow)}.panel{padding:16px}.kpi-grid{grid-template-columns:repeat(6,minmax(130px,1fr));margin-bottom:14px}.kpi{min-height:86px;padding:16px;text-align:center;display:grid;align-content:center;gap:6px}.kpi b{font-size:28px;line-height:1}.kpi span{font-size:12px;color:var(--muted);font-weight:800}.kpi.ok b{color:var(--ok)}.kpi.warn b{color:var(--warn)}.kpi.delay b{color:var(--delay)}.kpi.danger b{color:var(--danger)}.kpi.live{position:relative}.kpi.live:after{content:"";position:absolute;right:14px;top:14px;width:9px;height:9px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 0 rgba(67,160,71,.55);animation:pulse 1.5s infinite}
.dashboard-shell{display:grid;grid-template-columns:360px minmax(620px,1fr) 390px;gap:14px;align-items:start}.dashboard-main{display:grid;gap:14px}.map-box{width:100%;border:1px solid var(--line);border-radius:var(--radius);background:#e8eef5;overflow:hidden}.map-box.compact{height:360px}.map-box.large{height:calc(100vh - 160px);min-height:560px}.location-panel .map-box{height:460px}.sensor-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.sensor-card{border:1px solid var(--line);border-radius:6px;padding:14px;background:var(--panel2);display:flex;justify-content:space-between;gap:12px}.sensor-card b{font-size:22px}.sensor-card small{display:block;color:var(--muted);font-weight:800}.status-summary{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;padding:15px;background:var(--panel2);border-radius:6px;text-align:center;margin-bottom:12px}.status-summary b{font-size:24px;display:block}.status-summary span{font-size:12px;color:var(--muted);font-weight:800}.device-list{display:grid;gap:10px}.device-row{display:block;border:2px solid var(--line);border-radius:6px;padding:12px;background:var(--panel2)}.device-row.hot{border-color:var(--accent);background:#eef6ff}.device-row-title{display:flex;justify-content:space-between;align-items:center;gap:8px;font-weight:900}.device-row-meta{font-size:12px;color:var(--muted);margin-top:7px;line-height:1.7}.live-strip{display:flex;gap:10px;align-items:center;padding:10px 14px;margin-bottom:14px;overflow:hidden}.live-dot{width:10px;height:10px;border-radius:50%;background:var(--ok);animation:pulse 1.4s infinite}.live-ticker{display:block;flex:1;overflow:hidden;white-space:nowrap;mask-image:linear-gradient(90deg,transparent,#000 5%,#000 95%,transparent)}.ticker-track{display:inline-flex;gap:12px;width:max-content;animation:marquee 28s linear infinite}.ticker-track span{background:var(--panel2);border:1px solid var(--line);border-radius:999px;padding:6px 10px;font-weight:700;color:var(--muted)}
.cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:14px}.card{padding:16px}.card h3{margin:0 0 8px}.actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}.table-wrap{overflow:auto;border:1px solid var(--line);border-radius:6px;background:var(--panel)}table{width:100%;border-collapse:collapse;background:var(--panel)}th,td{padding:12px 14px;border-bottom:1px solid var(--line);text-align:left;vertical-align:middle;white-space:nowrap}th{background:var(--panel2);font-weight:900;color:#374151}html[data-theme="dark"] th{color:var(--text)}tbody tr:hover{background:rgba(25,118,210,.05)}.badge{display:inline-flex;align-items:center;border-radius:4px;padding:4px 8px;font-size:12px;font-weight:900}.badge.ok{background:#e8f5e9;color:#2e7d32}.badge.delay{background:#fff8e1;color:#b26a00}.badge.warn{background:#fff3e0;color:#ef6c00}.badge.danger{background:#ffebee;color:#c62828}.badge.off{background:#eceff1;color:#607d8b}.alert{border-left:5px solid var(--accent);background:var(--panel2);padding:12px;border-radius:6px;margin:0 0 10px}.alert.danger{border-color:var(--danger)}.alert.warn{border-color:var(--warn)}
button,.button{border:1px solid var(--line2);background:var(--panel);color:var(--text);border-radius:4px;min-height:36px;padding:8px 13px;font:inherit;font-weight:900;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.primary,button.primary,.button.primary{background:#1976d2;color:#fff;border-color:#1976d2}.success-btn{background:#26a69a!important;color:#fff!important;border-color:#26a69a!important}.danger-btn{background:#fff!important;color:#c2185b!important;border-color:#f8bbd0!important}input,select,textarea{border:1px solid var(--line2);background:var(--panel);color:var(--text);border-radius:4px;min-height:38px;padding:8px 10px;font:inherit}textarea{min-height:180px}.filters{display:flex;gap:10px;flex-wrap:wrap;align-items:end}.filters label,.form label{display:grid;gap:5px;font-size:12px;color:var(--muted);font-weight:900}.form-grid,.meta-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px}.form-actions,.head-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.schedule-table input,.schedule-table select{width:100%}.toggle-cell{display:flex!important;gap:7px;align-items:center;color:var(--text)!important}.toggle-cell input{min-height:auto;width:18px;height:18px;accent-color:var(--accent)}.pager{display:flex;justify-content:flex-end;align-items:center;gap:8px;margin-top:14px}.pager-summary{margin-right:auto;color:var(--muted);font-weight:700}.pager-buttons{display:flex;gap:5px}.pager button{min-width:34px}.image-viewer{display:grid;grid-template-columns:280px minmax(0,1fr);gap:14px}.thumbs{display:grid;gap:8px;max-height:68vh;overflow:auto}.thumbs button{display:grid;grid-template-columns:82px 1fr;gap:8px;text-align:left;background:var(--panel2)}.thumbs img{width:82px;height:56px;object-fit:cover}.big-image img{max-width:100%;max-height:70vh;border-radius:6px;border:1px solid var(--line)}.login-body{min-height:100vh;display:grid;place-items:center;background:linear-gradient(135deg,#eef6ff,#f8fafc)}.login-card{width:min(430px,92vw);background:var(--panel);border:1px solid var(--line);box-shadow:var(--shadow);border-radius:10px;padding:30px;display:grid;gap:14px}.login-card label{display:grid;gap:6px;font-weight:800}.login-card input{height:44px}
.gm-device-label{position:absolute;transform:translate(-50%,-100%);pointer-events:none;background:rgba(15,23,42,.92);color:#fff;border:2px solid rgba(255,255,255,.7);border-radius:999px;padding:5px 10px;font-size:12px;font-weight:900;white-space:nowrap}.gm-attention-marker{position:absolute;width:78px;height:78px;border-radius:50%;transform:translate(-50%,-50%);pointer-events:none;filter:drop-shadow(0 0 8px var(--pulse-color));animation:mapFlash 1.05s ease-in-out infinite}.gm-attention-marker:before,.gm-attention-marker:after{content:"";position:absolute;inset:10px;border-radius:50%;border:5px solid var(--pulse-color);animation:mapRadar 1.35s ease-out infinite}.gm-attention-marker:after{inset:20px;animation-delay:.45s}.gm-style .gm-style-iw-c{background:#fff!important;color:#111827!important;border-radius:12px!important}.gm-info-title{font-weight:900;font-size:16px;color:#111827;margin-bottom:8px}.gm-info-device{display:grid;gap:4px;color:#1f2937}.gm-info-actions{display:flex;gap:8px;margin-top:8px}.gm-info-actions a{background:#1976d2;color:#fff!important;padding:6px 9px;border-radius:5px;font-weight:900}.gm-info-select-label{display:grid;gap:5px;margin:8px 0;font-weight:900;color:#111827}
@keyframes pulse{0%{box-shadow:0 0 0 0 rgba(67,160,71,.6)}70%{box-shadow:0 0 0 12px rgba(67,160,71,0)}100%{box-shadow:0 0 0 0 rgba(67,160,71,0)}}@keyframes marquee{0%{transform:translateX(0)}100%{transform:translateX(-50%)}}@keyframes mapRadar{0%{opacity:1;transform:scale(.45)}100%{opacity:0;transform:scale(1.55)}}@keyframes mapFlash{0%,100%{opacity:.95}50%{opacity:.45}}
@media (max-width:1400px){.dashboard-shell{grid-template-columns:1fr}.location-panel .map-box{height:380px}.kpi-grid{grid-template-columns:repeat(3,1fr)}.brand,.userbox{width:auto;min-width:0}.nav a{padding:0 12px}}@media (max-width:760px){.topbar{display:none}.container{padding:12px}.kpi-grid{grid-template-columns:repeat(2,1fr)}.cards{grid-template-columns:1fr}.image-viewer{grid-template-columns:1fr}.sensor-grid{grid-template-columns:1fr}}
/* Environment setting text-part sizes */
.brand{font-size:var(--fs-brand,22px)}
.nav a{font-size:var(--fs-nav,16px)}
.page-title h1{font-size:var(--fs-page-title,24px)}
.section-head h2,.section-head h3,.panel>h1,.panel>h2{font-size:var(--fs-section-title,18px)}
.card h3,.device-row-title{font-size:var(--fs-card-title,17px)}
.kpi b{font-size:var(--fs-kpi-number,28px)}
table,th,td{font-size:var(--fs-table,14px)}
button,.button{font-size:var(--fs-button,14px)}
input,select,textarea,.filters label,.form label{font-size:var(--fs-form,14px)}
.badge{font-size:var(--fs-badge,12px)}
.gm-device-label{font-size:var(--fs-map-label,12px)}
.gm-info-window,.gm-info-device,.gm-info-select-label{font-size:var(--fs-popup,14px)}
html[data-theme="dark"] .topbar,html[data-theme="dark"] .panel,html[data-theme="dark"] .card,html[data-theme="dark"] .kpi,html[data-theme="dark"] table{background:var(--panel);color:var(--text)}
html[data-theme="dark"] input,html[data-theme="dark"] select,html[data-theme="dark"] textarea,html[data-theme="dark"] button,html[data-theme="dark"] .button{background:var(--panel2);color:var(--text);border-color:var(--line2)}
html[data-theme="dark"] .primary,html[data-theme="dark"] button.primary,html[data-theme="dark"] .button.primary{background:var(--accent);border-color:var(--accent);color:#06101f}
html[data-theme="dark"] .map-box{background:#0f2a43}
html[data-theme="dark"] .gm-style .gm-style-iw-c{background:#111827!important;color:#eef4ff!important;border:1px solid #334155!important}
html[data-theme="dark"] .gm-style .gm-style-iw-tc:after{background:#111827!important}
html[data-theme="dark"] .gm-info-title,html[data-theme="dark"] .gm-info-device,html[data-theme="dark"] .gm-info-select-label{color:#eef4ff!important}
html[data-theme="dark"] .gm-info-device span{color:#cbd5e1!important}
html[data-theme="dark"] .gm-info-select-label select{background:#172338!important;color:#eef4ff!important;border-color:#3a4a65!important}
.settings-panel{margin-bottom:14px}.theme-choice-grid{display:grid;grid-template-columns:repeat(2,minmax(240px,1fr));gap:12px}.theme-choice{min-height:96px;display:grid;justify-items:start;align-content:center;gap:6px;text-align:left;border-radius:10px;padding:18px}.theme-choice b{font-size:18px}.theme-choice span{font-size:13px;color:var(--muted)}.theme-choice.active{border:2px solid var(--accent);box-shadow:0 0 0 3px rgba(96,165,250,.18)}.text-settings-form{display:grid;gap:10px}.text-size-row{display:grid;grid-template-columns:minmax(260px,1fr) minmax(160px,360px) 62px;gap:14px;align-items:center;border:1px solid var(--line);border-radius:8px;background:var(--panel2);padding:12px}.text-size-row span{display:grid;gap:4px}.text-size-row small{color:var(--muted);font-weight:600}.text-size-row output{font-weight:900;text-align:right}.text-size-row input[type="range"]{width:100%;accent-color:var(--accent);padding:0}.mt{margin-top:14px}@media (max-width:760px){.theme-choice-grid{grid-template-columns:1fr}.text-size-row{grid-template-columns:1fr;gap:7px}.text-size-row output{text-align:left}}
