@element-editor/adapter-leaflet 0.0.0-stage → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/AGENTS.md +80 -0
  2. package/LICENSE +21 -0
  3. package/README.md +45 -2
  4. package/dist/ElementEditorControls.d.cts +111 -0
  5. package/dist/ElementEditorControls.d.ts +111 -0
  6. package/dist/adapter-leaflet.css +1 -0
  7. package/dist/components/BoundaryLayer.d.cts +5 -0
  8. package/dist/components/BoundaryLayer.d.ts +5 -0
  9. package/dist/components/DrawingLayer.d.cts +3 -0
  10. package/dist/components/DrawingLayer.d.ts +3 -0
  11. package/dist/components/DrawingPreviewLayer.d.cts +1 -0
  12. package/dist/components/DrawingPreviewLayer.d.ts +1 -0
  13. package/dist/components/FeatureInteractionLayer.d.cts +6 -0
  14. package/dist/components/FeatureInteractionLayer.d.ts +6 -0
  15. package/dist/components/GeometryProcessingPreview.d.cts +1 -0
  16. package/dist/components/GeometryProcessingPreview.d.ts +1 -0
  17. package/dist/components/MeasurePreviewLayer.d.cts +1 -0
  18. package/dist/components/MeasurePreviewLayer.d.ts +1 -0
  19. package/dist/components/MeasurementTooltip.d.cts +1 -0
  20. package/dist/components/MeasurementTooltip.d.ts +1 -0
  21. package/dist/components/PendingPointMarker.d.cts +2 -0
  22. package/dist/components/PendingPointMarker.d.ts +2 -0
  23. package/dist/components/RoutePreviewLayer.d.cts +1 -0
  24. package/dist/components/RoutePreviewLayer.d.ts +1 -0
  25. package/dist/components/SnapController.d.cts +1 -0
  26. package/dist/components/SnapController.d.ts +1 -0
  27. package/dist/components/TextLabelLayer.d.cts +10 -0
  28. package/dist/components/TextLabelLayer.d.ts +10 -0
  29. package/dist/components/TransformControls.d.cts +1 -0
  30. package/dist/components/TransformControls.d.ts +1 -0
  31. package/dist/components/featureLayers/FeatureElements.d.cts +28 -0
  32. package/dist/components/featureLayers/FeatureElements.d.ts +28 -0
  33. package/dist/components/featureLayers/GeometryCollectionLayer.d.cts +13 -0
  34. package/dist/components/featureLayers/GeometryCollectionLayer.d.ts +13 -0
  35. package/dist/components/featureLayers/LineLayer.d.cts +14 -0
  36. package/dist/components/featureLayers/LineLayer.d.ts +14 -0
  37. package/dist/components/featureLayers/MultiLineLayer.d.cts +13 -0
  38. package/dist/components/featureLayers/MultiLineLayer.d.ts +13 -0
  39. package/dist/components/featureLayers/MultiPointLayer.d.cts +12 -0
  40. package/dist/components/featureLayers/MultiPointLayer.d.ts +12 -0
  41. package/dist/components/featureLayers/MultiPolygonLayer.d.cts +13 -0
  42. package/dist/components/featureLayers/MultiPolygonLayer.d.ts +13 -0
  43. package/dist/components/featureLayers/POIMarker.d.cts +13 -0
  44. package/dist/components/featureLayers/POIMarker.d.ts +13 -0
  45. package/dist/components/featureLayers/PolygonLayer.d.cts +14 -0
  46. package/dist/components/featureLayers/PolygonLayer.d.ts +14 -0
  47. package/dist/components/featureLayers/mountQueue.d.cts +41 -0
  48. package/dist/components/featureLayers/mountQueue.d.ts +41 -0
  49. package/dist/components/featureLayers/renderer.d.cts +25 -0
  50. package/dist/components/featureLayers/renderer.d.ts +25 -0
  51. package/dist/components/featureLayers/shared.d.cts +44 -0
  52. package/dist/components/featureLayers/shared.d.ts +44 -0
  53. package/dist/components/featureLayers/useProgressiveMount.d.cts +30 -0
  54. package/dist/components/featureLayers/useProgressiveMount.d.ts +30 -0
  55. package/dist/components/previews/CirclePreview.d.cts +1 -0
  56. package/dist/components/previews/CirclePreview.d.ts +1 -0
  57. package/dist/components/previews/LinePreview.d.cts +1 -0
  58. package/dist/components/previews/LinePreview.d.ts +1 -0
  59. package/dist/components/previews/PolygonPreview.d.cts +1 -0
  60. package/dist/components/previews/PolygonPreview.d.ts +1 -0
  61. package/dist/components/previews/RectPreview.d.cts +1 -0
  62. package/dist/components/previews/RectPreview.d.ts +1 -0
  63. package/dist/components/tools/BoxSelectHandler.d.cts +16 -0
  64. package/dist/components/tools/BoxSelectHandler.d.ts +16 -0
  65. package/dist/components/tools/MapClickHandler.d.cts +6 -0
  66. package/dist/components/tools/MapClickHandler.d.ts +6 -0
  67. package/dist/components/tools/MultiDragHandler.d.cts +9 -0
  68. package/dist/components/tools/MultiDragHandler.d.ts +9 -0
  69. package/dist/components/tools/OsmTraceHandler.d.cts +1 -0
  70. package/dist/components/tools/OsmTraceHandler.d.ts +1 -0
  71. package/dist/components/tools/VertexEditor.d.cts +13 -0
  72. package/dist/components/tools/VertexEditor.d.ts +13 -0
  73. package/dist/contexts/FeatureStyleContext.d.cts +15 -0
  74. package/dist/contexts/FeatureStyleContext.d.ts +15 -0
  75. package/dist/contexts/MapControllerContext.d.cts +2 -0
  76. package/dist/contexts/MapControllerContext.d.ts +2 -0
  77. package/dist/hooks/lastPointer.d.cts +13 -0
  78. package/dist/hooks/lastPointer.d.ts +13 -0
  79. package/dist/hooks/useCursorWhileMode.d.cts +23 -0
  80. package/dist/hooks/useCursorWhileMode.d.ts +23 -0
  81. package/dist/hooks/useDuplicateDrag.d.cts +9 -0
  82. package/dist/hooks/useDuplicateDrag.d.ts +9 -0
  83. package/dist/hooks/useFeatureDrag.d.cts +20 -0
  84. package/dist/hooks/useFeatureDrag.d.ts +20 -0
  85. package/dist/hooks/useMapInteractionMachine.d.cts +13 -0
  86. package/dist/hooks/useMapInteractionMachine.d.ts +13 -0
  87. package/dist/hooks/useModifierDragCursor.d.cts +9 -0
  88. package/dist/hooks/useModifierDragCursor.d.ts +9 -0
  89. package/dist/hooks/usePartDrag.d.cts +23 -0
  90. package/dist/hooks/usePartDrag.d.ts +23 -0
  91. package/dist/index.cjs +52 -0
  92. package/dist/index.d.cts +27 -0
  93. package/dist/index.d.ts +27 -0
  94. package/dist/index.es.js +4246 -0
  95. package/dist/store/StoreContext.d.cts +1 -0
  96. package/dist/store/StoreContext.d.ts +1 -0
  97. package/dist/utils/boxSelect.d.cts +4 -0
  98. package/dist/utils/boxSelect.d.ts +4 -0
  99. package/dist/utils/dragUtils.d.cts +12 -0
  100. package/dist/utils/dragUtils.d.ts +12 -0
  101. package/dist/utils/featureTooltip.d.cts +19 -0
  102. package/dist/utils/featureTooltip.d.ts +19 -0
  103. package/dist/utils/freehandCommitFlag.d.cts +2 -0
  104. package/dist/utils/freehandCommitFlag.d.ts +2 -0
  105. package/dist/utils/freshFeature.d.cts +17 -0
  106. package/dist/utils/freshFeature.d.ts +17 -0
  107. package/dist/utils/geojson.d.cts +3 -0
  108. package/dist/utils/geojson.d.ts +3 -0
  109. package/dist/utils/measureClickFlag.d.cts +2 -0
  110. package/dist/utils/measureClickFlag.d.ts +2 -0
  111. package/dist/utils/modifierDragFlag.d.cts +2 -0
  112. package/dist/utils/modifierDragFlag.d.ts +2 -0
  113. package/dist/utils/pinPath.d.cts +2 -0
  114. package/dist/utils/pinPath.d.ts +2 -0
  115. package/dist/utils/rafThrottle.d.cts +11 -0
  116. package/dist/utils/rafThrottle.d.ts +11 -0
  117. package/dist/utils/snapping.d.cts +25 -0
  118. package/dist/utils/snapping.d.ts +25 -0
  119. package/package.json +98 -3
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Manages the isDuplicateDrag ref for Alt+drag duplicate across geometry layer components.
3
+ * When local drag is active (dragDelta set), uses the local ref; otherwise uses multi-drag state.
4
+ */
5
+ export declare function useDuplicateDrag(dragDelta: [number, number] | null, multiDuplicateDrag: boolean): {
6
+ isDupDrag: boolean;
7
+ setDuplicateDrag: (v: boolean) => void;
8
+ resetDuplicateDrag: () => void;
9
+ };
@@ -0,0 +1,20 @@
1
+ import { LeafletMouseEvent } from 'leaflet';
2
+ import { GeoJSONFeature } from '@element-editor/core';
3
+ import { MapInteractionMachine } from './useMapInteractionMachine.cjs';
4
+ /**
5
+ * Cmd/Ctrl+drag (move) and Alt+drag (duplicate) for a single Point, LineString or
6
+ * Polygon. The Multi* / GeometryCollection counterpart is `usePartDrag`.
7
+ *
8
+ * `dragDelta` state flips only at drag start/end — it toggles the ghost/visibility
9
+ * renders. During mousemove `onLiveMove` gets the translated coordinates and moves
10
+ * the Leaflet layer imperatively, skipping 60Hz React reconciliation. See audit #4.
11
+ *
12
+ * Returns the coordinates to render (`display`, plus `ghost` during a duplicate drag).
13
+ */
14
+ export declare function useFeatureDrag<C extends unknown[]>(feature: GeoJSONFeature, type: 'Point' | 'LineString' | 'Polygon', coords: C, selected: boolean, isMultiSelected: boolean, multiDragDelta: [number, number] | null, multiDuplicateDrag: boolean, readonly: boolean, interaction: MapInteractionMachine, onLiveMove: (translated: C, isDuplicate: boolean) => void): {
15
+ effectiveDelta: [number, number] | null;
16
+ display: C;
17
+ ghost: C | null;
18
+ dragged: import('react').RefObject<boolean>;
19
+ handleMouseDown: (e: LeafletMouseEvent) => void;
20
+ };
@@ -0,0 +1,20 @@
1
+ import { LeafletMouseEvent } from 'leaflet';
2
+ import { GeoJSONFeature } from '@element-editor/core';
3
+ import { MapInteractionMachine } from './useMapInteractionMachine.js';
4
+ /**
5
+ * Cmd/Ctrl+drag (move) and Alt+drag (duplicate) for a single Point, LineString or
6
+ * Polygon. The Multi* / GeometryCollection counterpart is `usePartDrag`.
7
+ *
8
+ * `dragDelta` state flips only at drag start/end — it toggles the ghost/visibility
9
+ * renders. During mousemove `onLiveMove` gets the translated coordinates and moves
10
+ * the Leaflet layer imperatively, skipping 60Hz React reconciliation. See audit #4.
11
+ *
12
+ * Returns the coordinates to render (`display`, plus `ghost` during a duplicate drag).
13
+ */
14
+ export declare function useFeatureDrag<C extends unknown[]>(feature: GeoJSONFeature, type: 'Point' | 'LineString' | 'Polygon', coords: C, selected: boolean, isMultiSelected: boolean, multiDragDelta: [number, number] | null, multiDuplicateDrag: boolean, readonly: boolean, interaction: MapInteractionMachine, onLiveMove: (translated: C, isDuplicate: boolean) => void): {
15
+ effectiveDelta: [number, number] | null;
16
+ display: C;
17
+ ghost: C | null;
18
+ dragged: import('react').RefObject<boolean>;
19
+ handleMouseDown: (e: LeafletMouseEvent) => void;
20
+ };
@@ -0,0 +1,13 @@
1
+ export type InteractionPhase = 'Idle' | 'MouseDown' | 'Dragging' | 'MouseUp' | 'Click';
2
+ export type MapInteractionMachine = {
3
+ getPhase: () => InteractionPhase;
4
+ markDragStart: () => void;
5
+ markDragEnd: () => void;
6
+ shouldHandleFeatureClick: (didDragLocal?: boolean) => boolean;
7
+ markFeatureClick: () => void;
8
+ shouldHandleMapClick: () => boolean;
9
+ suppressNextVertexExit: () => void;
10
+ shouldHandleVertexExit: () => boolean;
11
+ suppressDoubleClickZoomForGesture: () => void;
12
+ };
13
+ export declare function useMapInteractionMachine(lockDoubleClickZoom: boolean): MapInteractionMachine;
@@ -0,0 +1,13 @@
1
+ export type InteractionPhase = 'Idle' | 'MouseDown' | 'Dragging' | 'MouseUp' | 'Click';
2
+ export type MapInteractionMachine = {
3
+ getPhase: () => InteractionPhase;
4
+ markDragStart: () => void;
5
+ markDragEnd: () => void;
6
+ shouldHandleFeatureClick: (didDragLocal?: boolean) => boolean;
7
+ markFeatureClick: () => void;
8
+ shouldHandleMapClick: () => boolean;
9
+ suppressNextVertexExit: () => void;
10
+ shouldHandleVertexExit: () => boolean;
11
+ suppressDoubleClickZoomForGesture: () => void;
12
+ };
13
+ export declare function useMapInteractionMachine(lockDoubleClickZoom: boolean): MapInteractionMachine;
@@ -0,0 +1,9 @@
1
+ export declare function useModifierDragCursor(readonly: boolean): {
2
+ enter: (el: Element | HTMLElement | SVGElement | null | undefined, originalEvent?: {
3
+ ctrlKey?: boolean;
4
+ metaKey?: boolean;
5
+ altKey?: boolean;
6
+ }) => void;
7
+ leave: () => void;
8
+ retarget: (el: Element | HTMLElement | SVGElement | null | undefined) => void;
9
+ };
@@ -0,0 +1,9 @@
1
+ export declare function useModifierDragCursor(readonly: boolean): {
2
+ enter: (el: Element | HTMLElement | SVGElement | null | undefined, originalEvent?: {
3
+ ctrlKey?: boolean;
4
+ metaKey?: boolean;
5
+ altKey?: boolean;
6
+ }) => void;
7
+ leave: () => void;
8
+ retarget: (el: Element | HTMLElement | SVGElement | null | undefined) => void;
9
+ };
@@ -0,0 +1,23 @@
1
+ import { LeafletMouseEvent } from 'leaflet';
2
+ import { GeoJSONFeature } from '@element-editor/core';
3
+ import { MapInteractionMachine } from './useMapInteractionMachine.cjs';
4
+ /**
5
+ * Shared drag logic for Multi* and GeometryCollection layers.
6
+ *
7
+ * Handles:
8
+ * - Cmd/Ctrl+drag initiation
9
+ * - Visual vs spatial mode delta computation
10
+ * - Per-part or whole-geometry offset on commit
11
+ *
12
+ * Returns state and handlers to wire into Leaflet event handlers.
13
+ *
14
+ * `dragDelta` state flips only at drag start/end; mousemove updates a ref and
15
+ * invokes the optional `onLiveMove` callback so consumers can move their
16
+ * Leaflet layers imperatively (skipping 60Hz React reconciliation). Consumers
17
+ * that don't need the fast path can omit `onLiveMove`.
18
+ */
19
+ export declare function usePartDrag(feature: GeoJSONFeature, selected: boolean, isMultiSelected: boolean, multiDragDelta: [number, number] | null, readonly: boolean, interaction: MapInteractionMachine, onLiveMove?: (delta: [number, number], mode: 'visual' | 'spatial', activePartIdx: number | null) => void): {
20
+ effectiveDelta: [number, number] | null;
21
+ dragged: import('react').RefObject<boolean>;
22
+ handleMouseDown: (_partIndex: number, e: LeafletMouseEvent) => void;
23
+ };
@@ -0,0 +1,23 @@
1
+ import { LeafletMouseEvent } from 'leaflet';
2
+ import { GeoJSONFeature } from '@element-editor/core';
3
+ import { MapInteractionMachine } from './useMapInteractionMachine.js';
4
+ /**
5
+ * Shared drag logic for Multi* and GeometryCollection layers.
6
+ *
7
+ * Handles:
8
+ * - Cmd/Ctrl+drag initiation
9
+ * - Visual vs spatial mode delta computation
10
+ * - Per-part or whole-geometry offset on commit
11
+ *
12
+ * Returns state and handlers to wire into Leaflet event handlers.
13
+ *
14
+ * `dragDelta` state flips only at drag start/end; mousemove updates a ref and
15
+ * invokes the optional `onLiveMove` callback so consumers can move their
16
+ * Leaflet layers imperatively (skipping 60Hz React reconciliation). Consumers
17
+ * that don't need the fast path can omit `onLiveMove`.
18
+ */
19
+ export declare function usePartDrag(feature: GeoJSONFeature, selected: boolean, isMultiSelected: boolean, multiDragDelta: [number, number] | null, readonly: boolean, interaction: MapInteractionMachine, onLiveMove?: (delta: [number, number], mode: 'visual' | 'spatial', activePartIdx: number | null) => void): {
20
+ effectiveDelta: [number, number] | null;
21
+ dragged: import('react').RefObject<boolean>;
22
+ handleMouseDown: (_partIndex: number, e: LeafletMouseEvent) => void;
23
+ };
package/dist/index.cjs ADDED
@@ -0,0 +1,52 @@
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react"),_=require("react-leaflet"),T=require("@element-editor/core/internal"),p=require("@element-editor/ui"),Lt=require("@element-editor/ui/internal"),ge=require("@element-editor/core"),u=require("react/jsx-runtime"),ue=require("leaflet"),to=require("@turf/transform-rotate"),He=require("@turf/helpers"),Ln=require("@turf/bbox"),no=require("@turf/boolean-intersects"),xt=require("@phosphor-icons/react"),Je=require("@turf/length"),wt=require("@turf/area"),ze=require("@turf/distance"),In=require("react-dom");let gt=null,rt=[];const Bt=new Set,oo=()=>gt;function zt(t){if(rt=[],gt!==t){gt=t;for(const e of Bt)e()}}function ro(t,e,n){rt=e.filter(o=>o.geometry.type!=="Point"&&kn(t,o,n))}function so(t,e){rt.length&&(rt=rt.filter(n=>kn(t,n,e)))}function io(t){return rt.some(e=>e.id===t)&&zt(t),gt===t}function ao(t){return a.useSyncExternalStore(lo,()=>gt===t)}function lo(t){return Bt.add(t),()=>{Bt.delete(t)}}const pt=10;function kn(t,e,n){const o=e.bbox??ge.getGeometryBBox(e.geometry),r=t.latLngToContainerPoint([o[1],o[0]]),l=t.latLngToContainerPoint([o[3],o[2]]);return n.x>=r.x-pt&&n.x<=l.x+pt&&n.y>=l.y-pt&&n.y<=r.y+pt}let Se=null,qt=!1,Wt=null,Ve=null,It=0,kt=0;function Zt(t){return t.ctrlKey||t.metaKey||t.altKey}function Rn(t){Zt(t)&&Se&&(Se.style.display="none")}function Dn(t){Zt(t)||qt||Wt&&Se&&Se.textContent&&(Se.style.display="",Et(It,kt))}function jn(t){if(!Se)return;Et(t.clientX,t.clientY);const e=t.target;e!=null&&e.closest(".leaflet-container")||(Se.style.display="none")}function gn(t){requestAnimationFrame(()=>{if(Ve!==t.target||t.target._map)return;const e=document.elementFromPoint(It,kt);e!=null&&e.closest(".leaflet-interactive")||Jt()})}function Et(t,e){if(It=t,kt=e,!Se||Se.style.display==="none")return;const{left:n,top:o}=T.placeBox(t,e,Se.offsetWidth,Se.offsetHeight,{x:"center",y:"before",gapY:12});Se.style.left=n+"px",Se.style.top=o+"px"}function co(){return Se||(Se=document.createElement("div"),Se.className="elm-feature-tooltip",Se.style.cssText="position:fixed;pointer-events:none;z-index:10000;display:none",document.body.appendChild(Se),window.addEventListener("keydown",Rn),window.addEventListener("keyup",Dn),document.addEventListener("mousemove",jn,{passive:!0})),Se}function An(t){Ve!==t&&(Ve==null||Ve.off("remove",gn),Ve=t,Ve==null||Ve.on("remove",gn))}function Jt(){An(null),Wt=null,Se&&(Se.remove(),Se=null,window.removeEventListener("keydown",Rn),window.removeEventListener("keyup",Dn),document.removeEventListener("mousemove",jn))}function lt(t,e,n,o,r){var i,g;if(qt)return;const l=n.getState();if(io(e.id)||!l.showFeatureNameOnHover||l.vertexEditActive){Jt();return}const s=p.featureLabel(e);if(!s)return;const c=co();c.textContent=s,Lt.applyRootTokens(c,(g=(i=r==null?void 0:r.target)==null?void 0:i.closest)==null?void 0:g.call(i,"[data-elm-theme]")),Wt=e.id,An(t),r&&Et(r.clientX,r.clientY),r&&Zt(r)?c.style.display="none":(c.style.display="",Et(It,kt))}function qe(t){t&&zt(null),Jt()}function Oe(t){qt=t,t&&Se&&(Se.style.display="none")}function uo(t,e){const n=t.phase;return n===e?t:n==="Idle"&&e==="MouseDown"?{...t,phase:e}:n==="MouseDown"&&(e==="Dragging"||e==="MouseUp")?{...t,phase:e}:n==="Dragging"&&e==="MouseUp"?{...t,phase:e}:n==="MouseUp"&&e==="Click"?{...t,phase:e}:(n==="Click"||n==="MouseUp")&&e==="Idle"?{...t,phase:e}:e==="MouseDown"?{...t,phase:e}:{...t,phase:e}}function Fn(t){const e=_.useMap(),n=a.useRef({phase:"Idle",suppressMapClick:!1,suppressFeatureClick:!1,suppressVertexExit:!1,doubleClickGestureSuppressed:!1}),o=a.useRef(t);o.current=t;const r=a.useCallback(i=>{n.current=uo(n.current,i)},[]),l=a.useCallback(i=>{n.current={...n.current,...i}},[]),s=a.useCallback(()=>{n.current.doubleClickGestureSuppressed&&l({doubleClickGestureSuppressed:!1}),o.current||e.doubleClickZoom.enable()},[e,l]),c=a.useCallback(()=>{l({doubleClickGestureSuppressed:!0}),e.doubleClickZoom.disable(),requestAnimationFrame(s)},[e,s,l]);return a.useEffect(()=>{if(t){e.doubleClickZoom.disable();return}n.current.doubleClickGestureSuppressed||e.doubleClickZoom.enable()},[t,e]),_.useMapEvents({mousedown:()=>{r("MouseDown")},mousemove:()=>{n.current.phase==="MouseDown"&&r("Dragging")},mouseup:()=>{const i=n.current;(i.phase==="Dragging"||i.phase==="MouseDown")&&r("MouseUp")},click:()=>{r("Click")}}),a.useMemo(()=>({getPhase:()=>n.current.phase,markDragStart:()=>{r("Dragging"),Oe(!0)},markDragEnd:()=>{r("MouseUp"),l({suppressMapClick:!0}),Oe(!1)},shouldHandleFeatureClick:(i=!1)=>i?!1:n.current.suppressFeatureClick?(l({suppressFeatureClick:!1}),r("Idle"),!1):!0,markFeatureClick:()=>{r("Click"),l({suppressMapClick:!0})},shouldHandleMapClick:()=>n.current.suppressMapClick?(l({suppressMapClick:!1}),r("Idle"),!1):!0,suppressNextVertexExit:()=>{l({suppressVertexExit:!0})},shouldHandleVertexExit:()=>n.current.suppressVertexExit?(l({suppressVertexExit:!1}),!1):!0,suppressDoubleClickZoomForGesture:c}),[r,l,c])}const On=a.createContext(void 0);function Qt({getFeatureStyle:t,children:e}){return u.jsx(On.Provider,{value:t,children:e})}function en(){return a.useContext(On)}let ot={x:-1,y:-1,ctrlKey:!1,metaKey:!1,altKey:!1};if(typeof window<"u"){window.addEventListener("mousemove",n=>{ot={x:n.clientX,y:n.clientY,ctrlKey:n.ctrlKey,metaKey:n.metaKey,altKey:n.altKey}},{capture:!0,passive:!0});const t=n=>{ot={x:n.clientX,y:n.clientY,ctrlKey:n.ctrlKey,metaKey:n.metaKey,altKey:n.altKey}};window.addEventListener("pointerdown",t,{capture:!0,passive:!0}),window.addEventListener("mousedown",t,{capture:!0,passive:!0});const e=n=>{ot={...ot,ctrlKey:n.ctrlKey,metaKey:n.metaKey,altKey:n.altKey}};window.addEventListener("keydown",e,{capture:!0}),window.addEventListener("keyup",e,{capture:!0})}function Rt(){return ot}function go(t){var r;if(!t)return!1;const e=(r=t.getBoundingClientRect)==null?void 0:r.call(t);if(!e)return!1;const{x:n,y:o}=Rt();return n<0||o<0?!1:n>=e.left&&n<=e.right&&o>=e.top&&o<=e.bottom}let nt=null;function fo(t,e,n=40){const{x:o,y:r}=ot;if(o<0||r<0)return!1;const l=t.getContainer();(!nt||nt.el!==l)&&(nt={el:l,rect:l.getBoundingClientRect()},requestAnimationFrame(()=>{nt=null}));const s=t.latLngToContainerPoint(e);return Math.abs(nt.rect.left+s.x-o)<=n&&Math.abs(nt.rect.top+s.y-r)<=n}function X(t){return[t[1],t[0]]}function po(t){return[t[1],t[0]]}function Tt(t){const e=t!=="rotate";let n="";return t==="nw"||t==="se"?n="cursor-nwse-resize":t==="ne"||t==="sw"?n="cursor-nesw-resize":t==="n"||t==="s"?n="cursor-ns-resize":(t==="e"||t==="w")&&(n="cursor-ew-resize"),ue.divIcon({className:"",html:e?`<div class="w-3 h-3 bg-white border-2 border-primary-600 shadow-md rounded-sm ${n} hover:scale-125 transition-transform"></div>`:`<div class="group relative flex items-center justify-center">
2
+ <div class="w-0.5 h-6 bg-primary-600"></div>
3
+ <div
4
+ class="absolute -top-3 w-4 h-4 bg-white border-2 border-primary-600 shadow-md rounded-full hover:scale-125 transition-transform flex items-center justify-center"
5
+ style="cursor: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PGcgZmlsdGVyPSJkcm9wLXNoYWRvdygwIDAgMXB4IHdoaXRlKSBkcm9wLXNoYWRvdygwIDAgMXB4IHdoaXRlKSI+PHBhdGggZD0iTTIxLjUgMnY2aC02TTIxLjM0IDE1LjU3YTEwIDEwIDAgMSAxLS41OS05LjVsMS4yNSAxLjkzIi8+PC9nPjwvc3ZnPg==') 12 12, grab;"
6
+ >
7
+ <div class="w-1.5 h-1.5 bg-primary-600 rounded-full"></div>
8
+ </div>
9
+ </div>`,iconSize:e?[12,12]:[16,32],iconAnchor:e?[6,6]:[8,32]})}function _t(t){const e=He.featureCollection(t),[n,o,r,l]=Ln.bbox(e),s=(n+r)/2,c=xo(o,l);return{corners:[[n,l],[r,l],[r,o],[n,o]],edges:[[s,l],[r,c],[s,o],[n,c]],center:[s,c],rotateHandle:[s,l]}}function Ut(t,e,n){const[o,r]=e,l=T.toRadians(n),s=Math.cos(l),c=Math.sin(l),i=T.getMercatorLatCorrectionRatio(r);return t.map(([g,m])=>{const M=(g-o)*i,f=m-r;return[o+(M*s-f*c)/i,r+(M*c+f*s)]})}function mo(t,e,n,o,r){const[l,s]=e,c=T.toRadians(r),i=Math.cos(c),g=Math.sin(c),m=T.getMercatorLatCorrectionRatio(s);return t.map(([M,f])=>{const y=(M-l)*m,C=f-s,L=y*i+C*g,b=-y*g+C*i,v=L*n,S=b*o,E=v*i-S*g,h=v*g+S*i;return[l+E/m,s+h]})}function ho(t,e,n,o){const r=T.project(e),l=T.toRadians(o),s=Math.cos(l),c=Math.sin(l);function i(g){const m=T.project(g),M=m[0]-r[0],f=m[1]-r[1],y=M*s+f*c,C=-M*c+f*s,L=y*n,b=C*n,v=L*s-b*c,S=L*c+b*s;return T.unproject([r[0]+v,r[1]+S])}return{...t,geometry:T.mapPositions(t.geometry,i)}}function yo(t,e,n,o){const r=T.project(e),l=T.toRadians(o),s=Math.cos(l),c=Math.sin(l);return t.map(i=>{const g=T.project(i),m=g[0]-r[0],M=g[1]-r[1],f=m*s+M*c,y=-m*c+M*s,C=f*n,L=y*n,b=C*s-L*c,v=C*c+L*s;return T.unproject([r[0]+b,r[1]+v])})}function vo(t,e,n,o,r){const[l,s]=e,c=T.toRadians(r),i=Math.cos(c),g=Math.sin(c),m=T.getMercatorLatCorrectionRatio(s);function M(f){const y=(f[0]-l)*m,C=f[1]-s,L=y*i+C*g,b=-y*g+C*i,v=L*n,S=b*o,E=v*i-S*g,h=v*g+S*i;return[l+E/m,s+h]}return{...t,geometry:T.mapPositions(t.geometry,M)}}function xo(t,e){return T.unproject([0,(T.project([0,t])[1]+T.project([0,e])[1])/2])[1]}function So(t,e,n,o){const r=o?t.initialBbox.center:t.origin,l=Math.cos(T.toRadians(t.rotationAngle)),s=Math.sin(T.toRadians(t.rotationAngle));let c;if(n){const b=T.project(r);c=v=>{const S=T.project(v),E=S[0]-b[0],h=S[1]-b[1];return[E*l+h*s,-E*s+h*l]}}else{const b=T.getMercatorLatCorrectionRatio(r[1]);c=v=>{const S=(v[0]-r[0])*b,E=v[1]-r[1];return[S*l+E*s,-S*s+E*l]}}const[i,g]=c(t.startLngLat),[m,M]=c(e),f=t.edgeIndex===0||t.edgeIndex===2,y=t.edgeIndex===1||t.edgeIndex===3,C=b=>Math.abs(b)<.01?b<0?-.01:.01:b,L=(b,v)=>Math.abs(v)>1e-9?b/v:1;if(n){let b;if(f)b=L(M,g);else if(y)b=L(m,i);else{const v=i*i+g*g;b=v>1e-18?(m*i+M*g)/v:1}return{origin:r,uniform:!0,factor:C(b)}}return{origin:r,uniform:!1,scaleX:y||!f?C(L(m,i)):1,scaleY:f||!y?C(L(M,g)):1}}function wo(t,e,n,o){const r=n.uniform?l=>yo(l,n.origin,n.factor,o):l=>mo(l,n.origin,n.scaleX,n.scaleY,o);return{features:t.map(l=>n.uniform?ho(l,n.origin,n.factor,o):vo(l,n.origin,n.scaleX,n.scaleY,o)),box:{corners:r(e.corners),edges:r(e.edges),center:r([e.center])[0],rotateHandle:r([e.rotateHandle])[0]}}}function Eo(t,e,n){if(!n)return[e[0]-t[0],e[1]-t[1]];const o=T.project(t),r=T.project(e);return[r[0]-o[0],r[1]-o[1]]}function mt(t,e,n){return T.offsetGeometry({type:"MultiPoint",coordinates:t},e,n).coordinates}function bo(t,e,n){let o=!1;for(let r=0,l=e.length-1;r<e.length;l=r++){const s=e[r],c=e[l];if(s.y>t.y!=c.y>t.y&&t.x<(c.x-s.x)*(t.y-s.y)/(c.y-s.y)+s.x&&(o=!o),ue.LineUtil.pointToSegmentDistance(t,s,c)<=n)return!0}return o}const Po=3,Mo=8,Tn=a.memo(function(){const e=_.useMap(),n=p.useAccentPalette(e.getContainer())[500],{dataStore:o,uiStore:r}=p.useGeoStore(),l=p.useDataStore(F=>F.selectedIds),s=p.useDataStore(F=>F.features),c=p.useUIStore(F=>F.transformActive),i=p.useUIStore(F=>F.setTransformDragging),[g,m]=a.useState(null),[M,f]=a.useState(null),y=a.useRef(null),C=a.useRef(null);y.current=g,C.current=M;const[L,b]=a.useState(null),v=a.useRef(0),S=l.join(",");a.useEffect(()=>{b(null),v.current=0},[S]);const E=a.useRef(null),h=a.useCallback(F=>{const d=e.getContainer().getBoundingClientRect();return e.containerPointToLatLng(ue.point(F.clientX-d.left,F.clientY-d.top))},[e]);a.useEffect(()=>{let F=null;function d(q){E.current&&(q.preventDefault(),F={clientX:q.clientX,clientY:q.clientY},V(q))}function I(q){var ce;q.key!=="Shift"&&q.key!=="Alt"||((ce=E.current)==null?void 0:ce.type)!=="scale"||!F||(q.preventDefault(),V({...F,shiftKey:q.shiftKey,altKey:q.altKey}))}function V(q){if(!E.current)return;const ce=h(q),ne=ce.lat,de=ce.lng,$=E.current,w=o.getState().geometryMode;if($.type==="move"){if(!$.moving){const Q=e.getContainer().getBoundingClientRect();if($.startPoint.distanceTo(ue.point(q.clientX-Q.left,q.clientY-Q.top))<Po)return;$.moving=!0,i(!0)}const W=w==="visual",te=Eo($.startLatLng,[de,ne],W);m($.initialFeatures.map(Q=>({...Q,geometry:T.offsetGeometry(Q.geometry,te,W)}))),f({corners:mt($.initialBbox.corners,te,W),edges:mt($.initialBbox.edges,te,W),center:mt([$.initialBbox.center],te,W)[0],rotateHandle:mt([$.initialBbox.rotateHandle],te,W)[0]})}else if($.type==="rotate"){const W=T.getMercatorLatCorrectionRatio($.center[1]),te=ne-$.center[1],Q=w==="visual"?(de-$.center[0])*W:de-$.center[0],oe=(Math.atan2(te,Q)-$.initialAngle)*(180/Math.PI),pe=$.initialFeatures.map(xe=>w==="visual"?T.applyVisualTransform(xe,$.center,1,1,oe):to.transformRotate(xe,oe,{pivot:$.center}));m(pe);const Z=$.center;f({corners:Ut($.initialBbox.corners,Z,oe),edges:Ut($.initialBbox.edges,Z,oe),center:Z,rotateHandle:Ut([$.initialBbox.rotateHandle],Z,oe)[0]})}else if($.type==="scale"){const W=$.rotationAngle,te=So({initialBbox:$.initialBbox,origin:$.origin,startLngLat:$.startLatLng,edgeIndex:$.edgeIndex,rotationAngle:W},[de,ne],q.shiftKey,q.altKey),Q=wo($.initialFeatures,$.initialBbox,te,W);m(Q.features),f(Q.box)}}function ee(){if(!E.current)return;const q=y.current,ce=C.current,ne=E.current.type==="rotate",de=E.current.type==="move";if(E.current.rotationAngle,E.current=null,e.dragging.enable(),i(!1),!de||q){const $=e.getContainer(),w=W=>W.stopPropagation();$.addEventListener("click",w,!0),setTimeout(()=>$.removeEventListener("click",w,!0),0)}if(q&&(o.getState().takeSnapshot(),o.getState().updateFeatures(T.transformUpdates(o.getState().features,q.map($=>({id:String($.id),geometry:$.geometry})),r.getState().topoEditEnabled))),ce&&(b(ce),ne)){const $=ce.center,w=ce.edges[1],W=T.getMercatorLatCorrectionRatio($[1]),te=(w[0]-$[0])*W,Q=w[1]-$[1];v.current=Math.atan2(Q,te)*(180/Math.PI)}m(null),f(null),F=null}return document.addEventListener("mousemove",d),document.addEventListener("mouseup",ee),document.addEventListener("keydown",I),document.addEventListener("keyup",I),()=>{document.removeEventListener("mousemove",d),document.removeEventListener("mouseup",ee),document.removeEventListener("keydown",I),document.removeEventListener("keyup",I)}},[e,h,i]);const x=a.useRef(null);if(x.current=null,_.useMapEvents({mousedown(F){var q,ce;const d=x.current,I=F.originalEvent;if(!d||E.current||I.button!==0||I.shiftKey||I.altKey||I.ctrlKey||I.metaKey)return;const V=r.getState();if(V.readonly||V.editingMode!=="none"||V.vertexEditActive||(ce=(q=I.target)==null?void 0:q.closest)!=null&&ce.call(q,".leaflet-marker-icon"))return;const ee=d.box.corners.map(ne=>e.latLngToContainerPoint(X(ne)));bo(F.containerPoint,ee,Mo)&&(I.preventDefault(),e.dragging.disable(),E.current={type:"move",initialFeatures:structuredClone(d.features),initialBbox:d.box,rotationAngle:v.current,startLatLng:[F.latlng.lng,F.latlng.lat],startPoint:F.containerPoint,moving:!1})}}),!c||l.length===0)return null;const j=new Set(l),Y=s.filter(F=>j.has(F.id));if(Y.length===0)return null;const R=M||L||_t(Y);M||(x.current={box:R,features:Y});const{corners:B,edges:D,rotateHandle:H}=R,O=[...B,B[0]].map(X);function z(F){var d,I,V,ee;(I=(d=F.originalEvent)==null?void 0:d.preventDefault)==null||I.call(d),(ee=(V=F.originalEvent)==null?void 0:V.stopPropagation)==null||ee.call(V),e.dragging.disable()}function k(F){z(F);const d=L||_t(Y),I=d.center,V=h(F.originalEvent),ee=o.getState().geometryMode,q=T.getMercatorLatCorrectionRatio(I[1]),ce=V.lat-I[1],ne=ee==="visual"?(V.lng-I[0])*q:V.lng-I[0];E.current={type:"rotate",initialFeatures:structuredClone(Y),initialBbox:d,rotationAngle:v.current,center:I,initialAngle:Math.atan2(ce,ne)},i(!0)}function G(F,d,I){z(F);const V=L||_t(Y),ee=h(F.originalEvent),q=I?V.edges[(d+2)%4]:V.corners[(d+2)%4];E.current={type:"scale",initialFeatures:structuredClone(Y),initialBbox:V,rotationAngle:v.current,origin:q,startLatLng:[ee.lng,ee.lat],edgeIndex:I?d:void 0},i(!0)}return u.jsxs(u.Fragment,{children:[g==null?void 0:g.map(F=>F.geometry.type==="Polygon"?u.jsx(_.Polygon,{positions:F.geometry.coordinates.map(d=>d.map(X)),pathOptions:{color:n,weight:2,fillOpacity:.1,dashArray:"5 5"},interactive:!1},F.id):F.geometry.type==="MultiPolygon"?u.jsx(_.Polygon,{positions:F.geometry.coordinates.map(d=>d.map(I=>I.map(X))),pathOptions:{color:n,weight:2,fillOpacity:.1,dashArray:"5 5"},interactive:!1},F.id):F.geometry.type==="LineString"?u.jsx(_.Polyline,{positions:F.geometry.coordinates.map(X),pathOptions:{color:n,weight:2,dashArray:"5 5"},interactive:!1},F.id):F.geometry.type==="MultiLineString"?u.jsx(_.Polyline,{positions:F.geometry.coordinates.map(d=>d.map(X)),pathOptions:{color:n,weight:2,dashArray:"5 5"},interactive:!1},F.id):null),u.jsx(_.Polyline,{positions:O,pathOptions:{color:n,weight:1.5,dashArray:"4 4",fill:!1},interactive:!1}),B.map((F,d)=>u.jsx(_.Marker,{position:X(F),icon:Tt(["nw","ne","se","sw"][d]),draggable:!1,eventHandlers:{mousedown:I=>G(I,d,!1)}},`corner-${d}`)),D.map((F,d)=>u.jsx(_.Marker,{position:X(F),icon:Tt(["n","e","s","w"][d]),draggable:!1,eventHandlers:{mousedown:I=>G(I,d,!0)}},`edge-${d}`)),u.jsx(_.Marker,{position:X(H),icon:Tt("rotate"),draggable:!1,eventHandlers:{mousedown:F=>k(F)}})]})});function Co([t,e,n,o],r,l,s,c){return t>=r&&n<=s&&e>=l&&o<=c}function Lo(t,e){if(t===e)return!0;if(t.length!==e.length)return!1;const n=new Set(t);return e.every(o=>n.has(o))}function Io({onSelect:t,onDragStart:e,readonly:n,getInitialVertexIndices:o,onVertexBoxPreview:r}){const{dataStore:l}=p.useGeoStore(),s=_.useMap(),c=p.useUIStore(L=>L.editingMode),i=p.useUIStore(L=>L.transformActive),g=p.useUIStore(L=>L.vertexEditActive),m=p.useDataStore(L=>L.setSelection),M=a.useRef(c),f=a.useRef(i),y=a.useRef(g),C=a.useRef(m);return M.current=c,f.current=i,y.current=g,C.current=m,a.useEffect(()=>(s.boxZoom.disable(),()=>{s.boxZoom.enable()}),[s]),_.useMapEvents({mousedown(L){var G,F;if(!L.originalEvent.shiftKey||n||f.current)return;const b=y.current;if(!b&&M.current!=="none")return;const v=L.originalEvent.clientX,S=L.originalEvent.clientY;let E=!1,h=null;const x=[...l.getState().selectedIds];let j=0;const Y=b?new Set((o==null?void 0:o())??[]):null;let R=0;function B(d){const I=s.getContainer().getBoundingClientRect(),V=Math.min(v,d.clientX)-I.left,ee=Math.min(S,d.clientY)-I.top,q=Math.max(v,d.clientX)-I.left,ce=Math.max(S,d.clientY)-I.top,ne=s.containerPointToLatLng([V,ee]),de=s.containerPointToLatLng([q,ce]);return{latMin:Math.min(ne.lat,de.lat),latMax:Math.max(ne.lat,de.lat),lngMin:Math.min(ne.lng,de.lng),lngMax:Math.max(ne.lng,de.lng)}}function D(d){const I=l.getState().selectedIds[0];if(!I)return null;const V=l.getState().features.find(w=>w.id===I);if(!V)return null;let ee;if(V.geometry.type==="LineString")ee=V.geometry.coordinates;else if(V.geometry.type==="Polygon")ee=V.geometry.coordinates[0].slice(0,-1);else return null;const{latMin:q,latMax:ce,lngMin:ne,lngMax:de}=B(d),$=[];for(let w=0;w<ee.length;w++){const[W,te]=ee[w];W>=ne&&W<=de&&te>=q&&te<=ce&&$.push(w)}return{id:I,indices:$}}function H(d){const I=s.getContainer().getBoundingClientRect(),V=Math.min(v,d.clientX)-I.left,ee=Math.min(S,d.clientY)-I.top,q=Math.max(v,d.clientX)-I.left,ce=Math.max(S,d.clientY)-I.top,ne=s.containerPointToLatLng([V,ee]),de=s.containerPointToLatLng([q,ce]),$=Math.min(ne.lat,de.lat),w=Math.max(ne.lat,de.lat),W=Math.min(ne.lng,de.lng),te=Math.max(ne.lng,de.lng),Q=l.getState(),fe=new Set(Q.groups.filter(ye=>ye.hidden).map(ye=>ye.id)),oe=Q.features.filter(ye=>!ye.groupId||!fe.has(ye.groupId)),pe={type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[W,$],[te,$],[te,w],[W,w],[W,$]]]}},Z=[];for(const ye of oe)if(ye.geometry.type==="Point"){const[Pe,ke]=ye.geometry.coordinates;Pe>=W&&Pe<=te&&ke>=$&&ke<=w&&Z.push(ye.id)}else{const Pe=ye.bbox||ge.getGeometryBBox(ye.geometry),[ke,je,se,Ee]=Pe;if(ke<=te&&se>=W&&je<=w&&Ee>=$){if(Co(Pe,W,$,te,w)){Z.push(ye.id);continue}try{no(pe,ye)&&Z.push(ye.id)}catch{Z.push(ye.id)}}}let xe=x;if(Z.length>0){const ye=new Set(x);Z.forEach(Pe=>ye.add(Pe)),xe=Array.from(ye)}Lo(Q.selectedIds,xe)&&Q.selectedGroupId===null||a.startTransition(()=>{C.current(xe)})}function O(d){var ee;const I=Math.abs(d.clientX-v),V=Math.abs(d.clientY-S);if(!(!E&&I<5&&V<5)){if(!E){E=!0,e(),s.dragging.disable(),document.body.style.userSelect="none",(ee=window.getSelection())==null||ee.removeAllRanges(),h=document.createElement("div");const q=ge.readAccentPalette(s.getContainer())[500];h.style.cssText=["position:fixed","box-sizing:border-box",`left:${v}px`,`top:${S}px`,"width:0","height:0",`border:2px dashed ${q}`,`background:color-mix(in srgb, ${q} 8%, transparent)`,"pointer-events:none","z-index:10000"].join(";"),document.body.appendChild(h)}if(h){const q=Math.min(v,d.clientX),ce=Math.min(S,d.clientY);h.style.left=`${q}px`,h.style.top=`${ce}px`,h.style.width=`${Math.abs(d.clientX-v)}px`,h.style.height=`${Math.abs(d.clientY-S)}px`}if(!b&&Date.now()-j>30&&(H(d),j=Date.now()),b&&r&&Date.now()-R>30){const q=D(d);if(q){const ce=new Set(Y??[]);for(const ne of q.indices)ce.add(ne);r(q.id,[...ce].sort((ne,de)=>ne-de))}R=Date.now()}}}function z(d){var q,ce;const I=((ce=(q=document.querySelector(".leaflet-container"))==null?void 0:q.ownerDocument)==null?void 0:ce.defaultView)||window;if(I.removeEventListener("mousemove",O),I.removeEventListener("mouseup",z),!E)return;if(s.dragging.enable(),document.body.style.userSelect="",h&&document.body.removeChild(h),b){const ne=D(d);if(ne){const de=new Set(Y??[]);for(const w of ne.indices)de.add(w);const $=[...de].sort((w,W)=>w-W);$.length>0&&t(ne.id,$)}return}if(H(d),!(l.getState().selectedIds.length>x.length)){const ne=s.getContainer().getBoundingClientRect(),de=Math.min(v,d.clientX)-ne.left,$=Math.min(S,d.clientY)-ne.top,w=Math.max(v,d.clientX)-ne.left,W=Math.max(S,d.clientY)-ne.top,te=s.containerPointToLatLng([de,$]),Q=s.containerPointToLatLng([w,W]),fe=Math.min(te.lat,Q.lat),oe=Math.max(te.lat,Q.lat),pe=Math.min(te.lng,Q.lng),Z=Math.max(te.lng,Q.lng),xe=l.getState(),ye=new Set(xe.groups.filter(se=>se.hidden).map(se=>se.id)),Pe=xe.features.filter(se=>!se.groupId||!ye.has(se.groupId));let ke=null,je=[];for(const se of Pe){if(!xe.selectedIds.includes(se.id))continue;let Ee;if(se.geometry.type==="LineString")Ee=se.geometry.coordinates;else if(se.geometry.type==="Polygon")Ee=se.geometry.coordinates[0].slice(0,-1);else continue;const Re=Ee.reduce((Ge,[$e,tt],U)=>($e>=pe&&$e<=Z&&tt>=fe&&tt<=oe&&Ge.push(U),Ge),[]);Re.length>je.length&&(ke=se.id,je=Re)}ke&&je.length>0&&t(ke,je)}}const k=((F=(G=document.querySelector(".leaflet-container"))==null?void 0:G.ownerDocument)==null?void 0:F.defaultView)||window;k.addEventListener("mousemove",O),k.addEventListener("mouseup",z)}}),null}function Vt(t,e){return Math.hypot(t.x-e.x,t.y-e.y)}function ko(t,e,n){const o=(e.x-n.x)**2+(e.y-n.y)**2;if(o===0)return{distance:Vt(t,e),closest:e};let r=((t.x-e.x)*(n.x-e.x)+(t.y-e.y)*(n.y-e.y))/o;r=Math.max(0,Math.min(1,r));const l={x:e.x+r*(n.x-e.x),y:e.y+r*(n.y-e.y)};return{distance:Vt(t,l),closest:l}}function bt(t,e,n,o,r=15,l=new Set){const s=n.latLngToLayerPoint([e,t]);let c=1/0,i=null,g=1/0,m=null;const M=r+1,f=n.layerPointToLatLng([s.x-M,s.y-M]),y=n.layerPointToLatLng([s.x+M,s.y+M]),C=Math.min(f.lng,y.lng),L=Math.max(f.lng,y.lng),b=Math.min(f.lat,y.lat),v=Math.max(f.lat,y.lat),S=x=>x[0]<C||x[0]>L||x[1]<b||x[1]>v;function E(x,j=!0){if(!x||x.length===0)return;let Y=-1,R=null;const B=D=>{if(D===Y)return R;const H=x[D];return n.latLngToLayerPoint([H[1],H[0]])};for(let D=0;D<x.length;D++){const H=x[D],O=S(H);let z=null;if(!O){z=B(D);const k=Vt(s,z);k<c&&(c=k,i=H)}if(j&&D<x.length-1){const k=x[D+1];if(H[0]<C&&k[0]<C||H[0]>L&&k[0]>L||H[1]<b&&k[1]<b||H[1]>v&&k[1]>v)continue;const G=z??B(D),F=n.latLngToLayerPoint([k[1],k[0]]);Y=D+1,R=F;const{distance:d,closest:I}=ko(s,G,F);d<g&&(g=d,m=I)}}}function h(x){switch(x.type){case"Point":E([x.coordinates]);break;case"MultiPoint":E(x.coordinates,!1);break;case"LineString":E(x.coordinates);break;case"Polygon":case"MultiLineString":for(const j of x.coordinates)E(j);break;case"MultiPolygon":for(const j of x.coordinates)for(const Y of j)E(Y);break;case"GeometryCollection":for(const j of x.geometries)h(j);break}}for(const x of o)if(!l.has(x.id)){if(x.bbox){const[j,Y,R,B]=x.bbox;if(R<C||j>L||B<b||Y>v)continue}h(x.geometry)}if(c<=r&&i)return{latlng:i,isVertex:!0};if(g<=r&&m){const x=n.layerPointToLatLng(m);return{latlng:[x.lng,x.lat],isVertex:!1}}return null}function tn(t,e,n,o=15){const r=t.latLngToContainerPoint([e[1],e[0]]),l=t.latLngToContainerPoint([n[1],n[0]]),s=l.x-r.x,c=l.y-r.y,i=Math.hypot(s,c);if(i<1)return n;const g=Math.atan2(c,s),m=o*Math.PI/180,M=Math.round(g/m)*m,f=r.x+i*Math.cos(M),y=r.y+i*Math.sin(M),C=t.containerPointToLatLng([f,y]);return[C.lng,C.lat]}function Gt(t){let e=0,n=null;const o=()=>{e=0;const r=n;n=null,r&&t(...r)};return{schedule(...r){n=r,e||(e=requestAnimationFrame(o))},flush(){e&&cancelAnimationFrame(e),o()},cancel(){e&&cancelAnimationFrame(e),e=0,n=null}}}let fn=!1;function Ro(){if(fn)return;const t=document.createElement("style");t.textContent=[".elm-midpoint-marker{pointer-events:auto!important}",".elm-vertex:hover{background:var(--color-primary-100)!important}"].join(""),document.head.appendChild(t),fn=!0}const Do=ue.divIcon({className:"",html:'<div class="elm-vertex" style="width:12px;height:12px;background:#ffffff;border:2px solid var(--color-primary-500);border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,0.3);cursor:pointer;transition:background 0.15s"></div>',iconSize:[12,12],iconAnchor:[6,6]}),jo=ue.divIcon({className:"",html:'<div class="elm-vertex" style="width:12px;height:12px;background:var(--color-primary-500);border:2px solid var(--color-primary-700);border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,0.3);cursor:pointer;transition:background 0.15s"></div>',iconSize:[12,12],iconAnchor:[6,6]}),Ao=ue.divIcon({className:"elm-midpoint-marker",html:'<div style="width:24px;height:24px;display:flex;align-items:center;justify-content:center;cursor:pointer" class="group"><div class="bg-white border-2 border-primary-500 shadow group-hover:bg-primary-100 transition-colors" style="width:12px;height:12px;transform:rotate(45deg);border-radius:3px"></div></div>',iconSize:[24,24],iconAnchor:[12,12]});typeof document<"u"&&Ro();const dt=Math.PI/180,pn=85.0511287798;function ht(t){const e=Math.max(Math.min(t,pn),-pn);return Math.log(Math.tan(Math.PI/4+e*dt/2))}function mn(t,e,n){if(t.length<=n)return t;const o=new Float64Array(t.length);for(let g=1;g<t.length;g++)o[g]=o[g-1]+Math.hypot(e[2*g]-e[2*g-2],e[2*g+1]-e[2*g-1]);const r=o[o.length-1];if(r===0)return t.slice(0,n);const l=r/n,s=[];let c=0,i=-1;for(let g=0;g<n;g++){const m=g*l;for(;c<o.length-1&&o[c+1]<m;)c++;c!==i&&(s.push(t[c]),i=c)}return s}function Fo(t,e){const n=r=>Math.log(Math.tan(Math.PI/4+r*Math.PI/180/2)),o=r=>(2*Math.atan(Math.exp(r))-Math.PI/2)*180/Math.PI;return[(t[0]+e[0])/2,o((n(t[1])+n(e[1]))/2)]}function Oo(t,e,n,o,r,l){const s=r-n,c=l-o,i=s*s+c*c,g=i===0?0:Math.max(0,Math.min(1,((t-n)*s+(e-o)*c)/i)),m=t-(n+g*s),M=e-(o+g*c);return m*m+M*M}function Nt(){document.querySelectorAll(".elm-midpoint-marker").forEach(t=>{t.style.display="none"})}function To({feature:t,selectedIndices:e,onExit:n,onDeleteSelected:o,onSelectIndices:r,onFeatureClick:l,readonly:s}){var un,dn;const{dataStore:c,uiStore:i}=p.useGeoStore(),g=p.useEmit(),m=p.useIsEventForEditor(),M=p.useDataStore(P=>P.updateFeature),f=t.geometry.type==="Polygon",y=f?t.geometry.coordinates[0].slice(0,-1):t.geometry.coordinates,C=a.useMemo(()=>{const P=new Float64Array(y.length*2);for(let A=0;A<y.length;A++)P[2*A]=y[A][0]*dt,P[2*A+1]=ht(y[A][1]);return P},[t.geometry]),L=a.useMemo(()=>new Set(e),[e]),[b,v]=a.useState(null),[S,E]=a.useState({lng:"",lat:""}),[h,x]=a.useState(null),j=a.useCallback(()=>x(null),[]),[Y,R]=a.useState(null),B=a.useRef(null),D=a.useRef(null),H=a.useRef(0),[O]=a.useState(()=>Gt(P=>P()));a.useEffect(()=>()=>O.cancel(),[O]);const z=a.useRef(new Map),k=a.useRef(new Map),G=a.useRef(new Map),F=a.useRef(null),d=a.useRef(!1);a.useEffect(()=>{const P=A=>{d.current=A.metaKey||A.ctrlKey};return window.addEventListener("keydown",P),window.addEventListener("keyup",P),()=>{window.removeEventListener("keydown",P),window.removeEventListener("keyup",P)}},[]);const[I,V]=a.useState(0),ee=_.useMap();_.useMapEvents({click:()=>{Date.now()<H.current||n()},moveend:()=>V(P=>P+1),mousemove:P=>{if(s||B.current!==null)return;const{idx:A,px:K}=Ge(P.latlng),J=$e.current!==null?U:tt;K<=J&&A>=0?me(A):me(null)},mouseout:()=>{B.current===null&&me(null)}}),a.useEffect(()=>{document.querySelectorAll(".elm-midpoint-marker").forEach(P=>{P.style.display=""})},[t]),a.useEffect(()=>{var K,N;if(e.length===0||s)return;function P(J){var ae;((ae=document.activeElement)==null?void 0:ae.tagName)!=="INPUT"&&m(J)&&(J.key==="Delete"||J.key==="Backspace")&&(J.preventDefault(),o())}const A=((N=(K=document.querySelector(".leaflet-container"))==null?void 0:K.ownerDocument)==null?void 0:N.defaultView)||window;return A.addEventListener("keydown",P),()=>A.removeEventListener("keydown",P)},[e.length,o,s,m]);function q(P){const A=f?t.geometry.coordinates[0]:t.geometry.coordinates;if(A.length<2)return null;let K=null;return P.eachLayer(N=>{if(!K){if(f&&N instanceof ue.Polygon){const J=Array.isArray(N.getLatLngs()[0])?N.getLatLngs()[0]:N.getLatLngs();J.length>=2&&Math.abs(J[0].lng-A[0][0])<1e-6&&Math.abs(J[0].lat-A[0][1])<1e-6&&Math.abs(J[1].lng-A[1][0])<1e-6&&Math.abs(J[1].lat-A[1][1])<1e-6&&(K=N)}else if(!f&&N instanceof ue.Polyline&&!(N instanceof ue.Polygon)){if((N.options.opacity??1)<.01)return;const J=N.getLatLngs();J.length>=2&&Math.abs(J[0].lng-A[0][0])<1e-6&&Math.abs(J[0].lat-A[0][1])<1e-6&&Math.abs(J[1].lng-A[1][0])<1e-6&&Math.abs(J[1].lat-A[1][1])<1e-6&&(K=N)}}}),K}function ce(P,A){if(A.geometry.type!=="Polygon"&&A.geometry.type!=="MultiPolygon")return null;const K=A.geometry.type==="Polygon"?A.geometry.coordinates[0]:A.geometry.coordinates[0][0];if(K.length<2)return null;let N=null;return P.eachLayer(J=>{var ve;if(N||!(J instanceof ue.Polygon)||J.options.opacity!=null&&J.options.opacity<.01)return;const ae=Array.isArray((ve=J.getLatLngs()[0])==null?void 0:ve[0])?J.getLatLngs()[0][0]:Array.isArray(J.getLatLngs()[0])?J.getLatLngs()[0]:J.getLatLngs();ae.length>=2&&Math.abs(ae[0].lng-K[0][0])<1e-6&&Math.abs(ae[0].lat-K[0][1])<1e-6&&Math.abs(ae[1].lng-K[1][0])<1e-6&&Math.abs(ae[1].lat-K[1][1])<1e-6&&(N=J)}),N}function ne(P,A){for(const[K,N]of z.current){const J=k.current.get(K);if(!J)continue;let ae=G.current.get(K);if(!ae){const Me=ce(P,J);if(!Me)continue;ae=Me,G.current.set(K,ae)}const ve=T.applyTopoMove(J.geometry,N,A);ve.type==="Polygon"?ae.setLatLngs(ve.coordinates.map(Me=>Me.map(([be,Ce])=>ue.latLng(Ce,be)))):ve.type==="MultiPolygon"&&ae.setLatLngs(ve.coordinates.map(Me=>Me.map(be=>be.map(([Ce,Ie])=>ue.latLng(Ie,Ce)))))}}function de(P){c.getState().updateFeatures([...z.current].flatMap(([A,K])=>{const N=k.current.get(A);return N?[{id:A,patch:T.neighbourPatch(N,T.applyTopoMove(N.geometry,K,P))}]:[]})),z.current.clear(),k.current.clear(),G.current.clear()}function $(P){if(!i.getState().topoEditEnabled)return;const A=c.getState().features,K=T.findTopologicalNeighbors(A,t.id,[P]);z.current=T.groupNeighborsByFeature(K);const N=new Map;for(const J of z.current.keys()){const ae=A.find(ve=>ve.id===J);ae&&N.set(J,ae)}k.current=N,G.current.clear(),F.current=P}function w(P){const{lat:A,lng:K}=P.target.getLatLng(),N=P.originalEvent,J=(N==null?void 0:N.metaKey)||(N==null?void 0:N.ctrlKey);if(!i.getState().snapEnabled||J)return{lng:K,lat:A};const ae=P.target._map;if(!ae)return{lng:K,lat:A};const ve=bt(K,A,ae,c.getState().features,15,new Set([t.id]));return ve?(i.getState().setSnappedCoord(ve.latlng),{lng:ve.latlng[0],lat:ve.latlng[1]}):(i.getState().snappedCoord&&i.getState().setSnappedCoord(null),{lng:K,lat:A})}function W(P,A){const K=P.target._map;if(!K||(D.current||(D.current=q(K)),!D.current))return;const N=A.map(([J,ae])=>ue.latLng(ae,J));f?D.current.setLatLngs([N]):D.current.setLatLngs(N)}function te(P){D.current=null;const A=i.getState().snappedCoord;i.getState().setSnappedCoord(null);const{lat:K,lng:N}=P.target.getLatLng();return A?{lng:A[0],lat:A[1]}:{lng:N,lat:K}}function Q(P,A,K){const N=[...t.geometry.coordinates[0]];return N[P]=T.withXY(N[P],[A,K]),P===0&&(N[N.length-1]=N[0]),N}function fe(P,A,K){const N=[...t.geometry.coordinates];return N[P]=T.withXY(N[P],[A,K]),N}function oe(P,A,K){const N=[...t.geometry.coordinates[0]];return N.splice(P+1,0,T.insertedPosition(N[P],N[P+1],[A,K])),N[N.length-1]=N[0],N}function pe(P,A,K){const N=[...t.geometry.coordinates];return N.splice(P+1,0,T.insertedPosition(N[P],N[P+1],[A,K])),N}function Z(P){M(t.id,T.vertexEditPatch(t,{type:"Polygon",coordinates:[P]}))}function xe(P){M(t.id,T.vertexEditPatch(t,{type:"LineString",coordinates:P})),l()}function ye(P,A){const{lng:K,lat:N}=w(A);if(f?W(A,Q(P,K,N)):W(A,fe(P,K,N)),z.current.size>0){const J=A.target._map;if(J){const ae=F.current,ve=d.current&&ae?ae:[K,N];ne(J,ve)}}}function Pe(P,A){const{lng:K,lat:N}=te(A);if(f?Z(Q(P,K,N)):xe(fe(P,K,N)),z.current.size>0)if(d.current){const J=A.target._map,ae=F.current;J&&ae&&ne(J,ae),z.current.clear(),k.current.clear(),G.current.clear(),F.current=null}else de([K,N]),F.current=null}function ke(P,A){const{lng:K,lat:N}=w(A),J=[...t.geometry.coordinates[0]];if(J.splice(P+1,0,[K,N]),f)W(A,J);else{const ae=[...t.geometry.coordinates];ae.splice(P+1,0,[K,N]),W(A,ae)}}function je(P,A){const{lng:K,lat:N}=te(A);f?Z(oe(P,K,N)):xe(pe(P,K,N)),f&&i.getState().topoEditEnabled&&c.getState().updateFeatures(T.commitTopoInsert(c.getState().features,t.id,y[P],y[(P+1)%y.length],[K,N]))}function se(P,A,K){const N=y[P];c.getState().takeSnapshot(),f?Z(Q(P,A,K)):xe(fe(P,A,K)),f&&i.getState().topoEditEnabled&&c.getState().updateFeatures(T.commitTopoMove(c.getState().features,t.id,N,[A,K]))}function Ee(P){if(s)return;if(y.length<=(f?3:2)){g({type:"warning",message:`Cannot delete: ${f?"an area needs at least 3":"a line needs at least 2"} points`});return}const A=y[P];if(c.getState().takeSnapshot(),r([]),f){const K=t.geometry.coordinates[0].filter((N,J)=>J!==P);P===0&&(K[K.length-1]=K[0]),Z(K)}else xe(t.geometry.coordinates.filter((K,N)=>N!==P));f&&i.getState().topoEditEnabled&&c.getState().updateFeatures(T.commitTopoDelete(c.getState().features,t.id,[A]))}function Re(P,A){if(A.originalEvent.stopPropagation(),s)return;c.getState().takeSnapshot();const{lat:K,lng:N}=A.latlng;f?Z(oe(P,N,K)):xe(pe(P,N,K)),f&&i.getState().topoEditEnabled&&c.getState().updateFeatures(T.commitTopoInsert(c.getState().features,t.id,y[P],y[(P+1)%y.length],[N,K]))}function Ge(P){const A=P.lng*dt,K=ht(P.lat),N=y.length,J=f?N:N-1;let ae=-1,ve=1/0;for(let Me=0;Me<J;Me++){const be=(Me+1)%N,Ce=Oo(A,K,C[2*Me],C[2*Me+1],C[2*be],C[2*be+1]);Ce<ve&&(ve=Ce,ae=Me)}return{idx:ae,px:Math.sqrt(ve)*ee.options.crs.scale(ee.getZoom())/(2*Math.PI)}}const $e=a.useRef(null),tt=22,U=36,re=15;function me(P){P!==$e.current&&($e.current=P,R(P))}function le(P){if(s)return;const A=P.target._map;if(!A)return;const{idx:K,px:N}=Ge(P.latlng);if(K<0||N>re)return;P.originalEvent.stopPropagation(),P.originalEvent.preventDefault();const J=i.getState().snappedCoord;let ae=J?J[0]:P.latlng.lng,ve=J?J[1]:P.latlng.lat;J&&i.getState().setSnappedCoord(null),c.getState().takeSnapshot(),Nt(),A.dragging.disable(),Oe(!0);const Me=q(A);function be(De){let Ye=De.latlng.lng,Be=De.latlng.lat;if(i.getState().snapEnabled){const Ae=bt(Ye,Be,A,c.getState().features,15,new Set([t.id]));Ae?(i.getState().setSnappedCoord(Ae.latlng),Ye=Ae.latlng[0],Be=Ae.latlng[1]):i.getState().snappedCoord&&i.getState().setSnappedCoord(null)}if(ae=Ye,ve=Be,Me)if(f){const Ae=[...t.geometry.coordinates[0]];Ae.splice(K+1,0,[Ye,Be]),Me.setLatLngs([Ae.map(([Ft,Ot])=>ue.latLng(Ot,Ft))])}else{const Ae=[...t.geometry.coordinates];Ae.splice(K+1,0,[Ye,Be]),Me.setLatLngs(Ae.map(([Ft,Ot])=>ue.latLng(Ot,Ft)))}}const Ce=Gt(be),Ie=Ce.schedule;function Ne(){A.off("mousemove",Ie),A.off("mouseup",Ne),Ce.flush(),A.dragging.enable(),i.getState().setSnappedCoord(null),H.current=Date.now()+200,Oe(!1),f?Z(oe(K,ae,ve)):xe(pe(K,ae,ve)),f&&i.getState().topoEditEnabled&&c.getState().updateFeatures(T.commitTopoInsert(c.getState().features,t.id,y[K],y[(K+1)%y.length],[ae,ve]))}A.on("mousemove",Ie),A.on("mouseup",Ne)}function ie(P,A){A.originalEvent.stopPropagation(),!s&&(A.originalEvent.shiftKey?r(L.has(P)?e.filter(K=>K!==P):[...e,P].sort((K,N)=>K-N)):r([P]))}function he(P,A){A.originalEvent.preventDefault(),A.originalEvent.stopPropagation(),!s&&x({index:P,x:A.originalEvent.clientX,y:A.originalEvent.clientY})}function Le(P){const[A,K]=y[P];E({lng:A.toFixed(6),lat:K.toFixed(6)}),v(P)}function we(){if(b===null)return;const P=parseFloat(S.lng),A=parseFloat(S.lat);!isNaN(P)&&!isNaN(A)?(se(b,P,A),v(null),g({type:"success",message:"Coordinate updated"})):g({type:"warning",message:"Invalid coordinates"})}const Te=b!==null?(un=y[b])==null?void 0:un[0]:void 0,_e=b!==null?(dn=y[b])==null?void 0:dn[1]:void 0,Ue=a.useMemo(()=>Te===void 0||_e===void 0?null:[_e,Te],[Te,_e]),Xe=_.useMap(),We=500,{visibleVertexIndices:Ze,midpoints:eo}=a.useMemo(()=>{const P=Xe.getBounds(),A=P.getWest()*dt,K=P.getEast()*dt,N=ht(P.getSouth()),J=ht(P.getNorth()),ae=[];for(let be=0;be<y.length;be++){const Ce=C[2*be],Ie=C[2*be+1];Ce>=A&&Ce<=K&&Ie>=N&&Ie<=J&&ae.push(be)}let ve=ae;if(ae.length>We){const be=new Float64Array(ae.length*2);ae.forEach((Ce,Ie)=>{be[2*Ie]=C[2*Ce],be[2*Ie+1]=C[2*Ce+1]}),ve=mn(ae,be,We)}if(ae.length>We){const be=new Set(ve),Ce=new Set(ae);let Ie=!1;for(const Ne of L)Ce.has(Ne)&&!be.has(Ne)&&(ve.push(Ne),Ie=!0);Ie&&(ve=[...ve].sort((Ne,De)=>Ne-De))}const Me=[];if(!s){const be=f?y.length:y.length-1,Ce=[],Ie=[];for(let De=0;De<be;De++){const Ye=(De+1)%y.length,Be=(C[2*De]+C[2*Ye])/2,Ae=(C[2*De+1]+C[2*Ye+1])/2;Be>=A&&Be<=K&&Ae>=N&&Ae<=J&&(Ce.push(De),Ie.push(Be,Ae))}const Ne=mn(Ce,Ie,We);for(const De of Ne)Me.push({index:De,coord:Fo(y[De],y[(De+1)%y.length])})}return{visibleVertexIndices:ve,midpoints:Me}},[t.geometry,C,I,s,L,Xe]),cn=a.useMemo(()=>y.map(X),[t.geometry]);return u.jsxs(u.Fragment,{children:[!s&&(f?u.jsx(_.Polygon,{positions:[cn],pathOptions:{weight:2*re,opacity:0,fillOpacity:0,className:"cursor-pointer"},bubblingMouseEvents:!1,eventHandlers:{mousedown:le}}):u.jsx(_.Polyline,{positions:cn,pathOptions:{weight:2*re,opacity:0,className:"cursor-pointer"},bubblingMouseEvents:!1,eventHandlers:{mousedown:le}})),!s&&eo.filter(P=>P.index===Y).map(P=>u.jsx(_.Marker,{position:X(P.coord),icon:Ao,draggable:!0,eventHandlers:{click:A=>Re(P.index,A),dragstart:()=>{c.getState().takeSnapshot(),Nt(),B.current=P.index,Oe(!0)},drag:A=>O.schedule(()=>ke(P.index,A)),dragend:A=>{O.flush(),je(P.index,A),B.current=null,Oe(!1)}}},`mid-${P.coord[0].toFixed(8)},${P.coord[1].toFixed(8)}`)),Ze.map(P=>{const A=y[P];return u.jsx(_.Marker,{position:X(A),icon:L.has(P)?jo:Do,draggable:!s,eventHandlers:{dragstart:()=>{c.getState().takeSnapshot(),Nt(),$(y[P]),Oe(!0)},drag:K=>O.schedule(()=>ye(P,K)),dragend:K=>{O.flush(),Pe(P,K),Oe(!1)},click:K=>ie(P,K),contextmenu:K=>he(P,K)}},`v-${A[0].toFixed(8)},${A[1].toFixed(8)}-${P}`)}),b!==null&&Ue&&u.jsx(_.Popup,{position:Ue,eventHandlers:{remove:()=>v(null)},autoClose:!1,closeOnClick:!1,children:u.jsxs("div",{className:"flex flex-col gap-2 min-w-[140px]",onKeyDown:P=>{P.key==="Enter"&&we(),P.key==="Escape"&&v(null)},children:[u.jsx("p",{className:"text-xs font-semibold text-(--elm-text-secondary,var(--color-gray-700)) m-0 leading-none",children:"Precise coordinates"}),u.jsxs("div",{className:"flex flex-col gap-1",children:[u.jsxs("label",{className:"flex items-center gap-2 text-xs text-(--elm-text-muted,var(--color-gray-500))",children:["Lat:",u.jsx("input",{type:"text",value:S.lat,onChange:P=>E(A=>({...A,lat:P.target.value})),className:"flex-1 w-full min-w-0 border border-(--elm-border,var(--color-gray-200)) rounded-elm-chip px-1.5 py-0.5 text-xs outline-none focus:border-primary-400"})]}),u.jsxs("label",{className:"flex items-center gap-2 text-xs text-(--elm-text-muted,var(--color-gray-500))",children:["Lng:",u.jsx("input",{type:"text",value:S.lng,onChange:P=>E(A=>({...A,lng:P.target.value})),className:"flex-1 w-full min-w-0 border border-(--elm-border,var(--color-gray-200)) rounded-elm-chip px-1.5 py-0.5 text-xs outline-none focus:border-primary-400"})]})]}),u.jsxs("div",{className:"flex items-center justify-end gap-1 mt-1",children:[u.jsx("button",{onClick:()=>v(null),className:"px-2 py-1 text-xs text-(--elm-text-muted,var(--color-gray-500)) hover:bg-(--elm-surface-hover,var(--color-gray-100)) rounded-elm-chip transition-colors",children:"Cancel"}),u.jsxs("button",{onClick:we,className:"px-2 py-1 text-xs text-white bg-primary-500 hover:bg-primary-600 rounded-elm-chip transition-colors font-medium flex items-center gap-1",children:[u.jsx(xt.Check,{size:12,weight:"bold"})," Save"]})]})]})}),h&&(()=>{const P=L.has(h.index)&&e.length>1;return u.jsx(p.ContextMenu,{x:h.x,y:h.y,onClose:j,items:[{label:"Edit coordinates…",icon:u.jsx(xt.Crosshair,{size:16}),onClick:()=>Le(h.index)},{separator:!0},{label:P?`Delete ${e.length} points`:"Delete point",icon:u.jsx(xt.Trash,{size:16}),onClick:()=>P?o():Ee(h.index)}]})})()]})}function Dt(t,e){const[n,o]=a.useState(null),[r,l]=a.useState(t);return r!==t&&(l(t),o(null)),_.useMapEvents({mousemove(s){e&&o([s.latlng.lng,s.latlng.lat])},mouseout(){o(null)}}),n}function _o(){return ue.divIcon({className:"",html:'<div class="w-2.5 h-2.5 rounded-full border-2 border-white shadow bg-emerald-500"></div>',iconSize:[10,10],iconAnchor:[5,5]})}function Uo(){const t=p.useAccentPalette(_.useMap().getContainer())[500],e=p.useUIStore(i=>i.circleCenter),n=p.useUIStore(i=>i.editingMode),o=p.useUIStore(i=>i.snappedCoord),r=Dt(n,n==="draw-circle"),l=p.useDataStore(i=>i.geometryMode);if(n!=="draw-circle")return null;const s=o??r,c=e&&s?T.makeCircleCoords(e,s,l).map(X):null;return u.jsxs(u.Fragment,{children:[e&&u.jsx(_.Marker,{position:X(e),icon:_o(),interactive:!1}),c&&u.jsx(_.Polygon,{positions:c,pathOptions:{color:t,weight:2,opacity:.8,dashArray:"6 4",fillOpacity:.1},interactive:!1})]})}function No(t){return ue.divIcon({className:"",html:`<div class="w-2.5 h-2.5 rounded-full border-2 border-white shadow ${t?"bg-emerald-500":"bg-primary-500"}"></div>`,iconSize:[10,10],iconAnchor:[5,5]})}function Ko(){return ue.divIcon({className:"closing-node",html:'<div class="flex items-center justify-center w-full h-full group"><div class="w-4 h-4 rounded-full border-[3px] border-white shadow-lg bg-emerald-500 group-hover:scale-[1.5] group-hover:bg-emerald-400 transition-transform duration-200"></div></div>',iconSize:[48,48],iconAnchor:[24,24]})}function Ho(){const t=p.useUIStore(o=>o.polygonInProgress),e=p.useUIStore(o=>o.commitPolygon);if(t.length===0)return null;const n=t.map(X);return u.jsxs(u.Fragment,{children:[t.length>=3&&u.jsx(_.Polygon,{positions:n,pathOptions:{color:ge.DEFAULT_FEATURE_COLOR,weight:2,opacity:.7,dashArray:"6 4",fillOpacity:.1},interactive:!1}),t.length>=2&&u.jsx(_.Polyline,{positions:n,pathOptions:{color:ge.DEFAULT_FEATURE_COLOR,weight:2,opacity:.7,dashArray:"6 4"},interactive:!1}),t.map((o,r)=>{const l=r===0&&t.length>=3;return u.jsx(_.Marker,{position:X(o),icon:l?Ko():No(r===0),interactive:l,eventHandlers:l?{click:s=>{s.originalEvent.stopPropagation(),e({})}}:void 0},l?"closing-node":`point-${r}`)})]})}function Bo(){return ue.divIcon({className:"",html:'<div class="w-2.5 h-2.5 rounded-full border-2 border-white shadow bg-emerald-500"></div>',iconSize:[10,10],iconAnchor:[5,5]})}function Vo(){const t=p.useAccentPalette(_.useMap().getContainer())[500],e=p.useUIStore(m=>m.rectCorner),n=p.useUIStore(m=>m.editingMode),o=p.useUIStore(m=>m.snappedCoord),r=Dt(n,n==="draw-rect"),[l,s]=a.useState(!1);_.useMapEvents({mousemove(m){n==="draw-rect"&&s(m.originalEvent.shiftKey)}}),a.useEffect(()=>{var y,C;if(n!=="draw-rect"){s(!1);return}const m=L=>{L.key==="Shift"&&s(!0)},M=L=>{L.key==="Shift"&&s(!1)},f=((C=(y=document.querySelector(".leaflet-container"))==null?void 0:y.ownerDocument)==null?void 0:C.defaultView)||window;return f.addEventListener("keydown",m),f.addEventListener("keyup",M),()=>{f.removeEventListener("keydown",m),f.removeEventListener("keyup",M)}},[n]);const c=p.useDataStore(m=>m.geometryMode);if(n!=="draw-rect")return null;const i=o??r;let g=null;return e&&i&&(g=T.makeRectCoords(e,i,c,l).map(X)),u.jsxs(u.Fragment,{children:[e&&u.jsx(_.Marker,{position:X(e),icon:Bo(),interactive:!1}),g&&u.jsx(_.Polygon,{positions:g,pathOptions:{color:l?"#f472b6":t,weight:2,opacity:.8,dashArray:"6 4",fillOpacity:.1},interactive:!1})]})}function Go(t){return ue.divIcon({className:"",html:`<div class="w-2.5 h-2.5 rounded-full border-2 border-white shadow ${t?"bg-emerald-500":"bg-primary-500"}"></div>`,iconSize:[10,10],iconAnchor:[5,5]})}function $o(){const t=p.useAccentPalette(_.useMap().getContainer())[500],e=p.useUIStore(o=>o.lineInProgress);if(e.length===0)return null;const n=e.map(X);return u.jsxs(u.Fragment,{children:[e.length>=2&&u.jsx(_.Polyline,{positions:n,pathOptions:{color:t,weight:2,opacity:.7,dashArray:"6 4"},interactive:!1}),e.map((o,r)=>u.jsx(_.Marker,{position:X(o),icon:Go(r===0),interactive:!1},r))]})}function Xo({onMapClick:t}){return _.useMapEvents({click:t}),null}function Yo({onDragDelta:t,onDragEnd:e,onDuplicateDragChange:n,readonly:o}){const{dataStore:r}=p.useGeoStore(),l=_.useMap(),s=p.useUIStore(i=>i.editingMode),c=a.useRef(s);return c.current=s,_.useMapEvents({mousedown(i){if(o)return;const g=r.getState();if(c.current!=="none")return;const m=i.originalEvent.altKey,M=i.originalEvent.ctrlKey||i.originalEvent.metaKey;if(!m&&!M||g.selectedIds.length<2)return;const f=i.originalEvent.target;if(!(f.closest(".leaflet-overlay-pane path")||f.closest(".leaflet-marker-icon")||f.matches("canvas.leaflet-interactive")))return;i.originalEvent.preventDefault(),i.originalEvent.stopPropagation(),l.dragging.disable();const C=m;C&&n(!0);const L=T.project([i.latlng.lng,i.latlng.lat]);let b=!1;function v(E){b||Oe(!0),b=!0;const h=T.project([E.latlng.lng,E.latlng.lat]);t([h[0]-L[0],h[1]-L[1]])}function S(E){if(l.off("mousemove",v),l.off("mouseup",S),l.dragging.enable(),Oe(!1),!b)return;const h=T.project([E.latlng.lng,E.latlng.lat]);e([h[0]-L[0],h[1]-L[1]],C)}l.on("mousemove",v),l.on("mouseup",S)}}),null}const nn="M10 0C4.477 0 0 4.477 0 10c0 7 10 18 10 18s10-11 10-18C20 4.477 15.523 0 10 0zM10 5.5a3.5 3.5 0 1 0 0 7a3.5 3.5 0 1 0 0-7z";function zo(){return ue.divIcon({className:"",html:`<div style="position:relative;width:20px;height:28px">
10
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="28" viewBox="0 0 20 28" style="position:relative;z-index:1;display:block">
11
+ <path d="${nn}" fill-rule="evenodd" style="fill:var(--color-primary-500)"/>
12
+ </svg>
13
+ </div>`,iconSize:[20,28],iconAnchor:[10,28]})}function qo(){const t=p.useUIStore(e=>e.dialogState);return t.type!=="new-point"?null:u.jsx(_.Marker,{position:X(t.coords),icon:zo(),interactive:!1})}let _n=0;function Kt(){_n=Date.now()}function Wo(){return Date.now()-_n<200}const Pt=16,Ht="elmIdleFeatures",yt={color:"#ffffff",width:1.5,opacity:.7,maxPaths:5e3},Zo=ue.Canvas.extend({_initPath(t){this._pathCount=(this._pathCount??0)+1,ue.Canvas.prototype._initPath.call(this,t)},_removePath(t){this._pathCount=Math.max(0,(this._pathCount??0)-1),ue.Canvas.prototype._removePath.call(this,t)},_fillStroke(t,e){const n=e.options;(this._pathCount??0)<=yt.maxPaths&&n.stroke!==!1&&!n.fill&&"_parts"in e&&(n.opacity??1)>.05&&!n.dashArray&&(t.globalAlpha=(n.opacity??1)*yt.opacity,t.lineWidth=(n.weight??3)+2*yt.width,t.strokeStyle=yt.color,t.lineCap="round",t.lineJoin="round",t.setLineDash([]),t.stroke()),ue.Canvas.prototype._fillStroke.call(this,t,e)},_onMouseMove(t){if(this._map){if(this._map.dragging.moving()||this._map._animatingZoom){this._fireEvent(!1,t);return}this._handleMouseHover(t,this._map.mouseEventToLayerPoint(t))}},_handleMouseHover(t,e){if(this._mouseHoverThrottled){this._trailingHover=[t,e],this._fireEvent(this._hoveredLayer?[this._hoveredLayer]:!1,t);return}this._trailingHover=null,ue.Canvas.prototype._handleMouseHover.call(this,t,e),clearTimeout(this._trailingTimer),this._trailingTimer=setTimeout(()=>{const n=this._trailingHover;this._trailingHover=null,n&&this._map&&this._hoverHitTest(n[0],n[1])},33)},_hoverHitTest(t,e){let n;for(let o=this._drawFirst;o;o=o.next)o.layer.options.interactive&&o.layer._containsPoint(e)&&(n=o.layer);n!==(this._hoveredLayer??void 0)&&(this._handleMouseOut(t),n&&(this._container.classList.add("leaflet-interactive"),this._fireEvent([n],t,"mouseover"),this._hoveredLayer=n))}}),Un=a.createContext(void 0);function Jo(t,e){const n=a.useMemo(()=>{if(e==="canvas")return t.getPane(Ht)||(t.createPane(Ht).style.zIndex="399"),new Zo({pane:Ht,padding:.25,tolerance:6})},[t,e]);return a.useEffect(()=>{if(!n)return;const o=t.getPane("overlayPane");return o.style.pointerEvents="none",()=>{n.remove(),o.style.pointerEvents=""}},[t,n]),n}function Mt(t){var e;return t.getElement()??((e=t._renderer)==null?void 0:e._container)}function jt(t,e,n){const o=a.useContext(Un),r=t?void 0:o;return a.useEffect(()=>{var s,c;let l=!1;for(const i of e()){if(!i)continue;const g=i._map;g&&i.options.renderer!==r&&(g.removeLayer(i),i.options.renderer=r,(s=n==null?void 0:n.before)==null||s.call(n,i,!!r),g.addLayer(i),l=!0),t&&i.bringToFront()}l&&((c=n==null?void 0:n.after)==null||c.call(n))},[t,r]),r}const on={color:ge.DEFAULT_FEATURE_COLOR,weight:3.5,opacity:.9},rn={color:ge.DEFAULT_FEATURE_COLOR,fillColor:ge.DEFAULT_FEATURE_COLOR,weight:2,opacity:.9,fillOpacity:.15},sn={opacity:1,fillOpacity:.28};function Qo(t,e){if(!(!t&&!e))return n=>{const o=t==null?void 0:t(n),r=(o==null?void 0:o.color)??e,l=(o==null?void 0:o.fillColor)??r;return!r&&!l?o??void 0:{...o,...r&&{color:r},...l&&{fillColor:l}}}}function et(t){var e;return((e=en())==null?void 0:e(t))??void 0}const an=t=>(t==null?void 0:t.fillColor)??(t==null?void 0:t.color);function st(t,e,n){return{...t,...e,...n}}function it(t,e,n){if(!t)return n;const o=(e?ue.Polygon:ue.Polyline).prototype.options,r={};for(const l of Object.keys(t))r[l]=o[l];return{...r,...n}}const ct=a.createContext(ge.accentPalette());function ut(t,e,n){return o=>{o.originalEvent.preventDefault(),o.originalEvent.stopPropagation(),!(e||!n)&&n({feature:t,x:o.originalEvent.clientX,y:o.originalEvent.clientY})}}function at(t,e=!1,n){const o=e||t,r=o?"var(--color-primary-500)":n??ge.DEFAULT_FEATURE_COLOR;return ue.divIcon({className:"",html:`<div style="position:relative;width:20px;height:28px">
14
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="28" viewBox="0 0 20 28" style="position:relative;z-index:1;display:block">
15
+ <path d="${nn}" fill-rule="evenodd"${!o&&r===ge.DEFAULT_FEATURE_COLOR?' data-elm-plain="1"':""} style="fill:${r}"/>
16
+ </svg>
17
+ </div>`,iconSize:[20,28],iconAnchor:[10,28]})}function Qe(t,e){var o,r;const n=(r=(o=t==null?void 0:t.getElement)==null?void 0:o.call(t))==null?void 0:r.querySelector("path[data-elm-plain]");n&&(n.style.fill=e?"#334155":ge.DEFAULT_FEATURE_COLOR)}const vt=new Map;function Ct(t=ge.DEFAULT_FEATURE_COLOR){let e=vt.get(t);return e||(vt.size>=256&&vt.clear(),vt.set(t,e=at(!1,!1,t))),e}function $t(t=ge.DEFAULT_FEATURE_COLOR){return ue.divIcon({className:"",html:`<div style="position:relative;width:20px;height:28px;opacity:0.3">
18
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="28" viewBox="0 0 20 28" style="display:block">
19
+ <path d="${nn}" fill-rule="evenodd" style="fill:${t}"/>
20
+ </svg>
21
+ </div>`,iconSize:[20,28],iconAnchor:[10,28]})}function Nn(t,e){const n=a.useRef(!1);return{isDupDrag:t?n.current:e,setDuplicateDrag:r=>{n.current=r},resetDuplicateDrag:()=>{n.current=!1}}}const er={weight:3,opacity:.5,dashArray:"6 4",interactive:!1},tr={weight:2,opacity:.5,fillOpacity:.15,dashArray:"6 4",interactive:!1};function Kn(t,e,n){return typeof t[0]=="number"?[t[0]+e,t[1]+n]:t.map(o=>Kn(o,e,n))}function Xt(t,e,n,o){if(!e)return{display:t,ghost:null};const r=o==="visual"?T.translateGeometryVisually(t,e[0],e[1]):Kn(t,e[0],e[1]);return n?{display:t,ghost:r}:{display:r,ghost:null}}function nr(t){return t&&"style"in t?t:null}const St=new Set;let hn=!1;function or(){if(hn||typeof window>"u")return;hn=!0;const t=e=>{for(const n of St)n(e)};window.addEventListener("keydown",t),window.addEventListener("keyup",t)}function ft(t){const e=a.useRef(null),n=a.useRef(!1),o=a.useRef({value:"",priority:""});function r(m,M,f="important"){m.style.setProperty("cursor",M,f)}const l=a.useRef(t);l.current=t;const s=a.useRef(m=>{if(l.current||!n.current)return;const M=e.current;if(!M)return;const f=m.ctrlKey||m.metaKey,y=m.altKey;f||y?r(M,y?"copy":"move"):r(M,o.current.value,o.current.priority)}).current;a.useEffect(()=>()=>{St.delete(s)},[s]);const c=a.useCallback((m,M)=>{const f=nr(m),y=f!==null&&f===e.current&&n.current;e.current=f,n.current=!0,or(),St.add(s),y||(o.current={value:(f==null?void 0:f.style.getPropertyValue("cursor"))??"",priority:(f==null?void 0:f.style.getPropertyPriority("cursor"))??""});const C=M;f&&C&&(C.ctrlKey||C.metaKey||C.altKey)&&r(f,C.altKey?"copy":"move")},[]),i=a.useCallback(()=>{n.current=!1,St.delete(s),e.current&&(r(e.current,o.current.value,o.current.priority),e.current=null),o.current={value:"",priority:""}},[]),g=a.useCallback(m=>{n.current&&(i(),c(m,Rt()))},[c,i]);return{enter:c,leave:i,retarget:g}}const yn=ue.divIcon({className:"hidden"}),rr=a.memo(function({feature:e,selected:n,isMultiSelected:o,multiDragDelta:r,multiDuplicateDrag:l,readonly:s,suppressDoubleClickZoomForGesture:c}){const{dataStore:i}=p.useGeoStore(),g=p.useDataStore(d=>d.updateFeature),m=e.geometry.coordinates,[M,f]=a.useState(null),y=a.useRef(null),C=a.useRef(null),L=a.useRef(null),b=a.useRef(null),v=a.useRef(!1),{isDupDrag:S,setDuplicateDrag:E,resetDuplicateDrag:h}=Nn(M,l),x=a.useRef(null),[j,Y]=a.useState(!e.properties.name),[R,B]=a.useState(!1),D=ft(s),H=y.current??M,O=o&&r?r:H,{display:z,ghost:k}=Xt(m,O,S,i.getState().geometryMode);function G(d){if(s)return;v.current=!1;const I=d.originalEvent.altKey,V=d.originalEvent.ctrlKey||d.originalEvent.metaKey;if(!I&&!V||o&&i.getState().selectedIds.length>=2)return;d.originalEvent.preventDefault(),d.originalEvent.stopPropagation();const ee=d.target._map||window._leafletMap;if(!ee)return;ee.dragging.disable();const q=I;if(E(q),i.getState().geometryMode==="visual"){const $=T.project([d.latlng.lng,d.latlng.lat]);b.current={lng:$[0],lat:$[1]}}else b.current={lng:d.latlng.lng,lat:d.latlng.lat};!n&&!o&&i.getState().selectFeature(e.id),f([0,0]);function ne($){var fe,oe;if(!b.current)return;v.current||Oe(!0),v.current=!0;const w=i.getState().geometryMode,W=w==="visual"?(()=>{const pe=T.project([$.latlng.lng,$.latlng.lat]);return[pe[0]-b.current.lng,pe[1]-b.current.lat]})():[$.latlng.lng-b.current.lng,$.latlng.lat-b.current.lat];y.current=W;const te=w==="visual"?T.translateGeometryVisually(m,W[0],W[1]):[m[0]+W[0],m[1]+W[1]],Q=X(te);q?(fe=L.current)==null||fe.setLatLng(Q):(oe=C.current)==null||oe.setLatLng(Q)}function de($){if(ee.off("mousemove",ne),ee.off("mouseup",de),ee.dragging.enable(),Oe(!1),!b.current||!v.current){b.current=null,h(),y.current=null,f(null);return}const w=i.getState().geometryMode;let W,te;if(w==="visual"){const fe=T.project([$.latlng.lng,$.latlng.lat]);W=fe[0]-b.current.lng,te=fe[1]-b.current.lat}else W=$.latlng.lng-b.current.lng,te=$.latlng.lat-b.current.lat;b.current=null,h(),y.current=null,f(null);const Q=w==="visual"?T.translateGeometryVisually(m,W,te):T.withXY(m,[m[0]+W,m[1]+te]);q?i.getState().duplicateFeaturesAtPosition([{sourceId:e.id,geometry:{type:"Point",coordinates:Q}}]):g(e.id,{geometry:{type:"Point",coordinates:Q}})}ee.on("mousemove",ne),ee.on("mouseup",de)}const F=e.properties.name||"";return a.useEffect(()=>{n||Y(!1)},[n]),a.useEffect(()=>{j&&x.current&&setTimeout(()=>{var d;return(d=x.current)==null?void 0:d.focus()},50)},[j]),u.jsxs(u.Fragment,{children:[u.jsx(_.Marker,{ref:d=>{C.current=d},position:X(z),icon:yn,eventHandlers:{mousedown:G,click:d=>{d.originalEvent.stopPropagation(),d.originalEvent.shiftKey&&!s?i.getState().toggleSelection(e.id):!n&&!o&&i.getState().selectFeature(e.id),!s&&!d.originalEvent.shiftKey&&setTimeout(()=>{var I;return(I=x.current)==null?void 0:I.focus()},50)}},children:u.jsx(_.Tooltip,{permanent:!0,interactive:!0,direction:"center",className:"!bg-transparent !border-0 !shadow-none !p-0",eventHandlers:{click:d=>{d.originalEvent.stopPropagation(),d.originalEvent.shiftKey&&!s?i.getState().toggleSelection(e.id):!s&&!n&&i.getState().selectFeature(e.id),!s&&!d.originalEvent.shiftKey&&n&&setTimeout(()=>{var I;return(I=x.current)==null?void 0:I.focus()},50)},dblclick:d=>{d.originalEvent.stopPropagation(),c==null||c(),s||(i.getState().selectFeature(e.id),Y(!0))},mouseover:d=>{var I,V;D.enter((V=(I=d.target).getElement)==null?void 0:V.call(I),d.originalEvent),B(!0)},mouseout:()=>{D.leave(),B(!1)},mousedown:()=>{}},children:u.jsx("div",{className:`flex items-center justify-center w-max px-3 py-1.5 rounded text-sm font-medium transition-colors border ${j&&!O?"bg-white/95 backdrop-blur-md border border-gray-800 text-gray-800":n?"bg-primary-500 text-white":R?"bg-slate-700 text-white":"bg-slate-600 text-white"} ${O&&!S?"cursor-grabbing opacity-80":""}`,onMouseDown:d=>{d.target===x.current&&d.stopPropagation()},children:s||!j||O?u.jsx("div",{className:"whitespace-pre min-w-[12px] text-center text-inherit cursor-pointer leading-tight",children:F||" "}):u.jsxs("div",{className:"grid items-center justify-items-center text-center leading-tight",children:[u.jsx("div",{className:"invisible whitespace-pre pointer-events-none col-start-1 row-start-1 min-w-[12px] px-[2px]","aria-hidden":"true",children:F+" "}),u.jsx("textarea",{ref:x,autoFocus:!0,value:F,onChange:d=>{g(e.id,{properties:{...e.properties,name:d.target.value}})},onKeyDown:d=>{d.key==="Enter"&&!d.shiftKey&&(d.preventDefault(),Y(!1),i.getState().selectFeature(null))},onBlur:()=>Y(!1),className:"bg-transparent outline-none resize-none overflow-hidden text-center text-inherit whitespace-pre min-w-0 min-h-0 col-start-1 row-start-1 px-[2px] w-full h-full m-0 border-none justify-self-stretch self-stretch"})]})})})}),k&&u.jsx(_.Marker,{ref:d=>{L.current=d},position:X(k),icon:yn,draggable:!1,opacity:.5,interactive:!1,children:u.jsx(_.Tooltip,{permanent:!0,direction:"center",className:"!bg-transparent !border-0 !shadow-none !p-0",children:u.jsx("div",{className:"flex items-center justify-center w-max px-3 py-1.5 rounded text-sm font-medium border bg-primary-500/60 text-white/80 border-primary-400/40",style:{borderStyle:"dashed"},children:u.jsx("div",{className:"whitespace-pre min-w-[12px] text-center text-inherit leading-tight",children:F||" "})})})})]})});function At(t,e,n,o,r,l,s){const{dataStore:c,uiStore:i}=p.useGeoStore(),g=p.useDataStore(h=>h.updateFeature),m=_.useMap(),[M,f]=a.useState(null),y=a.useRef(null),C=a.useRef(null),L=a.useRef(!1),b=a.useRef(s);b.current=s;const v=y.current??M,S=n&&o?o:v;function E(h,x){if(r||(L.current=!1,!x.originalEvent.ctrlKey&&!x.originalEvent.metaKey)||n&&c.getState().selectedIds.length>=2)return;if(x.originalEvent.preventDefault(),x.originalEvent.stopPropagation(),m.dragging.disable(),c.getState().geometryMode==="visual"){const B=T.project([x.latlng.lng,x.latlng.lat]);C.current={lng:B[0],lat:B[1]}}else C.current={lng:x.latlng.lng,lat:x.latlng.lat};!e&&!n&&c.getState().selectFeature(t.id),f([0,0]);function Y(B){if(!C.current)return;l.markDragStart(),L.current=!0;const D=c.getState().geometryMode,H=D==="visual"?(()=>{const z=T.project([B.latlng.lng,B.latlng.lat]);return[z[0]-C.current.lng,z[1]-C.current.lat]})():[B.latlng.lng-C.current.lng,B.latlng.lat-C.current.lat];y.current=H;const O=e?i.getState().selectedPartIndex:null;b.current?b.current(H,D,O):f(H)}function R(B){if(m.off("mousemove",Y),m.off("mouseup",R),m.dragging.enable(),!C.current||!L.current){C.current=null,y.current=null,f(null);return}const D=C.current,H=c.getState().geometryMode;let O,z;if(H==="visual"){const d=T.project([B.latlng.lng,B.latlng.lat]);O=d[0]-D.lng,z=d[1]-D.lat}else O=B.latlng.lng-D.lng,z=B.latlng.lat-D.lat;C.current=null,y.current=null,f(null),c.getState().takeSnapshot();const k=[O,z],G=H==="visual",F=i.getState().selectedPartIndex;if(F!=null){const d=T.getPartGeometry(t.geometry,F),I=T.setPartGeometry(t.geometry,F,T.offsetSimpleGeometry(d,k,G));g(t.id,{geometry:I})}else g(t.id,{geometry:T.offsetGeometry(t.geometry,k,G)});l.markDragEnd()}m.on("mousemove",Y),m.on("mouseup",R)}return{effectiveDelta:S,dragged:L,handleMouseDown:E}}function sr({geom:t,delta:e,keyPrefix:n,active:o,selectedPart:r,linePathOptions:l,polyPathOptions:s,pinSelected:c,pinMultiSelected:i,pinIdle:g,handlers:m,visual:M=!1}){const f=e?S=>T.translateGeometryVisually(S,e[0],e[1]):S=>S,y=e?M?S=>T.translateGeometryVisually([S],e[0],e[1])[0]:([S,E])=>[S+e[0],E+e[1]]:S=>S,C={...l,opacity:.25},L={...s,opacity:.2,fillOpacity:.08},b=r?l:C,v=r?s:L;if(t.type==="Point")return u.jsx(_.Marker,{position:X(y(t.coordinates)),icon:o?r?at(c,i,g):$t(g):Ct(g),draggable:!1,eventHandlers:m});if(t.type==="MultiPoint")return u.jsx(u.Fragment,{children:t.coordinates.map((S,E)=>u.jsx(_.Marker,{position:X(y(S)),icon:o?r?at(c,i,g):$t(g):Ct(g),draggable:!1,eventHandlers:m},`${n}-pt${E}`))});if(t.type==="LineString"){const S=(e?f(t.coordinates):t.coordinates).map(X);return u.jsxs(u.Fragment,{children:[u.jsx(_.Polyline,{positions:S,pathOptions:b,interactive:!1}),u.jsx(_.Polyline,{positions:S,pathOptions:{color:"#000",weight:Pt,opacity:.001},eventHandlers:m})]})}if(t.type==="MultiLineString"){const S=e?f(t.coordinates):t.coordinates;return u.jsx(u.Fragment,{children:S.map((E,h)=>{const x=E.map(X);return u.jsxs(a.Fragment,{children:[u.jsx(_.Polyline,{positions:x,pathOptions:b,interactive:!1}),u.jsx(_.Polyline,{positions:x,pathOptions:{color:"#000",weight:Pt,opacity:.001},eventHandlers:m})]},`${n}-ln${h}`)})})}if(t.type==="Polygon"){const E=(e?f(t.coordinates):t.coordinates).map(h=>h.map(X));return u.jsx(_.Polygon,{positions:E,pathOptions:v,eventHandlers:m})}if(t.type==="MultiPolygon"){const S=e?f(t.coordinates):t.coordinates;return u.jsx(u.Fragment,{children:S.map((E,h)=>{const x=E.map(j=>j.map(X));return u.jsx(_.Polygon,{positions:x,pathOptions:v,eventHandlers:m},`${n}-part${h}`)})})}return null}const ir=a.memo(function({feature:e,selected:n,isMultiSelected:o,multiDragDelta:r,readonly:l,interaction:s,onContextMenu:c}){const{dataStore:i,uiStore:g}=p.useGeoStore(),m=p.useDataStore(D=>D.toggleSelection),M=p.useUIStore(D=>D.setSelectedPartIndex),f=p.useUIStore(D=>D.selectedPartIndex),[y,C]=a.useState(!1),{effectiveDelta:L,dragged:b,handleMouseDown:v}=At(e,n,o,r,l,s),S=a.useContext(ct)[500],E=et(e);if(e.geometry.type!=="GeometryCollection")return null;function h(D){return{mouseover:H=>{lt(H.target,e,g,H.latlng,H.originalEvent),C(!0),Qe(H.target,!0)},mouseout:H=>{qe(H.target),C(!1),Qe(H.target,!1)},click:H=>{if(g.getState().editingMode==="none")if(H.originalEvent.stopPropagation(),H.originalEvent.shiftKey&&!l){if(!s.shouldHandleFeatureClick(b.current))return;m(e.id)}else if(n){if(b.current)return;s.markFeatureClick(),M(f===D?null:D)}else{if(!s.shouldHandleFeatureClick(b.current))return;s.markFeatureClick(),i.getState().selectFeature(e.id)}},mousedown:H=>v(D,H),contextmenu:ut(e,l,c)}}const x=o||n||!!L,j=n&&f!=null,Y=o||n||!!L,R=Y?it(E,!1,{color:o||n?S:ge.DEFAULT_FEATURE_COLOR,weight:n?4.5:3.5,opacity:y?1:.9}):st(on,E,y?{opacity:1}:null),B=Y?it(E,!0,{color:o||n?S:ge.DEFAULT_FEATURE_COLOR,fillColor:o||n?S:ge.DEFAULT_FEATURE_COLOR,weight:n?3:2,opacity:y?1:.9,fillOpacity:n?.25:y?.28:.15,className:L?"cursor-grabbing":""}):st(rn,E,y?sn:null);return u.jsx(u.Fragment,{children:e.geometry.geometries.map((D,H)=>{const O=L?j?H===f?L:null:L:null,k=!j||f===H;return u.jsx(a.Fragment,{children:u.jsx(sr,{geom:D,delta:O,keyPrefix:`gc-${H}`,active:x,selectedPart:k,linePathOptions:R,polyPathOptions:B,pinSelected:n,pinMultiSelected:o,pinIdle:an(E),handlers:h(H),visual:i.getState().geometryMode==="visual"})},H)})})},(t,e)=>t.feature===e.feature&&t.selected===e.selected&&t.isMultiSelected===e.isMultiSelected&&t.multiDragDelta===e.multiDragDelta&&t.readonly===e.readonly&&t.interaction===e.interaction);function ln(t,e,n,o,r,l,s,c,i,g){const{dataStore:m}=p.useGeoStore(),M=p.useDataStore(D=>D.updateFeature),f=_.useMap(),[y,C]=a.useState(null),L=a.useRef(null),b=a.useRef(null),v=a.useRef(!1),{isDupDrag:S,setDuplicateDrag:E,resetDuplicateDrag:h}=Nn(y,s),x=L.current??y,j=r&&l?l:x,{display:Y,ghost:R}=Xt(n,j,S,m.getState().geometryMode);function B(D){if(c)return;v.current=!1;const H=D.originalEvent.altKey,O=D.originalEvent.ctrlKey||D.originalEvent.metaKey;if(!H&&!O||r&&m.getState().selectedIds.length>=2)return;D.originalEvent.preventDefault(),D.originalEvent.stopPropagation(),f.dragging.disable();const z=H;if(E(z),m.getState().geometryMode==="visual"){const d=T.project([D.latlng.lng,D.latlng.lat]);b.current={lng:d[0],lat:d[1]}}else b.current={lng:D.latlng.lng,lat:D.latlng.lat};!o&&!r&&m.getState().selectFeature(t.id),C([0,0]);function G(d){if(!b.current)return;i.markDragStart(),v.current=!0;const I=m.getState().geometryMode,V=I==="visual"?(()=>{const ee=T.project([d.latlng.lng,d.latlng.lat]);return[ee[0]-b.current.lng,ee[1]-b.current.lat]})():[d.latlng.lng-b.current.lng,d.latlng.lat-b.current.lat];L.current=V,g(Xt(n,V,!1,I).display,z)}function F(d){if(f.off("mousemove",G),f.off("mouseup",F),f.dragging.enable(),!b.current||!v.current){b.current=null,h(),L.current=null,C(null);return}const I=b.current,V=m.getState().geometryMode;let ee,q;if(V==="visual"){const de=T.project([d.latlng.lng,d.latlng.lat]);ee=de[0]-I.lng,q=de[1]-I.lat}else ee=d.latlng.lng-I.lng,q=d.latlng.lat-I.lat;b.current=null,h(),L.current=null,C(null);const ce=V==="visual"?T.translateGeometryVisually(n,ee,q):T.translateGeometrySpatially(n,[I.lng,I.lat],[d.latlng.lng,d.latlng.lat]),ne={type:e,coordinates:ce};z?m.getState().duplicateFeaturesAtPosition([{sourceId:t.id,geometry:ne}]):(m.getState().takeSnapshot(),M(t.id,{geometry:ne})),i.markDragEnd()}f.on("mousemove",G),f.on("mouseup",F)}return{effectiveDelta:j,display:Y,ghost:R,dragged:v,handleMouseDown:B}}const ar=a.memo(function({feature:e,selected:n,isMultiSelected:o,onVertexEdit:r,multiDragDelta:l,multiDuplicateDrag:s,readonly:c,interaction:i,onContextMenu:g}){const{dataStore:m,uiStore:M}=p.useGeoStore(),f=p.useDataStore(k=>k.toggleSelection),y=a.useContext(ct)[500],C=e.geometry.coordinates,L=a.useRef(null),b=a.useRef(null),v=a.useRef(null),[S,E]=a.useState(!1),h=ft(c),x=et(e),j=jt(n||o,()=>[L.current,v.current],{before:(k,G)=>{k===L.current&&(k.options.interactive=G)},after:()=>{const k=(j?L:v).current;k&&h.retarget(Mt(k))}}),{effectiveDelta:Y,display:R,ghost:B,dragged:D,handleMouseDown:H}=ln(e,"LineString",C,n,o,l,s,c,i,(k,G)=>{var F;return(F=(G?b:L).current)==null?void 0:F.setLatLngs(k.map(X))}),O=a.useMemo(()=>R.map(X),[R]),z={mouseover:k=>{h.enter(Mt(k.target),k.originalEvent),lt(k.target,e,M,k.latlng,k.originalEvent),M.getState().vertexEditActive||E(!0)},mouseout:k=>{h.leave(),qe(k.target),E(!1)},click:k=>{M.getState().editingMode==="none"&&(k.originalEvent.stopPropagation(),i.shouldHandleFeatureClick(D.current)&&(k.originalEvent.shiftKey&&!c?f(e.id):(i.markFeatureClick(),m.getState().selectFeature(e.id))))},dblclick:k=>{M.getState().editingMode==="none"&&(k.originalEvent.stopPropagation(),c||r())},contextmenu:ut(e,c,g),mousedown:H};return u.jsxs(u.Fragment,{children:[u.jsx(_.Polyline,{ref:k=>{L.current=k},positions:O,pathOptions:n||o||Y?it(x,!1,{color:o||n?y:ge.DEFAULT_FEATURE_COLOR,weight:n||S?4.5:3.5,opacity:S?1:.9}):st(on,x,S?{weight:4.5,opacity:1}:null),renderer:j,interactive:!!j,eventHandlers:z}),!j&&u.jsx(_.Polyline,{ref:k=>{v.current=k},positions:O,pathOptions:{color:"#000",weight:Pt,opacity:.001},eventHandlers:z}),B&&u.jsx(_.Polyline,{ref:k=>{b.current=k},positions:B.map(X),pathOptions:{...er,color:y}})]})},(t,e)=>t.feature===e.feature&&t.selected===e.selected&&t.isMultiSelected===e.isMultiSelected&&t.multiDragDelta===e.multiDragDelta&&t.multiDuplicateDrag===e.multiDuplicateDrag&&t.readonly===e.readonly&&t.interaction===e.interaction),lr=a.memo(function({feature:e,selected:n,isMultiSelected:o,multiDragDelta:r,readonly:l,interaction:s,onContextMenu:c}){const{dataStore:i,uiStore:g}=p.useGeoStore(),m=p.useDataStore(k=>k.toggleSelection),M=p.useUIStore(k=>k.setSelectedPartIndex),f=p.useUIStore(k=>k.selectedPartIndex),y=e.geometry.coordinates,[C,L]=a.useState(!1),b=a.useRef(new Map),v=a.useRef(new Map),S=et(e),E=jt(n||o,()=>[...b.current.values(),...v.current.values()],{before:(k,G)=>{[...b.current.values()].includes(k)&&(k.options.interactive=G)}}),{effectiveDelta:h,dragged:x,handleMouseDown:j}=At(e,n,o,r,l,s,(k,G,F)=>{for(let d=0;d<y.length;d++){if(F!=null&&F!==d)continue;const I=b.current.get(d);if(!I)continue;const V=G==="visual"?T.translateGeometryVisually([y[d]],k[0],k[1])[0]:y[d].map(([ee,q])=>[ee+k[0],q+k[1]]);I.setLatLngs(V.map(X))}}),Y=a.useContext(ct)[500],R=n?f:null,D=y.map((k,G)=>h&&(R==null||R===G)?i.getState().geometryMode==="visual"?T.translateGeometryVisually([k],h[0],h[1])[0]:k.map(([d,I])=>[d+h[0],I+h[1]]):k).map(k=>k.map(X)),H=n&&f!=null,O=o||n||h?it(S,!1,{color:o||n?Y:ge.DEFAULT_FEATURE_COLOR,weight:n?4.5:3.5,opacity:C?1:.9}):st(on,S,C?{opacity:1}:null),z={...O,opacity:.25};return u.jsx(u.Fragment,{children:D.map((k,G)=>{const d=!H||f===G?O:z,I={mouseover:()=>{g.getState().vertexEditActive||L(!0)},mouseout:()=>L(!1),click:V=>{if(g.getState().editingMode==="none")if(V.originalEvent.stopPropagation(),V.originalEvent.shiftKey&&!l){if(!s.shouldHandleFeatureClick(x.current))return;m(e.id)}else if(n){if(x.current)return;s.markFeatureClick(),M(f===G?null:G)}else{if(!s.shouldHandleFeatureClick(x.current))return;s.markFeatureClick(),i.getState().selectFeature(e.id)}},dblclick:V=>{g.getState().editingMode==="none"&&V.originalEvent.stopPropagation()},mousedown:V=>j(G,V),contextmenu:ut(e,l,c)};return u.jsxs(a.Fragment,{children:[u.jsx(_.Polyline,{ref:V=>{V?b.current.set(G,V):b.current.delete(G)},positions:k,pathOptions:d,renderer:E,interactive:!!E,eventHandlers:I}),!E&&u.jsx(_.Polyline,{ref:V=>{V?v.current.set(G,V):v.current.delete(G)},positions:k,pathOptions:{color:"#000",weight:Pt,opacity:.001},eventHandlers:I})]},`line-part-${G}`)})})},(t,e)=>t.feature===e.feature&&t.selected===e.selected&&t.isMultiSelected===e.isMultiSelected&&t.multiDragDelta===e.multiDragDelta&&t.readonly===e.readonly&&t.interaction===e.interaction),cr=a.memo(function({feature:e,selected:n,isMultiSelected:o,multiDragDelta:r,readonly:l,interaction:s,onContextMenu:c}){const{dataStore:i,uiStore:g}=p.useGeoStore(),m=p.useDataStore(R=>R.toggleSelection),M=p.useUIStore(R=>R.setSelectedPartIndex),f=p.useUIStore(R=>R.selectedPartIndex),y=e.geometry.coordinates,C=an(et(e)),L=a.useRef(new Map),b=ft(l),{effectiveDelta:v,dragged:S,handleMouseDown:E}=At(e,n,o,r,l,s,(R,B,D)=>{for(let H=0;H<y.length;H++){if(D!=null&&D!==H)continue;const O=L.current.get(H);if(!O)continue;const z=y[H],k=B==="visual"?T.translateGeometryVisually([z],R[0],R[1])[0]:[z[0]+R[0],z[1]+R[1]];O.setLatLng(X(k))}}),h=n?f:null,x=y.map((R,B)=>v&&(h==null||h===B)?i.getState().geometryMode==="visual"?T.translateGeometryVisually([R],v[0],v[1])[0]:[R[0]+v[0],R[1]+v[1]]:R),j=o||n||!!v,Y=n&&f!=null;return u.jsx(u.Fragment,{children:x.map((R,B)=>u.jsx(_.Marker,{ref:D=>{D?L.current.set(B,D):L.current.delete(B)},position:X(R),icon:j?Y&&f!==B?$t(C):at(n&&(!Y||f===B),o,C):Ct(C),draggable:!1,eventHandlers:{mouseover:D=>{var H,O;b.enter((O=(H=D.target).getElement)==null?void 0:O.call(H),D.originalEvent),lt(D.target,e,g,D.latlng,D.originalEvent),g.getState().vertexEditActive||Qe(D.target,!0)},mouseout:D=>{b.leave(),qe(D.target),Qe(D.target,!1)},click:D=>{if(g.getState().editingMode==="none")if(D.originalEvent.stopPropagation(),D.originalEvent.shiftKey&&!l){if(!s.shouldHandleFeatureClick(S.current))return;m(e.id)}else if(n){if(S.current)return;s.markFeatureClick(),M(f===B?null:B)}else{if(!s.shouldHandleFeatureClick(S.current))return;s.markFeatureClick(),i.getState().selectFeature(e.id)}},mousedown:D=>E(B,D),contextmenu:ut(e,l,c)}},`pt-${R[0].toFixed(8)},${R[1].toFixed(8)}-${B}`))})},(t,e)=>t.feature===e.feature&&t.selected===e.selected&&t.isMultiSelected===e.isMultiSelected&&t.multiDragDelta===e.multiDragDelta&&t.readonly===e.readonly&&t.interaction===e.interaction),ur=a.memo(function({feature:e,selected:n,isMultiSelected:o,multiDragDelta:r,onVertexEdit:l,readonly:s,interaction:c,onContextMenu:i}){const{dataStore:g,uiStore:m}=p.useGeoStore(),M=p.useDataStore(k=>k.toggleSelection),f=p.useUIStore(k=>k.setSelectedPartIndex),y=p.useUIStore(k=>k.selectedPartIndex),C=e.geometry.coordinates,[L,b]=a.useState(!1),v=a.useRef(new Map),S=et(e),E=jt(n||o,()=>v.current.values()),{effectiveDelta:h,dragged:x,handleMouseDown:j}=At(e,n,o,r,s,c,(k,G,F)=>{for(let d=0;d<C.length;d++){if(F!=null&&F!==d)continue;const I=v.current.get(d);if(!I)continue;const V=G==="visual"?T.translateGeometryVisually([C[d]],k[0],k[1])[0]:C[d].map(ee=>ee.map(([q,ce])=>[q+k[0],ce+k[1]]));I.setLatLngs(V.map(ee=>ee.map(X)))}}),Y=a.useContext(ct)[500],R=n?y:null,B=a.useMemo(()=>C.map((k,G)=>h&&(R==null||R===G)?g.getState().geometryMode==="visual"?T.translateGeometryVisually([k],h[0],h[1])[0]:k.map(d=>d.map(([I,V])=>[I+h[0],V+h[1]])):k),[C,h,R]),D=a.useMemo(()=>B.map(k=>k.map(G=>G.map(X))),[B]),H=n&&y!=null,O=o||n||h?it(S,!0,{color:o||n?Y:ge.DEFAULT_FEATURE_COLOR,fillColor:o||n?Y:ge.DEFAULT_FEATURE_COLOR,weight:n?3:2,opacity:L?1:.9,fillOpacity:n?.25:L?.28:.15,className:h?"cursor-grabbing":""}):st(rn,S,L?sn:null),z={...O,opacity:.2,fillOpacity:.08};return u.jsx(u.Fragment,{children:D.map((k,G)=>u.jsx(_.Polygon,{ref:F=>{F?v.current.set(G,F):v.current.delete(G)},positions:k,renderer:E,pathOptions:H&&y!==G?z:O,eventHandlers:{mouseover:F=>{lt(F.target,e,m,F.latlng,F.originalEvent),m.getState().vertexEditActive||b(!0)},mouseout:F=>{qe(F.target),b(!1)},click:F=>{if(m.getState().editingMode==="none")if(F.originalEvent.stopPropagation(),F.originalEvent.shiftKey&&!s){if(!c.shouldHandleFeatureClick(x.current))return;M(e.id)}else if(n){if(x.current)return;c.markFeatureClick(),f(y===G?null:G)}else{if(!c.shouldHandleFeatureClick(x.current))return;c.markFeatureClick(),g.getState().selectFeature(e.id)}},dblclick:F=>{m.getState().editingMode==="none"&&(F.originalEvent.stopPropagation(),s||l())},mousedown:F=>j(G,F),contextmenu:ut(e,s,i)}},`poly-part-${G}`))})},(t,e)=>t.feature===e.feature&&t.selected===e.selected&&t.isMultiSelected===e.isMultiSelected&&t.multiDragDelta===e.multiDragDelta&&t.readonly===e.readonly&&t.interaction===e.interaction),dr=a.memo(function({feature:e,selected:n,isMultiSelected:o,multiDragDelta:r,multiDuplicateDrag:l,readonly:s,interaction:c,onContextMenu:i}){const{dataStore:g}=p.useGeoStore(),m=_.useMap(),{uiStore:M}=p.useGeoStore(),f=p.useEmit(),y=p.useDataStore(d=>d.updateFeature),C=p.useDataStore(d=>d.toggleSelection),L=e.geometry.coordinates,[b,v]=a.useState(!1),S=an(et(e)),[E,h]=a.useState({lng:"",lat:""}),x=a.useRef(null),j=a.useRef(null),{effectiveDelta:Y,display:R,ghost:B,dragged:D,handleMouseDown:H}=ln(e,"Point",L,n,o,r,l,s,c,(d,I)=>{var V;return(V=(I?j:x).current)==null?void 0:V.setLatLng(X(d))}),O=ft(s);a.useEffect(()=>{var I,V;if(s)return;const d=(V=(I=x.current)==null?void 0:I.getElement)==null?void 0:V.call(I);if(!(!d||!fo(m,X(L))||!go(d)))return zt(e.id),O.enter(d,Rt()),M.getState().vertexEditActive||Qe(x.current,!0),()=>{O.leave()}},[e.id,s]);const z=ao(e.id);a.useEffect(()=>{var d,I,V;(V=(I=(d=x.current)==null?void 0:d.getElement)==null?void 0:I.call(d))==null||V.classList.toggle("elm-pin-fresh",z)});function k(){h({lng:L[0].toFixed(6),lat:L[1].toFixed(6)}),v(!0)}function G(d){d.originalEvent.preventDefault(),d.originalEvent.stopPropagation(),!s&&i&&i({feature:e,x:d.originalEvent.clientX,y:d.originalEvent.clientY,requestPreciseCoords:k})}function F(){const d=parseFloat(E.lng),I=parseFloat(E.lat);!isNaN(d)&&!isNaN(I)?(g.getState().takeSnapshot(),y(e.id,{geometry:{type:"Point",coordinates:T.withXY(L,[d,I])}}),v(!1),f({type:"success",message:"Coordinate updated"})):f({type:"warning",message:"Invalid coordinates"})}return u.jsxs(u.Fragment,{children:[u.jsx(_.Marker,{ref:d=>{x.current=d},position:X(R),icon:n||o||b||Y?at(n,o,S):Ct(S),draggable:!1,eventHandlers:{mouseover:d=>{var I,V;O.enter((V=(I=d.target).getElement)==null?void 0:V.call(I),d.originalEvent),lt(d.target,e,M,d.latlng,d.originalEvent),M.getState().vertexEditActive||Qe(x.current,!0)},mouseout:d=>{O.leave(),qe(d.target),Qe(d.target,!1)},click:d=>{M.getState().editingMode==="none"&&(d.originalEvent.stopPropagation(),c.shouldHandleFeatureClick(D.current)&&(d.originalEvent.shiftKey&&!s?C(e.id):(c.markFeatureClick(),g.getState().selectFeature(e.id))))},contextmenu:G,mousedown:H},children:b&&u.jsx(_.Popup,{eventHandlers:{remove:()=>v(!1)},autoClose:!1,closeOnClick:!1,children:u.jsxs("div",{className:"flex flex-col gap-2 min-w-[140px]",onKeyDown:d=>{d.key==="Enter"&&F(),d.key==="Escape"&&v(!1)},children:[u.jsx("p",{className:"text-xs font-semibold text-(--elm-text-secondary,var(--color-gray-700)) m-0 leading-none",children:"Precise coordinates"}),u.jsxs("div",{className:"flex flex-col gap-1",children:[u.jsxs("label",{className:"flex items-center gap-2 text-xs text-(--elm-text-muted,var(--color-gray-500))",children:["Lat:",u.jsx("input",{type:"text",value:E.lat,onChange:d=>h(I=>({...I,lat:d.target.value})),className:"flex-1 w-full min-w-0 border border-(--elm-border,var(--color-gray-200)) rounded-elm-chip px-1.5 py-0.5 text-xs outline-none focus:border-primary-400"})]}),u.jsxs("label",{className:"flex items-center gap-2 text-xs text-(--elm-text-muted,var(--color-gray-500))",children:["Lng:",u.jsx("input",{type:"text",value:E.lng,onChange:d=>h(I=>({...I,lng:d.target.value})),className:"flex-1 w-full min-w-0 border border-(--elm-border,var(--color-gray-200)) rounded-elm-chip px-1.5 py-0.5 text-xs outline-none focus:border-primary-400"})]})]}),u.jsxs("div",{className:"flex items-center justify-end gap-1 mt-1",children:[u.jsx("button",{onClick:()=>v(!1),className:"px-2 py-1 text-xs text-(--elm-text-muted,var(--color-gray-500)) hover:bg-(--elm-surface-hover,var(--color-gray-100)) rounded-elm-chip transition-colors",children:"Cancel"}),u.jsxs("button",{onClick:F,className:"px-2 py-1 text-xs text-white bg-primary-500 hover:bg-primary-600 rounded-elm-chip transition-colors font-medium flex items-center gap-1",children:[u.jsx(xt.Check,{size:12,weight:"bold"})," Save"]})]})]})})}),B&&u.jsx(_.Marker,{ref:d=>{j.current=d},position:X(B),icon:at(!0,!1),opacity:.5,interactive:!1})]})},(t,e)=>t.feature===e.feature&&t.selected===e.selected&&t.isMultiSelected===e.isMultiSelected&&t.multiDragDelta===e.multiDragDelta&&t.multiDuplicateDrag===e.multiDuplicateDrag&&t.readonly===e.readonly&&t.interaction===e.interaction),gr=a.memo(function({feature:e,selected:n,isMultiSelected:o,multiDragDelta:r,multiDuplicateDrag:l,onVertexEdit:s,readonly:c,interaction:i,onContextMenu:g}){const{dataStore:m,uiStore:M}=p.useGeoStore(),f=p.useDataStore(O=>O.toggleSelection),y=a.useContext(ct)[500],C=e.geometry.coordinates,L=a.useRef(null),b=a.useRef(null),[v,S]=a.useState(!1),E=ft(c),h=et(e),x=jt(n||o,()=>[L.current],{after:()=>{L.current&&E.retarget(Mt(L.current))}}),{effectiveDelta:j,display:Y,ghost:R,dragged:B,handleMouseDown:D}=ln(e,"Polygon",C,n,o,r,l,c,i,(O,z)=>{var k;return(k=(z?b:L).current)==null?void 0:k.setLatLngs(O.map(G=>G.map(X)))}),H=a.useMemo(()=>Y.map(O=>O.map(X)),[Y]);return u.jsxs(u.Fragment,{children:[u.jsx(_.Polygon,{ref:O=>{L.current=O},positions:H,renderer:x,pathOptions:o||n||j?it(h,!0,{color:o||n?y:ge.DEFAULT_FEATURE_COLOR,fillColor:o||n?y:ge.DEFAULT_FEATURE_COLOR,weight:n?3:2,opacity:v?1:.9,fillOpacity:n?.25:v?.28:.15,className:j?"cursor-grabbing":""}):st(rn,h,v?sn:null),eventHandlers:{mouseover:O=>{E.enter(Mt(O.target),O.originalEvent),lt(O.target,e,M,O.latlng,O.originalEvent),M.getState().vertexEditActive||S(!0)},mouseout:O=>{E.leave(),qe(O.target),S(!1)},click:O=>{M.getState().editingMode==="none"&&(O.originalEvent.stopPropagation(),i.shouldHandleFeatureClick(B.current)&&(O.originalEvent.shiftKey&&!c?f(e.id):(i.markFeatureClick(),m.getState().selectFeature(e.id))))},dblclick:O=>{M.getState().editingMode==="none"&&(O.originalEvent.stopPropagation(),c||s())},contextmenu:ut(e,c,g),mousedown:D}}),R&&u.jsx(_.Polygon,{ref:O=>{b.current=O},positions:R.map(O=>O.map(X)),pathOptions:{...tr,color:y,fillColor:y}})]})},(t,e)=>t.feature===e.feature&&t.selected===e.selected&&t.isMultiSelected===e.isMultiSelected&&t.multiDragDelta===e.multiDragDelta&&t.multiDuplicateDrag===e.multiDuplicateDrag&&t.readonly===e.readonly&&t.interaction===e.interaction),fr={items:[],pos:0,bounds:null};function Hn(t,e){if(!e)return t;const n=(e.e-e.w)/4,o=(e.n-e.s)/4,r=e.w+n,l=e.e-n,s=e.s+o,c=e.n-o,i=[],g=[];for(const m of t){const[M,f,y,C]=ge.getFeatureBBox(m);(y>=r&&M<=l&&C>=s&&f<=c?i:g).push(m)}return i.concat(g)}function pr(t,e,n,o){let r=t.length;if(e.pos<e.items.length&&t.length>n){const c=new Set;for(let i=e.pos;i<e.items.length;i++)c.add(e.items[i].id);r=0;for(const i of t)c.has(i.id)||r++}r>n&&(n=0);const l=t.length>n?Hn(t,o):t,s=Math.min(n,l.length);return{now:l.slice(0,s),queue:{items:l,pos:s,bounds:o}}}function mr(t,e,n,o){let{items:r,pos:l}=t;n!==t.bounds&&l<r.length&&(r=Hn(r.slice(l),n),l=0);const s=[];for(;l<r.length&&s.length<e;){const c=r[l++];o(c.id)||s.push(c)}return{chunk:s,queue:{items:r,pos:l,bounds:n}}}const hr=8,vn=50,yr=1e3,xn=a.memo(function({items:e}){return u.jsx(u.Fragment,{children:e})});function vr({tick:t,onEffect:e}){return a.useEffect(e,[t]),null}function xr(t,e,n,o,r){const l=a.useRef(new Map),s=a.useRef({inputs:[],elements:[],groups:new Map,queue:fr}),c=a.useRef(0),[i,g]=a.useState(0),m=a.useRef({msPerFeature:.16,chunk:vn,renderMs:0,effectStart:0}),M=[t,...r],f=a.useMemo(()=>{const C=s.current,L=l.current,b=c.current,v=m.current.chunk;if(C.inputs.length===M.length&&C.inputs.every((O,z)=>O===M[z])){const{chunk:O,queue:z}=mr(C.queue,v,n,V=>L.has(V)),k=performance.now(),G=[],F=new Map;o(O,()=>!0,!0).forEach((V,ee)=>{V&&(G.push(V),F.set(O[ee].id,b))});let{elements:d,groups:I}=C;return G.length&&(I=new Map(I).set(b,G),d=[...d,u.jsx(xn,{items:G},b)]),{elements:d,groups:I,queue:z,added:F,mountedIds:null,n:G.length,start:k}}const S=[...t].reverse(),E=O=>!L.has(O.id)&&!e(O),{now:h,queue:x}=pr(S.filter(E),C.queue,v,n),j=new Set(h.map(O=>O.id)),Y=o(S,O=>!E(O)||j.has(O.id),!1),R=new Map,B=new Map;Y.forEach((O,z)=>{if(!O)return;const k=S[z].id,G=L.get(k)??b;R.set(k,G);const F=B.get(G);F?F.push(O):B.set(G,[O])});const D=new Map;return{elements:[...B].map(([O,z])=>{const k=C.groups.get(O),G=k&&k.length===z.length&&k.every((F,d)=>F===z[d])?k:z;return D.set(O,G),u.jsx(xn,{items:G},O)}),groups:D,queue:x,added:null,mountedIds:R,n:0,start:0}},[...M,i]);a.useLayoutEffect(()=>{m.current.renderMs=performance.now()-f.start},[f]);const y=a.useCallback(()=>{m.current.effectStart=performance.now()},[]);return a.useEffect(()=>{if(f.mountedIds)l.current=f.mountedIds;else for(const[b,v]of f.added)l.current.set(b,v);s.current={inputs:M,elements:f.elements,groups:f.groups,queue:f.queue},f.groups.has(c.current)&&c.current++;const C=m.current;if(f.n>=20){const b=C.renderMs+performance.now()-C.effectStart;C.msPerFeature=C.msPerFeature*.5+b/f.n*.5,C.chunk=Math.round(Math.min(yr,Math.max(vn,hr/C.msPerFeature)))}if(f.queue.pos>=f.queue.items.length)return;const L=setTimeout(()=>g(b=>b+1));return()=>clearTimeout(L)},[f]),u.jsxs(u.Fragment,{children:[u.jsx(vr,{tick:f,onEffect:y}),f.elements]})}const Sr=a.memo(function({culledFeatures:e,multiSelectedSet:n,transformDragging:o,selectedFeatureId:r,editingMode:l,geometryPreview:s,bufferCreateNew:c,multiDragDelta:i,multiDuplicateDrag:g,readonly:m,interaction:M,openFeatureCtxMenu:f,vertexEditId:y,viewBounds:C,onVertexEdit:L}){const b=a.useRef({shared:[],byId:new Map});return xr(e,v=>n.has(v.id)||v.id===y,C,(v,S,E)=>{const h=b.current,x=[g,m,M,f];x.some((R,B)=>R!==h.shared[B])&&(h.byId=new Map),h.shared=x;const j=E?h.byId:new Map,Y=v.map(R=>{if(!S(R))return null;const B=n.has(R.id);if(o&&(B||R.id===r)||(l==="simplify-shape"||l==="smooth-shape"||l==="buffer-shape"&&!c)&&s!==null&&R.id===r&&T.canProcessShape(R.geometry.type))return null;const D=B?i:null,H=R.id===r,O=h.byId.get(R.id);if(O&&O.f===R&&O.sel===H&&O.multi===B&&O.delta===D)return j.set(R.id,O),O.el;const z=R.geometry.type==="Point"?R.properties._isText==="true"?u.jsx(rr,{feature:R,selected:R.id===r,isMultiSelected:B,multiDragDelta:D,multiDuplicateDrag:g,readonly:m,suppressDoubleClickZoomForGesture:M.suppressDoubleClickZoomForGesture},R.id):u.jsx(dr,{feature:R,selected:R.id===r,isMultiSelected:B,multiDragDelta:D,multiDuplicateDrag:g,readonly:m,interaction:M,onContextMenu:f},R.id):R.geometry.type==="MultiPoint"?u.jsx(cr,{feature:R,selected:R.id===r,isMultiSelected:B,multiDragDelta:D,readonly:m,interaction:M,onContextMenu:f},R.id):R.geometry.type==="Polygon"?u.jsx(gr,{feature:R,selected:R.id===r,isMultiSelected:B,multiDragDelta:D,multiDuplicateDrag:g,onVertexEdit:()=>{m||L(R.id)},readonly:m,interaction:M,onContextMenu:f},R.id):R.geometry.type==="MultiPolygon"?u.jsx(ur,{feature:R,selected:R.id===r,isMultiSelected:B,multiDragDelta:D,onVertexEdit:()=>{m||L(R.id)},readonly:m,interaction:M,onContextMenu:f},R.id):R.geometry.type==="MultiLineString"?u.jsx(lr,{feature:R,selected:R.id===r,isMultiSelected:B,multiDragDelta:D,readonly:m,interaction:M,onContextMenu:f},R.id):R.geometry.type==="GeometryCollection"?u.jsx(ir,{feature:R,selected:R.id===r,isMultiSelected:B,multiDragDelta:D,readonly:m,interaction:M,onContextMenu:f},R.id):u.jsx(ar,{feature:R,selected:R.id===r,isMultiSelected:B,multiDragDelta:D,multiDuplicateDrag:g,onVertexEdit:()=>{m||L(R.id)},readonly:m,interaction:M,onContextMenu:f},R.id);return j.set(R.id,{f:R,sel:H,multi:B,delta:D,el:z}),z});return h.byId=j,Y},[n,o,r,l,s,c,i,g,m,M,f,y])});function wr({children:t}){const e=en(),n=p.useElementEditorConfig().featureColor,o=a.useMemo(()=>Qo(e,n),[e,n]);return u.jsx(Qt,{getFeatureStyle:o,children:t})}function Er(){const{dataStore:t}=p.useGeoStore(),e=_.useMap();return a.useEffect(()=>{const n=t.getState().features;if(n.length===0)return;let o=1/0,r=1/0,l=-1/0,s=-1/0;for(const c of n){const[i,g,m,M]=c.bbox||ge.getGeometryBBox(c.geometry);i<o&&(o=i),g<r&&(r=g),m>l&&(l=m),M>s&&(s=M)}if(o!==1/0){const c=T.fitPadding(e.getContainer());e.fitBounds([[r,o],[s,l]],{paddingTopLeft:[c.left,c.top],paddingBottomRight:[c.right,c.bottom],maxZoom:16})}},[]),null}function Bn({renderer:t="canvas"}={}){const{dataStore:e,uiStore:n}=p.useGeoStore(),o=p.useEmit(),r=p.useIsEventForEditor(),l=p.useDataStore(U=>U.features),s=p.useDataStore(U=>U.groups),c=p.useDataStore(U=>U.selectedIds),i=c.length===1?c[0]:null,g=p.useDataStore(U=>U.clearSelection),m=p.useDataStore(U=>U.selectFeature),M=p.useDataStore(U=>U.updateFeature),f=p.useUIStore(U=>U.closeDialog),y=p.useUIStore(U=>U.setVertexEditActive),C=p.useUIStore(U=>U.setTransformActive),L=p.useUIStore(U=>U.transformActive),b=p.useUIStore(U=>U.vertexEditActive),v=p.useUIStore(U=>U.transformDragging),S=p.useUIStore(U=>U.editingMode),E=p.useUIStore(U=>U.geometryPreview),h=p.useUIStore(U=>U.bufferCreateNew),x=p.useUIStore(U=>U.readonly),[j,Y]=a.useState(null);function R(U){Y(U),y(!!U)}const B=a.useRef(!1),D=Fn(!!j||S!=="none");function H(U,re=!1){const me=e.getState().features.find(ie=>ie.id===U);if(!me)return;const le=T.vertexEditNotice(me);le&&o({type:"warning",message:le}),re&&D.suppressDoubleClickZoomForGesture(),D.suppressNextVertexExit(),R(U),z([])}a.useEffect(()=>{qe(null)},[l.length]),a.useEffect(()=>{qe(null)},[S,b]),a.useEffect(()=>{L&&!i&&c.length===0&&C(!1)},[i,c.length,L,C]),a.useEffect(()=>{j&&L&&C(!1)},[j,L,C]),a.useEffect(()=>{if(!L)return;const U=i?e.getState().features.find(re=>re.id===i):null;(U==null?void 0:U._drawType)==="route"&&!B.current&&(o({type:"warning",message:"Transforming may break road alignment."}),B.current=!0)},[L,i,e,o]);const[O,z]=a.useState([]),[k,G]=a.useState(null),[F,d]=a.useState(!1),I=_.useMap(),V=p.useAccentPalette(I.getContainer()),ee=Jo(I,t),q=Lt.useContextMenu(),ce=q.open,ne=a.useCallback(U=>{const{feature:re,x:me,y:le,requestPreciseCoords:ie}=U,he=e.getState().selectedIds;he.length>=2&&he.includes(re.id)||e.getState().selectFeature(re.id),ce(me,le,{feature:re,requestPreciseCoords:ie})},[e,ce]),de=a.useCallback((U,re)=>{G(null),D.markDragEnd();const me=new Map(e.getState().features.map(ie=>[ie.id,ie])),le=e.getState().selectedIds.flatMap(ie=>{const he=me.get(ie);return he?[{id:ie,geometry:T.offsetGeometry(he.geometry,U,!1)}]:[]});re?e.getState().duplicateFeaturesAtPosition(le.map(({id:ie,geometry:he})=>({sourceId:ie,geometry:he}))):(e.getState().takeSnapshot(),e.getState().updateFeatures(le.map(({id:ie,geometry:he})=>({id:ie,patch:{geometry:he}}))))},[e,D]),[$,w]=a.useState(null);function W(){const U=I.getBounds().pad(.5);w({w:U.getWest(),s:U.getSouth(),e:U.getEast(),n:U.getNorth()})}a.useEffect(()=>{W()},[]),_.useMapEvents({moveend:W,zoomend:W,contextmenu:U=>{U.originalEvent.preventDefault()},mousemove:U=>so(I,U.containerPoint)});const te=a.useRef(l);a.useEffect(()=>{const U=te.current;if(te.current=l,l.length<=U.length)return;const{x:re,y:me}=Rt(),le=I.getContainer().getBoundingClientRect();if(re<le.left||re>le.right||me<le.top||me>le.bottom)return;const ie=new Set(U.map(he=>he.id));ro(I,l.filter(he=>!ie.has(he.id)),{x:re-le.left,y:me-le.top})},[l,I]);const Q=a.useMemo(()=>{const U=new Set(s.filter(re=>re.hidden).map(re=>re.id));return l.filter(re=>!re.hidden&&(!re.groupId||!U.has(re.groupId)))},[l,s]),fe=a.useMemo(()=>new Set(c),[c]),oe=a.useRef([]),pe=a.useMemo(()=>{let U=Q;if($){const me=new Set(c);i&&me.add(i),j&&me.add(j),U=Q.filter(le=>{if(me.has(le.id))return!0;const[ie,he,Le,we]=ge.getFeatureBBox(le);return Le>=$.w&&ie<=$.e&&we>=$.s&&he<=$.n})}const re=oe.current;return re.length===U.length&&U.every((me,le)=>me===re[le])?re:(oe.current=U,U)},[Q,$,c,i,j]),Z=j?Q.find(U=>U.id===j&&(U.geometry.type==="LineString"||U.geometry.type==="Polygon"))??null:null,xe=a.useCallback((U,re)=>{if(ye.current===U){z(me=>{const le=new Set(me);for(const ie of re)le.add(ie);return Array.from(le).sort((ie,he)=>ie-he)});return}H(U),z(re)},[D]);a.useEffect(()=>{j&&i!==j&&(R(null),z([]))},[i,j]),a.useEffect(()=>{!b&&j&&(Y(null),z([]))},[b,j]),a.useEffect(()=>{var me,le;if(x)return;function U(ie){if(ie.key!=="n"&&ie.key!=="N"||ie.metaKey||ie.ctrlKey||ie.altKey||!r(ie))return;const he=ie.target;if(he.tagName==="INPUT"||he.tagName==="TEXTAREA"||he.tagName==="SELECT"||n.getState().dialogState.type!=="closed")return;const Le=e.getState().selectedIds.length===1?e.getState().selectedIds[0]:null;if(Le)if(ie.preventDefault(),j===Le)R(null),z([]);else{const we=e.getState().features.find(Te=>Te.id===Le);if(!we||we.geometry.type!=="LineString"&&we.geometry.type!=="Polygon")return;H(Le)}}const re=((le=(me=document.querySelector(".leaflet-container"))==null?void 0:me.ownerDocument)==null?void 0:le.defaultView)||window;return re.addEventListener("keydown",U),()=>re.removeEventListener("keydown",U)},[j,n,e,x,D,r]);const ye=a.useRef(j);a.useEffect(()=>{ye.current=j},[j]);const Pe=a.useRef(O);a.useEffect(()=>{Pe.current=O},[O]),a.useEffect(()=>{var me,le;if(x)return;function U(ie){if(ie.key!=="Enter"||ie.metaKey||ie.ctrlKey||ie.altKey||!r(ie))return;const he=ie.target;if(he&&(he.tagName==="INPUT"||he.tagName==="TEXTAREA"||he.isContentEditable))return;const Le=n.getState(),we=Le.editingMode;if(!(we==="none"||we==="draw-rect"||we==="draw-circle"||we==="place-point"||we==="draw-freehand"||we==="pick-shape"||we==="draw-line"&&Le.lineInProgress.length<2||we==="draw-polygon"&&Le.polygonInProgress.length<3||we==="draw-route"&&Le.routeWaypoints.length<2)||n.getState().dialogState.type!=="closed")return;const _e=e.getState().selectedIds.length===1?e.getState().selectedIds[0]:null;if(_e)if(ie.preventDefault(),ie.stopPropagation(),we!=="none"&&n.getState().setEditingMode("none"),ye.current===_e)R(null),z([]);else{const Ue=e.getState().features.find(Xe=>Xe.id===_e);if(!Ue||Ue.geometry.type!=="LineString"&&Ue.geometry.type!=="Polygon")return;H(_e)}}const re=((le=(me=document.querySelector(".leaflet-container"))==null?void 0:me.ownerDocument)==null?void 0:le.defaultView)||window;return re.addEventListener("keydown",U,{capture:!0}),()=>re.removeEventListener("keydown",U,{capture:!0})},[n,e,x,D,r]);function ke(){if(!D.shouldHandleVertexExit())return;R(null),z([]);const U=n.getState().dialogState;(U.type!=="edit"||U.featureId===j)&&f()}const je=a.useCallback(()=>{if(!Z||O.length===0||x)return;e.getState().takeSnapshot();const U=Z.geometry.type==="Polygon",re=new Set(O);if(U){const le=Z.geometry.coordinates[0].slice(0,-1).filter((ie,he)=>!re.has(he));if(le.length<3){o({type:"warning",message:"Cannot delete: an area needs at least 3 points"});return}le.push(le[0]),M(Z.id,T.vertexEditPatch(Z,{type:"Polygon",coordinates:[le]}))}else{const le=Z.geometry.coordinates.filter((ie,he)=>!re.has(he));if(le.length<2){o({type:"warning",message:"Cannot delete: a line needs at least 2 points"});return}M(Z.id,T.vertexEditPatch(Z,{type:"LineString",coordinates:le}))}if(U&&n.getState().topoEditEnabled){const me=Z.geometry.coordinates[0],le=O.map(ie=>me[ie]);e.getState().updateFeatures(T.commitTopoDelete(e.getState().features,Z.id,le))}z([])},[Z,O,M,x,n,e,o]),se=a.useCallback(()=>{if(!Z||O.length<3||x){x||o({type:"warning",message:"Select at least 3 points to simplify"});return}const U=Z.geometry.type==="Polygon",re=U?Z.geometry.coordinates[0].slice(0,-1):Z.geometry.coordinates,me=[...O].sort((Ue,Xe)=>Ue-Xe),le=me[0],ie=me[me.length-1],he=re.slice(le,ie+1),Le=T.rdp(he,1e-5),we=he.length-Le.length;if(we===0){o({type:"warning",message:"Nothing to remove: no selected point sits on a straight line"});return}const Te=[...re.slice(0,le),...Le,...re.slice(ie+1)],_e=U?3:2;if(Te.length<_e){o({type:"warning",message:`Cannot simplify: ${U?"an area needs at least 3":"a line needs at least 2"} points`});return}if(e.getState().takeSnapshot(),U){const Ue=[...Te,Te[0]];if(M(Z.id,T.vertexEditPatch(Z,{type:"Polygon",coordinates:[Ue]})),n.getState().topoEditEnabled){const Xe=new Set(Le.map(Ze=>`${Ze[0]},${Ze[1]}`)),We=he.filter(Ze=>!Xe.has(`${Ze[0]},${Ze[1]}`));We.length>0&&e.getState().updateFeatures(T.commitTopoDelete(e.getState().features,Z.id,We))}}else M(Z.id,T.vertexEditPatch(Z,{type:"LineString",coordinates:Te}));z([]),o({type:"success",message:`Removed ${we} extra point${we!==1?"s":""}`})},[Z,O,M,x,n,e,o]),Ee=a.useRef(H);Ee.current=H;const Re=a.useCallback(U=>Ee.current(U,!0),[]),[Ge,$e]=a.useState(!1);a.useEffect(()=>$e(!0),[]);const tt=Ge&&!!Z&&O.length>0&&!x;return u.jsxs(ct.Provider,{value:V,children:[u.jsx(Xo,{onMapClick:U=>{n.getState().editingMode==="none"&&(Wo()||n.getState().vertexEditActive||U.originalEvent.shiftKey||D.shouldHandleMapClick()&&(n.getState().transformActive&&n.getState().setTransformActive(!1),c.length>0&&!x&&g(),i&&(m(null),f())))}}),u.jsx(Yo,{onDragDelta:G,onDragEnd:(U,re)=>{d(!1),de(U,re)},onDuplicateDragChange:d,readonly:x}),u.jsx(Un.Provider,{value:ee,children:u.jsx(wr,{children:u.jsx(Sr,{culledFeatures:pe,multiSelectedSet:fe,transformDragging:v,selectedFeatureId:i,editingMode:S,geometryPreview:E,bufferCreateNew:h,multiDragDelta:k,multiDuplicateDrag:F,readonly:x,interaction:D,openFeatureCtxMenu:ne,vertexEditId:j,viewBounds:$,onVertexEdit:Re})})},t),Z&&u.jsx(To,{feature:(S==="simplify-shape"||S==="smooth-shape")&&E?{...Z,geometry:E}:Z,selectedIndices:O,onExit:ke,onDeleteSelected:je,onSelectIndices:z,onFeatureClick:()=>{D.markFeatureClick()},readonly:x}),u.jsx(Io,{onSelect:xe,onDragStart:()=>{D.markDragStart(),D.suppressNextVertexExit()},readonly:x,getInitialVertexIndices:()=>Pe.current,onVertexBoxPreview:(U,re)=>{ye.current===U&&z(re)}}),u.jsx($o,{}),u.jsx(Ho,{}),u.jsx(Uo,{}),u.jsx(Vo,{}),u.jsx(Tn,{}),u.jsx(qo,{}),tt&&u.jsx(p.VertexSelectionBar,{mapContainer:I.getContainer(),count:O.length,onSimplify:se,onDelete:je}),q.state&&u.jsx(p.FeatureMapContextMenu,{x:q.state.x,y:q.state.y,data:q.state.data,onClose:q.close})]})}let Yt=!1;function br(){Yt=!0,Promise.resolve().then(()=>{Yt=!1})}function Pr(){return Yt}let Vn=0;function Sn(){Vn=Date.now()}function Mr(){return Date.now()-Vn<200}const Cr=3,wn=5;function Gn({routingApiKey:t}={}){const{uiStore:e,dataStore:n}=p.useGeoStore(),o=Lt.useRouting(t),r=p.useElementEditorConfig().network.fetch,l=a.useRef(null);l.current=o===!1?null:{...o,fetch:r};const s=p.useEmit(),c=p.useIsEventForEditor(),i=_.useMap(),g=p.useUIStore(w=>w.editingMode),m=p.useUIStore(w=>w.commitPoint),M=p.useUIStore(w=>w.addLineVertex),f=p.useUIStore(w=>w.addPolygonVertex),y=p.useUIStore(w=>w.setCircleCenter),C=p.useUIStore(w=>w.commitCircle),L=p.useUIStore(w=>w.setRectCorner),b=p.useUIStore(w=>w.commitRect),v=p.useUIStore(w=>w.cancelDrawing),S=p.useUIStore(w=>w.addRouteWaypoint),E=p.useUIStore(w=>w.setRoutePreview),h=p.useUIStore(w=>w.setRouteCursorPos),x=p.useUIStore(w=>w.setRouteCursorPreview),j=p.useUIStore(w=>w.routeWaypoints),Y=p.useUIStore(w=>w.removeLastLineVertex),R=p.useUIStore(w=>w.removeLastPolygonVertex),B=p.useUIStore(w=>w.removeLastRouteWaypoint),D=p.useUIStore(w=>w.removeLastMeasurePoint),H=p.useUIStore(w=>w.addFreehandPoint),O=p.useUIStore(w=>w.clearFreehandPoints),z=p.useUIStore(w=>w.commitFreehand),k=a.useRef(null),G=a.useRef(null),F=a.useRef(!1),d=a.useRef(!1),I=a.useRef(!1),V=a.useRef(!1),ee=a.useRef(!1),q=a.useRef(null),ce=a.useRef(T.createClickRepeatGuard()).current;a.useEffect(()=>{if(!T.CLICK_TOOL_MODES.includes(g))return;const w=i.dragging._draggable;if(!w)return;const W=w.options.clickTolerance;return w.options.clickTolerance=T.CLICK_SLOP_PX,()=>{w.options.clickTolerance=W}},[g,i]),a.useEffect(()=>{var ke,je;const w=i.getContainer();function W(){I.current||(I.current=!0,i.dragging.enable(),w.style.setProperty("cursor","grab","important"))}function te(){if(!I.current)return;I.current=!1,w.style.removeProperty("cursor");const se=e.getState().editingMode;se!=="none"&&!V.current&&(w.style.cursor=se==="pick-shape"?"pointer":"crosshair"),["draw-freehand","draw-rect","draw-circle"].includes(se)&&i.dragging.disable()}function Q(){V.current||I.current||(V.current=!0,w.style.removeProperty("cursor"))}function fe(){if(!V.current)return;V.current=!1,Sn();const se=e.getState().editingMode;se!=="none"&&!I.current&&(w.style.cursor=se==="pick-shape"?"pointer":"crosshair")}const oe=()=>{I.current&&w.style.setProperty("cursor","grabbing","important")},pe=()=>{I.current&&w.style.setProperty("cursor","grab","important")};w.addEventListener("mousedown",oe),w.addEventListener("mouseup",pe);const Z=se=>{if(se.key==="Meta"||se.key==="Control"||se.key==="Alt"){Q();return}if(se.key==="Shift"&&(d.current=!0),!!c(se)){if(se.code==="Space"){const Ee=se.target;if(Ee.tagName==="INPUT"||Ee.tagName==="TEXTAREA"||Ee.isContentEditable)return;se.preventDefault(),W();return}if(se.key==="Escape"){const{selectedMeasurementId:Ee,setSelectedMeasurementId:Re}=e.getState();if(Ee){Re(null);return}v()}if(se.key==="Enter"&&e.getState().editingMode==="measure"){e.getState().completeMeasure();return}if(se.key==="Backspace"||se.key==="Delete"){const Ee=e.getState();if(Ee.selectedMeasurementId){Ee.removeMeasurement(Ee.selectedMeasurementId);return}const Re=Ee.editingMode;if(Re==="measure"){D();return}if(Re==="draw-line"||Re==="slice-shape"){Y();return}if(Re==="draw-polygon"||Re==="cut-hole"){R();return}if(Re==="draw-route"){B();return}}}},xe=se=>{if(se.code==="Space"){te();return}se.key==="Shift"&&(d.current=!1),(se.key==="Meta"||se.key==="Control"||se.key==="Alt")&&!se.metaKey&&!se.ctrlKey&&!se.altKey&&fe()},ye=()=>{te(),fe()},Pe=((je=(ke=document.querySelector(".leaflet-container"))==null?void 0:ke.ownerDocument)==null?void 0:je.defaultView)||window;return Pe.addEventListener("keydown",Z),Pe.addEventListener("keyup",xe),Pe.addEventListener("blur",ye),()=>{Pe.removeEventListener("keydown",Z),Pe.removeEventListener("keyup",xe),Pe.removeEventListener("blur",ye),w.removeEventListener("mousedown",oe),w.removeEventListener("mouseup",pe),te()}},[v,Y,R,B,D,e,i,c]);const ne=a.useRef(j);a.useEffect(()=>{ne.current=j},[j]);const de=a.useRef(null),$=a.useCallback(async w=>{if(!(w.length<2)){E(null,!0);try{if(!l.current)throw new Error("routing is off");const W=await ge.fetchRoute(w,l.current);ne.current.length>=2&&E(W,!1)}catch(W){const te=T.routingError(W);s({type:"error",code:te.code,source:"routing",message:te.message,error:te}),E(w,!1)}}},[E,s,e]);return _.useMapEvents({mousedown(w){if(g==="draw-freehand"){F.current=!0,O(),H([w.latlng.lng,w.latlng.lat]);return}if(!(I.current||V.current)){if(g==="draw-rect"){i.dragging.disable(),n.getState().selectedIds.length>0&&n.setState({selectedIds:[]});const W=e.getState().snappedCoord??[w.latlng.lng,w.latlng.lat];L(W),ee.current=!0,q.current={x:w.containerPoint.x,y:w.containerPoint.y};return}if(g==="draw-circle"){i.dragging.disable(),n.getState().selectedIds.length>0&&n.setState({selectedIds:[]});const W=e.getState().snappedCoord??[w.latlng.lng,w.latlng.lat];y(W),ee.current=!0,q.current={x:w.containerPoint.x,y:w.containerPoint.y};return}}},mouseup(w){if(g==="draw-freehand"&&F.current){F.current=!1;const Q=i.getZoom(),fe=156543.03392*Math.cos(w.latlng.lat*Math.PI/180)/Math.pow(2,Q),oe=Cr*fe/111320;z(oe),Kt();return}if(!ee.current){(V.current||w.originalEvent.metaKey||w.originalEvent.ctrlKey||w.originalEvent.altKey)&&Sn();return}ee.current=!1;const W=q.current,te=W?Math.hypot(w.containerPoint.x-W.x,w.containerPoint.y-W.y):0;if(q.current=null,g==="draw-rect"){const Q=e.getState().rectCorner;if(!Q)return;if(te<wn){e.setState({rectCorner:null});return}const fe=e.getState().snappedCoord??[w.latlng.lng,w.latlng.lat],oe=d.current||w.originalEvent.shiftKey;b(Q,fe,{},oe),Kt();return}if(g==="draw-circle"){const Q=e.getState().circleCenter;if(!Q)return;let fe;if(te<wn){const Z=w.containerPoint,xe=i.containerPointToLatLng([Z.x+25,Z.y]);fe=[xe.lng,xe.lat]}else fe=e.getState().snappedCoord??[w.latlng.lng,w.latlng.lat];const oe=fe[0]-Q[0],pe=fe[1]-Q[1];Math.hypot(oe,pe)>=1e-6&&(C(Q,fe,{}),Kt());return}},mousemove(w){if(g==="draw-freehand"&&F.current){H([w.latlng.lng,w.latlng.lat]);return}if((g==="draw-polygon"||g==="cut-hole")&&e.getState().polygonInProgress.length>=3){const Q=e.getState().polygonInProgress[0],fe=i.latLngToLayerPoint([Q[1],Q[0]]),oe=Math.hypot(w.layerPoint.x-fe.x,w.layerPoint.y-fe.y);i.getContainer().style.cursor=oe<=48?"pointer":"crosshair";return}if(g!=="draw-route"||ne.current.length===0)return;const W=[w.latlng.lng,w.latlng.lat];h(W),x(null),k.current&&clearTimeout(k.current),G.current&&G.current.abort();const te=ne.current[ne.current.length-1];k.current=setTimeout(async()=>{const Q=new AbortController;G.current=Q;try{if(!l.current)return;const fe=await ge.fetchRoute([te,W],{...l.current,signal:Q.signal});Q.signal.aborted||x(fe)}catch{}},400)},click(w){var te,Q,fe;const W=ce.click(w.originalEvent);if(!((te=w.originalEvent.target)!=null&&te.closest(".leaflet-tooltip"))){if(g==="measure"){if(W||Pr())return;const oe=w.originalEvent.target;if((Q=oe==null?void 0:oe.closest)!=null&&Q.call(oe,"path")||(fe=oe==null?void 0:oe.closest)!=null&&fe.call(oe,".elm-measure-label"))return;const pe=e.getState();pe.selectedMeasurementId&&pe.setSelectedMeasurementId(null);const Z=pe.snappedCoord??[w.latlng.lng,w.latlng.lat];pe.addMeasurePoint(Z);return}if(!(w.originalEvent.metaKey||w.originalEvent.ctrlKey||w.originalEvent.altKey)&&!Mr()){if(["place-point","draw-line","draw-polygon","draw-route"].includes(g)&&n.getState().selectedIds.length>0&&n.setState({selectedIds:[]}),g==="place-point"){if(W)return;const oe=e.getState().snappedCoord??[w.latlng.lng,w.latlng.lat];m(oe);return}if(g==="draw-line"||g==="draw-polygon"||g==="draw-route"||g==="cut-hole"||g==="slice-shape"){let oe=e.getState().snappedCoord??[w.latlng.lng,w.latlng.lat];if(d.current||w.originalEvent.shiftKey){const pe=e.getState();let Z=null;(g==="draw-line"||g==="slice-shape")&&pe.lineInProgress.length>=1?Z=pe.lineInProgress[pe.lineInProgress.length-1]:(g==="draw-polygon"||g==="cut-hole")&&pe.polygonInProgress.length>=1&&(Z=pe.polygonInProgress[pe.polygonInProgress.length-1]),Z&&(oe=tn(i,Z,oe,15))}if((g==="draw-polygon"||g==="cut-hole")&&e.getState().polygonInProgress.length>=2){const pe=e.getState(),Z=pe.polygonInProgress[0],xe=i.latLngToLayerPoint([Z[1],Z[0]]);if(Math.hypot(w.layerPoint.x-xe.x,w.layerPoint.y-xe.y)<=48){g==="draw-polygon"?pe.commitPolygon({}):g==="cut-hole"&&pe.commitCutHole();return}}if(W)return;if(g==="draw-line"||g==="slice-shape")M(oe);else if(g==="draw-polygon"||g==="cut-hole")f(oe);else if(g==="draw-route"){de.current={waypoints:[...ne.current],preview:e.getState().routePreview},k.current&&(clearTimeout(k.current),k.current=null),G.current&&(G.current.abort(),G.current=null),h(null),x(null),S(oe);const pe=[...ne.current,oe];$(pe)}}}}},dblclick(){if(!ce.isDouble())return;const w=e.getState();if(g==="measure"){w.completeMeasure();return}g==="draw-line"?w.commitLine({}):g==="draw-polygon"?w.commitPolygon({}):g==="cut-hole"?w.commitCutHole():g==="slice-shape"?w.commitSliceShape():g==="draw-route"&&(de.current&&(e.setState({routeWaypoints:de.current.waypoints,routePreview:de.current.preview,routeLoading:!1}),de.current=null),w.commitRoute())}}),a.useEffect(()=>{const w=i.getContainer();g!=="none"?(w.style.cursor=g==="pick-shape"?"pointer":"crosshair",w.classList.add("drawing-mode")):(w.style.cursor="",w.classList.remove("drawing-mode"))},[g,i]),a.useEffect(()=>()=>{k.current&&clearTimeout(k.current),G.current&&G.current.abort()},[]),a.useEffect(()=>{["draw-freehand","draw-rect","draw-circle"].includes(g)?I.current||i.dragging.disable():(i.dragging.enable(),F.current=!1)},[g,i]),null}function $n(){const t=_.useMap(),e=p.useAccentPalette(t.getContainer())[500],n=p.useUIStore(v=>v.editingMode),o=p.useUIStore(v=>v.lineInProgress),r=p.useUIStore(v=>v.polygonInProgress),l=p.useUIStore(v=>v.freehandPoints),s=p.useUIStore(v=>v.freehandClosed),c=p.useUIStore(v=>v.snappedCoord),[i,g]=a.useState(null),[m,M]=a.useState(!1);a.useEffect(()=>{const v=E=>{E.key==="Shift"&&M(!0)},S=E=>{E.key==="Shift"&&M(!1)};return window.addEventListener("keydown",v),window.addEventListener("keyup",S),()=>{window.removeEventListener("keydown",v),window.removeEventListener("keyup",S)}},[]),_.useMapEvents({mousemove(v){n==="draw-line"||n==="draw-polygon"||n==="slice-shape"||n==="cut-hole"?(g([v.latlng.lng,v.latlng.lat]),M(v.originalEvent.shiftKey)):i&&g(null)},mouseout(){g(null)}});let f=c??i,y=null;(n==="draw-line"||n==="slice-shape")&&o.length>=1?y=o[o.length-1]:(n==="draw-polygon"||n==="cut-hole")&&r.length>=1&&(y=r[r.length-1]);const C=m&&y!==null&&f!==null;if(C&&y&&f&&(f=tn(t,y,f,15)),n==="draw-freehand"&&l.length>=2){const v=l[0],S=l[l.length-1];return u.jsxs(u.Fragment,{children:[u.jsx(_.Polyline,{positions:l.map(X),pathOptions:{color:e,weight:2,opacity:.8},interactive:!1}),s&&u.jsx(_.Polyline,{positions:[X(S),X(v)],pathOptions:{color:e,weight:2,opacity:.4,dashArray:"6 5"},interactive:!1})]})}if(!f)return null;const L=C?"#db2777":e,b=C?"#db2777":e;if((n==="draw-line"||n==="slice-shape")&&y)return u.jsx(_.Polyline,{positions:[X(y),X(f)],pathOptions:{color:L,weight:2,opacity:.4,dashArray:"6 5"},interactive:!1});if((n==="draw-polygon"||n==="cut-hole")&&y){const v=r[0];return u.jsxs(u.Fragment,{children:[u.jsx(_.Polyline,{positions:[X(y),X(f)],pathOptions:{color:b,weight:2,opacity:.4,dashArray:"6 5"},interactive:!1}),r.length>=2&&u.jsx(_.Polyline,{positions:[X(f),X(v)],pathOptions:{color:b,weight:2,opacity:.25,dashArray:"4 6"},interactive:!1})]})}return null}function Lr(t){return ue.divIcon({className:"",html:`<div class="w-3 h-3 ${t?"bg-primary-500 rounded-full":"bg-primary-400 rotate-45 rounded-sm"} border-2 border-white shadow-md"></div>`,iconSize:[12,12],iconAnchor:[6,6]})}function Xn(){var f;const{dataStore:t,uiStore:e}=p.useGeoStore(),n=p.useUIStore(y=>y.snapEnabled),o=p.useUIStore(y=>y.snappedCoord),r=p.useUIStore(y=>y.editingMode),l=p.useUIStore(y=>y.vertexEditActive),s=n&&(r!=="none"||l),c=a.useRef(null),i=_.useMap();function g(y){var h,x;const C=y.originalEvent.metaKey||y.originalEvent.ctrlKey;if(!s||C){e.getState().snappedCoord&&e.getState().setSnappedCoord(null);return}const L=(h=y.originalEvent)==null?void 0:h.target;if((x=L==null?void 0:L.closest)!=null&&x.call(L,".elm-midpoint-marker")){e.getState().snappedCoord&&e.getState().setSnappedCoord(null);return}const b=t.getState().features,v=oo(),S=new Set(v?[v]:[]),E=bt(y.latlng.lng,y.latlng.lat,i,b,15,S);E?l&&E.isVertex?(c.current=null,e.getState().snappedCoord&&e.getState().setSnappedCoord(null)):(c.current={isVertex:E.isVertex},e.getState().setSnappedCoord(E.latlng)):(c.current=null,e.getState().snappedCoord&&e.getState().setSnappedCoord(null))}const m=a.useRef(g);m.current=g;const[M]=a.useState(()=>Gt(y=>m.current(y)));return a.useEffect(()=>{const y=()=>M.flush();return window.addEventListener("pointerdown",y,!0),window.addEventListener("pointerup",y,!0),()=>{M.cancel(),window.removeEventListener("pointerdown",y,!0),window.removeEventListener("pointerup",y,!0)}},[M]),_.useMapEvents({mousemove(y){M.schedule(y)},mouseout(){M.cancel(),e.getState().snappedCoord&&e.getState().setSnappedCoord(null)}}),!s||!o?null:u.jsx(_.Marker,{position:X(o),icon:Lr(((f=c.current)==null?void 0:f.isVertex)??!0),interactive:!1,zIndexOffset:1e4})}function Ir(t){const e="ABCDEFGHIJKLMNOPQRSTUVWXYZ";return t<26?e[t]:e[Math.floor(t/26)-1]+e[t%26]}function kr(t,e){const n=e?"var(--color-primary-700)":"var(--color-primary-500)";return ue.divIcon({className:"",html:`<div style="
22
+ width:22px;height:22px;border-radius:50%;
23
+ background:${n};border:2px solid white;
24
+ box-shadow:0 1px 4px rgba(0,0,0,0.35);
25
+ display:flex;align-items:center;justify-content:center;
26
+ font-size:10px;font-weight:700;color:white;font-family:monospace;
27
+ line-height:1;
28
+ ">${t}</div>`,iconSize:[22,22],iconAnchor:[11,11]})}function Yn(){const t=p.useAccentPalette(_.useMap().getContainer()),e=p.useUIStore(m=>m.editingMode),n=p.useUIStore(m=>m.routeWaypoints),o=p.useUIStore(m=>m.routePreview),r=p.useUIStore(m=>m.routeLoading),l=p.useUIStore(m=>m.routeCursorPos),s=p.useUIStore(m=>m.routeCursorPreview);if(e!=="draw-route"||n.length===0)return null;const c=o??n,i=n[n.length-1],g=l?s??[i,l]:null;return u.jsxs(u.Fragment,{children:[c.length>=2&&u.jsx(_.Polyline,{positions:c.map(X),pathOptions:{color:t[700],weight:3,opacity:r?.5:.9,dashArray:r?"6 6":void 0}}),g&&g.length>=2&&u.jsx(_.Polyline,{positions:g.map(X),pathOptions:{color:t[700],weight:2,opacity:s?.55:.3,dashArray:"6 5"}}),n.map((m,M)=>u.jsx(_.Marker,{position:X(m),icon:kr(Ir(M),M===n.length-1),interactive:!1},`wp-${m[0].toFixed(8)},${m[1].toFixed(8)}-${M}`))]})}function zn(){const t=_.useMap(),e=p.useUIStore(o=>o.boundaryAutofitBbox),n=p.useUIStore(o=>o.setBoundaryAutofitBbox);return a.useEffect(()=>{if(!e)return;const[o,r,l,s]=e,c=T.fitPadding(t.getContainer());t.fitBounds([[o,l],[r,s]],{paddingTopLeft:[c.left,c.top],paddingBottomRight:[c.right,c.bottom],maxZoom:10,duration:1}),n(null)},[t,e,n]),null}const Rr=ue.divIcon({className:"hidden"});function qn(){const{units:t}=p.useElementEditorConfig(),e={unit:t.length,display:t.display,precision:t.precision},n={unit:t.area,display:t.display,precision:t.precision},o=h=>{const{value:x,unit:j}=ge.formatLength(h*1e3,e);return`${x} ${j}`},r=h=>{const{value:x,unit:j}=ge.formatArea(h,n);return`${x} ${j}`},l=p.useUIStore(h=>h.showMeasurements),s=p.useUIStore(h=>h.editingMode),c=p.useUIStore(h=>h.snappedCoord),i=Dt(s,s!=="none"),g=p.useUIStore(h=>h.lineInProgress),m=p.useUIStore(h=>h.polygonInProgress),M=p.useUIStore(h=>h.circleCenter),f=p.useUIStore(h=>h.rectCorner),y=p.useUIStore(h=>h.freehandPoints),C=p.useUIStore(h=>h.freehandClosed),L=p.useUIStore(h=>h.routeWaypoints),b=_.useMap(),v=a.useRef(null);if(a.useEffect(()=>{var H;const h=(H=v.current)==null?void 0:H.getElement(),x=c??i;if(!h||!x)return;h.style.margin="0";const j=h.getBoundingClientRect(),Y=b.getContainer().getBoundingClientRect(),R=b.latLngToContainerPoint(X(x)),{left:B,top:D}=T.placeBox(Y.left+R.x,Y.top+R.y,j.width,j.height,{x:"after",y:"center",gapX:20,bounds:Y});h.style.marginLeft=`${B-j.left}px`,h.style.marginTop=`${D-j.top}px`}),!l||s==="none")return null;const S=c??i;if(!S)return null;const E=[];try{if(s==="place-point")E.push({label:"",value:`${S[1].toFixed(6)}, ${S[0].toFixed(6)}`});else if(s==="draw-line"||s==="slice-shape"){const h=[...g,S];if(h.length>=2){const x=He.lineString(h);E.push({label:"Length",value:o(Je.length(x))}),E.push({label:"Segment length",value:o(ze.distance(h[h.length-2],h[h.length-1]))})}E.push({label:"",value:`${S[1].toFixed(6)}, ${S[0].toFixed(6)}`})}else if(s==="draw-polygon"||s==="cut-hole"){const h=[...m,S];if(h.length>=3){const x=[...h,h[0]],j=He.polygon([x]);E.push({label:"Area",value:r(wt.area(j))}),E.push({label:"Perimeter",value:o(Je.length(j))});const Y=Ln.bbox(j);E.push({label:"Height",value:o(ze.distance([Y[0],Y[1]],[Y[0],Y[3]]))}),E.push({label:"Width",value:o(ze.distance([Y[0],Y[1]],[Y[2],Y[1]]))})}else h.length===2&&E.push({label:"Segment length",value:o(ze.distance(h[0],h[1]))});E.push({label:"",value:`${S[1].toFixed(6)}, ${S[0].toFixed(6)}`})}else if(s==="draw-circle"){if(M){const h=ze.distance(M,S);E.push({label:"Radius",value:o(h)}),E.push({label:"Area",value:r(Math.PI*(h*1e3)*(h*1e3))})}E.push({label:"",value:`${S[1].toFixed(6)}, ${S[0].toFixed(6)}`})}else if(s==="draw-rect"){if(f){const h=ze.distance([f[0],f[1]],[S[0],f[1]]),x=ze.distance([f[0],f[1]],[f[0],S[1]]),j=h*x*1e6;E.push({label:"Area",value:r(j)}),E.push({label:"Width",value:o(h)}),E.push({label:"Height",value:o(x)})}E.push({label:"",value:`${S[1].toFixed(6)}, ${S[0].toFixed(6)}`})}else if(s==="draw-route"){const h=[...L,S];h.length>=2&&E.push({label:"Straight distance",value:o(ze.distance(h[h.length-2],h[h.length-1]))}),E.push({label:"",value:`${S[1].toFixed(6)}, ${S[0].toFixed(6)}`})}else if(s==="draw-freehand"){if(y.length>=3&&C){const h=[...y,y[0]],x=He.polygon([h]);E.push({label:"Area",value:r(wt.area(x))}),E.push({label:"Perimeter",value:o(Je.length(x))})}else if(y.length>=2){const h=He.lineString(y);E.push({label:"Length",value:o(Je.length(h))})}E.push({label:"",value:`${S[1].toFixed(6)}, ${S[0].toFixed(6)}`})}}catch{}return E.length===0?null:u.jsx(_.Marker,{position:X(S),icon:Rr,interactive:!1,zIndexOffset:99999,children:u.jsx(_.Tooltip,{ref:v,permanent:!0,direction:"right",offset:[20,0],className:"before:!hidden !bg-(--elm-surface,var(--color-white)) !border !border-(--elm-border,var(--color-gray-200)) !shadow-elm-control !rounded-elm-card !p-3 !text-xs !text-(--elm-text-secondary,var(--color-gray-600)) !font-elm pointer-events-none !whitespace-nowrap",children:u.jsx("div",{className:"space-y-1 text-left",children:E.map((h,x)=>u.jsxs("div",{className:"flex gap-2 items-center leading-snug",children:[h.label&&u.jsxs("span",{className:"font-semibold text-(--elm-text,var(--color-gray-900))",children:[h.label,":"]}),u.jsx("span",{children:h.value})]},x))})})})}const Ke="#e74c3c",Dr="#ff2d1a",jr="#c0392b",Wn=ue.divIcon({className:"",html:`<div style="width:10px;height:10px;border-radius:50%;border:2.5px solid ${Ke};background:white;box-shadow:0 1px 4px rgba(0,0,0,0.25)"></div>`,iconSize:[10,10],iconAnchor:[5,5]}),Zn=ue.divIcon({className:"",html:`<div style="width:10px;height:10px;border-radius:50%;background:${Ke};border:2px solid white;box-shadow:0 1px 4px rgba(0,0,0,0.25)"></div>`,iconSize:[10,10],iconAnchor:[5,5]});let Fe=null;function Jn(t){Fe&&(Fe.style.left=t.clientX+"px",Fe.style.top=t.clientY+"px")}function Ar(t,e,n){Fe||(Fe=document.createElement("div"),Fe.className="elm-feature-tooltip",Fe.style.cssText="position:fixed;pointer-events:none;z-index:10000;transform:translate(-50%,-100%);margin-top:-12px",document.body.appendChild(Fe),document.addEventListener("mousemove",Jn,{passive:!0})),Fe.textContent=t,Fe.style.left=e+"px",Fe.style.top=n+"px"}function En(){Fe&&(Fe.remove(),Fe=null,document.removeEventListener("mousemove",Jn))}function Fr(t,e,n,o){try{if(e==="distance"&&t.length>=2)return ge.formatLength(Je.length(He.lineString(t))*1e3,n);if(e==="area"&&t.length>=3)return ge.formatArea(wt.area(He.polygon([[...t,t[0]]])),o)}catch{}return null}const Or=ue.divIcon({className:"elm-measure-label-host",html:"",iconSize:[0,0],iconAnchor:[-12,0]});function Qn({map:t,position:e,parts:n,onRemove:o}){const r=a.useRef(null),[l,s]=a.useState(null);return a.useEffect(()=>{const c=ue.marker([e[1],e[0]],{icon:Or,interactive:!1,keyboard:!1,zIndexOffset:700}).addTo(t);return r.current=c,s(c.getElement()??null),()=>{c.remove(),r.current=null,s(null)}},[t]),a.useEffect(()=>{var c;(c=r.current)==null||c.setLatLng([e[1],e[0]])},[e[0],e[1]]),l?In.createPortal(u.jsxs("div",{className:"elm-measure-label",style:{transform:"translateY(-50%)",display:"inline-flex",alignItems:"center",gap:7,pointerEvents:o?"auto":"none",userSelect:"none",whiteSpace:"nowrap"},children:[u.jsxs("span",{children:[u.jsx("span",{style:{fontWeight:600},children:n.value}),u.jsxs("span",{style:{fontWeight:400,opacity:.85},children:[" ",n.unit]})]}),o&&u.jsx("button",{className:"elm-measure-close",onClick:c=>{c.stopPropagation(),o()},title:"Clear measurement",style:{marginRight:"-5px"},children:u.jsxs("svg",{width:"10",height:"10",viewBox:"0 0 10 10",fill:"none",stroke:"rgba(255,255,255,0.8)",strokeWidth:"1.5",strokeLinecap:"round",children:[u.jsx("line",{x1:"1.5",y1:"1.5",x2:"8.5",y2:"8.5"}),u.jsx("line",{x1:"8.5",y1:"1.5",x2:"1.5",y2:"8.5"})]})})]}),l):null}const Tr=a.memo(function({map:e,m:n}){const o=p.useUIStore(v=>v.removeMeasurement),r=p.useUIStore(v=>v.toggleMeasurementSelection),l=p.useUIStore(v=>v.selectedMeasurementId===n.id),[s,c]=a.useState(!1),{units:i}=p.useElementEditorConfig(),g={unit:i.length,display:i.display,precision:i.precision},m={unit:i.area,display:i.display,precision:i.precision};a.useEffect(()=>()=>En(),[]);const M=a.useMemo(()=>{try{if(n.mode==="distance"&&n.points.length>=2)return ge.formatLength(Je.length(He.lineString(n.points))*1e3,g);if(n.mode==="area"&&n.points.length>=3)return ge.formatArea(wt.area(He.polygon([n.points])),m)}catch{}return null},[n,g.unit,g.display,g.precision,m.unit,m.display,m.precision]),f=n.mode==="area"?n.points[n.points.length-2]:n.points[n.points.length-1],y=n.mode==="area"?n.points.slice(0,-1):n.points,C=l?jr:s?Dr:Ke,L=l||s?1:.9,b=v=>{br(),v.originalEvent.stopPropagation(),r(n.id)};return u.jsxs(u.Fragment,{children:[n.mode==="distance"?n.points.slice(0,-1).map((v,S)=>{const E=n.points[S+1],h=ge.formatLength(Je.length(He.lineString([v,E]))*1e3,g),x=`${h.value} ${h.unit}`;return u.jsx(_.Polyline,{positions:[X(v),X(E)],pathOptions:{color:Ke,weight:16,opacity:0,className:"elm-measure-segment"},interactive:!0,eventHandlers:{mouseover:j=>{c(!0),Ar(x,j.originalEvent.clientX,j.originalEvent.clientY)},mouseout:()=>{c(!1),En()},click:b}},`seg-${S}`)}):u.jsx(_.Polyline,{positions:n.points.map(X),pathOptions:{color:Ke,weight:16,opacity:0},interactive:!0,eventHandlers:{mouseover:()=>c(!0),mouseout:()=>c(!1),click:b}}),u.jsx(_.Polyline,{positions:n.points.map(X),pathOptions:{color:C,weight:3,opacity:L,dashArray:"10 6"},interactive:!1}),n.mode==="area"&&n.points.length>=3&&u.jsx(_.Polygon,{positions:n.points.map(X),pathOptions:{color:C,weight:0,fillColor:C,fillOpacity:l?.15:s?.12:.08},interactive:!0,eventHandlers:{click:b,mouseover:()=>c(!0),mouseout:()=>c(!1)}}),y.map((v,S)=>u.jsx(_.Marker,{position:X(v),icon:S===0?Wn:Zn,interactive:!1,zIndexOffset:1e3+S},S)),M&&f&&u.jsx(Qn,{map:e,position:f,parts:M,onRemove:()=>o(n.id)})]})});function _r(){const t=_.useMap(),e=p.useUIStore(S=>S.editingMode),n=p.useUIStore(S=>S.measurePoints),o=p.useUIStore(S=>S.measureMode),r=p.useUIStore(S=>S.completedMeasurements),l=p.useUIStore(S=>S.snappedCoord),s=p.useUIStore(S=>S.setSelectedMeasurementId),c=Dt(e,e==="measure"),{units:i}=p.useElementEditorConfig(),g={unit:i.length,display:i.display,precision:i.precision},m={unit:i.area,display:i.display,precision:i.precision};_.useMapEvents({click(S){var E,h;(h=(E=S.originalEvent.target)==null?void 0:E.closest)!=null&&h.call(E,"path")||s(null)}});const M=e==="measure";if(!M&&n.length===0&&r.length===0)return null;const f=M?l??c:null,y=n.length>0?n[n.length-1]:null,C=o==="distance"?1:2,L=f&&n.length>=C?[...n,f]:n,b=Fr(L,o,g,m),v=f??y;return u.jsxs(u.Fragment,{children:[r.map(S=>u.jsx(Tr,{map:t,m:S},S.id)),n.length>=2&&u.jsx(_.Polyline,{positions:n.map(X),pathOptions:{color:Ke,weight:3,opacity:.9,dashArray:"10 6"},interactive:!1}),o==="area"&&n.length>=3&&u.jsx(_.Polygon,{positions:n.map(X),pathOptions:{color:Ke,weight:0,fillColor:Ke,fillOpacity:.08},interactive:!1}),f&&y&&u.jsx(_.Polyline,{positions:[X(y),X(f)],pathOptions:{color:Ke,weight:3,opacity:.45,dashArray:"10 6"},interactive:!1}),o==="area"&&f&&n.length>=2&&u.jsx(_.Polyline,{positions:[X(f),X(n[0])],pathOptions:{color:Ke,weight:2,opacity:.25,dashArray:"6 6"},interactive:!1}),n.map((S,E)=>u.jsx(_.Marker,{position:X(S),icon:E===0?Wn:Zn,interactive:!1,zIndexOffset:1e3+E},E)),b&&v&&u.jsx(Qn,{map:t,position:v,parts:b})]})}let bn=!1;function Ur(){if(bn)return;const t=document.createElement("style");t.textContent=`
29
+ @keyframes elm-osm-pulse {
30
+ 0% { transform: scale(0.6); opacity: 0.7; }
31
+ 100% { transform: scale(3); opacity: 0; }
32
+ }
33
+ @keyframes elm-osm-spin {
34
+ to { transform: rotate(360deg); }
35
+ }
36
+ .elm-osm-pulse-ring {
37
+ width: 64px; height: 64px; border-radius: 50%;
38
+ background: color-mix(in srgb, var(--color-primary-500) 20%, transparent);
39
+ animation: elm-osm-pulse 1.4s ease-out infinite;
40
+ pointer-events: none;
41
+ }
42
+ .elm-osm-spinner {
43
+ width: 24px; height: 24px; border-radius: 50%;
44
+ border: 4px solid color-mix(in srgb, var(--color-primary-500) 20%, transparent);
45
+ border-top-color: var(--color-primary-500);
46
+ animation: elm-osm-spin 0.8s linear infinite;
47
+ pointer-events: none;
48
+ }
49
+ `,document.head.appendChild(t),bn=!0}const Nr=()=>(Ur(),ue.divIcon({className:"",html:`<div style="width:64px;height:64px;position:relative;display:flex;align-items:center;justify-content:center">
50
+ <div class="elm-osm-pulse-ring" style="position:absolute"></div>
51
+ <div class="elm-osm-spinner"></div>
52
+ </div>`,iconSize:[64,64],iconAnchor:[32,32]}));function Kr(){const t=_.useMap(),{dataStore:e,uiStore:n}=p.useGeoStore(),o=p.useElementEditorConfig().network,r=a.useRef(o);r.current=o;const l=p.useEmit(),s=p.useIsEventForEditor(),c=p.useUIStore(x=>x.editingMode),[i,g]=a.useState(null),[m,M]=a.useState(null),f=p.useAccentStyle(),y=p.useTheme(),C=a.useRef(null),L=a.useRef(null),b=a.useRef(null),v=a.useRef(null);a.useEffect(()=>()=>{var x,j;(x=b.current)==null||x.remove(),(j=L.current)==null||j.abort()},[]);const S=a.useCallback(x=>T.addPickedFeature(e.getState(),n.getState(),x),[e,n]),E=a.useCallback(()=>{b.current&&(b.current.remove(),b.current=null)},[]),h=a.useCallback(()=>{g(null),M(null),C.current=null,E(),L.current&&(L.current.abort(),L.current=null)},[E]);return a.useEffect(()=>{if(!i&&c!=="pick-shape")return;function x(j){j.key==="Escape"&&s(j)&&h()}return window.addEventListener("keydown",x),()=>window.removeEventListener("keydown",x)},[i,c,h,s]),_.useMapEvents({click(x){if(c!=="pick-shape")return;if(t.getZoom()<T.OSM_PICK_MIN_ZOOM){l({type:"warning",message:"Zoom in further to use the picker"});return}x.originalEvent.preventDefault(),h();const j=new AbortController;L.current=j;const{lat:Y,lng:R}=x.latlng;C.current=x.latlng,b.current=ue.marker(x.latlng,{icon:Nr(),interactive:!1}).addTo(t);const{overpass:B,fetch:D}=r.current;if(B===!1){E(),h();return}ge.fetchOverpassFeatures(Y,R,T.overpassRadiusForZoom(t.getZoom()),[R,Y],{...B,fetch:D,signal:j.signal}).then(H=>{E(),H.length===0?(l({type:"warning",message:"No features found here"}),h()):H.length===1?(S(H[0]),h()):g(H)}).catch(H=>{(H==null?void 0:H.name)!=="AbortError"&&(E(),l({type:"error",code:H instanceof ge.OverpassError?H.code:"unknown",source:"picker",message:ge.overpassErrorMessage(H),cause:H}),h())})}}),a.useEffect(()=>{c!=="pick-shape"&&h()},[c,h]),a.useEffect(()=>{if(!i||!C.current)return;const x=C.current;let j;function Y(){if(!v.current){j=requestAnimationFrame(Y);return}const R=t.latLngToContainerPoint(x),B=t.getContainer().getBoundingClientRect();v.current.style.left=`${B.left+R.x+16}px`,v.current.style.top=`${B.top+R.y-8}px`,j=requestAnimationFrame(Y)}return j=requestAnimationFrame(Y),()=>cancelAnimationFrame(j)},[i,t]),u.jsxs(u.Fragment,{children:[i&&i.map((x,j)=>u.jsx(_.Polygon,{positions:x.geometry.coordinates[0].map(X),pathOptions:{color:T.OSM_PICK_OVERLAY_COLORS[j%T.OSM_PICK_OVERLAY_COLORS.length],fillColor:T.OSM_PICK_OVERLAY_COLORS[j%T.OSM_PICK_OVERLAY_COLORS.length],weight:m===j?3:2,opacity:m===j?1:.7,fillOpacity:m===j?.3:.12},eventHandlers:{click:Y=>{Y.originalEvent.stopPropagation(),S(x),h()},mouseover:()=>M(j),mouseout:()=>M(null)}},`${x.osmId}/${j}`)),i&&In.createPortal(u.jsx("div",{ref:v,"data-elm-portal":!0,"data-elm-theme":y,style:{...f,position:"fixed",zIndex:1e4},children:u.jsx("div",{className:"bg-elm-surface/95 backdrop-blur-md border border-elm-border/80 text-elm-text-secondary shadow-elm rounded-elm overflow-hidden min-w-[180px] max-w-[280px] text-sm py-1",children:i.map((x,j)=>u.jsxs("button",{onClick:()=>{S(x),h()},onMouseEnter:()=>M(j),onMouseLeave:()=>M(null),className:`w-full text-left px-3 py-2 flex items-center gap-2 transition-colors ${m===j?"bg-primary-50 dark:bg-white/5":"hover:bg-(--elm-surface-hover,var(--color-gray-50)) dark:hover:bg-elm-surface-hover"}`,children:[u.jsx("span",{className:"w-2.5 h-2.5 rounded-full shrink-0",style:{background:T.OSM_PICK_OVERLAY_COLORS[j%T.OSM_PICK_OVERLAY_COLORS.length]}}),u.jsxs("span",{className:"flex flex-col min-w-0",children:[u.jsx("span",{className:"font-medium text-(--elm-text,var(--color-gray-800)) dark:text-(--elm-text,var(--color-gray-100)) truncate",children:x.name||`Unnamed ${x.type.toLowerCase()}`}),u.jsx("span",{className:"text-xs text-(--elm-text-subtle,var(--color-gray-400))",children:x.type})]})]},`${x.osmId}/${j}`))})}),document.body)]})}function Pn({geom:t,pathOptions:e}){switch(t.type){case"Polygon":return u.jsx(_.Polygon,{positions:t.coordinates.map(n=>n.map(X)),pathOptions:e});case"MultiPolygon":return u.jsx(_.Polygon,{positions:t.coordinates.map(n=>n.map(o=>o.map(X))),pathOptions:e});case"LineString":return u.jsx(_.Polyline,{positions:t.coordinates.map(X),pathOptions:{...e,fill:!1}});case"MultiLineString":return u.jsx(_.Polyline,{positions:t.coordinates.map(n=>n.map(X)),pathOptions:{...e,fill:!1}});default:return null}}function Hr(){const t=p.useAccentPalette(_.useMap().getContainer())[500],e=p.useUIStore(m=>m.editingMode),n=p.useUIStore(m=>m.geometryPreview),o=p.useUIStore(m=>m.bufferCreateNew),r=p.useDataStore(m=>m.selectedIds[0]??null),l=p.useDataStore(m=>{var M;return r?((M=m.features.find(f=>f.id===r))==null?void 0:M.geometry)??null:null});if(!(e==="simplify-shape"||e==="smooth-shape"||e==="buffer-shape")||!n||!T.canProcessShape(n.type))return null;const c=e==="buffer-shape",i=c&&!o&&l&&T.canProcessShape(l.type),g=T.isLineGeometryType(n.type);return u.jsxs(u.Fragment,{children:[i&&u.jsx(Pn,{geom:l,pathOptions:{color:"#6b7280",fillColor:"#6b7280",fillOpacity:.07,weight:1.5,opacity:.35,dashArray:"4 4",interactive:!1}}),u.jsx(Pn,{geom:n,pathOptions:{color:t,fillColor:t,fillOpacity:c&&o?.12:.2,weight:g?3:c&&o?2:2.5,opacity:1,dashArray:c&&o?"8 5":void 0,interactive:!1}})]})}function Mn(t,e,n){const[o,r]=T.visibleCenterOffset(t.getContainer());return!o&&!r?ue.latLng(e):t.unproject(t.project(e,n).subtract([o,r]),n)}function Br({routingApiKey:t}){const e=_.useMap(),n=p.useSetMapController(),{dataStore:o}=p.useGeoStore();a.useEffect(()=>{o.getState().setCurrentZoom(e.getZoom());const l=()=>o.getState().setCurrentZoom(e.getZoom());return e.on("zoomend",l),()=>{e.off("zoomend",l)}},[e,o]),a.useEffect(()=>{n({flyTo:(l,s)=>e.flyTo(Mn(e,l,s),s,{duration:1.2}),panTo:l=>e.flyTo(Mn(e,l,e.getZoom()),e.getZoom(),{duration:.5}),fitBounds:l=>{const s=T.normalizeFitBoundsTarget(l);if(!s)return;const c=T.fitPadding(e.getContainer());e.flyToBounds([[s.minLat,s.minLng],[s.maxLat,s.maxLng]],{paddingTopLeft:[c.left,c.top],paddingBottomRight:[c.right,c.bottom],maxZoom:16,duration:1.2})},getCenter:()=>{const l=e.getCenter();return[l.lng,l.lat]},setZoom:l=>{const s=Math.max(e.getMinZoom(),Math.min(e.getMaxZoom(),l));return e.setZoom(s,{animate:!1}),s},getZoomBounds:()=>({min:e.getMinZoom(),max:e.getMaxZoom()}),getMap:()=>e})},[e,n]);const r=Lt.useServiceAttribution(t);return a.useEffect(()=>{var l;if(r)return(l=e.attributionControl)==null||l.addAttribution(r),()=>{var s;(s=e.attributionControl)==null||s.removeAttribution(r)}},[e,r]),null}const Vr=a.forwardRef(function(e,n){return e.onEvent||e.onError?u.jsx(p.EventProvider,{onEvent:e.onEvent,onError:e.onError,children:u.jsx(Cn,{...e,ref:n})}):u.jsx(Cn,{...e,ref:n})}),Cn=a.forwardRef(function(e,n){const o=_.useMap(),{dataStore:r,uiStore:l}=p.useGeoStore(),s=p.useAdapterControls({initialData:e.initialData,schema:e.schema,layout:e.layout,readonly:e.readonly,tools:e.tools,maxFeatures:e.maxFeatures,engine:"leaflet",onChange:e.onChange,onSubmit:e.onSubmit,onValidationError:e.onValidationError,onFeatureAdd:e.onFeatureAdd,onFeatureUpdate:e.onFeatureUpdate,onFeatureDelete:e.onFeatureDelete,onSelectionChange:e.onSelectionChange,onFeatureSelect:e.onFeatureSelect,onZoomChange:e.onZoomChange,onToolChange:e.onToolChange});a.useImperativeHandle(n,()=>s,[s]),a.useEffect(()=>{},[r,l,o]),p.useKeyboardShortcuts(o.getContainer()),p.useApplyAccentToRoot(o.getContainer()),p.useReportThemeFromRoot(o.getContainer()),a.useEffect(()=>{p.preloadEditorPanelsWhenIdle()},[]),a.useEffect(()=>{const g=T.normalizeBounds(e.bounds);o.setMaxBounds(g?[[g[1],g[0]],[g[3],g[2]]]:void 0)},[o,e.bounds]);const c=a.useRef(e.onReady);c.current=e.onReady;const i=a.useRef(null);return a.useEffect(()=>{i.current!==o&&(i.current=o,o.whenReady(()=>{var g;return(g=c.current)==null?void 0:g.call(c,o)}))},[o]),u.jsxs(Qt,{getFeatureStyle:e.getFeatureStyle,children:[u.jsx(Br,{routingApiKey:e.routingApiKey}),u.jsx(zn,{}),u.jsx(Bn,{renderer:e.renderer}),u.jsx(Gn,{routingApiKey:e.routingApiKey}),u.jsx($n,{}),u.jsx(Xn,{}),u.jsx(Yn,{}),u.jsx(qn,{}),u.jsx(_r,{}),u.jsx(Kr,{}),u.jsx(Hr,{})]})});Object.defineProperty(exports,"ActiveDrawingToolbar",{enumerable:!0,get:()=>p.ActiveDrawingToolbar});Object.defineProperty(exports,"EditingToolbar",{enumerable:!0,get:()=>p.EditingToolbar});Object.defineProperty(exports,"ElementEditorUIProvider",{enumerable:!0,get:()=>p.ElementEditorUIProvider});Object.defineProperty(exports,"FloatingToolbar",{enumerable:!0,get:()=>p.FloatingToolbar});Object.defineProperty(exports,"GeoStoreProvider",{enumerable:!0,get:()=>p.GeoStoreProvider});Object.defineProperty(exports,"MapControllerProvider",{enumerable:!0,get:()=>p.MapControllerProvider});Object.defineProperty(exports,"StoreContext",{enumerable:!0,get:()=>p.StoreContext});Object.defineProperty(exports,"useDataStore",{enumerable:!0,get:()=>p.useDataStore});Object.defineProperty(exports,"useGeoStore",{enumerable:!0,get:()=>p.useGeoStore});Object.defineProperty(exports,"useKeyboardShortcuts",{enumerable:!0,get:()=>p.useKeyboardShortcuts});Object.defineProperty(exports,"useMapController",{enumerable:!0,get:()=>p.useMapController});Object.defineProperty(exports,"useSetMapController",{enumerable:!0,get:()=>p.useSetMapController});Object.defineProperty(exports,"useUIStore",{enumerable:!0,get:()=>p.useUIStore});Object.defineProperty(exports,"ElementEditorError",{enumerable:!0,get:()=>ge.ElementEditorError});exports.BoundaryLayer=zn;exports.DrawingLayer=Gn;exports.DrawingPreviewLayer=$n;exports.ElementEditorControls=Vr;exports.FeatureInteractionLayer=Bn;exports.FeatureStyleProvider=Qt;exports.FitBounds=Er;exports.MeasurementTooltip=qn;exports.RoutePreviewLayer=Yn;exports.SnapController=Xn;exports.TransformControls=Tn;exports.findSnapPoint=bt;exports.snapToAngle=tn;exports.toGeoJSON=po;exports.toLeaflet=X;exports.useFeatureStyle=en;exports.useMapInteractionMachine=Fn;
@@ -0,0 +1,27 @@
1
+ export { GeoStoreProvider, StoreContext } from './store/StoreContext.cjs';
2
+ export { useDataStore, useUIStore, useGeoStore } from './store/StoreContext.cjs';
3
+ export { MapControllerProvider, useMapController, useSetMapController } from './contexts/MapControllerContext.cjs';
4
+ export type { MapController } from './contexts/MapControllerContext.cjs';
5
+ export { useMapInteractionMachine } from './hooks/useMapInteractionMachine.cjs';
6
+ export type { MapInteractionMachine, InteractionPhase } from './hooks/useMapInteractionMachine.cjs';
7
+ export { ElementEditorControls } from './ElementEditorControls.cjs';
8
+ export type { ElementEditorControlsProps, ElementEditorControlsRef, DrawingTool } from './ElementEditorControls.cjs';
9
+ export type { FeatureRenderer } from './components/FeatureInteractionLayer.cjs';
10
+ export { FeatureStyleProvider, useFeatureStyle } from './contexts/FeatureStyleContext.cjs';
11
+ export type { FeatureStyle, FeatureStyleFn } from './contexts/FeatureStyleContext.cjs';
12
+ export { ElementEditorUIProvider } from '@element-editor/ui';
13
+ export { ElementEditorError } from '@element-editor/core';
14
+ export type { ElementEditorEvent, ElementEditorErrorHandler, ErrorCode, ErrorSource } from '@element-editor/ui';
15
+ export type { ElementEditorUIProviderProps } from '@element-editor/ui';
16
+ export type { ElementEditorConfig, ResolvedConfig, ToolbarPosition } from '@element-editor/ui';
17
+ export { FloatingToolbar, EditingToolbar, ActiveDrawingToolbar, useKeyboardShortcuts } from '@element-editor/ui';
18
+ export { default as DrawingLayer } from './components/DrawingLayer.cjs';
19
+ export { default as FeatureInteractionLayer, FitBounds } from './components/FeatureInteractionLayer.cjs';
20
+ export { default as DrawingPreviewLayer } from './components/DrawingPreviewLayer.cjs';
21
+ export { default as SnapController } from './components/SnapController.cjs';
22
+ export { TransformControls } from './components/TransformControls.cjs';
23
+ export { default as RoutePreviewLayer } from './components/RoutePreviewLayer.cjs';
24
+ export { default as BoundaryLayer } from './components/BoundaryLayer.cjs';
25
+ export { default as MeasurementTooltip } from './components/MeasurementTooltip.cjs';
26
+ export { toLeaflet, toGeoJSON } from './utils/geojson.cjs';
27
+ export { findSnapPoint, snapToAngle } from './utils/snapping.cjs';
@@ -0,0 +1,27 @@
1
+ export { GeoStoreProvider, StoreContext } from './store/StoreContext.js';
2
+ export { useDataStore, useUIStore, useGeoStore } from './store/StoreContext.js';
3
+ export { MapControllerProvider, useMapController, useSetMapController } from './contexts/MapControllerContext.js';
4
+ export type { MapController } from './contexts/MapControllerContext.js';
5
+ export { useMapInteractionMachine } from './hooks/useMapInteractionMachine.js';
6
+ export type { MapInteractionMachine, InteractionPhase } from './hooks/useMapInteractionMachine.js';
7
+ export { ElementEditorControls } from './ElementEditorControls.js';
8
+ export type { ElementEditorControlsProps, ElementEditorControlsRef, DrawingTool } from './ElementEditorControls.js';
9
+ export type { FeatureRenderer } from './components/FeatureInteractionLayer.js';
10
+ export { FeatureStyleProvider, useFeatureStyle } from './contexts/FeatureStyleContext.js';
11
+ export type { FeatureStyle, FeatureStyleFn } from './contexts/FeatureStyleContext.js';
12
+ export { ElementEditorUIProvider } from '@element-editor/ui';
13
+ export { ElementEditorError } from '@element-editor/core';
14
+ export type { ElementEditorEvent, ElementEditorErrorHandler, ErrorCode, ErrorSource } from '@element-editor/ui';
15
+ export type { ElementEditorUIProviderProps } from '@element-editor/ui';
16
+ export type { ElementEditorConfig, ResolvedConfig, ToolbarPosition } from '@element-editor/ui';
17
+ export { FloatingToolbar, EditingToolbar, ActiveDrawingToolbar, useKeyboardShortcuts } from '@element-editor/ui';
18
+ export { default as DrawingLayer } from './components/DrawingLayer.js';
19
+ export { default as FeatureInteractionLayer, FitBounds } from './components/FeatureInteractionLayer.js';
20
+ export { default as DrawingPreviewLayer } from './components/DrawingPreviewLayer.js';
21
+ export { default as SnapController } from './components/SnapController.js';
22
+ export { TransformControls } from './components/TransformControls.js';
23
+ export { default as RoutePreviewLayer } from './components/RoutePreviewLayer.js';
24
+ export { default as BoundaryLayer } from './components/BoundaryLayer.js';
25
+ export { default as MeasurementTooltip } from './components/MeasurementTooltip.js';
26
+ export { toLeaflet, toGeoJSON } from './utils/geojson.js';
27
+ export { findSnapPoint, snapToAngle } from './utils/snapping.js';