:root{color:#172033;background:#f5f7fb;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}*{box-sizing:border-box}body{margin:0}.app{grid-template-columns:350px 1fr;height:100vh;display:grid;overflow:hidden}aside{color:#e5e7eb;background:#111827;height:100vh;min-height:0;padding:22px;overflow:hidden auto}main{height:100vh;min-height:0;padding:24px;overflow:hidden auto}h1{color:#f9a8d4;margin:0;font-size:26px}h2{margin:22px 0 10px;font-size:16px}p{color:#475569}aside p{color:#cbd5e1}button,select{color:#111827;cursor:pointer;background:#e5e7eb;border:0;border-radius:10px;margin:4px;padding:9px 11px;font-weight:700}input::file-selector-button{color:#111827;cursor:pointer;background:#e5e7eb;border:0;border-radius:10px;margin:4px;padding:9px 11px;font-weight:700}button svg{vertical-align:middle;flex:none}button:disabled{cursor:not-allowed;opacity:.45}button:hover:not(:disabled){filter:brightness(.95)}button.primary{color:#fff;background:#f472b6;width:100%;padding:13px;font-size:16px}.primaryLight{color:#fff;background:#2563eb}button:focus-visible,select:focus-visible,input:focus-visible,.cell:focus-visible{outline-offset:2px;outline:3px solid #f472b6}label{color:#f3f4f6;margin:8px 0;display:block}main label,.floorPlanPanel label{color:#334155}input[type=range]{width:100%}.error,.notice{border-radius:10px;margin-top:10px;padding:10px}.error{color:#fff;background:#7f1d1d}.notice{color:#064e3b;background:#d1fae5}.topHeader{justify-content:space-between;align-items:flex-start;gap:20px;display:flex}.topHeader h2{color:#111827;margin:0;font-size:24px}.tabs{flex-wrap:wrap;gap:8px;margin:12px 0;display:flex}.tabs button{background:#fff;border:1px solid #cbd5e1;margin:0}.tabs button.active{color:#fff;background:#2563eb;border-color:#2563eb}section h2:first-child{margin-top:0}.tools{grid-template-columns:1fr 1fr;gap:6px;display:grid}.tools button{align-items:center;gap:6px;margin:0;display:flex}.tools .active{outline:3px solid #f472b6}.swatch{vertical-align:middle;border:1px solid #111827;border-radius:4px;width:14px;height:14px;display:inline-block}.empty{background:#fff}.wall{background:#1f2937}.blocked{background:#020617}.risk{background:#f97316}.crowd{background:#38bdf8}.start{background:#22c55e}.exit{background:#ef4444}.presetBtns,.inline{flex-wrap:wrap;align-items:center;gap:4px;display:flex}.inline input{border:0;border-radius:10px;width:70px;padding:9px 8px}.fileLabel input,.uploadButton input{margin-top:6px;display:block}.legend{background:#fff;border-radius:14px;flex-wrap:wrap;gap:12px;margin:12px 0;padding:10px 12px;display:flex;box-shadow:0 8px 24px #0f172a10}.legend span{color:#334155;align-items:center;gap:5px;font-size:13px;display:inline-flex}.gridWrap{background:#fff;border-radius:18px;padding:16px;overflow:auto;box-shadow:0 10px 30px #0f172a14}.grid{gap:2px;width:max-content;display:grid}.cell{background:#fff;border:1px solid #dbe3ee;border-radius:3px;width:24px;height:24px;margin:0;padding:0;position:relative}.cell.wall{background:#334155;border-color:#334155}.cell.blocked{background:#020617;border-color:#020617}.cell.risk.i1{background:#fed7aa}.cell.risk.i2{background:#fb923c}.cell.risk.i3{background:#ea580c}.cell.crowd.i1{background:#bae6fd}.cell.crowd.i2{background:#38bdf8}.cell.crowd.i3{background:#0284c7}.cell.start{background:#22c55e;border-color:#16a34a}.cell.exit{background:#ef4444;border-color:#dc2626}.cell.hasRoute{outline:3px solid var(--route-color);outline-offset:-3px;box-shadow:inset 0 0 0 2px #fff, 0 0 0 1px var(--route-color);background-image:linear-gradient(135deg, color-mix(in srgb, var(--route-color) 28%, transparent), transparent 48%)}.cell.multiRoute{outline-color:var(--route-color-2);background-image:linear-gradient(135deg, color-mix(in srgb, var(--route-color) 34%, transparent) 0 49%, color-mix(in srgb, var(--route-color-2) 34%, transparent) 50% 100%)}.routeBadge{color:#fff;pointer-events:none;background:#0f172a;border-radius:999px;min-width:11px;height:11px;font-size:8px;font-weight:800;line-height:11px;position:absolute;bottom:1px;right:1px}.routeFilters{grid-template-columns:1fr 1fr;gap:6px;margin-bottom:6px;display:grid}.routeFilters button{justify-content:center;align-items:center;gap:6px;margin:0;display:flex}.routeFilters .active{background:#fce7f3;outline:3px solid #f472b6}.routeKey{border-radius:999px;width:10px;height:10px;margin-right:8px;display:inline-block}.check{align-items:center;gap:8px;margin:7px 0;display:flex}.check input{width:auto}.floorPlanPanel{background:#eff6ff;border:1px solid #dbeafe;border-radius:18px;padding:16px}.floorControls{grid-template-columns:minmax(240px,1fr) auto;align-items:start;gap:16px;display:grid}.floorControls h2{margin-bottom:4px}.floorActions{flex-wrap:wrap;justify-content:flex-end;gap:4px;display:flex}.uploadButton{color:#111827;cursor:pointer;background:#e5e7eb;border-radius:10px;margin:4px;padding:9px 11px;font-weight:700;display:inline-block}.floorMeta{color:#334155;background:#fff;border:1px solid #bfdbfe;border-radius:12px;flex-wrap:wrap;gap:10px;margin:10px 0;padding:10px;font-size:13px;display:flex}.floorSettings{grid-template-columns:minmax(180px,1fr) minmax(150px,220px) minmax(120px,180px);align-items:end;gap:12px;margin:10px 0;display:grid}.floorSettings input[type=number],.floorSettings select{width:100%}.floorGridWrap{background-color:#e2e8f0;background-image:linear-gradient(45deg,#f8fafc 25%,#0000 25%),linear-gradient(-45deg,#f8fafc 25%,#0000 25%),linear-gradient(45deg,#0000 75%,#f8fafc 75%),linear-gradient(-45deg,#0000 75%,#f8fafc 75%);background-position:0 0,0 10px,10px -10px,-10px 0;background-repeat:repeat,repeat,repeat,repeat;background-size:20px 20px;background-attachment:scroll,scroll,scroll,scroll;background-origin:padding-box,padding-box,padding-box,padding-box;background-clip:border-box,border-box,border-box,border-box;padding:14px}.floorCanvas{background:#fff;border:1px solid #94a3b8;position:relative;overflow:hidden}.floorCanvas img{object-position:center;pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.floorGrid{position:absolute;inset:0}.floorGrid .cell{background:#ffffff1f;border-color:#0f172a2e}.floorGrid .cell.empty:hover{background:#bfdbfe59}.floorGrid .cell.wall{background:#1e293bd1}.floorGrid .cell.blocked{background:#020617e6}.floorGrid .cell.risk.i1{background:#fed7aac7}.floorGrid .cell.risk.i2{background:#fb923cd1}.floorGrid .cell.risk.i3{background:#ea580ce0}.floorGrid .cell.crowd.i1{background:#bae6fdc7}.floorGrid .cell.crowd.i2{background:#38bdf8d1}.floorGrid .cell.crowd.i3{background:#0284c7e0}.floorGrid .cell.start{background:#22c55ee6}.floorGrid .cell.exit{background:#ef4444e6}.visionPanel{background:#f0fdf4;border:1px solid #bbf7d0;border-radius:18px;padding:16px}.visionLayout{grid-template-columns:minmax(260px,340px) minmax(0,1fr);align-items:start;gap:16px;display:grid}.visionSidebar,.visionMap,.detectionSummary{background:#fff;border:1px solid #d1d5db;border-radius:14px;padding:14px;box-shadow:0 8px 24px #0f172a0f}.visionSidebar h3,.visionMap h3,.detectionSummary h3{color:#172033;margin:0 0 8px;font-size:15px}.visionSidebar input,.visionSidebar select{background:#f8fafc;border:1px solid #cbd5e1;border-radius:10px;width:100%;margin-top:5px;padding:9px 10px}.cameraList{gap:6px;margin-bottom:10px;display:grid}.cameraList button{background:#f8fafc;border:1px solid #cbd5e1;justify-items:start;margin:0;display:grid}.cameraList button.active{color:#fff;background:#15803d;border-color:#16a34a}.cameraList small{opacity:.82;margin-top:3px;font-weight:600}.sampleMedia{gap:6px;margin:10px 0;display:grid}.sampleMedia button{background:#f0fdf4;border:1px solid #bbf7d0;grid-template-columns:auto 1fr;place-items:center start;column-gap:8px;margin:0;display:grid}.sampleMedia small{color:#64748b;grid-column:2;font-weight:600}.visionStats{flex-wrap:wrap;gap:8px;margin:10px 0;display:flex}.visionStats span{color:#334155;background:#f1f5f9;border-radius:999px;padding:6px 8px;font-size:12px}.coverageGrid .cell{overflow:hidden}.coverageGrid .cell.cameraCovered{border-color:#16a34a;box-shadow:inset 0 0 0 2px #22c55e,0 0 0 1px #166534}.coverageGrid .cell.cameraPinCell{z-index:2}.cameraPin{color:#fff;pointer-events:none;background:#15803d;border-radius:999px;place-items:center;width:16px;height:16px;display:grid;position:absolute;top:2px;left:2px;box-shadow:0 0 0 2px #fff}.coverageGrid .cell.visionCrowd{box-shadow:inset 0 0 0 2px #0ea5e9,0 0 0 1px #075985}.coverageMark{pointer-events:none;background:#16a34a;border-radius:999px;width:6px;height:6px;position:absolute;bottom:2px;right:2px}.detectionSummary{grid-template-columns:minmax(220px,360px) minmax(0,1fr);gap:16px;margin-top:16px;display:grid}.detectionPreview{background:#0f172a;border:1px solid #cbd5e1;border-radius:12px;min-height:180px;position:relative;overflow:hidden}.detectionPreview img{width:100%;height:auto;display:block}.detBox{color:#111827;background:#facc153d;border:2px solid #facc15;align-items:flex-start;gap:4px;min-width:22px;min-height:22px;font-size:11px;font-weight:800;display:flex;position:absolute}.detBox b{color:#111827;background:#facc15;padding:1px 4px}.emptyPanel,.results{background:#fff;border-radius:18px;margin-top:18px;padding:18px;box-shadow:0 10px 30px #0f172a14}.emptyPanel.compact{margin-top:10px;padding:12px}.recommend{color:#065f46;background:#ecfdf5;border-radius:12px;margin-bottom:12px;padding:12px;line-height:1.5}.weightsLine{color:#475569;background:#f8fafc;border-radius:10px;margin-bottom:10px;padding:10px}table{border-collapse:collapse;width:100%;font-size:14px}th,td{text-align:left;border-bottom:1px solid #e5e7eb;padding:10px}th{color:#475569;background:#f8fafc}.sortBtn{color:#475569;background:0 0;margin:0;padding:0}.num,.results td.num,.results th.num{text-align:right}.win{background:#f0fdf4;border-left:5px solid #16a34a}.win td:first-child{font-weight:800}.results tr:hover{background:#f8fafc}.best{color:#166534;background:#dcfce7;font-weight:800}.hint{color:#64748b;font-size:12px}aside .hint{color:#cbd5e1}@media (width<=1180px){.floorControls{grid-template-columns:1fr}.floorActions{justify-content:flex-start}.floorSettings,.visionLayout,.detectionSummary{grid-template-columns:1fr}}@media (width<=1000px){.app{grid-template-columns:1fr;height:auto;overflow:visible}aside{height:auto;max-height:none}main{height:auto;overflow:visible}}
