:root{--green:#166534;--green2:#22c55e;--dark:#0f172a;--muted:#64748b;--line:#e2e8f0;--bg:#f1f5f9;--white:#fff;--red:#dc2626;--amber:#d97706;--shadow:0 14px 40px rgba(15,23,42,.08)}
*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;background:var(--bg);color:var(--dark)}button,input,select,textarea{font:inherit}button{cursor:pointer}.hidden{display:none!important}
.topbar{height:76px;padding:0 28px;background:rgba(255,255,255,.95);backdrop-filter:blur(16px);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:28px;position:sticky;top:0;z-index:1000}.brand{display:flex;align-items:center;gap:12px;min-width:220px}.brand img{width:48px;height:48px}.brand div{display:flex;flex-direction:column}.brand strong{font-size:18px}.brand span{font-size:12px;color:var(--muted)}.role-switch{background:#e8eef2;border-radius:12px;padding:4px;display:flex;margin:auto}.role-switch button{border:0;background:transparent;padding:10px 18px;border-radius:9px;color:#475569;font-weight:700}.role-switch button.active{background:#fff;color:var(--green);box-shadow:0 2px 8px rgba(15,23,42,.1)}.network{font-size:12px;font-weight:800;padding:7px 10px;border-radius:999px}.network.online{background:#dcfce7;color:#166534}.network.offline{background:#fee2e2;color:#991b1b}
main{min-height:calc(100vh - 76px)}.view{display:none}.view.active{display:block}.shell{width:min(1480px,calc(100% - 40px));margin:0 auto}.card{background:#fff;border:1px solid rgba(226,232,240,.9);border-radius:22px;box-shadow:var(--shadow)}.eyebrow{font-size:11px;letter-spacing:.14em;font-weight:900;color:var(--green)}
.start-layout{display:grid;grid-template-columns:1.2fr .8fr;gap:28px;align-items:stretch;padding:44px 0}.hero{padding:56px;min-height:560px;display:flex;flex-direction:column;justify-content:center;background:radial-gradient(circle at 80% 20%,rgba(34,197,94,.18),transparent 36%),linear-gradient(135deg,#052e16,#14532d);color:#fff;overflow:hidden;position:relative}.hero:after{content:"";position:absolute;width:330px;height:220px;border:38px solid rgba(255,255,255,.07);border-radius:44px;right:-90px;bottom:-80px;transform:rotate(-10deg)}.hero .eyebrow{color:#86efac}.hero h1{font-size:clamp(38px,5vw,70px);line-height:1.02;max-width:900px;margin:18px 0}.hero p{font-size:20px;line-height:1.6;color:#d1fae5;max-width:720px}.feature-row{display:flex;flex-wrap:wrap;gap:18px;margin-top:30px;font-weight:700;color:#bbf7d0}.form-card{padding:42px;display:flex;flex-direction:column;justify-content:center}.section-heading{display:flex;align-items:center;justify-content:space-between;margin-bottom:22px}.section-heading h2,.section-heading h3{margin:6px 0 0}.form-card label,dialog label{display:flex;flex-direction:column;gap:8px;font-size:13px;font-weight:800;color:#334155;margin-bottom:18px}.form-card input,.form-card select,dialog textarea{width:100%;border:1px solid #cbd5e1;border-radius:12px;padding:14px 15px;background:#fff;color:var(--dark);outline:none}.form-card input:focus,.form-card select:focus,dialog textarea:focus{border-color:#22c55e;box-shadow:0 0 0 4px rgba(34,197,94,.12)}.btn{border:0;border-radius:12px;padding:12px 16px;font-weight:850;transition:.2s transform,.2s opacity}.btn:hover{transform:translateY(-1px)}.btn:disabled{opacity:.5;cursor:not-allowed;transform:none}.btn.primary{background:var(--green);color:#fff}.btn.secondary{background:#e2f5e8;color:var(--green)}.btn.ghost{background:#f1f5f9;color:#334155}.btn.danger{background:#fee2e2;color:#b91c1c}.btn.large{padding:16px;font-size:16px}.privacy-note{font-size:12px;color:var(--muted);line-height:1.5;margin:14px 0 0}
.workspace{padding:24px 0;display:grid;grid-template-columns:320px 1fr;gap:20px}.sidebar{padding:24px;height:calc(100vh - 124px);position:sticky;top:100px;display:flex;flex-direction:column}.session-title{display:flex;gap:12px;align-items:center}.session-title small{font-size:10px;font-weight:900;color:var(--muted);letter-spacing:.12em}.session-title h2{font-size:18px;margin:4px 0 0}.live-dot{width:12px;height:12px;background:#22c55e;border-radius:50%;box-shadow:0 0 0 6px rgba(34,197,94,.15)}.progress-ring{--p:0;align-self:center;width:180px;height:180px;border-radius:50%;margin:28px 0;display:grid;place-content:center;text-align:center;background:radial-gradient(closest-side,#fff 76%,transparent 77% 99%),conic-gradient(var(--green2) calc(var(--p)*1%),#e2e8f0 0)}.progress-ring strong{font-size:42px;line-height:1}.progress-ring span{font-size:12px;color:var(--muted);margin-top:5px}.stats-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}.stats-grid div{background:#f8fafc;border:1px solid var(--line);border-radius:12px;padding:12px}.stats-grid span,.next-stop span{display:block;font-size:11px;color:var(--muted);font-weight:700}.stats-grid strong{font-size:18px;display:block;margin-top:4px}.next-stop{padding:14px;border-left:4px solid var(--green2);background:#f0fdf4;border-radius:10px;margin:14px 0}.next-stop strong{display:block;margin-top:5px}.action-stack{display:grid;gap:9px}.route-meta{margin-top:auto;border-top:1px solid var(--line);padding-top:16px;display:flex;justify-content:space-between;color:var(--muted);font-size:12px}.map-column{min-width:0}.map-wrap{height:calc(100vh - 300px);min-height:470px;overflow:hidden;position:relative}.map-wrap #workerMap,.admin-map-card #adminMap{height:100%;width:100%}.map-legend{position:absolute;z-index:500;bottom:16px;left:16px;background:#fff;padding:10px 12px;border-radius:11px;box-shadow:0 6px 25px rgba(15,23,42,.18);display:flex;gap:14px;font-size:12px;font-weight:700}.map-legend i{display:inline-block;width:18px;height:4px;border-radius:8px;margin-right:5px;vertical-align:middle}.map-legend .done{background:#22c55e}.map-legend .todo{background:#ef4444}.bottom-grid{display:grid;grid-template-columns:1.4fr .6fr;gap:20px;margin-top:20px}.issues-panel,.finish-panel{padding:24px}.issue-buttons{display:flex;flex-wrap:wrap;gap:9px}.issue-buttons button{border:1px solid #cbd5e1;background:#fff;border-radius:999px;padding:10px 13px;font-weight:750;color:#334155}.issue-buttons button:hover{border-color:#f59e0b;background:#fffbeb}.finish-panel{background:linear-gradient(135deg,#fff,#fff7ed)}.finish-panel h3{margin:8px 0}.finish-panel p{color:var(--muted);font-size:13px}
.dispatcher-shell{padding:36px 0}.dispatcher-header{display:flex;justify-content:space-between;gap:30px;align-items:flex-end;margin-bottom:26px}.dispatcher-header h1{font-size:40px;margin:7px 0}.dispatcher-header p{margin:0;color:var(--muted)}.kpi-row{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}.kpi{padding:20px}.kpi span{color:var(--muted);font-size:12px;font-weight:700}.kpi strong{font-size:34px;display:block;margin-top:8px}.dispatcher-grid{display:grid;grid-template-columns:1.3fr .7fr;gap:18px;margin-top:18px}.admin-map-card{height:520px;overflow:hidden}.fleet-card{padding:24px;max-height:520px;overflow:auto}.fleet-list{display:grid;gap:12px}.fleet-item{border:1px solid var(--line);border-radius:14px;padding:14px}.fleet-top{display:flex;justify-content:space-between;align-items:flex-start}.fleet-top strong{font-size:15px}.fleet-top span{font-size:11px;padding:5px 8px;border-radius:999px;font-weight:800}.fleet-top .active{background:#dcfce7;color:#166534}.fleet-top .finished{background:#e2e8f0;color:#475569}.fleet-item small{color:var(--muted)}.fleet-progress{height:8px;background:#e2e8f0;border-radius:999px;overflow:hidden;margin:12px 0 8px}.fleet-progress i{display:block;height:100%;background:#22c55e}.fleet-meta{display:flex;justify-content:space-between;font-size:11px;color:var(--muted)}.empty{padding:40px 10px;text-align:center;color:var(--muted)}.table-card{padding:24px;margin-top:18px}.table-scroll{overflow:auto}table{width:100%;border-collapse:collapse;min-width:760px}th,td{text-align:left;border-bottom:1px solid var(--line);padding:14px 10px;font-size:13px}th{color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.08em}.status-pill{display:inline-flex;padding:5px 8px;border-radius:999px;font-size:11px;font-weight:800}.status-pill.open{background:#fef3c7;color:#92400e}.status-pill.done{background:#dcfce7;color:#166534}.resolve-btn{border:0;background:#e2f5e8;color:#166534;border-radius:8px;padding:7px 9px;font-weight:800}
dialog{border:0;border-radius:20px;padding:0;width:min(480px,calc(100% - 30px));box-shadow:0 30px 80px rgba(15,23,42,.3)}dialog::backdrop{background:rgba(15,23,42,.55);backdrop-filter:blur(4px)}dialog form{padding:28px}dialog h2{margin:7px 0 22px}.dialog-actions{display:flex;justify-content:flex-end;gap:10px}#toast{position:fixed;right:20px;bottom:20px;z-index:2000;transform:translateY(120px);opacity:0;background:#0f172a;color:#fff;padding:13px 17px;border-radius:12px;box-shadow:var(--shadow);transition:.25s}#toast.show{transform:none;opacity:1}.vehicle-marker{background:#166534;border:3px solid white;border-radius:50%;box-shadow:0 3px 12px rgba(15,23,42,.35)}
@media(max-width:1050px){.start-layout{grid-template-columns:1fr}.hero{min-height:420px}.workspace{grid-template-columns:1fr}.sidebar{height:auto;position:static;display:grid;grid-template-columns:1fr 180px 1fr;gap:18px}.progress-ring{grid-column:2;grid-row:1/4;margin:0}.session-title,.stats-grid,.next-stop,.action-stack,.route-meta{grid-column:1}.stats-grid{grid-column:1}.action-stack{grid-column:3;grid-row:1/3}.route-meta{grid-column:3}.dispatcher-grid{grid-template-columns:1fr}.fleet-card{max-height:none}.admin-map-card{height:430px}}
@media(max-width:760px){.topbar{height:auto;min-height:70px;padding:10px 14px;gap:10px;flex-wrap:wrap}.brand{min-width:0;flex:1}.brand img{width:42px;height:42px}.brand span{display:none}.role-switch{order:3;width:100%}.role-switch button{flex:1}.network{font-size:0}.network:after{content:"";display:block;width:9px;height:9px;border-radius:50%;background:currentColor}.shell{width:min(100% - 20px,1480px)}.start-layout{padding:16px 0}.hero,.form-card{padding:28px}.hero{min-height:370px}.hero h1{font-size:37px}.hero p{font-size:16px}.workspace{padding:12px 0}.sidebar{display:block;padding:18px}.progress-ring{width:150px;height:150px;margin:18px auto}.action-stack{margin-top:12px}.route-meta{margin-top:16px}.map-wrap{height:54vh;min-height:390px}.bottom-grid{grid-template-columns:1fr}.dispatcher-shell{padding:22px 0}.dispatcher-header{align-items:flex-start;flex-direction:column}.dispatcher-header h1{font-size:32px}.kpi-row{grid-template-columns:1fr 1fr}.kpi strong{font-size:28px}.admin-map-card{height:400px}.map-legend{font-size:10px}.issues-panel,.finish-panel,.fleet-card,.table-card{padding:18px}}

/* Import tras ze skanu */
.dispatcher-actions{display:flex;gap:10px;flex-wrap:wrap;justify-content:flex-end}.routes-card{padding:24px;margin-top:18px}.routes-list{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.route-item{border:1px solid var(--line);border-radius:14px;padding:15px;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;background:#fff}.route-item strong{display:block}.route-item small{display:block;margin-top:5px;color:var(--muted);line-height:1.45}.route-source{white-space:nowrap;border-radius:999px;padding:6px 9px;background:#e2e8f0;color:#475569;font-size:10px;font-weight:900}.route-source.scan{background:#dcfce7;color:#166534}
.route-scan-dialog{width:min(1180px,calc(100% - 26px));max-height:94vh}.route-scan-dialog form{padding:30px;max-height:94vh;overflow:auto}.scan-dialog-header{display:flex;justify-content:space-between;align-items:flex-start;gap:24px;border-bottom:1px solid var(--line);padding-bottom:20px;margin-bottom:22px}.scan-dialog-header h2{margin:6px 0 7px}.scan-dialog-header p{margin:0;color:var(--muted);line-height:1.5}.icon-button{width:42px;height:42px;border:0;border-radius:12px;background:#f1f5f9;color:#334155;font-size:27px;line-height:1}.icon-button:disabled{opacity:.4}.scan-form-grid{display:grid;grid-template-columns:1.4fr .8fr;gap:14px}.scan-form-grid .wide{grid-column:1/-1}.route-scan-dialog label{margin-bottom:0}.route-scan-dialog input,.route-scan-dialog textarea{width:100%;border:1px solid #cbd5e1;border-radius:12px;padding:12px 13px;background:#fff;color:var(--dark);outline:none}.route-scan-dialog input:focus,.route-scan-dialog textarea:focus{border-color:#22c55e;box-shadow:0 0 0 4px rgba(34,197,94,.12)}.scan-source{margin-top:18px;padding:20px;background:#f8fafc;border:1px solid var(--line);border-radius:16px}.upload-zone{border:2px dashed #86b798;border-radius:15px;padding:24px;text-align:center;background:#f0fdf4;cursor:pointer;display:grid!important;gap:7px!important}.upload-zone strong{font-size:17px;color:#166534}.upload-zone span{font-size:12px;color:#64748b}.upload-zone input{padding:8px;background:#fff;margin-top:7px}.scan-source-actions,.scan-toolbar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin:14px 0}.ocr-progress{display:grid;grid-template-columns:1fr auto;align-items:center;gap:12px;margin:14px 0}.ocr-progress>div{height:10px;background:#e2e8f0;border-radius:999px;overflow:hidden}.ocr-progress i{display:block;width:2%;height:100%;background:#22c55e;transition:width .2s}.ocr-progress span{font-size:12px;color:#475569;min-width:210px;text-align:right}.scan-review{margin-top:22px;border-top:1px solid var(--line);padding-top:22px}.scan-review-heading{display:flex;justify-content:space-between;gap:20px;align-items:flex-end}.scan-review-heading h3{margin:5px 0 0}.scan-summary{display:grid;grid-template-columns:auto auto auto auto;gap:5px 8px;align-items:baseline}.scan-summary strong{font-size:25px;color:#166534}.scan-summary span{font-size:11px;color:var(--muted)}.muted{font-size:12px;color:var(--muted)}.scan-table-scroll{overflow:auto;border:1px solid var(--line);border-radius:14px}.scan-table{min-width:980px}.scan-table td{vertical-align:top}.scan-table input{padding:10px 11px}.scan-address-input{min-width:300px}.scan-match{display:block;color:#64748b;line-height:1.35;margin-top:6px;max-width:430px}.coordinate-inputs{display:grid;grid-template-columns:1fr 1fr;gap:6px;min-width:260px}.scan-order{text-align:center;width:64px}.scan-order>div{display:flex;justify-content:center;gap:3px;margin-top:6px}.scan-order button,.scan-row-actions button{border:0;border-radius:8px;background:#f1f5f9;color:#334155;width:29px;height:29px;font-weight:900}.scan-row-actions{white-space:nowrap}.scan-row-actions button:last-child{background:#fee2e2;color:#b91c1c;margin-left:4px}.scan-status{display:inline-flex;padding:6px 9px;border-radius:999px;font-size:10px;font-weight:900;white-space:nowrap}.scan-status.ready{background:#dcfce7;color:#166534}.scan-status.pending{background:#e2e8f0;color:#475569}.scan-status.searching{background:#dbeafe;color:#1d4ed8}.scan-status.warning{background:#fef3c7;color:#92400e}.scan-status.error{background:#fee2e2;color:#b91c1c}.scan-help{font-size:12px;color:#64748b;line-height:1.5}.scan-dialog-actions{position:sticky;bottom:-30px;background:#fff;border-top:1px solid var(--line);padding:17px 0 2px;margin-top:18px}.route-scan-dialog .dialog-actions{justify-content:flex-end}
@media(max-width:1050px){.routes-list{grid-template-columns:1fr 1fr}}
@media(max-width:760px){.dispatcher-actions{width:100%}.dispatcher-actions .btn{flex:1}.routes-card{padding:18px}.routes-list{grid-template-columns:1fr}.route-scan-dialog{width:100%;max-height:100vh;border-radius:0}.route-scan-dialog form{padding:18px;max-height:100vh}.scan-dialog-header{gap:12px}.scan-form-grid{grid-template-columns:1fr}.scan-form-grid .wide{grid-column:auto}.scan-review-heading{align-items:flex-start;flex-direction:column}.ocr-progress{grid-template-columns:1fr}.ocr-progress span{text-align:left;min-width:0}.scan-source{padding:14px}.upload-zone{padding:18px 12px}.scan-dialog-actions{bottom:-18px}.routes-card .section-heading{align-items:flex-start;gap:12px}}

/* Wersja 1.2 — wyłącznie widok ładowacza */
.worker-mode{margin:auto;font-size:11px;letter-spacing:.12em;font-weight:900;color:var(--green);background:#dcfce7;border-radius:999px;padding:9px 13px}
.scan-entry{display:flex;align-items:center;justify-content:space-between;gap:14px;border:1px solid #bbf7d0;background:#f0fdf4;border-radius:15px;padding:14px;margin:-2px 0 18px}
.scan-entry div{display:grid;gap:4px}.scan-entry strong{font-size:13px;color:#14532d}.scan-entry span{font-size:11px;color:#64748b;line-height:1.4}.scan-entry .btn{white-space:nowrap}
.bottom-grid.single{grid-template-columns:1fr}.bottom-grid.single .finish-panel{display:flex;align-items:center;gap:20px;justify-content:space-between}.bottom-grid.single .finish-panel .eyebrow{display:none}.bottom-grid.single .finish-panel h3{margin:0}.bottom-grid.single .finish-panel p{margin:0;flex:1}.bottom-grid.single .finish-panel .btn{white-space:nowrap}
@media(max-width:760px){.worker-mode{order:3;width:100%;text-align:center}.scan-entry{align-items:stretch;flex-direction:column}.scan-entry .btn{width:100%}.bottom-grid.single .finish-panel{align-items:stretch;flex-direction:column}.bottom-grid.single .finish-panel .btn{width:100%}}

/* v1.3 – uprawnienia GPS, aparat i trasa testowa */
.permission-card,.test-route-hint{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:14px;border:1px solid #cbd5e1;border-radius:14px;background:#f8fafc}
.permission-card>div,.test-route-hint>div{display:grid;gap:4px;min-width:0}
.permission-card strong,.test-route-hint strong{font-size:13px;color:#0f172a}
.permission-card span,.test-route-hint span{font-size:11px;line-height:1.45;color:#64748b}
.permission-card.granted{border-color:#86efac;background:#f0fdf4}.permission-card.granted strong{color:#166534}
.permission-card.prompt{border-color:#93c5fd;background:#eff6ff}.permission-card.prompt strong{color:#1d4ed8}
.permission-card.denied,.permission-card.error{border-color:#fecaca;background:#fef2f2}.permission-card.denied strong,.permission-card.error strong{color:#b91c1c}
.permission-card.warning{border-color:#fcd34d;background:#fffbeb}.permission-card.warning strong{color:#92400e}
.test-route-hint{border-color:#c4b5fd;background:#f5f3ff}.test-route-hint strong{color:#6d28d9}
.camera-actions{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.camera-tile{border:2px solid #86b798;border-radius:15px;padding:20px 16px;text-align:center;background:#f0fdf4;cursor:pointer;display:grid;gap:7px;color:#166534}
.camera-tile.secondary-tile{border-color:#93c5fd;background:#eff6ff;color:#1d4ed8}
.camera-tile strong{font-size:17px}.camera-tile span{font-size:12px;color:#64748b;font-weight:650}
.camera-tile:active{transform:scale(.985)}
.hidden-file-input{position:absolute!important;width:1px!important;height:1px!important;opacity:0!important;pointer-events:none!important;overflow:hidden!important}
.selected-files{margin-top:12px;padding:10px 12px;border-radius:10px;background:#f1f5f9;color:#64748b;font-size:12px;line-height:1.4;overflow-wrap:anywhere}
.selected-files.ready{background:#dcfce7;color:#166534;font-weight:700}
.permission-help-dialog{width:min(540px,calc(100% - 28px))}.permission-help-dialog form{padding:30px}.permission-help-dialog h2{margin:8px 0 10px}.permission-help-dialog p{color:#64748b;line-height:1.55}.permission-help-icon{font-size:42px}
.permission-steps{display:grid;gap:10px;margin:20px 0}.permission-steps>div{display:grid;grid-template-columns:30px 1fr;gap:10px;align-items:start;padding:10px;border-radius:11px;background:#f8fafc}.permission-steps strong{display:grid;place-items:center;width:26px;height:26px;border-radius:50%;background:#166534;color:#fff;font-size:12px}.permission-steps span{font-size:13px;line-height:1.45;color:#334155}
@media(max-width:760px){.permission-card,.test-route-hint{align-items:stretch;flex-direction:column}.permission-card .btn,.test-route-hint .btn{width:100%}.camera-actions{grid-template-columns:1fr}.camera-tile{padding:18px 12px}}
