@element-editor/ui 0.2.1 → 0.2.2

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.
Files changed (31) hide show
  1. package/AGENTS.md +1 -1
  2. package/dist/{BooleanOperations-BRO7NHUY.js → BooleanOperations-CUQDHcha.js} +1 -1
  3. package/dist/{BooleanOperations-C2uOHRu3.cjs → BooleanOperations-DrQS-3mJ.cjs} +1 -1
  4. package/dist/{DataTable-B-2VjBEz.cjs → DataTable-BPtIbZh4.cjs} +1 -1
  5. package/dist/{DataTable-CS-3dIqY.js → DataTable-Ce5P1HaO.js} +3 -3
  6. package/dist/{DataTablePanel-DDFUmMaM.js → DataTablePanel-DqS1lhWv.js} +1 -1
  7. package/dist/{DataTablePanel-58LwzXQR.cjs → DataTablePanel-PH5qtwrD.cjs} +1 -1
  8. package/dist/{FeatureEditModal-Cc8N6vei.cjs → FeatureEditModal-BNil19oc.cjs} +1 -1
  9. package/dist/{FeatureEditModal-Dr10p3nE.js → FeatureEditModal-DvdBiMck.js} +2 -2
  10. package/dist/{FeatureList-Bo9w9nre.js → FeatureList-DJTd3gEU.js} +2 -2
  11. package/dist/{FeatureList-VRYesXCq.cjs → FeatureList-F3BgjXro.cjs} +1 -1
  12. package/dist/{FeatureRowContextMenu-CtBqdC1j.cjs → FeatureRowContextMenu-Bw9Z6mpN.cjs} +1 -1
  13. package/dist/{FeatureRowContextMenu-DCUIiDwc.js → FeatureRowContextMenu-Dlsk7erC.js} +1 -1
  14. package/dist/{GeoJSONModal-BV9Tamf4.js → GeoJSONModal-BhHkqLAR.js} +2 -2
  15. package/dist/{GeoJSONModal-Dd-nBufy.cjs → GeoJSONModal-D6JBr9FA.cjs} +1 -1
  16. package/dist/{SchemaModal-gAuDkd-L.cjs → SchemaModal-5F0HBHGS.cjs} +1 -1
  17. package/dist/{SchemaModal-DvMbWskS.js → SchemaModal-CI5i_Kxh.js} +2 -2
  18. package/dist/{SettingsModal-BScVTjpn.js → SettingsModal-4OuBLPyW.js} +2 -2
  19. package/dist/{SettingsModal-CqaSFxxR.cjs → SettingsModal-au03oFaJ.cjs} +1 -1
  20. package/dist/{ShortcutsModal-D1Y2bGT8.cjs → ShortcutsModal-DBE-gSUi.cjs} +1 -1
  21. package/dist/{ShortcutsModal-ozuS2Ysb.js → ShortcutsModal-jGmjontP.js} +2 -2
  22. package/dist/contexts/ElementEditorConfigContext.d.cts +1 -1
  23. package/dist/contexts/ElementEditorConfigContext.d.ts +1 -1
  24. package/dist/element-editor-ui.cjs +1 -1
  25. package/dist/element-editor-ui.es.js +1 -1
  26. package/dist/index-mfb91TEp.cjs +1 -0
  27. package/dist/{index-CILw1Du5.js → index-rT-R0kyV.js} +1028 -988
  28. package/dist/{useWindowFocus-EemgNOuz.cjs → useWindowFocus-CRWNNxOL.cjs} +1 -1
  29. package/dist/{useWindowFocus-DuQVjnHE.js → useWindowFocus-CroxgGOo.js} +1 -1
  30. package/package.json +2 -2
  31. package/dist/index-DG4wEjGj.cjs +0 -1
package/AGENTS.md CHANGED
@@ -11,7 +11,7 @@ pnpm add @element-editor/ui @element-editor/adapter-maplibre maplibre-gl
11
11
  pnpm add @element-editor/ui @element-editor/adapter-leaflet leaflet react-leaflet # or Leaflet
12
12
  ```
13
13
 
14
- Peers: `react`, `react-dom` `^19.2.0`. This package has no stylesheet of its own: import the adapter's (`@element-editor/adapter-maplibre/style.css` plus `maplibre-gl/dist/maplibre-gl.css`, or `@element-editor/adapter-leaflet/style.css`). Keep all `@element-editor/*` packages on one version.
14
+ Peers: `react`, `react-dom` `^19.2.0`. This package has no stylesheet of its own: import the adapter's (`@element-editor/adapter-maplibre/style.css` plus `maplibre-gl/dist/maplibre-gl.css`, or `@element-editor/adapter-leaflet/style.css`). Keep all `@element-editor/*` packages on one version. On MapLibre GL JS 6 (what `maplibre-gl` installs today) your app must call MapLibre's `setWorkerUrl` before creating the map: see the MapLibre adapter's `AGENTS.md`.
15
15
 
16
16
  ## Entries
17
17
 
@@ -5,7 +5,7 @@ import { Spinner as C, UniteSquare as G, SubtractSquare as $, IntersectSquare as
5
5
  import { toast as y } from "sonner";
6
6
  import { ElementEditorError as B } from "@element-editor/core";
7
7
  import { freeGeometry as O } from "@element-editor/core/internal";
8
- import { c as T } from "./index-CILw1Du5.js";
8
+ import { c as T } from "./index-rT-R0kyV.js";
9
9
  function Q() {
10
10
  const { dataStore: f } = x(), c = b((e) => e.selectedIds), v = b((e) => e.features), n = w((e) => e.geometryProcessing), h = w((e) => e.setGeometryProcessing), i = L(), P = j(), I = z();
11
11
  if (c.length < 2) return null;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),r=require("./useAdapterControls-BBObhzVX.cjs"),g=require("./EditToolbarBtn-Ch9HCLHq.cjs"),l=require("@phosphor-icons/react"),h=require("sonner"),I=require("@element-editor/core"),M=require("@element-editor/core/internal"),U=require("./index-DG4wEjGj.cjs");function k(){const{dataStore:b}=r.useGeoStore(),u=r.useDataStore(e=>e.selectedIds),v=r.useDataStore(e=>e.features),i=r.useUIStore(e=>e.geometryProcessing),S=r.useUIStore(e=>e.setGeometryProcessing),a=r.useEmit(),w=r.useIsManaged(),P=r.useToasterId();if(u.length<2)return null;const j=new Map(v.map(e=>[e.id,e])),n=u.flatMap(e=>{const t=j.get(e);return t?[t]:[]}),c=n.every(e=>e.geometry.type==="Polygon"||e.geometry.type==="MultiPolygon"),x=n.every(e=>e.geometry.type==="LineString"||e.geometry.type==="MultiLineString"),y=n.every(e=>e.geometry.type==="Point"||e.geometry.type==="MultiPoint");if(y)return null;function p(e){b.getState().replaceFeatures(u,[{...n[0],id:crypto.randomUUID(),...M.freeGeometry(e)}])}function E(){const e=[];for(const t of n)t.geometry.type==="Point"?e.push(t.geometry.coordinates):t.geometry.type==="MultiPoint"&&e.push(...t.geometry.coordinates);p({type:"MultiPoint",coordinates:e}),a({type:"success",message:"Union completed"})}function q(){const e=[];for(const t of n)t.geometry.type==="LineString"?e.push(t.geometry.coordinates):t.geometry.type==="MultiLineString"&&e.push(...t.geometry.coordinates);p({type:"MultiLineString",coordinates:e}),a({type:"success",message:"Union completed"})}async function d(e){if(e==="union"&&y)return E();if(e==="union"&&x)return q();if(!c){a({type:"warning",message:"These work on areas only. Select just areas and try again."});return}if(i)return;const t=w?void 0:h.toast.loading("Working…",{toasterId:P});S(!0);try{const s=await U.runGeometryWorkerOperation({type:"boolean",op:e,features:n}),m=new Set(b.getState().features.map(f=>f.id));if(!u.every(f=>m.has(f)))throw new Error("a selected shape was removed while it ran");p(s),t!==void 0&&h.toast.dismiss(t),a({type:"success",message:`${e[0].toUpperCase()}${e.slice(1)} completed`})}catch(s){t!==void 0&&h.toast.dismiss(t);const m=s instanceof Error?s.message:void 0;a({type:"error",code:s instanceof I.ElementEditorError?s.code:"geometry",source:"geometry",message:m?`Failed to perform ${e}: ${m}`:`Failed to perform ${e}`,cause:s})}finally{S(!1)}}return o.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:[o.jsx(g.EditToolbarBtn,{label:"Union: join into one shape",onClick:()=>d("union"),disabled:!c&&!x&&!y||i,children:i?o.jsx(l.Spinner,{size:24,className:"animate-spin"}):o.jsx(l.UniteSquare,{size:24,weight:"duotone"})}),o.jsx(g.EditToolbarBtn,{label:"Subtract: cut the others out of the first selected",onClick:()=>d("subtract"),disabled:!c||i,children:o.jsx(l.SubtractSquare,{size:24,weight:"duotone"})}),o.jsx(g.EditToolbarBtn,{label:"Intersect: keep only the overlap",onClick:()=>d("intersect"),disabled:!c||i,children:o.jsx(l.IntersectSquare,{size:24,weight:"duotone"})}),o.jsx(g.EditToolbarBtn,{label:"Exclude: keep only what doesn't overlap",onClick:()=>d("exclude"),disabled:!c||i,children:o.jsx(l.ExcludeSquare,{size:24,weight:"duotone"})})]})}exports.default=k;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),r=require("./useAdapterControls-BBObhzVX.cjs"),g=require("./EditToolbarBtn-Ch9HCLHq.cjs"),l=require("@phosphor-icons/react"),h=require("sonner"),I=require("@element-editor/core"),M=require("@element-editor/core/internal"),U=require("./index-mfb91TEp.cjs");function k(){const{dataStore:b}=r.useGeoStore(),u=r.useDataStore(e=>e.selectedIds),v=r.useDataStore(e=>e.features),i=r.useUIStore(e=>e.geometryProcessing),S=r.useUIStore(e=>e.setGeometryProcessing),a=r.useEmit(),w=r.useIsManaged(),P=r.useToasterId();if(u.length<2)return null;const j=new Map(v.map(e=>[e.id,e])),n=u.flatMap(e=>{const t=j.get(e);return t?[t]:[]}),c=n.every(e=>e.geometry.type==="Polygon"||e.geometry.type==="MultiPolygon"),x=n.every(e=>e.geometry.type==="LineString"||e.geometry.type==="MultiLineString"),y=n.every(e=>e.geometry.type==="Point"||e.geometry.type==="MultiPoint");if(y)return null;function p(e){b.getState().replaceFeatures(u,[{...n[0],id:crypto.randomUUID(),...M.freeGeometry(e)}])}function E(){const e=[];for(const t of n)t.geometry.type==="Point"?e.push(t.geometry.coordinates):t.geometry.type==="MultiPoint"&&e.push(...t.geometry.coordinates);p({type:"MultiPoint",coordinates:e}),a({type:"success",message:"Union completed"})}function q(){const e=[];for(const t of n)t.geometry.type==="LineString"?e.push(t.geometry.coordinates):t.geometry.type==="MultiLineString"&&e.push(...t.geometry.coordinates);p({type:"MultiLineString",coordinates:e}),a({type:"success",message:"Union completed"})}async function d(e){if(e==="union"&&y)return E();if(e==="union"&&x)return q();if(!c){a({type:"warning",message:"These work on areas only. Select just areas and try again."});return}if(i)return;const t=w?void 0:h.toast.loading("Working…",{toasterId:P});S(!0);try{const s=await U.runGeometryWorkerOperation({type:"boolean",op:e,features:n}),m=new Set(b.getState().features.map(f=>f.id));if(!u.every(f=>m.has(f)))throw new Error("a selected shape was removed while it ran");p(s),t!==void 0&&h.toast.dismiss(t),a({type:"success",message:`${e[0].toUpperCase()}${e.slice(1)} completed`})}catch(s){t!==void 0&&h.toast.dismiss(t);const m=s instanceof Error?s.message:void 0;a({type:"error",code:s instanceof I.ElementEditorError?s.code:"geometry",source:"geometry",message:m?`Failed to perform ${e}: ${m}`:`Failed to perform ${e}`,cause:s})}finally{S(!1)}}return o.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:[o.jsx(g.EditToolbarBtn,{label:"Union: join into one shape",onClick:()=>d("union"),disabled:!c&&!x&&!y||i,children:i?o.jsx(l.Spinner,{size:24,className:"animate-spin"}):o.jsx(l.UniteSquare,{size:24,weight:"duotone"})}),o.jsx(g.EditToolbarBtn,{label:"Subtract: cut the others out of the first selected",onClick:()=>d("subtract"),disabled:!c||i,children:o.jsx(l.SubtractSquare,{size:24,weight:"duotone"})}),o.jsx(g.EditToolbarBtn,{label:"Intersect: keep only the overlap",onClick:()=>d("intersect"),disabled:!c||i,children:o.jsx(l.IntersectSquare,{size:24,weight:"duotone"})}),o.jsx(g.EditToolbarBtn,{label:"Exclude: keep only what doesn't overlap",onClick:()=>d("exclude"),disabled:!c||i,children:o.jsx(l.ExcludeSquare,{size:24,weight:"duotone"})})]})}exports.default=k;
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),h=require("react"),X=require("react-data-grid"),S=require("@phosphor-icons/react"),g=require("./useAdapterControls-BBObhzVX.cjs"),ne=require("zustand/react/shallow"),ae=require("@element-editor/core"),oe=require("@element-editor/core/internal"),Y=require("./EditToolbarBtn-Ch9HCLHq.cjs"),se=require("./FeatureRowContextMenu-CtBqdC1j.cjs"),le=require("./useContextMenu-DbxMvb1s.cjs"),k=require("./index-DG4wEjGj.cjs"),ie=new Intl.Collator(void 0,{numeric:!0}),ce=new Set(["_id","_type","_size","_schemaId","_schemaName","_lat","_lng"]);function O(a){const u=new Set,c=[];for(const i of a)for(const d of i.fields)u.has(d.key)||(u.add(d.key),c.push(d));return c}function ue(a){const u=i=>`${i} point${i===1?"":"s"}`,c=(i,d)=>`${i} part${i===1?"":"s"} · ${u(d)}`;switch(a.type){case"Point":return"";case"MultiPoint":return u(a.coordinates.length);case"LineString":return u(a.coordinates.length);case"Polygon":return u(a.coordinates[0].length-1);case"MultiLineString":return c(a.coordinates.length,a.coordinates.reduce((i,d)=>i+d.length,0));case"MultiPolygon":return c(a.coordinates.length,a.coordinates.reduce((i,d)=>i+d[0].length-1,0));case"GeometryCollection":return`${a.geometries.length} part${a.geometries.length===1?"":"s"}`;default:return""}}function de({type:a}){return o.jsxs("span",{className:"flex items-center gap-1.5 flex-shrink-0 text-elm-text-secondary",children:[o.jsx("span",{className:"text-(--elm-text-subtle,var(--color-gray-400)) flex-shrink-0",children:o.jsx(k.GeometryTypeIcon,{type:a,size:16})}),o.jsx("span",{className:"text-sm",children:k.geometryTypeLabel(a)})]})}function U({row:a,column:u,onRowChange:c,onClose:i}){return o.jsx("input",{autoFocus:!0,type:"number",step:"any",className:"rdg-text-editor w-full h-full border-0 outline-none px-2 text-sm font-elm-mono bg-transparent text-inherit caret-primary-500",value:String(a[u.key]??""),onChange:d=>c({...a,[u.key]:d.target.value}),onBlur:()=>i(!0)})}function Q({checked:a,label:u,disabled:c,onToggle:i,autoFocus:d}){return o.jsx("span",{className:"flex h-full items-center px-0.5",children:o.jsx("button",{type:"button",role:"switch","aria-checked":a,"aria-label":u,tabIndex:-1,autoFocus:d,disabled:c,onClick:f=>{f.stopPropagation(),i()},className:`relative inline-flex h-4 w-7 flex-shrink-0 items-center rounded-full outline-none disabled:cursor-default enabled:cursor-pointer
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),h=require("react"),X=require("react-data-grid"),S=require("@phosphor-icons/react"),g=require("./useAdapterControls-BBObhzVX.cjs"),ne=require("zustand/react/shallow"),ae=require("@element-editor/core"),oe=require("@element-editor/core/internal"),Y=require("./EditToolbarBtn-Ch9HCLHq.cjs"),se=require("./FeatureRowContextMenu-Bw9Z6mpN.cjs"),le=require("./useContextMenu-DbxMvb1s.cjs"),k=require("./index-mfb91TEp.cjs"),ie=new Intl.Collator(void 0,{numeric:!0}),ce=new Set(["_id","_type","_size","_schemaId","_schemaName","_lat","_lng"]);function O(a){const u=new Set,c=[];for(const i of a)for(const d of i.fields)u.has(d.key)||(u.add(d.key),c.push(d));return c}function ue(a){const u=i=>`${i} point${i===1?"":"s"}`,c=(i,d)=>`${i} part${i===1?"":"s"}, ${u(d)}`;switch(a.type){case"Point":return"";case"MultiPoint":return u(a.coordinates.length);case"LineString":return u(a.coordinates.length);case"Polygon":return u(a.coordinates[0].length-1);case"MultiLineString":return c(a.coordinates.length,a.coordinates.reduce((i,d)=>i+d.length,0));case"MultiPolygon":return c(a.coordinates.length,a.coordinates.reduce((i,d)=>i+d[0].length-1,0));case"GeometryCollection":return`${a.geometries.length} part${a.geometries.length===1?"":"s"}`;default:return""}}function de({type:a}){return o.jsxs("span",{className:"flex items-center gap-1.5 flex-shrink-0 text-elm-text-secondary",children:[o.jsx("span",{className:"text-(--elm-text-subtle,var(--color-gray-400)) flex-shrink-0",children:o.jsx(k.GeometryTypeIcon,{type:a,size:16})}),o.jsx("span",{className:"text-sm",children:k.geometryTypeLabel(a)})]})}function U({row:a,column:u,onRowChange:c,onClose:i}){return o.jsx("input",{autoFocus:!0,type:"number",step:"any",className:"rdg-text-editor w-full h-full border-0 outline-none px-2 text-sm font-elm-mono bg-transparent text-inherit caret-primary-500",value:String(a[u.key]??""),onChange:d=>c({...a,[u.key]:d.target.value}),onBlur:()=>i(!0)})}function Q({checked:a,label:u,disabled:c,onToggle:i,autoFocus:d}){return o.jsx("span",{className:"flex h-full items-center px-0.5",children:o.jsx("button",{type:"button",role:"switch","aria-checked":a,"aria-label":u,tabIndex:-1,autoFocus:d,disabled:c,onClick:f=>{f.stopPropagation(),i()},className:`relative inline-flex h-4 w-7 flex-shrink-0 items-center rounded-full outline-none disabled:cursor-default enabled:cursor-pointer
2
2
  ${a?"bg-primary-500":"bg-elm-border"} ${c?"opacity-50":"opacity-90 enabled:hover:opacity-100"}`,children:o.jsx("span",{"aria-hidden":!0,className:`absolute left-[2px] top-[2px] h-3 w-3 rounded-full border bg-white ${a?"border-white":"border-(--elm-border-strong,var(--color-gray-300))"}`,style:{transform:a?"translateX(12px)":void 0}})})})}function J(a){return function({row:c,column:i,onRowChange:d,onClose:f}){const j=String(c[i.key]??"");if(a.type==="boolean"){const y=k.readBooleanValue(c[i.key]);return o.jsx("div",{className:"w-full h-full px-2",onBlur:()=>f(!0),children:o.jsx(Q,{autoFocus:!0,checked:y,label:a.label,onToggle:()=>d({...c,[i.key]:!y})})})}if(a.type==="select"&&a.options)return o.jsxs("div",{className:"relative w-full h-full",children:[o.jsxs("select",{autoFocus:!0,className:"rdg-text-editor w-full h-full border-0 outline-none pl-2 pr-7 text-sm bg-transparent text-inherit appearance-none",value:j,onChange:y=>d({...c,[i.key]:y.target.value}),onBlur:()=>f(!0),children:[o.jsx("option",{value:"",children:"—"}),a.options.map(y=>o.jsx("option",{value:y,children:y},y))]}),o.jsx(S.CaretDown,{size:12,"aria-hidden":!0,className:"pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 opacity-60"})]});const m=a.type==="number"?"number":a.type==="date"?"date":a.type==="url"?"url":"text";return o.jsx("input",{autoFocus:!0,type:m,className:"rdg-text-editor w-full h-full border-0 outline-none px-2 text-sm bg-transparent text-inherit caret-primary-500",value:j,onChange:y=>d({...c,[i.key]:y.target.value}),onBlur:()=>f(!0)})}}function C(a){return o.jsx("span",{className:"block w-0 min-w-full truncate",children:a})}function me({sortDirection:a,priority:u}){if(!a)return null;const c=a==="ASC"?S.ArrowUp:S.ArrowDown;return o.jsxs("span",{className:"flex h-full items-center gap-0.5 pl-1",children:[o.jsx(c,{size:12,className:"shrink-0","aria-hidden":!0}),u!==void 0&&u>1&&o.jsx("span",{className:"text-[10px] leading-none opacity-60",children:u})]})}function pe({schemaFilter:a,focusRowId:u,onFocusRowHandled:c,selectedRows:i,onSelectedRowsChange:d}){const f=g.useDataStore(e=>e.features),j=g.useDataStore(e=>e.groups),m=g.useDataStore(ne.useShallow(e=>e.getVisibleSchemas())),y=g.useDataStore(e=>e.selectFeature),P=g.useDataStore(e=>e.updateFeature),q=g.useDataStore(e=>e.deleteFeature),b=g.useUIStore(e=>e.readonly),I=g.useDataStore(e=>e.selectedIds),{panTo:T,fitBounds:E}=g.useMapController(),$=g.useTheme(),F=h.useRef(null),{dataStore:_}=g.useGeoStore(),L=g.useEmit(),v=le.useContextMenu(),[M,Z]=h.useState([]),N=h.useMemo(()=>{if(a==="all")return O(m);const e=m.find(t=>t.id===a);return e?e.fields:O(m)},[m,a]),K=h.useMemo(()=>{const e={};for(const t of m)e[t.id]=t.name;return e},[m]),A=h.useMemo(()=>{var s;const e=new Map,t=[];for(const l of f){if(!l.groupId){t.push(l);continue}const p=e.get(l.groupId);p?p.push(l):e.set(l.groupId,[l])}const r=[...j.flatMap(l=>e.get(l.id)??[]),...t];if(a==="all")return r;const n=(s=m[0])==null?void 0:s.id;return r.filter(l=>(l.schemaId??n)===a)},[f,j,m,a]),w=h.useMemo(()=>A.map(e=>{var s,l;let t="",r="";if(e.geometry.type==="Point"){const[p,x]=e.geometry.coordinates;t=String(x),r=String(p)}const n=e.schemaId??((s=m[0])==null?void 0:s.id)??"";return{_id:e.id,_type:e.geometry.type,_size:ue(e.geometry),_schemaId:n,_schemaName:K[n]??((l=m[0])==null?void 0:l.name)??"",_lat:t,_lng:r,...e.properties}}),[A,K,m]),z=h.useMemo(()=>new Set(N.filter(e=>e.type==="boolean").map(e=>e.key)),[N]),B=h.useMemo(()=>{if(M.length===0)return w;const e=(t,r)=>z.has(r)?k.readBooleanValue(t[r])?"1":"0":String(t[r]??"");return[...w].sort((t,r)=>{for(const n of M){const s=e(t,n.columnKey),l=e(r,n.columnKey),p=ie.compare(s,l);if(p!==0)return n.direction==="ASC"?p:-p}return 0})},[w,M,z]),V=h.useMemo(()=>w.some(e=>e._type==="Point"),[w]),G=h.useCallback((e,t)=>{var s;if(b)return;const r=_.getState(),n=r.features.find(l=>l.id===e);n&&r.updateFeatures([{id:e,patch:{properties:{...n.properties,[t]:!k.readBooleanValue((s=n.properties)==null?void 0:s[t])}}}])},[_,b]),W=h.useMemo(()=>{const e=[X.SelectColumn,{key:"_type",name:C("Type"),width:150,resizable:!0,sortable:!0,renderCell:({row:t})=>o.jsxs("span",{className:"flex items-center gap-2 min-w-0",children:[o.jsx(de,{type:t._type}),t._size&&o.jsx("span",{className:"truncate text-xs text-elm-text-muted",children:t._size})]})}];m.length>1&&e.push({key:"_schemaName",name:C("Schema"),width:100,resizable:!0,sortable:!0,editable:!0,renderCell:({row:t})=>o.jsx("span",{className:"inline-block px-1.5 py-0.5 rounded-elm-chip bg-elm-surface-hover text-(--elm-text-secondary,var(--color-gray-600)) dark:text-(--elm-text-secondary,var(--color-gray-300)) text-[10px] font-medium",children:t._schemaName}),renderEditCell:({row:t,onRowChange:r,onClose:n})=>o.jsxs("div",{className:"relative w-full h-full",children:[o.jsx("select",{autoFocus:!0,className:"rdg-text-editor w-full h-full border-0 outline-none pl-2 pr-7 text-sm appearance-none",value:t._schemaId,onChange:s=>{const l=m.find(p=>p.id===s.target.value);l&&r({...t,_schemaId:l.id,_schemaName:l.name})},onBlur:()=>n(!0),children:m.map(s=>o.jsx("option",{value:s.id,children:s.name},s.id))}),o.jsx(S.CaretDown,{size:12,"aria-hidden":!0,className:"pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 opacity-60"})]})}),V&&e.push({key:"_lat",name:C("Lat"),width:110,resizable:!0,sortable:!0,editable:t=>t._type==="Point",renderCell:({row:t})=>o.jsx("span",{className:"font-elm-mono text-xs text-(--elm-text-secondary,var(--color-gray-600)) dark:text-(--elm-text-secondary,var(--color-gray-300))",children:t._lat}),renderEditCell:U},{key:"_lng",name:C("Lng"),width:110,resizable:!0,sortable:!0,editable:t=>t._type==="Point",renderCell:({row:t})=>o.jsx("span",{className:"font-elm-mono text-xs text-(--elm-text-secondary,var(--color-gray-600)) dark:text-(--elm-text-secondary,var(--color-gray-300))",children:t._lng}),renderEditCell:U});for(const t of N){if(t.type==="boolean"){e.push({key:t.key,name:C(t.label),minWidth:80,resizable:!0,sortable:!0,editable:!0,renderCell:({row:r})=>o.jsx(Q,{checked:k.readBooleanValue(r[t.key]),label:t.label,disabled:b,onToggle:()=>G(r._id,t.key)}),renderEditCell:J(t)});continue}e.push({key:t.key,name:C(t.label),...t.key==="name"&&{width:200},minWidth:80,resizable:!0,sortable:!0,editable:!0,renderEditCell:J(t)})}return e.push({key:"_spacer",name:"",minWidth:0,width:"minmax(0, 1fr)",resizable:!1,sortable:!1,renderCell:()=>null}),e.push({key:"_delete",name:"",width:36,resizable:!1,sortable:!1,renderHeaderCell:()=>i.size>0?o.jsx("div",{className:"w-full h-full flex items-center justify-center",children:o.jsx(Y.Tooltip,{content:`Delete ${i.size} selected`,children:o.jsx("button",{"aria-label":`Delete ${i.size} selected`,onMouseDown:t=>t.stopPropagation(),onClick:t=>{t.stopPropagation();const r=_.getState(),n=i.size;r.setSelection([...i]),r.deleteSelection(),d(new Set),L({type:"features:deleted",count:n,undo:()=>_.getState().undo()})},className:"w-7 h-7 rounded-elm-control flex items-center justify-center text-(--elm-text-secondary,var(--color-gray-600)) dark:text-(--elm-text-secondary,var(--color-gray-300)) hover:bg-(--elm-surface-hover,var(--color-gray-100)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-700)) hover:text-(--elm-text-secondary,var(--color-gray-700)) dark:hover:text-(--elm-text-secondary,var(--color-gray-200)) transition-colors",children:o.jsx(S.Trash,{size:16})})})}):null,renderCell:({row:t})=>o.jsx("div",{className:"w-full h-full flex items-center justify-center",children:o.jsx(Y.Tooltip,{content:"Delete row",children:o.jsx("button",{onMouseDown:r=>r.stopPropagation(),onClick:r=>{r.stopPropagation(),q(t._id)},className:"w-7 h-7 rounded-elm-control flex items-center justify-center text-elm-text hover:bg-(--elm-surface-hover,var(--color-gray-100)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-700)) transition-colors",children:o.jsx(S.Trash,{size:16})})})})}),b?e.filter(t=>t.key!=="_delete").map(t=>({...t,editable:!1})):e},[N,m.length,V,q,i,d,_,L,b,G]);h.useEffect(()=>{if(!u)return;const e=B.findIndex(r=>r._id===u);if(e===-1)return;const t=W.findIndex(r=>r.key==="_lat");t!==-1&&requestAnimationFrame(()=>{var r;(r=F.current)==null||r.selectCell({rowIdx:e,idx:t},{enableEditor:!0}),c==null||c()})},[u]),h.useEffect(()=>{var t;if(I.length===0)return;const e=B.findIndex(r=>r._id===I[0]);e!==-1&&((t=F.current)==null||t.scrollToCell({rowIdx:e}))},[I]);function H(e,{indexes:t}){var p;if(b)return;const r=e[t[0]],n={};for(const[x,D]of Object.entries(r))ce.has(x)||(n[x]=D);const s=f.find(x=>x.id===r._id),l=(s==null?void 0:s.schemaId)??((p=m[0])==null?void 0:p.id)??"";if(r._schemaId!==l){P(r._id,{schemaId:r._schemaId,properties:n});return}if((s==null?void 0:s.geometry.type)==="Point"){const x=parseFloat(r._lat),D=parseFloat(r._lng),[te,re]=s.geometry.coordinates;if(!isNaN(x)&&!isNaN(D)&&(x!==re||D!==te)){_.getState().takeSnapshot(),P(r._id,{geometry:{type:"Point",coordinates:oe.withXY(s.geometry.coordinates,[D,x])},properties:n});return}}P(r._id,{properties:n})}function R({row:e,column:t},r){const n=r.clipboardData.getData("text/plain").split(/\r?\n/)[0].split(" ")[0].trim();if(!n||b)return e;if(t.key==="_schemaName"){const l=m.find(p=>p.name===n||p.id===n);return l?{...e,_schemaId:l.id,_schemaName:l.name}:e}if(t.key==="_lat"||t.key==="_lng")return Number.isFinite(Number(n))?{...e,[t.key]:n}:e;const s=N.find(l=>l.key===t.key);if((s==null?void 0:s.type)==="boolean"){const l=k.parseBooleanText(n);return l===null?e:{...e,[t.key]:l}}return(s==null?void 0:s.type)==="number"?Number.isFinite(Number(n))?{...e,[t.key]:n}:e:(s==null?void 0:s.type)==="select"&&s.options&&!s.options.includes(n)?e:{...e,[t.key]:n}}function ee(e){if(d(e),e.size!==1)return;const t=[...e][0];y(t);const r=f.find(n=>n.id===t);if(r)if(r.geometry.type==="Point"){const[n,s]=r.geometry.coordinates;T==null||T([s,n])}else E==null||E(r.bbox||ae.getGeometryBBox(r.geometry))}return o.jsxs("div",{className:"contents",onMouseDown:e=>{e.detail>=2&&!e.target.closest("input, select, textarea")&&e.preventDefault()},children:[o.jsx(X.DataGrid,{ref:F,columns:W,rows:B,rowKeyGetter:e=>e._id,rowClass:e=>I.includes(e._id)?"elm-row-active":void 0,onRowsChange:H,renderers:{renderSortStatus:me},sortColumns:M,onSortColumnsChange:Z,selectedRows:i,onSelectedRowsChange:ee,onCellPaste:R,onCellKeyDown:({mode:e,row:t,column:r},n)=>{e!=="SELECT"||!z.has(r.key)||n.key===" "&&n.shiftKey||(n.key===" "||n.key==="Enter"?(n.preventGridDefault(),n.preventDefault(),G(t._id,r.key)):n.key.length===1&&!n.ctrlKey&&!n.metaKey&&!n.altKey&&n.preventGridDefault())},onCellDoubleClick:({column:e},t)=>{z.has(e.key)&&t.preventGridDefault()},onCellContextMenu:({row:e},t)=>{const r=f.find(n=>n.id===e._id);r&&(t.preventGridDefault(),t.preventDefault(),v.open(t.clientX,t.clientY,r))},className:$==="dark"?"rdg-dark":"rdg-light",style:{...$==="dark"?{"--rdg-color":"var(--elm-text, #e5e5e5)","--rdg-border-color":"var(--elm-border, #404040)","--rdg-selection-color":"var(--color-primary-400)"}:{"--rdg-color":"var(--elm-text, #000)","--rdg-border-color":"var(--elm-border, #ddd)","--rdg-selection-color":"var(--color-primary-500)"},"--rdg-background-color":"transparent","--rdg-header-background-color":"var(--elm-surface, var(--_elm-surface))","--elm-rdg-sticky-bg":"var(--elm-surface, var(--_elm-surface))",blockSize:"100%","--rdg-row-hover-background-color":"var(--elm-row-hover)","--rdg-row-selected-background-color":"var(--elm-row-checked)","--rdg-row-selected-hover-background-color":"var(--elm-row-checked-hover)"}}),v.state&&o.jsx(se.FeatureRowContextMenu,{x:v.state.x,y:v.state.y,feature:f.find(e=>e.id===v.state.data.id)??v.state.data,onClose:v.close,showGrouping:!1})]})}exports.default=pe;
@@ -7,9 +7,9 @@ import { useShallow as ge } from "zustand/react/shallow";
7
7
  import { getGeometryBBox as be } from "@element-editor/core";
8
8
  import { withXY as xe } from "@element-editor/core/internal";
9
9
  import { f as q } from "./EditToolbarBtn-SR4xHd8G.js";
10
- import { F as ke } from "./FeatureRowContextMenu-DCUIiDwc.js";
10
+ import { F as ke } from "./FeatureRowContextMenu-Dlsk7erC.js";
11
11
  import { u as ve } from "./useContextMenu-DJ2Cti85.js";
12
- import { f as E, h as _e, j as Ce, k as Ne } from "./index-CILw1Du5.js";
12
+ import { f as E, h as _e, j as Ce, k as Ne } from "./index-rT-R0kyV.js";
13
13
  const Se = new Intl.Collator(void 0, { numeric: !0 }), we = /* @__PURE__ */ new Set(["_id", "_type", "_size", "_schemaId", "_schemaName", "_lat", "_lng"]);
