:root{--ink:#202522;--muted:#59635d;--green:#263e32;--line:#dce1dd;--soft:#f2f5f2;--danger:#a13224}
*{box-sizing:border-box}body{margin:0;background:white;color:var(--ink);font:14px/1.45 -apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif}button,input,select{font:inherit;color:inherit}button,a{touch-action:manipulation}button{cursor:pointer}button:disabled{opacity:.45;cursor:not-allowed}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,summary:focus-visible{outline:2px solid #255b91;outline-offset:2px}h1,h2,h3,p{margin:0}h1{font-size:22px;line-height:1.3;letter-spacing:-.4px}h2{font-size:17px}h3{font-size:14px}h1,h2,h3{font-weight:650}a{color:var(--green)}
.topbar{height:56px;padding:0 24px;display:flex;align-items:center;gap:40px;border-bottom:1px solid var(--line)}.brand{font-size:18px;font-weight:700;letter-spacing:-.5px;text-decoration:none;color:var(--ink)}nav{display:flex;align-self:stretch;gap:24px}.nav{border:0;border-bottom:2px solid transparent;background:none;padding:0 4px;color:var(--muted);font-size:13px}.nav:hover{color:var(--ink);background:var(--soft)}.nav.active{border-color:var(--ink);color:var(--ink);font-weight:650}.top-right{margin-left:auto;display:flex;gap:16px;align-items:center}.private{font-size:12px;color:var(--muted)}
.btn,.map-btn{border:1px solid #bcc7bf;border-radius:4px;background:white;padding:8px 12px;font-size:13px;font-weight:550;min-height:36px}.btn:hover,.map-btn:hover{background:#edf1ed;border-color:#8e9c92}.btn:active,.map-btn:active{background:#dfe6e0}.btn.primary{background:var(--green);border-color:var(--green);color:white}.btn.primary:hover{background:#142b1d}.btn.danger,.remove-patrol{color:var(--danger)}.full{width:100%;margin-bottom:8px}.text-btn,.icon-btn{border:0;background:none;border-radius:4px;padding:8px;color:var(--muted);font-size:12px}.text-btn:hover,.icon-btn:hover{background:#e9eeea;color:var(--ink)}.icon-btn{min-width:36px;min-height:36px}.text-btn{font-weight:550}.text-btn.remove-patrol{color:var(--danger)}
.eventbar{padding:16px 24px;display:flex;align-items:center;justify-content:space-between;gap:24px}.eventbar p{color:var(--muted);font-size:12px;margin-top:4px}.dot-sep{padding:0 8px;color:#8c9690}.event-actions{display:flex;align-items:center;gap:8px}.mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-right:16px}.status-dot,.signal-dot{display:inline-block;width:6px;height:6px;background:#307144;border-radius:50%;flex-shrink:0}.signal-dot{margin-right:6px}.signal-dot.stale,.mode.offline .status-dot{background:#b57717}.mode.offline{color:#80510c}.demo-note{display:flex;justify-content:space-between;gap:16px;border-block:1px solid var(--line);padding:6px 24px;font-size:12px;color:var(--muted);background:#f8f9f8;min-height:32px}.demo-note button{background:none;border:0;padding:0;color:inherit;font:inherit;text-decoration:underline;text-underline-offset:3px;white-space:nowrap}.feed-down{background:#fff5e1;color:#80510c}
.workspace{display:grid;grid-template-columns:272px minmax(280px,1fr) 300px;height:calc(100dvh - 208px);min-height:480px}.panel{overflow:auto;scrollbar-width:thin;scrollbar-color:#bcc6be transparent}.roster{border-right:1px solid var(--line)}.detail{border-left:1px solid var(--line)}.panel-heading{display:flex;align-items:center;justify-content:space-between;padding:16px}.count{font-size:12px;color:var(--muted);font-weight:400;margin-left:8px;font-variant-numeric:tabular-nums}.filters{display:flex;padding:0 16px;border-bottom:1px solid var(--line);gap:16px}.filters button{border:0;border-bottom:2px solid transparent;background:none;padding:8px 0;font-size:12px;color:var(--muted)}.filters button:hover{color:var(--ink)}.filters button.active{border-bottom-color:var(--ink);color:var(--ink);font-weight:650}
.team-card{display:block;width:100%;text-align:left;padding:16px;border:0;border-bottom:1px solid var(--line);background:white}.team-card:hover{background:#f6f8f6}.team-card.selected{background:#eaf0eb}.team-top{display:flex;gap:8px;align-items:center}.team-top>div{min-width:0}.team-badge{display:grid;place-items:center;flex-shrink:0;width:28px;height:28px;background:var(--team);border-radius:50%;color:white;font-size:11px;font-weight:700}.team-badge.staff{border-radius:3px}.team-name{font-weight:650;font-size:14px;overflow-wrap:anywhere}.team-sub{color:var(--muted);font-size:12px;margin-top:2px}.team-battery{margin-left:auto;color:var(--muted);font-size:12px;white-space:nowrap;font-variant-numeric:tabular-nums}.low{color:var(--danger)!important}.team-bottom{display:flex;justify-content:space-between;gap:8px;font-size:11px;color:var(--muted);margin-top:8px}.team-bottom strong{font-weight:500;font-variant-numeric:tabular-nums}.progress{height:2px;background:#dce3dd;margin-top:12px;overflow:hidden}.progress>span{display:block;height:100%;background:var(--team)}.staff-divider{padding:16px 16px 8px;font-size:12px;font-weight:600;color:var(--muted)}.attention-heading{display:flex;justify-content:space-between;padding:16px 16px 8px}.eyebrow{font-size:12px;font-weight:650;color:var(--muted)}.alert{display:flex;gap:8px;padding:12px 16px;border:0;border-top:1px solid #eadcc1;background:#fff8eb;width:100%;text-align:left;color:#764e13;font-size:12px}.alert:hover{background:#fff0d6}.alert strong{display:block;font-weight:650;margin-bottom:4px}.alert p{font-size:12px;line-height:1.5}.no-alerts,.empty-roster{padding:16px;color:var(--muted);font-size:13px}
.map-panel{position:relative;isolation:isolate;min-width:0;background:#edf0eb}#map{position:absolute;inset:0;background:#edf0eb}.leaflet-container{font-family:inherit}.leaflet-control-zoom{border:1px solid #bac4bb!important;box-shadow:none!important;border-radius:3px!important}.leaflet-control-zoom a{color:#273b2d!important}.leaflet-top.leaflet-left{top:80px;left:6px}.leaflet-control-attribution{font-size:10px!important;background:white!important}.map-route-label{position:absolute;top:16px;left:16px;right:104px;z-index:500;display:flex;align-items:center;gap:8px;background:white;border:1px solid #bdc6bf;border-radius:3px;padding:8px 12px;max-width:340px;pointer-events:none}.route-swatch{width:20px;height:3px;background:#426748;flex-shrink:0}.map-route-label strong{display:block;font-size:12px;font-weight:650;overflow-wrap:anywhere}.map-route-label div>span{display:block;font-size:11px;color:var(--muted);margin-top:2px}.map-tag{font-size:10px;color:#80510c}.map-controls{position:absolute;top:16px;right:16px;z-index:500;display:grid;gap:8px}.map-btn{font-size:12px;min-width:72px;padding:8px}.map-btn[aria-pressed=true]{background:#e8eee9;border-color:#64806b}.map-btn[aria-pressed=false]{color:var(--muted)}.map-legend{position:absolute;left:16px;bottom:64px;padding:6px 8px;background:white;border:1px solid #bdc6bf;border-radius:3px;display:flex;gap:12px;z-index:500;font-size:11px;color:#49544c}.map-legend span{display:flex;align-items:center;gap:4px}.map-legend i{width:7px;height:7px;border-radius:50%;display:block}.map-legend .square{border-radius:1px}.map-legend .hollow{border:1px solid #496144;background:white}.live-strip{position:absolute;bottom:24px;left:16px;right:16px;z-index:500;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 8px;background:white;border:1px solid #bdc6bf;border-radius:3px;font-size:11px}.live-strip strong{font-weight:500}.live-strip span{color:var(--muted);font-variant-numeric:tabular-nums}
.detail-heading{padding:16px;border-bottom:1px solid var(--line)}.detail-title{display:flex;align-items:center;gap:8px;margin:8px 0}.detail-title h2{font-size:20px;overflow-wrap:anywhere}.detail-title p{font-size:12px;color:var(--muted);margin-top:2px}.status-pill{display:block;color:#355b40;font-size:12px;margin-top:8px}.status-pill.warn{color:#80510c}.detail-block{padding:16px;border-bottom:1px solid var(--line)}.metric-grid{display:grid;gap:12px;margin-top:12px}.metric{display:flex;justify-content:space-between;gap:16px;align-items:baseline}.metric label{font-size:12px;color:var(--muted)}.metric strong{font-size:16px;font-weight:600;font-variant-numeric:tabular-nums}.metric-note{font-size:12px;line-height:1.6;color:var(--muted);margin-top:12px}.fix-details{margin-top:16px;font-size:12px;color:var(--muted)}summary{cursor:pointer;min-height:28px;padding:4px 0}summary:hover{color:var(--ink)}.section-label{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.checkpoint-list{padding:0;margin:0;list-style:none}.checkpoint-list li{display:flex;align-items:flex-start;gap:8px;padding:12px 0;border-bottom:1px solid #edf0ed}.checkpoint-list li:last-child{border:0}.cp-dot{display:grid;place-items:center;width:22px;height:22px;border-radius:50%;border:1px solid #b4c0b7;background:white;color:#4b5a4e;font-size:11px;flex-shrink:0}.cp-dot.confirmed{background:var(--green);color:white;border-color:var(--green)}.cp-name{font-size:13px;font-weight:500;overflow-wrap:anywhere}.cp-meta{font-size:11px;color:var(--muted);margin-top:4px}.checkpoint-list .text-btn{margin-left:auto;padding:4px;font-size:11px;min-height:28px}.detail-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.detail-actions .btn{font-size:12px;padding:6px 8px}.close-detail{font-size:22px}.bottom-bar{display:flex;justify-content:space-between;gap:16px;padding:6px 16px;border-top:1px solid var(--line);font-size:11px;color:var(--muted);min-height:28px}
.route-content{padding:0 16px 24px}.muted{font-size:13px;color:var(--muted);line-height:1.6}.route-stat{display:flex;flex-direction:column;margin:16px 0}.route-stat strong{font-size:24px;font-weight:600;font-variant-numeric:tabular-nums}.route-stat span{font-size:12px;color:var(--muted)}.route-disclaimer{font-size:12px;line-height:1.6;color:var(--muted);margin:16px 0}hr{border:0;border-top:1px solid var(--line);margin:24px 0}.field{display:block;font-size:13px;font-weight:500;margin:16px 0}.field input,.field select,.cp-edit input,.setup-team input,.setup-team select{display:block;width:100%;min-width:0;min-height:36px;padding:8px;border:1px solid #b8c3bb;border-radius:4px;margin-top:8px;background:white;font-size:13px}.field input:disabled{background:var(--soft)}.cp-edit{padding:12px 0;border-bottom:1px solid var(--line)}.cp-edit-top{display:flex;gap:8px;align-items:center}.cp-edit-top input{margin:0}.cp-edit-bottom{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--muted);margin-top:4px}.cp-edit .icon-btn{font-size:20px;flex-shrink:0}.button-row{display:flex;gap:8px;margin:16px 0}.button-row>*{flex:1}
.patrol-marker{background:none;border:0}.patrol-marker .pin{background:var(--team);border:2px solid white;outline:1px solid #263c3155;border-radius:50%;width:33px;height:33px;color:white;display:grid;place-items:center;font-size:11px;font-weight:700;position:relative}.patrol-marker.staff .pin{border-radius:4px}.patrol-marker.selected .pin{outline:2px solid #202d24;outline-offset:2px}.patrol-marker.stale .pin{border-color:#edc26f}.patrol-marker .pin-label{position:absolute;top:40px;left:50%;transform:translateX(-50%);background:white;border:1px solid #b9c5bc;padding:3px 6px;border-radius:2px;color:var(--ink);white-space:nowrap;font-size:11px}.patrol-marker:not(.selected) .pin-label{display:none}.patrol-marker:hover .pin-label,.patrol-marker:focus .pin-label{display:block}.checkpoint-marker{background:transparent}.checkpoint-marker div{border-radius:50%;width:23px;height:23px;background:white;border:2px solid #627b54;display:grid;place-items:center;font-size:10px;font-weight:650;color:#35523b}.leaflet-popup-content-wrapper{border-radius:4px}.leaflet-popup-content{font-size:13px;line-height:1.6}#map-fallback{position:absolute;top:144px;left:56px;right:16px;z-index:500;background:#fff5df;color:#7b541d;border:1px solid #d6bc8c;padding:12px;font-size:12px}
dialog{border:1px solid #adb9b0;border-radius:6px;padding:0;width:min(640px,calc(100% - 32px));max-height:90dvh;color:var(--ink);box-shadow:0 16px 48px #0002}dialog::backdrop{background:#18221b55}.modal-head{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:16px 24px;border-bottom:1px solid var(--line);position:sticky;top:0;background:white;z-index:1}.modal-head .icon-btn{font-size:24px}#modal-body{padding:8px 24px 24px}#modal-body p{font-size:13px;line-height:1.6;color:var(--muted);margin-bottom:16px}#modal-body ol{padding-left:20px;font-size:13px;line-height:1.8;color:var(--muted)}#modal-body .notice{font-size:12px;background:var(--soft);padding:12px;border-radius:3px}.setup-patrol{padding:8px 0;border-bottom:1px solid var(--line)}.setup-patrol-heading{display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(--muted)}.setup-team{display:grid;grid-template-columns:28px 1fr 1fr;gap:8px;align-items:center;margin:4px 0 8px}.setup-team input,.setup-team select{margin:0}.removed-patrol{background:#fff5e1;padding:8px 12px;border-radius:3px}
.login-screen{position:fixed;inset:0;z-index:2500;display:grid;place-items:center;background:#f4f6f4;padding:24px;overflow:auto}.login-card{width:min(400px,100%);padding:32px;background:white;border:1px solid var(--line);border-radius:4px}.login-card .brand{display:block;font-size:16px}.login-card h1{font-size:24px;margin-top:24px}.login-card>p{font-size:13px;line-height:1.6;color:var(--muted);margin:12px 0 24px}.login-card #login-error{color:var(--danger);margin:8px 0}.login-card>.metric-note{font-size:12px;margin:16px 0 0}#toast{position:fixed;bottom:32px;left:50%;transform:translateX(-50%);z-index:3000;max-width:calc(100% - 32px);padding:12px 16px;background:#202d24;color:white;border-radius:4px;font-size:13px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}[hidden]{display:none!important}
body.route-mode .workspace{grid-template-columns:304px minmax(280px,1fr)}body.route-mode .detail{display:none}
@media(min-width:1600px){.workspace{grid-template-columns:296px minmax(400px,1fr) 320px}}
@media(max-width:1100px){.topbar{gap:24px}.private{display:none}.workspace{grid-template-columns:256px minmax(280px,1fr)}.detail{display:none}.workspace.show-detail .detail{display:block;position:fixed;top:56px;right:0;bottom:0;width:320px;background:white;z-index:900;border-left:1px solid #a7b5aa;box-shadow:-8px 0 32px #0002}.detail .close-detail{display:block!important}.mode{margin-right:8px}}
@media(max-width:700px){.topbar{height:auto;min-height:96px;flex-wrap:wrap;gap:8px;padding:12px 16px 0}.top-right{margin-left:auto}nav{order:3;width:100%;height:40px;gap:24px}.nav{font-size:13px;padding:0}.eventbar{padding:16px;flex-wrap:wrap;gap:12px}.eventbar h1{font-size:20px}.event-actions{width:100%;flex-wrap:wrap}.event-actions .mode{margin-right:auto}.event-actions .btn{font-size:12px;padding:8px}.demo-note{padding:8px 16px;align-items:flex-start}.workspace,body.route-mode .workspace{display:flex;flex-direction:column;height:auto;min-height:0}.map-panel{order:0;height:55dvh;min-height:360px}.roster{order:1;border:0;border-top:1px solid var(--line)}.panel{overflow:visible}.workspace.show-detail .detail{top:0;left:0;right:0;bottom:0;width:100%;overflow:auto;border:0}.detail-heading{position:sticky;top:0;background:white;z-index:1}.detail .close-detail{min-width:44px;min-height:44px}.filters button{min-height:44px}.team-sub{font-size:13px}.team-bottom{font-size:12px}.map-route-label{top:12px;left:12px;right:100px}.map-controls{top:12px;right:12px}.map-btn{min-height:40px}.map-legend{left:12px;bottom:80px}.live-strip{left:12px;right:12px;flex-wrap:wrap;bottom:24px;min-height:44px}.leaflet-top.leaflet-left{top:88px;left:2px}.bottom-bar{padding:8px 16px}.bottom-bar>span:last-child{display:none}.setup-team{grid-template-columns:28px 1fr}.setup-team select{grid-column:2}input,select,.field input,.field select,.cp-edit input,.setup-team input,.setup-team select{font-size:16px;min-height:44px}.text-btn{min-height:36px}.modal-head{padding:12px 16px}#modal-body{padding:8px 16px 16px}.login-card{padding:24px}.login-screen{padding:16px}.route-mode .map-panel{height:45dvh}.checkpoint-list .text-btn{min-height:36px}.detail-actions .btn{min-height:44px}}
