:root{--color-primary:#303d52;--color-primary-text:#fff;--color-primary-light:#5a6f8f;--color-primary-lighter:#7f94b0;--color-primary-dark:#001f3f;--color-quaternary:#5c677b;--color-quaternary-dark:#3b4455;--color-success:#4caf50;--color-warning:#ffc107;--color-error:#f44336;--color-info:#2196f3;--color-info-light:#64b5f6;--bg:var(--color-primary-dark);--bg-elev:#303d52;--bg-card:#0f2947;--line:#94a3b83d;--text:#f8fafc;--muted:#9fb1c8;--accent:var(--color-info);--accent-2:var(--color-info-light);--danger:var(--color-error);--ok:var(--color-success);--header-height:calc(64px + env(safe-area-inset-top));--toolbar-height:64px;--panel-width:350px;--radius:14px;--shadow:0 18px 50px #000a1952;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;font-synthesis:none;text-rendering:optimizelegibility;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}*{box-sizing:border-box}html,body,#root{width:100%;min-width:320px;min-height:100%;margin:0}body{min-height:100dvh;color:var(--text);background:radial-gradient(circle at 12% -5%, #2196f338, transparent 32rem), radial-gradient(circle at 95% 105%, #4caf501a, transparent 28rem), var(--bg)}button,input,select{font:inherit}button,select,label[for]{-webkit-tap-highlight-color:transparent}button{color:inherit}.visually-hidden{clip:rect(0, 0, 0, 0)!important;white-space:nowrap!important;border:0!important;width:1px!important;height:1px!important;margin:-1px!important;padding:0!important;position:absolute!important;overflow:hidden!important}.live-app{grid-template-rows:var(--header-height) minmax(0, 1fr) auto;min-height:100dvh;display:grid}.live-app--view{grid-template-rows:minmax(0,1fr);height:100dvh;overflow:hidden}.app-header{z-index:20;min-height:var(--header-height);padding:max(8px, env(safe-area-inset-top)) max(18px, env(safe-area-inset-right)) 8px max(18px, env(safe-area-inset-left));border-bottom:1px solid var(--line);-webkit-backdrop-filter:blur(18px)saturate(130%);backdrop-filter:blur(18px)saturate(130%);background:#061f3bdb;align-items:center;gap:22px;display:flex;position:relative}.brand-lockup{flex:none;align-items:center;gap:10px;display:inline-flex}.brand-mark{object-fit:cover;border:1px solid #64b5f69e;border-radius:10px;flex:none;width:36px;height:36px;display:block;box-shadow:0 0 0 3px #2196f31a,0 7px 16px #000a1947}.brand-name{letter-spacing:.06em;white-space:nowrap;font-size:14px;font-weight:700}.brand-name strong{color:var(--accent-2);font-weight:900}.brand-tagline{color:var(--muted);flex:1;margin:0;font-size:13px}.language-control{margin-left:auto}.app-header__actions{align-items:center;gap:8px;margin-left:auto;display:flex}.app-header__actions .language-control{margin-left:0}.app-header .install-app-button{width:44px;min-height:44px;color:var(--accent-2);background:#2196f31a;border-color:#64b5f67a;flex:none}.language-control select,.viewer-controls select{min-height:36px;color:var(--text);border:1px solid var(--line);cursor:pointer;background:#0f2947e6;border-radius:9px;outline:0;padding:0 32px 0 11px}.language-control select:focus-visible,.viewer-controls select:focus-visible,button:focus-visible,input:focus-visible,.manual-entry summary:focus-visible{outline-offset:2px;outline:3px solid #64b5f68c}.scan-page,.state-page{place-items:center;width:100%;padding:36px 18px;display:grid}.scan-card,.state-card{border:1px solid var(--line);width:min(100%,680px);box-shadow:var(--shadow);-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);background:linear-gradient(165deg,#303d52e0,#0a2542f2);border-radius:22px;padding:clamp(22px,5vw,38px)}.scan-card{border-radius:18px;width:min(100%,480px);padding:clamp(18px,3vw,22px)}.scan-card__copy{text-align:center}.scan-card h1,.state-card h1{letter-spacing:-.035em;margin:0;font-size:clamp(26px,5vw,38px);line-height:1.1}.scan-card h1{font-size:clamp(24px,4vw,30px)}.state-card p{max-width:54ch;color:var(--muted);margin:12px auto 0;line-height:1.55}.camera-stage{aspect-ratio:4/3;border:1px solid var(--line);background:linear-gradient(#2196f30f,#2196f305),repeating-linear-gradient(0deg,#0000,#0000 22px,#94a3b80a 23px);border-radius:14px;place-items:center;width:min(100%,360px);margin:14px auto 10px;display:grid;position:relative;overflow:hidden}.camera-stage[hidden]{display:none}.camera-stage[hidden]+.scan-methods{margin-top:14px}.camera-stage video{object-fit:cover;opacity:0;width:100%;height:100%;display:block}.camera-stage--active video{opacity:1}.camera-stage__placeholder{color:var(--muted);place-content:center;justify-items:center;gap:12px;font-size:13px;display:grid;position:absolute;inset:0}.camera-reticle{border:2px solid #64b5f6b8;border-radius:24px;place-items:center;width:88px;height:88px;display:grid;position:relative;box-shadow:inset 0 0 26px #2196f31f,0 0 32px #2196f31f}.camera-reticle>svg{width:38px;color:var(--accent-2);opacity:.38}.camera-reticle .spinner{border-width:3px;width:30px;height:30px;position:absolute}.state-actions{flex-wrap:wrap;justify-content:center;gap:10px;display:flex}.scan-methods{gap:8px;display:grid}.scan-method{border:1px solid var(--line);width:100%;min-height:48px;color:var(--text);box-shadow:none;text-align:left;cursor:pointer;background:#0f2947c2;border-radius:11px;align-items:center;gap:9px;padding:6px 10px;transition:transform .14s,border-color .14s,background .14s,box-shadow .14s;display:flex}.scan-method:hover{background:#1d3c5cf0;border-color:#64b5f694;transform:translateY(-1px);box-shadow:0 10px 24px #000a193d}.scan-method:active{transform:translateY(0)}.scan-method:disabled{opacity:.58;cursor:wait;transform:none}.scan-method--camera{background:linear-gradient(135deg,#2196f33d,#0f3254eb);border-color:#64b5f694;min-height:56px}.scan-method--import{border-style:dashed}.scan-method--dragging{border-color:var(--accent-2);background:#2196f32e;box-shadow:inset 0 0 0 2px #64b5f626,0 10px 26px #000a193d}.scan-method--stop{background:#f443361a;border-color:#f4433666}.scan-method__icon{width:34px;height:34px;color:var(--accent-2);background:#64b5f61a;border-radius:10px;flex:none;place-items:center;display:grid}.scan-method--camera .scan-method__icon{color:#00182f;background:linear-gradient(135deg,#8bd0ff,#2196f3);box-shadow:0 7px 18px #2196f347}.scan-method--stop .scan-method__icon{color:#fff;box-shadow:none;background:#f44336b8}.scan-method__icon svg{width:18px;height:18px}.scan-method__icon .spinner{border-color:#00182f #00182f38 #00182f38;width:18px;height:18px}.scan-method--import .scan-method__icon .spinner{border-color:#ffffff38;border-top-color:var(--accent-2)}.scan-method__copy{gap:2px;min-width:0;display:grid}.scan-method strong{min-width:0;font-size:13px}.button,.icon-button{border:1px solid var(--line);min-height:40px;color:var(--text);cursor:pointer;background:#0f2947e0;border-radius:10px;justify-content:center;align-items:center;gap:8px;padding:0 15px;transition:transform .12s,border-color .12s,background .12s;display:inline-flex;box-shadow:0 6px 14px #000a1929}.button:hover,.icon-button:hover{background:#244363f5;border-color:#64b5f68c;transform:translateY(-1px)}.button:active,.icon-button:active{transform:translateY(0)}.button:disabled{opacity:.48;cursor:not-allowed;transform:none}.button svg,.icon-button svg{width:18px;height:18px}.button--primary{color:#001225;background:linear-gradient(135deg, var(--accent-2), var(--accent));border-color:#64b5f6bf;font-weight:800}.button--primary:hover{background:linear-gradient(135deg,#83c6fa,#2b9ef2)}.button--quiet{min-height:34px;box-shadow:none;padding-inline:10px;font-size:12px}.manual-entry{margin-top:6px}.manual-entry summary{width:fit-content;min-height:44px;color:var(--muted);cursor:pointer;border-radius:8px;justify-content:center;align-items:center;gap:7px;margin:0 auto;padding:0 8px;font-size:12px;font-weight:700;list-style:none;display:flex}.manual-entry summary::-webkit-details-marker{display:none}.manual-entry summary:hover{color:var(--text);background:#64b5f614}.manual-entry summary svg{width:15px;color:var(--accent-2)}.manual-entry summary .manual-entry__chevron{width:14px;transition:transform .14s}.manual-entry[open] .manual-entry__chevron{transform:rotate(180deg)}.manual-entry[open] summary{margin-bottom:8px}.manual-entry__form{margin:0}.manual-entry__row{grid-template-columns:minmax(0,1fr) auto;gap:8px;display:grid}.manual-entry input{border:1px solid var(--line);width:100%;min-height:44px;color:var(--text);background:#00142bb8;border-radius:10px;outline:0;padding:0 12px}.manual-entry input::placeholder{color:#6f849e}.manual-entry input[aria-invalid=true]{border-color:#f44336b8}.inline-error{color:#ffc1bc;text-align:center;background:#f443361a;border:1px solid #f4433666;border-radius:10px;margin:14px 0 0;padding:10px 12px;font-size:12px}.app-footer{padding:12px 18px max(12px, env(safe-area-inset-bottom));color:var(--muted);text-align:center;justify-content:center;align-items:center;gap:8px;font-size:11px;display:flex}.app-footer svg{flex:none;width:15px}.state-card{text-align:center;justify-items:center;gap:12px;max-width:520px;display:grid;position:relative}.state-icon{width:70px;height:70px;color:var(--accent-2);background:#2196f31f;border:1px solid #64b5f659;border-radius:22px;place-items:center;display:grid}.state-icon svg{width:32px;height:32px}.state-card--error .state-icon{color:#ff8d85;background:#f443361a;border-color:#f4433657}.state-card .state-actions{margin-top:8px}.spinner{border:2px solid #ffffff38;border-top-color:var(--accent-2);border-radius:50%;width:18px;height:18px;animation:.8s linear infinite spin;display:inline-block}.spinner--large{width:30px;height:30px;margin-top:-33px}@keyframes spin{to{transform:rotate(360deg)}}.viewer{grid-template-rows:var(--toolbar-height) minmax(0, 1fr);min-height:0;display:grid;overflow:hidden}.viewer-toolbar{z-index:15;min-width:0;padding:max(7px, env(safe-area-inset-top)) max(12px, env(safe-area-inset-right)) 7px max(12px, env(safe-area-inset-left));border-bottom:1px solid var(--line);-webkit-backdrop-filter:blur(18px)saturate(130%);backdrop-filter:blur(18px)saturate(130%);background:#061f3bf2;align-items:center;gap:12px;display:flex;position:relative;box-shadow:0 4px 18px #000a194d}.viewer-toolbar>.brand-lockup{border-right:1px solid var(--line);padding-right:12px}.viewer-title{flex:0 auto;align-items:center;gap:10px;min-width:0;display:flex}.viewer-title>div{min-width:0}.viewer-title h1{text-overflow:ellipsis;white-space:nowrap;letter-spacing:-.01em;max-width:min(28vw,460px);margin:0;font-size:15px;overflow:hidden}.viewer-title span:not(.live-pulse){color:var(--muted);text-transform:uppercase;letter-spacing:.12em;font-size:10px}.live-pulse{flex:none;place-items:center;width:22px;height:22px;display:grid;position:relative}.live-pulse:before,.live-pulse i{content:"";background:var(--ok);border-radius:50%;width:9px;height:9px}.live-pulse:before{animation:2s ease-out infinite pulse;position:absolute}.live-pulse--ended:before{display:none}.live-pulse--ended i{background:var(--muted)}@keyframes pulse{0%{opacity:.85;transform:scale(.8)}to{opacity:0;transform:scale(2.7)}}.viewer-connection{min-width:0;color:var(--muted);text-align:center;flex:1;font-size:11px}.viewer-connection span{align-items:center;gap:6px;max-width:100%;display:inline-flex}.viewer-connection span>i{background:var(--ok);border-radius:50%;width:6px;height:6px}.viewer-connection svg{width:13px;height:13px;animation:2s linear infinite spin}.viewer-connection .connection-stale{color:#ffd782}.viewer-controls{flex:none;justify-content:flex-end;align-items:center;gap:7px;display:flex}.viewer-controls label{align-items:center;gap:6px;display:flex}.viewer-controls label>svg{width:16px;color:var(--muted)}.viewer-controls select{min-height:34px;font-size:12px}.icon-button{width:36px;min-height:36px;box-shadow:none;padding:0}.viewer-toolbar>.language-control{margin-left:0}.viewer-toolbar>.language-control select{min-height:34px;font-size:12px}.close-session-button{color:#ffb4ae;background:#f4433614;border-color:#f4433652;flex:none}.close-session-button:hover{color:#fff;background:#f4433638;border-color:#f44336b3}.viewer-content{grid-template-columns:minmax(0, 1fr) var(--panel-width);min-height:0;display:grid;overflow:hidden}.viewer--panel-closed .viewer-content{grid-template-columns:minmax(0,1fr)}.map-shell{background:#0a1626;min-width:0;min-height:0;position:relative}.map-canvas{position:absolute;inset:0}.map-status,.map-fallback{z-index:5;color:var(--muted);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background:#00142bb8;justify-content:center;align-items:center;gap:10px;display:flex;position:absolute;inset:0}.map-status--error,.map-fallback{color:#ffc1bc}.confirm-backdrop{z-index:100;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#000c1cbd;place-items:center;padding:20px;display:grid;position:fixed;inset:0}.confirm-dialog{background:linear-gradient(155deg,#233d5c,#0d2949);border:1px solid #94a3b84d;border-radius:18px;grid-template-columns:auto minmax(0,1fr);gap:14px;width:min(100%,470px);padding:22px;display:grid;box-shadow:0 26px 70px #00081494}.confirm-dialog__icon{color:#ffd15c;background:#ffc1071a;border:1px solid #ffc10761;border-radius:14px;place-items:center;width:44px;height:44px;display:grid}.confirm-dialog__icon svg{width:22px;height:22px}.confirm-dialog__copy{min-width:0}.confirm-dialog h2{letter-spacing:-.02em;margin:1px 0 7px;font-size:19px}.confirm-dialog p{color:var(--muted);margin:0;font-size:13px;line-height:1.55}.confirm-dialog__actions{grid-column:1/-1;justify-content:flex-end;gap:9px;margin-top:5px;display:flex}.install-dialog{width:min(100%,420px)}.install-dialog .confirm-dialog__icon{color:var(--accent-2);background:#2196f31f;border-color:#64b5f673}.button--danger{color:#fff;background:linear-gradient(135deg,#e94236,#bd2d28);border-color:#f4433694;font-weight:800}.button--danger:hover{background:linear-gradient(135deg,#f15a50,#cf3932);border-color:#ffb4aed1}.mapboxgl-ctrl-group{overflow:hidden;background:#0f2947eb!important;border:1px solid #94a3b842!important;border-radius:10px!important;box-shadow:0 8px 18px #000a1940!important}.mapboxgl-ctrl-group button{filter:invert()}.mapboxgl-ctrl-scale{color:#fff;background:#001f3fc2!important;border-color:#ffffffb3!important}.mapboxgl-ctrl-attrib{color:#1f2937}.info-panel{z-index:6;border-left:1px solid var(--line);background:linear-gradient(#18304c,#0f2947);grid-template-rows:auto auto minmax(0,1fr);min-width:0;min-height:0;display:grid;position:relative;box-shadow:-10px 0 30px #000a1929}.session-summary{border-bottom:1px solid var(--line);padding:14px}.session-summary__label{color:var(--accent-2);letter-spacing:.12em;text-transform:uppercase;align-items:center;gap:6px;margin-bottom:10px;font-size:10px;font-weight:800;display:flex}.session-summary__label svg{width:14px;height:14px}.session-summary dl{gap:5px;margin:0;display:grid}.session-summary dl>div{justify-content:space-between;gap:12px;display:flex}.session-summary dt{color:var(--muted);font-size:11px}.session-summary dd{text-overflow:ellipsis;white-space:nowrap;font-variant-numeric:tabular-nums;margin:0;font-size:11px;overflow:hidden}.team-chips{flex-wrap:wrap;gap:5px;margin-top:10px;display:flex}.team-chips span{border:1px solid var(--line);color:var(--muted);background:#00142b5c;border-radius:999px;align-items:center;gap:4px;padding:4px 7px;font-size:10px;display:inline-flex}.team-chips svg{width:12px;height:12px}.panel-tabs{border-bottom:1px solid var(--line);grid-template-columns:1fr 1fr;gap:6px;padding:8px;display:grid}.panel-tabs button{min-height:38px;color:var(--muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:9px;justify-content:center;align-items:center;gap:6px;padding:0 9px;display:flex}.panel-tabs button:hover{background:#64b5f614}.panel-tabs button.is-active{color:#fff;background:#2196f329;border-color:#64b5f652}.panel-tabs svg{width:15px;height:15px}.panel-tabs button>span{min-width:18px;height:18px;color:var(--accent-2);background:#00142b80;border-radius:9px;place-items:center;padding:0 5px;font-size:9px;display:grid}.panel-list{overscroll-behavior:contain;min-height:0;padding:8px;overflow:auto}.info-card{width:100%;min-height:58px;color:inherit;text-align:left;cursor:pointer;background:#00142b3d;border:1px solid #0000;border-radius:11px;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px;margin-bottom:6px;padding:9px 10px;display:grid}.info-card:hover{border-color:var(--line);background:#2d4d6d94}.info-card.is-selected{background:#2196f31f;border-color:#64b5f699}.info-card__marker{width:32px;height:32px;color:var(--marker-color,#38bdf8);background:color-mix(in srgb, var(--marker-color,#38bdf8) 18%, transparent);border-radius:10px;place-items:center;display:grid}.info-card__marker svg{width:17px}.info-card__copy{gap:2px;min-width:0;display:grid}.info-card__copy strong{text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.info-card__copy span,.info-card__copy small{text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:10px;overflow:hidden}.tracker-dot{place-items:center;width:32px;height:32px;display:grid}.tracker-dot:before{content:"";background:color-mix(in srgb, var(--marker-color,#f59e0b) 18%, transparent);border-radius:50%;width:27px;height:27px;position:absolute}.tracker-dot i{background:var(--marker-color,#f59e0b);width:12px;height:12px;box-shadow:0 0 12px color-mix(in srgb, var(--marker-color,#f59e0b) 60%, transparent);border:2px solid #fff;border-radius:50%;position:relative}.tracker-metrics{color:var(--muted);font-variant-numeric:tabular-nums;justify-items:end;gap:2px;font-size:9px;display:grid}.empty-message{color:var(--muted);text-align:center;padding:22px 12px;font-size:12px}@media (width<=1080px){.viewer-connection{display:none}.viewer-title{flex:1}.viewer-title h1{max-width:28vw}}@media (width<=920px){:root{--panel-width:320px}.viewer-toolbar .brand-name{display:none}.viewer-toolbar>.brand-lockup{border-right:0;padding-right:0}.viewer-title h1{max-width:24vw}}@media (width<=700px){:root{--header-height:calc(58px + env(safe-area-inset-top));--toolbar-height:max(94px, calc(89px + env(safe-area-inset-top)))}.brand-tagline{display:none}.app-header{gap:10px;padding-inline:12px}.brand-mark{width:34px;height:34px}.scan-page{align-items:start;padding:14px 12px}.state-page{align-items:start;padding:18px 10px}.scan-card{border-radius:15px;padding:16px 14px}.state-card{border-radius:17px;padding:20px 15px}.scan-card h1{font-size:24px}.state-card h1{font-size:27px}.viewer-toolbar{padding:max(5px, env(safe-area-inset-top)) max(8px, env(safe-area-inset-right)) 5px max(8px, env(safe-area-inset-left));grid-template-rows:40px 40px;grid-template-columns:auto minmax(0,1fr) auto auto;gap:3px 7px;display:grid}.viewer-toolbar>.brand-lockup{grid-area:1/1}.viewer-title{grid-area:1/2}.viewer-title h1{max-width:100%}.viewer-title .live-pulse{display:none}.viewer-controls{grid-area:2/1/auto/-1;justify-content:stretch}.viewer-controls label{flex:1}.viewer-controls select{width:100%}.viewer-toolbar>.language-control{grid-area:1/3}.viewer-toolbar>.language-control select{width:94px;min-height:34px}.viewer-toolbar>.close-session-button{grid-area:1/4}.viewer-content{display:block;position:relative}.map-shell{position:absolute;inset:0}.info-panel{z-index:10;left:8px;right:8px;bottom:max(8px, env(safe-area-inset-bottom));border:1px solid var(--line);border-radius:16px;width:auto;max-height:min(55%,430px);position:absolute;overflow:hidden;box-shadow:0 20px 50px #000a1980}.session-summary{padding:10px 12px}.session-summary dl{grid-template-columns:1fr 1fr}.session-summary dl>div{gap:1px;display:grid}.session-summary dl>div:first-child,.team-chips{display:none}.session-summary__label{margin-bottom:7px}.panel-tabs{padding:6px}.panel-list{max-height:220px}.mapboxgl-ctrl-bottom-right{bottom:8px}.viewer:not(.viewer--panel-closed) .mapboxgl-ctrl-bottom-right,.viewer:not(.viewer--panel-closed) .mapboxgl-ctrl-bottom-left{bottom:min(57vh,450px)}}@media (width<=420px){.brand-name{font-size:12px}.language-control select{width:108px;min-height:34px;font-size:12px}.scan-method{min-height:48px;padding:6px 10px}.scan-method--camera{min-height:56px}.scan-method__icon{width:34px;height:34px}.viewer-controls{gap:5px}.viewer-controls label>svg{display:none}.icon-button{width:34px;min-height:34px}.viewer-toolbar>.language-control select{width:88px;padding-left:8px}.confirm-dialog{padding:18px}.confirm-dialog__actions{grid-template-columns:1fr 1fr;display:grid}.confirm-dialog__actions .button{padding-inline:10px}.install-dialog .confirm-dialog__actions{grid-template-columns:1fr}}@media (width<=360px){.app-header--installable .brand-name{display:none}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}}