14
14
  function O(a) {
15
15
  const c = /* @__PURE__ */ new Set(), d = [];
@@ -19,7 +19,7 @@ function O(a) {
19
19
  return d;
20
20
  }
21
21
  function Ie(a) {
22
- const c = (i) => `${i} point${i === 1 ? "" : "s"}`, d = (i, u) => `${i} part${i === 1 ? "" : "s"} · ${c(u)}`;
22
+ const c = (i) => `${i} point${i === 1 ? "" : "s"}`, d = (i, u) => `${i} part${i === 1 ? "" : "s"}, ${c(u)}`;
23
23
  switch (a.type) {
24
24
  case "Point":
25
25
  return "";
@@ -1,6 +1,6 @@
1
1
  import { jsxs as d, jsx as t, Fragment as re } from "react/jsx-runtime";
2
2
  import { e as oe, u as c, f as W, g as ne } from "./useAdapterControls-DVjkwRZ_.js";
3
- import { s as ae, r as se, p as le, N as ie, D as ce, a as ue } from "./index-CILw1Du5.js";
3
+ import { s as ae, r as se, p as le, N as ie, D as ce, a as ue } from "./index-rT-R0kyV.js";
4
4
  import { useState as i, useEffect as I, useRef as v, useCallback as H, Suspense as de, useLayoutEffect as me } from "react";
5
5
  import { clsx as D } from "clsx";
6
6
  import { Plus as fe, ArrowsInSimple as he, ArrowsOutSimple as pe, X as ge } from "@phosphor-icons/react";
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),o=require("./useAdapterControls-BBObhzVX.cjs"),d=require("./index-DG4wEjGj.cjs"),r=require("react"),R=require("clsx"),S=require("@phosphor-icons/react"),Z=require("zustand/react/shallow"),ee=require("@element-editor/core/internal"),te=require("./useAccentStyle-hsGvyHZc.cjs"),E=require("./EditToolbarBtn-Ch9HCLHq.cjs"),re=160,se=80;try{CSS.registerProperty({name:"--elm-table-offset",syntax:"<length>",inherits:!0,initialValue:"0px"})}catch{}const M="px-2.5 py-1 rounded-elm-control text-xs font-medium bg-elm-surface text-elm-text ring-1 ring-primary-400 outline-none";function ne({initialValue:a,onCommit:m,onCancel:v}){const[s,f]=r.useState(a),y=r.useRef(null),[h,w]=r.useState(void 0);return r.useLayoutEffect(()=>{const n=y.current;n&&w(n.offsetWidth+4)},[s]),t.jsxs(t.Fragment,{children:[t.jsx("span",{ref:y,"aria-hidden":!0,className:`${M} absolute invisible pointer-events-none whitespace-pre left-[-9999px] top-[-9999px]`,children:s||" "}),t.jsx("input",{autoFocus:!0,value:s,onFocus:n=>n.currentTarget.select(),onChange:n=>f(n.target.value),onBlur:()=>m(s.trim()),onKeyDown:n=>{n.key==="Enter"&&n.currentTarget.blur(),n.key==="Escape"&&(v(),n.preventDefault())},style:{width:h},className:M})]})}const B=`flex ${d.panelHeaderIconBtn.replace("hover:bg-(--elm-surface-hover,var(--color-gray-100))","hover:bg-(--elm-surface-hover,var(--color-gray-200))")}`;function oe({embedded:a=!1}={}){const{dataStore:m}=o.useGeoStore(),v=te.useElementEditorConfig(),s=o.useUIStore(e=>e.tableOpen),f=o.useUIStore(e=>e.readonly),y=o.useUIStore(e=>e.toggleTable),h=o.useUIStore(e=>e.setTableFullscreen),w=o.useUIStore(ee.sidebarTakesSpace),n=o.useUIStore(e=>e.sidebarWidth),$=o.useUIStore(e=>e.codeDockWidth),V=v.ui.layerList&&w,j=o.useDataStore(e=>e.features.length),F=o.useDataStore(Z.useShallow(e=>e.getVisibleSchemas())),{getCenter:I}=o.useMapController(),[g,W]=r.useState(()=>typeof window>"u"?360:Math.round(window.innerHeight*.42)),[x,L]=r.useState("all"),[i,O]=r.useState(!1);r.useEffect(()=>(h(i),()=>h(!1)),[i,h]);const[_,N]=r.useState(null),[C,G]=r.useState(new Set),[X,T]=r.useState(null),H=r.useRef(!1);(s||a)&&(H.current=!0);const[D,P]=r.useState(!s);r.useEffect(()=>{if(s){P(!1);return}const e=setTimeout(()=>P(!0),200);return()=>clearTimeout(e)},[s]);const u=r.useRef(null),K=r.useCallback(e=>{e.button===0&&(e.preventDefault(),e.currentTarget.setPointerCapture(e.pointerId),u.current=d.startDragShield("row-resize",e.currentTarget))},[]),Y=r.useCallback(e=>{if(!u.current)return;const c=Math.round(window.innerHeight*se/100),l=Math.min(c,Math.max(re,window.innerHeight-e.clientY));W(l)},[]),A=r.useCallback(()=>{var e;(e=u.current)==null||e.call(u),u.current=null},[]),q=r.useRef(null);r.useEffect(()=>{var l;if(a)return;const e=(l=q.current)==null?void 0:l.closest("[data-elm-theme]");if(!e)return;const c=s?i?e.clientHeight:g:0;return e.style.setProperty("--elm-table-offset",`${c}px`),e.style.transition||requestAnimationFrame(()=>{e.style.transition="--elm-table-offset 200ms ease"}),()=>{e.style.setProperty("--elm-table-offset","0px")}},[a,s,i,g]);const J=a?"absolute inset-0 bg-elm-surface flex flex-col":R.clsx("absolute left-0 z-20 bg-elm-surface border-t border-elm-border/80 flex flex-col transition-[right] duration-200 ease-[ease]",!s&&D&&"invisible"),Q=a?void 0:i?{top:0,bottom:0,right:0,height:"100%"}:{height:g,bottom:`calc(min(var(--elm-table-offset, 0px), ${g}px) - ${g}px)`,right:(V?n:0)+$};return t.jsxs("div",{ref:q,className:J,style:Q,children:[!a&&!i&&t.jsx("div",{className:d.resizeEdgeTop,onPointerDown:K,onPointerMove:Y,onPointerUp:A,onLostPointerCapture:A}),t.jsxs("div",{className:`${d.panelHeaderBar} gap-3 px-4`,children:[!f&&t.jsx(E.Tooltip,{content:"Add new entry",children:t.jsxs(E.Button,{variant:"primary",size:"sm",onClick:()=>{const e=(I==null?void 0:I())??[0,0],{schemas:c,getDefaultSchema:l}=m.getState(),k=x!=="all"&&c.find(b=>b.id===x)?x:l().id,p=c.find(b=>b.id===k)??l(),U={};for(const b of p.fields)U[b.key]="";const z=crypto.randomUUID();m.getState().addFeature({type:"Feature",id:z,schemaId:k,geometry:{type:"Point",coordinates:e},properties:U})&&N(z)},children:[t.jsx(S.Plus,{size:11,weight:"bold"}),"Add new"]})}),t.jsxs("span",{className:"text-xs text-elm-text-muted",children:[j," feature",j!==1?"s":"",C.size>0&&`, ${C.size} selected`]}),F.length>1&&t.jsx("div",{role:"tablist","aria-label":"Filter by schema",className:"ml-1 flex items-center gap-0.5 text-xs",children:[{id:"all",name:"All"},...F].map(e=>{const c=x===e.id,l=e.id==="all";return X===e.id?t.jsx(ne,{initialValue:e.name,onCommit:p=>{p&&p!==e.name&&m.getState().updateSchema(e.id,{name:p}),T(null)},onCancel:()=>T(null)},e.id):t.jsx("button",{type:"button",role:"tab","aria-selected":c,onClick:()=>L(e.id),onDoubleClick:()=>{!l&&!f&&T(e.id)},title:l||f?void 0:"Double-click to rename",className:R.clsx("px-2.5 py-1 rounded-elm-control transition-colors whitespace-nowrap",c?"bg-elm-surface hover:bg-(--elm-surface-hover,var(--color-gray-50)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-800)) text-elm-text font-medium shadow-sm ring-1 ring-(--elm-border,var(--color-gray-200)) dark:ring-(--elm-border,var(--color-gray-700))":"text-(--elm-text-secondary,var(--color-gray-600)) dark:text-(--elm-text-secondary,var(--color-gray-300)) hover:bg-(--elm-surface-hover,var(--color-gray-200)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-700))"),children:e.name},e.id)})}),!a&&t.jsxs("div",{className:"ml-auto flex items-center gap-1",children:[t.jsx(E.Tooltip,{content:i?"Exit fullscreen":"Fullscreen",children:t.jsx("button",{type:"button",onClick:()=>O(e=>!e),"aria-label":i?"Exit fullscreen":"Fullscreen",className:B,children:i?t.jsx(S.ArrowsInSimple,{size:16}):t.jsx(S.ArrowsOutSimple,{size:16})})}),t.jsx("button",{type:"button",onClick:y,"aria-label":"Close data table",className:B,children:t.jsx(S.X,{size:16})})]})]}),t.jsx("div",{className:R.clsx("flex-1 min-h-0 overflow-hidden",!a&&!s&&D&&"hidden"),children:j===0?t.jsx(d.NoFeaturesEmptyState,{}):H.current&&t.jsx(r.Suspense,{fallback:t.jsx("div",{className:"absolute inset-0 flex items-center justify-center text-sm text-(--elm-text-subtle,var(--color-gray-400))",children:"Loading grid..."}),children:t.jsx(d.DataTable,{schemaFilter:x,focusRowId:_,onFocusRowHandled:()=>N(null),selectedRows:C,onSelectedRowsChange:G})})})]})}exports.default=oe;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),o=require("./useAdapterControls-BBObhzVX.cjs"),d=require("./index-mfb91TEp.cjs"),r=require("react"),R=require("clsx"),S=require("@phosphor-icons/react"),Z=require("zustand/react/shallow"),ee=require("@element-editor/core/internal"),te=require("./useAccentStyle-hsGvyHZc.cjs"),E=require("./EditToolbarBtn-Ch9HCLHq.cjs"),re=160,se=80;try{CSS.registerProperty({name:"--elm-table-offset",syntax:"<length>",inherits:!0,initialValue:"0px"})}catch{}const M="px-2.5 py-1 rounded-elm-control text-xs font-medium bg-elm-surface text-elm-text ring-1 ring-primary-400 outline-none";function ne({initialValue:a,onCommit:m,onCancel:v}){const[s,f]=r.useState(a),y=r.useRef(null),[h,w]=r.useState(void 0);return r.useLayoutEffect(()=>{const n=y.current;n&&w(n.offsetWidth+4)},[s]),t.jsxs(t.Fragment,{children:[t.jsx("span",{ref:y,"aria-hidden":!0,className:`${M} absolute invisible pointer-events-none whitespace-pre left-[-9999px] top-[-9999px]`,children:s||" "}),t.jsx("input",{autoFocus:!0,value:s,onFocus:n=>n.currentTarget.select(),onChange:n=>f(n.target.value),onBlur:()=>m(s.trim()),onKeyDown:n=>{n.key==="Enter"&&n.currentTarget.blur(),n.key==="Escape"&&(v(),n.preventDefault())},style:{width:h},className:M})]})}const B=`flex ${d.panelHeaderIconBtn.replace("hover:bg-(--elm-surface-hover,var(--color-gray-100))","hover:bg-(--elm-surface-hover,var(--color-gray-200))")}`;function oe({embedded:a=!1}={}){const{dataStore:m}=o.useGeoStore(),v=te.useElementEditorConfig(),s=o.useUIStore(e=>e.tableOpen),f=o.useUIStore(e=>e.readonly),y=o.useUIStore(e=>e.toggleTable),h=o.useUIStore(e=>e.setTableFullscreen),w=o.useUIStore(ee.sidebarTakesSpace),n=o.useUIStore(e=>e.sidebarWidth),$=o.useUIStore(e=>e.codeDockWidth),V=v.ui.layerList&&w,j=o.useDataStore(e=>e.features.length),F=o.useDataStore(Z.useShallow(e=>e.getVisibleSchemas())),{getCenter:I}=o.useMapController(),[g,W]=r.useState(()=>typeof window>"u"?360:Math.round(window.innerHeight*.42)),[x,L]=r.useState("all"),[i,O]=r.useState(!1);r.useEffect(()=>(h(i),()=>h(!1)),[i,h]);const[_,N]=r.useState(null),[C,G]=r.useState(new Set),[X,T]=r.useState(null),H=r.useRef(!1);(s||a)&&(H.current=!0);const[D,P]=r.useState(!s);r.useEffect(()=>{if(s){P(!1);return}const e=setTimeout(()=>P(!0),200);return()=>clearTimeout(e)},[s]);const u=r.useRef(null),K=r.useCallback(e=>{e.button===0&&(e.preventDefault(),e.currentTarget.setPointerCapture(e.pointerId),u.current=d.startDragShield("row-resize",e.currentTarget))},[]),Y=r.useCallback(e=>{if(!u.current)return;const c=Math.round(window.innerHeight*se/100),l=Math.min(c,Math.max(re,window.innerHeight-e.clientY));W(l)},[]),A=r.useCallback(()=>{var e;(e=u.current)==null||e.call(u),u.current=null},[]),q=r.useRef(null);r.useEffect(()=>{var l;if(a)return;const e=(l=q.current)==null?void 0:l.closest("[data-elm-theme]");if(!e)return;const c=s?i?e.clientHeight:g:0;return e.style.setProperty("--elm-table-offset",`${c}px`),e.style.transition||requestAnimationFrame(()=>{e.style.transition="--elm-table-offset 200ms ease"}),()=>{e.style.setProperty("--elm-table-offset","0px")}},[a,s,i,g]);const J=a?"absolute inset-0 bg-elm-surface flex flex-col":R.clsx("absolute left-0 z-20 bg-elm-surface border-t border-elm-border/80 flex flex-col transition-[right] duration-200 ease-[ease]",!s&&D&&"invisible"),Q=a?void 0:i?{top:0,bottom:0,right:0,height:"100%"}:{height:g,bottom:`calc(min(var(--elm-table-offset, 0px), ${g}px) - ${g}px)`,right:(V?n:0)+$};return t.jsxs("div",{ref:q,className:J,style:Q,children:[!a&&!i&&t.jsx("div",{className:d.resizeEdgeTop,onPointerDown:K,onPointerMove:Y,onPointerUp:A,onLostPointerCapture:A}),t.jsxs("div",{className:`${d.panelHeaderBar} gap-3 px-4`,children:[!f&&t.jsx(E.Tooltip,{content:"Add new entry",children:t.jsxs(E.Button,{variant:"primary",size:"sm",onClick:()=>{const e=(I==null?void 0:I())??[0,0],{schemas:c,getDefaultSchema:l}=m.getState(),k=x!=="all"&&c.find(b=>b.id===x)?x:l().id,p=c.find(b=>b.id===k)??l(),U={};for(const b of p.fields)U[b.key]="";const z=crypto.randomUUID();m.getState().addFeature({type:"Feature",id:z,schemaId:k,geometry:{type:"Point",coordinates:e},properties:U})&&N(z)},children:[t.jsx(S.Plus,{size:11,weight:"bold"}),"Add new"]})}),t.jsxs("span",{className:"text-xs text-elm-text-muted",children:[j," feature",j!==1?"s":"",C.size>0&&`, ${C.size} selected`]}),F.length>1&&t.jsx("div",{role:"tablist","aria-label":"Filter by schema",className:"ml-1 flex items-center gap-0.5 text-xs",children:[{id:"all",name:"All"},...F].map(e=>{const c=x===e.id,l=e.id==="all";return X===e.id?t.jsx(ne,{initialValue:e.name,onCommit:p=>{p&&p!==e.name&&m.getState().updateSchema(e.id,{name:p}),T(null)},onCancel:()=>T(null)},e.id):t.jsx("button",{type:"button",role:"tab","aria-selected":c,onClick:()=>L(e.id),onDoubleClick:()=>{!l&&!f&&T(e.id)},title:l||f?void 0:"Double-click to rename",className:R.clsx("px-2.5 py-1 rounded-elm-control transition-colors whitespace-nowrap",c?"bg-elm-surface hover:bg-(--elm-surface-hover,var(--color-gray-50)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-800)) text-elm-text font-medium shadow-sm ring-1 ring-(--elm-border,var(--color-gray-200)) dark:ring-(--elm-border,var(--color-gray-700))":"text-(--elm-text-secondary,var(--color-gray-600)) dark:text-(--elm-text-secondary,var(--color-gray-300)) hover:bg-(--elm-surface-hover,var(--color-gray-200)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-700))"),children:e.name},e.id)})}),!a&&t.jsxs("div",{className:"ml-auto flex items-center gap-1",children:[t.jsx(E.Tooltip,{content:i?"Exit fullscreen":"Fullscreen",children:t.jsx("button",{type:"button",onClick:()=>O(e=>!e),"aria-label":i?"Exit fullscreen":"Fullscreen",className:B,children:i?t.jsx(S.ArrowsInSimple,{size:16}):t.jsx(S.ArrowsOutSimple,{size:16})})}),t.jsx("button",{type:"button",onClick:y,"aria-label":"Close data table",className:B,children:t.jsx(S.X,{size:16})})]})]}),t.jsx("div",{className:R.clsx("flex-1 min-h-0 overflow-hidden",!a&&!s&&D&&"hidden"),children:j===0?t.jsx(d.NoFeaturesEmptyState,{}):H.current&&t.jsx(r.Suspense,{fallback:t.jsx("div",{className:"absolute inset-0 flex items-center justify-center text-sm text-(--elm-text-subtle,var(--color-gray-400))",children:"Loading grid..."}),children:t.jsx(d.DataTable,{schemaFilter:x,focusRowId:_,onFocusRowHandled:()=>N(null),selectedRows:C,onSelectedRowsChange:G})})})]})}exports.default=oe;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),s=require("react"),u=require("./useAccentStyle-hsGvyHZc.cjs"),d=require("@element-editor/core"),v=require("react-dom"),m=require("./useAdapterControls-BBObhzVX.cjs"),l=require("./useWindowFocus-EemgNOuz.cjs"),S=require("./useFocusTrap-BBjPCfDR.cjs"),k=require("./index-DG4wEjGj.cjs"),f="elm_feature_win_size";function _({dialogState:b}){const{pos:a,onHandleMouseDown:h}=l.useDragWindow("elm_feature_win",{x:80,y:120}),n=u.useElementEditorConfig(),{zIndex:x,focus:g}=l.useWindowFocus(),w=m.useUIStore(e=>e.closeDialog),[r]=s.useState(()=>{try{const e=d.readStorage(f,n);return e?JSON.parse(e):null}catch{return null}}),o=s.useRef(null),c=s.useCallback(()=>{const e=o.current;e&&d.writeStorage(f,JSON.stringify({w:e.offsetWidth,h:e.offsetHeight}),n)},[n]);s.useEffect(()=>{const e=o.current;if(!e)return;const i=new ResizeObserver(c);return i.observe(e),()=>i.disconnect()},[c]),S.useFocusTrap(o);const y=u.useAccentStyle(),p=m.useTheme();return v.createPortal(t.jsxs("div",{ref:o,"data-elm-portal":!0,"data-elm-theme":p,onMouseDownCapture:g,role:"dialog","aria-label":"Edit feature",className:"absolute flex flex-col bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 shadow-elm-raised rounded-elm-window overflow-hidden",style:{...y,left:a.x,top:a.y,zIndex:x,resize:"both",overflow:"hidden",minWidth:280,minHeight:200,width:(r==null?void 0:r.w)??320,height:(r==null?void 0:r.h)??600,maxWidth:"90%",maxHeight:"85%"},children:[t.jsxs("div",{onMouseDown:h,className:"flex items-center justify-between px-4 py-2 border-b border-elm-border flex-shrink-0 select-none bg-(--elm-surface-sunken,color-mix(in_oklab,var(--color-gray-50)_50%,transparent)) dark:bg-(--elm-surface-sunken,color-mix(in_oklab,var(--color-gray-800)_50%,transparent))",style:{cursor:"grab"},children:[t.jsx("span",{className:"text-sm font-semibold text-(--elm-text,var(--color-gray-900)) dark:text-(--elm-text,var(--color-gray-100))",children:"Edit feature"}),t.jsx(l.CloseButton,{onClick:w,label:"Close editor"})]}),t.jsx("div",{className:"flex-1 overflow-hidden min-h-0 relative bg-elm-surface",children:t.jsx(k.FeatureSidePanel,{dialogState:b})})]}),document.body)}exports.default=_;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),s=require("react"),u=require("./useAccentStyle-hsGvyHZc.cjs"),d=require("@element-editor/core"),v=require("react-dom"),m=require("./useAdapterControls-BBObhzVX.cjs"),l=require("./useWindowFocus-CRWNNxOL.cjs"),S=require("./useFocusTrap-BBjPCfDR.cjs"),k=require("./index-mfb91TEp.cjs"),f="elm_feature_win_size";function _({dialogState:b}){const{pos:a,onHandleMouseDown:h}=l.useDragWindow("elm_feature_win",{x:80,y:120}),n=u.useElementEditorConfig(),{zIndex:x,focus:g}=l.useWindowFocus(),w=m.useUIStore(e=>e.closeDialog),[r]=s.useState(()=>{try{const e=d.readStorage(f,n);return e?JSON.parse(e):null}catch{return null}}),o=s.useRef(null),c=s.useCallback(()=>{const e=o.current;e&&d.writeStorage(f,JSON.stringify({w:e.offsetWidth,h:e.offsetHeight}),n)},[n]);s.useEffect(()=>{const e=o.current;if(!e)return;const i=new ResizeObserver(c);return i.observe(e),()=>i.disconnect()},[c]),S.useFocusTrap(o);const y=u.useAccentStyle(),p=m.useTheme();return v.createPortal(t.jsxs("div",{ref:o,"data-elm-portal":!0,"data-elm-theme":p,onMouseDownCapture:g,role:"dialog","aria-label":"Edit feature",className:"absolute flex flex-col bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 shadow-elm-raised rounded-elm-window overflow-hidden",style:{...y,left:a.x,top:a.y,zIndex:x,resize:"both",overflow:"hidden",minWidth:280,minHeight:200,width:(r==null?void 0:r.w)??320,height:(r==null?void 0:r.h)??600,maxWidth:"90%",maxHeight:"85%"},children:[t.jsxs("div",{onMouseDown:h,className:"flex items-center justify-between px-4 py-2 border-b border-elm-border flex-shrink-0 select-none bg-(--elm-surface-sunken,color-mix(in_oklab,var(--color-gray-50)_50%,transparent)) dark:bg-(--elm-surface-sunken,color-mix(in_oklab,var(--color-gray-800)_50%,transparent))",style:{cursor:"grab"},children:[t.jsx("span",{className:"text-sm font-semibold text-(--elm-text,var(--color-gray-900)) dark:text-(--elm-text,var(--color-gray-100))",children:"Edit feature"}),t.jsx(l.CloseButton,{onClick:w,label:"Close editor"})]}),t.jsx("div",{className:"flex-1 overflow-hidden min-h-0 relative bg-elm-surface",children:t.jsx(k.FeatureSidePanel,{dialogState:b})})]}),document.body)}exports.default=_;
@@ -4,9 +4,9 @@ import { u as v, e as k } from "./useAccentStyle-CPo2XqAn.js";
4
4
  import { readStorage as _, writeStorage as S } from "@element-editor/core";
