:root{--toolbar-h:62px;--status-h:30px;--panel-w:330px;--bg:#111827;--card:#fff;--line:#d7dee8;--text:#18212f;--muted:#697386;--primary:#0b73e0;--accent:#ff6b00;--danger:#d92d20}
*{box-sizing:border-box}html,body,#app{margin:0;width:100%;height:100%;overflow:hidden;font-family:Inter,Segoe UI,Arial,sans-serif;color:var(--text)}button,select,input{font:inherit}
#topbar{height:var(--toolbar-h);display:flex;align-items:stretch;background:#f8fafc;border-bottom:1px solid #cbd5e1;box-shadow:0 2px 10px rgba(15,23,42,.08);z-index:1000;position:relative}.brand{min-width:195px;display:flex;align-items:center;gap:8px;padding:0 12px;font-weight:800;font-size:14px;white-space:nowrap;background:#0f172a;color:#fff}.brandMark{font-size:19px;color:#38bdf8}.toolstrip{display:flex;align-items:stretch;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;flex:1}.tool{min-width:62px;border:0;border-right:1px solid #e2e8f0;background:#f8fafc;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;cursor:pointer;color:#334155;font-size:20px;padding:4px 7px}.tool span{font-size:10px;font-weight:700}.tool:hover{background:#eaf2ff}.tool.active{background:#dbeafe;color:#0759b7;box-shadow:inset 0 -3px 0 #0b73e0}.tool.primary{color:#0759b7}.tool.accent{color:#b54708}.tool:disabled{opacity:.42;cursor:not-allowed}.sep{width:6px;flex:0 0 6px;background:#e2e8f0;border-right:1px solid #cbd5e1}.rightTools{display:flex;align-items:center;gap:6px;padding:6px;background:#eef2f6}.rightTools select{height:34px;border:1px solid #cbd5e1;border-radius:6px;background:#fff;padding:0 6px}.iconBtn{width:34px;height:34px;border:1px solid #cbd5e1;background:#fff;border-radius:6px;cursor:pointer;font-size:18px}
#workspace{position:relative;height:calc(100% - var(--toolbar-h));background:#eef2f7}#map{position:absolute;inset:0 0 var(--status-h) 0;z-index:1}.leaflet-control-container{font-size:12px}#cadOverlay{position:absolute;inset:0 0 var(--status-h) 0;width:100%;height:calc(100% - var(--status-h));z-index:300;touch-action:none;pointer-events:auto}.cad-image{cursor:move}.cad-image.locked{cursor:not-allowed}.cad-vector{fill:none;stroke:#ff2d55;stroke-width:1.25;vector-effect:non-scaling-stroke;pointer-events:stroke}.cad-vector.selected{stroke:#00a2ff;stroke-width:4;filter:url(#selectedGlow)}.cad-polygon{fill:rgba(25,135,84,.18);stroke:#198754;stroke-width:2;vector-effect:non-scaling-stroke;pointer-events:all}.cad-polygon.selected{stroke:#00a2ff;stroke-width:4}.trace-preview{fill:none;stroke:#ff9500;stroke-width:2.5;stroke-dasharray:7 5;vector-effect:non-scaling-stroke}.helper-point{fill:#fff;stroke:#0b73e0;stroke-width:2;vector-effect:non-scaling-stroke}.error-point{fill:#fff;stroke:#d92d20;stroke-width:3;vector-effect:non-scaling-stroke}.bbox{fill:none;stroke:#00a2ff;stroke-width:1.5;stroke-dasharray:5 3;vector-effect:non-scaling-stroke}.handle{fill:#fff;stroke:#00a2ff;stroke-width:2;cursor:nwse-resize;vector-effect:non-scaling-stroke}
.panel{position:absolute;left:10px;top:10px;bottom:calc(var(--status-h) + 10px);width:var(--panel-w);background:rgba(255,255,255,.98);z-index:700;border:1px solid #ccd5df;border-radius:10px;box-shadow:0 12px 36px rgba(15,23,42,.20);display:flex;flex-direction:column;overflow:hidden}.panel.right{left:auto;right:10px}.panelHead{height:44px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #e2e8f0;padding:0 12px;background:#f8fafc}.panelHead button,.modalHead button{border:0;background:transparent;font-size:24px;cursor:pointer;color:#64748b}.panelBody{overflow:auto;padding:10px;flex:1}.hidden{display:none!important}.section{border:1px solid #e2e8f0;border-radius:8px;margin-bottom:10px;overflow:hidden;background:#fff}.sectionTitle{padding:8px 10px;background:#f8fafc;border-bottom:1px solid #e2e8f0;font-weight:800;font-size:12px}.sectionBody{padding:10px}.row{display:flex;align-items:center;gap:8px;margin:8px 0}.row>label{min-width:105px;font-size:12px;color:#475569}.row input[type=range]{flex:1}.row input[type=number],.row input[type=text],.row select{flex:1;min-width:0;border:1px solid #cbd5e1;border-radius:6px;padding:7px;background:#fff}.btn{border:1px solid #cbd5e1;background:#fff;border-radius:6px;padding:7px 10px;cursor:pointer;font-weight:700;font-size:12px}.btn:hover{background:#f1f5f9}.btn.primary{background:#0b73e0;border-color:#0b73e0;color:#fff}.btn.danger{background:#fff1f2;border-color:#fecdd3;color:#be123c}.btn.block{width:100%}.btnRow{display:flex;gap:6px;flex-wrap:wrap}.layerItem{display:grid;grid-template-columns:24px 1fr auto;gap:7px;align-items:center;padding:8px;border-bottom:1px solid #edf2f7}.layerItem:last-child{border-bottom:0}.layerItem small{color:#64748b;display:block;margin-top:2px}.layerActions{display:flex;gap:4px}.mini{width:28px;height:28px;border:1px solid #cbd5e1;background:#fff;border-radius:5px;cursor:pointer}.badge{display:inline-flex;padding:2px 6px;border-radius:99px;background:#e2e8f0;font-size:10px;font-weight:800;color:#475569}.empty{padding:20px 10px;text-align:center;color:#64748b;font-size:12px}
#statusbar{position:absolute;left:0;right:0;bottom:0;height:var(--status-h);z-index:800;background:#0f172a;color:#e2e8f0;display:grid;grid-template-columns:1fr 1.2fr 1fr 1fr;align-items:center;padding:0 10px;font-size:11px;gap:10px}.statusDot{display:inline-block;width:8px;height:8px;border-radius:50%;background:#22c55e;margin-right:6px}.progressCard{position:absolute;left:50%;top:20px;transform:translateX(-50%);z-index:850;width:min(460px,calc(100% - 30px));padding:10px 12px;background:rgba(15,23,42,.96);color:#fff;border-radius:8px;box-shadow:0 10px 30px rgba(0,0,0,.25)}.progressTitle{display:flex;justify-content:space-between;font-size:12px;margin-bottom:7px}.progressTrack{height:8px;border-radius:99px;background:#334155;overflow:hidden}.progressTrack>div{height:100%;width:0;background:#38bdf8;transition:width .18s}
.contextMenu{position:absolute;z-index:1100;min-width:190px;background:#fff;border:1px solid #cbd5e1;border-radius:8px;box-shadow:0 12px 30px rgba(15,23,42,.22);padding:5px}.contextMenu button{width:100%;text-align:left;border:0;background:#fff;border-radius:5px;padding:8px 10px;cursor:pointer;font-size:12px}.contextMenu button:hover{background:#eef6ff}.contextMenu button.danger{color:#b42318}
.modal{position:fixed;inset:0;background:rgba(15,23,42,.42);z-index:2000;display:flex;align-items:center;justify-content:center;padding:16px}.modalCard{width:min(640px,100%);max-height:90vh;background:#fff;border-radius:12px;box-shadow:0 30px 80px rgba(0,0,0,.25);display:flex;flex-direction:column;overflow:hidden}.modalHead{height:48px;display:flex;align-items:center;justify-content:space-between;padding:0 14px;border-bottom:1px solid #e2e8f0}.modalBody{padding:14px;overflow:auto}.modalFoot{padding:10px 14px;border-top:1px solid #e2e8f0;display:flex;justify-content:flex-end;gap:8px;background:#f8fafc}.notice{font-size:12px;padding:9px;border-radius:7px;background:#eff6ff;color:#1d4ed8;border:1px solid #bfdbfe}.warn{background:#fff7ed;color:#b45309;border-color:#fed7aa}.dangerBox{background:#fff1f2;color:#be123c;border:1px solid #fecdd3}.metricGrid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px}.metric{border:1px solid #e2e8f0;padding:10px;border-radius:8px}.metric strong{font-size:20px;display:block}.kbd{font-family:ui-monospace,Consolas,monospace;border:1px solid #cbd5e1;background:#f8fafc;border-bottom-width:2px;padding:1px 5px;border-radius:4px;font-size:10px}
@media(max-width:980px){:root{--toolbar-h:56px;--panel-w:min(340px,calc(100vw - 20px))}.brand{min-width:48px;width:48px;padding:0;justify-content:center}.brand span:last-child{display:none}.tool{min-width:52px}.tool span{display:none}.rightTools select{display:none}#statusbar{grid-template-columns:1fr 1fr}#scaleInfo,#cursorInfo{display:none}.panel{top:6px;bottom:calc(var(--status-h) + 6px);left:6px}.panel.right{right:6px}.sep{width:3px;flex-basis:3px}}
.cad-text-group{cursor:text;pointer-events:all}.cad-text-bg{fill:rgba(255,255,255,.90);stroke:none;pointer-events:all}.cad-text{fill:#111;font-family:Arial,"Noto Sans Devanagari",sans-serif;font-weight:600;paint-order:stroke fill;stroke:#fff;stroke-width:.7;stroke-opacity:.75;vector-effect:non-scaling-stroke;pointer-events:all;user-select:none}.cad-text-group.selected .cad-text{fill:#006ee6;stroke:#fff;stroke-width:1.2}.cad-text-group.selected .cad-text-bg{stroke:#00a2ff;stroke-width:1;stroke-dasharray:4 2;vector-effect:non-scaling-stroke}
