@element-editor/ui 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{BooleanOperations-oF0WybQP.js → BooleanOperations-BRO7NHUY.js} +2 -2
- package/dist/{BooleanOperations-WXcmW9Vy.cjs → BooleanOperations-C2uOHRu3.cjs} +1 -1
- package/dist/{DataTable-CNfB01y2.cjs → DataTable-B-2VjBEz.cjs} +1 -1
- package/dist/{DataTable-DNmjUwka.js → DataTable-CS-3dIqY.js} +3 -3
- package/dist/{DataTablePanel-BknCxC1K.cjs → DataTablePanel-58LwzXQR.cjs} +1 -1
- package/dist/{DataTablePanel-rWdaQubk.js → DataTablePanel-DDFUmMaM.js} +2 -2
- package/dist/EditToolbarBtn-Ch9HCLHq.cjs +3 -0
- package/dist/{EditToolbarBtn-SZIsnIn3.js → EditToolbarBtn-SR4xHd8G.js} +39 -39
- package/dist/{FeatureEditModal-CM6BObUO.cjs → FeatureEditModal-Cc8N6vei.cjs} +1 -1
- package/dist/{FeatureEditModal-BF-fGhVD.js → FeatureEditModal-Dr10p3nE.js} +2 -2
- package/dist/{FeatureList-CQb2kTrV.js → FeatureList-Bo9w9nre.js} +2 -2
- package/dist/{FeatureList-Csr-anLA.cjs → FeatureList-VRYesXCq.cjs} +1 -1
- package/dist/{FeatureRowContextMenu-Gwq3OMEA.cjs → FeatureRowContextMenu-CtBqdC1j.cjs} +1 -1
- package/dist/{FeatureRowContextMenu-BLt7VlUU.js → FeatureRowContextMenu-DCUIiDwc.js} +2 -2
- package/dist/{GeoJSONModal-BPFWeaLZ.js → GeoJSONModal-BV9Tamf4.js} +3 -3
- package/dist/{GeoJSONModal-iwUcvrg7.cjs → GeoJSONModal-Dd-nBufy.cjs} +1 -1
- package/dist/{SchemaEditor-qkoYMg0C.cjs → SchemaEditor-B4L17K1e.cjs} +1 -1
- package/dist/{SchemaEditor-BEsKUe2p.js → SchemaEditor-ryoTgaLb.js} +1 -1
- package/dist/{SchemaModal-9nNrgorr.js → SchemaModal-DvMbWskS.js} +3 -3
- package/dist/{SchemaModal-GrtgA7cH.cjs → SchemaModal-gAuDkd-L.cjs} +1 -1
- package/dist/{SettingsModal-DTP0Xx_Z.js → SettingsModal-BScVTjpn.js} +2 -2
- package/dist/{SettingsModal-6_qmRyCi.cjs → SettingsModal-CqaSFxxR.cjs} +1 -1
- package/dist/{ShortcutsModal-CdyQlrqK.cjs → ShortcutsModal-D1Y2bGT8.cjs} +1 -1
- package/dist/{ShortcutsModal-DwxZu71W.js → ShortcutsModal-ozuS2Ysb.js} +3 -3
- package/dist/element-editor-ui.cjs +1 -1
- package/dist/element-editor-ui.es.js +2 -2
- package/dist/{index-CtZterPc.js → index-CILw1Du5.js} +273 -273
- package/dist/index-DG4wEjGj.cjs +1 -0
- package/dist/primitives.cjs +1 -1
- package/dist/primitives.es.js +1 -1
- package/dist/{useWindowFocus-DGAWA1au.js → useWindowFocus-DuQVjnHE.js} +1 -1
- package/dist/{useWindowFocus-D-_yEm_V.cjs → useWindowFocus-EemgNOuz.cjs} +1 -1
- package/package.json +2 -2
- package/dist/EditToolbarBtn-dpCmKnzk.cjs +0 -3
- package/dist/index-BKdDZ4Y9.cjs +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var nr=Object.defineProperty;var sr=(r,t,o)=>t in r?nr(r,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):r[t]=o;var rt=(r,t,o)=>sr(r,typeof t!="symbol"?t+"":t,o);const i=require("react"),d=require("./useAdapterControls-BBObhzVX.cjs"),e=require("react/jsx-runtime"),Q=require("./useAccentStyle-hsGvyHZc.cjs"),$=require("@element-editor/core/internal"),Z=require("@element-editor/core"),F=require("@phosphor-icons/react"),ar=require("zustand/react/shallow"),D=require("./EditToolbarBtn-Ch9HCLHq.cjs"),te=require("clsx"),ut=require("react-dom"),lr=require("@turf/centroid"),ir=require("@turf/helpers"),dt=require("@turf/bbox");function se(r){let t=null,o=null;const s=()=>t??(t=r().then(a=>(o=a.default,a))),n=i.lazy(s);function f(a){const[p]=i.useState(()=>o??n);return i.createElement(p,a)}return Object.assign(f,{preload:s})}const ft=[];function Te(...r){for(const t of r)ft.push(t.preload)}let ot=!1;function cr(){if(ot||typeof window>"u")return;ot=!0;const r=()=>{for(const o of ft)o().catch(()=>{})},t=window.requestIdleCallback;t?t(r,{timeout:3e3}):setTimeout(r,1500)}const Me=i.createContext(null);function mt({children:r}){const t=Q.useElementEditorConfig(),[o,s]=i.useState(()=>{const u=$.loadCustomBindings(t);return $.syncShortcutCache(u),u}),n=i.useCallback(u=>$.getEffectiveKey(u,o),[o]),f=i.useCallback((u,b)=>{const h=$.findConflict(b,u,o);if(h)return h;const x={...o,[u]:b};return s(x),$.saveCustomBindings(x,t),$.syncShortcutCache(x),null},[o,t]),a=i.useCallback(u=>{const b={...o};delete b[u],s(b),$.saveCustomBindings(b,t),$.syncShortcutCache(b)},[o,t]),p=i.useCallback(()=>{s({}),$.saveCustomBindings({},t),$.syncShortcutCache({})},[t]);return e.jsx(Me.Provider,{value:{custom:o,getKey:n,setKey:f,resetKey:a,resetAll:p},children:r})}function ur(){return i.useContext(Me)}function fe(){const r=i.useContext(Me);if(!r)throw new Error("useShortcutConfig must be used inside ShortcutConfigProvider");return r}const Ue=se(()=>Promise.resolve().then(()=>require("./FeatureList-VRYesXCq.cjs"))),pt=se(()=>Promise.resolve().then(()=>require("./DataTable-B-2VjBEz.cjs"))),ht=se(()=>Promise.resolve().then(()=>require("./SchemaEditor-B4L17K1e.cjs")));Te(Ue,pt,ht);function gt(){return e.jsxs("div",{className:"flex flex-col items-center justify-center gap-3 h-full text-elm-text-muted",children:[e.jsx(F.MapPinPlus,{size:40,weight:"light"}),e.jsx("p",{className:"text-sm text-center text-balance leading-snug",children:"No features yet — add a point, line, or area"})]})}const xt=()=>typeof navigator<"u"&&/Mac/.test(navigator.platform);function yt(r){const t=r==null?void 0:r.name;return{type:"error",code:t==="NotAllowedError"?"permission-denied":t==="TypeError"?"unsupported":"unknown",source:"clipboard",message:"Could not copy to the clipboard",cause:r,quiet:!0}}function bt(r,t){if(t.length===0)return r.map(s=>s.id);const o=[];for(const s of t)for(const n of r)n.groupId===s.id&&o.push(n.id);for(const s of r)s.groupId||o.push(s.id);return o}function dr(r,t){const o=[];for(const s of t)if(!s.collapsed)for(const n of r)n.groupId===s.id&&o.push(n.id);for(const s of r)s.groupId||o.push(s.id);return o}const vt="data-elm-window",Pe=new WeakMap;function fr(r){const t=Pe.get(r);if(!(t!=null&&t.size))return!1;let o=null;for(const s of t)(!o||s.z()>o.z())&&(o=s);return o==null||o.close(),!!o}function mr(r,t,o,s,{topWindow:n=!0}={}){const{uiStore:f}=d.useGeoStore(),a=i.useRef(o),p=i.useRef(s);i.useLayoutEffect(()=>{a.current=o,p.current=s}),i.useEffect(()=>{if(!t)return;const u=document.activeElement,b={z:()=>p.current,close:()=>a.current()};let h=Pe.get(f);h||Pe.set(f,h=new Set),n&&h.add(b);const x=r.current;function m(S){S.key!=="Escape"||S.defaultPrevented||!(x!=null&&x.contains(S.target))||(S.preventDefault(),a.current())}return document.addEventListener("keydown",m),()=>{h.delete(b),document.removeEventListener("keydown",m);const S=document.activeElement;(!S||S===document.body||((x==null?void 0:x.contains(S))??!1)||!S.isConnected)&&(u!=null&&u.isConnected)&&u!==document.body&&u.focus({preventScroll:!0})}},[t,r,f,n])}function pr(){return new Promise(r=>{const t=document.createElement("input");t.type="file",t.accept=".geojson,.json,application/geo+json,application/json",t.style.display="none",document.body.appendChild(t);let o=!1;const s=()=>{o||(o=!0,t.remove())};t.addEventListener("change",()=>{var f;const n=((f=t.files)==null?void 0:f[0])??null;s(),r(n)},{once:!0}),t.addEventListener("cancel",()=>{s(),r(null)},{once:!0}),t.click()})}const he=new Map;function wt(r){if(r.closest("[data-elm-portal]"))return!0;let t=r;for(;t.parentElement&&t.parentElement!==document.body;)t=t.parentElement;return t.parentElement===document.body&&(t.hasAttribute("data-elm-theme")||t.hasAttribute("data-elm-portal"))}function hr(r,t){if(!t||r.composedPath().includes(t.root))return!0;const o=document.activeElement;return!o||o===document.body||wt(o)?t.pointerInside??he.size===1:!1}function ce(){const{uiStore:r}=d.useGeoStore();return i.useCallback(t=>hr(t,he.get(r)),[r])}const gr=140;function xr(r,t){r.querySelectorAll(`[data-elm-shortcut="${t}"]`).forEach(o=>{o.disabled||(o.setAttribute("data-pressed",""),setTimeout(()=>o.removeAttribute("data-pressed"),gr))})}const yr=["point","line","polygon","route","circle","rectangle","freehand","picker"];function br(r){var S;const{dataStore:t,uiStore:o}=d.useGeoStore(),s=d.useEmit(),{panTo:n,fitBounds:f,setZoom:a}=d.useMapController(),p=d.useGeoJSONFileImport(),u=Q.useElementEditorConfig(),b=ce(),h=(S=ur())==null?void 0:S.custom,x=i.useRef(h);x.current=h;const m=i.useCallback(k=>x.current?$.getEffectiveKey(k,x.current):$.getCurrentKey(k),[]);i.useEffect(()=>{if(!r)return;const k=r.closest("[data-elm-theme]")??r,M={root:k,pointerInside:null};he.set(o,M);const E=l=>{l.composedPath().includes(k)?M.pointerInside=!0:l.target instanceof Element&&wt(l.target)||(M.pointerInside=!1)};return document.addEventListener("pointerdown",E,{capture:!0,passive:!0}),()=>{he.get(o)===M&&he.delete(o),document.removeEventListener("pointerdown",E,{capture:!0})}},[r,o]),i.useEffect(()=>{if(!u.ui.keyboardShortcuts.enabled||!u.ui.keyboardShortcuts.mapZoom)return;function k(M){if(!(M.metaKey||M.ctrlKey)||!b(M))return;const E=M.target,l=E==null?void 0:E.tagName;if(l==="INPUT"||l==="TEXTAREA"||l==="SELECT"||E!=null&&E.isContentEditable)return;const g=M.key==="+"||M.key==="=",c=M.key==="-"||M.key==="_";if(!g&&!c||!a)return;M.preventDefault();const I=t.getState().currentZoom;a(I+(g?1:-1))}return window.addEventListener("keydown",k,{capture:!0}),()=>window.removeEventListener("keydown",k,{capture:!0})},[u.ui.keyboardShortcuts.enabled,u.ui.keyboardShortcuts.mapZoom,a,t]),i.useEffect(()=>{const k=u.ui.keyboardShortcuts.enabled;function M(l){var L;if(!k&&l.key!=="Enter"||!b(l))return;const g=t.getState(),c=o.getState(),I=c.readonly,y=w=>{var O;return xr(((O=he.get(o))==null?void 0:O.root)??document,w)},C=l.target.tagName,N=l.target,A=l.composedPath(),B=A.some(w=>{if(!(w instanceof Element))return!1;const O=w.getAttribute("role");return O==="grid"||O==="treegrid"}),v=C==="INPUT"||C==="TEXTAREA"||C==="SELECT"||N.isContentEditable||B,j=l.key.toLowerCase();if(!v&&!I&&j==="z"&&(l.metaKey||l.ctrlKey)&&!l.shiftKey){l.preventDefault(),y("undo"),g.undoStack.length>0&&(g.undo(),s({type:"undo"}));return}if(!v&&!I&&j==="z"&&(l.metaKey||l.ctrlKey)&&l.shiftKey){l.preventDefault(),y("redo"),g.redoStack.length>0&&(g.redo(),s({type:"redo"}));return}if(!v&&(l.metaKey||l.ctrlKey)&&(l.key==="a"||l.key==="A")){l.preventDefault();const w=new Set(g.groups.filter(q=>q.hidden).map(q=>q.id)),O=g.features.filter(q=>!q.hidden&&!(q.groupId&&w.has(q.groupId))).map(q=>q.id);O.length>0&&g.setSelection(O);return}if(!v&&(l.metaKey||l.ctrlKey)&&!l.shiftKey&&(l.key==="j"||l.key==="J")){l.preventDefault();const w=!c.autoExitAfterDraw;c.setAutoExitAfterDraw(w),s({type:"success",message:w?"Drawing tools will exit after each shape":"Drawing tools will stay active after each shape",description:w?"You’ll go back to select mode. Press a tool key to draw again.":"Keep drawing more shapes in a row. Press the tool key again or Esc to exit."});return}if(!v&&!I&&(l.metaKey||l.ctrlKey)&&!l.shiftKey&&(l.key==="o"||l.key==="O")){l.preventDefault(),pr().then(w=>{w&&p(w)});return}if(!v&&(l.metaKey||l.ctrlKey)&&!l.shiftKey&&(l.key==="s"||l.key==="S")){l.preventDefault();const w=g.exportGeoJSON(),O=JSON.parse(w);if(!Array.isArray(O.features)||O.features.length===0){s({type:"warning",message:"Export failed",description:"No features to export — draw or import something first."});return}const q=O.features.length;(async()=>{const R=await d.saveGeoJSONFile(w);R&&s({type:"success",message:`Exported ${R.name}`,description:`${q===1?"1 feature":`${q} features`} · ${(R.bytes/1024).toFixed(1)} KB`})})();return}if(!v&&(l.metaKey||l.ctrlKey)){if(l.key==="c"){if(g.selectedIds.length===0)return;g.copySelection().then(w=>s(w?{type:"selection:copied"}:{type:"warning",message:"Copied for pasting in this editor only",description:"The browser did not allow writing to the system clipboard."}));return}if(l.key==="d"){if(l.preventDefault(),I)return;y("duplicate");const w=g.selectedIds;if(g.duplicateSelection())if(w.length===1){const O=t.getState().features.find(q=>q.id===w[0]);s({type:"feature:duplicated",featureId:w[0],label:String((O==null?void 0:O.properties.name)||"feature")})}else s({type:"features:duplicated",count:w.length});return}if(l.key==="e"||l.key==="E"){if(g.selectedIds.length!==1)return;l.preventDefault(),c.openEditDialog(g.selectedIds[0],{focusFirstField:!0});return}if((l.key==="g"||l.key==="G")&&!I){if(l.shiftKey){if(g.selectedIds.length===0||!g.features.some(O=>g.selectedIds.includes(O.id)&&O.groupId))return;l.preventDefault(),g.ungroupSelection()}else{if(g.selectedIds.length===0)return;l.preventDefault();const w=g.groupSelection();w&&c.setAutoFocusGroupId(w)}return}}if(l.key==="Enter"){if((!v||l.metaKey||l.ctrlKey)&&c.editingMode!=="none"){if(c.editingMode==="slice-shape"){l.preventDefault(),c.commitSliceShape();return}else if(c.editingMode==="cut-hole"){l.preventDefault(),c.commitCutHole();return}else if(c.editingMode==="draw-line"&&c.lineInProgress.length>=2){l.preventDefault(),c.commitLine({});return}else if(c.editingMode==="draw-polygon"&&c.polygonInProgress.length>=3){l.preventDefault(),c.commitPolygon({});return}else if(c.editingMode==="draw-route"&&c.routeWaypoints.length>=2){l.preventDefault(),c.commitRoute();return}}if(!k)return;const O=c.editingMode==="none"||c.editingMode==="draw-rect"||c.editingMode==="draw-circle"||c.editingMode==="place-point"||c.editingMode==="draw-freehand"||c.editingMode==="pick-shape"||c.editingMode==="draw-line"&&c.lineInProgress.length<2||c.editingMode==="draw-polygon"&&c.polygonInProgress.length<3||c.editingMode==="draw-route"&&c.routeWaypoints.length<2;if(c.dialogState.type==="closed"){if(!v&&!I&&!((L=N.closest)!=null&&L.call(N,'button, a[href], [role="button"]'))&&!l.metaKey&&!l.ctrlKey&&!l.altKey&&O){const q=g.selectedIds;if(q.length===1){const R=g.features.find(W=>W.id===q[0]),T=R==null?void 0:R.geometry.type;if(T==="LineString"||T==="Polygon"||T==="MultiLineString"||T==="MultiPolygon"||T==="GeometryCollection"){l.preventDefault();const W=!c.vertexEditActive;W&&c.editingMode!=="none"&&c.setEditingMode("none"),c.setVertexEditActive(W);return}}}}}const P=A.some(w=>w instanceof Element&&w.hasAttribute("data-elm-search-open"));if(l.key==="Tab"&&!v&&c.dialogState.type==="closed"&&!P&&!l.metaKey&&!l.ctrlKey&&!l.altKey){const w=g.features;if(w.length===0)return;l.preventDefault();const O=bt(w,g.groups),q=g.selectedIds.length===1?g.selectedIds[0]:null,R=q?O.indexOf(q):-1;let T;l.shiftKey?T=R<=0?O.length-1:R-1:T=R>=O.length-1?0:R+1;const G=O[T];g.selectFeature(G);const W=w.find(H=>H.id===G);if(W)if(W.geometry.type==="Point"){const[H,X]=W.geometry.coordinates;n==null||n([X,H])}else f==null||f(W.bbox||Z.getGeometryBBox(W.geometry));return}if(!v&&!l.metaKey&&!l.ctrlKey&&!l.altKey){const w=l.key.toLowerCase();if(w===m("show-shortcuts")){l.preventDefault(),y("show-shortcuts"),c.shortcutsModalOpen?c.closeShortcutsModal():c.openShortcutsModal();return}if(u.ui.schemaEditor&&!I&&w===m("toggle-schema")){l.preventDefault(),y("toggle-schema"),c.toggleSchemaModal();return}if(u.ui.layerList&&w===m("toggle-sidebar")){l.preventDefault(),y("toggle-sidebar"),c.setSidebarOpen(!c.sidebarOpen);return}}if(!v&&c.dialogState.type!=="new-point"&&!l.metaKey&&!l.ctrlKey&&!l.altKey){const w=l.key.toLowerCase();if(u.ui.dataTable&&w===m("toggle-table")){l.preventDefault(),y("toggle-table"),c.toggleTable();return}if(u.ui.geojsonEditor&&w===m("toggle-geojson")){l.preventDefault(),y("toggle-geojson"),c.toggleCodeModal();return}if(u.ui.zoomIndicator&&w===m("set-zoom")){l.preventDefault(),y("set-zoom"),c.setZoomEditing(!0);return}if(w===m("measure")){y("measure"),c.setEditingMode(c.editingMode==="measure"?"none":"measure");return}if(I)return;if(w===m("toggle-transform")){(g.selectedIds.length===1&&g.selectedIds[0]||g.selectedIds.length>0)&&(y("toggle-transform"),c.setTransformActive(!c.transformActive),!c.transformActive&&c.editingMode!=="none"&&c.setEditingMode("none"));return}const O=c.isToolAvailable,q=R=>{c.editingMode!==R&&!g.canAddFeatures(1)||(y(R==="pick-shape"?"picker":R),c.setEditingMode(c.editingMode===R?"none":R))};for(const R of yr){const T=Q.TOOL_MODES[R];if(O(R)&&w===m(T==="pick-shape"?"picker":T)){q(T);return}}if(w===m("cut-hole")){const R=g.features.find(T=>T.id===(g.selectedIds.length===1?g.selectedIds[0]:null));R&&(R.geometry.type==="Polygon"||R.geometry.type==="MultiPolygon")&&(y("cut-hole"),c.setEditingMode(c.editingMode==="cut-hole"?"none":"cut-hole"),c.setTransformActive(!1));return}if(w===m("slice-shape")){const R=g.features.find(T=>T.id===(g.selectedIds.length===1?g.selectedIds[0]:null));R&&(R.geometry.type==="Polygon"||R.geometry.type==="MultiPolygon")&&(y("slice-shape"),c.setEditingMode(c.editingMode==="slice-shape"?"none":"slice-shape"),c.setTransformActive(!1));return}if(w===m("break-apart")){const R=g.selectedIds.length===1?g.selectedIds[0]:null,T=R?g.features.find(G=>G.id===R):null;if(T&&$.isMultiGeometry(T.geometry)){y("break-apart");const G=$.getPartCount(T.geometry);g.breakMultiGeometry(R)&&s({type:"feature:broken",featureId:R,count:G,undo:()=>t.getState().undo()})}return}}if(l.key!=="Delete"&&l.key!=="Backspace"||I||c.dialogState.type==="new-point")return;const z=g.selectedIds;if(z.length===0||v||c.vertexEditActive)return;const K=z.length,_=K===1?g.features.find(w=>w.id===z[0]):null,J=K===1?String((_==null?void 0:_.properties.name)||"Unnamed feature"):`${K} features`;l.preventDefault(),l.stopImmediatePropagation(),y("delete-selected"),g.deleteSelection(),c.closeDialog(),s(K===1?{type:"feature:deleted",featureId:z[0],label:J,undo:()=>t.getState().undo()}:{type:"features:deleted",count:K,undo:()=>t.getState().undo()})}function E(l){var y;if(!b(l))return;const g=l.target.tagName;if(g==="INPUT"||g==="TEXTAREA"||g==="SELECT"||o.getState().readonly)return;const c=(y=l.clipboardData)==null?void 0:y.getData("text");if(c)try{const C=JSON.parse(c);if(C.type==="FeatureCollection"||C.type==="Feature"){const N=C.type==="FeatureCollection"?C.features:[C];t.setState({clipboard:N}),t.getState().pasteSelection()&&s({type:"selection:pasted",count:N.length});return}}catch{}const I=t.getState().clipboard;I&&I.length>0&&t.getState().pasteSelection()&&s({type:"selection:pasted",count:I.length})}return window.addEventListener("keydown",M),window.addEventListener("paste",E),()=>{window.removeEventListener("keydown",M),window.removeEventListener("paste",E)}},[t,o,s,n,f,u,m,p]),i.useEffect(()=>{function k(M){var c;if(M.key!=="Escape"||!b(M))return;const E=M.target;if(E&&(E.tagName==="INPUT"||E.tagName==="TEXTAREA"||E.isContentEditable)||(c=E==null?void 0:E.closest)!=null&&c.call(E,`[${vt}]`)||D.isContextMenuOpen())return;const l=o.getState();if(l.dialogState.type!=="closed"){l.closeDialog(),M.stopPropagation();return}if(l.editingMode==="none"){if(l.vertexEditActive){l.setVertexEditActive(!1),M.stopPropagation();return}if(l.transformActive){l.setTransformActive(!1),M.stopPropagation();return}if(t.getState().selectedIds.length>0){t.getState().selectFeature(null),M.stopPropagation();return}fr(o)&&M.stopPropagation()}}return window.addEventListener("keydown",k,{capture:!0}),()=>window.removeEventListener("keydown",k,{capture:!0})},[])}const vr=new Set(["true","yes","y","1","on","x","✓"]),wr=new Set(["false","no","n","0","off",""]);function St(r){const t=r.trim().toLowerCase();return vr.has(t)?!0:wr.has(t)?!1:null}function kt(r){return typeof r=="boolean"?r:typeof r=="number"?r!==0:typeof r=="string"?St(r)===!0:!1}function Sr({fields:r,values:t,onChange:o,errors:s,autoFocusFirst:n,readonly:f}){return e.jsx("div",{className:"space-y-3",children:r.map((a,p)=>{const u=t[a.key]??"",b=s==null?void 0:s[a.key],h=n&&p===0,x=e.jsxs("label",{className:"block text-xs font-medium text-(--elm-text-muted,var(--color-gray-600)) dark:text-(--elm-text-muted,var(--color-gray-400)) mb-1",children:[a.label,a.required&&e.jsx("span",{className:"text-rose-500 ml-0.5",children:"*"})]});let m;return a.type==="boolean"?e.jsxs("div",{"data-field-key":a.key,className:"flex items-center justify-between py-1 border-b border-transparent",children:[x,e.jsxs("label",{className:"relative inline-flex items-center cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:kt(u),onChange:S=>o(a.key,S.target.checked),disabled:f,className:"sr-only peer"}),e.jsx("div",{className:"w-9 h-5 bg-(--elm-border-strong,var(--color-gray-200)) peer-focus-visible:ring-2 peer-focus-visible:ring-elm-focus-ring peer-focus-visible:ring-offset-2 peer-focus-visible:ring-offset-elm-surface rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-(--elm-border-strong,var(--color-gray-300)) after:border after:rounded-full after:h-4 after:w-4 after:transition-transform peer-checked:bg-primary-500 opacity-90 hover:opacity-100 disabled:opacity-50"})]}),b&&e.jsx("p",{className:"mt-1 text-xs text-rose-500 w-full basis-full",children:b})]},a.key):(a.type==="textarea"?m=e.jsx(D.Textarea,{rows:3,value:String(u),onChange:S=>o(a.key,S.target.value),autoFocus:h,error:!!b,disabled:f}):a.type==="select"?m=e.jsxs(D.SelectInput,{value:String(u),onChange:S=>o(a.key,S.target.value),autoFocus:h,error:!!b,disabled:f,children:[e.jsx("option",{value:"",children:"— select —"}),(a.options??[]).map(S=>e.jsx("option",{value:S,children:S},S))]}):a.type==="number"?m=e.jsx(D.Input,{type:"number",value:String(u),onChange:S=>o(a.key,S.target.value),autoFocus:h,error:!!b,disabled:f,min:a.min,max:a.max}):m=e.jsx(D.Input,{type:a.type,value:String(u),onChange:S=>o(a.key,S.target.value),autoFocus:h,error:!!b,disabled:f}),e.jsxs("div",{"data-field-key":a.key,children:[x,m,b&&e.jsx("p",{className:"mt-1 text-xs text-rose-500",children:b})]},a.key))})})}const ge="items-center justify-center flex-shrink-0 p-[3px] rounded-elm-control text-elm-text-secondary hover:bg-(--elm-surface-hover,var(--color-gray-100)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-700)) active:scale-[0.95] disabled:text-elm-text-disabled disabled:hover:bg-transparent disabled:active:scale-100 disabled:cursor-not-allowed transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-elm-focus-ring",jt="h-10 box-border flex items-center flex-shrink-0 border-b border-elm-border bg-elm-surface-sunken";function Et(){const r=d.useUIStore(n=>n.setSidebarOpen),t=d.useUIStore(n=>n.layout==="split"),o=Q.useElementEditorConfig(),{getKey:s}=fe();return t?null:e.jsx(D.Tooltip,{content:"Hide layers",shortcut:o.ui.keyboardShortcuts.enabled?e.jsx(D.KbdDark,{children:s("toggle-sidebar").toUpperCase()}):void 0,side:"bottom",children:e.jsx("button",{"aria-label":"Collapse layers panel","data-elm-shortcut":"toggle-sidebar",onClick:n=>{r(!1),n.currentTarget.blur()},className:`flex ${ge}`,children:e.jsx(F.SidebarSimple,{size:16,mirrored:!0})})})}const kr=/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false)\b|\bnull\b|-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?/g,jr="text-gray-800 dark:text-[#e06c75]",Er="text-[#a11] dark:text-[#98c379]",Cr="text-[#164] dark:text-[#d19a66]",Ir="text-[#219] dark:text-[#d19a66]",Dr="text-[#164] dark:text-[#d19a66]";function Nr(r){const t=[];let o=0;for(const s of r.matchAll(kr)){const n=s.index;n>o&&t.push(r.slice(o,n));const[f,a,p,u]=s;a!==void 0?(t.push(e.jsx("span",{className:p?jr:Er,children:a},n)),p&&t.push(p)):u!==void 0?t.push(e.jsx("span",{className:Ir,children:f},n)):t.push(e.jsx("span",{className:f==="null"?Dr:Cr,children:f},n)),o=n+f.length}return o<r.length&&t.push(r.slice(o)),t}function Pr({json:r,className:t}){const o=i.useMemo(()=>Nr(r),[r]);return e.jsx("pre",{className:t,children:o})}function nt(r,t){if(r.required&&(t==null||String(t).trim()===""))return`${r.label} is required`;if(r.type==="number"&&t!==void 0&&t!==null&&String(t).trim()!==""){const o=Number(t);if(!isNaN(o)){const s=r.min!==void 0,n=r.max!==void 0;if(s&&n&&(o<r.min||o>r.max))return`${r.label} must be between ${r.min} and ${r.max}`;if(s&&o<r.min)return`${r.label} must be ≥ ${r.min}`;if(n&&o>r.max)return`${r.label} must be ≤ ${r.max}`}}return null}function Ct(r,t){const o=d.useUIStore(a=>a.panelPrefs[r]),s=d.useUIStore(a=>a.setPanelPref),n=o!==null?o:t;return{open:n,toggle:()=>s(r,!n)}}function Tr(r,t,o){if(r.type==="new-point"){const s={};return t.fields.forEach(n=>{s[n.key]=""}),r.prefill&&Object.assign(s,r.prefill),s}if(r.type==="edit"){const s=o.find(n=>n.id===r.featureId);if(s)return{...s.properties}}return{}}function It({dialogState:r,collapsible:t=!1}){const{dataStore:o}=d.useGeoStore(),s=d.useEmit(),n=d.useUIStore(T=>T.closeDialog),f=d.useDataStore(T=>T.selectFeature),a=d.useDataStore(ar.useShallow(T=>T.getVisibleSchemas())),p=d.useDataStore(T=>T.lastUsedSchemaId),u=d.useUIStore(T=>T.readonly),{uiStore:b}=d.useGeoStore(),h=ce(),x=d.useDataStore(T=>T.features),m=i.useMemo(()=>r.type==="edit"?x.find(T=>T.id===r.featureId)??null:null,[r,x]),S=d.useDataStore(T=>T.addFeature),k=d.useDataStore(T=>T.updateFeature),M=d.useDataStore(T=>T.deleteFeature),E=d.useDataStore(T=>T.duplicateFeature),l=d.useDataStore(T=>T.getDefaultSchema),g=d.useDataStore(T=>T.setLastUsedSchemaId),c=r.type==="new-point",I=l(),[y,C]=i.useState(()=>r.type==="edit"&&(m!=null&&m.schemaId)?m.schemaId:p&&a.find(G=>G.id===p)?p:I.id),N=a.find(T=>T.id===y)??I,[A,B]=i.useState(()=>Tr(r,N,x)),[v,j]=i.useState({}),P=m==null?void 0:m.properties,z=m==null?void 0:m.schemaId,[K,_]=i.useState({editProps:P,editSchemaId:z});m&&(K.editProps!==P||K.editSchemaId!==z)&&(_({editProps:P,editSchemaId:z}),B({...P}),z&&C(z),j({}));function J(T){const G=a.find(W=>W.id===T)??I;if(c){const W={};G.fields.forEach(H=>{W[H.key]=A[H.key]??""}),B(W)}C(T),g(T),j({})}i.useEffect(()=>{if(u)return;function T(G){if((G.metaKey||G.ctrlKey)&&G.key==="Enter"&&h(G)){const W=b.getState();if(W.lineInProgress.length>0||W.polygonInProgress.length>0||W.routeWaypoints.length>0||W.freehandPoints.length>0||W.circleCenter!==null||W.rectCorner!==null)return;G.preventDefault(),L()}}return window.addEventListener("keydown",T),()=>window.removeEventListener("keydown",T)});function L(){var W;const T={};for(const H of N.fields){const X=nt(H,A[H.key]);X&&(T[H.key]=X)}if(Object.keys(T).length>0){j(T);const H=(W=N.fields.find(X=>T[X.key]))==null?void 0:W.key;H&&setTimeout(()=>{var ue;const X=document.querySelector(`[data-field-key="${CSS.escape(H)}"]`),ee=X==null?void 0:X.querySelector("input, textarea, select");ee==null||ee.focus(),ee&&"select"in ee&&((ue=ee.select)==null||ue.call(ee))},0);return}j({});const G={};for(const[H,X]of Object.entries(A))X!==""&&(G[H]=X);c&&r.type==="new-point"?S({type:"Feature",id:crypto.randomUUID(),schemaId:y,geometry:{type:"Point",coordinates:r.coords},properties:G}):m&&k(m.id,{properties:G,schemaId:y}),n()}function w(){if(!m)return;const T=String(m.properties.name||"feature"),G=m.id,W=E(G);n(),W&&s({type:"feature:duplicated",featureId:G,label:T})}function O(){if(!m)return;const T=String(m.properties.name||"Unnamed feature"),G=m.id;M(G),n(),s({type:"feature:deleted",featureId:G,label:T,undo:()=>o.getState().undo()})}const q=c?"New point":m?String(m.properties.name||"Edit feature"):"Edit feature",R=c?"point":(m==null?void 0:m.geometry.type)==="MultiPoint"?"points":(m==null?void 0:m.geometry.type)==="LineString"?"line":(m==null?void 0:m.geometry.type)==="MultiLineString"?"lines":(m==null?void 0:m.geometry.type)==="Polygon"?"area":(m==null?void 0:m.geometry.type)==="MultiPolygon"?"areas":(m==null?void 0:m.geometry.type)==="GeometryCollection"?"mixed":"point";return e.jsxs("div",{className:"flex flex-col flex-1 min-h-0",children:[e.jsxs("header",{className:"flex items-center gap-1 px-4 pt-4 pb-3 border-b border-elm-border flex-shrink-0 bg-elm-surface-sunken",children:[t&&e.jsx(Et,{}),e.jsx(D.Tooltip,{content:"Back to layers",side:"bottom",children:e.jsx("button",{type:"button",onClick:()=>{n(),f(null)},"aria-label":"Back to layers",className:`flex ${ge}`,children:e.jsx(F.ArrowLeft,{size:16})})}),e.jsxs("div",{className:"flex-1 min-w-0 mx-1",children:[e.jsx("p",{className:"text-sm leading-5 font-semibold text-(--elm-text,var(--color-gray-800)) dark:text-(--elm-text,var(--color-gray-100)) truncate",children:q}),e.jsx("p",{className:"text-xs leading-4 text-elm-text-subtle capitalize",children:R})]}),m&&e.jsxs(e.Fragment,{children:[!u&&e.jsx(D.Tooltip,{content:"Duplicate",shortcut:e.jsxs("span",{className:"flex items-center gap-0.5",children:[e.jsx(D.KbdDark,{children:"⌘"}),e.jsx(D.KbdDark,{children:"D"})]}),side:"bottom",children:e.jsx("button",{type:"button",onClick:w,"aria-label":"Duplicate feature",className:`flex ${ge}`,children:e.jsx(F.CopySimple,{size:16})})}),!u&&e.jsx(D.Tooltip,{content:"Delete feature",side:"bottom",children:e.jsx("button",{type:"button",onClick:O,"aria-label":"Delete feature",className:`flex ${ge}`,children:e.jsx(F.Trash,{size:16})})})]})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto min-h-0 px-4 pt-4",children:[a.length>1&&e.jsxs("div",{className:"mb-3",children:[e.jsx("label",{className:"block text-xs font-medium text-(--elm-text-muted,var(--color-gray-600)) dark:text-(--elm-text-muted,var(--color-gray-400)) mb-1",children:"Schema"}),e.jsx(D.SelectInput,{value:y,onChange:T=>J(T.target.value),disabled:u,children:a.map(T=>{var G;return e.jsxs("option",{value:T.id,children:[T.name,T.id===((G=a[0])==null?void 0:G.id)?" (default)":""]},T.id)})})]}),e.jsx(Sr,{fields:N.fields,values:A,onChange:(T,G)=>{B(H=>({...H,[T]:G}));const W=N.fields.find(H=>H.key===T);if(W){const H=nt(W,G);j(X=>{if(H)return{...X,[T]:H};const ee={...X};return delete ee[T],ee})}},errors:v,autoFocusFirst:!u&&(c||r.type==="edit"&&!!r.isNew||r.type==="edit"&&!!r.focusFirstField),readonly:u}),e.jsx(Ur,{dialogState:r,editFeature:m??null,values:A,schemaId:y}),e.jsx(Mr,{dialogState:r,editFeature:m??null}),e.jsx("div",{className:"-mx-4 border-t border-elm-border"})]}),!u&&e.jsx("div",{className:"px-4 py-3 border-t border-elm-border flex-shrink-0",children:e.jsxs(D.Button,{variant:"primary",onClick:L,className:"w-full py-2 rounded-elm font-medium",children:["Save",e.jsx("span",{className:"ml-auto flex items-center gap-0.5",children:xt()?e.jsxs(e.Fragment,{children:[e.jsx(D.KbdInvert,{children:"⌘"}),e.jsx(D.KbdInvert,{children:"↵"})]}):e.jsxs(e.Fragment,{children:[e.jsx(D.KbdInvert,{children:"Ctrl"}),e.jsx(D.KbdInvert,{children:"↵"})]})})]})})]})}function Mr({dialogState:r,editFeature:t}){const o=i.useMemo(()=>{if(r.type==="new-point"){const[a,p]=r.coords;return[`${p.toFixed(6)}, ${a.toFixed(6)}`]}if(!t)return[];if(t.geometry.type==="Point"){const[a,p]=t.geometry.coordinates;return[`${p.toFixed(6)}, ${a.toFixed(6)}`]}return t.geometry.type==="LineString"?t.geometry.coordinates.map(([p,u],b)=>`${b+1}. ${u.toFixed(6)}, ${p.toFixed(6)}`):t.geometry.type==="Polygon"?t.geometry.coordinates[0].slice(0,-1).map(([p,u],b)=>`${b+1}. ${u.toFixed(6)}, ${p.toFixed(6)}`):[]},[r,t]),s=o.length<=5,{open:n,toggle:f}=Ct("coordsOpen",s);return o.length===0?null:e.jsx(Dt,{label:"Coordinates",open:n,onToggle:f,children:e.jsx("div",{className:"space-y-0.5",children:o.map((a,p)=>e.jsx("p",{className:"text-xs font-elm-mono text-elm-text-muted",children:a},p))})})}function Ur({dialogState:r,editFeature:t,values:o,schemaId:s}){const n=i.useMemo(()=>{if(r.type==="new-point"){const S={};for(const[k,M]of Object.entries(o))M!==""&&(S[k]=M);return{type:"Feature",id:"(new)",schemaId:s,geometry:{type:"Point",coordinates:r.coords},properties:S}}return t??null},[r,t,o,s]),{open:f,toggle:a}=Ct("sourceOpen",!1),[p,u]=i.useState(!1),b=d.useEmit();if(!n)return null;const h=JSON.stringify(n,null,2);function x(){Promise.resolve().then(()=>navigator.clipboard.writeText(h)).then(()=>{u(!0),setTimeout(()=>u(!1),1500)},S=>b(yt(S)))}const m=e.jsx("button",{type:"button",onClick:S=>{S.stopPropagation(),x()},"aria-label":"Copy source",className:`flex items-center justify-center w-6 h-6 rounded-elm-chip hover:bg-elm-surface-hover transition-colors ${p?"text-emerald-500":"text-elm-text-disabled hover:text-(--elm-text-secondary,var(--color-gray-500)) dark:hover:text-(--elm-text-secondary,var(--color-gray-300))"}`,children:p?e.jsx(F.Check,{size:16,weight:"bold"}):e.jsx(F.Copy,{size:16})});return e.jsx(Dt,{label:"Source",open:f,onToggle:a,action:m,children:e.jsx(Pr,{json:h,className:"text-[11px] font-elm-mono text-(--elm-text-secondary,var(--color-gray-800)) dark:text-(--elm-text-secondary,var(--color-gray-300)) bg-elm-surface-sunken border border-(--elm-border-subtle,var(--color-gray-100)) dark:border-(--elm-border-subtle,var(--color-gray-700)) rounded-elm-card p-2 overflow-x-auto whitespace-pre leading-relaxed"})})}function Dt({label:r,open:t,onToggle:o,action:s,children:n}){return e.jsxs("div",{children:[e.jsx("div",{className:"-mx-4 border-t border-elm-border"}),e.jsxs("div",{className:"flex items-center h-12",children:[e.jsxs("button",{type:"button",className:"flex items-center gap-1 text-xs font-medium text-elm-text-subtle hover:text-(--elm-text-secondary,var(--color-gray-600)) dark:hover:text-(--elm-text-secondary,var(--color-gray-300)) hover:bg-elm-surface-hover rounded-elm-control -ml-2 pl-2 transition-colors flex-1 text-left h-full",onClick:o,children:[e.jsx("span",{className:"text-elm-text-subtle flex-shrink-0",children:t?e.jsx(F.CaretDown,{size:12,weight:"bold"}):e.jsx(F.CaretRight,{size:12,weight:"bold"})}),r]}),s]}),t&&e.jsx("div",{className:"pb-3",children:n})]})}const Nt="[data-elm-theme],[data-elm-theme] *{transition:none!important}";function st(r){const t=document.createElement("style");t.textContent=Nt,document.head.appendChild(t),r(),requestAnimationFrame(()=>requestAnimationFrame(()=>t.remove()))}function Pt(r,t){t==null||t.setAttribute("data-dragging","");const o=document.createElement("div");o.style.cssText=`position:fixed;inset:0;z-index:2147483647;cursor:${r}`,document.body.appendChild(o);const s=document.createElement("style");return s.textContent=Nt,document.head.appendChild(s),document.body.style.userSelect="none",()=>{t==null||t.removeAttribute("data-dragging"),o.remove(),s.remove(),document.body.style.userSelect=""}}function Tt(r,t,o,s){const n=Q.useElementEditorConfig(),[f,a]=i.useState(()=>{const b=parseInt(Z.readStorage(r,n)??"",10);return isNaN(b)?t:Math.max(o,Math.min(s,b))}),p=i.useRef(f);p.current=f;const u=i.useCallback(b=>{if(b.button!==0)return;b.preventDefault();const h=b.clientX,x=p.current,m=Pt("col-resize",b.currentTarget);function S(M){const E=Math.max(o,Math.min(s,x+(h-M.clientX)));p.current=E,a(E)}function k(){m(),Z.writeStorage(r,String(p.current),n),window.removeEventListener("mousemove",S),window.removeEventListener("mouseup",k)}window.addEventListener("mousemove",S),window.addEventListener("mouseup",k)},[r,o,s,n]);return{width:f,onHandleMouseDown:u}}function Fe(r,t=!0){const{uiStore:o}=d.useGeoStore(),s=Q.useElementEditorConfig().ui.layerList,n=d.useUIStore($.sidebarTakesSpace),f=d.useUIStore(h=>h.narrow),a=d.useUIStore(h=>h.sidebarWidth),p=d.useUIStore(h=>h.codeDockWidth),b=d.useUIStore(h=>h.tableFullscreen)||f?0:(s&&n?a:0)+p;i.useLayoutEffect(()=>{var x;if(!t)return;const h=(x=r.current)==null?void 0:x.closest("[data-elm-theme]");if(h)return h.style.setProperty("--elm-panel-offset",`${b}px`),()=>{h.style.removeProperty("--elm-panel-offset")}},[r,t,b]),i.useLayoutEffect(()=>{var S;if(!t)return;const h=(S=r.current)==null?void 0:S.closest("[data-elm-theme]");if(!h)return;const x=()=>{const k=h.clientWidth;k>0&&o.getState().narrow!==k<$.NARROW_EDITOR_WIDTH&&o.getState().setNarrow(k<$.NARROW_EDITOR_WIDTH)};x();const m=new ResizeObserver(x);return m.observe(h),()=>m.disconnect()},[r,t,o])}const Mt="after:absolute after:transition-colors hover:after:bg-elm-focus-ring data-[dragging]:after:bg-elm-focus-ring",Ut=`absolute left-0 top-0 h-full w-1 z-20 cursor-col-resize after:inset-y-0 after:left-0 after:w-0.5 ${Mt}`,Fr=`absolute top-0 left-0 right-0 h-1 z-10 cursor-row-resize after:inset-x-0 after:top-0 after:h-0.5 ${Mt}`,Rr="p-1 rounded-elm-control flex items-center justify-center text-sm focus:outline-none focus-visible:ring-2 focus-visible:ring-elm-focus-ring active:scale-[0.95] disabled:cursor-not-allowed disabled:active:scale-100",Ar="text-elm-text hover:bg-elm-control-hover disabled:hover:bg-transparent",Lr="flex items-center justify-center w-6 h-6 rounded-elm-control transition-colors bg-transparent hover:bg-(--elm-control-hover,color-mix(in_oklab,var(--color-gray-200)_70%,transparent)) dark:hover:bg-(--elm-control-hover,var(--color-gray-800)) focus:outline-none focus-visible:ring-2 focus-visible:ring-elm-focus-ring disabled:cursor-not-allowed",zr="flex items-center justify-center w-12 h-12 backdrop-blur-md border border-elm-border/80 shadow-elm-control rounded-elm transition-colors active:scale-[0.95] focus:outline-none focus-visible:ring-2 focus-visible:ring-elm-focus-ring disabled:cursor-not-allowed disabled:active:scale-100",Br="bg-elm-surface/95 hover:bg-elm-surface-hover disabled:hover:bg-elm-surface/95",at="disabled:text-elm-text-disabled",lt="text-primary-600 dark:text-primary-400",Kr="text-elm-text";function me({label:r,tooltipContent:t,shortcut:o,shortcutId:s,tooltipSide:n="top",onClick:f,active:a,expanded:p,controls:u,disabled:b,size:h="md",children:x}){const S=Q.useElementEditorConfig().ui.keyboardShortcuts.enabled?o:void 0;return e.jsx(D.Tooltip,{content:t??r,shortcut:S,side:n,children:e.jsx("button",{"aria-label":r,"data-elm-shortcut":s,"aria-pressed":p===void 0?a:void 0,"aria-expanded":p,"aria-controls":u,onClick:k=>{f(),k.detail>0&&k.currentTarget.blur()},disabled:b,className:h==="group"?`${Rr} ${a?lt:Ar} ${at}`:`${h==="sm"?Lr:`${zr} ${Br}`} ${a?lt:Kr} ${at}`,children:i.isValidElement(x)&&typeof x.type!="string"?i.cloneElement(x,{...a?{weight:"fill"}:{},...h==="sm"?{size:16}:{}}):x})})}const Or=i.memo(function({footer:t}){const{dataStore:o}=d.useGeoStore(),s=d.useEmit(),n=d.useUIStore(L=>L.sidebarOpen),f=d.useUIStore(L=>L.setSidebarOpen),a=d.useUIStore(L=>L.setSidebarWidth),p=d.useUIStore(L=>L.codeDockWidth),u=d.useUIStore(L=>L.readonly),b=d.useUIStore(L=>L.layout),{width:h,onHandleMouseDown:x}=Tt("elm_panel_width",288,200,520),m=b==="split",S=i.useRef(null);Fe(S);const k=d.useUIStore(L=>L.narrow)&&!m,[M,E]=i.useState(!1),l=i.useRef(!1);i.useEffect(()=>{const L=requestAnimationFrame(()=>{l.current=!0});return()=>cancelAnimationFrame(L)},[]),i.useLayoutEffect(()=>{k&&(l.current||E(!0),f(!1))},[k,f]),i.useEffect(()=>{if(!M)return;const L=requestAnimationFrame(()=>E(!1));return()=>cancelAnimationFrame(L)},[M]);const{getKey:g}=fe(),c=e.jsx(D.KbdDark,{children:g("toggle-sidebar").toUpperCase()}),[I,y]=i.useState(null),C=i.useCallback(L=>y(L),[]);i.useLayoutEffect(()=>{a(h)},[h,a]);const N=d.useUIStore(L=>L.dialogState),A=N.type!=="closed",B=d.useDataStore(L=>L.features),v=d.useDataStore(L=>L.selectedIds),j=d.useDataStore(L=>L.deleteSelection),P=d.useDataStore(L=>L.clearSelection),z=d.useUIStore(L=>L.autoFocusGroupId),K=d.useUIStore(L=>L.setAutoFocusGroupId);i.useEffect(()=>{z&&K(null)},[z,K]);function _(){const L=crypto.randomUUID();o.setState(w=>({groups:[...w.groups,{id:L,name:"New group",collapsed:!1}],lastModifiedAt:Date.now()})),K(L)}const J=N.type==="edit"?`edit-${N.featureId}`:N.type;return e.jsx(e.Fragment,{children:e.jsxs("aside",{ref:S,"data-elm-layers-panel":"",className:m?"h-full w-full":k?`absolute top-0 h-full z-[600] ${n?"shadow-elm-raised":""}`:"absolute top-0 h-full z-10",style:m?void 0:k?{width:`min(${h}px, 100% - 48px)`,right:n?0:`calc(-1 * min(${h}px, 100% - 48px))`,transition:M?"none":"right 200ms ease"}:{width:h,right:n?0:-h,transition:M?"none":"right 200ms ease"},children:[!m&&!n&&e.jsx("div",{className:"absolute z-30",style:{left:-64-p,top:16},children:e.jsx(me,{label:"Open layers panel",shortcutId:"toggle-sidebar",tooltipContent:"Show layers",shortcut:c,tooltipSide:"bottom",onClick:()=>f(!0),children:e.jsx(F.SidebarSimple,{size:24})})}),e.jsxs("div",{inert:!m&&!n,className:`h-full flex flex-col overflow-hidden bg-elm-surface ${m?"":"border-l border-elm-border/80"}`,children:[!m&&e.jsx("div",{onMouseDown:x,className:Ut,title:"Drag to resize panel"}),A&&v.length<2?e.jsx(It,{dialogState:N,collapsible:!0},J):e.jsxs(e.Fragment,{children:[e.jsx("header",{className:`${jt} px-3`,children:e.jsxs("div",{className:"flex items-center justify-between h-6 w-full",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(Et,{}),e.jsx("span",{className:"text-xs font-medium text-elm-text-secondary",children:"Layers"})]}),e.jsx("div",{className:"flex items-center gap-0.5",children:!u&&e.jsx(D.Tooltip,{content:"New group",side:"bottom",children:e.jsx("button",{type:"button",onClick:_,disabled:B.length===0,className:`flex ${ge}`,"aria-label":"New group",children:e.jsx(F.FolderPlus,{size:16})})})})]})}),e.jsx("div",{ref:C,className:"flex-1 overflow-y-auto min-h-0",children:e.jsx("div",{className:"px-3 py-3 flex flex-col gap-3 h-full",children:e.jsx(i.Suspense,{fallback:B.length===0?e.jsx("div",{className:"h-full",children:e.jsx(gt,{})}):null,children:e.jsx(Ue,{autoFocusGroupId:z,scrollElement:I})})})}),v.length>=2&&e.jsxs("div",{className:"flex items-center gap-2 px-3 py-2 bg-elm-surface-sunken border-t border-elm-border flex-shrink-0",children:[e.jsxs("span",{className:"text-xs text-elm-text-secondary font-medium flex-1",children:[v.length," selected"]}),e.jsx("button",{onClick:P,className:"text-xs text-elm-text-secondary px-2 py-1 rounded-elm-control hover:bg-(--elm-surface-hover,var(--color-gray-200)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-700)) transition-colors",children:"Clear"}),!u&&e.jsx("button",{onClick:()=>{const L=v.length;j(),s({type:"features:deleted",count:L,undo:()=>o.getState().undo()})},className:"text-xs text-elm-text-secondary px-2 py-1 rounded-elm-control hover:bg-(--elm-surface-hover,var(--color-gray-200)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-700)) transition-colors",children:"Delete all"})]})]}),t&&e.jsx("div",{className:"flex-shrink-0 border-t border-elm-border",children:t})]})]})})});function Re({type:r,size:t=20}){return r==="Point"||r==="MultiPoint"?e.jsx(F.MapPin,{size:t}):r==="Polygon"||r==="MultiPolygon"?e.jsx(F.Polygon,{size:t,weight:"fill"}):r==="GeometryCollection"?e.jsx(F.StackSimple,{size:t}):e.jsx(F.LineSegment,{size:t,weight:"bold"})}function Ft(r){switch(r){case"Point":return"Point";case"MultiPoint":return"Points";case"LineString":return"Line";case"MultiLineString":return"Lines";case"Polygon":return"Area";case"MultiPolygon":return"Areas";case"GeometryCollection":return"Mixed";default:return r}}function Rt({initialLabel:r,onCommit:t,autoFocus:o,activate:s,onEnd:n,onTab:f,disabled:a}){const[p,u]=i.useState(()=>!a&&(!!o||!!s)),[b,h]=i.useState(r),x=i.useRef(null);i.useEffect(()=>{s&&!p&&!a&&(h(r),u(!0))},[s]),i.useEffect(()=>{var l,g;p&&((l=x.current)==null||l.focus(),(g=x.current)==null||g.select())},[p]);function m(l){a||(h(l),u(!0))}function S(){const l=b.trim();l&&l!==r&&t(l),u(!1),n==null||n()}function k(){h(r),u(!1),n==null||n()}function M(l){if(l.key==="Enter"){l.preventDefault(),l.nativeEvent.stopImmediatePropagation(),S();return}if(l.key==="Escape"){l.nativeEvent.stopImmediatePropagation(),k();return}if(l.key==="Tab"&&f){l.preventDefault(),l.nativeEvent.stopImmediatePropagation();const g=b.trim();g&&g!==r&&t(g),u(!1),f(l.shiftKey?"prev":"next")}}return{isRenaming:p,startRenaming:m,inputProps:{ref:x,value:b,onChange:l=>h(l.target.value),onBlur:S,onKeyDown:M,onClick:l=>l.stopPropagation()}}}function At(r){const t=r.properties.name;return typeof t=="string"&&t.trim()?t:Ft(r.geometry.type)}const $r=i.memo(function({feature:t,isSelected:o,onRowClick:s,onRowSelectOnly:n,onRowJump:f,onEdit:a,onToggleHidden:p,containerProps:u,dragHandleProps:b,isDragging:h,innerRef:x,isMultiSelected:m,onMultiSelectToggle:S,onRangeSelect:k,isContextMenuActive:M,dragCountBadge:E,isGhosted:l,onRename:g,renameActive:c,onRenameEnd:I,onRenameTab:y,joinTop:C,joinBottom:N}){const A=i.useRef(null),B=At(t),v=d.useUIStore(R=>R.readonly),{isRenaming:j,startRenaming:P,inputProps:z}=Rt({initialLabel:B,disabled:v,onCommit:R=>g==null?void 0:g(t.id,R),activate:c,onEnd:I,onTab:y}),K=i.useRef(null);i.useEffect(()=>()=>{K.current!==null&&clearTimeout(K.current)},[]);const _=typeof t.properties.imageUrl=="string"&&t.properties.imageUrl?t.properties.imageUrl:null,[J,L]=i.useState(!1);i.useEffect(()=>{if(L(!1),!_)return;const R=new Image;let T=!1;return R.onload=()=>{T||L(!0)},R.onerror=()=>{},R.src=_,()=>{T=!0,R.onload=null,R.onerror=null}},[_]);const w=_!==null&&J,{style:O,...q}=u??{};return e.jsx("li",{ref:R=>{A.current=R,x==null||x(R)},...q,...b,style:{listStyle:"none",opacity:l?.4:void 0,outline:"none",...O},children:e.jsxs("div",{"data-feature-id":t.id,className:te.clsx("group flex items-center gap-2 px-2 h-9 rounded-elm-control text-sm cursor-default",!h&&C&&"rounded-t-none",!h&&N&&"rounded-b-none",h?"cursor-grabbing shadow-elm-control bg-elm-surface-raised":m||o?"bg-(--elm-row-selected) hover:bg-(--elm-row-selected-hover) text-primary-700 dark:text-primary-300":t.hidden?te.clsx("text-elm-text-disabled",M?"bg-(--elm-row-hover)":"hover:bg-(--elm-row-hover)"):M?"bg-(--elm-row-hover) text-elm-text-secondary":"hover:bg-(--elm-row-hover) text-elm-text-secondary"),onClick:R=>{if(R.metaKey||R.ctrlKey){R.stopPropagation(),S==null||S(t.id);return}if(R.shiftKey){R.stopPropagation(),k==null||k(t.id);return}s(t.id)},children:[w?e.jsx("img",{src:_,alt:"",className:"w-5 h-5 rounded-elm-chip object-cover flex-shrink-0 border border-(--elm-border,var(--color-gray-200))"}):e.jsx("span",{className:te.clsx("flex-shrink-0",o||m?"text-primary-700 dark:text-primary-300":t.hidden?"text-elm-text-disabled":"text-(--elm-text-subtle,var(--color-gray-400))"),children:e.jsx(Re,{type:t.geometry.type})}),j?e.jsx("input",{...z,className:"flex-1 min-w-0 bg-elm-surface outline-none text-sm font-normal text-elm-text-secondary border border-primary-400 rounded-elm-control px-1.5 py-0.5 leading-snug"}):e.jsx("span",{className:"flex-1 min-w-0 font-normal truncate leading-snug border border-transparent rounded-elm-control px-1.5 py-0.5",onClick:R=>{R.metaKey||R.ctrlKey||R.shiftKey||!n||!f||(R.stopPropagation(),n(t.id),K.current!==null&&(clearTimeout(K.current),K.current=null),!(R.detail>=2)&&(K.current=window.setTimeout(()=>{f(t.id),K.current=null},300)))},onDoubleClick:R=>{R.stopPropagation(),K.current!==null&&(clearTimeout(K.current),K.current=null),P(B)},children:B}),!j&&E&&E>1&&e.jsx("span",{className:"flex-shrink-0 bg-primary-500 text-white text-xs font-bold px-1.5 py-0.5 rounded-full min-w-[1.25rem] text-center leading-none",children:E}),!j&&e.jsxs("div",{className:"flex items-center gap-0.5 flex-shrink-0",children:[e.jsx("button",{onClick:R=>{R.stopPropagation(),a(t.id)},className:"text-elm-text hover:bg-(--elm-surface-hover,var(--color-gray-100)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-700)) p-1 rounded-elm-control opacity-0 group-hover:opacity-100","aria-label":"Edit",children:e.jsx(F.PencilSimple,{size:16})}),e.jsx("button",{onClick:R=>{R.stopPropagation(),p(t.id)},className:te.clsx("text-elm-text hover:bg-(--elm-surface-hover,var(--color-gray-100)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-700)) p-1 rounded-elm-control",t.hidden?"":"opacity-0 group-hover:opacity-100"),"aria-label":"Toggle visibility",children:t.hidden?e.jsx(F.EyeClosed,{size:16}):e.jsx(F.Eye,{size:16})})]})]})})});function Gr({group:r,featureCount:t,autoFocus:o,isSelected:s,onToggleCollapse:n,onToggleHidden:f,onRename:a,onDelete:p,onSelect:u,innerRef:b,dragHandleProps:h,containerProps:x,isDragging:m}){const S=d.useUIStore(A=>A.readonly),{isRenaming:k,startRenaming:M,inputProps:E}=Rt({initialLabel:r.name,disabled:S,onCommit:a,autoFocus:o}),[l,g]=i.useState(null),c=i.useRef(null);function I(A){A.stopPropagation();const B=c.current;if(B){const v=B.getBoundingClientRect();g({x:v.right,y:v.bottom+4})}}const y=i.useRef(null);i.useEffect(()=>()=>{y.current!==null&&clearTimeout(y.current)},[]);const C={label:r.hidden?"Show on map":"Hide from map",icon:r.hidden?e.jsx(F.Eye,{size:16}):e.jsx(F.EyeClosed,{size:16}),onClick:()=>f()},N=S?[C]:[C,{label:"Rename",icon:e.jsx(F.Pencil,{size:16}),onClick:()=>M(r.name)},{separator:!0},{label:"Ungroup",icon:e.jsx(F.FolderMinus,{size:16}),onClick:()=>p("ungroup")},{label:"Delete group",icon:e.jsx(F.Trash,{size:16}),onClick:()=>p("delete-features")}];return e.jsxs(e.Fragment,{children:[l&&e.jsx(D.ContextMenu,{x:l.x,y:l.y,onClose:()=>g(null),items:N}),e.jsxs("div",{ref:b,...x,...h,className:te.clsx("group flex items-center gap-2 px-2 py-1.5 rounded-elm-control text-sm font-medium cursor-default",m?"shadow-elm-control bg-elm-surface-raised":s?"bg-(--elm-row-selected) hover:bg-(--elm-row-selected-hover) text-primary-700 dark:text-primary-300":r.hidden?"text-elm-text-disabled hover:bg-(--elm-row-hover)":"text-elm-text-secondary hover:bg-(--elm-row-hover)"),style:{outline:"none",cursor:m?"grabbing":"default",...x==null?void 0:x.style},onClick:()=>{u&&u()},onContextMenu:A=>{A.preventDefault(),g({x:A.clientX,y:A.clientY})},children:[e.jsx("span",{className:te.clsx("flex-shrink-0 cursor-pointer",r.hidden?"text-elm-text-disabled":"text-elm-text-muted"),onClick:A=>{A.stopPropagation(),n()},"aria-label":r.collapsed?"Expand group":"Collapse group",children:r.collapsed?e.jsx(F.Folder,{size:20,weight:"fill"}):e.jsx(F.FolderOpen,{size:20,weight:"fill"})}),k?e.jsx("input",{...E,className:"flex-1 min-w-0 bg-elm-surface outline-none text-sm font-medium text-elm-text-secondary border border-primary-400 rounded-elm-control px-1.5 py-0.5 leading-snug"}):e.jsx("span",{className:"flex-1 min-w-0 truncate cursor-default leading-snug border border-transparent rounded-elm-control px-1.5 py-0.5",onClick:A=>{A.stopPropagation(),!(!u||A.metaKey||A.ctrlKey||A.shiftKey)&&(y.current!==null&&(clearTimeout(y.current),y.current=null),!(A.detail>=2)&&(y.current=window.setTimeout(()=>{u(),y.current=null},300)))},onDoubleClick:A=>{A.stopPropagation(),y.current!==null&&(clearTimeout(y.current),y.current=null),M(r.name)},children:r.name}),!k&&e.jsxs("div",{className:"ml-auto flex items-center gap-1 flex-shrink-0",children:[r.hidden&&e.jsx("button",{onClick:A=>{A.stopPropagation(),f()},className:"text-elm-text p-1 rounded-elm-control hover:bg-(--elm-surface-hover,var(--color-gray-100)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-700))","aria-label":"Show on map",children:e.jsx(F.EyeClosed,{size:16})}),e.jsx("div",{className:"opacity-0 group-hover:opacity-100",children:e.jsx(D.Tooltip,{content:"More options",children:e.jsx("button",{ref:c,onClick:I,className:"text-elm-text p-1 rounded-elm-control hover:bg-(--elm-surface-hover,var(--color-gray-100)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-700))","aria-label":"More options",children:e.jsx(F.DotsThree,{size:16,weight:"bold"})})})}),e.jsx("span",{className:te.clsx("font-normal w-7 text-right text-sm",r.hidden?"text-elm-text-disabled":"text-elm-text-subtle"),children:t})]})]})]})}function Wr({geometry:r,partIndex:t,isSelected:o,onClick:s}){const n=$.getPartGeometry(r,t),f=$.getPartLabel(r,t);return e.jsx("li",{style:{listStyle:"none"},className:"ml-5",children:e.jsxs("div",{className:te.clsx("flex items-center gap-2 px-2 h-9 rounded-elm-control text-sm cursor-default",o?"bg-(--elm-row-selected) hover:bg-(--elm-row-selected-hover) text-primary-700 dark:text-primary-300":"text-elm-text-muted hover:bg-(--elm-row-hover)"),onClick:a=>{a.stopPropagation(),s()},children:[e.jsx("span",{className:te.clsx("flex-shrink-0",o?"text-primary-700 dark:text-primary-300":"text-(--elm-text-subtle,var(--color-gray-400))"),children:e.jsx(Re,{type:n.type})}),e.jsx("span",{className:"flex-1 min-w-0 font-normal truncate leading-snug border border-transparent rounded-elm-control px-1.5 py-0.5",children:f})]})})}const Lt="elm_code_docked";function zt(){const r=Q.useElementEditorConfig(),[t]=i.useState(()=>Z.readStorage(Lt,r)!=="0");return t}function Bt(r){const t=Q.useElementEditorConfig(),o=d.useUIStore(h=>h.layout),s=d.useUIStore($.sidebarTakesSpace),n=d.useUIStore(h=>h.sidebarWidth),f=d.useUIStore(h=>h.tableFullscreen),a=d.useUIStore(h=>h.setCodeDockWidth),p=d.useUIStore(h=>h.narrow),u=Tt("elm_code_dock_width",420,280,900);i.useLayoutEffect(()=>{if(r)return st(()=>a(p?0:u.width)),()=>st(()=>a(0))},[r,p,u.width,a]);const b=t.ui.layerList&&s;return{...u,className:`absolute top-0 ${p?"z-[600] shadow-elm-raised":"z-10"} flex flex-col bg-elm-surface border-l border-elm-border/80 overflow-hidden ${f?"hidden":""}`,style:{right:b?n:0,bottom:o==="split"?"33.33%":0,width:p?`min(${u.width}px, 100%)`:u.width,transition:"right 200ms ease"}}}function _r(){const r=zt(),t=Bt(r),o=i.useRef(null);return Fe(o,r),r?e.jsx("div",{ref:o,"aria-hidden":"true",className:t.className,style:t.style}):null}function qr(){const[r,t]=i.useState(""),[o,s]=i.useState(!1),[n,f]=i.useState(!1),[a,p]=i.useState(-1),u=i.useRef(null),b=i.useRef(null),{results:h,loading:x,error:m,flush:S}=d.useNominatim(r),k=i.useRef(!1),{flyTo:M,fitBounds:E}=d.useMapController(),{dataStore:l}=d.useGeoStore(),g=ce();i.useEffect(()=>{s(r.trim().length>=2),p(-1)},[r,h]),i.useEffect(()=>{k.current=!1},[r]),i.useEffect(()=>{!k.current||x||(k.current=!1,h.length&&N(0))},[h,x]),i.useEffect(()=>{function v(j){u.current&&!u.current.contains(j.target)&&s(!1)}return document.addEventListener("mousedown",v),()=>document.removeEventListener("mousedown",v)},[]),i.useEffect(()=>{function v(j){var P,z;if(g(j)){if(j.key==="f"&&(j.metaKey||j.ctrlKey)&&!Kt(j)){j.preventDefault(),(P=b.current)==null||P.focus();return}j.key==="Escape"&&(o||document.activeElement===b.current)&&(j.stopPropagation(),t(""),s(!1),p(-1),(z=b.current)==null||z.blur())}}return window.addEventListener("keydown",v,{capture:!0}),()=>window.removeEventListener("keydown",v,{capture:!0})},[o,g]);function c(v){M==null||M([parseFloat(v.lat),parseFloat(v.lon)],15)}function I(v){const j=parseFloat(v.lat),P=parseFloat(v.lon),z=l.getState().getDefaultSchema(),K={};for(const J of z.fields)K[J.key]=J.key==="name"?v.display_name.split(",")[0].trim():"";const _={type:"Feature",id:crypto.randomUUID(),schemaId:z.id,geometry:{type:"Point",coordinates:[P,j]},properties:K};l.getState().addFeature(_),M==null||M([j,P],15),C()}function y(v){const j=v.geojson;if(!j||j.type==="Point")return;let P;j.type==="MultiPolygon"?P={type:"Polygon",coordinates:j.coordinates.reduce((J,L)=>L[0].length>J[0].length?L:J)}:P=j;const z={type:"Feature",id:crypto.randomUUID(),schemaId:$.BOUNDARIES_SCHEMA_ID,geometry:P,properties:{name:v.display_name.split(",")[0].trim()}};l.getState().addFeature(z),E==null||E(Z.getGeometryBBox(P)),C()}function C(){t(""),s(!1),p(-1)}function N(v){p(v),c(h[v]),requestAnimationFrame(()=>{var j;return(j=b.current)==null?void 0:j.focus()})}function A(v){if(v.key==="Enter"){if(r.trim().length<2)return;if(v.preventDefault(),h.length&&!x){N(a>=0?a:0);return}k.current=!0,s(!0),S();return}h.length&&(v.key==="ArrowDown"?(v.preventDefault(),p(j=>(j+1)%h.length)):v.key==="ArrowUp"&&(v.preventDefault(),p(j=>j<=0?h.length-1:j-1)))}const B=o&&r.trim().length>=2;return{query:r,setQuery:t,setOpen:s,showDropdown:B,containerRef:u,inputRef:b,focused:n,setFocused:f,results:h,loading:x,error:m,flyToResult:c,handleAdd:I,handleAddShape:y,clear:C,activeIndex:a,setActiveIndex:p,handleInputKeyDown:A}}function Kt(r){var t,o;return((o=(t=r.target)==null?void 0:t.closest)==null?void 0:o.call(t,".cm-editor"))!=null}const Hr=208,Vr={"top-left":{style:{top:16,left:16},className:"flex-col items-start"},"top-center":{style:{top:16,left:0,right:0},className:"flex-col items-center"},"top-right":{style:{top:16,right:16},className:"flex-col items-end"},"left-center":{style:{left:16,top:"50%",transform:"translateY(-50%)"},className:"flex-col items-start"},"right-center":{style:{right:16,top:"50%",transform:"translateY(-50%)"},className:"flex-col items-end"},"bottom-left":{style:{bottom:16,left:16},className:"flex-col-reverse items-start"},"bottom-center":{style:{bottom:16,left:0,right:0},className:"flex-col-reverse items-center"},"bottom-right":{style:{bottom:16,right:16},className:"flex-col-reverse items-end"}};function Jr({embedded:r}={}){const t=d.useDataStore(U=>U.features.length),o=d.useDataStore(U=>U.maxFeatures),s=o!=null&&t>=o,n=d.useEmit(),f=Q.useElementEditorConfig(),{toolbar:a}=f,p=a.direction==="vertical",u=Vr[a.position],b=d.useUIStore($.sidebarTakesSpace),h=d.useUIStore(U=>U.sidebarWidth),x=d.useUIStore(U=>U.codeDockWidth),m=d.useUIStore(U=>U.layout),S=f.ui.layerList&&b,k=a.position.startsWith("bottom"),M=a.position==="left-center"||a.position==="right-center",E=m==="split"&&k,l=m==="split"&&M,g=(()=>{let U=u.style;const V=a.position.endsWith("-right")||a.position.startsWith("right");return S?V&&(U={...U,right:h+16+x}):f.ui.layerList&&m==="panel"&&a.position==="top-right"?U={...U,right:72+x}:V&&x&&(U={...U,right:16+x}),E?U={...U,bottom:"calc(33.33% + 16px)"}:k&&(U={...U,bottom:"calc(var(--elm-table-offset, 0px) + 16px)"}),l&&(U={...U,top:"33.33%"}),U===u.style?u:{...u,style:U}})(),c=d.useUIStore(U=>U.editingMode),I=d.useUIStore(U=>U.enabledTools),y=d.useUIStore(U=>U.unavailableTools),C=d.useUIStore(U=>U.readonly),N=d.useUIStore(U=>U.setEditingMode);function A(U){if(s&&U!=="none"){n({type:"error",code:"limit-reached",source:"editor",message:$.featureLimitMessage(o)});return}N(U)}const{getKey:B}=fe(),{query:v,setQuery:j,setOpen:P,showDropdown:z,containerRef:K,inputRef:_,focused:J,setFocused:L,results:w,loading:O,error:q,flyToResult:R,handleAdd:T,handleAddShape:G,clear:W,activeIndex:H,setActiveIndex:X,handleInputKeyDown:ee}=qr(),ue=i.useRef(null),xe=i.useRef(null);i.useEffect(()=>{var ne;if(r||!k)return;const U=(ne=xe.current)==null?void 0:ne.closest("[data-elm-theme]");if(!U)return;const V=()=>{var pe;const de=((pe=xe.current)==null?void 0:pe.offsetHeight)??0;U.style.setProperty("--elm-bottom-toolbar-offset",`${de+8}px`)};V();const Y=new ResizeObserver(V);return xe.current&&Y.observe(xe.current),()=>{Y.disconnect(),U.style.setProperty("--elm-bottom-toolbar-offset","0px")}},[r,k]);const[be,ae]=i.useState(!1),Ke=i.useRef(null),Oe=i.useRef(null),[Qt,$e]=i.useState(!1),Ge=i.useRef(null);i.useLayoutEffect(()=>{var Ze,Ye;const U=Ge.current;if(p||!U){$e(!1);return}const V=((Ze=K.current)==null?void 0:Ze.closest('[data-elm-edge="top"], [data-elm-edge="bottom"]'))??null,Y=V??((Ye=K.current)==null?void 0:Ye.offsetParent);if(!Y)return;const ne=ve=>ve.flatMap(ie=>getComputedStyle(ie).display==="contents"?ne([...ie.children]):[ie.offsetWidth]),de=()=>{const ve=ne([...U.children]).filter(Ne=>Ne>0),ie=getComputedStyle(U),rr=parseFloat(ie.paddingLeft)+parseFloat(ie.paddingRight)+parseFloat(ie.borderLeftWidth)+parseFloat(ie.borderRightWidth);let Qe=ve.reduce((Ne,or)=>Ne+or,0)+8*Math.max(0,ve.length-1)+rr;const et=U.querySelector("[data-elm-search-toggle]");et&&(Qe+=Hr-et.offsetWidth);const tt=V?V.clientWidth-(parseFloat(V.dataset.elmClearance??"")||0):Y.clientWidth-32;$e(tt>0&&Qe>tt+.5)};de();const pe=new ResizeObserver(()=>de());return pe.observe(Y),pe.observe(U),()=>pe.disconnect()},[p,K]);const le=p||Qt,We=i.useRef(le);We.current=le,i.useEffect(()=>{le||ae(!1)},[le]);const _e=i.useRef(null),qe=ce();function He(){const U=_e.current;U&&(U.style.animation="none",U.offsetWidth,U.style.animation="press-pulse 200ms ease-out")}i.useEffect(()=>{function U(V){V.key==="f"&&(V.metaKey||V.ctrlKey)&&qe(V)&&!Kt(V)&&(We.current?ae(!0):He())}return window.addEventListener("keydown",U),()=>window.removeEventListener("keydown",U)},[qe]);const er=a.position.startsWith("right")||a.position.endsWith("-right")?"left":"right";i.useEffect(()=>{if(!be)return;requestAnimationFrame(()=>{var Y;return(Y=_.current)==null?void 0:Y.focus()});function U(Y){var ne,de;!((ne=Ke.current)!=null&&ne.contains(Y.target))&&!((de=Oe.current)!=null&&de.contains(Y.target))&&ae(!1)}function V(Y){Y.key==="Escape"&&ae(!1)}return document.addEventListener("mousedown",U),document.addEventListener("keydown",V),()=>{document.removeEventListener("mousedown",U),document.removeEventListener("keydown",V)}},[be,_]);const we=c==="place-point",Se=c==="draw-line",ke=c==="draw-polygon",je=c==="draw-circle",Ee=c==="draw-rect",Ce=c==="draw-route",Ie=c==="draw-freehand",De=c==="pick-shape",Ve=c==="measure",re=U=>(!I||I.includes(U))&&!y.includes(U),tr=null;function Je(U){var V;if(U.key==="Tab"&&H>=0){U.preventDefault(),(V=ue.current)==null||V.focusAdd(H);return}ee(U)}function Xe(U,V){var ne;const Y=((V+U)%w.length+w.length)%w.length;X(Y),(ne=ue.current)==null||ne.focusAdd(Y)}return e.jsxs("div",{ref:K,"data-elm-search-open":z?"true":void 0,className:r?"select-none":te.clsx("absolute z-[500] flex gap-2 pointer-events-none select-none",g.className),style:r?void 0:g.style,children:[e.jsxs("div",{ref:xe,className:"relative w-fit max-w-full",children:[z&&!le&&e.jsx(D.SearchDropdown,{ref:ue,results:w,loading:O,error:q,onGo:R,onAdd:C?void 0:T,onAddShape:C?void 0:G,activeIndex:H,onHoverIndex:X,onNavigate:Xe,layout:"row",className:`absolute left-0 right-0 bg-elm-surface border border-elm-border rounded-elm shadow-elm z-50 overflow-hidden pointer-events-auto ${k?"bottom-full mb-2":"top-full mt-2"}`}),e.jsxs("div",{ref:Ge,className:te.clsx("flex gap-2 bg-elm-surface/95 backdrop-blur-md border border-(--elm-border,color-mix(in_oklab,var(--color-black)_10%,transparent)) dark:border-(--elm-border,color-mix(in_oklab,var(--color-white)_10%,transparent)) shadow-elm rounded-elm pointer-events-auto antialiased",p?"flex-col items-center p-[7px]":"flex-row flex-wrap justify-center items-center p-[7px]"),children:[C?null:e.jsxs(e.Fragment,{children:[re("point")&&e.jsx(D.ToolButton,{active:we,disabled:!we&&s,onClick:()=>A(we?"none":"place-point"),label:"Point",shortcut:B("place-point").toUpperCase(),shortcutId:"place-point",children:e.jsx(F.MapPin,{size:24})}),re("line")&&e.jsx(D.ToolButton,{active:Se,disabled:!Se&&s,onClick:()=>A(Se?"none":"draw-line"),label:"Line",shortcut:B("draw-line").toUpperCase(),shortcutId:"draw-line",children:e.jsx(F.LineSegment,{size:24})}),re("polygon")&&e.jsx(D.ToolButton,{active:ke,disabled:!ke&&s,onClick:()=>A(ke?"none":"draw-polygon"),label:"Area",shortcut:B("draw-polygon").toUpperCase(),shortcutId:"draw-polygon",children:e.jsx(F.Polygon,{size:24})}),re("route")&&e.jsx(D.ToolButton,{active:Ce,disabled:!Ce&&s,onClick:()=>A(Ce?"none":"draw-route"),label:"Route",shortcut:B("draw-route").toUpperCase(),shortcutId:"draw-route",children:e.jsx(F.Path,{size:24})}),re("circle")&&e.jsx(D.ToolButton,{active:je,disabled:!je&&s,onClick:()=>A(je?"none":"draw-circle"),label:"Circle",shortcut:B("draw-circle").toUpperCase(),shortcutId:"draw-circle",children:e.jsx(F.Circle,{size:24})}),re("rectangle")&&e.jsx(D.ToolButton,{active:Ee,disabled:!Ee&&s,onClick:()=>A(Ee?"none":"draw-rect"),label:"Rectangle",shortcut:B("draw-rect").toUpperCase(),shortcutId:"draw-rect",children:e.jsx(F.Rectangle,{size:24})}),re("freehand")&&e.jsx(D.ToolButton,{active:Ie,disabled:!Ie&&s,onClick:()=>A(Ie?"none":"draw-freehand"),label:"Freehand",shortcut:B("draw-freehand").toUpperCase(),shortcutId:"draw-freehand",children:e.jsx(F.ScribbleLoop,{size:24})}),re("picker")&&e.jsx(D.ToolButton,{active:De,disabled:!De&&s,onClick:()=>A(De?"none":"pick-shape"),label:"Picker",shortcut:B("picker").toUpperCase(),shortcutId:"picker",children:e.jsx(F.HandTap,{size:24})})]}),re("measure")&&e.jsxs(e.Fragment,{children:[!C&&e.jsx(D.ToolbarDivider$1,{vertical:p}),e.jsx(D.ToolButton,{active:Ve,onClick:()=>N(Ve?"none":"measure"),label:"Measure",shortcut:B("measure").toUpperCase(),shortcutId:"measure",children:e.jsx(F.Ruler,{size:24})}),le&&re("search")&&e.jsx(D.ToolbarDivider$1,{vertical:p})]}),re("search")&&!le&&e.jsxs("div",{className:"flex items-center gap-2 pl-2.5 pr-3 py-1.5 bg-(--elm-surface-sunken,var(--color-gray-100)) dark:bg-(--elm-surface-sunken,color-mix(in_oklab,var(--color-white)_7%,transparent)) hover:bg-(--elm-control-hover,color-mix(in_oklab,var(--color-gray-200)_70%,transparent)) dark:hover:bg-(--elm-control-hover,color-mix(in_oklab,var(--color-white)_10%,transparent)) rounded-elm-control transition-colors w-52 focus-within:ring-1 focus-within:ring-inset focus-within:ring-(--elm-border-strong,var(--color-gray-300)) dark:focus-within:ring-(--elm-border-strong,var(--color-gray-600))",children:[e.jsxs("div",{ref:_e,className:"flex items-center gap-2 flex-1 min-w-0",children:[e.jsx(F.MagnifyingGlass,{size:14,className:"text-elm-text-subtle flex-shrink-0"}),e.jsx("input",{ref:_,type:"text",value:v,onChange:U=>j(U.target.value),onFocus:()=>{L(!0),He(),v.trim().length>=2&&P(!0)},onBlur:()=>L(!1),onKeyDown:Je,placeholder:"Search places…",className:"bg-transparent text-sm text-elm-text-secondary placeholder-elm-text-muted outline-none w-full",autoComplete:"off"}),O&&e.jsx("div",{className:"w-3 h-3 border-2 border-(--elm-border-strong,var(--color-gray-300)) border-t-primary-500 rounded-full animate-spin flex-shrink-0"}),!O&&v&&e.jsx("button",{onClick:W,className:"p-1 -m-1 rounded-elm-chip text-elm-text hover:bg-(--elm-control-hover,var(--color-gray-200)) dark:hover:bg-(--elm-control-hover,color-mix(in_oklab,var(--color-white)_15%,transparent)) transition-colors flex-shrink-0","aria-label":"Clear search",children:e.jsx(F.X,{size:12})})]}),!O&&!v&&e.jsxs("span",{className:te.clsx("flex items-center gap-0.5 flex-shrink-0 transition-all duration-110 ease-out",J?"opacity-0 scale-75 pointer-events-none":"opacity-100 scale-100"),children:[e.jsx(D.Kbd,{children:"⌘"}),e.jsx(D.Kbd,{children:"F"})]})]}),re("search")&&le&&e.jsxs("div",{ref:Oe,"data-elm-search-toggle":"",className:p?"relative":void 0,children:[e.jsx(D.ToolButton,{active:be,onClick:()=>ae(U=>!U),label:"Search places",shortcut:"⌘F",children:e.jsx(F.MagnifyingGlass,{size:24})}),be&&e.jsxs("div",{ref:Ke,className:te.clsx("absolute z-50 bg-elm-surface/97 backdrop-blur-md border border-elm-border/80 shadow-elm rounded-elm pointer-events-auto antialiased flex flex-col",p?er==="right"?"top-0 w-80 left-full ml-2":"top-0 w-80 right-full mr-2":`left-0 right-0 min-w-0 ${k?"bottom-full mb-2":"top-full mt-2"}`),children:[e.jsxs("div",{className:"flex items-center gap-2 px-3 py-2",children:[e.jsx(F.MagnifyingGlass,{size:16,className:"text-elm-text-subtle flex-shrink-0"}),e.jsx("input",{ref:_,type:"text",value:v,onChange:U=>j(U.target.value),onFocus:()=>{L(!0),v.trim().length>=2&&P(!0)},onBlur:()=>L(!1),onKeyDown:Je,placeholder:"Search places…",className:"bg-transparent text-sm text-elm-text-secondary placeholder-elm-text-muted outline-none w-full",autoComplete:"off"}),O&&e.jsx("div",{className:"w-3 h-3 border-2 border-(--elm-border-strong,var(--color-gray-300)) border-t-primary-500 rounded-full animate-spin flex-shrink-0"}),!O&&v&&e.jsx("button",{onClick:W,className:"p-1 -m-1 rounded-elm-chip text-elm-text hover:bg-(--elm-control-hover,var(--color-gray-200)) dark:hover:bg-(--elm-control-hover,color-mix(in_oklab,var(--color-white)_15%,transparent)) transition-colors flex-shrink-0","aria-label":"Clear search",children:e.jsx(F.X,{size:12})})]}),z&&e.jsx(D.SearchDropdown,{ref:ue,results:w,loading:O,error:q,onGo:U=>{R(U),ae(!1)},onAdd:C?void 0:U=>{T(U),ae(!1)},onAddShape:C?void 0:U=>{G(U),ae(!1)},activeIndex:H,onHoverIndex:X,onNavigate:Xe,className:"border-t border-elm-border max-h-80 overflow-y-auto"})]})]})]})]}),!C&&tr]})}function it(r){const t=[],o=s=>{for(const n of Array.from(s.children)){if(getComputedStyle(n).display==="contents"){o(n);continue}const f=n.getBoundingClientRect();if(!f.width)continue;const a=f.top+f.height/2;t.some(p=>Math.abs(p-a)<8)||t.push(a)}};return o(r),t.length}function Xr(r,t){i.useLayoutEffect(()=>{const o=r.current;if(!o)return;const s=()=>{o.style.maxWidth="";const u=it(o);if(u<2)return;let b=0,h=o.offsetWidth;for(;h-b>1;){const x=b+h>>1;o.style.maxWidth=x+"px",it(o)>u||o.scrollWidth>o.clientWidth?b=x:h=x}o.style.maxWidth=h+"px"};s();const n=[];for(let u=o.parentElement;u&&n.length<8&&(n.push(u),!u.hasAttribute("data-elm-theme"));u=u.parentElement);const f=new WeakMap,a=()=>{for(const u of n)f.set(u,u.clientWidth)};a();const p=new ResizeObserver(u=>{u.every(b=>f.get(b.target)===b.target.clientWidth)||(s(),a())});for(const u of n)p.observe(u);return()=>{p.disconnect(),o.style.maxWidth=""}},[r,t])}const Zr=i.lazy(()=>Promise.resolve().then(()=>require("./BooleanOperations-C2uOHRu3.cjs")));function Yr(){const{dataStore:r}=d.useGeoStore(),t=d.useUIStore(j=>j.readonly),o=d.useUIStore(j=>j.transformActive),s=d.useUIStore(j=>j.setTransformActive),n=d.useUIStore(j=>j.editingMode),f=d.useUIStore(j=>j.setEditingMode),a=d.useDataStore(j=>j.selectedIds),p=a.length===1?a[0]:null,u=d.useUIStore(j=>j.closeDialog),{getKey:b}=fe(),h=d.useEmit(),x=d.useDataStore(j=>{if(!p)return null;const P=j.features.find(z=>z.id===p);return(P==null?void 0:P.geometry.type)??null}),m=i.useRef(null);if(Xr(m,`${t}|${a.length}|${x}`),t)return null;const S=p!==null||a.length>0,k=x==="Polygon"||x==="MultiPolygon",M=x==="MultiPoint"||x==="MultiPolygon"||x==="MultiLineString"||x==="GeometryCollection",E=a.length===1&&x==="Point",l=S&&!E,g=k,c=$.canProcessShape(x),I=M,y=a.length>=2,C=I||y;function N(){if(a.length!==0&&r.getState().duplicateSelection())if(a.length===1){const j=r.getState().features.find(P=>P.id===a[0]);h({type:"feature:duplicated",featureId:a[0],label:String((j==null?void 0:j.properties.name)||"feature")})}else h({type:"features:duplicated",count:a.length})}function A(){if(!p||!M)return;const j=r.getState().features.find(z=>z.id===p);if(!j)return;const P=$.getPartCount(j.geometry);r.getState().breakMultiGeometry(p)&&h({type:"feature:broken",featureId:p,count:P,undo:()=>r.getState().undo()})}function B(){a.length<2||(r.getState().mergeFeatures(),h({type:"success",message:`Merged ${a.length} features`}))}function v(){if(a.length===0)return;const j=a.length,P=j===1?r.getState().features.find(K=>K.id===a[0]):null,z=j===1?String((P==null?void 0:P.properties.name)||"Unnamed feature"):`${j} features`;r.getState().deleteSelection(),u(),h(j===1?{type:"feature:deleted",featureId:a[0],label:z,undo:()=>r.getState().undo()}:{type:"features:deleted",count:j,undo:()=>r.getState().undo()})}return e.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-3 max-w-full pointer-events-none",children:[S&&e.jsxs("div",{ref:m,className:"flex flex-wrap items-center justify-center gap-2 max-w-full bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 shadow-elm rounded-elm px-2 py-2 pointer-events-auto antialiased",children:[l&&e.jsx(D.EditToolbarBtn,{label:"Transform",shortcut:e.jsx(D.KbdDark,{children:b("toggle-transform").toUpperCase()}),shortcutId:"toggle-transform",onClick:()=>{s(!o),!o&&n!=="none"&&f("none")},active:o,children:e.jsx(F.Resize,{size:24})}),l&&(c||C)&&e.jsx(D.ToolbarDivider,{}),g&&e.jsxs(e.Fragment,{children:[e.jsx(D.EditToolbarBtn,{label:"Cut hole",shortcut:e.jsx(D.KbdDark,{children:b("cut-hole").toUpperCase()}),shortcutId:"cut-hole",onClick:()=>{f(n==="cut-hole"?"none":"cut-hole"),o&&s(!1)},active:n==="cut-hole",children:e.jsx(F.Scissors,{size:24})}),e.jsx(D.EditToolbarBtn,{label:"Slice shape",shortcut:e.jsx(D.KbdDark,{children:b("slice-shape").toUpperCase()}),shortcutId:"slice-shape",onClick:()=>{f(n==="slice-shape"?"none":"slice-shape"),o&&s(!1)},active:n==="slice-shape",children:e.jsx(F.Knife,{size:24})})]}),c&&e.jsxs(e.Fragment,{children:[e.jsx(D.EditToolbarBtn,{label:"Simplify shape",onClick:()=>{f(n==="simplify-shape"?"none":"simplify-shape"),o&&s(!1)},active:n==="simplify-shape",children:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:n==="simplify-shape"?1.5:1,strokeLinecap:"round",strokeLinejoin:"round",children:e.jsx("polyline",{points:"2.5,8 5.25,3.5 8,8 10.75,12.5 13.5,8"})})}),e.jsx(D.EditToolbarBtn,{label:"Smooth shape",onClick:()=>{f(n==="smooth-shape"?"none":"smooth-shape"),o&&s(!1)},active:n==="smooth-shape",children:e.jsx(F.WaveSine,{size:24})}),e.jsx(D.EditToolbarBtn,{label:"Buffer",onClick:()=>{f(n==="buffer-shape"?"none":"buffer-shape"),o&&s(!1)},active:n==="buffer-shape",children:e.jsx(F.SquareLogo,{size:24})})]}),c&&C&&e.jsx(D.ToolbarDivider,{}),I&&e.jsx(D.EditToolbarBtn,{label:"Break apart",shortcut:e.jsx(D.KbdDark,{children:b("break-apart").toUpperCase()}),shortcutId:"break-apart",onClick:A,children:e.jsx(F.Shapes,{size:24})}),y&&e.jsx(D.EditToolbarBtn,{label:"Merge",onClick:B,children:e.jsx(F.StackPlus,{size:24})}),(l||c||C)&&e.jsx(D.ToolbarDivider,{}),e.jsx(D.EditToolbarBtn,{label:"Duplicate",shortcut:e.jsxs(e.Fragment,{children:[e.jsx(D.KbdDark,{children:"⌘"}),e.jsx(D.KbdDark,{children:"D"})]}),shortcutId:"duplicate",onClick:N,children:e.jsx(F.CopySimple,{size:24})}),e.jsx(D.EditToolbarBtn,{label:"Delete",shortcut:e.jsx(D.KbdDark,{children:Z.getFixedShortcutDisplay("delete-selected")}),shortcutId:"delete-selected",onClick:v,children:e.jsx(F.Trash,{size:24})})]}),a.length>=2&&e.jsx(i.Suspense,{fallback:null,children:e.jsx(Zr,{})})]})}const Qr="calc(var(--elm-bottom-stack-offset, calc(var(--elm-table-offset, 0px) + var(--elm-bottom-toolbar-offset, 0px) + 16px)) + 58px)";function eo({mapContainer:r,count:t,onSimplify:o,onDelete:s}){const n=r.parentElement;return n?ut.createPortal(e.jsx("div",{className:"absolute left-0 right-0 z-[400] flex justify-center pointer-events-none",style:{bottom:Qr},onMouseDown:f=>f.stopPropagation(),onContextMenu:f=>f.stopPropagation(),children:e.jsxs("div",{className:"flex items-center gap-2 bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 shadow-elm rounded-elm px-2 py-2 pointer-events-auto antialiased",children:[e.jsxs("span",{className:"px-1 text-sm text-elm-text-muted tabular-nums",children:[t," point",t!==1?"s":""," selected"]}),e.jsx(D.ToolbarDivider,{}),e.jsxs(D.EditToolbarBtn,{label:"Simplify selected points",onClick:o,disabled:t<3,children:[e.jsx(F.LineSegments,{size:24}),e.jsx("span",{className:"px-1 font-medium",children:"Simplify"})]}),e.jsxs(D.EditToolbarBtn,{label:"Delete selected points",onClick:s,children:[e.jsx(F.Trash,{size:24}),e.jsx("span",{className:"px-1 font-medium",children:"Delete"})]}),e.jsx(D.Kbd,{children:"Del"})]})}),n):null}const to=e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:1.2,strokeLinecap:"round",strokeLinejoin:"round",children:e.jsx("polyline",{points:"2.5,8 5.25,3.5 8,8 10.75,12.5 13.5,8"})}),ro=[{mode:"cut-hole",label:"Cut hole",icon:e.jsx(F.Scissors,{size:16}),shortcut:"cut-hole"},{mode:"slice-shape",label:"Slice shape",icon:e.jsx(F.Knife,{size:16}),shortcut:"slice-shape"}],oo=[{mode:"simplify-shape",label:"Simplify shape",icon:to},{mode:"smooth-shape",label:"Smooth shape",icon:e.jsx(F.WaveSine,{size:16})},{mode:"buffer-shape",label:"Buffer",icon:e.jsx(F.SquareLogo,{size:16})}];function no({x:r,y:t,data:o,onClose:s}){const{feature:n,requestPreciseCoords:f}=o,{dataStore:a}=d.useGeoStore(),p=d.useUIStore(N=>N.readonly),u=d.useUIStore(N=>N.transformActive),b=d.useUIStore(N=>N.setTransformActive),h=d.useUIStore(N=>N.editingMode),x=d.useUIStore(N=>N.setEditingMode),m=d.useUIStore(N=>N.closeDialog),S=d.useDataStore(N=>N.selectedIds),k=d.useEmit(),{getKey:M}=fe();if(p)return null;const E=n.geometry.type,l=E==="Polygon"||E==="MultiPolygon",g=E==="MultiPoint"||E==="MultiPolygon"||E==="MultiLineString"||E==="GeometryCollection",c=S.length>=2&&S.includes(n.id);function I(N){x(h===N?"none":N),u&&b(!1)}function y(N){return e.jsx(D.KbdDark,{children:M(N).toUpperCase()})}const C=[];if(C.push({label:"Transform",icon:e.jsx(F.Resize,{size:16}),shortcut:y("toggle-transform"),onClick:()=>{b(!u),!u&&h!=="none"&&x("none")}}),$.canProcessShape(E)){C.push({separator:!0});for(const N of[...l?ro:[],...oo])C.push({label:N.label,icon:N.icon,shortcut:N.shortcut?y(N.shortcut):void 0,onClick:()=>I(N.mode)})}return l&&C.push({label:"Center point",icon:e.jsx(F.DotOutline,{size:16,weight:"fill"}),onClick:()=>{var v;const N=lr.centroid(n),A=typeof((v=n.properties)==null?void 0:v.name)=="string"&&n.properties.name?n.properties.name:null,B={type:"Feature",id:crypto.randomUUID(),geometry:{type:"Point",coordinates:N.geometry.coordinates},properties:A?{name:`${A} center`}:{},groupId:n.groupId};a.getState().addFeature(B)}}),(g||c)&&(C.push({separator:!0}),g&&C.push({label:"Break apart",icon:e.jsx(F.Shapes,{size:16}),shortcut:y("break-apart"),onClick:()=>{const N=$.getPartCount(n.geometry);a.getState().breakMultiGeometry(n.id)&&k({type:"feature:broken",featureId:n.id,count:N,undo:()=>a.getState().undo()})}}),c&&C.push({label:`Merge ${S.length} features`,icon:e.jsx(F.StackPlus,{size:16}),onClick:()=>{const N=S.length;a.getState().mergeFeatures(),k({type:"success",message:`Merged ${N} features`})}})),f&&(C.push({separator:!0}),C.push({label:"Precise coordinates…",icon:e.jsx(F.Crosshair,{size:16}),onClick:f})),C.push({separator:!0}),C.push({label:c?`Delete ${S.length} features`:"Delete",icon:e.jsx(F.Trash,{size:16}),shortcut:e.jsx(D.KbdDark,{children:Z.getFixedShortcutDisplay("delete-selected")}),onClick:()=>{var B;const N=c?S.length:1,A=String(((B=n.properties)==null?void 0:B.name)||"feature");a.getState().deleteSelection(),m(),k(N===1?{type:"feature:deleted",featureId:n.id,label:A,undo:()=>a.getState().undo()}:{type:"features:deleted",count:N,undo:()=>a.getState().undo()})}}),e.jsx(D.ContextMenu,{x:r,y:t,items:C,onClose:s})}function Ot({size:r,tooltipSide:t}){const o=d.useDataStore(f=>f.undoStack.length>0),s=d.useDataStore(f=>f.undo),n=d.useEmit();return e.jsx(me,{label:"Undo",shortcutId:"undo",shortcut:e.jsxs("span",{className:"flex items-center gap-0.5",children:[e.jsx(D.KbdDark,{children:"⌘"}),e.jsx(D.KbdDark,{children:"Z"})]}),onClick:()=>{o&&(s(),n({type:"undo"}))},disabled:!o,size:r,tooltipSide:t,children:e.jsx(F.ArrowArcLeft,{size:24})})}function $t({size:r,tooltipSide:t}){const o=d.useDataStore(f=>f.redoStack.length>0),s=d.useDataStore(f=>f.redo),n=d.useEmit();return e.jsx(me,{label:"Redo",shortcutId:"redo",shortcut:e.jsxs("span",{className:"flex items-center gap-0.5",children:[e.jsx(D.KbdDark,{children:"⌘"}),e.jsx(D.KbdDark,{children:"⇧"}),e.jsx(D.KbdDark,{children:"Z"})]}),onClick:()=>{o&&(s(),n({type:"redo"}))},disabled:!o,size:r,tooltipSide:t,children:e.jsx(F.ArrowArcRight,{size:24})})}function Gt({direction:r="horizontal",children:t}){return e.jsx("div",{"data-elm-group":"",className:`flex bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 shadow-elm rounded-elm pointer-events-auto antialiased items-center gap-1 px-2 py-1.5 ${r==="vertical"?"flex-col":"flex-row"}`,children:t})}function so({direction:r="vertical"}){const t=r==="vertical"?"right":"top";return e.jsxs(Gt,{direction:r,children:[e.jsx(Ot,{size:"group",tooltipSide:t}),e.jsx($t,{size:"group",tooltipSide:t})]})}const ct="h-8 px-3 rounded-elm-control text-sm flex items-center justify-center gap-1.5 active:scale-[0.95]";function ao(){const{ui:r}=Q.useElementEditorConfig(),t=d.useUIStore(w=>w.editingMode),o=d.useUIStore(w=>w.lineInProgress),s=d.useUIStore(w=>w.polygonInProgress),n=d.useUIStore(w=>w.routeWaypoints),f=d.useUIStore(w=>w.routeLoading),a=d.useUIStore(w=>w.commitLine),p=d.useUIStore(w=>w.commitPolygon),u=d.useUIStore(w=>w.commitRoute),b=d.useUIStore(w=>w.commitSliceShape),h=d.useUIStore(w=>w.commitCutHole),x=d.useUIStore(w=>w.cancelDrawing),m=d.useUIStore(w=>w.circleCenter),S=d.useUIStore(w=>w.rectCorner),k=d.useUIStore(w=>w.freehandPoints),M=d.useUIStore(w=>w.freehandClosed),E=d.useUIStore(w=>w.setFreehandClosed),l=d.useUIStore(w=>w.measurePoints),g=d.useUIStore(w=>w.measureMode),c=d.useUIStore(w=>w.setMeasureMode),I=t==="draw-line"||t==="slice-shape",y=t==="draw-polygon"||t==="cut-hole",C=t==="draw-route",N=t==="draw-circle",A=t==="draw-rect",B=t==="draw-freehand",v=t==="place-point",j=t==="measure",P=t==="pick-shape";if(!(I||y||C||N||A||B||v)&&!j&&!P)return null;const K=o.length>0||s.length>0||!!m||!!S||n.length>0||k.length>0||l.length>0;function _(){if(t==="slice-shape"){if(o.length<2)return;b()}else if(t==="cut-hole"){if(s.length<3)return;h()}else if(I){if(o.length<2)return;a({})}else if(y){if(s.length<3)return;p({})}else if(C){if(n.length<2)return;u()}}const J=I?o.length>=2:y?s.length>=3:C?n.length>=2&&!f:!1,L=v?"Click to place a point":t==="draw-line"?o.length===0?"Click to place the first point":"Click to add points · Double-click to finish · ⌫ undo last":t==="draw-polygon"?s.length===0?"Click to place the first point":s.length<3?"Click to continue · ⌫ undo last":"Click to add points · Double-click to close · ⌫ undo last":C?n.length===0?"Click to place the first waypoint":"Click to add waypoints · ⌫ undo last":N?"Click and drag to size":A?"Click and drag to size · Hold Shift for square":B?"Click and drag to draw":t==="slice-shape"?o.length===0?"Draw a line across the shape to slice it":"Click to add points · Double-click to cut · ⌫ undo last":t==="cut-hole"?s.length===0?"Draw a shape inside to cut a hole":s.length<3?"Click to continue · ⌫ undo last":"Click to add points · Double-click to cut · ⌫ undo last":j?l.length===0?"Click to start measuring":"Click to add points · Double-click to finish · ⌫ undo last":P?"Click anywhere to import a shape from the map":null;return e.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-2 max-w-full bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 shadow-elm rounded-elm px-2 py-2 pointer-events-auto",children:[j&&e.jsxs(e.Fragment,{children:[e.jsx(D.EditToolbarBtn,{active:g==="distance",onClick:()=>c("distance"),label:"Measure distance",children:e.jsx(F.ArrowsHorizontal,{size:24})}),e.jsx(D.EditToolbarBtn,{active:g==="area",onClick:()=>c("area"),label:"Measure area",children:e.jsx(F.Hexagon,{size:24})})]}),t==="draw-freehand"&&e.jsx(D.EditToolbarBtn,{active:M,onClick:()=>E(!M),label:"Closed shape",children:e.jsx(F.CircleHalfTilt,{size:24,weight:M?"fill":"regular"})}),(j||t==="draw-freehand")&&e.jsx(D.ToolbarDivider,{}),r.hints&&L&&e.jsx("span",{className:"text-sm text-elm-text-muted px-2",children:L}),r.hints&&L&&e.jsx(D.ToolbarDivider,{}),J&&e.jsxs("button",{type:"button",onClick:_,className:`${ct} shadow-sm bg-primary-500 text-white hover:bg-primary-600`,children:[C?"Save route":t==="slice-shape"?"Slice":t==="cut-hole"?"Cut":"Finish",e.jsx(D.KbdInvert,{children:"↵"})]}),e.jsxs("button",{type:"button",onClick:x,className:`${ct} text-(--elm-text-muted,var(--color-gray-600)) dark:text-(--elm-text-muted,var(--color-gray-400)) hover:bg-elm-control-hover`,children:[K?"Cancel":"Exit",e.jsx(D.Kbd,{children:"Esc"})]})]})}function lo({size:r,tooltipSide:t}={}){const{fitBounds:o}=d.useMapController(),s=d.useEmit(),n=d.useDataStore(p=>p.features),f=d.useDataStore(p=>p.selectedIds);function a(){if(!o)return;let p=n;if(f.length>0){const u=new Set(f);p=n.filter(b=>u.has(b.id))}if(p.length===0){s({type:"warning",message:"No features on the map to zoom to"});return}try{if(p.length===1){const h=p[0];o(h.bbox||Z.getGeometryBBox(h.geometry));return}const u=ir.featureCollection(p),b=dt.bbox(u);o(b)}catch(u){s({type:"error",code:"geometry",source:"editor",message:"Failed to calculate map bounds",cause:u})}}return e.jsx(me,{label:"Fit map to features",tooltipContent:f.length>0?"Zoom to selection":"Zoom to all features",onClick:a,size:r,tooltipSide:t,children:e.jsx(F.CornersOut,{size:24})})}const io="flex items-center justify-center h-6 min-w-6 px-1.5 rounded-elm-control bg-transparent border border-transparent text-elm-text font-elm-mono text-xs tabular-nums select-none transition-colors focus-visible:ring-2 focus-visible:ring-elm-focus-ring",co="flex items-center justify-center h-8 min-w-8 px-1 rounded-elm-control bg-transparent border border-transparent text-elm-text font-elm-mono text-sm tabular-nums select-none transition-colors",uo="flex items-center justify-center w-12 h-12 bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 shadow-elm-control rounded-elm text-elm-text font-elm-mono text-sm select-none transition-colors";function fo({minZoom:r=1,maxZoom:t=22,fractional:o=!1,size:s="md",tooltipSide:n="top"}){const f=d.useDataStore(I=>I.currentZoom),{flyTo:a,getCenter:p}=d.useMapController(),u=d.useEmit(),b=!!a&&!!p,h=d.useUIStore(I=>I.zoomEditing),x=d.useUIStore(I=>I.setZoomEditing),[m,S]=i.useState(null),k=i.useRef(null),M=i.useRef(!1),{getKey:E}=fe(),l=s==="sm"?io:s==="group"?co:uo,g=s!=="md";i.useEffect(()=>{m!==null&&(o?Math.abs(f-m)<.05:Math.round(f)===Math.round(m))&&S(null)},[f,m,o]);function c(){var N;const I=(((N=k.current)==null?void 0:N.value)??"").trim();if(I===""){x(!1);return}const y=Number(I);if(!Number.isFinite(y)){u({type:"warning",message:`"${I}" is not a valid zoom level`});return}if(y<r||y>t){u({type:"warning",message:`Zoom must be between ${r} and ${t}`});return}if(!a||!p){u({type:"warning",message:"Map is not ready yet — try again in a moment"});return}const C=p();S(y),a([C[1],C[0]],y),x(!1)}if(h){const I=o?(m??f).toFixed(1):String(Math.round(m??f));return e.jsx("input",{ref:k,type:"text",inputMode:o?"decimal":"numeric",pattern:o?"[0-9.]*":"[0-9]*",autoFocus:!0,defaultValue:I,onFocus:y=>{const C=y.currentTarget;M.current?C.setSelectionRange(C.value.length,C.value.length):C.select(),M.current=!1},onKeyDown:y=>{y.key==="Enter"?(y.preventDefault(),c()):y.key==="Escape"&&(y.preventDefault(),x(!1))},onBlur:()=>x(!1),"aria-label":"Zoom level",className:`${l.replace(" select-none","")} text-center focus:outline-none focus:border-elm-focus-ring${g?" w-10 !bg-elm-surface":""}`})}return e.jsx(D.Tooltip,{content:b?"Set zoom level":"Map zoom level",side:n,shortcut:b?e.jsx(D.KbdDark,{children:E("set-zoom").toUpperCase()}):void 0,children:e.jsx("button",{type:"button","aria-label":b?"Set map zoom level":"Map zoom level","data-elm-shortcut":"set-zoom",onClick:()=>{b&&(M.current=!0,x(!0))},disabled:!b,className:`${l} ${b?`${g?"hover:bg-(--elm-control-hover,color-mix(in_oklab,var(--color-gray-200)_70%,transparent)) dark:hover:bg-(--elm-control-hover,var(--color-gray-800))":"hover:bg-elm-surface-hover"} focus:outline-none focus-visible:ring-2 focus-visible:ring-elm-focus-ring cursor-pointer`:"cursor-default"}`,children:o?(m??f).toFixed(1):Math.round(m??f)})})}function mo({zoom:r=15,size:t,tooltipSide:o}){const{flyTo:s}=d.useMapController(),n=d.useEmit(),[f,a]=i.useState(!1);function p(){if(!navigator.geolocation){n({type:"error",code:"unsupported",source:"locate",message:"Geolocation is not supported by this browser"});return}if(!s){n({type:"warning",message:"Map is not ready yet — try again in a moment"});return}f||(a(!0),navigator.geolocation.getCurrentPosition(u=>{a(!1),s([u.coords.latitude,u.coords.longitude],r)},u=>{a(!1),n({type:"error",code:u.code===u.PERMISSION_DENIED?"permission-denied":u.code===u.TIMEOUT?"timeout":"unknown",source:"locate",cause:u,message:u.code===u.PERMISSION_DENIED?"Location access denied":"Could not determine your location"})},{timeout:1e4}))}return e.jsx(me,{label:f?"Locating…":"Show my location",onClick:p,size:t,tooltipSide:o,children:f?e.jsx("div",{className:`${t==="sm"?"w-3.5 h-3.5":"w-5 h-5"} border-2 border-current/25 border-t-current rounded-full animate-spin`,"aria-hidden":!0}):e.jsx(F.NavigationArrow,{size:24})})}function po(){return d.useUIStore(t=>t.readonly)?e.jsxs("div",{className:"flex items-center gap-2 px-4 py-2 bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 shadow-elm rounded-elm text-sm text-(--elm-text-secondary,var(--color-gray-600)) dark:text-(--elm-text-secondary,var(--color-gray-300)) pointer-events-auto antialiased select-none",children:[e.jsx(F.Eye,{size:20,weight:"duotone",className:"text-elm-text-muted"}),e.jsx("span",{children:"View-only mode"})]}):null}const ho=3e4;let oe=null;const ye=new Map;function Ae(r,t){oe==null||oe.terminate(),oe=null;const o=[...ye.values()];ye.clear();for(const s of o)clearTimeout(s.timer),s.reject(new Z.ElementEditorError(t,"geometry",r))}async function go(){if(oe)return oe;const{default:r}=await Promise.resolve().then(()=>require("./geometryWorker-CCwg4tNC.cjs"));return oe||(oe=new r,oe.onmessage=t=>{const{id:o,ok:s,result:n,error:f}=t.data,a=ye.get(o);if(a){if(ye.delete(o),clearTimeout(a.timer),s&&(n!=null&&n.geometry)){a.resolve(n.geometry);return}a.reject(new Z.ElementEditorError("geometry","geometry",(f==null?void 0:f.message)||"Geometry operation failed"))}},oe.onerror=()=>Ae("Geometry worker failed","geometry"),oe)}function Le(r,{timeoutMs:t=ho}={}){return go().then(o=>new Promise((s,n)=>{const f=crypto.randomUUID(),a=setTimeout(()=>{Ae(`Geometry operation timed out after ${t} ms`,"timeout")},t);ye.set(f,{resolve:s,reject:n,timer:a});const p={id:f,payload:r};o.postMessage(p)}))}typeof Worker<"u"&&$.setGeometryRunner(Le);function xo(){Ae("Geometry worker disposed","unknown")}function ze(r,t){var p;const o=(p=i.useContext(d.EventContext))==null?void 0:p.emit,s=i.useRef(o);s.current=o;const n=i.useRef({seq:0,epoch:0,busy:!1,queued:null,owned:!1,onSettled:null,alive:!0}).current,f=i.useCallback(()=>{const u=n.onSettled;n.onSettled=null,u==null||u()},[n]),a=i.useCallback(u=>{const b=++n.seq,h=n.epoch;n.busy=!0,Le(u).then(x=>x,x=>{var m;return n.alive&&h===n.epoch&&((m=s.current)==null||m.call(s,{type:"error",code:x instanceof Z.ElementEditorError?x.code:"geometry",source:"geometry",message:`The ${u.type} preview failed: ${x instanceof Error?x.message:String(x)}`,cause:x,quiet:!0})),null}).then(x=>{if(n.busy=!1,!n.alive||h!==n.epoch){if(n.queued){const k=n.queued;n.queued=null,a(k)}return}const m=n.queued;n.queued=null;const S=b===n.seq;(S||m&&m.geometry===u.geometry)&&(n.owned=!0,t(x)),m?a(m):S&&f()})},[n,t,f]);return i.useEffect(()=>{if(!r){n.epoch++,n.queued=null,n.onSettled=null,n.owned&&(n.owned=!1,t(null));return}if(n.busy){n.queued=r,n.seq++;return}a(r)},[r,n,a,t]),i.useEffect(()=>(n.alive=!0,()=>{n.alive=!1,n.queued=null,n.onSettled=null}),[n]),i.useCallback(u=>{!n.busy&&!n.queued?u():n.onSettled=u},[n])}const yo=111320;function bo(r,t){const o=r*yo;if(o<1)return`<1${Z.formatLength(1,t).unit}`;const s=Z.formatLength(o,t);return`~${s.value}${s.unit}`}function vo(){const r=d.useUIStore(y=>y.editingMode),t=d.useUIStore(y=>y.simplifyTolerance),o=d.useUIStore(y=>y.setSimplifyTolerance),s=d.useUIStore(y=>y.setGeometryPreview),n=d.useUIStore(y=>y.geometryPreview),f=d.useUIStore(y=>y.commitGeometryProcess),a=d.useUIStore(y=>y.cancelGeometryProcess),{units:p}=Q.useElementEditorConfig(),u={unit:p.length,display:p.display,precision:p.precision},{dataStore:b}=d.useGeoStore(),h=ce(),x=d.useDataStore(y=>y.selectedIds[0]??null),m=d.useDataStore(y=>{var C;return x?((C=y.features.find(N=>N.id===x))==null?void 0:C.geometry)??null:null}),S=d.useDataStore(y=>{var C;return x?((C=y.features.find(N=>N.id===x))==null?void 0:C._drawType)??null:null}),k=i.useMemo(()=>{if(!m||r!=="simplify-shape")return 0;try{const y=dt.bbox({type:"Feature",geometry:m,properties:{}}),C=Math.sqrt((y[2]-y[0])**2+(y[3]-y[1])**2);return(t/100)**2*C*.3}catch{return 0}},[t,m,r]),M=r==="simplify-shape",E=i.useMemo(()=>!M||!m||!$.canProcessShape(m.type)?null:{type:"simplify",geometry:m,tolerance:k},[M,m,k]),l=ze(E,s);i.useEffect(()=>()=>{b.getState(),s(null)},[s,b]);const g=m?$.countShapeVertices(m):0,c=n?$.countShapeVertices(n):g,I=g-c;return i.useEffect(()=>{if(r!=="simplify-shape")return;function y(C){h(C)&&(C.key==="Enter"&&n&&I>0?(C.preventDefault(),l(f)):C.key==="Escape"&&(C.preventDefault(),a()))}return window.addEventListener("keydown",y),()=>window.removeEventListener("keydown",y)},[r,n,I,f,a,l,h]),r!=="simplify-shape"?null:e.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-3 max-w-full bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 shadow-elm rounded-elm px-3 py-1.5 pointer-events-auto",children:[e.jsx("span",{className:"text-sm font-medium text-elm-text-secondary shrink-0",children:"Simplify"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"range",min:0,max:100,value:t,onChange:y=>o(Number(y.target.value)),className:"w-32 accent-primary-600"}),e.jsx("span",{className:"text-sm text-elm-text-muted w-16 shrink-0",children:bo(k,u)})]}),e.jsxs("div",{className:"flex items-center gap-1 text-sm text-elm-text-muted shrink-0",children:[e.jsx("span",{className:"font-elm-mono",children:g}),e.jsx("span",{children:"→"}),e.jsx("span",{className:`font-elm-mono font-medium ${I>0?"text-primary-600 dark:text-primary-400":"text-(--elm-text-secondary,var(--color-gray-600)) dark:text-(--elm-text-secondary,var(--color-gray-300))"}`,children:c}),I>0&&e.jsxs("span",{className:"text-xs text-primary-500",children:["(−",I,")"]}),e.jsx("span",{className:"ml-0.5",children:"points"})]}),S&&e.jsx("span",{className:"text-xs text-amber-600 dark:text-amber-400 shrink-0",children:S==="route"?"Turns this route into a plain line.":`Turns this ${S} into a plain shape.`}),e.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[e.jsx(D.Button,{variant:"ghost",onClick:a,className:"rounded-elm-control h-8 px-3 text-sm",children:"Cancel"}),e.jsx(D.Button,{variant:"primary",onClick:()=>l(f),disabled:!n||I===0,className:"rounded-elm-control h-8 px-3 text-sm",children:"Apply"})]})]})}function wo(){const r=d.useUIStore(g=>g.editingMode),t=d.useUIStore(g=>g.smoothIterations),o=d.useUIStore(g=>g.setSmoothIterations),s=d.useUIStore(g=>g.setGeometryPreview),n=d.useUIStore(g=>g.geometryPreview),f=d.useUIStore(g=>g.commitGeometryProcess),a=d.useUIStore(g=>g.cancelGeometryProcess),{dataStore:p}=d.useGeoStore(),u=ce(),b=d.useDataStore(g=>g.selectedIds[0]??null),h=d.useDataStore(g=>{var c;return b?((c=g.features.find(I=>I.id===b))==null?void 0:c.geometry)??null:null}),x=d.useDataStore(g=>{var c;return b?((c=g.features.find(I=>I.id===b))==null?void 0:c._drawType)??null:null}),m=r==="smooth-shape",S=i.useMemo(()=>!m||!h||!$.canProcessShape(h.type)?null:{type:"smooth",geometry:h,iterations:t},[m,h,t]),k=ze(S,s);i.useEffect(()=>()=>{p.getState(),s(null)},[s,p]);const M=h?$.countShapeVertices(h):0,E=n?$.countShapeVertices(n):M,l=E-M;return i.useEffect(()=>{if(r!=="smooth-shape")return;function g(c){u(c)&&(c.key==="Enter"&&n?(c.preventDefault(),k(f)):c.key==="Escape"&&(c.preventDefault(),a()))}return window.addEventListener("keydown",g),()=>window.removeEventListener("keydown",g)},[r,n,f,a,k,u]),r!=="smooth-shape"?null:e.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-3 max-w-full bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 shadow-elm rounded-elm px-3 py-1.5 pointer-events-auto",children:[e.jsx("span",{className:"text-sm font-medium text-elm-text-secondary shrink-0",children:"Smooth"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"range",min:1,max:5,step:1,value:t,onChange:g=>o(Number(g.target.value)),className:"w-24 accent-primary-600"}),e.jsxs("span",{className:"text-sm text-elm-text-muted w-16 shrink-0",children:[t," ",t===1?"pass":"passes"]})]}),e.jsxs("div",{className:"flex items-center gap-1 text-sm text-elm-text-muted shrink-0",children:[e.jsx("span",{className:"font-elm-mono",children:M}),e.jsx("span",{children:"→"}),e.jsx("span",{className:"font-elm-mono font-medium text-primary-600 dark:text-primary-400",children:E}),l>0&&e.jsxs("span",{className:"text-xs text-primary-500",children:["(+",l,")"]}),e.jsx("span",{className:"ml-0.5",children:"points"})]}),x&&e.jsx("span",{className:"text-xs text-amber-600 dark:text-amber-400 shrink-0",children:x==="route"?"Turns this route into a plain line.":`Turns this ${x} into a plain shape.`}),e.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[e.jsx(D.Button,{variant:"ghost",onClick:a,className:"rounded-elm-control h-8 px-3 text-sm",children:"Cancel"}),e.jsx(D.Button,{variant:"primary",onClick:()=>k(f),disabled:!n,className:"rounded-elm-control h-8 px-3 text-sm",children:"Apply"})]})]})}const Be=.3048,So=5280,Wt=Be*So;function ko(r,t){switch(t){case"m":return r;case"km":return r*1e3;case"ft":return r*Be;case"mi":return r*Wt}}function jo(r,t){switch(t){case"m":return r;case"km":return r/1e3;case"ft":return r/Be;case"mi":return r/Wt}}function Eo(){const{dataStore:r}=d.useGeoStore(),t=ce(),o=d.useUIStore(P=>P.editingMode),s=d.useUIStore(P=>P.bufferDistance),n=d.useUIStore(P=>P.setBufferDistance),f=d.useUIStore(P=>P.bufferCreateNew),a=d.useUIStore(P=>P.setBufferCreateNew),p=d.useUIStore(P=>P.setGeometryPreview),u=d.useUIStore(P=>P.geometryPreview),b=d.useUIStore(P=>P.commitBufferProcess),h=d.useUIStore(P=>P.cancelBufferProcess),{units:x}=Q.useElementEditorConfig(),m=$.resolveUnitSystem(x.length),S=i.useMemo(()=>m==="imperial"?["ft","mi"]:["m","km"],[m]),[k,M]=i.useState(!1),E=k?S[1]:S[0],[l,g]=i.useState(null);i.useEffect(()=>{var K;if(o!=="buffer-shape"){g(null);return}const P=r.getState().selectedIds[0]??null;if(!P)return;const z=((K=r.getState().features.find(_=>_.id===P))==null?void 0:K.geometry)??null;z&&$.canProcessShape(z.type)&&g(z)},[o,r]);const c=$.isLineGeometryType(l==null?void 0:l.type),I=i.useMemo(()=>l&&!(c&&s<=0)?{type:"buffer",geometry:l,distance:s}:null,[l,s,c]),y=ze(I,p);i.useEffect(()=>()=>{p(null)},[p]),i.useEffect(()=>{if(o!=="buffer-shape")return;function P(z){t(z)&&(z.key==="Enter"&&u?(z.preventDefault(),y(b)):z.key==="Escape"&&(z.preventDefault(),h()))}return window.addEventListener("keydown",P),()=>window.removeEventListener("keydown",P)},[o,u,b,h,y,t]);const C=E==="km"||E==="mi",N=jo(s,E),A=C?Number(N.toFixed(2)):Math.round(N),B=C?.1:1;function v(P){const z=parseFloat(P);isNaN(z)||n(Math.round(ko(z,E)))}function j(){M(P=>!P)}return o!=="buffer-shape"?null:e.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-3 max-w-full bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 shadow-elm rounded-elm px-3 py-1.5 pointer-events-auto",children:[e.jsx("span",{className:"text-sm font-medium text-elm-text-secondary shrink-0",children:"Buffer"}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("input",{type:"range",min:c?0:-500,max:2e3,step:1,value:s,onChange:P=>n(Number(P.target.value)),className:"w-28 accent-primary-600"}),e.jsxs("div",{className:"flex items-center gap-0.5",children:[e.jsx("input",{type:"number",value:A,step:B,onChange:P=>v(P.target.value),className:"w-16 text-sm text-right bg-transparent border border-elm-border rounded-elm-control px-1.5 py-0.5 text-elm-text-secondary focus:outline-none focus:border-primary-500"}),e.jsx("button",{onClick:j,className:"text-xs text-primary-600 dark:text-primary-400 hover:bg-(--elm-surface-hover,var(--color-gray-100)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-700)) font-medium px-1.5 py-0.5 rounded-elm-control shrink-0 transition-colors",children:E})]})]}),e.jsxs("label",{className:"flex items-center gap-1.5 cursor-pointer shrink-0 select-none",children:[e.jsx("span",{className:"text-sm text-(--elm-text-muted,var(--color-gray-600)) dark:text-(--elm-text-muted,var(--color-gray-400))",children:"New shape"}),e.jsx("div",{role:"checkbox","aria-checked":f,onClick:()=>a(!f),className:`relative w-8 h-4 rounded-full transition-colors cursor-pointer ${f?"bg-primary-500 dark:bg-primary-600":"bg-elm-border"}`,children:e.jsx("span",{className:`absolute top-0.5 w-3 h-3 bg-white rounded-full shadow-sm transition-transform ${f?"translate-x-4":"translate-x-0.5"}`})})]}),e.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[e.jsx(D.Button,{variant:"ghost",onClick:h,className:"rounded-elm-control h-8 px-3 text-sm",children:"Cancel"}),e.jsx(D.Button,{variant:"primary",onClick:()=>y(b),disabled:!u,className:"rounded-elm-control h-8 px-3 text-sm",children:"Apply"})]})]})}const Co=8,Io={ArrowLeft:-1,ArrowRight:1,ArrowUp:-3,ArrowDown:3};function Do({options:r,value:t,onChange:o,label:s="Basemap",size:n,tooltipSide:f}){const[a,p]=i.useState(!1),[u,b]=i.useState(null),[h,x]=i.useState(!1),m=i.useRef(null),S=i.useRef(null),k=i.useId(),M=Q.useAccentStyle(),E=u!==null;i.useLayoutEffect(()=>{var B,v;const c=(v=(B=m.current)==null?void 0:B.querySelector("button"))==null?void 0:v.getBoundingClientRect(),I=S.current;if(!a||!c||!I)return;const{width:y,height:C}=I.getBoundingClientRect(),N=c.top+c.height/2>window.innerHeight/2,A=c.left+c.width/2>window.innerWidth/2;b($.placeBox(A?c.right:c.left,N?c.top:c.bottom,y,C,{x:A?"before":"after",y:N?"before":"after",gapY:Co}))},[a,r.length]),i.useEffect(()=>{var I;if(!a||!E)return;const c=S.current;(I=(c==null?void 0:c.querySelector('[aria-pressed="true"]'))??(c==null?void 0:c.querySelector("button")))==null||I.focus()},[a,E]),i.useEffect(()=>{if(!a)return;const c=I=>{var y,C,N;I.key==="Escape"&&(I.stopImmediatePropagation(),I.preventDefault(),(y=S.current)!=null&&y.contains(document.activeElement)&&((N=(C=m.current)==null?void 0:C.querySelector("button"))==null||N.focus()),p(!1))};return window.addEventListener("keydown",c,{capture:!0}),()=>window.removeEventListener("keydown",c,{capture:!0})},[a]);const l=c=>{const I=Io[c.key];if(!I)return;const y=Array.from(c.currentTarget.querySelectorAll("button")),C=y[y.indexOf(document.activeElement)+I];C&&(c.preventDefault(),C.focus())},g=()=>{var c,I;b(null),x(((I=(c=m.current)==null?void 0:c.closest("[data-elm-theme]"))==null?void 0:I.getAttribute("data-elm-theme"))==="dark"),p(y=>!y)};return e.jsxs("div",{ref:m,className:"contents",children:[e.jsx(me,{label:s,onClick:g,active:a,expanded:a,controls:a?k:void 0,size:n,tooltipSide:f,children:e.jsx(F.StackSimple,{size:24})}),a&&ut.createPortal(e.jsx("div",{"data-elm-portal":!0,"data-elm-theme":h?"dark":"light",style:M,[D.CONTEXT_MENU_MARKER_ATTR]:"",children:e.jsx("div",{ref:S,id:k,role:"group","aria-label":s,className:"fixed z-[9999] w-80 max-h-[70vh] flex flex-col bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 shadow-elm rounded-elm antialiased",style:{left:(u==null?void 0:u.left)??0,top:(u==null?void 0:u.top)??0,visibility:u?void 0:"hidden"},children:e.jsx("div",{className:"grid grid-cols-3 gap-2 p-2 overflow-y-auto",onKeyDown:l,children:r.map(c=>{const I=c.id===t;return e.jsxs("button",{type:"button","aria-pressed":I,"aria-label":c.label,onClick:()=>o(c.id),className:`flex flex-col rounded-elm-card border transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-400/60 ${I?"border-primary-500 ring-2 ring-primary-400/40 bg-primary-50 hover:bg-primary-100 dark:bg-primary-950/40 dark:hover:bg-primary-950/60":"border-elm-border hover:border-(--elm-border-strong,var(--color-gray-400)) dark:hover:border-(--elm-border-strong,var(--color-gray-500)) bg-elm-surface hover:bg-elm-surface-hover"}`,children:[Array.isArray(c.thumbnail)?e.jsx("div",{className:"w-full h-12 flex rounded-t-elm-card overflow-hidden",children:c.thumbnail.map(y=>e.jsx("img",{src:y,alt:"",className:"w-1/2 h-full object-cover",loading:"lazy",draggable:!1},y))}):c.thumbnail?e.jsx("img",{src:c.thumbnail,alt:"",className:"w-full h-12 object-cover rounded-t-elm-card",loading:"lazy",draggable:!1}):e.jsx("div",{className:"w-full h-12 rounded-t-elm-card bg-elm-surface-hover flex items-center justify-center text-elm-text-subtle",children:e.jsx(F.StackSimple,{size:20})}),e.jsx("div",{className:`text-[11px] leading-4 tracking-tight text-center px-0.5 py-1 truncate font-medium ${I?"text-primary-700 dark:text-primary-300":"text-(--elm-text-secondary,var(--color-gray-700)) dark:text-(--elm-text-secondary,var(--color-gray-200))"}`,children:c.label})]},c.id)})})})}),document.body)]})}function No(r,t){const o=i.useRef(t);o.current=t,i.useEffect(()=>Z.subscribeToDataChanges(r,()=>o.current),[r])}const Po=(r,t)=>Object.keys(r).every(o=>r[o]===t[o]);function To(r){const[t,o]=i.useState(()=>Z.readAccentPalette(r));return i.useEffect(()=>{const s=()=>{const p=Z.readAccentPalette(r);o(u=>Po(u,p)?u:p)};let n=0;const f=()=>{n||(n=requestAnimationFrame(()=>{n=0,s()}))};s();const a=Q.watchThemeInputs((r==null?void 0:r.closest("[data-elm-theme]"))??null,f);return()=>{a(),cancelAnimationFrame(n)}},[r]),t}const Mo=[".geojson",".json","application/geo+json","application/json"];function Uo(r,t){const o=r.name.toLowerCase();for(const s of t){const n=s.toLowerCase();if(n.startsWith(".")){if(o.endsWith(n))return!0}else if(n.endsWith("/*")){const f=n.slice(0,-1);if(r.type.toLowerCase().startsWith(f))return!0}else if(r.type.toLowerCase()===n)return!0}return!1}function Fo(r){const{onImport:t,onError:o,maxBytes:s=Z.DEFAULT_MAX_IMPORT_BYTES,accept:n=Mo,disabled:f=!1}=r,[a,p]=i.useState(!1),[u,b]=i.useState(!1),h=i.useRef(0),x=i.useRef(null),m=i.useRef(!0),S=i.useRef(t),k=i.useRef(o);i.useEffect(()=>{S.current=t},[t]),i.useEffect(()=>{k.current=o},[o]),i.useEffect(()=>(m.current=!0,()=>{m.current=!1}),[]);const M=i.useMemo(()=>n.join(","),[n]),E=i.useCallback(async v=>{var j,P,z,K;if(!Uo(v,n)){(j=k.current)==null||j.call(k,{kind:"wrong-type",file:v});return}if(v.size>s){(P=k.current)==null||P.call(k,{kind:"too-large",bytes:v.size,maxBytes:s});return}b(!0);try{const _=await v.text();if(!m.current)return;const J=Z.parseGeoJSONText(_,{maxBytes:s});if(!m.current)return;if(!J.ok){(z=k.current)==null||z.call(k,J.error);return}S.current(J.fc,v)}catch(_){if(!m.current)return;(K=k.current)==null||K.call(k,{kind:"invalid-json",cause:_ instanceof Error?_:new Error(String(_))})}finally{m.current&&b(!1)}},[n,s]),l=i.useCallback(v=>{var j,P;f||(P=(j=v.dataTransfer)==null?void 0:j.types)!=null&&P.includes("Files")&&(v.preventDefault(),v.stopPropagation(),h.current+=1,p(!0))},[f]),g=i.useCallback(v=>{var j,P;f||(P=(j=v.dataTransfer)==null?void 0:j.types)!=null&&P.includes("Files")&&(v.preventDefault(),v.stopPropagation(),v.dataTransfer.dropEffect="copy")},[f]),c=i.useCallback(v=>{f||(v.preventDefault(),v.stopPropagation(),h.current=Math.max(0,h.current-1),h.current===0&&p(!1))},[f]),I=i.useCallback(v=>{var P,z;if(f)return;v.preventDefault(),v.stopPropagation(),h.current=0,p(!1);const j=(z=(P=v.dataTransfer)==null?void 0:P.files)==null?void 0:z[0];j&&E(j)},[f,E]),y=i.useCallback(v=>{var P;if(f)return;const j=(P=v.target.files)==null?void 0:P[0];v.target.value="",j&&E(j)},[f,E]),C=i.useCallback(v=>{x.current=v},[]),N=i.useCallback(()=>{var v;f||(v=x.current)==null||v.click()},[f]),A=i.useCallback(()=>({onDragEnter:l,onDragOver:g,onDragLeave:c,onDrop:I}),[l,g,c,I]),B=i.useCallback(()=>({type:"file",accept:M,style:{display:"none"},ref:C,onChange:y}),[M,C,y]);return{getRootProps:A,getInputProps:B,isDragActive:a,isProcessing:u,open:N}}const Ro="application/geo+json";function Ao(r,t){const o=typeof t=="function"?t(r):typeof t=="string"&&t.length>0?t:"features";return o.toLowerCase().endsWith(".geojson")?o:`${o}.geojson`}function Lo(r){const{getFeatureCollection:t,filename:o,indent:s=2,disabled:n=!1}=r,f=i.useRef(t),a=i.useRef(r.onExport),p=i.useRef(r.onError),u=i.useRef(o),b=i.useRef(s),h=i.useRef(n);i.useEffect(()=>{f.current=t},[t]),i.useEffect(()=>{a.current=r.onExport},[r.onExport]),i.useEffect(()=>{p.current=r.onError},[r.onError]),i.useEffect(()=>{u.current=o},[o]),i.useEffect(()=>{b.current=s},[s]),i.useEffect(()=>{h.current=n},[n]);const x=i.useCallback(()=>{var l;if(h.current)return null;const E=f.current();return!E||!Array.isArray(E.features)||E.features.length===0?((l=p.current)==null||l.call(p,{kind:"empty"}),null):E},[]),m=i.useCallback(E=>{var l;try{return JSON.stringify(E,null,b.current)}catch(g){return(l=p.current)==null||l.call(p,{kind:"serialization-error",cause:g instanceof Error?g:new Error(String(g))}),null}},[]),S=i.useCallback(()=>{const E=x();return E?m(E):null},[x,m]),k=i.useCallback(()=>{const E=S();return E===null?null:new Blob([E],{type:Ro})},[S]);return{exportToFile:i.useCallback(()=>{const E=x();if(!E)return null;const l=m(E);if(l===null)return null;const g=Ao(E,u.current);return d.saveGeoJSONFile(l,g).then(c=>{var I;c&&((I=a.current)==null||I.call(a,E,c))}),g},[x,m]),exportToString:S,exportToBlob:k}}class _t extends i.Component{constructor(){super(...arguments);rt(this,"state",{hasError:!1,error:null})}static getDerivedStateFromError(o){return{hasError:!0,error:o}}componentDidCatch(o){var s,n;(n=(s=this.props).onError)==null||n.call(s,new Z.ElementEditorError("crash","editor",`The editor crashed: ${(o==null?void 0:o.message)??String(o)}`,{cause:o}))}render(){var o;return this.state.hasError?e.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",width:"100%",height:"100%",padding:32,fontFamily:"var(--elm-font, system-ui, sans-serif)",background:"var(--elm-surface-sunken, #fafafa)",color:"var(--elm-text, #333)"},children:[e.jsx("p",{style:{fontSize:16,fontWeight:600,marginBottom:8},children:"Something went wrong"}),e.jsx("p",{style:{fontSize:13,color:"var(--elm-text-muted, #666)",marginBottom:16,maxWidth:420,textAlign:"center"},children:((o=this.state.error)==null?void 0:o.message)||"An unexpected error occurred in the map editor."}),e.jsx("button",{onClick:()=>this.setState({hasError:!1,error:null}),style:{padding:"8px 16px",fontSize:13,borderRadius:8,border:"1px solid var(--elm-border, #ddd)",background:"var(--elm-surface, white)",cursor:"pointer"},children:"Try again"})]}):this.props.children}}function zo({config:r,accentColor:t,featureColor:o,onEvent:s,onError:n,toaster:f=!0,children:a}){const p=i.useMemo(()=>t||o?{...r,...t&&{accentColor:t},...o&&{featureColor:o}}:r,[r,t,o]);return e.jsx(_t,{onError:n,children:e.jsx(Q.ElementEditorConfigProvider,{config:p,children:e.jsx(mt,{children:e.jsx(d.ThemeReportingProvider,{children:e.jsx(d.EventProvider,{onEvent:s,onError:n,toaster:f,children:e.jsx(d.MapControllerProvider,{children:a})})})})})})}const qt=se(()=>Promise.resolve().then(()=>require("./GeoJSONModal-Dd-nBufy.cjs"))),Ht=se(()=>Promise.resolve().then(()=>require("./SchemaModal-gAuDkd-L.cjs"))),Vt=se(()=>Promise.resolve().then(()=>require("./FeatureEditModal-Cc8N6vei.cjs"))),Jt=se(()=>Promise.resolve().then(()=>require("./DataTablePanel-58LwzXQR.cjs"))),Xt=se(()=>Promise.resolve().then(()=>require("./SettingsModal-CqaSFxxR.cjs"))),Zt=se(()=>Promise.resolve().then(()=>require("./ShortcutsModal-D1Y2bGT8.cjs")).then(r=>({default:r.ShortcutsModal})));Te(qt,Ht,Vt,Jt,Xt,Zt);const Yt=se(()=>Promise.resolve().then(()=>require("./BooleanOperations-C2uOHRu3.cjs")));Te(Yt);exports.ActiveDrawingToolbar=ao;exports.BasemapPicker=Do;exports.BooleanOperations=Yt;exports.BufferPanel=Eo;exports.CODE_DOCKED_KEY=Lt;exports.ControlGroup=Gt;exports.DataTable=pt;exports.DataTablePanel=Jt;exports.EditingToolbar=Yr;exports.ElementEditorErrorBoundary=_t;exports.ElementEditorUIProvider=zo;exports.FeatureEditModal=Vt;exports.FeatureList=Ue;exports.FeatureMapContextMenu=no;exports.FeatureRow=$r;exports.FeatureSidePanel=It;exports.FitBoundsButton=lo;exports.FloatingToolbar=Jr;exports.GeoJSONDockPlaceholder=_r;exports.GeoJSONModal=qt;exports.GeometryTypeIcon=Re;exports.GroupRow=Gr;exports.IconButton=me;exports.LayersPanel=Or;exports.LocateButton=mo;exports.NoFeaturesEmptyState=gt;exports.PartSubRow=Wr;exports.ReadonlyBanner=po;exports.RedoButton=$t;exports.SchemaEditor=ht;exports.SchemaModal=Ht;exports.SettingsModal=Xt;exports.ShortcutConfigProvider=mt;exports.ShortcutsModal=Zt;exports.SimplifyPanel=vo;exports.SmoothPanel=wo;exports.UndoButton=Ot;exports.UndoRedoToolbar=so;exports.VertexSelectionBar=eo;exports.WINDOW_ATTR=vt;exports.ZoomIndicator=fo;exports.clipboardErrorEvent=yt;exports.disposeGeometryWorker=xo;exports.featureLabel=At;exports.geometryTypeLabel=Ft;exports.getTabbableFeatureIds=dr;exports.getVisualFeatureOrder=bt;exports.isMacPlatform=xt;exports.panelHeaderBar=jt;exports.panelHeaderIconBtn=ge;exports.parseBooleanText=St;exports.preloadEditorPanelsWhenIdle=cr;exports.readBooleanValue=kt;exports.resizeEdgeLeft=Ut;exports.resizeEdgeTop=Fr;exports.runGeometryWorkerOperation=Le;exports.startDragShield=Pt;exports.useAccentPalette=To;exports.useCodeDock=Bt;exports.useDataChangeSubscription=No;exports.useGeoJSONDrop=Fo;exports.useGeoJSONExport=Lo;exports.useInitialCodeDocked=zt;exports.useIsEventForEditor=ce;exports.useKeyboardShortcuts=br;exports.usePanelOffset=Fe;exports.useShortcutConfig=fe;exports.useWindowEscape=mr;
|
package/dist/primitives.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./EditToolbarBtn-
|
|
1
|
+
"use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./EditToolbarBtn-Ch9HCLHq.cjs");exports.Button=t.Button;exports.ContextMenu=t.ContextMenu;exports.EditToolbarBtn=t.EditToolbarBtn;exports.Input=t.Input;exports.Kbd=t.Kbd;exports.KbdDark=t.KbdDark;exports.KbdInvert=t.KbdInvert;exports.SearchDropdown=t.SearchDropdown;exports.SelectInput=t.SelectInput;exports.Textarea=t.Textarea;exports.ToolButton=t.ToolButton;exports.ToolbarDivider=t.ToolbarDivider;exports.Tooltip=t.Tooltip;
|
package/dist/primitives.es.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { B as o, C as s, E as e, I as n, K as r, a as d, b, S as l, c as u, T, d as i, e as p, f as c } from "./EditToolbarBtn-
|
|
2
|
+
import { B as o, C as s, E as e, I as n, K as r, a as d, b, S as l, c as u, T, d as i, e as p, f as c } from "./EditToolbarBtn-SR4xHd8G.js";
|
|
3
3
|
export {
|
|
4
4
|
o as Button,
|
|
5
5
|
s as ContextMenu,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as E } from "react/jsx-runtime";
|
|
2
2
|
import { X as z } from "@phosphor-icons/react";
|
|
3
|
-
import { a as D, s as X } from "./index-
|
|
3
|
+
import { a as D, s as X } from "./index-CILw1Du5.js";
|
|
4
4
|
import { useState as b, useRef as $, useEffect as g, useCallback as M } from "react";
|
|
5
5
|
import { readPersisted as R, writePersisted as h } from "@element-editor/core";
|
|
6
6
|
import { u as Y } from "./useAccentStyle-CPo2XqAn.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const h=require("react/jsx-runtime"),q=require("@phosphor-icons/react"),g=require("./index-
|
|
1
|
+
"use strict";const h=require("react/jsx-runtime"),q=require("@phosphor-icons/react"),g=require("./index-DG4wEjGj.cjs"),i=require("react"),p=require("@element-editor/core"),D=require("./useAccentStyle-hsGvyHZc.cjs");function L({onClick:e,label:a="Close"}){return h.jsx("button",{onMouseDown:o=>o.stopPropagation(),onClick:e,"aria-label":a,className:`flex ${g.panelHeaderIconBtn}`,children:h.jsx(q.X,{size:16})})}const m=1;function R(e){return!!e&&typeof e=="object"&&typeof e.x=="number"&&typeof e.y=="number"}function w(e){return{x:Math.max(0,Math.min(window.innerWidth-120,e.x)),y:Math.max(0,Math.min(window.innerHeight-60,e.y))}}function z(e,a){const o=D.useElementEditorConfig(),[d,u]=i.useState(()=>{const n=p.readPersisted(e,m,r=>R(r)?r:null,o);return n?w(n):a}),c=i.useRef(d);c.current=d,i.useEffect(()=>{function n(){u(r=>{const l=w(r);return l.x===r.x&&l.y===r.y?r:(p.writePersisted(e,m,l,o),l)})}return window.addEventListener("resize",n),()=>window.removeEventListener("resize",n)},[e,o]);const S=i.useCallback(n=>{if(n.button!==0)return;n.preventDefault();const r=n.clientX,l=n.clientY,x=c.current.x,y=c.current.y,C=g.startDragShield("grabbing");let t=n.currentTarget;for(;t&&getComputedStyle(t).position!=="fixed";)t=t.parentElement;const M=(t==null?void 0:t.style.left)??"",P=(t==null?void 0:t.style.top)??"";function v(b){const f=w({x:x+b.clientX-r,y:y+b.clientY-l});if(c.current=f,!t){u(f);return}t.style.left=M.replace(`${x}px`,`${f.x}px`),t.style.top=P.replace(`${y}px`,`${f.y}px`)}function E(){C(),u(c.current),p.writePersisted(e,m,c.current,o),window.removeEventListener("mousemove",v),window.removeEventListener("mouseup",E)}window.addEventListener("mousemove",v),window.addEventListener("mouseup",E)},[e,o]);return{pos:d,onHandleMouseDown:S}}let s=1e3;function W(e=!0){const[a,o]=i.useState(()=>(s+=1,s));i.useEffect(()=>{e&&(s+=1,o(s))},[e]);const d=i.useCallback(()=>{o(u=>u===s?u:(s+=1,s))},[]);return{zIndex:a,focus:d}}exports.CloseButton=L;exports.useDragWindow=z;exports.useWindowFocus=W;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@element-editor/ui",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "React UI of the Element map editor: toolbars, layers panel, data table, schema forms and GeoJSON inspector, for building your own editor layout.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"element-editor",
|
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
"react-data-grid": "7.0.0-beta.57",
|
|
109
109
|
"sonner": "^2.0.7",
|
|
110
110
|
"zustand": "^5.0.11",
|
|
111
|
-
"@element-editor/core": "0.2.
|
|
111
|
+
"@element-editor/core": "0.2.1"
|
|
112
112
|
},
|
|
113
113
|
"devDependencies": {
|
|
114
114
|
"@tailwindcss/vite": "^4.2.1",
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
"use strict";const e=require("react/jsx-runtime"),i=require("react"),L=require("react-dom"),R=require("clsx"),D=require("./useAccentStyle-hsGvyHZc.cjs"),A=require("@phosphor-icons/react"),K="data-elm-context-menu";function F(){return document.querySelector(`[${K}]`)!==null}function W({x:t,y:o,items:n,onClose:a}){const c=i.useRef(null),[x,g]=i.useState({left:t,top:o}),s=i.useRef(null),[v,l]=i.useState(!1),y=D.useAccentStyle();return i.useLayoutEffect(()=>{var r,b;l(((b=(r=s.current)==null?void 0:r.closest("[data-elm-theme]"))==null?void 0:b.getAttribute("data-elm-theme"))==="dark")},[]),i.useLayoutEffect(()=>{const r=c.current;if(!r)return;const{width:b,height:p}=r.getBoundingClientRect();g({left:t+b>window.innerWidth?t-b:t,top:o+p>window.innerHeight?o-p:o})},[t,o]),i.useEffect(()=>{function r(p){c.current&&!c.current.contains(p.target)&&a()}function b(p){p.key==="Escape"&&(p.stopImmediatePropagation(),p.preventDefault(),a())}return document.addEventListener("mousedown",r),document.addEventListener("keydown",b,{capture:!0}),()=>{document.removeEventListener("mousedown",r),document.removeEventListener("keydown",b,{capture:!0})}},[a]),e.jsxs(e.Fragment,{children:[e.jsx("span",{ref:s,hidden:!0}),L.createPortal(e.jsx("div",{ref:c,"data-elm-portal":!0,"data-elm-theme":v?"dark":"light",onMouseDown:r=>r.stopPropagation(),[K]:"",style:{...y,position:"fixed",left:x.left,top:x.top,zIndex:9999},className:R.clsx("elm-kbd-on-surface bg-elm-surface/95 backdrop-blur-md text-(--elm-text-secondary,var(--color-gray-700)) dark:text-(--elm-text-secondary,var(--color-gray-200)) rounded-elm shadow-elm py-1.5 min-w-[180px] border border-elm-border/80 select-none",!v&&"elm-tooltip-light"),children:n.map((r,b)=>"separator"in r?e.jsx("div",{className:"my-1.5 border-t border-elm-border"},b):e.jsxs("button",{onClick:p=>{p.stopPropagation(),r.onClick(),a()},disabled:r.disabled,className:R.clsx("w-full text-left px-3 py-2 text-sm flex items-center gap-2.5",r.disabled?"opacity-40 cursor-not-allowed":"hover:bg-elm-surface-hover hover:text-(--elm-text,var(--color-gray-900)) dark:hover:text-(--elm-text,var(--color-gray-50))"),children:[r.icon&&e.jsx("span",{className:"flex-shrink-0 opacity-70",children:r.icon}),e.jsx("span",{className:"flex-1 truncate",children:r.label}),r.shortcut&&e.jsx("span",{className:"flex-shrink-0 ml-4 opacity-80",children:r.shortcut})]},b))}),document.body)]})}const z="w-full h-9 px-2.5 py-1.5 text-sm border rounded-elm-control focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent bg-elm-surface-raised text-(--elm-text,var(--color-gray-900)) dark:text-(--elm-text,var(--color-gray-100)) placeholder:text-(--elm-text-subtle,var(--color-gray-400)) dark:placeholder:text-(--elm-text-subtle,var(--color-gray-600))";function O({error:t,className:o,...n}){return e.jsx("input",{autoComplete:"off",className:R.clsx(z,t?"border-rose-400":"border-(--elm-border-strong,var(--color-gray-300))",o),...n})}function U({error:t,className:o,...n}){return e.jsx("textarea",{autoComplete:"off",className:R.clsx(z,"resize-none h-auto",t?"border-rose-400":"border-(--elm-border-strong,var(--color-gray-300))",o),...n})}function I({error:t,className:o,children:n,...a}){return e.jsxs("div",{className:"relative w-full",children:[e.jsx("select",{className:R.clsx(z,"appearance-none pr-8",t?"border-rose-400":"border-(--elm-border-strong,var(--color-gray-300))",o),...a,children:n}),e.jsx(A.CaretDown,{size:14,"aria-hidden":!0,className:"pointer-events-none absolute right-2.5 top-1/2 -translate-y-1/2 text-elm-text-muted"})]})}const G={primary:"bg-primary-500 text-white hover:bg-primary-600 disabled:hover:bg-primary-500",secondary:"bg-elm-surface-hover text-elm-text-secondary hover:bg-(--elm-surface-hover,var(--color-gray-200)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-700)) disabled:hover:bg-elm-surface-hover",ghost:"text-elm-text-muted hover:bg-elm-surface-hover hover:text-(--elm-text-secondary,var(--color-gray-700)) dark:hover:text-(--elm-text-secondary,var(--color-gray-300)) disabled:hover:bg-transparent",success:"bg-green-500 text-white hover:bg-green-600 disabled:hover:bg-green-500",emerald:"bg-emerald-500 text-white hover:bg-emerald-600 disabled:hover:bg-emerald-500",warning:"bg-amber-500 text-white hover:bg-amber-600 disabled:hover:bg-amber-500",dashed:"text-primary-500 hover:text-primary-700 hover:bg-(--elm-control-hover,color-mix(in_oklab,var(--color-black)_5%,transparent)) dark:hover:bg-(--elm-control-hover,color-mix(in_oklab,var(--color-white)_5%,transparent)) disabled:hover:bg-transparent border border-dashed border-primary-300 hover:border-primary-500 dark:text-primary-400 dark:border-primary-700 dark:hover:border-primary-500"},V={sm:"px-2 py-1 text-xs rounded-elm-card",md:"px-3 py-1.5 text-sm rounded-elm-control",icon:"w-7 h-7 rounded-elm-card","icon-sm":"w-6 h-6 rounded-elm-chip"},$=i.forwardRef(({variant:t="secondary",size:o="md",className:n,children:a,...c},x)=>e.jsx("button",{ref:x,className:R.clsx("transition-colors flex items-center justify-center gap-1.5","active:scale-[0.95] disabled:opacity-40 disabled:cursor-not-allowed disabled:active:scale-100",G[t],V[o],n),...c,children:a}));$.displayName="Button";function X({children:t}){return e.jsx("kbd",{className:"inline-flex items-center justify-center min-w-[1.25rem] h-5 px-1.5 text-[11px] font-medium font-elm rounded-elm-chip border border-elm-border-strong bg-(--elm-surface-hover,var(--color-gray-100)) dark:bg-(--elm-surface-hover,var(--color-gray-700)) text-elm-text-muted shadow-[0_1px_0_0_rgba(0,0,0,0.15)] dark:shadow-[0_1px_0_0_rgba(0,0,0,0.4)]",children:t})}function q({children:t}){return e.jsx("kbd",{className:"inline-flex items-center justify-center min-w-[1.25rem] h-4 px-1 text-[10px] font-medium font-elm rounded-elm-chip border border-(--_elm-kbd-border,var(--color-neutral-600)) bg-(--_elm-kbd-bg,var(--color-neutral-700)) text-(--_elm-kbd-text,var(--color-neutral-300)) in-[.elm-tooltip-light]:border-(--_elm-kbd-border,var(--color-neutral-300)) in-[.elm-tooltip-light]:bg-(--_elm-kbd-bg,var(--color-neutral-100)) in-[.elm-tooltip-light]:text-(--_elm-kbd-text,var(--color-neutral-600)) in-[.elm-tooltip-light]:shadow-[0_1px_0_0_rgba(0,0,0,0.12)] shadow-[0_1px_0_0_rgba(0,0,0,0.3)] leading-none",children:t})}function J({children:t}){return e.jsx("kbd",{className:"inline-flex items-center justify-center min-w-[1.25rem] h-5 px-1.5 text-[11px] font-medium font-elm rounded-elm-chip border border-primary-400 bg-primary-500 text-primary-100 shadow-[0_1px_0_0_rgba(0,0,0,0.2)]",children:t})}const w=8,k=8;function Q(t){return t==="top"?"bottom":t==="bottom"?"top":t==="left"?"right":"left"}function T({content:t,shortcut:o,side:n="top",multiline:a=!1,children:c}){const[x,g]=i.useState(!1),[s,v]=i.useState(null),[l,y]=i.useState(null),[r,b]=i.useState(!1),p=D.useAccentStyle(),j=i.useRef(null),d=i.useRef(null),h=i.useRef(null);i.useEffect(()=>()=>{h.current&&clearTimeout(h.current)},[]),i.useLayoutEffect(()=>{if(!x||!d.current||!s)return;const{width:u,height:f}=d.current.getBoundingClientRect(),m=window.innerWidth,E=window.innerHeight,C=S=>S==="top"?s.top-w-f>=k:S==="bottom"?s.bottom+w+f<=E-k:S==="left"?s.left-w-u>=k:s.right+w+u<=m-k,B=(()=>{const S=n==="top"||n==="bottom"?["right","left"]:["bottom","top"];return[n,Q(n),...S]})().find(C)??n;let _=0,N=0;B==="top"?(_=s.cx-u/2,N=s.top-w-f):B==="bottom"?(_=s.cx-u/2,N=s.bottom+w):B==="left"?(_=s.left-w-u,N=s.cy-f/2):(_=s.right+w,N=s.cy-f/2),_=Math.max(k,Math.min(_,m-u-k)),N=Math.max(k,Math.min(N,E-f-k)),y({left:Math.round(_),top:Math.round(N)})},[x,s,n]);function P(){h.current=setTimeout(()=>{var f,m,E,C;const u=(m=((f=j.current)==null?void 0:f.firstElementChild)??j.current)==null?void 0:m.getBoundingClientRect();u&&(y(null),v({left:u.left,top:u.top,right:u.right,bottom:u.bottom,cx:Math.round(u.left+u.width/2),cy:Math.round(u.top+u.height/2)}),b(((C=(E=j.current)==null?void 0:E.closest("[data-elm-theme]"))==null?void 0:C.getAttribute("data-elm-theme"))==="dark"),g(!0))},0)}function M(){h.current&&clearTimeout(h.current),g(!1)}return e.jsxs("div",{ref:j,onMouseEnter:P,onMouseLeave:M,className:"contents",children:[c,x&&L.createPortal(e.jsx("div",{ref:d,"data-elm-portal":!0,"data-elm-theme":r?"dark":"light",className:"fixed z-[9999] pointer-events-none",style:{...p,left:(l==null?void 0:l.left)??0,top:(l==null?void 0:l.top)??0,visibility:l?void 0:"hidden",animation:l?"tooltip-in 100ms ease":void 0},children:e.jsxs("div",{className:`flex items-center gap-1.5 px-2.5 py-1.5 text-xs rounded-elm-card shadow-elm backdrop-blur-sm ${a?"max-w-64 whitespace-normal leading-snug":"whitespace-nowrap"} bg-elm-tooltip/95 text-elm-tooltip-text elm-kbd-on-tooltip ${r?"elm-tooltip-light":""}`,children:[e.jsx("span",{children:t}),o&&e.jsx("span",{className:"flex items-center gap-0.5 opacity-60",children:o})]})}),document.body)]})}function Y(t){return t.split(",").map(c=>c.trim()).filter(Boolean).slice(1).filter(c=>!/^\d+$/.test(c)).slice(-2).join(", ")}const Z=i.forwardRef(function({results:o,loading:n,error:a,onGo:c,onAdd:x,onAddShape:g,activeIndex:s=-1,onHoverIndex:v,onNavigate:l,className:y,layout:r="stack"},b){const p=i.useRef([]),j=i.useRef([]);return i.useImperativeHandle(b,()=>({focusAdd(d){var h;(h=j.current[d])==null||h.focus()}})),i.useEffect(()=>{var d;s>=0&&((d=p.current[s])==null||d.scrollIntoView({block:"nearest"}))},[s]),e.jsxs("div",{className:y,children:[a&&e.jsx("p",{className:"px-3 py-2.5 text-sm text-rose-500",children:a}),!a&&n&&o.length===0&&e.jsx("p",{className:"px-3 py-2.5 text-sm text-(--elm-text-subtle,var(--color-gray-400))",children:"Searching…"}),!a&&!n&&o.length===0&&e.jsx("p",{className:"px-3 py-2.5 text-sm text-(--elm-text-subtle,var(--color-gray-400))",children:"No results found"}),!a&&o.map((d,h)=>{const P=d.geojson&&d.geojson.type!=="Point",M=e.jsxs(e.Fragment,{children:[e.jsx(T,{content:"Fly to location",children:e.jsxs("button",{onClick:m=>{m.stopPropagation(),c(d)},className:"flex-shrink-0 px-2 py-1 text-xs text-elm-text-muted hover:bg-(--elm-surface-hover,var(--color-gray-200)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-700)) dark:hover:text-(--elm-text-secondary,var(--color-gray-300)) rounded-elm-card flex items-center gap-1 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400 focus-visible:ring-offset-1 focus-visible:ring-offset-elm-surface",children:[e.jsx(A.ArrowUpRight,{size:12})," Go"]})}),x&&e.jsx(T,{content:"Add as point",children:e.jsxs("button",{ref:m=>{j.current[h]=m},onClick:m=>{m.stopPropagation(),x(d)},className:"flex-shrink-0 px-2 py-1 text-xs bg-primary-500 text-white hover:bg-primary-600 rounded-elm-card flex items-center gap-1 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-300 focus-visible:ring-offset-1 focus-visible:ring-offset-elm-surface",children:[e.jsx(A.Plus,{size:12})," Add"]})}),P&&g&&e.jsx(T,{content:"Add as boundary shape",children:e.jsxs("button",{onClick:m=>{m.stopPropagation(),g(d)},className:"flex-shrink-0 px-2 py-1 text-xs bg-emerald-500 text-white hover:bg-emerald-600 rounded-elm-card flex items-center gap-1 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-emerald-300 focus-visible:ring-offset-1 focus-visible:ring-offset-elm-surface",children:[e.jsx(A.Polygon,{size:12})," Shape"]})})]}),u=e.jsxs("div",{className:"flex items-center gap-1.5 min-w-0",children:[e.jsx("span",{className:"text-sm text-(--elm-text,var(--color-gray-800)) dark:text-(--elm-text,var(--color-gray-200)) font-medium truncate",children:d.display_name.split(",")[0]}),d.addresstype&&e.jsx("span",{className:"flex-shrink-0 text-[10px] font-medium px-1.5 py-0.5 rounded-full bg-elm-surface-hover text-elm-text-muted capitalize",children:d.addresstype.replace(/_/g," ")})]}),f=e.jsx("span",{className:"block text-xs text-elm-text-subtle mt-0.5 truncate",children:Y(d.display_name)});return e.jsx("div",{ref:m=>{p.current[h]=m},onClick:()=>c(d),onMouseEnter:()=>v==null?void 0:v(h),onKeyDown:m=>{m.key==="ArrowDown"?(m.preventDefault(),l==null||l(1,h)):m.key==="ArrowUp"&&(m.preventDefault(),l==null||l(-1,h))},className:r==="row"?`flex items-center gap-2 px-3 py-2 border-b border-elm-border-subtle last:border-b-0 transition-colors cursor-pointer ${h===s?"bg-primary-50 dark:bg-white/5":""}`:`flex flex-col gap-1.5 px-3 py-2 border-b border-elm-border-subtle last:border-b-0 transition-colors cursor-pointer ${h===s?"bg-primary-50 dark:bg-white/5":""}`,children:r==="row"?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[u,f]}),e.jsx("div",{className:"flex items-center gap-1 flex-shrink-0",children:M})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"min-w-0",children:[u,f]}),e.jsx("div",{className:"flex items-center gap-1 justify-start",children:M})]})},d.place_id)})]})}),H={blue:"bg-primary-500 hover:bg-primary-600 disabled:hover:bg-primary-500 text-white shadow-sm",emerald:"bg-emerald-500 hover:bg-emerald-600 disabled:hover:bg-emerald-500 text-white shadow-sm",amber:"bg-amber-500 hover:bg-amber-600 disabled:hover:bg-amber-500 text-white shadow-sm",violet:"bg-violet-500 hover:bg-violet-600 disabled:hover:bg-violet-500 text-white shadow-sm"};function ee(t,o){return o==="vertical"?t.endsWith("-right")||t.startsWith("right")?"left":"right":t.startsWith("bottom")?"top":"bottom"}function te({active:t,onClick:o,label:n,shortcut:a,shortcutId:c,color:x="blue",tooltipSide:g,disabled:s,children:v}){const l=D.useElementEditorConfig(),y=l.ui.keyboardShortcuts.enabled&&a,r=g??ee(l.toolbar.position,l.toolbar.direction);return e.jsx(T,{content:n,shortcut:y&&e.jsx(q,{children:a}),side:r,children:e.jsx("button",{"aria-label":n,"data-elm-shortcut":c,onClick:b=>{o(),b.currentTarget.blur()},disabled:s,className:R.clsx("p-1 text-sm rounded-elm-control flex items-center justify-center active:scale-[0.95] disabled:cursor-not-allowed disabled:text-elm-text-disabled disabled:active:scale-100",t?H[x]:"text-elm-text hover:bg-elm-control-hover disabled:hover:bg-transparent"),children:v})})}function re({vertical:t}={}){return t?e.jsx("div",{className:"h-px w-5 bg-elm-border my-0.5 flex-shrink-0"}):e.jsx("div",{className:"w-px h-5 bg-elm-border mx-1 flex-shrink-0"})}function oe({label:t,shortcut:o,shortcutId:n,onClick:a,active:c,disabled:x,tooltipSide:g="top",children:s}){const l=D.useElementEditorConfig().ui.keyboardShortcuts.enabled?o:void 0;return e.jsx(T,{content:t,shortcut:l,side:g,children:e.jsx("button",{"aria-label":t,"aria-pressed":c,"data-elm-shortcut":n,onClick:y=>{a(),y.currentTarget.blur()},disabled:x,className:`p-1 rounded-elm-control flex items-center justify-center text-sm
|
|
2
|
-
active:scale-[0.95] disabled:cursor-not-allowed disabled:text-elm-text-disabled disabled:active:scale-100
|
|
3
|
-
${c?"bg-primary-50 dark:bg-white/10 hover:bg-primary-100 dark:hover:bg-white/15 disabled:hover:bg-primary-50 dark:disabled:hover:bg-white/10 text-primary-600 dark:text-primary-400":"text-elm-text hover:bg-elm-control-hover disabled:hover:bg-transparent"}`,children:s})})}function se(){return e.jsx("div",{className:"w-px h-5 bg-elm-border mx-0.5 flex-shrink-0"})}exports.Button=$;exports.CONTEXT_MENU_MARKER_ATTR=K;exports.ContextMenu=W;exports.EditToolbarBtn=oe;exports.Input=O;exports.Kbd=X;exports.KbdDark=q;exports.KbdInvert=J;exports.SearchDropdown=Z;exports.SelectInput=I;exports.Textarea=U;exports.ToolButton=te;exports.ToolbarDivider=se;exports.ToolbarDivider$1=re;exports.Tooltip=T;exports.isContextMenuOpen=F;
|