5
5
  import { createPortal as E } from "react-dom";
6
6
  import { u as C, d as D } from "./useAdapterControls-DVjkwRZ_.js";
7
- import { u as N, a as F, C as W } from "./useWindowFocus-DuQVjnHE.js";
7
+ import { u as N, a as F, C as W } from "./useWindowFocus-CroxgGOo.js";
8
8
  import { u as H } from "./useFocusTrap-CKxKT8De.js";
9
- import { F as M } from "./index-CILw1Du5.js";
9
+ import { F as M } from "./index-rT-R0kyV.js";
10
10
  const c = "elm_feature_win_size";
11
11
  function B({ dialogState: u }) {
12
12
  const { pos: a, onHandleMouseDown: m } = N("elm_feature_win", { x: 80, y: 120 }), s = v(), { zIndex: d, focus: f } = F(), b = C((e) => e.closeDialog), [r] = g(() => {
@@ -8,8 +8,8 @@ import { useVirtualizer as Qe, elementScroll as Ze, observeElementOffset as et }
8
8
  import { u as tt } from "./useJumpToFeature-Bdz2hqOC.js";
9
9
  import { getGeometryBBox as nt } from "@element-editor/core";
10
10
  import { isMultiGeometry as de, getPartBBox as rt, getPartCount as He } from "@element-editor/core/internal";
11
- import { g as ot, d as st, N as it, G as lt, e as ke, P as at } from "./index-CILw1Du5.js";
12
- import { F as dt } from "./FeatureRowContextMenu-DCUIiDwc.js";
11
+ import { g as ot, d as st, N as it, G as lt, e as ke, P as at } from "./index-rT-R0kyV.js";
12
+ import { F as dt } from "./FeatureRowContextMenu-Dlsk7erC.js";
13
13
  import { u as ct } from "./useContextMenu-DJ2Cti85.js";
14
14
  import { e as ut } from "./useAccentStyle-CPo2XqAn.js";
15
15
  const Z = 36, gt = 5, le = [];
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react/jsx-runtime"),p=require("./useAdapterControls-BBObhzVX.cjs"),i=require("react"),qe=require("clsx"),Ae=require("react-dom"),L=require("@hello-pangea/dnd"),ae=require("@tanstack/react-virtual"),ze=require("./useJumpToFeature-LwjxGzfy.cjs"),Ne=require("@element-editor/core"),_=require("@element-editor/core/internal"),z=require("./index-DG4wEjGj.cjs"),Ue=require("./FeatureRowContextMenu-CtBqdC1j.cjs"),Be=require("./useContextMenu-DbxMvb1s.cjs"),Ve=require("./useAccentStyle-hsGvyHZc.cjs"),Z=36,_e=5,le=[];function Je(D,l){const o=D.scrollElement;if(!o)return;const R=new ResizeObserver(([h])=>{var I;const b=(I=h.borderBoxSize)==null?void 0:I[0];l(b?{width:Math.round(b.inlineSize),height:Math.round(b.blockSize)}:{width:Math.round(h.contentRect.width),height:Math.round(h.contentRect.height)})});return R.observe(o,{box:"border-box"}),()=>R.disconnect()}function Le(D,l){const o=D.scrollElement;if(!o)return;const R=ae.observeElementOffset(D,l),h=new ResizeObserver(()=>{h.disconnect(),l(o.scrollTop,!1)});return h.observe(o),()=>{h.disconnect(),R==null||R()}}function $e(D,l,o){l.adjustments===void 0&&l.behavior===void 0&&D===o.scrollOffset||ae.elementScroll(D,l,o)}function Me({droppableId:D,features:l,scrollElement:o,listElement:R,collapsed:h,expandedIds:b,renderItem:I,renderClone:F,scrollToId:w,showEmptyAffordance:q=!0}){const N=h?0:l.length,[v,P]=i.useState(null),y=i.useRef(null),M=i.useCallback(a=>{var g;(g=y.current)==null||g.call(y,a),P(a)},[]),[k,G]=i.useState(0);i.useEffect(()=>{if(!v||!o)return;const a=new ResizeObserver(()=>{const g=v.getBoundingClientRect().top-o.getBoundingClientRect().top-o.clientTop+o.scrollTop;G(Math.round(g))});return a.observe(v),R&&a.observe(R),()=>a.disconnect()},[v,R,o]);const O=i.useCallback(a=>{var g;return((g=l[a])==null?void 0:g.id)??a},[l,b]),j=a=>{const g=l[a];return!g||!b.has(g.id)||!_.isMultiGeometry(g.geometry)?Z:Z*(1+_.getPartCount(g.geometry))+(a<l.length-1?_e:0)},T=ae.useVirtualizer({count:N,getScrollElement:()=>o,estimateSize:j,overscan:6,getItemKey:O,scrollMargin:k,initialRect:{width:0,height:typeof window>"u"?800:window.innerHeight},observeElementRect:Je,observeElementOffset:Le,scrollToFn:$e}),H=w&&!h?l.findIndex(a=>a.id===w):-1;return i.useEffect(()=>{if(H<0)return;const a=T.getVirtualItems(),g=a.length>0&&H>a[0].index-50&&H<a[a.length-1].index+50;T.scrollToIndex(H,{align:"auto",behavior:g?"smooth":"auto"})},[H,T]),c.jsx(L.Droppable,{droppableId:D,type:"feature",mode:"virtual",renderClone:F,children:(a,g)=>{y.current=a.innerRef;const U=!h&&l.length===0,ee=U&&q,$=h?g.isDraggingOver?32:4:U?q?48:Z:T.getTotalSize()+(g.isDraggingOver?Z:0);return c.jsxs("ul",{ref:M,...a.droppableProps,className:"rounded-elm-control",style:{height:$,position:"relative",background:g.isDraggingOver&&!U?"color-mix(in srgb, var(--color-primary-500) 8%, transparent)":void 0,outline:g.isDraggingOver&&!U?"1px dashed color-mix(in srgb, var(--color-primary-500) 40%, transparent)":void 0,borderRadius:"6px",overflow:"hidden"},children:[h&&g.isDraggingOver&&c.jsx("li",{style:{listStyle:"none"},className:"px-2 py-1.5 text-xs text-primary-400 italic",children:"Drop here"}),ee&&c.jsx("li",{style:{listStyle:"none"},className:qe.clsx("mx-1 my-1 h-9 flex items-center justify-center rounded-elm-control border border-dashed text-xs transition-colors",g.isDraggingOver?"border-primary-400 text-primary-500 bg-primary-50/40 dark:bg-white/5":"border-(--elm-border-strong,var(--color-gray-300)) dark:border-(--elm-border-strong,var(--color-gray-700)) text-elm-text-subtle"),children:g.isDraggingOver?"Drop here":"Drag here"}),!h&&T.getVirtualItems().map(C=>{const B=l[C.index];return B?c.jsx("div",{"data-index":C.index,style:{position:"absolute",top:0,left:0,width:"100%",transform:`translateY(${C.start-k}px)`},children:I(B,C.index,C.index===l.length-1,l[C.index-1],l[C.index+1])},B.id):null})]})}})}function We(D){if(D.length===0)return null;let l=1/0,o=1/0,R=-1/0,h=-1/0;for(const b of D){const I=b.bbox||Ne.getGeometryBBox(b.geometry);I[0]<l&&(l=I[0]),I[1]<o&&(o=I[1]),I[2]>R&&(R=I[2]),I[3]>h&&(h=I[3])}return[l,o,R,h]}const Ye=i.memo(function({feature:l,index:o,isLast:R,isSelected:h,isMultiSelected:b,isContextMenuActive:I,isGhosted:F,renameActive:w,isExpanded:q,selectedPartIndex:N,joinTop:v,joinBottom:P,h:y}){const M=l.id,k=i.useCallback(()=>y.onRenameEnd(M),[y,M]),G=i.useCallback(j=>y.onRenameTab(M,j),[y,M]),O=p.useUIStore(j=>j.readonly);return c.jsx(L.Draggable,{draggableId:M,index:o,isDragDisabled:O,children:(j,T)=>c.jsxs("div",{ref:j.innerRef,...j.draggableProps,...j.dragHandleProps,style:{outline:"none",...j.draggableProps.style},children:[c.jsx(z.FeatureRow,{feature:l,isDragging:T.isDragging,isSelected:h,onRowClick:y.onRowClick,onRowSelectOnly:y.onRowSelectOnly,onRowJump:y.onRowJump,onEdit:y.onEdit,onToggleHidden:y.onToggleHidden,onRename:y.onRename,isMultiSelected:b,onMultiSelectToggle:y.onMultiSelectToggle,onRangeSelect:y.onRangeSelect,isContextMenuActive:I,isGhosted:F,renameActive:w,onRenameEnd:k,onRenameTab:G,joinTop:v,joinBottom:P}),q&&!T.isDragging&&c.jsxs(c.Fragment,{children:[Array.from({length:_.getPartCount(l.geometry)},(H,a)=>c.jsx(z.PartSubRow,{geometry:l.geometry,partIndex:a,isSelected:N===a,onClick:()=>y.onPartClick(M,a)},`${M}:${a}`)),!R&&c.jsx("div",{className:"border-b border-elm-border mx-2 mt-1"})]})]})})});function Ke({autoFocusGroupId:D,scrollElement:l}){var Ee;const{dataStore:o,uiStore:R}=p.useGeoStore(),h=p.useUIStore(e=>e.readonly),b=p.useDataStore(e=>e.features),I=p.useDataStore(e=>e.groups),F=p.useDataStore(e=>e.selectedIds),w=i.useMemo(()=>new Set(F),[F]),q=Ve.useAccentStyle(),N=p.useTheme(),v=i.useMemo(()=>{const e=new Map;for(const t of b){const n=t.groupId||null,r=e.get(n);r?r.push(t):e.set(n,[t])}return e},[b]),P=F.length===1?F[0]:null,y=p.useDataStore(e=>e.selectedGroupId),M=p.useDataStore(e=>e.selectGroup),k=p.useDataStore(e=>e.selectFeature),G=p.useDataStore(e=>e.toggleSelection),O=p.useDataStore(e=>e.setSelection),j=p.useDataStore(e=>e.updateGroup),T=p.useDataStore(e=>e.deleteGroup),H=p.useDataStore(e=>e.toggleGroupCollapsed),a=p.useDataStore(e=>e.moveFeatureToGroup),g=p.useDataStore(e=>e.reorderFeatures),U=p.useDataStore(e=>e.reorderGroups),ee=p.useDataStore(e=>e.toggleGroupHidden),$=p.useUIStore(e=>e.openEditDialog),{fitBounds:C}=p.useMapController(),B=p.useDataStore(e=>e.updateFeature),ie=p.useDataStore(e=>e.toggleFeatureHidden),je=p.useUIStore(e=>e.selectedPartIndex),ce=p.useUIStore(e=>e.setSelectedPartIndex),[te,Fe]=i.useState(()=>new Set),de=i.useCallback(e=>{Fe(t=>{const n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),[V,ue]=i.useState(null),[ne,W]=i.useState(null),Y=i.useRef(null),ge=i.useCallback((e,t)=>{const n=o.getState(),r=z.getTabbableFeatureIds(n.features,n.groups),f=r.indexOf(e);if(f<0){W(null);return}const s=t==="next"?f+1:f-1;if(s<0||s>=r.length){W(null);return}W(r[s])},[o]),pe=i.useCallback(e=>{W(t=>t===e?null:t)},[]),A=Be.useContextMenu(),[K,ve]=i.useState(null),fe=l??null;i.useEffect(()=>{const e=K;if(!e)return;const t=n=>{let r=n.target;for(;r&&r!==e;){const f=r.dataset.featureId;if(f){n.preventDefault();const s=o.getState().features.find(d=>d.id===f);s&&A.open(n.clientX,n.clientY,s);return}r=r.parentElement}};return e.addEventListener("contextmenu",t,{capture:!0}),()=>e.removeEventListener("contextmenu",t,{capture:!0})},[A.open,o,K]);const me=i.useCallback(e=>{const t=o.getState(),n=t.selectedIds.length===1?t.selectedIds[0]:Y.current;if(Y.current=e,!n){G(e);return}const r=z.getVisualFeatureOrder(t.features,t.groups),f=r.indexOf(n),s=r.indexOf(e);if(f===-1||s===-1){G(e);return}const d=Math.min(f,s),S=Math.max(f,s);O(r.slice(d,S+1))},[o,G,O]),xe=i.useCallback((e,t)=>{const n=o.getState().features.find(r=>r.id===e);n&&B(e,{properties:{...n.properties,name:t}})},[o,B]),be=ze.useJumpToFeature(),X=i.useCallback(e=>{const t=o.getState().features.find(n=>n.id===e);t&&be(t)},[o,be]),Q=i.useCallback(e=>{const t=o.getState().features.find(n=>n.id===e);t&&(Y.current=e,k(e),_.isMultiGeometry(t.geometry)&&de(e))},[o,k,de]),Se=i.useCallback(e=>{Q(e),X(e)},[Q,X]),he=i.useCallback(e=>{G(e),Y.current=e},[G]);function Te(e){ue(e.draggableId)}function ke(e){const{source:t,destination:n,draggableId:r,type:f}=e;if(ue(null),!n||t.droppableId===n.droppableId&&t.index===n.index||R.getState().readonly)return;if(o.getState().takeSnapshot(),f==="group"){const S=[...I],[m]=S.splice(t.index,1);S.splice(n.index,0,m),U(S.map(E=>E.id));return}const s=t.droppableId,d=n.droppableId;if(s===d){const m=[...re(s)],[E]=m.splice(t.index,1);m.splice(n.index,0,E),Ie(s,m.map(u=>u.id))}else{const S=d==="ungrouped"?null:d,E=w.has(r)&&F.length>1?re(s).filter(u=>w.has(u.id)).map(u=>u.id):[r];if(E.length===1){a(r,S);const u=re(d).filter(x=>x.id!==r);u.splice(n.index,0,b.find(x=>x.id===r)),Ie(d,u.map(x=>x.id),r)}else{for(const u of E)a(u,S);Ge(d,E,n.index)}}}function Ge(e,t,n){const r=new Set(t),f=t.map(u=>b.find(x=>x.id===u)),s=b.filter(u=>!r.has(u.id)),d=e==="ungrouped",S=s.filter(u=>d?!u.groupId:u.groupId===e);let m;if(n<S.length)m=s.findIndex(u=>u.id===S[n].id);else{const u=S[S.length-1];m=u?s.findIndex(x=>x.id===u.id)+1:s.length}const E=[...s.slice(0,m),...f,...s.slice(m)];g(E.map(u=>u.id))}function re(e){return v.get(e==="ungrouped"?null:e)??le}function Ie(e,t,n){const r=new Set(t),f=n?b.find(x=>x.id===n):null,s=b.filter(x=>x.id!==n),d=s.filter(x=>!r.has(x.id)),S=s.find(x=>r.has(x.id)),m=S?d.findIndex(x=>x.id===S.id):d.length,E=t.map(x=>x===n?f:b.find(He=>He.id===x)),u=[...d.slice(0,m),...E,...d.slice(m)];g(u.map(x=>x.id))}const oe=v.get(null)??le,Pe=(()=>{if(!V||!w.has(V)||F.length<=1)return 1;const e=b.find(n=>n.id===V),t=(e==null?void 0:e.groupId)??null;return b.filter(n=>w.has(n.id)&&(n.groupId??null)===t).length})(),J=((Ee=A.state)==null?void 0:Ee.data)??null,ye=i.useCallback((e,t)=>{const n=o.getState().features.find(r=>r.id===e);n&&(k(e),ce(t),C==null||C(_.getPartBBox(n.geometry,t)))},[o,k,ce,C]),Oe=i.useMemo(()=>({onRowClick:Se,onRowSelectOnly:Q,onRowJump:X,onEdit:$,onToggleHidden:ie,onRename:xe,onMultiSelectToggle:he,onRangeSelect:me,onRenameEnd:pe,onRenameTab:ge,onPartClick:ye}),[Se,Q,X,$,ie,xe,he,me,pe,ge,ye]);function Re(e){return(t,n,r)=>{const f=e[r.source.index];return f?c.jsx(z.FeatureRow,{feature:f,innerRef:t.innerRef,containerProps:{...t.draggableProps,"data-elm-portal":"","data-elm-theme":N,style:{...q,...t.draggableProps.style}},dragHandleProps:t.dragHandleProps,isDragging:!0,isSelected:w.has(f.id),dragCountBadge:Pe,onRowClick:()=>{},onEdit:()=>{},onToggleHidden:()=>{}}):c.jsx("div",{ref:t.innerRef,...t.draggableProps})}}const se=e=>!!e&&!(e.groupId&&y===e.groupId)&&(e.id===P||w.has(e.id)),De=e=>te.has(e.id)&&_.isMultiGeometry(e.geometry);function Ce(e,t,n=!1,r,f){const s=De(e),d=se(e),S=!!e.groupId&&y===e.groupId,m=e.id===P;return c.jsx(Ye,{feature:e,index:t,isLast:n,isSelected:!S&&m,isMultiSelected:!S&&w.has(e.id),isContextMenuActive:(J==null?void 0:J.id)===e.id,isGhosted:V!==null&&V!==e.id&&w.has(e.id)&&w.has(V),renameActive:ne===e.id,isExpanded:s,selectedPartIndex:m&&s?je:null,joinTop:d&&se(r)&&!De(r),joinBottom:d&&se(f)&&!s,h:Oe},e.id)}const we=b.length===0&&I.length===0;return c.jsxs(c.Fragment,{children:[A.state&&J&&c.jsx(Ue.FeatureRowContextMenu,{x:A.state.x,y:A.state.y,feature:J,onClose:A.close}),c.jsx(L.DragDropContext,{onDragStart:Te,onDragEnd:ke,children:c.jsxs("div",{ref:ve,className:we?"h-full":"space-y-0.5",children:[we&&c.jsx(z.NoFeaturesEmptyState,{}),c.jsx(L.Droppable,{droppableId:"groups-container",type:"group",children:e=>c.jsxs("div",{ref:e.innerRef,...e.droppableProps,children:[I.map((t,n)=>{const r=v.get(t.id)??le,f=y===t.id;return c.jsx(L.Draggable,{draggableId:`group:${t.id}`,index:n,isDragDisabled:h,children:(s,d)=>{const S=c.jsxs("div",{ref:s.innerRef,...s.draggableProps,...d.isDragging&&{"data-elm-portal":"","data-elm-theme":N},style:{outline:"none",...d.isDragging&&q,...s.draggableProps.style},children:[c.jsx(z.GroupRow,{group:t,featureCount:r.length,autoFocus:t.id===D,isSelected:f,onToggleCollapse:()=>H(t.id),onToggleHidden:()=>ee(t.id),onRename:m=>j(t.id,{name:m}),onDelete:m=>T(t.id,m),onSelect:()=>{if(r.length===0){O([]),M(t.id);return}O(r.map(E=>E.id)),M(t.id);const m=We(r);m&&(C==null||C(m))},dragHandleProps:s.dragHandleProps,isDragging:d.isDragging}),!d.isDragging&&c.jsx(Me,{droppableId:t.id,features:r,scrollElement:fe,listElement:K,expandedIds:te,collapsed:t.collapsed,renderItem:Ce,renderClone:Re(r),scrollToId:ne??P}),!t.collapsed&&(n<I.length-1||I.length>0)&&c.jsx("div",{className:"border-b border-elm-border mx-2 mt-1"})]});return d.isDragging?Ae.createPortal(S,document.body):S}},t.id)}),e.placeholder]})}),(oe.length>0||I.length>0)&&c.jsx(Me,{droppableId:"ungrouped",features:oe,scrollElement:fe,listElement:K,expandedIds:te,renderItem:Ce,renderClone:Re(oe),scrollToId:ne??P,showEmptyAffordance:!1})]})})]})}exports.default=Ke;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react/jsx-runtime"),p=require("./useAdapterControls-BBObhzVX.cjs"),i=require("react"),qe=require("clsx"),Ae=require("react-dom"),L=require("@hello-pangea/dnd"),ae=require("@tanstack/react-virtual"),ze=require("./useJumpToFeature-LwjxGzfy.cjs"),Ne=require("@element-editor/core"),_=require("@element-editor/core/internal"),z=require("./index-mfb91TEp.cjs"),Ue=require("./FeatureRowContextMenu-Bw9Z6mpN.cjs"),Be=require("./useContextMenu-DbxMvb1s.cjs"),Ve=require("./useAccentStyle-hsGvyHZc.cjs"),Z=36,_e=5,le=[];function Je(D,l){const o=D.scrollElement;if(!o)return;const R=new ResizeObserver(([h])=>{var I;const b=(I=h.borderBoxSize)==null?void 0:I[0];l(b?{width:Math.round(b.inlineSize),height:Math.round(b.blockSize)}:{width:Math.round(h.contentRect.width),height:Math.round(h.contentRect.height)})});return R.observe(o,{box:"border-box"}),()=>R.disconnect()}function Le(D,l){const o=D.scrollElement;if(!o)return;const R=ae.observeElementOffset(D,l),h=new ResizeObserver(()=>{h.disconnect(),l(o.scrollTop,!1)});return h.observe(o),()=>{h.disconnect(),R==null||R()}}function $e(D,l,o){l.adjustments===void 0&&l.behavior===void 0&&D===o.scrollOffset||ae.elementScroll(D,l,o)}function Me({droppableId:D,features:l,scrollElement:o,listElement:R,collapsed:h,expandedIds:b,renderItem:I,renderClone:F,scrollToId:w,showEmptyAffordance:q=!0}){const N=h?0:l.length,[v,P]=i.useState(null),y=i.useRef(null),M=i.useCallback(a=>{var g;(g=y.current)==null||g.call(y,a),P(a)},[]),[k,G]=i.useState(0);i.useEffect(()=>{if(!v||!o)return;const a=new ResizeObserver(()=>{const g=v.getBoundingClientRect().top-o.getBoundingClientRect().top-o.clientTop+o.scrollTop;G(Math.round(g))});return a.observe(v),R&&a.observe(R),()=>a.disconnect()},[v,R,o]);const O=i.useCallback(a=>{var g;return((g=l[a])==null?void 0:g.id)??a},[l,b]),j=a=>{const g=l[a];return!g||!b.has(g.id)||!_.isMultiGeometry(g.geometry)?Z:Z*(1+_.getPartCount(g.geometry))+(a<l.length-1?_e:0)},T=ae.useVirtualizer({count:N,getScrollElement:()=>o,estimateSize:j,overscan:6,getItemKey:O,scrollMargin:k,initialRect:{width:0,height:typeof window>"u"?800:window.innerHeight},observeElementRect:Je,observeElementOffset:Le,scrollToFn:$e}),H=w&&!h?l.findIndex(a=>a.id===w):-1;return i.useEffect(()=>{if(H<0)return;const a=T.getVirtualItems(),g=a.length>0&&H>a[0].index-50&&H<a[a.length-1].index+50;T.scrollToIndex(H,{align:"auto",behavior:g?"smooth":"auto"})},[H,T]),c.jsx(L.Droppable,{droppableId:D,type:"feature",mode:"virtual",renderClone:F,children:(a,g)=>{y.current=a.innerRef;const U=!h&&l.length===0,ee=U&&q,$=h?g.isDraggingOver?32:4:U?q?48:Z:T.getTotalSize()+(g.isDraggingOver?Z:0);return c.jsxs("ul",{ref:M,...a.droppableProps,className:"rounded-elm-control",style:{height:$,position:"relative",background:g.isDraggingOver&&!U?"color-mix(in srgb, var(--color-primary-500) 8%, transparent)":void 0,outline:g.isDraggingOver&&!U?"1px dashed color-mix(in srgb, var(--color-primary-500) 40%, transparent)":void 0,borderRadius:"6px",overflow:"hidden"},children:[h&&g.isDraggingOver&&c.jsx("li",{style:{listStyle:"none"},className:"px-2 py-1.5 text-xs text-primary-400 italic",children:"Drop here"}),ee&&c.jsx("li",{style:{listStyle:"none"},className:qe.clsx("mx-1 my-1 h-9 flex items-center justify-center rounded-elm-control border border-dashed text-xs transition-colors",g.isDraggingOver?"border-primary-400 text-primary-500 bg-primary-50/40 dark:bg-white/5":"border-(--elm-border-strong,var(--color-gray-300)) dark:border-(--elm-border-strong,var(--color-gray-700)) text-elm-text-subtle"),children:g.isDraggingOver?"Drop here":"Drag here"}),!h&&T.getVirtualItems().map(C=>{const B=l[C.index];return B?c.jsx("div",{"data-index":C.index,style:{position:"absolute",top:0,left:0,width:"100%",transform:`translateY(${C.start-k}px)`},children:I(B,C.index,C.index===l.length-1,l[C.index-1],l[C.index+1])},B.id):null})]})}})}function We(D){if(D.length===0)return null;let l=1/0,o=1/0,R=-1/0,h=-1/0;for(const b of D){const I=b.bbox||Ne.getGeometryBBox(b.geometry);I[0]<l&&(l=I[0]),I[1]<o&&(o=I[1]),I[2]>R&&(R=I[2]),I[3]>h&&(h=I[3])}return[l,o,R,h]}const Ye=i.memo(function({feature:l,index:o,isLast:R,isSelected:h,isMultiSelected:b,isContextMenuActive:I,isGhosted:F,renameActive:w,isExpanded:q,selectedPartIndex:N,joinTop:v,joinBottom:P,h:y}){const M=l.id,k=i.useCallback(()=>y.onRenameEnd(M),[y,M]),G=i.useCallback(j=>y.onRenameTab(M,j),[y,M]),O=p.useUIStore(j=>j.readonly);return c.jsx(L.Draggable,{draggableId:M,index:o,isDragDisabled:O,children:(j,T)=>c.jsxs("div",{ref:j.innerRef,...j.draggableProps,...j.dragHandleProps,style:{outline:"none",...j.draggableProps.style},children:[c.jsx(z.FeatureRow,{feature:l,isDragging:T.isDragging,isSelected:h,onRowClick:y.onRowClick,onRowSelectOnly:y.onRowSelectOnly,onRowJump:y.onRowJump,onEdit:y.onEdit,onToggleHidden:y.onToggleHidden,onRename:y.onRename,isMultiSelected:b,onMultiSelectToggle:y.onMultiSelectToggle,onRangeSelect:y.onRangeSelect,isContextMenuActive:I,isGhosted:F,renameActive:w,onRenameEnd:k,onRenameTab:G,joinTop:v,joinBottom:P}),q&&!T.isDragging&&c.jsxs(c.Fragment,{children:[Array.from({length:_.getPartCount(l.geometry)},(H,a)=>c.jsx(z.PartSubRow,{geometry:l.geometry,partIndex:a,isSelected:N===a,onClick:()=>y.onPartClick(M,a)},`${M}:${a}`)),!R&&c.jsx("div",{className:"border-b border-elm-border mx-2 mt-1"})]})]})})});function Ke({autoFocusGroupId:D,scrollElement:l}){var Ee;const{dataStore:o,uiStore:R}=p.useGeoStore(),h=p.useUIStore(e=>e.readonly),b=p.useDataStore(e=>e.features),I=p.useDataStore(e=>e.groups),F=p.useDataStore(e=>e.selectedIds),w=i.useMemo(()=>new Set(F),[F]),q=Ve.useAccentStyle(),N=p.useTheme(),v=i.useMemo(()=>{const e=new Map;for(const t of b){const n=t.groupId||null,r=e.get(n);r?r.push(t):e.set(n,[t])}return e},[b]),P=F.length===1?F[0]:null,y=p.useDataStore(e=>e.selectedGroupId),M=p.useDataStore(e=>e.selectGroup),k=p.useDataStore(e=>e.selectFeature),G=p.useDataStore(e=>e.toggleSelection),O=p.useDataStore(e=>e.setSelection),j=p.useDataStore(e=>e.updateGroup),T=p.useDataStore(e=>e.deleteGroup),H=p.useDataStore(e=>e.toggleGroupCollapsed),a=p.useDataStore(e=>e.moveFeatureToGroup),g=p.useDataStore(e=>e.reorderFeatures),U=p.useDataStore(e=>e.reorderGroups),ee=p.useDataStore(e=>e.toggleGroupHidden),$=p.useUIStore(e=>e.openEditDialog),{fitBounds:C}=p.useMapController(),B=p.useDataStore(e=>e.updateFeature),ie=p.useDataStore(e=>e.toggleFeatureHidden),je=p.useUIStore(e=>e.selectedPartIndex),ce=p.useUIStore(e=>e.setSelectedPartIndex),[te,Fe]=i.useState(()=>new Set),de=i.useCallback(e=>{Fe(t=>{const n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),[V,ue]=i.useState(null),[ne,W]=i.useState(null),Y=i.useRef(null),ge=i.useCallback((e,t)=>{const n=o.getState(),r=z.getTabbableFeatureIds(n.features,n.groups),f=r.indexOf(e);if(f<0){W(null);return}const s=t==="next"?f+1:f-1;if(s<0||s>=r.length){W(null);return}W(r[s])},[o]),pe=i.useCallback(e=>{W(t=>t===e?null:t)},[]),A=Be.useContextMenu(),[K,ve]=i.useState(null),fe=l??null;i.useEffect(()=>{const e=K;if(!e)return;const t=n=>{let r=n.target;for(;r&&r!==e;){const f=r.dataset.featureId;if(f){n.preventDefault();const s=o.getState().features.find(d=>d.id===f);s&&A.open(n.clientX,n.clientY,s);return}r=r.parentElement}};return e.addEventListener("contextmenu",t,{capture:!0}),()=>e.removeEventListener("contextmenu",t,{capture:!0})},[A.open,o,K]);const me=i.useCallback(e=>{const t=o.getState(),n=t.selectedIds.length===1?t.selectedIds[0]:Y.current;if(Y.current=e,!n){G(e);return}const r=z.getVisualFeatureOrder(t.features,t.groups),f=r.indexOf(n),s=r.indexOf(e);if(f===-1||s===-1){G(e);return}const d=Math.min(f,s),S=Math.max(f,s);O(r.slice(d,S+1))},[o,G,O]),xe=i.useCallback((e,t)=>{const n=o.getState().features.find(r=>r.id===e);n&&B(e,{properties:{...n.properties,name:t}})},[o,B]),be=ze.useJumpToFeature(),X=i.useCallback(e=>{const t=o.getState().features.find(n=>n.id===e);t&&be(t)},[o,be]),Q=i.useCallback(e=>{const t=o.getState().features.find(n=>n.id===e);t&&(Y.current=e,k(e),_.isMultiGeometry(t.geometry)&&de(e))},[o,k,de]),Se=i.useCallback(e=>{Q(e),X(e)},[Q,X]),he=i.useCallback(e=>{G(e),Y.current=e},[G]);function Te(e){ue(e.draggableId)}function ke(e){const{source:t,destination:n,draggableId:r,type:f}=e;if(ue(null),!n||t.droppableId===n.droppableId&&t.index===n.index||R.getState().readonly)return;if(o.getState().takeSnapshot(),f==="group"){const S=[...I],[m]=S.splice(t.index,1);S.splice(n.index,0,m),U(S.map(E=>E.id));return}const s=t.droppableId,d=n.droppableId;if(s===d){const m=[...re(s)],[E]=m.splice(t.index,1);m.splice(n.index,0,E),Ie(s,m.map(u=>u.id))}else{const S=d==="ungrouped"?null:d,E=w.has(r)&&F.length>1?re(s).filter(u=>w.has(u.id)).map(u=>u.id):[r];if(E.length===1){a(r,S);const u=re(d).filter(x=>x.id!==r);u.splice(n.index,0,b.find(x=>x.id===r)),Ie(d,u.map(x=>x.id),r)}else{for(const u of E)a(u,S);Ge(d,E,n.index)}}}function Ge(e,t,n){const r=new Set(t),f=t.map(u=>b.find(x=>x.id===u)),s=b.filter(u=>!r.has(u.id)),d=e==="ungrouped",S=s.filter(u=>d?!u.groupId:u.groupId===e);let m;if(n<S.length)m=s.findIndex(u=>u.id===S[n].id);else{const u=S[S.length-1];m=u?s.findIndex(x=>x.id===u.id)+1:s.length}const E=[...s.slice(0,m),...f,...s.slice(m)];g(E.map(u=>u.id))}function re(e){return v.get(e==="ungrouped"?null:e)??le}function Ie(e,t,n){const r=new Set(t),f=n?b.find(x=>x.id===n):null,s=b.filter(x=>x.id!==n),d=s.filter(x=>!r.has(x.id)),S=s.find(x=>r.has(x.id)),m=S?d.findIndex(x=>x.id===S.id):d.length,E=t.map(x=>x===n?f:b.find(He=>He.id===x)),u=[...d.slice(0,m),...E,...d.slice(m)];g(u.map(x=>x.id))}const oe=v.get(null)??le,Pe=(()=>{if(!V||!w.has(V)||F.length<=1)return 1;const e=b.find(n=>n.id===V),t=(e==null?void 0:e.groupId)??null;return b.filter(n=>w.has(n.id)&&(n.groupId??null)===t).length})(),J=((Ee=A.state)==null?void 0:Ee.data)??null,ye=i.useCallback((e,t)=>{const n=o.getState().features.find(r=>r.id===e);n&&(k(e),ce(t),C==null||C(_.getPartBBox(n.geometry,t)))},[o,k,ce,C]),Oe=i.useMemo(()=>({onRowClick:Se,onRowSelectOnly:Q,onRowJump:X,onEdit:$,onToggleHidden:ie,onRename:xe,onMultiSelectToggle:he,onRangeSelect:me,onRenameEnd:pe,onRenameTab:ge,onPartClick:ye}),[Se,Q,X,$,ie,xe,he,me,pe,ge,ye]);function Re(e){return(t,n,r)=>{const f=e[r.source.index];return f?c.jsx(z.FeatureRow,{feature:f,innerRef:t.innerRef,containerProps:{...t.draggableProps,"data-elm-portal":"","data-elm-theme":N,style:{...q,...t.draggableProps.style}},dragHandleProps:t.dragHandleProps,isDragging:!0,isSelected:w.has(f.id),dragCountBadge:Pe,onRowClick:()=>{},onEdit:()=>{},onToggleHidden:()=>{}}):c.jsx("div",{ref:t.innerRef,...t.draggableProps})}}const se=e=>!!e&&!(e.groupId&&y===e.groupId)&&(e.id===P||w.has(e.id)),De=e=>te.has(e.id)&&_.isMultiGeometry(e.geometry);function Ce(e,t,n=!1,r,f){const s=De(e),d=se(e),S=!!e.groupId&&y===e.groupId,m=e.id===P;return c.jsx(Ye,{feature:e,index:t,isLast:n,isSelected:!S&&m,isMultiSelected:!S&&w.has(e.id),isContextMenuActive:(J==null?void 0:J.id)===e.id,isGhosted:V!==null&&V!==e.id&&w.has(e.id)&&w.has(V),renameActive:ne===e.id,isExpanded:s,selectedPartIndex:m&&s?je:null,joinTop:d&&se(r)&&!De(r),joinBottom:d&&se(f)&&!s,h:Oe},e.id)}const we=b.length===0&&I.length===0;return c.jsxs(c.Fragment,{children:[A.state&&J&&c.jsx(Ue.FeatureRowContextMenu,{x:A.state.x,y:A.state.y,feature:J,onClose:A.close}),c.jsx(L.DragDropContext,{onDragStart:Te,onDragEnd:ke,children:c.jsxs("div",{ref:ve,className:we?"h-full":"space-y-0.5",children:[we&&c.jsx(z.NoFeaturesEmptyState,{}),c.jsx(L.Droppable,{droppableId:"groups-container",type:"group",children:e=>c.jsxs("div",{ref:e.innerRef,...e.droppableProps,children:[I.map((t,n)=>{const r=v.get(t.id)??le,f=y===t.id;return c.jsx(L.Draggable,{draggableId:`group:${t.id}`,index:n,isDragDisabled:h,children:(s,d)=>{const S=c.jsxs("div",{ref:s.innerRef,...s.draggableProps,...d.isDragging&&{"data-elm-portal":"","data-elm-theme":N},style:{outline:"none",...d.isDragging&&q,...s.draggableProps.style},children:[c.jsx(z.GroupRow,{group:t,featureCount:r.length,autoFocus:t.id===D,isSelected:f,onToggleCollapse:()=>H(t.id),onToggleHidden:()=>ee(t.id),onRename:m=>j(t.id,{name:m}),onDelete:m=>T(t.id,m),onSelect:()=>{if(r.length===0){O([]),M(t.id);return}O(r.map(E=>E.id)),M(t.id);const m=We(r);m&&(C==null||C(m))},dragHandleProps:s.dragHandleProps,isDragging:d.isDragging}),!d.isDragging&&c.jsx(Me,{droppableId:t.id,features:r,scrollElement:fe,listElement:K,expandedIds:te,collapsed:t.collapsed,renderItem:Ce,renderClone:Re(r),scrollToId:ne??P}),!t.collapsed&&(n<I.length-1||I.length>0)&&c.jsx("div",{className:"border-b border-elm-border mx-2 mt-1"})]});return d.isDragging?Ae.createPortal(S,document.body):S}},t.id)}),e.placeholder]})}),(oe.length>0||I.length>0)&&c.jsx(Me,{droppableId:"ungrouped",features:oe,scrollElement:fe,listElement:K,expandedIds:te,renderItem:Ce,renderClone:Re(oe),scrollToId:ne??P,showEmptyAffordance:!1})]})})]})}exports.default=Ke;
@@ -1 +1 @@
1
- "use strict";const e=require("react/jsx-runtime"),G=require("react"),n=require("@phosphor-icons/react"),I=require("@element-editor/core"),b=require("@element-editor/core/internal"),i=require("./useAdapterControls-BBObhzVX.cjs"),s=require("./EditToolbarBtn-Ch9HCLHq.cjs"),K=require("./index-DG4wEjGj.cjs");function q({x:k,y,feature:t,onClose:C,showGrouping:D=!0}){const{dataStore:r,uiStore:F}=i.useGeoStore(),c=i.useEmit(),{fitBounds:a,flyTo:d}=i.useMapController(),l=i.useDataStore(o=>o.selectedIds),u=G.useMemo(()=>new Set(l),[l]),M=i.useDataStore(o=>o.deleteFeature),z=i.useDataStore(o=>o.duplicateFeature),g=i.useDataStore(o=>o.toggleFeatureHidden),x=i.useUIStore(o=>o.openEditDialog),E=i.useUIStore(o=>o.readonly),h=l.length>=2&&u.has(t.id),m=b.isMultiGeometry(t.geometry);function p(){if(t.geometry.type==="Point"){const[o,j]=t.geometry.coordinates;d==null||d([j,o],Math.max(r.getState().currentZoom,16))}else a==null||a(t.bbox||I.getGeometryBBox(t.geometry))}function S(){const o=r.getState();return u.has(t.id)&&l.length>1||o.setSelection([t.id]),o}return e.jsx(s.ContextMenu,{x:k,y,onClose:C,items:E?[{label:"Zoom to feature",icon:e.jsx(n.MagnifyingGlassPlus,{size:16}),onClick:p},{label:"Details",icon:e.jsx(n.PencilSimple,{size:16}),onClick:()=>x(t.id)},{label:t.hidden?"Show on map":"Hide from map",icon:t.hidden?e.jsx(n.Eye,{size:16}):e.jsx(n.EyeSlash,{size:16}),onClick:()=>g(t.id)}]:[{label:"Zoom to feature",icon:e.jsx(n.MagnifyingGlassPlus,{size:16}),onClick:p},{separator:!0},{label:"Edit",icon:e.jsx(n.PencilSimple,{size:16}),shortcut:e.jsxs(e.Fragment,{children:[e.jsx(s.KbdDark,{children:"⌘"}),e.jsx(s.KbdDark,{children:"E"})]}),onClick:()=>x(t.id)},{label:"Duplicate",icon:e.jsx(n.CopySimple,{size:16}),shortcut:e.jsxs(e.Fragment,{children:[e.jsx(s.KbdDark,{children:"⌘"}),e.jsx(s.KbdDark,{children:"D"})]}),onClick:()=>z(t.id)},{label:t.hidden?"Show on map":"Hide from map",icon:t.hidden?e.jsx(n.Eye,{size:16}):e.jsx(n.EyeSlash,{size:16}),onClick:()=>g(t.id)},...D?[{separator:!0},t.groupId?{label:"Ungroup",icon:e.jsx(n.FolderMinus,{size:16}),shortcut:e.jsxs(e.Fragment,{children:[e.jsx(s.KbdDark,{children:"⌘"}),e.jsx(s.KbdDark,{children:"⇧"}),e.jsx(s.KbdDark,{children:"G"})]}),onClick:()=>S().ungroupSelection()}:{label:"Group",icon:e.jsx(n.FolderPlus,{size:16}),shortcut:e.jsxs(e.Fragment,{children:[e.jsx(s.KbdDark,{children:"⌘"}),e.jsx(s.KbdDark,{children:"G"})]}),onClick:()=>{const o=S().groupSelection();o&&F.getState().setAutoFocusGroupId(o)}}]:[],...h||m?[{separator:!0},...h?[{label:`Merge ${l.length} features`,icon:e.jsx(n.StackPlus,{size:16}),onClick:()=>{r.getState().mergeFeatures(),c({type:"success",message:`Merged ${l.length} features`})}}]:[],...m?[{label:"Break apart",icon:e.jsx(n.Shapes,{size:16}),onClick:()=>{const o=b.getPartCount(t.geometry);r.getState().breakMultiGeometry(t.id)&&c({type:"feature:broken",featureId:t.id,count:o,undo:()=>r.getState().undo()})}}]:[]]:[],{separator:!0},{label:"Delete",icon:e.jsx(n.Trash,{size:16}),onClick:()=>{M(t.id),c({type:"feature:deleted",featureId:t.id,label:K.featureLabel(t),undo:()=>r.getState().undo()})}}]})}exports.FeatureRowContextMenu=q;
1
+ "use strict";const e=require("react/jsx-runtime"),G=require("react"),n=require("@phosphor-icons/react"),I=require("@element-editor/core"),b=require("@element-editor/core/internal"),i=require("./useAdapterControls-BBObhzVX.cjs"),s=require("./EditToolbarBtn-Ch9HCLHq.cjs"),K=require("./index-mfb91TEp.cjs");function q({x:k,y,feature:t,onClose:C,showGrouping:D=!0}){const{dataStore:r,uiStore:F}=i.useGeoStore(),c=i.useEmit(),{fitBounds:a,flyTo:d}=i.useMapController(),l=i.useDataStore(o=>o.selectedIds),u=G.useMemo(()=>new Set(l),[l]),M=i.useDataStore(o=>o.deleteFeature),z=i.useDataStore(o=>o.duplicateFeature),g=i.useDataStore(o=>o.toggleFeatureHidden),x=i.useUIStore(o=>o.openEditDialog),E=i.useUIStore(o=>o.readonly),h=l.length>=2&&u.has(t.id),m=b.isMultiGeometry(t.geometry);function p(){if(t.geometry.type==="Point"){const[o,j]=t.geometry.coordinates;d==null||d([j,o],Math.max(r.getState().currentZoom,16))}else a==null||a(t.bbox||I.getGeometryBBox(t.geometry))}function S(){const o=r.getState();return u.has(t.id)&&l.length>1||o.setSelection([t.id]),o}return e.jsx(s.ContextMenu,{x:k,y,onClose:C,items:E?[{label:"Zoom to feature",icon:e.jsx(n.MagnifyingGlassPlus,{size:16}),onClick:p},{label:"Details",icon:e.jsx(n.PencilSimple,{size:16}),onClick:()=>x(t.id)},{label:t.hidden?"Show on map":"Hide from map",icon:t.hidden?e.jsx(n.Eye,{size:16}):e.jsx(n.EyeSlash,{size:16}),onClick:()=>g(t.id)}]:[{label:"Zoom to feature",icon:e.jsx(n.MagnifyingGlassPlus,{size:16}),onClick:p},{separator:!0},{label:"Edit",icon:e.jsx(n.PencilSimple,{size:16}),shortcut:e.jsxs(e.Fragment,{children:[e.jsx(s.KbdDark,{children:"⌘"}),e.jsx(s.KbdDark,{children:"E"})]}),onClick:()=>x(t.id)},{label:"Duplicate",icon:e.jsx(n.CopySimple,{size:16}),shortcut:e.jsxs(e.Fragment,{children:[e.jsx(s.KbdDark,{children:"⌘"}),e.jsx(s.KbdDark,{children:"D"})]}),onClick:()=>z(t.id)},{label:t.hidden?"Show on map":"Hide from map",icon:t.hidden?e.jsx(n.Eye,{size:16}):e.jsx(n.EyeSlash,{size:16}),onClick:()=>g(t.id)},...D?[{separator:!0},t.groupId?{label:"Ungroup",icon:e.jsx(n.FolderMinus,{size:16}),shortcut:e.jsxs(e.Fragment,{children:[e.jsx(s.KbdDark,{children:"⌘"}),e.jsx(s.KbdDark,{children:"⇧"}),e.jsx(s.KbdDark,{children:"G"})]}),onClick:()=>S().ungroupSelection()}:{label:"Group",icon:e.jsx(n.FolderPlus,{size:16}),shortcut:e.jsxs(e.Fragment,{children:[e.jsx(s.KbdDark,{children:"⌘"}),e.jsx(s.KbdDark,{children:"G"})]}),onClick:()=>{const o=S().groupSelection();o&&F.getState().setAutoFocusGroupId(o)}}]:[],...h||m?[{separator:!0},...h?[{label:`Merge ${l.length} features`,icon:e.jsx(n.StackPlus,{size:16}),onClick:()=>{r.getState().mergeFeatures(),c({type:"success",message:`Merged ${l.length} features`})}}]:[],...m?[{label:"Break apart",icon:e.jsx(n.Shapes,{size:16}),onClick:()=>{const o=b.getPartCount(t.geometry);r.getState().breakMultiGeometry(t.id)&&c({type:"feature:broken",featureId:t.id,count:o,undo:()=>r.getState().undo()})}}]:[]]:[],{separator:!0},{label:"Delete",icon:e.jsx(n.Trash,{size:16}),onClick:()=>{M(t.id),c({type:"feature:deleted",featureId:t.id,label:K.featureLabel(t),undo:()=>r.getState().undo()})}}]})}exports.FeatureRowContextMenu=q;
@@ -5,7 +5,7 @@ import { getGeometryBBox as L } from "@element-editor/core";
5
5
  import { isMultiGeometry as R, getPartCount as T } from "@element-editor/core/internal";
6
6
  import { e as q, h as v, g as J, f as c, u as G } from "./useAdapterControls-DVjkwRZ_.js";
7
7
  import { C as N, a as i } from "./EditToolbarBtn-SR4xHd8G.js";
8
- import { l as O } from "./index-CILw1Du5.js";
8
+ import { l as O } from "./index-rT-R0kyV.js";
9
9
  function te({ x, y: D, feature: e, onClose: I, showGrouping: E = !0 }) {
10
10
  const { dataStore: n, uiStore: P } = q(), a = v(), { fitBounds: d, flyTo: u } = J(), l = c((t) => t.selectedIds), m = B(() => new Set(l), [l]), w = c((t) => t.deleteFeature), H = c((t) => t.duplicateFeature), g = c((t) => t.toggleFeatureHidden), p = G((t) => t.openEditDialog), f = G((t) => t.readonly), h = l.length >= 2 && m.has(e.id), S = R(e.geometry);
11
11
  function b() {
@@ -4,12 +4,12 @@ var nt = (e, n, t) => Ut(e, typeof n != "symbol" ? n + "" : n, t);
4
4
  import { jsx as M, jsxs as se } from "react/jsx-runtime";
5
5
  import { useState as ce, useContext as Yt, useRef as B, useCallback as $t, useEffect as ge } from "react";
6
6
  import { e as Ct, k as qt, E as Kt, f as we, d as Vt } from "./useAdapterControls-DVjkwRZ_.js";
7
- import { m as Xt, C as Zt, n as Qt, o as en, u as tn, q as nn, a as on, W as rn, t as sn, s as cn } from "./index-CILw1Du5.js";
7
+ import { m as Xt, C as Zt, n as Qt, o as en, u as tn, q as nn, a as on, W as rn, t as sn, s as cn } from "./index-rT-R0kyV.js";
8
8
  import { u as St, e as ln } from "./useAccentStyle-CPo2XqAn.js";
9
9
  import { writeStorage as kt, readStorage as an } from "@element-editor/core";
10
10
  import { createPortal as un } from "react-dom";
11
11
  import { Check as fn, Copy as dn, DownloadSimple as hn, ArrowSquareOut as mn, SidebarSimple as gn, X as pn, WarningCircle as bn } from "@phosphor-icons/react";
12
- import { u as yn, a as vn, C as xn } from "./useWindowFocus-DuQVjnHE.js";
12
+ import { u as yn, a as vn, C as xn } from "./useWindowFocus-CroxgGOo.js";
13
13
  import { EditorView as ie, ViewPlugin as wn, Decoration as Mt } from "@codemirror/view";
14
14
  import { Text as ee, Compartment as ot, EditorState as Pe, StateField as Cn, Prec as Et, Annotation as Sn, ChangeSet as kn, StateEffect as Mn, RangeSetBuilder as En, Transaction as Ln } from "@codemirror/state";
15
15
  import { json as Nn } from "@codemirror/lang-json";
@@ -1,4 +1,4 @@
1
- "use strict";var Jt=Object.defineProperty;var Wt=(e,n,t)=>n in e?Jt(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t;var ot=(e,n,t)=>Wt(e,typeof n!="symbol"?n+"":n,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const x=require("react/jsx-runtime"),k=require("react"),oe=require("./useAdapterControls-BBObhzVX.cjs"),ee=require("./index-DG4wEjGj.cjs"),Je=require("./useAccentStyle-hsGvyHZc.cjs"),We=require("@element-editor/core"),zt=require("react-dom"),le=require("@phosphor-icons/react"),Fe=require("./useWindowFocus-EemgNOuz.cjs"),te=require("@codemirror/view"),D=require("@codemirror/state"),Ht=require("@codemirror/lang-json"),Bt=require("@codemirror/theme-one-dark"),Gt=require("codemirror"),rt=require("@codemirror/lint"),Ut=require("./useFocusTrap-BBjPCfDR.cjs"),Vt=require("./useJumpToFeature-LwjxGzfy.cjs"),we=require("./EditToolbarBtn-Ch9HCLHq.cjs");function $t(e){const{_validation:n,...t}=e,o=JSON.stringify(t,null,2).split(`
1
+ "use strict";var Jt=Object.defineProperty;var Wt=(e,n,t)=>n in e?Jt(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t;var ot=(e,n,t)=>Wt(e,typeof n!="symbol"?n+"":n,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const x=require("react/jsx-runtime"),k=require("react"),oe=require("./useAdapterControls-BBObhzVX.cjs"),ee=require("./index-mfb91TEp.cjs"),Je=require("./useAccentStyle-hsGvyHZc.cjs"),We=require("@element-editor/core"),zt=require("react-dom"),le=require("@phosphor-icons/react"),Fe=require("./useWindowFocus-CRWNNxOL.cjs"),te=require("@codemirror/view"),D=require("@codemirror/state"),Ht=require("@codemirror/lang-json"),Bt=require("@codemirror/theme-one-dark"),Gt=require("codemirror"),rt=require("@codemirror/lint"),Ut=require("./useFocusTrap-BBjPCfDR.cjs"),Vt=require("./useJumpToFeature-LwjxGzfy.cjs"),we=require("./EditToolbarBtn-Ch9HCLHq.cjs");function $t(e){const{_validation:n,...t}=e,o=JSON.stringify(t,null,2).split(`
2
2
  `);for(let r=0;r<o.length;r++)o[r]=" "+o[r];return o}function Le(e,n,t){const o=JSON.stringify({type:"FeatureCollection",metadata:{schemas:e,groups:n},features:[]},null,2);return(t?o:o.slice(0,-3)).split(`
3
3
  `)}const Ct=[" ]","}"];function je(e,n,t=[]){for(let o=0;o<e.length;o++){const r=n(e[o]);for(let s=0;s<r.length;s++)t.push(r[s]);o<e.length-1&&(t[t.length-1]+=",")}return t}function st(e,n,t,o){const r=Le(n,t,e.length===0),s={features:e,counts:e.map(h=>o(h).length),headerLines:r.length,schemas:n,groups:t};if(!e.length)return{text:D.Text.of(r),map:s};const l=je(e,o,r);return l.push(...Ct),{text:D.Text.of(l),map:s}}function*Yt(e,n,t,o){if(yield Le(n,t,e.length===0),!!e.length){for(let r=0;r<e.length;r++){const s=o(e[r]);if(r===e.length-1){yield s;break}const l=s.slice();l[l.length-1]+=",",yield l}yield Ct}}function Kt(e,n,t,o){return{features:e,counts:e.map(r=>o(r).length),headerLines:Le(n,t,e.length===0).length,schemas:n,groups:t}}const Xt=(e,n)=>e===n||e.length===n.length&&e.every((t,o)=>t===n[o]);function pe(e){const n=new Array(e.counts.length);let t=e.headerLines+1;for(let o=0;o<e.counts.length;o++)n[o]=t,t+=e.counts[o];return n}function Zt(e,n){let t=e.headerLines+1;for(let o=0;o<e.counts.length;o++){if(n<t)return-1;if(n<t+e.counts[o])return o;t+=e.counts[o]}return-1}function Qt(e,n,t,o,r,s){const l=n.features;if(!l.length||!t.length)return null;const h=pe(n),v=c=>c===l.length-1,j=c=>e.line(h[c]).from,i=c=>e.line(h[c]+n.counts[c]-1).to-(v(c)?0:1),p=[];let T=n.headerLines;if(o!==n.schemas||r!==n.groups){const c=Le(o,r,!1);p.push({from:0,to:e.line(n.headerLines).to,insert:D.Text.of(c)}),T=c.length}let S=0;const B=Math.min(l.length,t.length);for(;S<B&&l[S]===t[S];)S++;let A=0;for(;A<B-S&&l[l.length-1-A]===t[t.length-1-A];)A++;const m=l.length-A,I=t.length-A,J=n.counts.slice(0,S);if(m-S===I-S)for(let c=S;c<m;c++){if(l[c]===t[c]||Xt(s(l[c]),s(t[c]))){J.push(n.counts[c]);continue}p.push({from:j(c),to:i(c),insert:D.Text.of(s(t[c]))}),J.push(s(t[c]).length)}else{const c=t.slice(S,I);for(const b of c)J.push(s(b).length);if(m>S&&c.length)p.push({from:j(S),to:i(m-1),insert:D.Text.of(je(c,s))});else if(m>S)S>0?p.push({from:i(S-1),to:i(m-1)}):p.push({from:j(0),to:j(m)});else{const b=je(c,s);S>0?p.push({from:i(S-1),insert:D.Text.of([",",...b])}):(b[b.length-1]+=",",b.push(""),p.push({from:j(0),insert:D.Text.of(b)}))}}for(let c=m;c<l.length;c++)J.push(n.counts[c]);return{changes:p,map:{features:t,counts:J,headerLines:T,schemas:o,groups:r}}}const en=["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","GeometryCollection"],kt=e=>{const n=e;return!n||typeof n!="object"||!en.includes(n.type)?!1:n.type==="GeometryCollection"?Array.isArray(n.geometries)&&n.geometries.every(kt):Array.isArray(n.coordinates)};function Ce(e){return!!e&&typeof e=="object"&&e.type==="Feature"&&kt(e.geometry)}function ct(e){return!e||typeof e!="object"||Array.isArray(e)?'Expected a feature: { "type": "Feature", … }':e.type!=="Feature"?'A feature needs "type": "Feature"':'A feature needs a geometry with a valid "type" and "coordinates"'}function it(e){const n=e.length;let t=0;const o=(i,p=t)=>{throw new lt(p,i)},r=()=>{for(;t<n;t++){const i=e.charCodeAt(t);if(i!==32&&i!==10&&i!==13&&i!==9)break}},s=/-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/y,l='"\\/bfnrt',h=()=>{const i=t++;for(;;){t>=n&&o("Missing a closing quote",i);const p=e.charCodeAt(t);if(p===34){t++;return}if(p===92){const T=e[t+1];T==="u"&&/^[0-9a-fA-F]{4}$/.test(e.slice(t+2,t+6))?t+=6:T!==void 0&&l.includes(T)?t+=2:o("Invalid escape in a string (a backslash must be doubled)")}else p<32?o(p===10?"Missing a closing quote":"Control character in a string",p===10?i:t):t++}},v=(i,p)=>{t++;for(let T=0;;T++){r();let S=0;for(;e[t]===",";)t++,S++,r();if(t>=n&&o(`Missing a closing ${i}`),e[t]===i){t++;return}T&&!S&&o(`Expected a comma or a closing ${i}`),p()}},j=()=>{r();const i=e[t];if(i===void 0)o("Expected a value, the text ends here");else if(i==="{")v("}",()=>{e[t]!=='"'&&o("Expected a property name in double quotes"),h(),r(),e[t]!==":"&&o("Expected a colon after the property name"),t++,j()});else if(i==="[")v("]",j);else if(i==='"')h();else if(i==="-"||i>="0"&&i<="9"){s.lastIndex=t;const p=s.exec(e);p||o("Invalid number"),t+=p[0].length}else{const p=["true","false","null"].find(T=>e.startsWith(T,t));p||o("Expected a value (text needs double quotes)"),t+=p.length}};try{if(!e.trim())return null;for(j(),r();e[t]===",";)t++,r();return t<n&&o("Unexpected text after the end"),null}catch(i){return i instanceof lt?{pos:i.pos,message:i.message}:null}}class lt{constructor(n,t){this.pos=n,this.message=t}}function tn(e,n,t,o){const r=n.features.length;if(!r)return{kind:"full"};const s=pe(n),l=c=>e.line(s[c]).from,h=c=>e.line(s[c]+n.counts[c]-1).to,v=c=>h(c)-(c===r-1?0:1),j=c=>{const b=e.lineAt(c).number;let w=0,L=r-1;for(;w<L;){const g=w+L+1>>1;s[g]<=b?w=g:L=g-1}return w},i=[];let p=!1;if(t.iterChangedRanges((c,b)=>{if(p)return;if(c<l(0)||b>h(r-1)){p=!0;return}let w=j(c),L=Math.max(w,j(b));c>v(w)&&(L===w?L=w+1:w++),b>v(L)&&L<r-1&&L++;const g=i[i.length-1];g&&w<=g[1]?g[1]=Math.max(g[1],L):i.push([w,L])}),p||!i.length)return{kind:"full"};const T=n.features.slice(),S=n.counts.slice(),B=[];let A=!1,m=null;for(let c=i.length-1;c>=0;c--){const[b,w]=i[c],L=t.mapPos(l(b),-1),g=t.mapPos(v(w),1),R=ze("["+o.sliceString(L,g)+"]");if(!Array.isArray(R)||!R.every(Ce)){m={from:L,to:g};continue}m||(T.splice(b,w-b+1,...R),R.length===1?S.splice(b,w-b+1,o.lineAt(g).number-o.lineAt(L).number+1):R.length?A=!0:S.splice(b,w-b+1),B[c]=R.length)}if(m)return{kind:"invalid",...m};const I=[];let J=0;return i.forEach(([c,b],w)=>{const L=c+J;for(let g=L-1;g<=L+B[w];g++)I.push(g);J+=B[w]-(b-c+1)}),{kind:"ok",features:T,counts:A?null:S,around:I,runs:i.map(([c,b],w)=>({i:c,j:b,length:B[w]}))}}function Et(e,n,t=0){if(e===n)return null;const o=Math.min(e.length,n.length);let r=0;for(;r<o&&e.charCodeAt(r)===n.charCodeAt(r);)r++;let s=0;for(;s<o-r&&e.charCodeAt(e.length-1-s)===n.charCodeAt(n.length-1-s);)s++;return{from:t+r,to:t+e.length-s,insert:n.slice(r,n.length-s)}}function nn(e,n,t,o,r,s,l){const h=n.features.length,v=pe(n),j=m=>e.line(v[m]).from,i=m=>e.line(v[m]+n.counts[m]-1).to,p=[];let T=0;for(const m of r){const I=p[p.length-1];I&&m.i===I.j+1?(I.j=m.j,I.length+=m.length):p.push({...m,at:m.i+T}),T+=m.length-(m.j-m.i+1)}const S=[],B=[];let A=0;for(const{i:m,j:I,at:J,length:c}of p){for(;A<m;A++)B.push(n.counts[A]);A=I+1;const b=s.slice(J,J+c);for(const P of b)B.push(l(P).length);const w=m>0,L=I<h-1,g=t.mapPos(w?i(m-1)-1:j(0)-1,-1),R=t.mapPos(L?j(I+1):i(h-1)+1,1),ae=c?(w?",":"")+`
4
4
  `+je(b,l).join(`
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),r=require("react"),l=require("./index-DG4wEjGj.cjs"),f=require("./useAccentStyle-hsGvyHZc.cjs"),p=require("@element-editor/core"),H=require("react-dom"),d=require("./useWindowFocus-EemgNOuz.cjs"),C=require("./useFocusTrap-BBjPCfDR.cjs"),I=require("./SchemaEditor-B4L17K1e.cjs"),L=require("./useAdapterControls-BBObhzVX.cjs"),v="elm_schema_win_size",i=450,b=200;function R({onClose:u}){const{pos:m,onHandleMouseDown:g}=d.useDragWindow("elm_schema_win",{x:80,y:120}),c=f.useElementEditorConfig(),{zIndex:h,focus:S}=d.useWindowFocus(),y=L.useTheme(),M=f.useAccentStyle(),o=r.useRef(null),[n,W]=r.useState(()=>{try{const e=p.readStorage(v,c);return e?JSON.parse(e):{w:i,h:520}}catch{return{w:i,h:520}}}),j=r.useCallback((e,a)=>{p.writeStorage(v,JSON.stringify({w:e,h:a}),c)},[c]);function E(e){e.preventDefault(),e.stopPropagation();const a=e.clientX,N=e.clientY,q=n.w,D=n.h,z=l.startDragShield("se-resize");function x(s){const _=Math.max(i,Math.min(window.innerWidth*.9,q+s.clientX-a)),k=Math.max(b,Math.min(window.innerHeight*.85,D+s.clientY-N));W({w:_,h:k})}function w(){z(),document.removeEventListener("mousemove",x),document.removeEventListener("mouseup",w);const s=o.current;s&&j(s.offsetWidth,s.offsetHeight)}document.addEventListener("mousemove",x),document.addEventListener("mouseup",w)}return C.useFocusTrap(o),l.useWindowEscape(o,!0,u,h),r.useEffect(()=>{var e;(e=o.current)==null||e.focus()},[]),H.createPortal(t.jsx("div",{"data-elm-theme":y,style:M,children:t.jsxs("div",{ref:o,[l.WINDOW_ATTR]:"",onMouseDownCapture:S,role:"dialog","aria-label":"Schema editor",tabIndex:-1,className:"fixed flex flex-col bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 shadow-elm-raised rounded-elm-window overflow-hidden outline-none",style:{left:`clamp(8px, ${m.x}px, calc(100vw - min(${n.w}px, 90vw) - 8px))`,top:`clamp(8px, ${m.y}px, calc(100vh - min(${n.h}px, 85vh) - 8px))`,zIndex:h,minWidth:`min(${i}px, 90vw)`,minHeight:b,width:n.w,height:n.h,maxWidth:"90vw",maxHeight:"85vh"},children:[t.jsxs("div",{onMouseDown:g,className:"flex items-center justify-between px-4 py-3 border-b border-elm-border flex-shrink-0 select-none",style:{cursor:"grab"},children:[t.jsx("span",{className:"text-sm font-semibold text-(--elm-text,var(--color-gray-900)) dark:text-(--elm-text,var(--color-gray-100))",children:"Schema"}),t.jsx(d.CloseButton,{onClick:u,label:"Close schema editor"})]}),t.jsx("div",{className:"flex-1 overflow-hidden min-h-0",children:t.jsx(I.default,{containerRef:o})}),t.jsx("div",{onMouseDown:E,className:"absolute bottom-0 right-0 w-4 h-4 cursor-se-resize select-none",style:{zIndex:10},"aria-hidden":!0,children:t.jsx("svg",{width:"10",height:"10",viewBox:"0 0 10 10",className:"absolute bottom-1 right-1 text-elm-text-disabled",children:t.jsx("path",{d:"M9 1L1 9M9 5L5 9",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})})]})}),document.body)}exports.default=R;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),r=require("react"),l=require("./index-mfb91TEp.cjs"),f=require("./useAccentStyle-hsGvyHZc.cjs"),p=require("@element-editor/core"),H=require("react-dom"),d=require("./useWindowFocus-CRWNNxOL.cjs"),C=require("./useFocusTrap-BBjPCfDR.cjs"),I=require("./SchemaEditor-B4L17K1e.cjs"),L=require("./useAdapterControls-BBObhzVX.cjs"),v="elm_schema_win_size",i=450,b=200;function R({onClose:u}){const{pos:m,onHandleMouseDown:g}=d.useDragWindow("elm_schema_win",{x:80,y:120}),c=f.useElementEditorConfig(),{zIndex:h,focus:S}=d.useWindowFocus(),y=L.useTheme(),M=f.useAccentStyle(),o=r.useRef(null),[n,W]=r.useState(()=>{try{const e=p.readStorage(v,c);return e?JSON.parse(e):{w:i,h:520}}catch{return{w:i,h:520}}}),j=r.useCallback((e,a)=>{p.writeStorage(v,JSON.stringify({w:e,h:a}),c)},[c]);function E(e){e.preventDefault(),e.stopPropagation();const a=e.clientX,N=e.clientY,q=n.w,D=n.h,z=l.startDragShield("se-resize");function x(s){const _=Math.max(i,Math.min(window.innerWidth*.9,q+s.clientX-a)),k=Math.max(b,Math.min(window.innerHeight*.85,D+s.clientY-N));W({w:_,h:k})}function w(){z(),document.removeEventListener("mousemove",x),document.removeEventListener("mouseup",w);const s=o.current;s&&j(s.offsetWidth,s.offsetHeight)}document.addEventListener("mousemove",x),document.addEventListener("mouseup",w)}return C.useFocusTrap(o),l.useWindowEscape(o,!0,u,h),r.useEffect(()=>{var e;(e=o.current)==null||e.focus()},[]),H.createPortal(t.jsx("div",{"data-elm-theme":y,style:M,children:t.jsxs("div",{ref:o,[l.WINDOW_ATTR]:"",onMouseDownCapture:S,role:"dialog","aria-label":"Schema editor",tabIndex:-1,className:"fixed flex flex-col bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 shadow-elm-raised rounded-elm-window overflow-hidden outline-none",style:{left:`clamp(8px, ${m.x}px, calc(100vw - min(${n.w}px, 90vw) - 8px))`,top:`clamp(8px, ${m.y}px, calc(100vh - min(${n.h}px, 85vh) - 8px))`,zIndex:h,minWidth:`min(${i}px, 90vw)`,minHeight:b,width:n.w,height:n.h,maxWidth:"90vw",maxHeight:"85vh"},children:[t.jsxs("div",{onMouseDown:g,className:"flex items-center justify-between px-4 py-3 border-b border-elm-border flex-shrink-0 select-none",style:{cursor:"grab"},children:[t.jsx("span",{className:"text-sm font-semibold text-(--elm-text,var(--color-gray-900)) dark:text-(--elm-text,var(--color-gray-100))",children:"Schema"}),t.jsx(d.CloseButton,{onClick:u,label:"Close schema editor"})]}),t.jsx("div",{className:"flex-1 overflow-hidden min-h-0",children:t.jsx(I.default,{containerRef:o})}),t.jsx("div",{onMouseDown:E,className:"absolute bottom-0 right-0 w-4 h-4 cursor-se-resize select-none",style:{zIndex:10},"aria-hidden":!0,children:t.jsx("svg",{width:"10",height:"10",viewBox:"0 0 10 10",className:"absolute bottom-1 right-1 text-elm-text-disabled",children:t.jsx("path",{d:"M9 1L1 9M9 5L5 9",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})})]})}),document.body)}exports.default=R;
@@ -1,10 +1,10 @@
1
1
  import { jsx as t, jsxs as h } from "react/jsx-runtime";
2
2
  import { useRef as _, useState as k, useCallback as H, useEffect as C } from "react";
3
- import { u as I, W as L, s as R } from "./index-CILw1Du5.js";
3
+ import { u as I, W as L, s as R } from "./index-rT-R0kyV.js";
4
4
  import { u as $, e as T } from "./useAccentStyle-CPo2XqAn.js";
5
5
  import { readStorage as Y, writeStorage as j } from "@element-editor/core";
6
6
  import { createPortal as O } from "react-dom";
7
- import { u as X, a as A, C as B } from "./useWindowFocus-DuQVjnHE.js";
7
+ import { u as X, a as A, C as B } from "./useWindowFocus-CroxgGOo.js";
8
8
  import { u as F } from "./useFocusTrap-CKxKT8De.js";
9
9
  import J from "./SchemaEditor-ryoTgaLb.js";
10
10
  import { d as P } from "./useAdapterControls-DVjkwRZ_.js";
@@ -1,11 +1,11 @@
1
1
  import { jsxs as t, jsx as r } from "react/jsx-runtime";
2
2
  import { useRef as G, useState as X, useCallback as J } from "react";
3
- import { u as P, i as S, W as Z, s as K } from "./index-CILw1Du5.js";
3
+ import { u as P, i as S, W as Z, s as K } from "./index-rT-R0kyV.js";
4
4
  import { u as V } from "./useAccentStyle-CPo2XqAn.js";
5
5
  import { readStorage as q, writeStorage as Q } from "@element-editor/core";
6
6
  import { Sun as ee, Moon as re, Desktop as te, Monitor as se, GlobeHemisphereWest as ae } from "@phosphor-icons/react";
7
7
  import { u as s, f as M, d as oe } from "./useAdapterControls-DVjkwRZ_.js";
8
- import { u as le, a as ne, C as ie } from "./useWindowFocus-DuQVjnHE.js";
8
+ import { u as le, a as ne, C as ie } from "./useWindowFocus-CroxgGOo.js";
9
9
  const E = "elm_settings_win_size", D = 320, C = 320, $ = { w: 384, h: 560 };
10
10
  function xe() {
11
11
  const i = s((e) => e.settingsModalOpen), x = s((e) => e.setSettingsModalOpen), a = M((e) => e.geometryMode), p = M((e) => e.setGeometryMode), W = s((e) => e.setShowMeasurements), c = s((e) => e.showMeasurements), d = s((e) => e.showFeatureNameOnHover), H = s((e) => e.setShowFeatureNameOnHover), m = s((e) => e.topoEditEnabled), _ = s((e) => e.setTopoEditEnabled), h = s((e) => e.autoExitAfterDraw), z = s((e) => e.setAutoExitAfterDraw), u = s((e) => e.snapEnabled), T = s((e) => e.setSnapEnabled), v = s((e) => e.userTheme), I = s((e) => e.setUserTheme), A = oe(), { pos: y, onHandleMouseDown: O } = le("elm_settings_win", { x: 80, y: 80 }), g = V(), { zIndex: w, focus: j } = ne(i), b = G(null);
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),p=require("react"),l=require("./index-DG4wEjGj.cjs"),G=require("./useAccentStyle-hsGvyHZc.cjs"),E=require("@element-editor/core"),n=require("@phosphor-icons/react"),s=require("./useAdapterControls-BBObhzVX.cjs"),v=require("./useWindowFocus-EemgNOuz.cjs"),I="elm_settings_win_size",D=320,C=320,U={w:384,h:560};function X(){const c=s.useUIStore(r=>r.settingsModalOpen),y=s.useUIStore(r=>r.setSettingsModalOpen),t=s.useDataStore(r=>r.geometryMode),w=s.useDataStore(r=>r.setGeometryMode),$=s.useUIStore(r=>r.setShowMeasurements),d=s.useUIStore(r=>r.showMeasurements),m=s.useUIStore(r=>r.showFeatureNameOnHover),W=s.useUIStore(r=>r.setShowFeatureNameOnHover),x=s.useUIStore(r=>r.topoEditEnabled),H=s.useUIStore(r=>r.setTopoEditEnabled),u=s.useUIStore(r=>r.autoExitAfterDraw),_=s.useUIStore(r=>r.setAutoExitAfterDraw),h=s.useUIStore(r=>r.snapEnabled),z=s.useUIStore(r=>r.setSnapEnabled),j=s.useUIStore(r=>r.userTheme),T=s.useUIStore(r=>r.setUserTheme),A=s.useTheme(),{pos:k,onHandleMouseDown:O}=v.useDragWindow("elm_settings_win",{x:80,y:80}),g=G.useElementEditorConfig(),{zIndex:N,focus:L}=v.useWindowFocus(c),b=p.useRef(null);l.useWindowEscape(b,c,()=>y(!1),N);const[i,q]=p.useState(()=>{try{const r=E.readStorage(I,g);return r?JSON.parse(r):U}catch{return U}}),F=p.useCallback((r,a)=>{E.writeStorage(I,JSON.stringify({w:r,h:a}),g)},[g]);function R(r){r.preventDefault(),r.stopPropagation();const a=r.clientX,f=r.clientY,B=i.w,P=i.h,Y=l.startDragShield("se-resize");function S(o){q({w:Math.max(D,Math.min(window.innerWidth*.9,B+o.clientX-a)),h:Math.max(C,Math.min(window.innerHeight*.85,P+o.clientY-f))})}function M(){Y(),document.removeEventListener("mousemove",S),document.removeEventListener("mouseup",M);const o=b.current;o&&F(o.offsetWidth,o.offsetHeight)}document.addEventListener("mousemove",S),document.addEventListener("mouseup",M)}return c?e.jsxs("div",{ref:b,[l.WINDOW_ATTR]:"",role:"dialog","aria-label":"Settings",onMouseDownCapture:L,className:"fixed flex flex-col bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 shadow-elm-raised rounded-elm-window overflow-hidden","data-elm-theme":A,style:{left:k.x,top:k.y,zIndex:N,minWidth:D,minHeight:C,width:i.w,height:i.h,maxWidth:"90vw",maxHeight:"85vh"},children:[e.jsxs("div",{onMouseDown:O,className:"flex items-center justify-between px-4 py-3 border-b border-elm-border flex-shrink-0 select-none",style:{cursor:"grab"},children:[e.jsx("span",{className:"text-sm font-semibold text-(--elm-text,var(--color-gray-900)) dark:text-(--elm-text,var(--color-gray-100))",children:"Settings"}),e.jsx(v.CloseButton,{onClick:()=>y(!1),label:"Close settings"})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto p-5 space-y-6 min-h-0",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-sm font-medium text-elm-text-secondary",children:"Appearance"}),e.jsx("div",{className:"flex rounded-elm border border-elm-border overflow-hidden",children:[{value:"light",label:"Light",Icon:n.Sun},{value:"dark",label:"Dark",Icon:n.Moon},{value:"system",label:"Auto",Icon:n.Desktop}].map(({value:r,label:a,Icon:f})=>e.jsxs("button",{onClick:()=>T(r),className:`flex-1 flex items-center justify-center gap-1.5 py-2 text-xs font-medium transition-colors ${j===r?"bg-primary-500 hover:bg-primary-600 text-white":"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-200))"}`,children:[e.jsx(f,{size:14,weight:j===r?"fill":"regular"}),a]},r))})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-sm font-medium text-elm-text-secondary",children:"Drawing mode"}),e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsxs("button",{onClick:()=>w("visual"),className:`p-3 text-center rounded-elm border text-sm transition-colors ${t==="visual"?"border-primary-500 bg-primary-50 dark:bg-white/5 hover:bg-primary-100 dark:hover:bg-white/10 ring-1 ring-primary-500/20":"border-(--elm-border,var(--color-gray-200)) dark:border-(--elm-border,var(--color-gray-600)) bg-elm-surface-raised hover:border-(--elm-border-strong,var(--color-gray-300)) dark:hover:border-(--elm-border-strong,var(--color-gray-500)) hover:bg-(--elm-surface-hover,var(--color-gray-50)) dark:hover:bg-(--elm-surface-hover,color-mix(in_oklab,var(--color-gray-700)_50%,transparent))"}`,children:[e.jsx(n.Monitor,{size:32,weight:t==="visual"?"fill":"regular",className:`mx-auto mb-2 ${t==="visual"?"text-primary-600":"text-elm-text-muted"}`}),e.jsx("span",{className:`block mb-1 font-semibold ${t==="visual"?"text-primary-800 dark:text-primary-300":"text-(--elm-text-secondary,var(--color-gray-700)) dark:text-(--elm-text-secondary,var(--color-gray-200))"}`,children:"Visual"}),e.jsx("p",{className:"text-xs leading-relaxed text-elm-text-muted",children:"Shapes keep their proportions on screen. Best for sketching and layouts."})]}),e.jsxs("button",{onClick:()=>w("spatial"),className:`p-3 text-center rounded-elm border text-sm transition-colors ${t==="spatial"?"border-primary-500 bg-primary-50 dark:bg-white/5 hover:bg-primary-100 dark:hover:bg-white/10 ring-1 ring-primary-500/20":"border-(--elm-border,var(--color-gray-200)) dark:border-(--elm-border,var(--color-gray-600)) bg-elm-surface-raised hover:border-(--elm-border-strong,var(--color-gray-300)) dark:hover:border-(--elm-border-strong,var(--color-gray-500)) hover:bg-(--elm-surface-hover,var(--color-gray-50)) dark:hover:bg-(--elm-surface-hover,color-mix(in_oklab,var(--color-gray-700)_50%,transparent))"}`,children:[e.jsx(n.GlobeHemisphereWest,{size:32,weight:t==="spatial"?"fill":"regular",className:`mx-auto mb-2 ${t==="spatial"?"text-primary-600":"text-elm-text-muted"}`}),e.jsx("span",{className:`block mb-1 font-semibold ${t==="spatial"?"text-primary-800 dark:text-primary-300":"text-(--elm-text-secondary,var(--color-gray-700)) dark:text-(--elm-text-secondary,var(--color-gray-200))"}`,children:"Spatial"}),e.jsx("p",{className:"text-xs leading-relaxed text-elm-text-muted",children:"Shapes keep their true size on the ground. Best for exact areas and distances."})]})]})]}),e.jsx("div",{className:"pt-4 border-t border-elm-border-subtle",children:e.jsxs("label",{className:"flex items-center justify-between cursor-pointer group",children:[e.jsxs("div",{className:"flex flex-col gap-0.5 pr-4",children:[e.jsx("span",{className:"text-sm font-semibold text-(--elm-text,var(--color-gray-800)) dark:text-(--elm-text,var(--color-gray-100))",children:"Show measurements"}),e.jsx("span",{className:"text-xs text-elm-text-muted",children:"Display live dimensions and coordinates at the cursor while drawing shapes."})]}),e.jsxs("div",{className:`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-elm-focus-ring has-[:focus-visible]:ring-offset-2 has-[:focus-visible]:ring-offset-elm-surface ${d?"bg-primary-500":"bg-(--elm-border-strong,var(--color-gray-200)) dark:bg-(--elm-border-strong,var(--color-gray-600))"}`,children:[e.jsx("span",{className:`${d?"translate-x-6":"translate-x-1"} inline-block h-4 w-4 transform rounded-full bg-white transition-transform`}),e.jsx("input",{type:"checkbox",className:"sr-only",checked:d,onChange:r=>$(r.target.checked)})]})]})}),e.jsx("div",{className:"pt-4 border-t border-elm-border-subtle",children:e.jsxs("label",{className:"flex items-center justify-between cursor-pointer group",children:[e.jsxs("div",{className:"flex flex-col gap-0.5 pr-4",children:[e.jsx("span",{className:"text-sm font-semibold text-(--elm-text,var(--color-gray-800)) dark:text-(--elm-text,var(--color-gray-100))",children:"Show name on hover"}),e.jsx("span",{className:"text-xs text-elm-text-muted",children:"Display the feature name when hovering over shapes on the map."})]}),e.jsxs("div",{className:`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-elm-focus-ring has-[:focus-visible]:ring-offset-2 has-[:focus-visible]:ring-offset-elm-surface ${m?"bg-primary-500":"bg-(--elm-border-strong,var(--color-gray-200)) dark:bg-(--elm-border-strong,var(--color-gray-600))"}`,children:[e.jsx("span",{className:`${m?"translate-x-6":"translate-x-1"} inline-block h-4 w-4 transform rounded-full bg-white transition-transform`}),e.jsx("input",{type:"checkbox",className:"sr-only",checked:m,onChange:r=>W(r.target.checked)})]})]})}),e.jsx("div",{className:"pt-4 border-t border-elm-border-subtle",children:e.jsxs("label",{className:"flex items-center justify-between cursor-pointer group",children:[e.jsxs("div",{className:"flex flex-col gap-0.5 pr-4",children:[e.jsx("span",{className:"text-sm font-semibold text-(--elm-text,var(--color-gray-800)) dark:text-(--elm-text,var(--color-gray-100))",children:"Topological editing"}),e.jsxs("span",{className:"text-xs text-elm-text-muted",children:["When editing points, shared borders between areas update together. Hold ",l.isMacPlatform()?"⌘ Cmd":"Ctrl"," to temporarily disable."]})]}),e.jsxs("div",{className:`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-elm-focus-ring has-[:focus-visible]:ring-offset-2 has-[:focus-visible]:ring-offset-elm-surface ${x?"bg-primary-500":"bg-(--elm-border-strong,var(--color-gray-200)) dark:bg-(--elm-border-strong,var(--color-gray-600))"}`,children:[e.jsx("span",{className:`${x?"translate-x-6":"translate-x-1"} inline-block h-4 w-4 transform rounded-full bg-white transition-transform`}),e.jsx("input",{type:"checkbox",className:"sr-only",checked:x,onChange:r=>H(r.target.checked)})]})]})}),e.jsx("div",{className:"pt-4 border-t border-elm-border-subtle",children:e.jsxs("label",{className:"flex items-center justify-between cursor-pointer group",children:[e.jsxs("div",{className:"flex flex-col gap-0.5 pr-4",children:[e.jsx("span",{className:"text-sm font-semibold text-(--elm-text,var(--color-gray-800)) dark:text-(--elm-text,var(--color-gray-100))",children:"Snapping"}),e.jsxs("span",{className:"text-xs text-elm-text-muted",children:["Snap to nearby points and edges while drawing. Hold ",l.isMacPlatform()?"⌘ Cmd":"Ctrl"," to temporarily disable."]})]}),e.jsxs("div",{className:`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-elm-focus-ring has-[:focus-visible]:ring-offset-2 has-[:focus-visible]:ring-offset-elm-surface ${h?"bg-primary-500":"bg-(--elm-border-strong,var(--color-gray-200)) dark:bg-(--elm-border-strong,var(--color-gray-600))"}`,children:[e.jsx("span",{className:`${h?"translate-x-6":"translate-x-1"} inline-block h-4 w-4 transform rounded-full bg-white transition-transform`}),e.jsx("input",{type:"checkbox",className:"sr-only",checked:h,onChange:r=>z(r.target.checked)})]})]})}),e.jsx("div",{className:"pt-4 border-t border-elm-border-subtle",children:e.jsxs("label",{className:"flex items-center justify-between cursor-pointer group",children:[e.jsxs("div",{className:"flex flex-col gap-0.5 pr-4",children:[e.jsx("span",{className:"text-sm font-semibold text-(--elm-text,var(--color-gray-800)) dark:text-(--elm-text,var(--color-gray-100))",children:"Return to select after each shape"}),e.jsx("span",{className:"text-xs text-elm-text-muted",children:"Drawing tools deactivate after every shape, so you go back to selection. Turn off to keep the tool active and draw multiple shapes in a row."})]}),e.jsxs("div",{className:`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-elm-focus-ring has-[:focus-visible]:ring-offset-2 has-[:focus-visible]:ring-offset-elm-surface ${u?"bg-primary-500":"bg-(--elm-border-strong,var(--color-gray-200)) dark:bg-(--elm-border-strong,var(--color-gray-600))"}`,children:[e.jsx("span",{className:`${u?"translate-x-6":"translate-x-1"} inline-block h-4 w-4 transform rounded-full bg-white transition-transform`}),e.jsx("input",{type:"checkbox",className:"sr-only",checked:u,onChange:r=>_(r.target.checked)})]})]})})]}),e.jsx("div",{onMouseDown:R,className:"absolute bottom-0 right-0 w-4 h-4 cursor-se-resize select-none",style:{zIndex:10},"aria-hidden":!0,children:e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 10 10",className:"absolute bottom-1 right-1 text-elm-text-disabled",children:e.jsx("path",{d:"M9 1L1 9M9 5L5 9",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})})]}):null}exports.default=X;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),p=require("react"),l=require("./index-mfb91TEp.cjs"),G=require("./useAccentStyle-hsGvyHZc.cjs"),E=require("@element-editor/core"),n=require("@phosphor-icons/react"),s=require("./useAdapterControls-BBObhzVX.cjs"),v=require("./useWindowFocus-CRWNNxOL.cjs"),I="elm_settings_win_size",D=320,C=320,U={w:384,h:560};function X(){const c=s.useUIStore(r=>r.settingsModalOpen),y=s.useUIStore(r=>r.setSettingsModalOpen),t=s.useDataStore(r=>r.geometryMode),w=s.useDataStore(r=>r.setGeometryMode),$=s.useUIStore(r=>r.setShowMeasurements),d=s.useUIStore(r=>r.showMeasurements),m=s.useUIStore(r=>r.showFeatureNameOnHover),W=s.useUIStore(r=>r.setShowFeatureNameOnHover),x=s.useUIStore(r=>r.topoEditEnabled),H=s.useUIStore(r=>r.setTopoEditEnabled),u=s.useUIStore(r=>r.autoExitAfterDraw),_=s.useUIStore(r=>r.setAutoExitAfterDraw),h=s.useUIStore(r=>r.snapEnabled),z=s.useUIStore(r=>r.setSnapEnabled),j=s.useUIStore(r=>r.userTheme),T=s.useUIStore(r=>r.setUserTheme),A=s.useTheme(),{pos:k,onHandleMouseDown:O}=v.useDragWindow("elm_settings_win",{x:80,y:80}),g=G.useElementEditorConfig(),{zIndex:N,focus:L}=v.useWindowFocus(c),b=p.useRef(null);l.useWindowEscape(b,c,()=>y(!1),N);const[i,q]=p.useState(()=>{try{const r=E.readStorage(I,g);return r?JSON.parse(r):U}catch{return U}}),F=p.useCallback((r,a)=>{E.writeStorage(I,JSON.stringify({w:r,h:a}),g)},[g]);function R(r){r.preventDefault(),r.stopPropagation();const a=r.clientX,f=r.clientY,B=i.w,P=i.h,Y=l.startDragShield("se-resize");function S(o){q({w:Math.max(D,Math.min(window.innerWidth*.9,B+o.clientX-a)),h:Math.max(C,Math.min(window.innerHeight*.85,P+o.clientY-f))})}function M(){Y(),document.removeEventListener("mousemove",S),document.removeEventListener("mouseup",M);const o=b.current;o&&F(o.offsetWidth,o.offsetHeight)}document.addEventListener("mousemove",S),document.addEventListener("mouseup",M)}return c?e.jsxs("div",{ref:b,[l.WINDOW_ATTR]:"",role:"dialog","aria-label":"Settings",onMouseDownCapture:L,className:"fixed flex flex-col bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 shadow-elm-raised rounded-elm-window overflow-hidden","data-elm-theme":A,style:{left:k.x,top:k.y,zIndex:N,minWidth:D,minHeight:C,width:i.w,height:i.h,maxWidth:"90vw",maxHeight:"85vh"},children:[e.jsxs("div",{onMouseDown:O,className:"flex items-center justify-between px-4 py-3 border-b border-elm-border flex-shrink-0 select-none",style:{cursor:"grab"},children:[e.jsx("span",{className:"text-sm font-semibold text-(--elm-text,var(--color-gray-900)) dark:text-(--elm-text,var(--color-gray-100))",children:"Settings"}),e.jsx(v.CloseButton,{onClick:()=>y(!1),label:"Close settings"})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto p-5 space-y-6 min-h-0",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("h3",{className:"text-sm font-medium text-elm-text-secondary",children:"Appearance"}),e.jsx("div",{className:"flex rounded-elm border border-elm-border overflow-hidden",children:[{value:"light",label:"Light",Icon:n.Sun},{value:"dark",label:"Dark",Icon:n.Moon},{value:"system",label:"Auto",Icon:n.Desktop}].map(({value:r,label:a,Icon:f})=>e.jsxs("button",{onClick:()=>T(r),className:`flex-1 flex items-center justify-center gap-1.5 py-2 text-xs font-medium transition-colors ${j===r?"bg-primary-500 hover:bg-primary-600 text-white":"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-200))"}`,children:[e.jsx(f,{size:14,weight:j===r?"fill":"regular"}),a]},r))})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-sm font-medium text-elm-text-secondary",children:"Drawing mode"}),e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsxs("button",{onClick:()=>w("visual"),className:`p-3 text-center rounded-elm border text-sm transition-colors ${t==="visual"?"border-primary-500 bg-primary-50 dark:bg-white/5 hover:bg-primary-100 dark:hover:bg-white/10 ring-1 ring-primary-500/20":"border-(--elm-border,var(--color-gray-200)) dark:border-(--elm-border,var(--color-gray-600)) bg-elm-surface-raised hover:border-(--elm-border-strong,var(--color-gray-300)) dark:hover:border-(--elm-border-strong,var(--color-gray-500)) hover:bg-(--elm-surface-hover,var(--color-gray-50)) dark:hover:bg-(--elm-surface-hover,color-mix(in_oklab,var(--color-gray-700)_50%,transparent))"}`,children:[e.jsx(n.Monitor,{size:32,weight:t==="visual"?"fill":"regular",className:`mx-auto mb-2 ${t==="visual"?"text-primary-600":"text-elm-text-muted"}`}),e.jsx("span",{className:`block mb-1 font-semibold ${t==="visual"?"text-primary-800 dark:text-primary-300":"text-(--elm-text-secondary,var(--color-gray-700)) dark:text-(--elm-text-secondary,var(--color-gray-200))"}`,children:"Visual"}),e.jsx("p",{className:"text-xs leading-relaxed text-elm-text-muted",children:"Shapes keep their proportions on screen. Best for sketching and layouts."})]}),e.jsxs("button",{onClick:()=>w("spatial"),className:`p-3 text-center rounded-elm border text-sm transition-colors ${t==="spatial"?"border-primary-500 bg-primary-50 dark:bg-white/5 hover:bg-primary-100 dark:hover:bg-white/10 ring-1 ring-primary-500/20":"border-(--elm-border,var(--color-gray-200)) dark:border-(--elm-border,var(--color-gray-600)) bg-elm-surface-raised hover:border-(--elm-border-strong,var(--color-gray-300)) dark:hover:border-(--elm-border-strong,var(--color-gray-500)) hover:bg-(--elm-surface-hover,var(--color-gray-50)) dark:hover:bg-(--elm-surface-hover,color-mix(in_oklab,var(--color-gray-700)_50%,transparent))"}`,children:[e.jsx(n.GlobeHemisphereWest,{size:32,weight:t==="spatial"?"fill":"regular",className:`mx-auto mb-2 ${t==="spatial"?"text-primary-600":"text-elm-text-muted"}`}),e.jsx("span",{className:`block mb-1 font-semibold ${t==="spatial"?"text-primary-800 dark:text-primary-300":"text-(--elm-text-secondary,var(--color-gray-700)) dark:text-(--elm-text-secondary,var(--color-gray-200))"}`,children:"Spatial"}),e.jsx("p",{className:"text-xs leading-relaxed text-elm-text-muted",children:"Shapes keep their true size on the ground. Best for exact areas and distances."})]})]})]}),e.jsx("div",{className:"pt-4 border-t border-elm-border-subtle",children:e.jsxs("label",{className:"flex items-center justify-between cursor-pointer group",children:[e.jsxs("div",{className:"flex flex-col gap-0.5 pr-4",children:[e.jsx("span",{className:"text-sm font-semibold text-(--elm-text,var(--color-gray-800)) dark:text-(--elm-text,var(--color-gray-100))",children:"Show measurements"}),e.jsx("span",{className:"text-xs text-elm-text-muted",children:"Display live dimensions and coordinates at the cursor while drawing shapes."})]}),e.jsxs("div",{className:`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-elm-focus-ring has-[:focus-visible]:ring-offset-2 has-[:focus-visible]:ring-offset-elm-surface ${d?"bg-primary-500":"bg-(--elm-border-strong,var(--color-gray-200)) dark:bg-(--elm-border-strong,var(--color-gray-600))"}`,children:[e.jsx("span",{className:`${d?"translate-x-6":"translate-x-1"} inline-block h-4 w-4 transform rounded-full bg-white transition-transform`}),e.jsx("input",{type:"checkbox",className:"sr-only",checked:d,onChange:r=>$(r.target.checked)})]})]})}),e.jsx("div",{className:"pt-4 border-t border-elm-border-subtle",children:e.jsxs("label",{className:"flex items-center justify-between cursor-pointer group",children:[e.jsxs("div",{className:"flex flex-col gap-0.5 pr-4",children:[e.jsx("span",{className:"text-sm font-semibold text-(--elm-text,var(--color-gray-800)) dark:text-(--elm-text,var(--color-gray-100))",children:"Show name on hover"}),e.jsx("span",{className:"text-xs text-elm-text-muted",children:"Display the feature name when hovering over shapes on the map."})]}),e.jsxs("div",{className:`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-elm-focus-ring has-[:focus-visible]:ring-offset-2 has-[:focus-visible]:ring-offset-elm-surface ${m?"bg-primary-500":"bg-(--elm-border-strong,var(--color-gray-200)) dark:bg-(--elm-border-strong,var(--color-gray-600))"}`,children:[e.jsx("span",{className:`${m?"translate-x-6":"translate-x-1"} inline-block h-4 w-4 transform rounded-full bg-white transition-transform`}),e.jsx("input",{type:"checkbox",className:"sr-only",checked:m,onChange:r=>W(r.target.checked)})]})]})}),e.jsx("div",{className:"pt-4 border-t border-elm-border-subtle",children:e.jsxs("label",{className:"flex items-center justify-between cursor-pointer group",children:[e.jsxs("div",{className:"flex flex-col gap-0.5 pr-4",children:[e.jsx("span",{className:"text-sm font-semibold text-(--elm-text,var(--color-gray-800)) dark:text-(--elm-text,var(--color-gray-100))",children:"Topological editing"}),e.jsxs("span",{className:"text-xs text-elm-text-muted",children:["When editing points, shared borders between areas update together. Hold ",l.isMacPlatform()?"⌘ Cmd":"Ctrl"," to temporarily disable."]})]}),e.jsxs("div",{className:`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-elm-focus-ring has-[:focus-visible]:ring-offset-2 has-[:focus-visible]:ring-offset-elm-surface ${x?"bg-primary-500":"bg-(--elm-border-strong,var(--color-gray-200)) dark:bg-(--elm-border-strong,var(--color-gray-600))"}`,children:[e.jsx("span",{className:`${x?"translate-x-6":"translate-x-1"} inline-block h-4 w-4 transform rounded-full bg-white transition-transform`}),e.jsx("input",{type:"checkbox",className:"sr-only",checked:x,onChange:r=>H(r.target.checked)})]})]})}),e.jsx("div",{className:"pt-4 border-t border-elm-border-subtle",children:e.jsxs("label",{className:"flex items-center justify-between cursor-pointer group",children:[e.jsxs("div",{className:"flex flex-col gap-0.5 pr-4",children:[e.jsx("span",{className:"text-sm font-semibold text-(--elm-text,var(--color-gray-800)) dark:text-(--elm-text,var(--color-gray-100))",children:"Snapping"}),e.jsxs("span",{className:"text-xs text-elm-text-muted",children:["Snap to nearby points and edges while drawing. Hold ",l.isMacPlatform()?"⌘ Cmd":"Ctrl"," to temporarily disable."]})]}),e.jsxs("div",{className:`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-elm-focus-ring has-[:focus-visible]:ring-offset-2 has-[:focus-visible]:ring-offset-elm-surface ${h?"bg-primary-500":"bg-(--elm-border-strong,var(--color-gray-200)) dark:bg-(--elm-border-strong,var(--color-gray-600))"}`,children:[e.jsx("span",{className:`${h?"translate-x-6":"translate-x-1"} inline-block h-4 w-4 transform rounded-full bg-white transition-transform`}),e.jsx("input",{type:"checkbox",className:"sr-only",checked:h,onChange:r=>z(r.target.checked)})]})]})}),e.jsx("div",{className:"pt-4 border-t border-elm-border-subtle",children:e.jsxs("label",{className:"flex items-center justify-between cursor-pointer group",children:[e.jsxs("div",{className:"flex flex-col gap-0.5 pr-4",children:[e.jsx("span",{className:"text-sm font-semibold text-(--elm-text,var(--color-gray-800)) dark:text-(--elm-text,var(--color-gray-100))",children:"Return to select after each shape"}),e.jsx("span",{className:"text-xs text-elm-text-muted",children:"Drawing tools deactivate after every shape, so you go back to selection. Turn off to keep the tool active and draw multiple shapes in a row."})]}),e.jsxs("div",{className:`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-elm-focus-ring has-[:focus-visible]:ring-offset-2 has-[:focus-visible]:ring-offset-elm-surface ${u?"bg-primary-500":"bg-(--elm-border-strong,var(--color-gray-200)) dark:bg-(--elm-border-strong,var(--color-gray-600))"}`,children:[e.jsx("span",{className:`${u?"translate-x-6":"translate-x-1"} inline-block h-4 w-4 transform rounded-full bg-white transition-transform`}),e.jsx("input",{type:"checkbox",className:"sr-only",checked:u,onChange:r=>_(r.target.checked)})]})]})})]}),e.jsx("div",{onMouseDown:R,className:"absolute bottom-0 right-0 w-4 h-4 cursor-se-resize select-none",style:{zIndex:10},"aria-hidden":!0,children:e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 10 10",className:"absolute bottom-1 right-1 text-elm-text-disabled",children:e.jsx("path",{d:"M9 1L1 9M9 5L5 9",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})})]}):null}exports.default=X;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),d=require("react"),v=require("./index-DG4wEjGj.cjs"),$=require("@phosphor-icons/react"),S=require("./useAdapterControls-BBObhzVX.cjs"),J=require("./useAccentStyle-hsGvyHZc.cjs"),b=require("@element-editor/core"),m=require("@element-editor/core/internal"),de=require("./EditToolbarBtn-Ch9HCLHq.cjs"),D=require("./useWindowFocus-EemgNOuz.cjs"),ue={"place-point":"point","draw-line":"line","draw-polygon":"polygon","draw-route":"route","draw-circle":"circle","draw-rect":"rectangle","draw-freehand":"freehand",picker:"picker"};function me({current:n,onCapture:s,onCancel:i}){const a=d.useRef(null);return d.useEffect(()=>{var r,l;(r=a.current)==null||r.focus(),(l=a.current)==null||l.select()},[]),t.jsx("input",{ref:a,readOnly:!0,value:n.toUpperCase(),size:1,onFocus:r=>r.currentTarget.select(),onKeyDown:r=>{if(r.preventDefault(),r.stopPropagation(),r.key==="Escape"){i();return}r.key.length===1&&!r.metaKey&&!r.ctrlKey&&!r.altKey&&r.key!==" "&&s(r.key.toLowerCase())},onBlur:i,"aria-label":"Press a key to rebind",className:"inline-block w-6 h-5 text-[11px] font-medium font-elm rounded-elm-chip border border-primary-400 bg-primary-50 text-primary-700 text-center p-0 outline-none caret-transparent selection:bg-primary-500 selection:text-white"})}function he(){const n=S.useUIStore(e=>e.shortcutsModalOpen),s=S.useUIStore(e=>e.closeShortcutsModal),i=S.useUIStore(e=>e.readonly),a=S.useUIStore(e=>e.unavailableTools),{tools:r,ui:l,toolbar:j}=J.useElementEditorConfig(),k=j.direction==="vertical",x=r==="all"?null:new Set(r);function p(e){if(e==="toggle-table")return l.dataTable;if(e==="toggle-geojson")return l.geojsonEditor;if(e==="toggle-schema")return l.schemaEditor;if(e==="toggle-sidebar")return l.layerList;if(e==="set-zoom")return l.zoomIndicator;const o=ue[e];return o&&a.includes(o)?!1:o&&x?x.has(o):!0}const{custom:g,getKey:G,setKey:Q,resetKey:ee,resetAll:te}=v.useShortcutConfig(),[E,T]=d.useState(null),[c,u]=d.useState(null),{pos:L,onHandleMouseDown:re}=D.useDragWindow("elm_shortcuts_win",{x:24,y:120}),N=J.useElementEditorConfig(),{zIndex:z,focus:oe}=D.useWindowFocus(n),H="elm_shortcuts_win_size",K=250,F=260,M=d.useRef(null);v.useWindowEscape(M,n,s,z);const[y,ne]=d.useState(()=>{try{const e=b.readStorage(H,N);return e?JSON.parse(e):{w:440,h:560}}catch{return{w:440,h:560}}}),se=d.useCallback((e,o)=>{b.writeStorage(H,JSON.stringify({w:e,h:o}),N)},[N]);function le(e){e.preventDefault(),e.stopPropagation();const o=e.clientX,f=e.clientY,w=y.w,O=y.h,R=v.startDragShield("se-resize");function V(h){ne({w:Math.max(K,Math.min(window.innerWidth*.9,w+h.clientX-o)),h:Math.max(F,Math.min(window.innerHeight*.85,O+h.clientY-f))})}function Y(){R(),document.removeEventListener("mousemove",V),document.removeEventListener("mouseup",Y);const h=M.current;h&&se(h.offsetWidth,h.offsetHeight)}document.addEventListener("mousemove",V),document.addEventListener("mouseup",Y)}if(d.useEffect(()=>{if(!n||E===null)return;function e(o){o.key==="Escape"&&(W(),o.stopPropagation())}return window.addEventListener("keydown",e,{capture:!0}),()=>window.removeEventListener("keydown",e,{capture:!0})},[n,E]),!n)return null;function ie(e,o){var w;const f=Q(e,o);if(f){const O=((w=m.CUSTOMIZABLE_SHORTCUTS.find(R=>R.id===f))==null?void 0:w.label)??f;u({id:e,msg:`"${o.toUpperCase()}" is already used by "${O}"`,attemptedKey:o});return}u(null),T(null)}function W(){T(null),u(null)}function ae(e){T(e),u(null)}function _(e){return{label:e.label,isChanged:g[e.id]!==void 0,isCapturing:E===e.id,keyDisplay:G(e.id),onStartCapture:()=>ae(e.id),onCapture:o=>ie(e.id,o),onCancelCapture:W,onReset:()=>{ee(e.id),u(null)},conflictMsg:(c==null?void 0:c.id)===e.id?c.msg:void 0,onDismissConflict:()=>u(null),captureDisplay:(c==null?void 0:c.id)===e.id?c.attemptedKey:void 0}}const A=m.CUSTOMIZABLE_SHORTCUTS.filter(e=>e.category==="drawing"&&!i&&p(e.id)),q=m.CUSTOMIZABLE_SHORTCUTS.filter(e=>e.category==="view"&&p(e.id)),B=m.CUSTOMIZABLE_SHORTCUTS.filter(e=>e.category==="editing"&&!i&&p(e.id)),P=m.FIXED_SHORTCUTS.filter(e=>e.category==="view"&&!(k&&e.label==="Search places")),X=i?[]:m.FIXED_SHORTCUTS.filter(e=>e.category==="editing"),Z=i?[]:m.FIXED_SHORTCUTS.filter(e=>e.category==="drawing"),ce=Object.keys(g).length>0;return t.jsxs("div",{ref:M,[v.WINDOW_ATTR]:"",role:"dialog","aria-label":"Keyboard shortcuts",onMouseDownCapture:oe,className:"fixed flex flex-col bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 shadow-elm-raised rounded-elm-window overflow-hidden",style:{left:L.x,top:L.y,zIndex:z,minWidth:K,minHeight:F,width:y.w,height:y.h,maxWidth:"90vw",maxHeight:"85vh"},children:[t.jsxs("div",{onMouseDown:re,className:"flex items-center justify-between px-4 py-3 border-b border-elm-border flex-shrink-0 select-none",style:{cursor:"grab"},children:[t.jsx("span",{className:"text-sm font-semibold text-(--elm-text,var(--color-gray-900)) dark:text-(--elm-text,var(--color-gray-100))",children:"Keyboard shortcuts"}),t.jsx(D.CloseButton,{onClick:s,label:"Close keyboard shortcuts"})]}),t.jsxs("div",{className:"flex-1 overflow-y-auto px-4 pt-3 pb-2 space-y-4 min-h-0",children:[A.length>0&&t.jsx(C,{title:"Drawing tools",children:A.map(e=>t.jsx(U,{..._(e)},e.id))}),(q.length>0||P.length>0)&&t.jsxs(C,{title:"View",children:[q.map(e=>t.jsx(U,{..._(e)},e.id)),P.map(e=>t.jsx(I,{label:e.label,display:b.getFixedShortcutFullDisplay(e.id)},e.id))]}),(B.length>0||X.length>0)&&t.jsxs(C,{title:"Editing",children:[B.map(e=>t.jsx(U,{..._(e)},e.id)),X.map(e=>t.jsx(I,{label:e.label,display:b.getFixedShortcutFullDisplay(e.id)},e.id))]}),Z.length>0&&t.jsx(C,{title:"While drawing",children:Z.map(e=>t.jsx(I,{label:e.label,display:b.getFixedShortcutFullDisplay(e.id)},e.id))})]}),t.jsxs("div",{className:"flex-shrink-0 border-t border-elm-border-subtle px-6 py-2.5 flex items-center justify-between gap-3",children:[t.jsx("p",{className:"text-xs text-elm-text-subtle flex-1",children:"Click a key badge to rebind it"}),ce&&t.jsxs("button",{onClick:()=>{te(),u(null)},className:"flex items-center gap-1 text-xs text-elm-text-subtle hover:text-(--elm-text-secondary,var(--color-gray-700)) dark:hover:text-(--elm-text-secondary,var(--color-gray-300)) hover:bg-elm-surface-hover rounded-elm-chip px-1.5 py-0.5 -mr-1.5 transition-colors flex-shrink-0",children:[t.jsx($.ArrowCounterClockwise,{size:11}),"Reset all"]})]}),t.jsx("div",{onMouseDown:le,className:"absolute bottom-0 right-0 w-4 h-4 cursor-se-resize select-none",style:{zIndex:10},"aria-hidden":!0,children:t.jsx("svg",{width:"10",height:"10",viewBox:"0 0 10 10",className:"absolute bottom-1 right-1 text-elm-text-disabled",children:t.jsx("path",{d:"M9 1L1 9M9 5L5 9",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})})]})}function C({title:n,children:s}){return t.jsxs("section",{children:[t.jsx("h3",{className:"text-[10px] font-semibold text-elm-text-subtle uppercase tracking-wider mb-1.5 px-2",children:n}),t.jsx("div",{className:"space-y-0.5",children:s})]})}function U({label:n,isChanged:s,isCapturing:i,keyDisplay:a,onStartCapture:r,onCapture:l,onCancelCapture:j,onReset:k,conflictMsg:x,onDismissConflict:p,captureDisplay:g}){return t.jsxs("div",{className:"flex items-center justify-between py-1 px-2 rounded-elm-card hover:bg-(--elm-surface-hover,var(--color-gray-50)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-800)) group",children:[t.jsx("span",{className:"text-sm text-elm-text-secondary",children:n}),t.jsxs("div",{className:"flex items-center gap-1.5 relative",children:[x&&t.jsxs("button",{type:"button",onClick:p,className:"absolute right-full mr-2 top-1/2 -translate-y-1/2 whitespace-nowrap bg-rose-500/95 text-white text-xs px-2.5 py-1.5 rounded-elm-card shadow-elm backdrop-blur-sm hover:bg-rose-600/95 transition-colors","aria-label":"Dismiss conflict message",children:[x,t.jsx("span",{"aria-hidden":!0,className:"absolute left-full top-1/2 -translate-y-1/2 border-4 border-transparent border-l-rose-500/95"})]}),s&&t.jsx("button",{onClick:k,className:"p-0.5 rounded-elm-chip text-elm-text hover:bg-(--elm-surface-hover,var(--color-gray-200)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-700)) transition-colors","aria-label":"Reset to default",title:"Reset to default",children:t.jsx($.ArrowCounterClockwise,{size:14,weight:"bold"})}),i?t.jsx(me,{current:g??a,onCapture:l,onCancel:j},g??a):t.jsx("button",{onClick:r,title:"Click to rebind",className:"inline-flex items-center justify-center min-w-[1.5rem] h-5 px-1.5 text-[11px] font-medium font-elm rounded-elm-chip transition-colors 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)] hover:bg-(--elm-control-hover,var(--color-gray-200)) dark:hover:bg-(--elm-control-hover,var(--color-gray-600)) hover:border-(--elm-border-strong,var(--color-gray-400)) dark:hover:border-(--elm-border-strong,var(--color-gray-500))",children:a.toUpperCase()})]})]})}function I({label:n,display:s}){return t.jsxs("div",{className:"flex items-center justify-between py-1 px-2 rounded-elm-card",children:[t.jsx("span",{className:"text-sm text-elm-text-secondary",children:n}),t.jsx(de.Kbd,{children:s})]})}exports.ShortcutsModal=he;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),d=require("react"),v=require("./index-mfb91TEp.cjs"),$=require("@phosphor-icons/react"),S=require("./useAdapterControls-BBObhzVX.cjs"),J=require("./useAccentStyle-hsGvyHZc.cjs"),b=require("@element-editor/core"),m=require("@element-editor/core/internal"),de=require("./EditToolbarBtn-Ch9HCLHq.cjs"),D=require("./useWindowFocus-CRWNNxOL.cjs"),ue={"place-point":"point","draw-line":"line","draw-polygon":"polygon","draw-route":"route","draw-circle":"circle","draw-rect":"rectangle","draw-freehand":"freehand",picker:"picker"};function me({current:n,onCapture:s,onCancel:i}){const a=d.useRef(null);return d.useEffect(()=>{var r,l;(r=a.current)==null||r.focus(),(l=a.current)==null||l.select()},[]),t.jsx("input",{ref:a,readOnly:!0,value:n.toUpperCase(),size:1,onFocus:r=>r.currentTarget.select(),onKeyDown:r=>{if(r.preventDefault(),r.stopPropagation(),r.key==="Escape"){i();return}r.key.length===1&&!r.metaKey&&!r.ctrlKey&&!r.altKey&&r.key!==" "&&s(r.key.toLowerCase())},onBlur:i,"aria-label":"Press a key to rebind",className:"inline-block w-6 h-5 text-[11px] font-medium font-elm rounded-elm-chip border border-primary-400 bg-primary-50 text-primary-700 text-center p-0 outline-none caret-transparent selection:bg-primary-500 selection:text-white"})}function he(){const n=S.useUIStore(e=>e.shortcutsModalOpen),s=S.useUIStore(e=>e.closeShortcutsModal),i=S.useUIStore(e=>e.readonly),a=S.useUIStore(e=>e.unavailableTools),{tools:r,ui:l,toolbar:j}=J.useElementEditorConfig(),k=j.direction==="vertical",x=r==="all"?null:new Set(r);function p(e){if(e==="toggle-table")return l.dataTable;if(e==="toggle-geojson")return l.geojsonEditor;if(e==="toggle-schema")return l.schemaEditor;if(e==="toggle-sidebar")return l.layerList;if(e==="set-zoom")return l.zoomIndicator;const o=ue[e];return o&&a.includes(o)?!1:o&&x?x.has(o):!0}const{custom:g,getKey:G,setKey:Q,resetKey:ee,resetAll:te}=v.useShortcutConfig(),[E,T]=d.useState(null),[c,u]=d.useState(null),{pos:L,onHandleMouseDown:re}=D.useDragWindow("elm_shortcuts_win",{x:24,y:120}),N=J.useElementEditorConfig(),{zIndex:z,focus:oe}=D.useWindowFocus(n),H="elm_shortcuts_win_size",K=250,F=260,M=d.useRef(null);v.useWindowEscape(M,n,s,z);const[y,ne]=d.useState(()=>{try{const e=b.readStorage(H,N);return e?JSON.parse(e):{w:440,h:560}}catch{return{w:440,h:560}}}),se=d.useCallback((e,o)=>{b.writeStorage(H,JSON.stringify({w:e,h:o}),N)},[N]);function le(e){e.preventDefault(),e.stopPropagation();const o=e.clientX,f=e.clientY,w=y.w,O=y.h,R=v.startDragShield("se-resize");function V(h){ne({w:Math.max(K,Math.min(window.innerWidth*.9,w+h.clientX-o)),h:Math.max(F,Math.min(window.innerHeight*.85,O+h.clientY-f))})}function Y(){R(),document.removeEventListener("mousemove",V),document.removeEventListener("mouseup",Y);const h=M.current;h&&se(h.offsetWidth,h.offsetHeight)}document.addEventListener("mousemove",V),document.addEventListener("mouseup",Y)}if(d.useEffect(()=>{if(!n||E===null)return;function e(o){o.key==="Escape"&&(W(),o.stopPropagation())}return window.addEventListener("keydown",e,{capture:!0}),()=>window.removeEventListener("keydown",e,{capture:!0})},[n,E]),!n)return null;function ie(e,o){var w;const f=Q(e,o);if(f){const O=((w=m.CUSTOMIZABLE_SHORTCUTS.find(R=>R.id===f))==null?void 0:w.label)??f;u({id:e,msg:`"${o.toUpperCase()}" is already used by "${O}"`,attemptedKey:o});return}u(null),T(null)}function W(){T(null),u(null)}function ae(e){T(e),u(null)}function _(e){return{label:e.label,isChanged:g[e.id]!==void 0,isCapturing:E===e.id,keyDisplay:G(e.id),onStartCapture:()=>ae(e.id),onCapture:o=>ie(e.id,o),onCancelCapture:W,onReset:()=>{ee(e.id),u(null)},conflictMsg:(c==null?void 0:c.id)===e.id?c.msg:void 0,onDismissConflict:()=>u(null),captureDisplay:(c==null?void 0:c.id)===e.id?c.attemptedKey:void 0}}const A=m.CUSTOMIZABLE_SHORTCUTS.filter(e=>e.category==="drawing"&&!i&&p(e.id)),q=m.CUSTOMIZABLE_SHORTCUTS.filter(e=>e.category==="view"&&p(e.id)),B=m.CUSTOMIZABLE_SHORTCUTS.filter(e=>e.category==="editing"&&!i&&p(e.id)),P=m.FIXED_SHORTCUTS.filter(e=>e.category==="view"&&!(k&&e.label==="Search places")),X=i?[]:m.FIXED_SHORTCUTS.filter(e=>e.category==="editing"),Z=i?[]:m.FIXED_SHORTCUTS.filter(e=>e.category==="drawing"),ce=Object.keys(g).length>0;return t.jsxs("div",{ref:M,[v.WINDOW_ATTR]:"",role:"dialog","aria-label":"Keyboard shortcuts",onMouseDownCapture:oe,className:"fixed flex flex-col bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 shadow-elm-raised rounded-elm-window overflow-hidden",style:{left:L.x,top:L.y,zIndex:z,minWidth:K,minHeight:F,width:y.w,height:y.h,maxWidth:"90vw",maxHeight:"85vh"},children:[t.jsxs("div",{onMouseDown:re,className:"flex items-center justify-between px-4 py-3 border-b border-elm-border flex-shrink-0 select-none",style:{cursor:"grab"},children:[t.jsx("span",{className:"text-sm font-semibold text-(--elm-text,var(--color-gray-900)) dark:text-(--elm-text,var(--color-gray-100))",children:"Keyboard shortcuts"}),t.jsx(D.CloseButton,{onClick:s,label:"Close keyboard shortcuts"})]}),t.jsxs("div",{className:"flex-1 overflow-y-auto px-4 pt-3 pb-2 space-y-4 min-h-0",children:[A.length>0&&t.jsx(C,{title:"Drawing tools",children:A.map(e=>t.jsx(U,{..._(e)},e.id))}),(q.length>0||P.length>0)&&t.jsxs(C,{title:"View",children:[q.map(e=>t.jsx(U,{..._(e)},e.id)),P.map(e=>t.jsx(I,{label:e.label,display:b.getFixedShortcutFullDisplay(e.id)},e.id))]}),(B.length>0||X.length>0)&&t.jsxs(C,{title:"Editing",children:[B.map(e=>t.jsx(U,{..._(e)},e.id)),X.map(e=>t.jsx(I,{label:e.label,display:b.getFixedShortcutFullDisplay(e.id)},e.id))]}),Z.length>0&&t.jsx(C,{title:"While drawing",children:Z.map(e=>t.jsx(I,{label:e.label,display:b.getFixedShortcutFullDisplay(e.id)},e.id))})]}),t.jsxs("div",{className:"flex-shrink-0 border-t border-elm-border-subtle px-6 py-2.5 flex items-center justify-between gap-3",children:[t.jsx("p",{className:"text-xs text-elm-text-subtle flex-1",children:"Click a key badge to rebind it"}),ce&&t.jsxs("button",{onClick:()=>{te(),u(null)},className:"flex items-center gap-1 text-xs text-elm-text-subtle hover:text-(--elm-text-secondary,var(--color-gray-700)) dark:hover:text-(--elm-text-secondary,var(--color-gray-300)) hover:bg-elm-surface-hover rounded-elm-chip px-1.5 py-0.5 -mr-1.5 transition-colors flex-shrink-0",children:[t.jsx($.ArrowCounterClockwise,{size:11}),"Reset all"]})]}),t.jsx("div",{onMouseDown:le,className:"absolute bottom-0 right-0 w-4 h-4 cursor-se-resize select-none",style:{zIndex:10},"aria-hidden":!0,children:t.jsx("svg",{width:"10",height:"10",viewBox:"0 0 10 10",className:"absolute bottom-1 right-1 text-elm-text-disabled",children:t.jsx("path",{d:"M9 1L1 9M9 5L5 9",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})})]})}function C({title:n,children:s}){return t.jsxs("section",{children:[t.jsx("h3",{className:"text-[10px] font-semibold text-elm-text-subtle uppercase tracking-wider mb-1.5 px-2",children:n}),t.jsx("div",{className:"space-y-0.5",children:s})]})}function U({label:n,isChanged:s,isCapturing:i,keyDisplay:a,onStartCapture:r,onCapture:l,onCancelCapture:j,onReset:k,conflictMsg:x,onDismissConflict:p,captureDisplay:g}){return t.jsxs("div",{className:"flex items-center justify-between py-1 px-2 rounded-elm-card hover:bg-(--elm-surface-hover,var(--color-gray-50)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-800)) group",children:[t.jsx("span",{className:"text-sm text-elm-text-secondary",children:n}),t.jsxs("div",{className:"flex items-center gap-1.5 relative",children:[x&&t.jsxs("button",{type:"button",onClick:p,className:"absolute right-full mr-2 top-1/2 -translate-y-1/2 whitespace-nowrap bg-rose-500/95 text-white text-xs px-2.5 py-1.5 rounded-elm-card shadow-elm backdrop-blur-sm hover:bg-rose-600/95 transition-colors","aria-label":"Dismiss conflict message",children:[x,t.jsx("span",{"aria-hidden":!0,className:"absolute left-full top-1/2 -translate-y-1/2 border-4 border-transparent border-l-rose-500/95"})]}),s&&t.jsx("button",{onClick:k,className:"p-0.5 rounded-elm-chip text-elm-text hover:bg-(--elm-surface-hover,var(--color-gray-200)) dark:hover:bg-(--elm-surface-hover,var(--color-gray-700)) transition-colors","aria-label":"Reset to default",title:"Reset to default",children:t.jsx($.ArrowCounterClockwise,{size:14,weight:"bold"})}),i?t.jsx(me,{current:g??a,onCapture:l,onCancel:j},g??a):t.jsx("button",{onClick:r,title:"Click to rebind",className:"inline-flex items-center justify-center min-w-[1.5rem] h-5 px-1.5 text-[11px] font-medium font-elm rounded-elm-chip transition-colors 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)] hover:bg-(--elm-control-hover,var(--color-gray-200)) dark:hover:bg-(--elm-control-hover,var(--color-gray-600)) hover:border-(--elm-border-strong,var(--color-gray-400)) dark:hover:border-(--elm-border-strong,var(--color-gray-500))",children:a.toUpperCase()})]})]})}function I({label:n,display:s}){return t.jsxs("div",{className:"flex items-center justify-between py-1 px-2 rounded-elm-card",children:[t.jsx("span",{className:"text-sm text-elm-text-secondary",children:n}),t.jsx(de.Kbd,{children:s})]})}exports.ShortcutsModal=he;
@@ -1,13 +1,13 @@
1
1
  import { jsxs as l, jsx as t } from "react/jsx-runtime";
