:root{--brand: #3ba68a;--brand-hover: #32907780;--brand-strong: #2e8f76;--brand-dark: #2c7f68;--brand-soft: #e8f6f1;--brand-ring: rgba(59, 166, 138, .18);--bg: #f1f2f4;--surface: #ffffff;--surface-2: #f7f8fa;--surface-3: #eef0f3;--card: #ffffff;--ink: #16181d;--border: #e9ebef;--border-strong: #dcdfe4;--divider: #eef0f3;--text: #14171a;--text-2: #5f6b76;--muted: #5f6b76;--text-3: #98a2ad;--ok: #2e9e78;--ok-soft: #e4f5ef;--info: #3b7ddd;--info-soft: #e9f1fd;--wait: #b6820a;--wait-soft: #fcf4e2;--attn: #d9670f;--attn-soft: #fdefe3;--danger: #d94a40;--danger-soft: #fdecea;--neutral: #6b7681;--neutral-soft: #f0f2f4;--red: #d94a40;--red-light: #fdecea;--amber: #b6820a;--amber-light: #fcf4e2;--r-xs: 6px;--r-sm: 8px;--r-md: 10px;--r-lg: 14px;--r-xl: 20px;--r-pill: 999px;--sh-1: 0 1px 2px rgba(16, 24, 40, .05);--sh-2: 0 4px 14px rgba(16, 24, 40, .07);--sh-3: 0 20px 52px rgba(16, 24, 40, .16);--s1: 4px;--s2: 8px;--s3: 12px;--s4: 16px;--s5: 20px;--s6: 24px;--s7: 32px;--font: "Sarabun", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--fs-xs: 11.5px;--fs-sm: 12.5px;--fs-base: 13.5px;--fs-md: 15px;--fs-lg: 18px;--fs-xl: 22px;--fs-2xl: 27px;--lh: 1.6;--topbar-h: 60px}[data-theme=dark]{--brand: #4fd6b0;--brand-hover: #3fc39e;--brand-strong: #6ee3c2;--brand-dark: #7fe8c9;--brand-soft: #16352e;--brand-ring: rgba(79, 214, 176, .22);--bg: #0d1012;--surface: #16191d;--surface-2: #1b1f24;--surface-3: #22272d;--card: #16191d;--ink: #f4f6f8;--border: #262b31;--border-strong: #333a42;--divider: #21262c;--text: #e6eaee;--text-2: #98a3ae;--muted: #98a3ae;--text-3: #6d7883;--ok: #43c895;--ok-soft: #15342a;--info: #63a0f0;--info-soft: #14263c;--wait: #d6a52f;--wait-soft: #332813;--attn: #ef8542;--attn-soft: #362013;--danger: #ef6b60;--danger-soft: #371c1a;--neutral: #8b959f;--neutral-soft: #22272d;--red: #ef6b60;--red-light: #371c1a;--amber: #d6a52f;--amber-light: #332813;--sh-1: 0 1px 2px rgba(0, 0, 0, .3);--sh-2: 0 4px 14px rgba(0, 0, 0, .34);--sh-3: 0 20px 52px rgba(0, 0, 0, .5)}*,*:before,*:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{margin:0;font-family:var(--font);font-size:var(--fs-base);line-height:var(--lh);color:var(--text);background:var(--bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{margin:0;font-weight:600;line-height:1.4;letter-spacing:-.011em}p{margin:0}a{color:var(--brand-strong);text-decoration:none}a:hover{text-decoration:underline}.num,.metric-value,.rail-count,table td.num,table th.num,.kpi-num,.score-num,.inst-kpi-num{font-variant-numeric:tabular-nums}input,select,textarea,button{font-family:inherit;font-size:var(--fs-base)}input[type=text],input[type=search],input[type=email],input[type=password],input[type=number],input[type=date],input[type=time],select,textarea{height:36px;padding:0 11px;border:1px solid var(--border-strong);border-radius:var(--r-md);background:var(--surface);color:var(--text);outline:none;transition:border-color .15s,box-shadow .15s}textarea{height:auto;padding:9px 11px;line-height:var(--lh)}input:focus,select:focus,textarea:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-ring)}input::placeholder,textarea::placeholder{color:var(--text-3)}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding-right:30px;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2398a2ad' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 9px center;background-size:15px}[data-theme=dark] select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236d7883' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E")}button{cursor:pointer}button:disabled,input:disabled,select:disabled{opacity:.55;cursor:not-allowed}.ico{flex:none;display:inline-block;vertical-align:-.15em}*{scrollbar-width:thin;scrollbar-color:var(--border-strong) transparent}*::-webkit-scrollbar{width:10px;height:10px}*::-webkit-scrollbar-track{background:transparent}*::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:999px;border:3px solid transparent;background-clip:content-box}*::-webkit-scrollbar-thumb:hover{background:var(--text-3);background-clip:content-box}.u-row{display:flex;align-items:center;gap:var(--s2)}.u-spread{display:flex;align-items:center;justify-content:space-between;gap:var(--s3)}.u-muted{color:var(--muted)}.u-hide{display:none!important}:root{--brand:#3ba68a;--brand-dark:#2c7f68;--brand-light:#e2f5ef;--red:#e0483e;--red-light:#fdeceb;--amber:#b8860b;--amber-light:#fdf3e0;--bg:#f2f5f3;--card:#ffffff;--border:#e6eae8;--text:#1c2621;--muted:#6b7a72}[data-theme=dark]{--brand:#4fd6b0;--brand-dark:#7fe8c9;--brand-light:#173832;--red:#ff7a70;--red-light:#3a1f1d;--amber:#e0b84a;--amber-light:#3a2f14;--bg:#121815;--card:#1b2420;--border:#2b3630;--text:#e8efe9;--muted:#93a39a}[data-theme=dark] .thailand-map-wrap{background:#1b2420}[data-theme=dark] .prov-path.no-data{fill:#2b3630}[data-theme=dark] .html-label{background:#1b2420bf;color:#dfeee8}[data-theme=dark] .map-back-overlay,[data-theme=dark] .map-title-overlay{background:#1b2420eb;color:var(--text);border-color:var(--border)}[data-theme=dark] input,[data-theme=dark] select{background:#1b2420;color:var(--text);border-color:#3a4740}[data-theme=dark] table.detail-table th{background:#212b26}[data-theme=dark] table.detail-table tbody tr.row-highlight{background:#4a3d17}[data-theme=dark] .config-box{background:#2a2416;border-color:#5a4a1e;color:var(--text)}[data-theme=dark] .lb-row,[data-theme=dark] .district-row{background:#212b26}[data-theme=dark] .lb-row:hover,[data-theme=dark] .district-row:hover{background:#283630}[data-theme=dark] table.summary-table tr:hover td,[data-theme=dark] table.detail-table tbody tr:hover{background:#212b26}[data-theme=dark] table.detail-table tbody tr.row-highlight:hover{background:#4a3d17}[data-theme=dark] .btn-outline{background:#1b2420;border-color:#3a4740;color:var(--text)}[data-theme=dark] .btn-outline:hover{background:#283630}[data-theme=dark] .people-group-title .badge{background:#00000047}[data-theme=dark] .district-row.needs-attention{background:#2e1c1a}[data-theme=dark] header.topbar{background:linear-gradient(120deg,#0f2a22,#1a4c3d);box-shadow:0 2px 14px #00000059}*{box-sizing:border-box}body{font-family:Sarabun,sans-serif;margin:0;background:var(--bg);color:var(--text)}header.topbar{background:linear-gradient(120deg,var(--brand-dark),var(--brand));color:#fff;padding:20px 28px 0;box-shadow:0 2px 10px #00000014}header.topbar h1{margin:0;font-size:21px;font-weight:700}header.topbar p{margin:4px 0 14px;font-size:13px;opacity:.9}.header-top-row{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.header-brand{display:flex;align-items:center;gap:12px}.brand-logo{width:46px;height:46px;border-radius:10px;background:#fff;padding:4px;object-fit:contain;box-shadow:0 1px 4px #00000026;flex-shrink:0}.theme-toggle-btn{background:#ffffff26;border:none;color:#fff;width:38px;height:38px;border-radius:50%;cursor:pointer;font-size:16px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.theme-toggle-btn:hover{background:#ffffff47}.module-switcher{display:flex;gap:8px;margin:14px 0 2px}.module-btn{background:#ffffff24;color:#fff;border:none;border-radius:10px;padding:9px 18px;font-family:inherit;font-size:13.5px;font-weight:700;cursor:pointer;opacity:.8;display:flex;align-items:center;gap:6px;transition:background .18s ease,opacity .18s ease,color .18s ease}.module-btn.active{background:#fff;color:var(--brand-dark);opacity:1}.module-btn:hover{opacity:1}.tabbar{display:flex;gap:4px;padding-top:4px}.tab-btn{background:#ffffff1f;color:#fff;border:none;border-radius:10px 10px 0 0;padding:10px 18px;font-family:inherit;font-size:14px;font-weight:600;cursor:pointer;opacity:.75;display:flex;align-items:center;gap:6px;transition:background .18s ease,opacity .18s ease,color .18s ease}.tab-btn.active{background:var(--bg);color:var(--brand-dark);opacity:1}.tab-btn.disabled{cursor:not-allowed;opacity:.55}.soon-badge{background:#fff3cd;color:#8a6d00;font-size:10px;font-weight:700;padding:2px 6px;border-radius:8px}.global-search-wrap{position:relative;margin:10px 0 4px;max-width:420px}.global-search-input{width:100%;padding:10px 14px;border-radius:10px;border:none;font-family:inherit;font-size:13.5px;background:#ffffffeb;color:var(--text);box-sizing:border-box}.global-search-results{position:absolute;top:calc(100% + 6px);left:0;right:0;background:var(--card);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 24px #0000002e;max-height:360px;overflow-y:auto;z-index:500}.global-search-item{display:flex;flex-direction:column;gap:2px;padding:10px 14px;cursor:pointer;border-bottom:1px solid var(--border)}.global-search-item:last-child{border-bottom:none}.global-search-item:hover{background:var(--brand-light)}.global-search-item .gs-title{font-size:13.5px;font-weight:600;color:var(--text)}.global-search-item .gs-sub{font-size:11.5px;color:var(--muted)}.global-search-item .gs-tag{display:inline-block;font-size:10.5px;font-weight:700;padding:1px 8px;border-radius:10px;background:var(--brand-light);color:var(--brand-dark);width:fit-content;margin-bottom:2px}.global-search-empty{padding:14px;font-size:12.5px;color:var(--muted);text-align:center}.container{padding:22px 28px 60px;max-width:1800px;width:96%;margin:0 auto}.tab-content{display:none}@keyframes tabFadeIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.tab-content.active{display:block;animation:tabFadeIn .28s ease}.config-box{background:#fffdf3;border:1px solid #edd888;border-radius:10px;padding:16px 18px;margin-bottom:20px;font-size:14px}.config-box.hidden{display:none}.config-box strong{display:block;margin-bottom:8px}.config-row{display:flex;gap:12px;flex-wrap:wrap;align-items:flex-end}.config-row .field{flex:1;min-width:220px}.config-row label{font-size:12px;color:var(--muted)}.config-box input{width:100%;padding:9px 10px;margin-top:4px;border:1px solid #ccc;border-radius:8px;font-family:inherit}.config-box button{background:var(--brand);color:#fff;border:none;padding:10px 20px;border-radius:8px;cursor:pointer;font-weight:600;font-family:inherit}.config-box button:hover{background:var(--brand-dark)}.config-hint{margin-top:8px;color:var(--muted);font-size:12px}.auth-gate{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px;box-sizing:border-box}.auth-card{background:var(--card);border:1px solid var(--border);border-radius:14px;padding:32px 28px;max-width:380px;width:100%;box-shadow:0 10px 40px #0000001f;box-sizing:border-box}.auth-card .auth-logo{height:40px;margin-bottom:14px}.auth-card h1{font-size:19px;margin:0 0 4px;color:var(--text)}.auth-card .auth-sub{font-size:13px;color:var(--muted);margin:0 0 20px;line-height:1.5}.auth-field{margin-bottom:14px}.auth-field label{display:block;font-size:12px;color:var(--muted);margin-bottom:4px}.auth-field input{width:100%;padding:10px 12px;border:1px solid var(--border);border-radius:8px;font-family:inherit;font-size:14px;background:var(--bg);color:var(--text);box-sizing:border-box}.auth-error{color:var(--red);font-size:13px;margin:-6px 0 14px;display:none;line-height:1.4}.auth-error.show{display:block}.auth-submit-btn{width:100%;padding:11px;background:var(--brand);color:#fff;border:none;border-radius:8px;font-weight:600;font-size:14px;cursor:pointer;font-family:inherit}.auth-submit-btn:hover{background:var(--brand-dark)}.auth-submit-btn:disabled{opacity:.6;cursor:not-allowed}.auth-toggle-link{text-align:center;margin-top:16px;font-size:13px;color:var(--muted)}.auth-toggle-link a{color:var(--brand-dark);cursor:pointer;text-decoration:underline}.auth-pending-icon{font-size:40px;text-align:center;margin-bottom:12px}.kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:14px;margin-bottom:22px}.kpi-card{background:var(--card);border:1px solid var(--border);border-radius:14px;padding:18px 20px;box-shadow:0 1px 3px #0000000a;position:relative;overflow:hidden;transition:transform .18s ease,box-shadow .18s ease}.kpi-card:hover{transform:translateY(-3px);box-shadow:0 10px 24px #0000001a}.kpi-card .kpi-label{font-size:13px;color:var(--muted);font-weight:500}.kpi-card .kpi-num{font-size:30px;font-weight:700;margin-top:4px}.kpi-card .kpi-sub{font-size:12px;color:var(--muted);margin-top:2px}.kpi-card.total .kpi-num{color:#2c3e37}.kpi-card.yes .kpi-num{color:var(--brand-dark)}.kpi-card.no .kpi-num{color:var(--red)}.kpi-card.pct .kpi-num{color:#8a6d00}.kpi-icon{position:absolute;right:16px;top:16px;font-size:26px;opacity:.55}.kpi-card.hero{grid-column:span 2;background:linear-gradient(135deg,var(--brand-dark),var(--brand));color:#fff;border-color:transparent}.kpi-card.hero .kpi-label{color:#ffffffd9}.kpi-card.hero .kpi-num{color:#fff;font-size:38px}.kpi-card.hero .kpi-sub{color:#ffffffd9}.kpi-card.hero .kpi-icon{opacity:.35;font-size:30px}.kpi-card.hero:hover{box-shadow:0 12px 28px #2c7f6859}.kpi-sparkline-wrap{margin-top:8px;height:28px}.kpi-sparkline{width:100%;height:28px;display:block}.section{background:var(--card);border:1px solid var(--border);border-radius:14px;padding:20px 22px;margin-bottom:20px;box-shadow:0 1px 3px #0000000a}.section h2{margin:0 0 14px;font-size:16px;font-weight:700;display:flex;align-items:center;gap:8px;flex-wrap:wrap}.section h2 .badge{font-size:11px;font-weight:600;background:var(--brand-light);color:var(--brand-dark);padding:2px 9px;border-radius:20px}.chart-wrap{height:360px}table.summary-table{width:100%;border-collapse:collapse;font-size:13.5px}table.summary-table th,table.summary-table td{padding:9px 10px;text-align:left;border-bottom:1px solid var(--border)}table.summary-table th{color:var(--muted);font-weight:600;font-size:12px;text-transform:uppercase;letter-spacing:.03em}table.summary-table th.num,table.summary-table td.num{text-align:center;font-variant-numeric:tabular-nums}table.summary-table tr:hover td{background:#fafcfa}.bar-cell{display:flex;align-items:center;gap:8px;min-width:160px}.bar-track{flex:1;height:8px;background:var(--red-light);border-radius:6px;overflow:hidden}.bar-fill{height:100%;background:var(--brand);border-radius:6px 0 0 6px}.pct-text{font-size:12px;color:var(--muted);min-width:40px;text-align:right}.filters{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:14px;align-items:flex-end}.filters div{display:flex;flex-direction:column;font-size:12px;color:var(--muted)}select,input[type=text]{padding:9px 10px;border:1px solid #ccc;border-radius:8px;min-width:160px;font-family:inherit;font-size:13.5px}.btn{padding:9px 18px;border:none;border-radius:8px;cursor:pointer;font-weight:600;font-family:inherit;font-size:13.5px;transition:background .18s ease,box-shadow .18s ease,transform .1s ease}.btn:active{transform:translateY(1px)}.btn-brand{background:var(--brand);color:#fff}.btn-brand:hover{background:var(--brand-dark);box-shadow:0 2px 10px #2c7f6840}.btn-outline{background:#fff;border:1px solid var(--border);color:var(--text)}.btn-outline:hover{background:var(--brand-light);border-color:var(--brand)}table.detail-table{width:100%;border-collapse:collapse;font-size:13px}table.detail-table th,table.detail-table td{padding:8px 10px;border-bottom:1px solid var(--border);text-align:left;white-space:nowrap}table.detail-table th{background:#f5f8f6;position:sticky;top:0;box-shadow:0 1px 0 var(--border)}table.detail-table tbody tr:hover{background:#f7faf7}table.detail-table tbody tr.row-highlight{background:#fff3cd}.tag{padding:2px 9px;border-radius:10px;font-size:12px;font-weight:700}.tag-Y{background:var(--brand-light);color:var(--brand-dark)}.tag-N{background:var(--red-light);color:var(--red)}.table-wrap{overflow:auto;max-height:60vh;border-radius:10px;border:1px solid var(--border)}#status{font-size:12.5px;color:var(--muted);margin-bottom:12px}.empty-state-cell{text-align:center;padding:34px 20px!important;color:var(--muted)}.empty-state-cell .empty-icon{display:block;font-size:30px;margin-bottom:8px;opacity:.7}.empty-state-cell .empty-text{font-size:13px;line-height:1.6}.toggle-detail{display:flex;justify-content:space-between;align-items:center;cursor:pointer}.chevron{transition:transform .2s}.scoreboard{display:flex;align-items:center;gap:18px;background:#0f2418;color:#fff;border-radius:14px;padding:20px 24px;margin-bottom:18px;box-shadow:0 4px 16px #00000026}.score-side{text-align:center;min-width:130px}.score-num{font-size:34px;font-weight:700;font-variant-numeric:tabular-nums}.score-label{font-size:12px;opacity:.75;margin-top:2px;text-transform:uppercase;letter-spacing:.04em}.score-side.yes .score-num{color:#4fd6b0}.score-side.no .score-num{color:#ff6b60}.score-mid{flex:1}.score-bar{position:relative;height:26px;border-radius:13px;overflow:hidden;background:#1c3327;display:flex}.score-bar-fill-y{background:linear-gradient(90deg,#2c7f68,#4fd6b0);height:100%;transition:width .8s ease}.score-bar-fill-n{background:linear-gradient(90deg,#ff6b60,#e0483e);height:100%;transition:width .8s ease}.score-pct-labels{display:flex;justify-content:space-between;margin-top:6px;font-size:12px;opacity:.85}.map-layout{display:grid;grid-template-columns:1fr 300px;gap:16px}@media(max-width:900px){.map-layout{grid-template-columns:1fr}}.map-search-row{display:flex;gap:8px;margin-bottom:12px}.map-search-row input{flex:1}#mapSearchStatus,#iotMapSearchStatus{font-size:12px;color:var(--muted);margin-top:4px;min-height:16px}.thailand-map-wrap{background:#eef4f0;border-radius:12px;padding:12px;display:flex;justify-content:center;position:relative;overflow:hidden}#thailandSvg,#iotSvg{width:100%;height:auto}.prov-path.no-data{stroke:#fff;stroke-width:.7;fill:#e2e6e4;cursor:default}.prov-path.has-data{cursor:pointer}.prov-path.has-data:hover{filter:brightness(1.08)}.prov-outline{fill:none;stroke:#fff;stroke-width:.7;pointer-events:none}.dist-path{cursor:pointer}.dist-path:hover{filter:brightness(1.08)}.dist-path-flat{stroke:#fff;stroke-width:.8;cursor:default}.dist-outline{fill:none;stroke:#fff;stroke-width:.8;pointer-events:none}.map-label{font-family:Sarabun,sans-serif;text-anchor:middle;pointer-events:none;paint-order:stroke;stroke:#eef4f0;stroke-width:2px;fill:#33403a;font-weight:500}#mapLabelsHtml,#iotMapLabelsHtml{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.html-label{position:absolute;transform:translate(-50%,-50%);font-family:Sarabun,sans-serif;font-size:10.5px;font-weight:500;color:#2c3a34;background:#eef4f0a6;padding:0 4px;border-radius:3px;white-space:nowrap;line-height:1.5}.map-back-overlay{position:absolute;top:14px;left:14px;z-index:5;background:#fffffff0;border:1px solid var(--border);border-radius:8px;padding:8px 14px;font-size:13px;font-weight:600;cursor:pointer;box-shadow:0 2px 8px #00000026;display:none;font-family:inherit}.map-back-overlay.visible{display:inline-block}.map-title-overlay{position:absolute;top:14px;right:14px;z-index:5;background:#fffffff0;border:1px solid var(--border);border-radius:8px;padding:6px 12px;font-size:12.5px;font-weight:600;color:var(--text);max-width:60%;text-align:right}.map-loading{font-size:12.5px;color:var(--muted);text-align:center;padding:20px}.spinner-inline{display:inline-block;width:13px;height:13px;margin-right:7px;vertical-align:middle;border:2px solid rgba(0,0,0,.15);border-top-color:var(--brand);border-radius:50%;animation:spinInline .7s linear infinite}[data-theme=dark] .spinner-inline{border-color:#ffffff26;border-top-color:var(--brand)}@keyframes spinInline{to{transform:rotate(360deg)}}.map-caption{font-size:11.5px;color:var(--muted);text-align:center;margin-top:6px}.map-legend{display:flex;gap:20px;align-items:center;margin-top:10px;font-size:12.5px;color:var(--muted);flex-wrap:wrap;justify-content:center}.legend-dot{width:12px;height:12px;border-radius:50%;display:inline-block;margin-right:4px;vertical-align:middle}.map-side-panel{display:flex;flex-direction:column;min-height:0}.leaderboard{display:flex;flex-direction:column;gap:8px;flex:1;min-height:0;overflow:auto}.lb-title{font-size:12px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;margin-bottom:2px}.lb-row{display:flex;align-items:center;gap:10px;background:#fafcfa;border:1px solid var(--border);border-radius:10px;padding:8px 10px;cursor:pointer}.lb-row:hover{background:#f2f7f4}.lb-rank{width:24px;height:24px;border-radius:50%;background:var(--border);color:var(--text);font-size:12px;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0}.lb-rank.gold{background:#f5c518;color:#3a2c00}.lb-rank.silver{background:#c9ccd1;color:#2b2b2b}.lb-rank.bronze{background:#d99150;color:#3a1e00}.lb-info{flex:1;min-width:0}.lb-name{font-size:13px;font-weight:600;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.lb-count{font-size:11.5px;font-weight:500;color:var(--muted);margin-bottom:4px}.lb-bar-track{height:6px;background:var(--red-light);border-radius:4px;overflow:hidden}.lb-bar-fill{height:100%;background:var(--brand);border-radius:4px;transition:width .6s ease}.lb-pct{font-size:13px;font-weight:700;color:var(--brand-dark);min-width:38px;text-align:right}.province-detail,.people-panel{margin-top:18px;display:none}.detail-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;flex-wrap:wrap;gap:8px}.people-group{margin-bottom:18px}.people-group-title{font-size:14px;font-weight:700;padding:6px 12px;border-radius:8px;margin-bottom:8px;display:inline-flex;align-items:center;gap:6px}.people-group-title.group-yes{background:var(--brand-light);color:var(--brand-dark)}.people-group-title.group-no{background:var(--red-light);color:var(--red)}.people-group-title.group-blocked{background:var(--amber-light);color:var(--amber)}.people-group-title .badge{background:#fff9}.qa-presets{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px}.qa-chip{background:var(--brand-light);color:var(--brand-dark);border:none;padding:7px 14px;border-radius:20px;font-size:12.5px;cursor:pointer;font-family:inherit}.qa-chip:hover{filter:brightness(.95)}.qa-log{display:flex;flex-direction:column;gap:10px;min-height:120px;max-height:420px;overflow-y:auto;margin-bottom:14px;padding:4px}.qa-msg{padding:10px 14px;border-radius:12px;font-size:14px;line-height:1.55;max-width:80%;white-space:pre-line}.qa-user{align-self:flex-end;background:var(--brand);color:#fff;border-bottom-right-radius:2px}.qa-bot{align-self:flex-start;background:var(--bg);border:1px solid var(--border);border-bottom-left-radius:2px}.qa-input-row{display:flex;gap:10px}.qa-input-row input{flex:1}.qa-bubble-btn{position:fixed;bottom:24px;right:24px;width:60px;height:60px;border-radius:50%;background:#fff;border:none;box-shadow:0 6px 20px #00000040;cursor:pointer;z-index:9990;display:flex;align-items:center;justify-content:center;padding:6px;box-sizing:border-box;transition:transform .18s ease,box-shadow .18s ease}.qa-bubble-btn:hover{transform:scale(1.06);box-shadow:0 8px 26px #00000052}.qa-bubble-btn img{width:100%;height:100%;object-fit:contain;border-radius:50%}.qa-popup-panel{display:none;position:fixed;bottom:96px;right:24px;width:360px;max-width:calc(100vw - 32px);max-height:min(70vh,560px);background:var(--card);border:1px solid var(--border);border-radius:16px;box-shadow:0 12px 36px #00000047;z-index:9989;flex-direction:column;overflow:hidden}.qa-popup-panel.open{display:flex}.qa-popup-header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:14px 16px;background:linear-gradient(120deg,var(--brand-dark),var(--brand));color:#fff;flex-shrink:0}.qa-popup-header h2{margin:0;font-size:14.5px;color:#fff}.qa-popup-close{background:#ffffff2e;border:none;color:#fff;width:26px;height:26px;border-radius:50%;cursor:pointer;font-size:15px;line-height:1;flex-shrink:0}.qa-popup-close:hover{background:#ffffff4d}.qa-popup-body{padding:16px;overflow-y:auto}@media(max-width:480px){.qa-popup-panel{right:16px;bottom:88px;width:calc(100vw - 32px)}.qa-bubble-btn{right:16px;bottom:16px}}.detail-header h3{margin:0;font-size:16px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}.district-list{display:flex;flex-direction:column;gap:8px}.district-row{display:grid;grid-template-columns:140px 1fr 170px 50px;align-items:center;gap:12px;background:#fafcfa;border:1px solid var(--border);border-left:4px solid var(--brand);border-radius:8px;padding:9px 12px;cursor:pointer}.district-row:hover{background:#f2f7f4}.district-row.needs-attention{border-left-color:var(--red);background:#fff8f7}.dr-name{font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dr-bar-track{height:7px;background:var(--red-light);border-radius:4px;overflow:hidden}.dr-bar-fill{height:100%;background:var(--brand);border-radius:4px}.dr-stats{font-size:12px;color:var(--muted);white-space:nowrap}.dr-pct{font-size:13px;font-weight:700;text-align:right}@media(max-width:700px){.district-row{grid-template-columns:1fr}}.soon-card{text-align:center;padding:60px 20px;color:var(--muted)}.soon-card .icon{font-size:44px;margin-bottom:10px}.soon-card h3{color:var(--text);margin:0 0 8px}.plan-person-results{max-height:220px;overflow:auto;border:1px solid var(--border);border-radius:8px;margin-top:8px}.plan-person-results:empty{display:none;border:none}.plan-person-result-item{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;border-bottom:1px solid var(--border);gap:10px}.plan-person-result-item:last-child{border-bottom:none}.plan-person-result-item .ppr-info{font-size:13px;color:var(--text)}.plan-week-input,.plan-note-input{width:100%;min-width:0;box-sizing:border-box;padding:5px 8px;border:1px solid var(--border);border-radius:6px;font-family:inherit;font-size:13px;background:var(--card);color:var(--text)}.plan-month-week-select{width:100%;min-width:145px;box-sizing:border-box;padding:5px 8px;border:1px solid var(--border);border-radius:6px;font-family:inherit;font-size:13px;background:var(--card);color:var(--text)}.plan-remove-btn{background:none;border:none;cursor:pointer;font-size:16px;color:#c0392b}.plan-remove-btn:hover{opacity:.7}.people-group-actions{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 10px}.btn-xs{padding:5px 12px;font-size:12px}.plan-added-tag{font-size:12px;color:var(--brand-dark);font-weight:600;white-space:nowrap}.plan-range-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:4px 0 16px}.plan-range-label{font-size:13px;color:var(--muted);font-weight:600;margin-right:2px}.range-btn{background:var(--card);border:1px solid var(--border);color:var(--text);padding:6px 16px;border-radius:20px;font-size:12.5px;cursor:pointer;font-family:inherit;font-weight:600}.range-btn:hover{filter:brightness(.97)}.range-btn.active{background:var(--brand);color:#fff;border-color:var(--brand)}.plan-chart-wrap{height:220px;margin-bottom:22px}.plan-timeline-cols{display:grid;grid-template-columns:1fr 1fr;gap:20px}@media(max-width:800px){.plan-timeline-cols{grid-template-columns:1fr}}.plan-timeline-heading{font-size:14px;font-weight:700;margin:0 0 12px;padding:6px 12px;border-radius:8px;display:inline-block}.plan-timeline-heading.past{background:var(--red-light);color:var(--red)}.plan-timeline-heading.upcoming{background:var(--brand-light);color:var(--brand-dark)}.plan-timeline-list{max-height:360px;overflow:auto;display:flex;flex-direction:column;gap:10px}.plan-timeline-empty{color:var(--muted);font-size:13px;padding:18px;text-align:center;border:1px dashed var(--border);border-radius:10px}.plan-day-group{border:1px solid var(--border);border-radius:10px;padding:10px 12px;background:var(--card)}.plan-day-header{font-size:13px;font-weight:700;display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:6px}.plan-day-header .badge{background:var(--brand-light);color:var(--brand-dark);font-size:11px;padding:2px 9px;border-radius:20px;font-weight:600;flex-shrink:0}.plan-day-header.is-today .badge{background:var(--brand);color:#fff}.plan-day-person{display:flex;justify-content:space-between;gap:10px;font-size:13px;padding:5px 0;border-top:1px dashed var(--border)}.plan-day-person:first-child{border-top:none}.plan-day-person-loc{color:var(--muted);font-size:12px;white-space:nowrap}.plan-map-input{margin-bottom:4px}.plan-map-actions{display:flex;align-items:center;gap:10px;font-size:11px}.plan-meta-line{font-size:10.5px;color:var(--muted);margin-top:4px;white-space:normal}body.readonly-mode #planTbody select,body.readonly-mode #planTbody input,body.readonly-mode #iotPlanTbody select,body.readonly-mode #iotPlanTbody input,body.readonly-mode #iotPlanFinalizedGroups select,body.readonly-mode #iotPlanFinalizedGroups input,body.readonly-mode #iotManualCodeSearchTbody input,body.readonly-mode #trainingConfirmTbody input{pointer-events:none;background:var(--bg)!important;opacity:.7}body.readonly-mode #trainingConfirmTbody .btn-linklike{display:none!important}.dropdown-manager{border:1px solid var(--border);border-radius:8px;margin:4px 0 10px;background:var(--card)}.dropdown-manager-header{display:flex;align-items:center;gap:8px;padding:9px 12px;cursor:pointer;flex-wrap:wrap}.dropdown-manager-body{padding:4px 12px 12px;display:flex;flex-wrap:wrap;gap:14px}.dropdown-manager-cat{flex:1;min-width:220px;border:1px solid var(--border);border-radius:8px;padding:8px 10px;background:var(--bg)}.dropdown-manager-cat-title{font-weight:700;font-size:13px;margin-bottom:6px}.dropdown-chips{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:7px}.dropdown-chip{display:inline-flex;align-items:center;gap:4px;font-size:12px;padding:2px 8px;border-radius:999px;border:1px solid var(--border)}.dropdown-chip.is-default{background:var(--card);color:var(--muted)}.dropdown-chip.is-custom{background:#ecfdf5;color:#065f46;border-color:#6ee7b7}.dropdown-chip.is-custom button{border:none;background:transparent;color:#dc2626;cursor:pointer;font-size:12px;line-height:1;padding:0 1px}.dropdown-add-row{display:flex;gap:6px}.dropdown-add-row input{flex:1;min-width:0;padding:5px 8px;border:1px solid var(--border);border-radius:6px;font-family:inherit;font-size:12.5px;background:var(--card);color:var(--text)}body.readonly-mode .dropdown-add-row,body.readonly-mode .dropdown-chip.is-custom button{display:none!important}.iot-map-name-toggle{cursor:pointer;color:var(--brand);font-weight:600}.iot-map-name-toggle .caret{display:inline-block;transition:transform .2s;font-size:10px}.iot-map-name-toggle .caret.open{transform:rotate(90deg)}.iot-map-detail-row>td{background:var(--bg);padding:0!important}.iot-map-detail{padding:10px 12px}.iot-map-detail-ctx{display:flex;flex-wrap:wrap;gap:6px 16px;font-size:12px;color:var(--muted);margin-bottom:9px;padding-bottom:8px;border-bottom:1px dashed var(--border)}.iot-map-detail-ctx b{color:var(--text);font-weight:600}.iot-map-detail-empty{font-size:13px;color:var(--muted);padding:4px 0}.iot-map-detail-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px 12px}.iot-map-detail-grid label{display:flex;flex-direction:column;gap:3px;font-size:11.5px;font-weight:600;color:var(--muted)}.iot-map-detail-grid label.iot-map-detail-wide{grid-column:1 / -1}.iot-map-detail-grid select,.iot-map-detail-grid input{padding:5px 8px;border:1px solid var(--border);border-radius:6px;font-family:inherit;font-size:13px;background:var(--card);color:var(--text);font-weight:400}.iot-map-detail-foot{margin-top:9px}body.readonly-mode .iot-map-detail select,body.readonly-mode .iot-map-detail input{pointer-events:none;opacity:.7;background:var(--bg)!important}body.readonly-mode .iot-map-detail-empty button,body.readonly-mode .iot-map-detail-foot{display:none!important}#installerShell{max-width:900px;margin:12px auto;padding:16px 16px 44px;background:var(--bg);color:var(--text);border-radius:16px;box-shadow:0 6px 24px #00000026}#installerShell .inst-team-name,#installerShell h3,#installerShell h4,#installerShell b,#installerShell strong{color:var(--text)}.inst-topbar{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin:6px 0 10px}.inst-team-name{font-size:16px}.inst-actions{display:flex;gap:8px;flex-wrap:wrap}.inst-summary{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:12px}.inst-kpi{background:var(--card);border:1px solid var(--border);border-radius:10px;padding:10px 8px;text-align:center}.inst-kpi-num{font-size:22px;font-weight:800}.inst-kpi-label{font-size:11.5px;color:var(--muted);margin-top:2px}.inst-kpi.ok .inst-kpi-num{color:#16a34a}.inst-kpi.pending .inst-kpi-num{color:#d97706}.inst-kpi.money .inst-kpi-num{color:#2563eb}.inst-tabbar{display:flex;gap:6px;margin-bottom:12px;flex-wrap:wrap}.inst-tab-btn{flex:1;min-width:120px;padding:10px;border:1px solid var(--border);border-radius:8px;background:var(--card);cursor:pointer;font-family:inherit;font-size:14px;font-weight:600;color:var(--text)}.inst-tab-btn.active{background:var(--brand);color:#fff;border-color:var(--brand)}.inst-group{display:flex;align-items:center;gap:8px;cursor:pointer;padding:9px 11px;border:1px solid var(--border);border-radius:8px;margin-top:8px;background:var(--card)}.inst-group.sub{padding:7px 10px;background:var(--bg);font-size:13.5px}.inst-group-count{font-size:12px;color:var(--muted)}.inst-job-card{border:1px solid var(--border);border-radius:10px;padding:11px 13px;margin:8px 0;background:var(--card)}.inst-job-card.row-done{opacity:.72}.inst-list-row{display:flex;align-items:center;gap:10px;padding:13px 12px;border:1px solid var(--border);border-radius:10px;margin:7px 0;background:var(--card);cursor:pointer;transition:background .12s ease}.inst-list-row:active{background:var(--brand-light)}.inst-list-name{font-size:15px;font-weight:700}.inst-list-sub{font-size:12.5px;color:var(--muted);margin-top:2px}.inst-list-go{font-size:24px;line-height:1;color:var(--muted);flex-shrink:0}.inst-list-row.row-done,.inst-list-row.row-cancelled{opacity:.6}.inst-detail-back{margin-bottom:10px}.note-flag{display:block;margin-top:6px;background:#fff3cd;color:#7a4e00;border:1px solid #ffd666;border-left:4px solid #f0a500;border-radius:6px;padding:6px 10px;font-size:12.5px;font-weight:600;line-height:1.35;word-break:break-word}[data-theme=dark] .note-flag{background:#3a2f12;color:#ffd98a;border-color:#5a4a1e;border-left-color:#c79a2e}.note-input-filled{background:#fff8e1!important;border-color:#f0a500!important;box-shadow:0 0 0 2px #f0a5002e;font-weight:600}[data-theme=dark] .note-input-filled{background:#3a2f12!important;border-color:#c79a2e!important;color:var(--text)}.call-wrap{display:grid;grid-template-columns:270px 1fr;gap:14px;align-items:start;margin-top:12px}.call-list{background:var(--bg);border:1px solid var(--border);border-radius:12px;padding:10px;position:sticky;top:8px;max-height:80vh;overflow:auto}.call-list-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;font-size:13px;font-weight:600}.call-remain{background:var(--red-light);color:var(--red);font-size:12px;padding:2px 9px;border-radius:20px}.call-row{padding:8px 9px;border-radius:8px;cursor:pointer;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:2px}.call-row:hover{background:var(--brand-light)}.call-row.on{background:var(--brand-light);box-shadow:inset 3px 0 0 var(--brand)}.call-row-name{font-size:13px;font-weight:600}.call-row-area{font-size:11px;color:var(--muted)}.call-dot{width:8px;height:8px;border-radius:50%;display:inline-block;margin-right:6px;flex-shrink:0}.call-form-card{background:var(--card);border:1px solid var(--border);border-radius:12px;padding:16px 18px}.call-meter{display:flex;align-items:center;gap:10px;background:var(--brand-light);border-radius:8px;padding:8px 12px;margin:12px 0;font-size:13px;color:var(--brand-dark);font-weight:600}.call-meter-bar{flex:1;height:8px;background:var(--card);border-radius:20px;overflow:hidden}.call-meter-fill{height:100%;background:var(--brand);transition:width .2s ease}.call-sec{font-size:12px;color:var(--muted);margin:14px 0 6px;font-weight:600}.call-fields{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:9px 12px}.call-fields label{display:flex;flex-direction:column;gap:3px;font-size:12px;color:var(--muted)}.call-fields label span{color:var(--text);font-weight:600}.call-field-miss select,.call-field-miss input{border-color:#ef9f27;background:#fdf7ec}[data-theme=dark] .call-field-miss select,[data-theme=dark] .call-field-miss input{background:#3a2f12}.call-ask{display:inline-block;background:#faeeda;color:#854f0b;font-size:10px;font-weight:600;padding:1px 6px;border-radius:20px;margin-left:5px}.call-empty{color:var(--muted);text-align:center;padding:40px 10px}@media(max-width:760px){.call-wrap{grid-template-columns:1fr}.call-list{position:static;max-height:none}}.inst-job-top{display:flex;justify-content:space-between;align-items:baseline;gap:8px;flex-wrap:wrap}.inst-job-name{font-size:15.5px;font-weight:700}.inst-job-when{font-size:12.5px;color:var(--muted);white-space:nowrap}.inst-job-area{font-size:13px;color:var(--muted);margin-top:3px}.inst-job-detail{color:var(--text)}.inst-badge{display:inline-block;font-size:11px;font-weight:700;padding:1px 8px;border-radius:999px;margin-left:4px}.inst-badge.s-pending{background:#fef3c7;color:#92400e}.inst-badge.s-done{background:#dcfce7;color:#166534}.inst-badge.s-cancelled{background:#fee2e2;color:#991b1b}.inst-job-actions{display:flex;gap:8px;margin-top:9px;flex-wrap:wrap}.inst-act-btn{display:inline-flex;align-items:center;gap:5px;padding:9px 14px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none}.inst-act-btn.call{background:#16a34a;color:#fff}.inst-act-btn.nav{background:#2563eb;color:#fff}.inst-act-btn.disabled{background:var(--bg);color:var(--muted)}.inst-job-edit{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px 10px;margin-top:10px;padding-top:9px;border-top:1px dashed var(--border)}.inst-job-edit label{display:flex;flex-direction:column;gap:3px;font-size:11.5px;font-weight:600;color:var(--muted)}.inst-job-edit label.inst-pay-check{flex-direction:row;align-items:center;gap:6px;font-size:13px;color:var(--text);align-self:end}.inst-job-edit label.inst-note-wide{grid-column:1 / -1}.inst-job-edit select,.inst-job-edit input[type=text],.inst-job-edit input[type=number]{padding:8px;border:1px solid var(--border);border-radius:7px;font-family:inherit;font-size:14px;background:var(--card);color:var(--text);font-weight:400}.inst-nomap{margin-top:12px;padding:10px 12px;background:#fffbeb;border:1px solid #fbbf24;border-radius:8px;font-size:13px;color:#92400e}@media(max-width:640px){.inst-summary{grid-template-columns:repeat(2,1fr)}}.inst-act-btn.submit{background:#7c3aed;color:#fff}.fs-modal{max-width:560px}#fieldSubBody .fs-job{font-weight:700;font-size:14.5px;margin-bottom:10px}.fs-section{margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid var(--border)}.fs-section:last-child{border-bottom:none}.fs-section h4{margin:0 0 8px;font-size:13.5px}.fs-plot-row{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:6px}.fs-section>input[type=text]{width:100%;padding:8px 10px;border:1px solid var(--border);border-radius:7px;font-family:inherit;font-size:13px;background:var(--card);color:var(--text);box-sizing:border-box}.fs-hint{font-size:11.5px;color:var(--muted);margin-top:5px}.fs-photos{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.fs-slot{border:1px solid var(--border);border-radius:8px;padding:8px;text-align:center;background:var(--bg)}.fs-slot-label{font-size:11.5px;font-weight:600;margin-bottom:6px;min-height:28px}.fs-thumb{width:100%;height:96px;object-fit:cover;border-radius:6px;display:block}.fs-thumb.fs-empty{display:flex;align-items:center;justify-content:center;color:var(--muted);font-size:12px;background:var(--card);border:1px dashed var(--border)}.fs-upload-btn{display:inline-block;margin-top:7px;padding:7px 12px;border-radius:7px;background:var(--brand);color:#fff;font-size:12.5px;font-weight:600;cursor:pointer}.fs-doc{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:600;cursor:pointer}.fs-del-btn{display:inline-block;margin-top:6px;margin-left:6px;padding:6px 10px;border-radius:7px;background:#fff;border:1px solid #fca5a5;color:#dc2626;font-size:12px;font-weight:600;cursor:pointer}.fs-drive{background:#f5f3ff;border:1px solid #ddd6fe;border-radius:8px;padding:10px 12px}.fs-drive h4{color:#6d28d9}.inst-preview-banner{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;background:#fef3c7;border:1px solid #fbbf24;color:#92400e;border-radius:8px;padding:8px 12px;margin:6px 0 10px;font-size:13px}.um-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;z-index:1000;display:flex;align-items:flex-start;justify-content:center;padding:24px 12px;overflow:auto}.um-modal{background:var(--card);border-radius:12px;width:100%;max-width:720px;padding:16px 18px 20px;box-shadow:0 10px 40px #00000040}.um-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:6px}.um-head h3{margin:0}.um-note{font-size:12.5px;color:var(--muted);background:var(--bg);border:1px solid var(--border);border-radius:8px;padding:8px 10px;margin:6px 0 12px}.um-section{margin-bottom:16px}.um-section h4{margin:0 0 8px;font-size:13.5px}.um-addform{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.um-addform input,.um-addform select{padding:8px 10px;border:1px solid var(--border);border-radius:7px;font-family:inherit;font-size:13px;background:var(--card);color:var(--text)}.um-addform input{flex:1;min-width:130px}.um-list{display:flex;flex-direction:column;gap:6px;max-height:320px;overflow:auto}.um-row{display:flex;align-items:center;gap:8px;padding:7px 9px;border:1px solid var(--border);border-radius:8px;background:var(--bg);flex-wrap:wrap}.um-row-email{flex:1;min-width:160px;font-size:13px}.um-row-email b{display:block}.um-row-email span{font-size:11.5px;color:var(--muted)}.um-row select,.um-row input{padding:6px 8px;border:1px solid var(--border);border-radius:6px;font-family:inherit;font-size:12.5px;background:var(--card);color:var(--text)}.um-row input{width:110px}body.readonly-mode .plan-remove-btn,body.readonly-mode #planBulkOperatorBar,body.readonly-mode #iotPlanBulkOperatorBar,body.readonly-mode .readonly-hide{display:none!important}.readonly-badge{display:inline-block;background:#fef3c7;color:#92400e;border:1px solid #fbbf24;border-radius:999px;padding:2px 10px;font-size:11.5px;font-weight:700;white-space:nowrap}.plan-map-link{color:var(--brand-dark);text-decoration:none;font-weight:600;white-space:nowrap}.plan-map-link:hover{text-decoration:underline}.btn-linklike{background:none;border:none;padding:0;margin:0;color:var(--muted);text-decoration:underline;cursor:pointer;font-size:11px;font-family:inherit;white-space:nowrap}.btn-linklike:hover{color:var(--text)}.toast-container{position:fixed;bottom:24px;left:50%;transform:translate(-50%);z-index:9999;display:flex;flex-direction:column;gap:10px;align-items:center;pointer-events:none;width:100%;padding:0 16px;box-sizing:border-box}.toast{display:flex;align-items:flex-start;gap:10px;background:var(--card);border:1px solid var(--border);border-left:4px solid var(--brand);border-radius:10px;padding:12px 16px;box-shadow:0 6px 20px #0000002e;max-width:420px;width:max-content;font-size:13.5px;color:var(--text);opacity:0;transform:translateY(12px);transition:opacity .25s ease,transform .25s ease;pointer-events:auto}.toast.show{opacity:1;transform:translateY(0)}.toast-icon{flex-shrink:0;font-size:16px;line-height:1.4}.toast-msg{line-height:1.5;word-break:break-word}.toast-success{border-left-color:var(--brand)}.toast-error{border-left-color:var(--red)}.toast-warn{border-left-color:#d9a441}.toast-info{border-left-color:#4a90d9}.confirm-modal-overlay{display:none;position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;z-index:9998;align-items:center;justify-content:center;padding:20px;box-sizing:border-box}.confirm-modal{background:var(--card);border:1px solid var(--border);border-radius:14px;padding:24px 26px;max-width:380px;width:100%;box-shadow:0 10px 40px #0000004d}.confirm-modal p{margin:0 0 22px;font-size:14.5px;color:var(--text);line-height:1.6}.confirm-modal-actions{display:flex;justify-content:flex-end;gap:10px}.doc-checklist-modal{max-width:440px}.doc-checklist-modal h3{margin:0 0 4px;font-size:16px}.doc-checklist-modal .doc-checklist-sub{font-size:12.5px;color:var(--muted);margin:0 0 16px}.doc-checklist-items{display:flex;flex-direction:column;gap:10px;margin-bottom:20px}.doc-checklist-item{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--border);border-radius:8px}.doc-checklist-item input[type=checkbox]{width:18px;height:18px;flex-shrink:0;cursor:pointer}.doc-checklist-item label{flex:1;font-size:13.5px;cursor:pointer}.doc-checklist-item .doc-checklist-source{font-size:10.5px;color:var(--muted)}.doc-checklist-plot-field{margin:-8px 0 16px}.doc-checklist-plot-field label{display:block;font-size:12.5px;color:var(--muted);margin-bottom:6px}.doc-checklist-plot-row{display:flex;gap:8px;align-items:center}.doc-checklist-plot-row input{flex:1}.doc-checklist-plot-field .doc-checklist-source{font-size:10.5px;color:var(--muted);margin-top:4px;display:inline-block}.plan-progress-wrap{margin:4px 0 20px}.plan-progress-label{display:flex;justify-content:space-between;font-size:13px;font-weight:700;margin-bottom:6px}.plan-progress-track{position:relative;height:10px;border-radius:6px;background:var(--border);overflow:hidden;display:flex}.plan-progress-fill{height:100%;transition:width .3s ease}.plan-progress-fill.cancelled{background:var(--red);opacity:.55}.plan-progress-legend{display:flex;gap:16px;flex-wrap:wrap;margin-top:8px;font-size:12px;color:var(--muted)}.plan-progress-legend .dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:5px}.plan-progress-legend .dot.pending{background:var(--muted)}.plan-progress-legend .dot.cancelled{background:var(--red)}.plan-toolbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:14px}.plan-view-toggle{display:flex;gap:4px;margin-left:auto;background:var(--bg);border:1px solid var(--border);border-radius:20px;padding:3px}.view-toggle-btn{border:none;background:none;padding:6px 14px;border-radius:16px;font-size:12.5px;font-weight:700;cursor:pointer;color:var(--muted);font-family:inherit}.view-toggle-btn.active{background:var(--brand);color:#fff}.plan-status-select{padding:5px 8px;border-radius:6px;border:1px solid var(--border);font-family:inherit;font-size:12.5px;font-weight:600;cursor:pointer;min-width:auto}.plan-status-select.select-compact{width:100px;max-width:100px}.plan-cell-dash{opacity:.5;font-size:12.5px}.plan-sched-badge{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;font-size:14px;font-weight:800;line-height:1}.plan-sched-badge.sched-yes{background:var(--brand-light);color:var(--brand-dark);border:2px solid var(--brand)}.plan-sched-badge.sched-no{background:var(--red-light);color:var(--red);border:2px solid var(--red)}.app-confirm-badge{display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:20px;font-size:12px;font-weight:700;white-space:nowrap;line-height:1.3}.app-confirm-badge.confirm-yes{background:var(--brand-light);color:var(--brand-dark);border:1px solid var(--brand)}.app-confirm-badge.confirm-no{background:var(--card);color:var(--muted);border:1px solid var(--border)}.plan-status-select.status-pending{background:var(--card);color:var(--muted)}.plan-status-select.status-done{background:var(--brand-light);color:var(--brand-dark)}.plan-status-select.status-cancelled{background:var(--red-light);color:var(--red)}.plan-status-select.status-ready{background:#dcf3e8;color:#1f7a54}.plan-status-select.status-site_not_ready{background:#fde7d6;color:#b5650f}.plan-status-select.status-survey{background:#dce9fd;color:#2f6bd6}.plan-status-select.status-not_contacted{background:#eceff1;color:#6b7a72}.plan-status-select.status-done_pending_docs{background:#eaf4dd;color:#5d7c22;font-style:italic}.plan-row-pending,.plan-row-done,.plan-row-cancelled{transition:opacity .2s ease}.plan-row-cancelled{opacity:.55}.plan-row-cancelled .plan-status-select{opacity:1}.plan-date-chip{display:inline-flex;align-items:center;gap:8px;background:var(--brand-light);color:var(--brand-dark);font-size:12.5px;font-weight:600;padding:6px 12px;border-radius:20px;margin:0 0 12px}.plan-date-chip button{background:none;border:none;cursor:pointer;color:var(--brand-dark);font-weight:700;font-size:13px;padding:0}.plan-calendar-view{margin-top:4px}.plan-calendar-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}.plan-calendar-header h3{margin:0;font-size:15px}.plan-calendar-nav{display:flex;gap:6px}.plan-calendar-nav button{background:var(--card);border:1px solid var(--border);border-radius:8px;padding:6px 12px;cursor:pointer;font-family:inherit;font-size:13px;color:var(--text)}.plan-calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:6px}.plan-calendar-dow{text-align:center;font-size:12px;font-weight:700;color:var(--muted);padding:4px 0}.plan-calendar-day{min-height:70px;border:1px solid var(--border);border-radius:10px;padding:6px;cursor:pointer;background:var(--card);display:flex;flex-direction:column;gap:4px}.plan-calendar-day:hover{border-color:var(--brand)}.plan-calendar-day.empty{background:transparent;border:none;cursor:default}.plan-calendar-day.is-today{border-color:var(--brand);border-width:2px}.plan-calendar-day.is-selected{background:var(--brand-light);border-color:var(--brand)}.plan-calendar-day .day-num{font-size:12.5px;font-weight:700;color:var(--text)}.plan-calendar-day .day-badge{align-self:flex-start;font-size:11px;font-weight:700;background:var(--brand);color:#fff;padding:2px 7px;border-radius:10px}.plan-calendar-day .day-badge.has-cancelled{background:#d9a441}@media(max-width:700px){.plan-calendar-day{min-height:52px}.plan-calendar-day .day-badge{font-size:10px}}.iot-project-filter-bar{display:flex;align-items:center;gap:10px;margin-bottom:16px;padding:10px 14px;background:var(--brand-light);border:1px solid var(--border);border-radius:10px;flex-wrap:wrap}.iot-project-filter-bar label{font-weight:700;font-size:13.5px;color:var(--brand-dark);white-space:nowrap}.iot-project-filter-bar select{padding:7px 12px;border:1px solid var(--border);border-radius:8px;font-family:inherit;font-size:13.5px;background:var(--card);color:var(--text);min-width:180px}.pdf-report{display:none;background:#fff;font-family:Sarabun,sans-serif;color:#1c2621;box-sizing:border-box}.pdf-header{display:flex;align-items:center;gap:16px;border-bottom:3px solid #2c7f68;padding-bottom:16px;margin-bottom:20px}.pdf-logo{width:56px;height:56px;border-radius:12px;background:#fff;padding:4px;object-fit:contain;border:1px solid #e6eae8;flex-shrink:0}.pdf-header-text{flex:1;min-width:0}.pdf-header-text h1{margin:0 0 4px;font-size:21px;color:#2c7f68;overflow-wrap:break-word}.pdf-header-eyebrow{font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#6b7a72;margin-bottom:3px}.pdf-header-sub{font-size:13px;color:#6b7a72}.pdf-header-meta{font-size:11.5px;color:#6b7a72;text-align:right;white-space:nowrap;line-height:1.6}.pdf-topbar{height:6px;border-radius:3px;background:linear-gradient(90deg,#2c7f68,#3ba68a);margin-bottom:14px}.pdf-kpi-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;margin-bottom:24px}.pdf-kpi-card{background:#f2f5f3;border:1px solid #e6eae8;border-radius:8px;padding:12px 6px;text-align:center;border-top:4px solid #2c7f68}.pdf-kpi-card.pending{border-top-color:#9aa8a0}.pdf-kpi-card.done{border-top-color:#3ba68a}.pdf-kpi-card.cancelled{border-top-color:#e0483e}.pdf-kpi-card.blocked{border-top-color:#b8860b}.pdf-kpi-num{font-size:22px;font-weight:700;color:#1c2621}.pdf-kpi-label{font-size:10.5px;color:#6b7a72;margin-top:2px;text-transform:uppercase;letter-spacing:.03em}.pdf-team-section+.pdf-team-section{page-break-before:always;padding-top:6mm}.pdf-team-heading{display:flex;align-items:center;justify-content:space-between;background:#2c7f68;color:#fff;font-weight:700;font-size:15px;padding:10px 16px;border-radius:6px;margin-bottom:14px}.pdf-team-stats{font-size:11.5px;font-weight:600;opacity:.9}.pdf-date-section{margin-bottom:18px;page-break-inside:avoid}.pdf-date-heading{display:flex;align-items:center;justify-content:space-between;background:#e2f5ef;color:#2c7f68;font-weight:700;font-size:13.5px;padding:8px 14px;border-radius:5px 5px 0 0}.pdf-date-count{font-size:11.5px;font-weight:600;background:#2c7f68;color:#fff;padding:2px 10px;border-radius:10px}.pdf-table{width:100%;table-layout:fixed;border-collapse:collapse;font-size:11px}.pdf-table th,.pdf-table td{border:1px solid #e6eae8;padding:6px 8px;text-align:left;vertical-align:top;word-wrap:break-word;overflow-wrap:break-word;line-height:1.4}.pdf-table tbody tr:nth-child(2n){background:#f8faf9}.pdf-table tbody tr:hover{background:#f2f5f3}.pdf-table th{background:#2c7f68;color:#fff;font-weight:600;font-size:10.5px;text-transform:uppercase;letter-spacing:.02em;border-color:#2c7f68}.pdf-table td.pdf-maplink{word-break:break-all;font-size:9.5px;color:#6b7a72}.pdf-table td.pdf-loc-cell{text-align:center}.pdf-loc-badge{display:inline-block;padding:1px 8px;border-radius:9px;font-size:9.5px;font-weight:700}.pdf-loc-badge.has-loc{background:#e2f5ef;color:#2c7f68}.pdf-loc-badge.no-loc{background:#f2f5f3;color:#9aa8a0}.pdf-status-badge{display:inline-block;padding:2px 8px;border-radius:10px;font-size:10px;font-weight:700}.pdf-status-badge.status-pending{background:#f2f5f3;color:#6b7a72}.pdf-status-badge.status-done{background:#e2f5ef;color:#2c7f68}.pdf-status-badge.status-cancelled{background:#fdeceb;color:#e0483e}.pdf-status-badge.status-ready{background:#dcf3e8;color:#1f7a54}.pdf-status-badge.status-site_not_ready{background:#fde7d6;color:#b5650f}.pdf-status-badge.status-survey{background:#dce9fd;color:#2f6bd6}.pdf-status-badge.status-not_contacted{background:#eceff1;color:#6b7a72}.pdf-status-badge.status-done_pending_docs{background:#eaf4dd;color:#5d7c22}.pdf-signoff{display:flex;justify-content:space-between;gap:40px;margin:32px 30px 0;page-break-inside:avoid}.pdf-signoff-box{flex:1;text-align:center}.pdf-signoff-line{border-bottom:1px solid #9aa8a0;height:40px;margin-bottom:6px}.pdf-signoff-label{font-size:11.5px;color:#6b7a72}.pdf-footer{margin-top:20px;padding-top:12px;border-top:1px solid #e6eae8;font-size:10.5px;color:#9aa8a0;text-align:center}@media print{@page{size:A4;margin:12mm}html,body{background:#fff!important}body>*:not(.pdf-report){display:none!important}.pdf-report{display:block!important;width:100%!important;max-width:100%!important;margin:0!important;padding:0!important;-webkit-print-color-adjust:exact;print-color-adjust:exact}}@media(max-width:700px){header.topbar{padding:14px 14px 0}header.topbar h1{font-size:16.5px}header.topbar p{font-size:12px}.brand-logo{width:36px;height:36px}.header-top-row{flex-wrap:wrap}.container{padding:14px 10px 40px}.module-switcher{flex-wrap:wrap}.module-btn{padding:8px 14px;font-size:12.5px}.global-search-wrap{max-width:100%}.tabbar{overflow-x:auto;flex-wrap:nowrap;-webkit-overflow-scrolling:touch;padding-bottom:2px}.tab-btn{flex-shrink:0;padding:9px 14px;font-size:13px}.kpi-card .kpi-num{font-size:24px}.filters{gap:8px}.filters div{flex:1 1 100%}.filters select,.filters input[type=text]{min-width:0;width:100%}#installerShell{margin:8px 6px;padding:12px 11px 40px;border-radius:14px}.inst-topbar{flex-direction:column;align-items:stretch}.inst-actions .btn{flex:1 1 auto}.inst-tab-btn{min-width:0;padding:9px 4px;font-size:12px}.inst-kpi{padding:8px 6px}.inst-kpi-num{font-size:19px}.inst-kpi-label{font-size:10.5px}.inst-job-edit{grid-template-columns:1fr 1fr}.inst-job-actions .inst-act-btn{flex:1 1 auto;justify-content:center}}.btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:36px;padding:0 14px;border:1px solid transparent;border-radius:var(--r-md);font-size:var(--fs-base);font-weight:500;line-height:1;white-space:nowrap;cursor:pointer;transition:background .15s,border-color .15s,color .15s,box-shadow .15s}.btn:focus-visible{outline:none;box-shadow:0 0 0 3px var(--brand-ring)}.btn:active{transform:translateY(.5px)}.btn-brand,.btn-primary{background:var(--brand);color:#fff;border-color:var(--brand);box-shadow:var(--sh-1)}.btn-brand:hover,.btn-primary:hover{background:var(--brand-strong);border-color:var(--brand-strong)}[data-theme=dark] .btn-brand,[data-theme=dark] .btn-primary{color:#0b1f1a}.btn-outline,.btn-ghost{background:var(--surface);color:var(--text);border-color:var(--border-strong)}.btn-outline:hover,.btn-ghost:hover{background:var(--surface-2);border-color:var(--text-3)}.btn-dark{background:var(--ink);color:var(--surface);border-color:var(--ink)}.btn-dark:hover{opacity:.88}.btn-quiet{background:transparent;color:var(--muted);border-color:transparent}.btn-quiet:hover{background:var(--surface-2);color:var(--text)}.btn-danger{background:var(--danger);color:#fff;border-color:var(--danger)}.btn-danger:hover{filter:brightness(.94)}.btn-sm{height:30px;padding:0 10px;font-size:var(--fs-sm);border-radius:var(--r-sm)}.btn-icon{width:36px;padding:0}.btn-icon.btn-sm{width:30px}.stat{display:inline-flex;align-items:center;gap:6px;padding:3px 9px 3px 8px;border-radius:var(--r-pill);font-size:var(--fs-sm);font-weight:500;line-height:1.5;white-space:nowrap;background:var(--neutral-soft);color:var(--neutral)}.stat .ico{width:13px;height:13px}.stat:before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor;flex:none}.stat.has-ico:before{display:none}.stat-ok{background:var(--ok-soft);color:var(--ok)}.stat-info{background:var(--info-soft);color:var(--info)}.stat-wait{background:var(--wait-soft);color:var(--wait)}.stat-attn{background:var(--attn-soft);color:var(--attn)}.stat-danger{background:var(--danger-soft);color:var(--danger)}.stat-neutral{background:var(--neutral-soft);color:var(--neutral)}.chip-pct{display:inline-flex;align-items:center;padding:2px 7px;border-radius:var(--r-xs);font-size:var(--fs-xs);font-weight:600;background:var(--brand-soft);color:var(--brand-strong);font-variant-numeric:tabular-nums}.panel{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);overflow:hidden}.panel+.panel{margin-top:var(--s4)}.panel-head{display:flex;align-items:center;justify-content:space-between;gap:var(--s3);padding:14px 18px;border-bottom:1px solid var(--divider)}.panel-head.is-toggle{cursor:pointer;-webkit-user-select:none;user-select:none;width:100%;background:none;border-left:0;border-right:0;border-top:0;text-align:left}.panel-head.is-toggle:hover{background:var(--surface-2)}.panel-title{display:flex;align-items:center;gap:8px;margin:0;font-size:var(--fs-md);font-weight:600;color:var(--text)}.panel-title .ico{color:var(--text-3)}.panel-sub{font-size:var(--fs-sm);color:var(--text-3)}.panel-body{padding:18px}.panel-body.is-flush{padding:0}.metric-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--border);border:1px solid var(--border);border-radius:var(--r-lg);overflow:hidden}.metric{background:var(--surface);padding:16px 18px 18px;position:relative}.metric-top{display:flex;align-items:center;gap:7px;margin-bottom:10px}.metric-top .ico{color:var(--text-3)}.metric-label{font-size:var(--fs-sm);color:var(--muted);font-weight:500}.metric-value{font-size:var(--fs-2xl);font-weight:650;letter-spacing:-.02em;line-height:1.15;color:var(--text)}.metric-sub{margin-top:3px;font-size:var(--fs-sm);color:var(--text-3)}.metric-spark{position:absolute;right:14px;bottom:12px;width:82px;height:26px;opacity:.85;pointer-events:none}.metric-spark svg{width:100%;height:100%}.metric.is-accent .metric-value{color:var(--brand-strong)}.metric.is-danger .metric-value{color:var(--danger)}@media(max-width:1100px){.metric-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:560px){.metric-grid{grid-template-columns:1fr}}.filterbar{display:flex;flex-wrap:wrap;align-items:flex-end;gap:10px;padding:14px 18px;border-bottom:1px solid var(--divider);background:var(--surface-2)}.filterbar .field{display:flex;flex-direction:column;gap:5px;min-width:140px}.filterbar .field.is-grow{flex:1;min-width:200px}.filterbar .field>label{font-size:var(--fs-xs);font-weight:500;color:var(--text-3);text-transform:none;letter-spacing:0}.filterbar .field>select,.filterbar .field>input{width:100%}.filterbar .filter-actions{display:flex;gap:8px;margin-left:auto}.search-field{position:relative}.search-field .ico{position:absolute;left:11px;top:50%;transform:translateY(-50%);color:var(--text-3);pointer-events:none}.search-field input{padding-left:33px}.tbl-wrap{overflow:auto;max-height:62vh}.tbl{width:100%;border-collapse:separate;border-spacing:0;font-size:var(--fs-base)}.tbl thead th{position:sticky;top:0;z-index:2;background:var(--surface);color:var(--text-3);font-size:var(--fs-sm);font-weight:500;text-align:left;white-space:nowrap;padding:11px 14px;border-bottom:1px solid var(--border)}.tbl tbody td{padding:12px 14px;border-bottom:1px solid var(--divider);color:var(--text);vertical-align:middle}.tbl tbody tr:last-child td{border-bottom:0}.tbl tbody tr:hover td{background:var(--surface-2)}.tbl th.num,.tbl td.num{text-align:right}.tbl .cell-strong{font-weight:550}.tbl .cell-muted{color:var(--text-3)}.tbl.is-sticky-first th:first-child,.tbl.is-sticky-first td:first-child{position:sticky;left:0;z-index:1;background:var(--surface)}.tbl.is-sticky-first thead th:first-child{z-index:3}.tbl.is-sticky-first tbody tr:hover td:first-child{background:var(--surface-2)}.bar-cell{display:flex;align-items:center;gap:9px}.bar-track{flex:1;min-width:60px;height:6px;border-radius:999px;background:var(--surface-3);overflow:hidden}.bar-fill{height:100%;border-radius:999px;background:var(--brand);transition:width .5s ease}.pct-text{min-width:38px;text-align:right;font-size:var(--fs-sm);color:var(--muted);font-variant-numeric:tabular-nums}.rail-list{display:flex;flex-direction:column}.rail-row{display:flex;align-items:center;gap:10px;padding:13px 18px;border-bottom:1px solid var(--divider)}.rail-row:last-child{border-bottom:0}.rail-row .ico{color:var(--text-3)}.rail-label{flex:1;font-size:var(--fs-base);color:var(--text)}.rail-count{font-size:var(--fs-base);font-weight:600;color:var(--text)}.rank-list{display:flex;flex-direction:column;gap:13px;padding:16px 18px}.rank-row{display:grid;grid-template-columns:84px 1fr auto;align-items:center;gap:11px}.rank-name{font-size:var(--fs-base);color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rank-track{height:22px;border-radius:var(--r-xs);background:var(--surface-3);overflow:hidden;position:relative}.rank-fill{height:100%;border-radius:var(--r-xs);background:var(--brand-soft);border-left:2.5px solid var(--brand);transition:width .5s ease}.rank-val{position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:var(--fs-xs);font-weight:600;color:var(--muted);font-variant-numeric:tabular-nums}.rank-total{font-size:var(--fs-sm);color:var(--text-3);font-variant-numeric:tabular-nums}.empty{display:flex;flex-direction:column;align-items:center;gap:9px;padding:44px 20px;text-align:center}.empty-ico{display:grid;place-items:center;width:44px;height:44px;border-radius:50%;background:var(--surface-3);color:var(--text-3)}.empty-title{font-size:var(--fs-md);font-weight:550;color:var(--text)}.empty-text{font-size:var(--fs-base);color:var(--text-3);max-width:340px}td.empty-state-cell{padding:0!important;background:var(--surface)!important}.spinner-inline{display:inline-block;width:13px;height:13px;margin-right:7px;border:2px solid var(--border-strong);border-top-color:var(--brand);border-radius:50%;animation:spin .7s linear infinite;vertical-align:-2px}@keyframes spin{to{transform:rotate(360deg)}}body{background:var(--bg)}#appShell{max-width:1640px;margin:18px auto 26px;padding:0;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-xl);box-shadow:var(--sh-2);overflow:visible}header.topbar{display:block;position:sticky;top:0;z-index:40;margin:0;padding:0;background:var(--surface);border-bottom:1px solid var(--border);border-radius:var(--r-xl) var(--r-xl) 0 0;box-shadow:none;color:var(--text)}[data-theme=dark] header.topbar{background:var(--surface);box-shadow:none}.header-top-row{display:flex;align-items:center;gap:14px;min-height:var(--topbar-h);padding:10px 18px;margin:0;border:0}.header-brand{display:flex;align-items:center;gap:10px;flex:none}.header-brand .brand-logo{width:30px;height:30px;object-fit:contain;background:none;border-radius:0;padding:0;box-shadow:none}.header-brand h1{margin:0;font-size:var(--fs-md);font-weight:600;color:var(--text);letter-spacing:-.015em;white-space:nowrap}.header-brand p,#headerSub{display:none}.module-switcher{display:inline-flex;gap:3px;flex:none;margin:0;padding:3px;background:var(--surface-3);border-radius:var(--r-pill)}.module-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border:0;border-radius:var(--r-pill);background:transparent;color:var(--muted);font-size:var(--fs-base);font-weight:500;line-height:1;transition:background .15s,color .15s}.module-btn .ico{width:15px;height:15px}.module-btn:hover{color:var(--text);background:transparent}.module-btn.active{background:var(--brand);color:#fff;box-shadow:var(--sh-1)}[data-theme=dark] .module-btn.active{color:#0b1f1a}nav.tabbar{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:0;padding:0 18px 12px;border:0;background:none}.tab-btn{display:inline-flex;align-items:center;gap:7px;padding:7px 14px;border-radius:var(--r-pill);border:1px solid var(--border);background:var(--surface);color:var(--muted);font-size:var(--fs-base);font-weight:500;line-height:1;transition:background .15s,color .15s,border-color .15s}.tab-btn .ico{width:15px;height:15px;opacity:.9}.tab-btn:hover{background:var(--surface-2);color:var(--text);border-color:var(--border-strong)}.tab-btn.active{background:var(--ink);color:var(--surface);border-color:var(--ink);box-shadow:var(--sh-1)}.tab-btn.disabled{opacity:.5;cursor:not-allowed}.tab-btn.disabled:hover{background:var(--surface);color:var(--muted);border-color:var(--border)}.soon-badge{padding:1px 6px;border-radius:var(--r-pill);background:var(--wait-soft);color:var(--wait);font-size:var(--fs-xs);font-weight:600}.header-actions{display:flex;align-items:center;gap:7px;margin-left:auto;flex:none}.header-user{display:flex;align-items:center;gap:8px;padding:4px 4px 4px 11px;border-radius:var(--r-pill);border:1px solid var(--border);background:var(--surface)}.header-user-mail{font-size:var(--fs-sm);color:var(--muted);max-width:190px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.header-avatar{display:grid;place-items:center;width:28px;height:28px;border-radius:50%;background:var(--brand-soft);color:var(--brand-strong);font-weight:600;font-size:var(--fs-sm);text-transform:uppercase;flex:none}.theme-toggle-btn{display:grid;place-items:center;width:34px;height:34px;padding:0;border:1px solid var(--border);border-radius:var(--r-pill);background:var(--surface);color:var(--muted);font-size:0}.theme-toggle-btn:hover{background:var(--surface-2);color:var(--text);transform:none}.readonly-badge{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border-radius:var(--r-pill);background:var(--wait-soft);color:var(--wait);font-size:var(--fs-sm);font-weight:500}.global-search-wrap{position:relative;flex:1;max-width:330px;margin:0}.global-search-input{width:100%;height:34px;padding:0 12px 0 33px;border:1px solid var(--border-strong);border-radius:var(--r-pill);background:var(--surface-2);color:var(--text);font-size:var(--fs-base)}.global-search-input:focus{background:var(--surface);border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-ring)}.global-search-wrap>.ico{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--text-3);pointer-events:none}.global-search-results{margin-top:6px;border:1px solid var(--border);border-radius:var(--r-lg);background:var(--surface);box-shadow:var(--sh-3);overflow:hidden}.container{max-width:none;margin:0;padding:20px 18px 26px}.page-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--s4);margin-bottom:var(--s5);flex-wrap:wrap}.page-title{font-size:var(--fs-xl);font-weight:650;letter-spacing:-.02em;color:var(--text)}.page-sub{margin-top:3px;font-size:var(--fs-base);color:var(--text-3)}.page-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.subtabs{display:flex;gap:20px;margin:-4px 0 var(--s5);border-bottom:1px solid var(--border)}.subtab{padding:0 0 10px;border:0;background:none;color:var(--text-3);font-size:var(--fs-base);font-weight:500;border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .15s,border-color .15s}.subtab:hover{color:var(--text)}.subtab.active{color:var(--text);border-bottom-color:var(--brand)}.dash-grid{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:var(--s4);align-items:start}.dash-main{min-width:0;display:flex;flex-direction:column;gap:var(--s4)}.dash-rail{display:flex;flex-direction:column;gap:var(--s4);position:sticky;top:calc(var(--topbar-h) + 58px)}@media(max-width:1180px){.dash-grid{grid-template-columns:1fr}.dash-rail{position:static}}@media(max-width:980px){#appShell{margin:0;border-radius:0;border-left:0;border-right:0}header.topbar{border-radius:0}.header-top-row{flex-wrap:wrap;gap:10px;padding:10px 14px}.global-search-wrap{order:5;max-width:none;flex-basis:100%}.header-brand h1{font-size:var(--fs-base)}nav.tabbar{padding:0 14px 10px;overflow-x:auto;flex-wrap:nowrap}.tab-btn{white-space:nowrap}.container{padding:16px 14px 24px}.header-user-mail{display:none}}.statusbar{display:flex;align-items:center;justify-content:space-between;gap:var(--s3);margin:0 0 var(--s4);padding:0;font-size:var(--fs-sm);color:var(--text-3)}#status{margin:0;padding:0;background:none;border:0;color:var(--text-3);font-size:var(--fs-sm)}.statusbar:empty{display:none}.global-search-wrap input.global-search-input{height:34px;padding:0 12px 0 34px}.filterbar .field input[type=text],.filterbar .field select{height:36px}.search-field input[type=text]{padding-left:33px}.tbl tbody td,.tbl thead th{white-space:nowrap}.tbl td.is-wrap{white-space:normal}.chevron{display:inline-flex;color:var(--text-3);transition:transform .2s ease}.chevron.open{transform:rotate(90deg)}.section{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);box-shadow:none;padding:18px;margin-bottom:var(--s4)}.section .section{border:0;padding:0;margin-bottom:12px}.section h2{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:var(--fs-md);font-weight:600;color:var(--text);margin:0 0 12px;padding:0;border:0}.section h2 .ico{color:var(--text-3)}.section h3{font-size:var(--fs-base);font-weight:600;color:var(--text)}.section h2 .badge,.badge{display:inline-flex;align-items:center;background:var(--surface-3);color:var(--muted);border-radius:var(--r-pill);padding:2px 9px;font-size:var(--fs-xs);font-weight:600}.filters{display:flex;flex-wrap:wrap;align-items:flex-end;gap:10px;background:var(--surface-2);border:1px solid var(--divider);border-radius:var(--r-md);padding:12px 14px;margin:0 0 12px}.filters>div{display:flex;flex-direction:column;gap:5px;min-width:130px}.filters label{font-size:var(--fs-xs);font-weight:500;color:var(--text-3);margin:0}.filters select,.filters input[type=text],.filters input[type=date]{width:100%;height:34px}.table-wrap{border:1px solid var(--border);border-radius:var(--r-md);overflow:auto;max-height:66vh;background:var(--surface)}table.detail-table,table.summary-table{width:100%;border-collapse:separate;border-spacing:0;font-size:var(--fs-base)}table.detail-table th,table.summary-table th{position:sticky;top:0;z-index:2;background:var(--surface)!important;color:var(--text-3);font-size:var(--fs-sm);font-weight:500;text-align:left;white-space:nowrap;padding:10px 12px;border-bottom:1px solid var(--border)}table.detail-table td,table.summary-table td{padding:10px 12px;border-bottom:1px solid var(--divider);background:transparent;color:var(--text);vertical-align:middle}table.detail-table tbody tr:nth-child(2n) td,table.summary-table tbody tr:nth-child(2n) td{background:transparent}table.detail-table tbody tr:hover td,table.summary-table tbody tr:hover td{background:var(--surface-2)}table.detail-table tbody tr:last-child td,table.summary-table tbody tr:last-child td{border-bottom:0}[data-theme=dark] table.detail-table th{background:var(--surface)!important}[data-theme=dark] table.detail-table tbody tr:hover td,[data-theme=dark] .lb-row,[data-theme=dark] .district-row{background:var(--surface-2)}.tag{border-radius:var(--r-pill);font-weight:500;font-size:var(--fs-sm);padding:3px 10px}.tag-Y{background:var(--ok-soft);color:var(--ok)}.tag-N{background:var(--danger-soft);color:var(--danger)}.plan-view-toggle{display:inline-flex;gap:3px;padding:3px;background:var(--surface-3);border-radius:var(--r-md)}.view-toggle-btn{display:inline-flex;align-items:center;gap:6px;border:0;background:transparent;color:var(--muted);padding:6px 12px;border-radius:calc(var(--r-md) - 3px);font-size:var(--fs-sm);font-weight:500;line-height:1.4;cursor:pointer;transition:background .15s,color .15s}.view-toggle-btn:hover{color:var(--text)}.view-toggle-btn.active{background:var(--surface);color:var(--text);box-shadow:var(--sh-1)}.subtabs{padding:0 2px}.subtabs .view-toggle-btn{background:none;box-shadow:none;border-radius:0;padding:0 2px 10px;margin-bottom:-1px;color:var(--text-3);font-size:var(--fs-base);border-bottom:2px solid transparent}.subtabs .view-toggle-btn:hover{color:var(--text)}.subtabs .view-toggle-btn.active{color:var(--text);border-bottom-color:var(--brand);background:none}.subtabs .chip-pct{margin-left:4px}.plan-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 12px}.plan-range-row{display:flex;align-items:center;gap:6px;margin:12px 0 4px}.plan-range-label{font-size:var(--fs-sm);color:var(--text-3);margin-right:2px}.range-btn{border:1px solid var(--border-strong);background:var(--surface);color:var(--muted);border-radius:var(--r-pill);padding:4px 12px;font-size:var(--fs-sm);font-weight:500;cursor:pointer}.range-btn:hover{background:var(--surface-2);color:var(--text)}.range-btn.active{background:var(--ink);border-color:var(--ink);color:var(--surface)}.plan-progress-wrap{margin:2px 0 4px}.plan-progress-label{display:flex;justify-content:space-between;font-size:var(--fs-sm);color:var(--muted);font-weight:500;margin-bottom:7px}.plan-progress-track{display:flex;height:8px;border-radius:999px;background:var(--surface-3);overflow:hidden}.plan-progress-fill.done{background:var(--brand)}.plan-progress-fill.cancelled{background:var(--danger);opacity:.75}.plan-progress-legend{display:flex;gap:16px;margin-top:8px;font-size:var(--fs-sm);color:var(--muted)}.plan-progress-legend .dot{width:8px;height:8px;border-radius:50%;display:inline-block;margin-right:5px;background:var(--neutral)}.plan-progress-legend .dot.done{background:var(--brand)}.plan-progress-legend .dot.pending{background:var(--wait)}.plan-progress-legend .dot.cancelled{background:var(--danger)}.plan-timeline-cols{display:grid;grid-template-columns:1fr 1fr;gap:var(--s4);margin-top:var(--s4)}@media(max-width:900px){.plan-timeline-cols{grid-template-columns:1fr}}.plan-timeline-col{border:1px solid var(--border);border-radius:var(--r-md);background:var(--surface);overflow:hidden}.plan-timeline-heading{display:flex;align-items:center;gap:7px;margin:0;padding:11px 14px;font-size:var(--fs-base);font-weight:600;color:var(--text);border-bottom:1px solid var(--divider);background:var(--surface-2)}.plan-timeline-heading.upcoming{color:var(--brand-strong)}.plan-timeline-heading .ico{color:currentColor}.plan-timeline-list{max-height:330px;overflow:auto;padding:6px 0}.plan-timeline-empty{padding:26px 14px;text-align:center;color:var(--text-3);font-size:var(--fs-sm)}.plan-day-group{padding:4px 14px 8px}.plan-day-header{display:flex;align-items:center;justify-content:space-between;font-size:var(--fs-sm);font-weight:600;color:var(--muted);padding:7px 0 5px}.plan-day-header.is-today{color:var(--brand-strong)}.plan-day-header.is-today:after{content:"วันนี้";margin-left:8px;background:var(--brand-soft);color:var(--brand-strong);border-radius:var(--r-pill);padding:1px 8px;font-size:var(--fs-xs)}.plan-day-people{display:flex;flex-direction:column}.plan-day-person{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:6px 0;border-top:1px solid var(--divider);font-size:var(--fs-base)}.plan-day-person-loc{color:var(--text-3);font-size:var(--fs-sm);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.plan-status-select{height:30px;padding:0 26px 0 10px;border-radius:var(--r-pill);font-size:var(--fs-sm);font-weight:500;border:1px solid transparent}.plan-status-select.status-pending{background:var(--wait-soft);color:var(--wait)}.plan-status-select.status-done{background:var(--ok-soft);color:var(--ok)}.plan-status-select.status-cancelled{background:var(--neutral-soft);color:var(--neutral);text-decoration:line-through}.plan-status-select.status-ready{background:var(--info-soft);color:var(--info)}.plan-status-select.status-site_not_ready{background:var(--attn-soft);color:var(--attn)}.plan-status-select.status-survey{background:var(--info-soft);color:var(--info)}.plan-status-select.status-not_contacted{background:var(--neutral-soft);color:var(--neutral)}.plan-status-select.status-done_pending_docs{background:var(--ok-soft);color:var(--ok);opacity:.85;font-style:italic}.plan-date-chip{display:inline-flex;align-items:center;gap:6px}.plan-date-chip input[type=date]{height:32px;border-radius:var(--r-sm);font-weight:500}input[type=date]:not([value=""]){color:var(--text)}.plan-calendar-view{border:1px solid var(--border);border-radius:var(--r-md);padding:14px;background:var(--surface)}.plan-calendar-grid{gap:6px}.plan-calendar-dow{color:var(--text-3);font-size:var(--fs-xs);font-weight:600}.plan-calendar-day{border:1px solid var(--divider);border-radius:var(--r-sm);background:var(--surface)}.plan-calendar-day:hover{border-color:var(--brand);background:var(--brand-soft)}.plan-calendar-day.is-today{border-color:var(--brand);box-shadow:0 0 0 1px var(--brand)}.plan-calendar-day.is-selected{background:var(--brand-soft);border-color:var(--brand)}.plan-calendar-day .day-badge{background:var(--brand);color:#fff;border-radius:var(--r-pill);font-size:var(--fs-xs)}.plan-calendar-nav button{border:1px solid var(--border-strong);background:var(--surface);border-radius:var(--r-sm);color:var(--text);padding:4px 10px}.dropdown-manager{border:1px dashed var(--border-strong);border-radius:var(--r-md);margin-bottom:12px;background:var(--surface-2)}.dropdown-manager-header{display:flex;align-items:center;gap:8px;padding:10px 12px;cursor:pointer;font-size:var(--fs-sm);color:var(--muted)}.dropdown-manager-header strong{color:var(--text);font-weight:600}.toast-container{z-index:300}.toast{display:flex;align-items:center;gap:9px;background:var(--ink);color:var(--surface);border:0;border-radius:var(--r-md);box-shadow:var(--sh-3);padding:11px 15px;font-size:var(--fs-base)}.toast-icon{display:inline-flex}.toast-success .toast-icon{color:#5fe0b2}.toast-error .toast-icon{color:#ff8a80}.toast-warn .toast-icon{color:#ffd54f}.toast-info .toast-icon{color:#90caf9}.confirm-modal,.um-modal{background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--sh-3)}.um-head{display:flex;align-items:center;justify-content:space-between}.um-head h3{display:flex;align-items:center;gap:8px;font-size:var(--fs-lg)}.um-section h4{display:flex;align-items:center;gap:7px;font-size:var(--fs-base);color:var(--text)}.um-note{color:var(--muted);font-size:var(--fs-sm)}.qa-popup-panel{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--sh-3)}.qa-popup-header{background:var(--surface-2);border-bottom:1px solid var(--divider)}.qa-popup-header h2{font-size:var(--fs-md);display:flex;align-items:center;gap:7px}.qa-chip{border:1px solid var(--border-strong);background:var(--surface);color:var(--muted);border-radius:var(--r-pill);font-size:var(--fs-sm)}.qa-chip:hover{background:var(--brand-soft);color:var(--brand-strong);border-color:var(--brand)}.qa-msg{border-radius:var(--r-md);font-size:var(--fs-base);line-height:var(--lh)}.qa-user{background:var(--brand);color:#fff}.qa-bot{background:var(--surface-2);color:var(--text);border:1px solid var(--divider)}.qa-bubble-btn{box-shadow:var(--sh-2);border:1px solid var(--border);background:var(--surface)}.global-search-item{border-bottom:1px solid var(--divider)}.global-search-item:hover{background:var(--surface-2)}.global-search-item .gs-title{color:var(--text);font-weight:550}.global-search-item .gs-sub{color:var(--text-3)}.global-search-item .gs-tag{background:var(--brand-soft);color:var(--brand-strong);border-radius:var(--r-pill);font-size:var(--fs-xs);font-weight:600}.auth-gate{background:var(--bg)}.auth-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-xl);box-shadow:var(--sh-2)}.auth-card h1{font-size:var(--fs-xl);letter-spacing:-.02em}.auth-card .auth-sub{color:var(--text-3)}.auth-field input{height:40px}.auth-submit-btn{height:40px;border-radius:var(--r-md);background:var(--brand);border:0;color:#fff;font-weight:600;font-size:var(--fs-md)}.auth-submit-btn:hover{background:var(--brand-strong)}[data-theme=dark] .auth-submit-btn{color:#0b1f1a}.auth-toggle-link a{color:var(--brand-strong);font-weight:500}.scoreboard{border:1px solid var(--border);border-radius:var(--r-lg);background:var(--surface);box-shadow:none}.score-num{font-variant-numeric:tabular-nums;letter-spacing:-.02em}.leaderboard,.province-detail,.people-panel{border:1px solid var(--border);border-radius:var(--r-lg);background:var(--surface);box-shadow:none}.lb-title{color:var(--text);font-weight:600}.lb-row,.district-row{border-radius:var(--r-sm);background:var(--surface-2)}.lb-row:hover,.district-row:hover{background:var(--surface-3)}.lb-bar-fill,.dr-bar-fill{background:var(--brand);border-radius:999px}.map-back-overlay,.map-title-overlay{border-radius:var(--r-md);box-shadow:var(--sh-2);border:1px solid var(--border)}.config-box{border-radius:var(--r-md);border:1px solid var(--wait);background:var(--wait-soft);color:var(--text)}.iot-project-filter-bar{background:var(--surface-2);border:1px solid var(--divider);border-radius:var(--r-md)}.toggle-detail{display:flex;align-items:center;justify-content:space-between;gap:10px;cursor:pointer;-webkit-user-select:none;user-select:none;margin:-18px -18px 0;padding:14px 18px;border-radius:var(--r-lg) var(--r-lg) 0 0}.toggle-detail:hover{background:var(--surface-2)}.toggle-detail h2{margin:0}#installerShell{border:1px solid var(--border);box-shadow:var(--sh-2);border-radius:var(--r-xl)}.inst-topbar{border-bottom:1px solid var(--divider)}.inst-tab-btn{border:1px solid var(--border);background:var(--surface);color:var(--muted);border-radius:var(--r-pill);padding:9px 14px;font-size:var(--fs-base);font-weight:500;min-height:40px}.inst-tab-btn.active{background:var(--ink);color:var(--surface);border-color:var(--ink)}.inst-kpi{border:1px solid var(--border);border-radius:var(--r-md);background:var(--surface)}.inst-kpi-num{font-variant-numeric:tabular-nums}.inst-job-actions .inst-act-btn{border-radius:var(--r-md);min-height:40px;font-weight:500}.call-queue-item,.call-form-card{border:1px solid var(--border);border-radius:var(--r-md);background:var(--surface)}.soon-card{border:1px dashed var(--border-strong);border-radius:var(--r-lg);background:var(--surface-2);color:var(--text-3)}.empty-state-cell .empty-icon{filter:grayscale(1);opacity:.5}.chart-wrap{border:0}.metric.is-click{cursor:pointer;transition:background .15s}.metric.is-click:hover{background:var(--surface-2)}.metric.is-today{position:relative}.metric.is-today:before{content:"";position:absolute;inset:0 auto 0 0;width:3px;background:var(--brand)}.metric.is-today .metric-value{color:var(--brand-strong)}.appoint-grid .metric-sub{min-height:1.4em}.iot-project-filter-bar.is-inline{display:inline-flex;align-items:center;gap:7px;background:var(--surface);border:1px solid var(--border-strong);border-radius:var(--r-md);padding:0 4px 0 11px;height:36px;margin:0}.iot-project-filter-bar.is-inline label{display:inline-flex;align-items:center;gap:5px;font-size:var(--fs-sm);color:var(--text-3);white-space:nowrap;margin:0}.iot-project-filter-bar.is-inline select{border:0;height:32px;background-color:transparent;min-width:130px}.iot-project-filter-bar.is-inline select:focus{box-shadow:none}.geo-stage{position:relative;height:calc(100vh - 205px);min-height:560px;margin:0;border:1px solid var(--border);border-radius:var(--r-lg);overflow:hidden;background:radial-gradient(1100px 520px at 78% 12%,var(--brand-soft) 0%,transparent 55%),linear-gradient(160deg,var(--surface) 0%,var(--surface-2) 100%)}.geo-stage .thailand-map-wrap.geo-canvas{position:absolute;top:0;right:0;bottom:0;left:0;margin:0;padding:0;background:none;border:0;border-radius:0;box-shadow:none;max-width:none;width:auto;height:auto;aspect-ratio:auto;cursor:grab}.geo-stage .thailand-map-wrap.geo-canvas:active{cursor:grabbing}.geo-stage #thailandSvg,.geo-stage #iotSvg{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;display:block}.geo-stage #mapLabelsHtml,.geo-stage #iotMapLabelsHtml{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}[data-theme=dark] .geo-stage{background:radial-gradient(1100px 520px at 78% 12%,rgba(79,214,176,.08) 0%,transparent 55%),linear-gradient(160deg,var(--surface) 0%,var(--bg) 100%)}.geo-stage .html-label{position:absolute;transform:translate(-50%,-50%);background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:var(--r-pill);box-shadow:var(--sh-1);padding:2px 9px;font-size:11.5px;font-weight:550;white-space:nowrap;pointer-events:none}.geo-stage .map-back-overlay{position:absolute;top:16px;right:16px;left:auto;z-index:6;display:none;align-items:center;gap:6px;height:36px;padding:0 14px;background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:var(--r-pill);box-shadow:var(--sh-2);font-size:var(--fs-base);font-weight:500;cursor:pointer}.geo-stage .map-back-overlay.visible{display:inline-flex}.geo-stage .map-title-overlay{position:absolute;top:16px;right:120px;left:auto;z-index:5;padding:7px 14px;background:var(--ink);color:var(--surface);border:0;border-radius:var(--r-pill);box-shadow:var(--sh-2);font-size:var(--fs-base);font-weight:600}.geo-zoom{position:absolute;right:16px;bottom:16px;z-index:6;display:flex;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-md);box-shadow:var(--sh-2);overflow:hidden}.geo-zoom button{width:42px;height:38px;border:0;background:none;color:var(--text);font-size:19px;line-height:1;cursor:pointer}.geo-zoom button:first-child{border-right:1px solid var(--divider)}.geo-zoom button:hover{background:var(--surface-2)}.geo-foot{position:absolute;left:428px;bottom:14px;z-index:5;display:flex;align-items:center;gap:14px;font-size:var(--fs-xs);color:var(--text-3)}.geo-foot .map-legend{display:inline-flex;align-items:center;gap:5px;margin:0}.geo-foot .legend-dot{width:9px;height:9px;border-radius:50%;display:inline-block}.geo-foot .map-caption{margin:0}.geo-panel{position:absolute;top:14px;left:14px;bottom:14px;z-index:7;width:392px;max-width:calc(100% - 28px);display:flex;flex-direction:column;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--sh-3);overflow:hidden}.geo-panel-top{padding:16px 16px 12px;border-bottom:1px solid var(--divider)}.geo-title{display:flex;align-items:center;gap:8px;font-size:var(--fs-lg);font-weight:650;letter-spacing:-.015em}.geo-title .ico{color:var(--brand-strong)}.geo-sub{margin:2px 0 12px;font-size:var(--fs-sm);color:var(--text-3)}.geo-search{display:flex;gap:8px}.geo-search .search-field{flex:1}.geo-project{margin-bottom:10px;width:100%}.geo-project select{flex:1}#mapSearchStatus,#iotMapSearchStatus{font-size:var(--fs-sm);color:var(--attn);margin-top:6px}#mapSearchStatus:empty,#iotMapSearchStatus:empty{display:none}.geo-panel .scoreboard{display:flex;align-items:center;gap:12px;margin:12px 0 0;padding:11px 14px;background:var(--surface-2);border:1px solid var(--divider);border-radius:var(--r-md);box-shadow:none}.geo-panel .score-side{text-align:center;flex:none}.geo-panel .score-num{font-size:var(--fs-lg);font-weight:650}.geo-panel .score-side.yes .score-num{color:var(--ok)}.geo-panel .score-side.no .score-num{color:var(--danger)}.geo-panel .score-label{font-size:var(--fs-xs);color:var(--text-3)}.geo-panel .score-mid{flex:1}.geo-panel .score-bar{display:flex;height:7px;border-radius:999px;overflow:hidden;background:var(--surface-3)}.geo-panel .score-bar-fill-y{background:var(--brand)}.geo-panel .score-bar-fill-n{background:var(--danger)}.geo-panel .score-pct-labels{display:flex;justify-content:space-between;margin-top:5px;font-size:var(--fs-xs);color:var(--text-3)}.geo-panel .preschedule-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:10px;padding:8px 11px;background:var(--wait-soft);border:1px dashed var(--wait);border-radius:var(--r-md);font-size:var(--fs-sm)}.geo-panel .preschedule-toggle{display:flex;align-items:center;gap:6px;font-weight:550;cursor:pointer}.geo-panel .preschedule-bar input[type=date]{height:30px}.geo-panel .preschedule-status{font-size:var(--fs-xs);color:var(--muted)}.geo-panel-scroll{flex:1;overflow-y:auto;padding:12px 16px 16px}.geo-panel-scroll .lb-title{margin:2px 0 8px;font-size:var(--fs-sm);font-weight:600;color:var(--muted)}.geo-panel-scroll .leaderboard{display:flex;flex-direction:column;gap:6px}.geo-panel-scroll .province-detail,.geo-panel-scroll .people-panel{border:0;border-radius:0;background:none;box-shadow:none;padding:0;margin-top:12px}.geo-panel-scroll .detail-header{display:flex;flex-direction:column;gap:8px;align-items:stretch}.geo-panel-scroll .detail-header h3{font-size:var(--fs-base)}.geo-panel-scroll .district-row{padding:9px 11px}@media(max-width:860px){.geo-stage{height:auto;min-height:0}.geo-stage .thailand-map-wrap.geo-canvas{position:relative;height:420px}.geo-panel{position:relative;inset:auto;width:auto;max-width:none;margin:0;border:0;border-top:1px solid var(--border);border-radius:0;box-shadow:none}.geo-panel-scroll{max-height:none}.geo-foot{left:14px;bottom:auto;top:380px}}.geo-stage .map-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:4;padding:14px 20px;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-md);box-shadow:var(--sh-2);white-space:nowrap}.geo-panel .score-pct-labels{white-space:nowrap;gap:8px}.geo-panel .score-pct-labels span:nth-child(2){overflow:hidden;text-overflow:ellipsis}.geo-panel-scroll .table-wrap{max-height:46vh}.geo-stage .html-label{z-index:1;font-size:11px;padding:2px 8px}.geo-stage .map-back-overlay{z-index:8}.geo-stage .map-title-overlay{z-index:8;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.geo-stage .geo-zoom{z-index:8}.geo-stage .geo-foot{z-index:2}.geo-panel{z-index:10}.geo-panel .scoreboard{min-width:0}.geo-panel .score-side{flex:none;min-width:54px}.geo-panel .score-num{font-size:var(--fs-md)}.geo-panel .score-mid{min-width:0;overflow:hidden}.geo-panel .score-pct-labels{display:flex;align-items:center}.geo-panel .score-pct-labels span{flex:none}.geo-panel .score-pct-labels span:nth-child(2){flex:1;min-width:0;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.geo-drawer{position:absolute;top:14px;right:14px;bottom:14px;z-index:10;width:470px;max-width:calc(100% - 440px);display:flex;flex-direction:column;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--sh-3);transform:translate(calc(100% + 24px));transition:transform .28s cubic-bezier(.2,.8,.2,1),width .28s cubic-bezier(.2,.8,.2,1);overflow:hidden}.geo-drawer.open{transform:translate(0)}.geo-drawer.is-wide{width:min(920px,calc(100% - 440px))}.geo-drawer.open.is-min{transform:translate(calc(100% + 24px))}.geo-drawer-head{display:flex;align-items:center;gap:6px;padding:10px 12px 10px 16px;border-bottom:1px solid var(--divider);flex:none}.geo-drawer-title{display:flex;align-items:center;gap:7px;font-size:var(--fs-base);font-weight:600;margin-right:auto}.geo-drawer-title .ico{color:var(--brand-strong)}.geo-drawer-body{flex:1;overflow-y:auto;padding:14px 16px}.geo-drawer-body .people-panel{border:0;border-radius:0;background:none;box-shadow:none;padding:0;margin:0}.geo-drawer-body .table-wrap{max-height:44vh}.geo-drawer-body .detail-header{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.geo-drawer-body .detail-header h3{flex:1 1 auto;min-width:0}.iot-map-name-call{cursor:pointer;color:var(--brand-strong);font-weight:600;text-decoration:underline;text-decoration-style:dotted;text-underline-offset:3px;text-decoration-color:var(--border-strong, var(--border))}.iot-map-name-call:hover{color:var(--brand);text-decoration-style:solid}.geo-drawer-tab{display:none;position:absolute;top:50%;left:-44px;transform:translateY(-50%) rotate(180deg);writing-mode:vertical-rl;align-items:center;gap:6px;padding:12px 8px;border:1px solid var(--border);border-right:0;border-radius:0 var(--r-md) var(--r-md) 0;background:var(--brand);color:#fff;font-size:var(--fs-sm);font-weight:600;cursor:pointer;box-shadow:var(--sh-2)}.geo-drawer.open.is-min .geo-drawer-tab{display:inline-flex}.geo-drawer.open.is-min{transform:translate(calc(100% + -0px));overflow:visible}[data-theme=dark] .geo-drawer-tab{color:#0b1f1a}@media(max-width:1180px){.geo-drawer{max-width:calc(100% - 28px)}.geo-drawer.is-wide{width:calc(100% - 28px)}}.geo-stage{--drawer-w: 0px}.geo-stage:has(.geo-drawer.open:not(.is-min)){--drawer-w: 484px}.geo-stage:has(.geo-drawer.open.is-wide:not(.is-min)){--drawer-w: min(934px, calc(100% - 426px) )}.geo-stage .map-back-overlay{right:calc(16px + var(--drawer-w));transition:right .28s cubic-bezier(.2,.8,.2,1)}.geo-stage .map-title-overlay{right:calc(120px + var(--drawer-w));transition:right .28s cubic-bezier(.2,.8,.2,1)}.geo-stage .geo-zoom{right:calc(16px + var(--drawer-w));transition:right .28s cubic-bezier(.2,.8,.2,1)}.geo-drawer:not(.is-wide) .col-extra{display:none}.geo-search .search-field input{width:100%}.geo-stage .map-label{stroke:none;paint-order:normal;fill:#1f5748;font-weight:600;opacity:.82;letter-spacing:.01em}[data-theme=dark] .geo-stage .map-label{fill:#a9dfcc;opacity:.9}.geo-stage .html-label{background:#eef8f4eb;border:1px solid rgba(63,158,136,.28);color:#1d5041;font-weight:600;box-shadow:0 1px 4px #1f574824}[data-theme=dark] .geo-stage .html-label{background:#142620e0;border-color:#4fd6b040;color:#bfe8da}.geo-stage .map-title-overlay{top:18px;right:auto;left:calc(420px + (100% - 420px - var(--drawer-w)) / 2);transform:translate(-50%);max-width:none;background:var(--brand);color:#fff;font-size:16.5px;font-weight:650;letter-spacing:-.01em;padding:10px 24px;border-radius:var(--r-pill);box-shadow:0 8px 24px #2e8f7661;transition:left .28s cubic-bezier(.2,.8,.2,1)}[data-theme=dark] .geo-stage .map-title-overlay{color:#0b1f1a;box-shadow:0 8px 24px #00000073}.geo-panel .lb-row.is-active,.geo-panel .district-row.is-active{background:var(--brand-soft);box-shadow:inset 0 0 0 1.5px var(--brand)}.geo-panel .lb-row.is-active .lb-name,.geo-panel .district-row.is-active .dr-name{color:var(--brand-strong);font-weight:650}[data-theme=dark] .geo-panel .lb-row.is-active,[data-theme=dark] .geo-panel .district-row.is-active{background:var(--brand-soft)}.geo-stage .map-label{fill:#fff;opacity:.96;font-weight:650;paint-order:stroke;stroke:#173e3452;stroke-width:.55px;letter-spacing:0}[data-theme=dark] .geo-stage .map-label{fill:#f2fbf7;stroke:#00000073}.geo-stage .map-label.is-dim{fill:#7c948b;opacity:.85;font-weight:600;stroke:#ffffff8c;stroke-width:.4px}.geo-stage .map-label.is-dim.is-current{opacity:0}[data-theme=dark] .geo-stage .map-label.is-dim{fill:#7d918a;stroke:#0006}.geo-stage .dist-appear{opacity:0;animation:geoDistIn .55s cubic-bezier(.2,.7,.3,1) forwards;animation-delay:var(--d, 0ms)}@keyframes geoDistIn{0%{opacity:0;filter:brightness(1.5) saturate(.6)}55%{opacity:1;filter:brightness(1.22) saturate(1.05)}to{opacity:1;filter:brightness(1) saturate(1)}}.geo-stage #mapG .prov-path,.geo-stage #iotMapG .prov-path{transition:opacity .45s ease,filter .45s ease}.geo-stage #mapG.is-focused .prov-path:not(.is-focus),.geo-stage #iotMapG.is-focused .prov-path:not(.is-focus){opacity:.22;filter:saturate(.12) brightness(1.12)}.geo-stage #mapG.is-focused .prov-path:not(.is-focus):hover,.geo-stage #iotMapG.is-focused .prov-path:not(.is-focus):hover{opacity:.5;filter:saturate(.5) brightness(1.05)}.geo-stage #mapG.is-focused~#labelLayer .map-label,.geo-stage #iotMapG.is-focused~#iotLabelLayer .map-label{transition:opacity .45s ease}.geo-stage .prov-focus-outline{fill:none;pointer-events:none;stroke:#14503f;stroke-width:1.5px;stroke-linejoin:round;vector-effect:non-scaling-stroke;filter:drop-shadow(0 0 2px rgba(20,80,63,.35));animation:geoOutlineIn .5s ease .18s both}[data-theme=dark] .geo-stage .prov-focus-outline{stroke:#7ff0cd;filter:drop-shadow(0 0 3px rgba(127,240,205,.35))}@keyframes geoOutlineIn{0%{opacity:0}to{opacity:1}}.call-wrap{display:grid;grid-template-columns:var(--call-list-w, 320px) 6px minmax(0,1fr);gap:0;align-items:start;margin-top:12px}.call-list{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);padding:12px;position:sticky;top:8px;max-height:78vh;overflow:hidden;display:flex;flex-direction:column;min-height:0}.call-list-fixed{flex:none}#iotCallRows{flex:1 1 auto;min-height:0;overflow:auto;margin:0 -4px;padding:2px 4px 0}.call-list-head{font-size:var(--fs-base);font-weight:600;margin-bottom:10px}.call-list-head .dummy{display:none}.call-remain{background:var(--wait-soft);color:var(--wait);font-size:var(--fs-xs);font-weight:600;padding:3px 10px;border-radius:var(--r-pill)}.call-resizer{position:relative;cursor:col-resize;touch-action:none;align-self:stretch;min-height:200px}.call-resizer:before{content:"";position:absolute;inset:12px 2px auto 2px;height:calc(100% - 24px);border-radius:999px;background:var(--border);transition:background .15s}.call-resizer:hover:before,.call-resizer.is-dragging:before{background:var(--brand)}.call-resizer:after{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:4px;height:34px;border-radius:999px;background:var(--border-strong)}.call-resizer:hover:after,.call-resizer.is-dragging:after{background:var(--brand-strong)}body.is-col-resizing{-webkit-user-select:none;user-select:none;cursor:col-resize}.call-row{display:flex;align-items:flex-start;gap:9px;padding:9px 10px;margin-bottom:4px;border:1px solid transparent;border-radius:var(--r-md);cursor:pointer;transition:background .12s,border-color .12s}.call-row:hover{background:var(--surface-2);border-color:var(--border)}.call-row.on{background:var(--brand-soft);border-color:var(--brand);box-shadow:none}.call-row-no{flex:none;min-width:22px;height:22px;padding:0 5px;display:grid;place-items:center;border-radius:var(--r-sm);background:var(--surface-3);color:var(--text-3);font-size:var(--fs-xs);font-weight:600;font-variant-numeric:tabular-nums}.call-row.on .call-row-no{background:var(--brand);color:#fff}[data-theme=dark] .call-row.on .call-row-no{color:#0b1f1a}.call-row-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.call-row-top{display:flex;align-items:center;gap:6px}.call-row-name{font-size:var(--fs-base);font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call-row .call-dot{width:7px;height:7px;margin:0;flex:none}.call-row-phone{display:inline-flex;align-items:center;gap:5px;font-size:var(--fs-base);font-weight:600;color:var(--brand-strong);font-variant-numeric:tabular-nums;letter-spacing:.02em}.call-row-nophone{color:var(--text-3);font-weight:400;font-size:var(--fs-sm)}.call-row-area{font-size:var(--fs-xs);color:var(--text-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call-form-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);padding:18px;margin-left:8px}.call-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap}.call-head-info{flex:1 1 340px;min-width:0}.call-head-topline{display:flex;align-items:center;gap:10px 12px;min-width:0;flex-wrap:wrap}.call-head-name{font-size:var(--fs-xl);font-weight:700;letter-spacing:-.015em;line-height:1.3;flex:none}.call-head-loc{display:flex;align-items:center;gap:5px;margin-top:3px;font-size:var(--fs-base);color:var(--muted)}.call-note-badge{flex:1 1 auto;min-width:0;display:inline-flex;align-items:center;gap:8px;padding:5px 11px;border-radius:var(--r-md);background:#fff8e1;border:1px solid #f0a500;box-shadow:0 0 0 2px #f0a50029;cursor:default}.call-note-badge.is-block{flex:1 1 100%;width:100%}.call-note-tag{flex:none;display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:700;color:#8a5b00;white-space:nowrap}.call-note-tag .ico{color:#b07a06}.call-note-text{flex:1 1 auto;min-width:0;display:block;font-size:13px;font-weight:600;line-height:1.35;color:#4a3405;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-theme=dark] .call-note-badge{background:#3a2f12;border-color:#c79a2e;box-shadow:0 0 0 2px #c79a2e2e}[data-theme=dark] .call-note-tag,[data-theme=dark] .call-note-tag .ico{color:#e8c877}[data-theme=dark] .call-note-text{color:#f2e4c2}.call-note-flag{flex:none;display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:5px;background:#fff3cd;border:1px solid #f0a500;color:#8a5b00}[data-theme=dark] .call-note-flag{background:#3a2f12;border-color:#c79a2e;color:#e8c877}@media(max-width:900px){.call-head-topline{flex-wrap:wrap}.call-note-badge{flex-basis:100%}}.pdf-report .pdf-note-cell{font-size:10px;line-height:1.3}.call-head-loc .ico{color:var(--text-3)}.call-nav{display:flex;gap:6px}.call-phone-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:14px 0 12px;padding:12px 16px;background:var(--brand-soft);border:1px solid var(--brand);border-radius:var(--r-md)}.call-phone-label{display:inline-flex;align-items:center;gap:6px;font-size:var(--fs-sm);font-weight:600;color:var(--brand-strong)}.call-phone-num{font-size:26px;font-weight:700;color:var(--text);font-variant-numeric:tabular-nums;letter-spacing:.04em;-webkit-user-select:all;user-select:all;cursor:text}.call-phone-none{display:inline-flex;align-items:center;gap:6px;font-size:var(--fs-base);color:var(--danger);font-weight:500}.call-phone-nid{margin-left:auto;font-size:var(--fs-sm);color:var(--muted);font-variant-numeric:tabular-nums}.call-phone-nid b{color:var(--text);-webkit-user-select:all;user-select:all}.call-chips{display:flex;gap:7px;flex-wrap:wrap;margin-bottom:4px}.call-chip{display:inline-flex;align-items:center;gap:6px;padding:4px 11px;border-radius:var(--r-pill);background:var(--surface-2);border:1px solid var(--divider);font-size:var(--fs-sm);color:var(--text)}.call-chip b{color:var(--text-3);font-weight:500}.call-chip.is-key{background:var(--brand-soft);border-color:transparent;color:var(--brand-strong)}.call-chip.is-key b{color:var(--brand-strong);opacity:.75}@media(max-width:900px){.call-wrap{grid-template-columns:1fr}.call-resizer{display:none}.call-list{position:static;max-height:320px}.call-form-card{margin-left:0;margin-top:12px}}.call-fields label span.call-ask,.call-fields label .call-ask{background:#fdebc8;color:#7a4a05;border:1px solid #efc178;font-weight:700;letter-spacing:.01em}[data-theme=dark] .call-fields label span.call-ask,[data-theme=dark] .call-fields label .call-ask{background:#4a3a15;color:#f2d089;border-color:#7d6425}.call-save-hint{flex:1;align-self:center;font-size:var(--fs-sm);color:var(--text-3)}.call-unsaved{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:var(--r-pill);background:var(--wait-soft);color:var(--wait);font-weight:600}.call-autosaved{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:var(--r-pill);background:var(--brand-soft);color:var(--brand-strong);font-weight:600}.call-export{display:flex;gap:6px;margin-bottom:8px}.call-export .btn{flex:1}.call-remain-all{opacity:.65;font-weight:500}.inst-bottomnav,.inst-filter-open{display:none}.inst-quick-label{font-size:var(--fs-xs);color:var(--text-3);margin:12px 0 5px}.inst-quick-status{display:flex;gap:6px;flex-wrap:wrap}.inst-qs{flex:1 1 auto;min-height:44px;min-width:104px;display:inline-flex;align-items:center;justify-content:center;gap:6px;border:1px solid var(--border-strong, var(--border));border-radius:var(--r-md);background:var(--surface);color:var(--text);font-family:inherit;font-size:var(--fs-base);font-weight:600;cursor:pointer;transition:background .12s,color .12s,border-color .12s}.inst-qs:active{transform:scale(.97)}.inst-qs.on.ready{background:var(--info-soft);color:var(--info);border-color:currentColor}.inst-qs.on.done{background:var(--ok-soft);color:var(--ok);border-color:currentColor}.inst-qs.on.site_not_ready{background:var(--attn-soft);color:var(--attn);border-color:currentColor}.inst-sn-done{display:flex;align-items:center;gap:6px;margin-top:8px;padding:7px 11px;border-radius:var(--r-md);background:var(--ok-soft);color:var(--ok);font-size:var(--fs-sm);font-weight:600}.inst-sn-done b{font-variant-numeric:tabular-nums;-webkit-user-select:all;user-select:all}.inst-more-btn{width:100%;margin-top:12px;min-height:44px;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 12px;border:1px dashed var(--border-strong, var(--border));border-radius:var(--r-md);background:var(--surface-2);color:var(--muted);font-family:inherit;font-size:var(--fs-sm);font-weight:600;cursor:pointer}.inst-more-btn:active{background:var(--surface-3)}.inst-more-btn .chevron{transition:transform .18s}.inst-more-btn.open .chevron{transform:rotate(180deg)}.inst-act-btn.scan{background:var(--ink);color:var(--surface);border:0;font-family:inherit;cursor:pointer}.inst-filter-sheet{display:none}.inst-filter-sheet.open{display:block}.inst-sheet-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;z-index:90}.inst-sheet-body{position:fixed;left:0;right:0;bottom:0;z-index:91;background:var(--surface);border-radius:18px 18px 0 0;padding:8px 16px calc(16px + env(safe-area-inset-bottom));max-height:82vh;overflow:auto;box-shadow:0 -8px 30px #00000047;animation:instSheetUp .22s cubic-bezier(.2,.8,.3,1)}@keyframes instSheetUp{0%{transform:translateY(100%)}to{transform:translateY(0)}}.inst-sheet-grip{width:40px;height:4px;border-radius:999px;background:var(--border-strong, var(--border));margin:4px auto 12px}.inst-sheet-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}.inst-sheet-apply{width:100%;min-height:48px;margin-top:12px;font-size:var(--fs-md)}body.inst-sheet-lock,body.qr-scanning{overflow:hidden}@media(max-width:780px){#installerShell{padding-bottom:78px}.inst-tabbar{display:none}.inst-filter-open{width:100%;min-height:46px;margin-bottom:10px;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 14px;border:1px solid var(--border);border-radius:var(--r-md);background:var(--surface);color:var(--text);font-family:inherit;font-size:var(--fs-base);font-weight:600;cursor:pointer}.inst-filter-open-l{display:inline-flex;align-items:center;gap:7px}.inst-filter-open-count{font-size:var(--fs-sm);font-weight:500;color:var(--muted)}.inst-filter-badge{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:999px;background:var(--brand);color:#fff;font-size:var(--fs-xs);font-weight:700}.inst-filter-sheet:not(.open) .filters{display:none}.inst-bottomnav{position:fixed;left:0;right:0;bottom:0;z-index:80;display:flex;align-items:stretch;background:var(--surface);border-top:1px solid var(--border);padding-bottom:env(safe-area-inset-bottom);box-shadow:0 -2px 14px #00000012}.inst-bn-btn{flex:1;min-height:58px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;border:0;background:none;color:var(--text-3);font-family:inherit;font-size:var(--fs-xs);font-weight:600;cursor:pointer;-webkit-tap-highlight-color:transparent}.inst-bn-btn .ico{transition:transform .15s}.inst-bn-btn.active{color:var(--brand-strong)}.inst-bn-btn.active .ico{transform:translateY(-1px)}.inst-bn-btn:active .ico{transform:scale(.9)}.inst-actions .inst-act-export{display:none}.inst-actions.show-export .inst-act-export{display:inline-flex}.inst-actions.show-export .inst-act-more{display:none}.inst-topbar{gap:8px}.inst-actions{display:flex;gap:8px}.inst-actions .btn{flex:1 1 0;min-height:42px}.inst-job-actions{gap:7px}.inst-job-actions .inst-act-btn{flex:1 1 46%;min-height:46px;font-size:var(--fs-base)}.inst-list-row{min-height:62px}#installerShell input,#installerShell select,#installerShell textarea,.inst-sheet-body input,.inst-sheet-body select{font-size:16px!important}.inst-job-edit select,.inst-job-edit input[type=text],.inst-job-edit input[type=number]{min-height:44px}}.qr-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100000;display:flex;flex-direction:column;background:#000;color:#fff;padding-top:env(safe-area-inset-top);padding-bottom:env(safe-area-inset-bottom)}.qr-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;font-size:16px}.qr-title{display:inline-flex;align-items:center;gap:8px;font-weight:700}.qr-icon-btn{width:42px;height:42px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;border:0;background:#ffffff24;color:#fff;cursor:pointer}.qr-icon-btn:active{background:#ffffff47}.qr-stage{position:relative;flex:1;overflow:hidden}.qr-stage video{width:100%;height:100%;object-fit:cover;display:block;background:#000}.qr-frame{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:min(68vw,300px);aspect-ratio:1;border-radius:22px;box-shadow:0 0 0 100vmax #0000008c;transition:box-shadow .2s}.qr-corner{position:absolute;width:34px;height:34px;border:4px solid #fff;border-radius:4px;transition:border-color .2s}.qr-corner.tl{top:-2px;left:-2px;border-right:0;border-bottom:0;border-top-left-radius:20px}.qr-corner.tr{top:-2px;right:-2px;border-left:0;border-bottom:0;border-top-right-radius:20px}.qr-corner.bl{bottom:-2px;left:-2px;border-right:0;border-top:0;border-bottom-left-radius:20px}.qr-corner.br{bottom:-2px;right:-2px;border-left:0;border-top:0;border-bottom-right-radius:20px}.qr-laser{display:none}.qr-overlay.is-live .qr-laser{display:block;position:absolute;left:8%;right:8%;top:0;height:2px;background:linear-gradient(90deg,transparent,#34d399,transparent);box-shadow:0 0 12px 2px #34d39980;animation:qrSweep 2.4s cubic-bezier(.45,0,.55,1) infinite}@keyframes qrSweep{0%,to{top:4%}50%{top:96%}}.qr-overlay.is-hit .qr-corner{border-color:#34d399}.qr-overlay.is-hit .qr-frame{box-shadow:0 0 0 100vmax #000000b8,0 0 26px 6px #34d3998c}.qr-overlay.is-hit .qr-laser{animation:none;opacity:0}.qr-overlay.is-error .qr-frame{display:none}.qr-foot{padding:14px;display:flex;flex-direction:column;gap:12px;align-items:center}.qr-hint{text-align:center;font-size:14px;line-height:1.5;color:#ffffffdb}.qr-tools{display:flex;gap:10px;flex-wrap:wrap;justify-content:center}.qr-tool{min-height:46px;padding:0 18px;border-radius:999px;display:inline-flex;align-items:center;gap:7px;border:1px solid rgba(255,255,255,.3);background:#ffffff1a;color:#fff;font-family:inherit;font-size:15px;font-weight:600;cursor:pointer}.qr-tool:active{background:#ffffff38}.qr-tool.is-on{background:#fbbf24;border-color:#fbbf24;color:#1a1a1a}@media(prefers-reduced-motion:reduce){.qr-overlay.is-live .qr-laser,.inst-sheet-body{animation:none}}.inst-act-more{display:none}@media(max-width:780px){.inst-act-more{display:inline-flex}}.inst-plot{margin-top:10px;padding:10px 12px;border:1px solid var(--border);border-radius:var(--r-md);background:var(--surface-2)}.inst-plot.need{border-color:var(--attn);background:var(--attn-soft)}.inst-plot.ok{border-color:var(--ok);background:var(--ok-soft)}.inst-plot-head{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:var(--fs-sm);font-weight:600}.inst-plot-tag{font-size:var(--fs-xs);font-weight:700;color:var(--ok);display:inline-flex;align-items:center;gap:4px}.inst-plot-tag.need{color:var(--attn)}.inst-plot-val{margin-top:6px;font-size:var(--fs-sm);font-variant-numeric:tabular-nums;word-break:break-all}.inst-plot-val a{color:var(--brand-strong)}.inst-plot-actions{display:flex;gap:7px;flex-wrap:wrap;margin-top:9px}.inst-plot-actions .btn{flex:1 1 auto;min-height:42px}.inst-chg{margin-top:4px;padding:8px 10px;border-radius:var(--r-sm);background:var(--surface-2);border:1px dashed var(--divider)}.inst-chg-head{display:flex;align-items:center;gap:5px;font-size:var(--fs-xs);font-weight:700;color:var(--text-3);margin-bottom:4px}.inst-chg-row{font-size:11.5px;line-height:1.5;color:var(--muted)}.inst-chg-row b{color:var(--text);font-weight:600}