2
2
  import { useState as z, useRef as q, useCallback as me, useEffect as G } from "react";
3
- import { b as he, u as pe, W as fe, s as ge } from "./index-CILw1Du5.js";
3
+ import { b as he, u as pe, W as fe, s as ge } from "./index-rT-R0kyV.js";
4
4
  import { ArrowCounterClockwise as Q } from "@phosphor-icons/react";
5
5
  import { u as y } from "./useAdapterControls-DVjkwRZ_.js";
6
6
  import { u as $ } from "./useAccentStyle-CPo2XqAn.js";
7
7
  import { readStorage as be, writeStorage as xe, getFixedShortcutFullDisplay as T } from "@element-editor/core";
8
8
  import { CUSTOMIZABLE_SHORTCUTS as w, FIXED_SHORTCUTS as W } from "@element-editor/core/internal";
9
9
  import { K as ye } from "./EditToolbarBtn-SR4xHd8G.js";
10
- import { u as we, a as ve, C as Ce } from "./useWindowFocus-DuQVjnHE.js";
10
+ import { u as we, a as ve, C as Ce } from "./useWindowFocus-CroxgGOo.js";
11
11
  const ke = {
12
12
  "place-point": "point",
13
13
  "draw-line": "line",
@@ -101,7 +101,7 @@ export interface RasterBasemap {
101
101
  * Eight positions — the four corners, the four edge-centers:
102
102
  *
103
103
  * top-left top-center top-right
104
- * left-center · right-center
104
+ * left-center right-center
105
105
  * bottom-left bottom-center bottom-right
106
106
  */
107
107
  export type ToolbarPosition = 'top-left' | 'top-center' | 'top-right' | 'left-center' | 'right-center' | 'bottom-left' | 'bottom-center' | 'bottom-right';
@@ -101,7 +101,7 @@ export interface RasterBasemap {
101
101
  * Eight positions — the four corners, the four edge-centers:
102
102
  *
103
103
  * top-left top-center top-right
104
- * left-center · right-center
104
+ * left-center right-center
105
105
  * bottom-left bottom-center bottom-right
106
106
  */
107
107
  export type ToolbarPosition = 'top-left' | 'top-center' | 'top-right' | 'left-center' | 'right-center' | 'bottom-left' | 'bottom-center' | 'bottom-right';