@element-editor/ui 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.
- package/AGENTS.md +65 -0
- package/LICENSE +21 -0
- package/README.md +46 -2
- package/dist/BooleanOperations-BRO7NHUY.js +111 -0
- package/dist/BooleanOperations-C2uOHRu3.cjs +1 -0
- package/dist/DataTable-B-2VjBEz.cjs +2 -0
- package/dist/DataTable-CS-3dIqY.js +510 -0
- package/dist/DataTablePanel-58LwzXQR.cjs +1 -0
- package/dist/DataTablePanel-DDFUmMaM.js +208 -0
- package/dist/EditToolbarBtn-Ch9HCLHq.cjs +3 -0
- package/dist/EditToolbarBtn-SR4xHd8G.js +378 -0
- package/dist/FeatureEditModal-Cc8N6vei.cjs +1 -0
- package/dist/FeatureEditModal-Dr10p3nE.js +77 -0
- package/dist/FeatureList-Bo9w9nre.js +520 -0
- package/dist/FeatureList-VRYesXCq.cjs +1 -0
- package/dist/FeatureRowContextMenu-CtBqdC1j.cjs +1 -0
- package/dist/FeatureRowContextMenu-DCUIiDwc.js +130 -0
- package/dist/GeoJSONModal-BV9Tamf4.js +886 -0
- package/dist/GeoJSONModal-Dd-nBufy.cjs +9 -0
- package/dist/SchemaEditor-B4L17K1e.cjs +1 -0
- package/dist/SchemaEditor-ryoTgaLb.js +293 -0
- package/dist/SchemaModal-DvMbWskS.js +95 -0
- package/dist/SchemaModal-gAuDkd-L.cjs +1 -0
- package/dist/SettingsModal-BScVTjpn.js +237 -0
- package/dist/SettingsModal-CqaSFxxR.cjs +1 -0
- package/dist/ShortcutsModal-D1Y2bGT8.cjs +1 -0
- package/dist/ShortcutsModal-ozuS2Ysb.js +299 -0
- package/dist/components/ActiveDrawingToolbar.d.cts +1 -0
- package/dist/components/ActiveDrawingToolbar.d.ts +1 -0
- package/dist/components/BasemapPicker.d.cts +26 -0
- package/dist/components/BasemapPicker.d.ts +26 -0
- package/dist/components/BooleanOperations.d.cts +1 -0
- package/dist/components/BooleanOperations.d.ts +1 -0
- package/dist/components/BufferPanel.d.cts +1 -0
- package/dist/components/BufferPanel.d.ts +1 -0
- package/dist/components/DataTable.d.cts +9 -0
- package/dist/components/DataTable.d.ts +9 -0
- package/dist/components/DataTablePanel.d.cts +10 -0
- package/dist/components/DataTablePanel.d.ts +10 -0
- package/dist/components/EditingToolbar.d.cts +1 -0
- package/dist/components/EditingToolbar.d.ts +1 -0
- package/dist/components/ElementEditorErrorBoundary.d.cts +28 -0
- package/dist/components/ElementEditorErrorBoundary.d.ts +28 -0
- package/dist/components/ElementEditorUIProvider.d.cts +50 -0
- package/dist/components/ElementEditorUIProvider.d.ts +50 -0
- package/dist/components/FeatureMapContextMenu.d.cts +23 -0
- package/dist/components/FeatureMapContextMenu.d.ts +23 -0
- package/dist/components/FitBoundsButton.d.cts +6 -0
- package/dist/components/FitBoundsButton.d.ts +6 -0
- package/dist/components/FloatingToolbar.d.cts +3 -0
- package/dist/components/FloatingToolbar.d.ts +3 -0
- package/dist/components/LocateButton.d.cts +11 -0
- package/dist/components/LocateButton.d.ts +11 -0
- package/dist/components/ReadonlyBanner.d.cts +1 -0
- package/dist/components/ReadonlyBanner.d.ts +1 -0
- package/dist/components/ShortcutsModal.d.cts +1 -0
- package/dist/components/ShortcutsModal.d.ts +1 -0
- package/dist/components/SimplifyPanel.d.cts +1 -0
- package/dist/components/SimplifyPanel.d.ts +1 -0
- package/dist/components/SmoothPanel.d.cts +1 -0
- package/dist/components/SmoothPanel.d.ts +1 -0
- package/dist/components/UndoRedoToolbar.d.cts +20 -0
- package/dist/components/UndoRedoToolbar.d.ts +20 -0
- package/dist/components/VertexSelectionBar.d.cts +12 -0
- package/dist/components/VertexSelectionBar.d.ts +12 -0
- package/dist/components/ZoomIndicator.d.cts +15 -0
- package/dist/components/ZoomIndicator.d.ts +15 -0
- package/dist/components/dialogs/DynamicFieldRenderer.d.cts +11 -0
- package/dist/components/dialogs/DynamicFieldRenderer.d.ts +11 -0
- package/dist/components/dialogs/SettingsModal.d.cts +1 -0
- package/dist/components/dialogs/SettingsModal.d.ts +1 -0
- package/dist/components/lazyParts.d.cts +12 -0
- package/dist/components/lazyParts.d.ts +12 -0
- package/dist/components/sidebar/FeatureEditModal.d.cts +6 -0
- package/dist/components/sidebar/FeatureEditModal.d.ts +6 -0
- package/dist/components/sidebar/FeatureList.d.cts +4 -0
- package/dist/components/sidebar/FeatureList.d.ts +4 -0
- package/dist/components/sidebar/FeatureRow.d.cts +38 -0
- package/dist/components/sidebar/FeatureRow.d.ts +38 -0
- package/dist/components/sidebar/FeatureRowContextMenu.d.cts +12 -0
- package/dist/components/sidebar/FeatureRowContextMenu.d.ts +12 -0
- package/dist/components/sidebar/FeatureSidePanel.d.cts +8 -0
- package/dist/components/sidebar/FeatureSidePanel.d.ts +8 -0
- package/dist/components/sidebar/GeoJSONModal.d.cts +5 -0
- package/dist/components/sidebar/GeoJSONModal.d.ts +5 -0
- package/dist/components/sidebar/GroupRow.d.cts +21 -0
- package/dist/components/sidebar/GroupRow.d.ts +21 -0
- package/dist/components/sidebar/HideLayersToggle.d.cts +2 -0
- package/dist/components/sidebar/HideLayersToggle.d.ts +2 -0
- package/dist/components/sidebar/LayersPanel.d.cts +5 -0
- package/dist/components/sidebar/LayersPanel.d.ts +5 -0
- package/dist/components/sidebar/PartSubRow.d.cts +9 -0
- package/dist/components/sidebar/PartSubRow.d.ts +9 -0
- package/dist/components/sidebar/SchemaEditor.d.cts +4 -0
- package/dist/components/sidebar/SchemaEditor.d.ts +4 -0
- package/dist/components/sidebar/SchemaModal.d.cts +5 -0
- package/dist/components/sidebar/SchemaModal.d.ts +5 -0
- package/dist/components/sidebar/codeDock.d.cts +21 -0
- package/dist/components/sidebar/codeDock.d.ts +21 -0
- package/dist/components/ui/Button.d.cts +9 -0
- package/dist/components/ui/Button.d.ts +9 -0
- package/dist/components/ui/CloseButton.d.cts +6 -0
- package/dist/components/ui/CloseButton.d.ts +6 -0
- package/dist/components/ui/ContextMenu.d.cts +28 -0
- package/dist/components/ui/ContextMenu.d.ts +28 -0
- package/dist/components/ui/EditToolbarBtn.d.cts +13 -0
- package/dist/components/ui/EditToolbarBtn.d.ts +13 -0
- package/dist/components/ui/ElementToaster.d.cts +3 -0
- package/dist/components/ui/ElementToaster.d.ts +3 -0
- package/dist/components/ui/GeometryTypeIcon.d.cts +7 -0
- package/dist/components/ui/GeometryTypeIcon.d.ts +7 -0
- package/dist/components/ui/IconButton.d.cts +28 -0
- package/dist/components/ui/IconButton.d.ts +28 -0
- package/dist/components/ui/Input.d.cts +14 -0
- package/dist/components/ui/Input.d.ts +14 -0
- package/dist/components/ui/JsonCode.d.cts +4 -0
- package/dist/components/ui/JsonCode.d.ts +4 -0
- package/dist/components/ui/Kbd.d.cts +16 -0
- package/dist/components/ui/Kbd.d.ts +16 -0
- package/dist/components/ui/NoFeaturesEmptyState.d.cts +1 -0
- package/dist/components/ui/NoFeaturesEmptyState.d.ts +1 -0
- package/dist/components/ui/SearchDropdown.d.cts +28 -0
- package/dist/components/ui/SearchDropdown.d.ts +28 -0
- package/dist/components/ui/ToolButton.d.cts +19 -0
- package/dist/components/ui/ToolButton.d.ts +19 -0
- package/dist/components/ui/Tooltip.d.cts +12 -0
- package/dist/components/ui/Tooltip.d.ts +12 -0
- package/dist/components/ui/panelHeader.d.cts +2 -0
- package/dist/components/ui/panelHeader.d.ts +2 -0
- package/dist/components/ui/resizeEdge.d.cts +4 -0
- package/dist/components/ui/resizeEdge.d.ts +4 -0
- package/dist/contexts/ElementEditorConfigContext.d.cts +351 -0
- package/dist/contexts/ElementEditorConfigContext.d.ts +351 -0
- package/dist/contexts/EventContext.d.cts +69 -0
- package/dist/contexts/EventContext.d.ts +69 -0
- package/dist/contexts/MapControllerContext.d.cts +24 -0
- package/dist/contexts/MapControllerContext.d.ts +24 -0
- package/dist/contexts/ShortcutConfigContext.d.cts +16 -0
- package/dist/contexts/ShortcutConfigContext.d.ts +16 -0
- package/dist/contexts/ThemeContext.d.cts +12 -0
- package/dist/contexts/ThemeContext.d.ts +12 -0
- package/dist/element-editor-ui.cjs +1 -0
- package/dist/element-editor-ui.es.js +102 -0
- package/dist/geometryWorker-CCwg4tNC.cjs +1 -0
- package/dist/geometryWorker-DgQCFSmD.js +25 -0
- package/dist/hooks/dragShield.d.cts +7 -0
- package/dist/hooks/dragShield.d.ts +7 -0
- package/dist/hooks/themeInputs.d.cts +14 -0
- package/dist/hooks/themeInputs.d.ts +14 -0
- package/dist/hooks/useAccentPalette.d.cts +15 -0
- package/dist/hooks/useAccentPalette.d.ts +15 -0
- package/dist/hooks/useAccentStyle.d.cts +39 -0
- package/dist/hooks/useAccentStyle.d.ts +39 -0
- package/dist/hooks/useAdapterControls.d.cts +280 -0
- package/dist/hooks/useAdapterControls.d.ts +280 -0
- package/dist/hooks/useBalancedWrap.d.cts +8 -0
- package/dist/hooks/useBalancedWrap.d.ts +8 -0
- package/dist/hooks/useContextMenu.d.cts +11 -0
- package/dist/hooks/useContextMenu.d.ts +11 -0
- package/dist/hooks/useDataChangeSubscription.d.cts +9 -0
- package/dist/hooks/useDataChangeSubscription.d.ts +9 -0
- package/dist/hooks/useDragWindow.d.cts +9 -0
- package/dist/hooks/useDragWindow.d.ts +9 -0
- package/dist/hooks/useFocusTrap.d.cts +7 -0
- package/dist/hooks/useFocusTrap.d.ts +7 -0
- package/dist/hooks/useGeoJSONDrop.d.cts +40 -0
- package/dist/hooks/useGeoJSONDrop.d.ts +40 -0
- package/dist/hooks/useGeoJSONExport.d.cts +69 -0
- package/dist/hooks/useGeoJSONExport.d.ts +69 -0
- package/dist/hooks/useGeoJSONFileImport.d.cts +24 -0
- package/dist/hooks/useGeoJSONFileImport.d.ts +24 -0
- package/dist/hooks/useInlineRename.d.cts +26 -0
- package/dist/hooks/useInlineRename.d.ts +26 -0
- package/dist/hooks/useJumpToFeature.d.cts +3 -0
- package/dist/hooks/useJumpToFeature.d.ts +3 -0
- package/dist/hooks/useKeyboardShortcuts.d.cts +9 -0
- package/dist/hooks/useKeyboardShortcuts.d.ts +9 -0
- package/dist/hooks/useNominatim.d.cts +24 -0
- package/dist/hooks/useNominatim.d.ts +24 -0
- package/dist/hooks/usePanelOffset.d.cts +14 -0
- package/dist/hooks/usePanelOffset.d.ts +14 -0
- package/dist/hooks/useResizablePanel.d.cts +4 -0
- package/dist/hooks/useResizablePanel.d.ts +4 -0
- package/dist/hooks/useRootTokens.d.cts +27 -0
- package/dist/hooks/useRootTokens.d.ts +27 -0
- package/dist/hooks/useSearchState.d.cts +23 -0
- package/dist/hooks/useSearchState.d.ts +23 -0
- package/dist/hooks/useServiceAttribution.d.cts +13 -0
- package/dist/hooks/useServiceAttribution.d.ts +13 -0
- package/dist/hooks/useWindowEscape.d.cts +25 -0
- package/dist/hooks/useWindowEscape.d.ts +25 -0
- package/dist/hooks/useWindowFocus.d.cts +4 -0
- package/dist/hooks/useWindowFocus.d.ts +4 -0
- package/dist/hooks/useWorkerGeometryPreview.d.cts +22 -0
- package/dist/hooks/useWorkerGeometryPreview.d.ts +22 -0
- package/dist/index-CILw1Du5.js +3165 -0
- package/dist/index-DG4wEjGj.cjs +1 -0
- package/dist/index.d.cts +89 -0
- package/dist/index.d.ts +89 -0
- package/dist/internal.cjs +1 -0
- package/dist/internal.d.cts +16 -0
- package/dist/internal.d.ts +16 -0
- package/dist/internal.es.js +42 -0
- package/dist/primitives.cjs +1 -0
- package/dist/primitives.d.cts +19 -0
- package/dist/primitives.d.ts +19 -0
- package/dist/primitives.es.js +17 -0
- package/dist/store/StoreContext.d.cts +17 -0
- package/dist/store/StoreContext.d.ts +17 -0
- package/dist/types/events.d.cts +95 -0
- package/dist/types/events.d.ts +95 -0
- package/dist/useAccentStyle-CPo2XqAn.js +412 -0
- package/dist/useAccentStyle-hsGvyHZc.cjs +1 -0
- package/dist/useAdapterControls-BBObhzVX.cjs +1 -0
- package/dist/useAdapterControls-DVjkwRZ_.js +691 -0
- package/dist/useContextMenu-DJ2Cti85.js +10 -0
- package/dist/useContextMenu-DbxMvb1s.cjs +1 -0
- package/dist/useFocusTrap-BBjPCfDR.cjs +1 -0
- package/dist/useFocusTrap-CKxKT8De.js +25 -0
- package/dist/useJumpToFeature-Bdz2hqOC.js +16 -0
- package/dist/useJumpToFeature-LwjxGzfy.cjs +1 -0
- package/dist/useWindowFocus-DuQVjnHE.js +80 -0
- package/dist/useWindowFocus-EemgNOuz.cjs +1 -0
- package/dist/utils/booleanValue.d.cts +4 -0
- package/dist/utils/booleanValue.d.ts +4 -0
- package/dist/utils/clipboardError.d.cts +3 -0
- package/dist/utils/clipboardError.d.ts +3 -0
- package/dist/utils/download.d.cts +42 -0
- package/dist/utils/download.d.ts +42 -0
- package/dist/utils/geojsonDocument.d.cts +168 -0
- package/dist/utils/geojsonDocument.d.ts +168 -0
- package/dist/utils/geometryWorkerClient.d.cts +6 -0
- package/dist/utils/geometryWorkerClient.d.ts +6 -0
- package/dist/utils/layerOrder.d.cts +9 -0
- package/dist/utils/layerOrder.d.ts +9 -0
- package/dist/utils/lazyWithPreload.d.cts +24 -0
- package/dist/utils/lazyWithPreload.d.ts +24 -0
- package/dist/utils/lineSmooth.d.cts +7 -0
- package/dist/utils/lineSmooth.d.ts +7 -0
- package/dist/utils/platform.d.cts +2 -0
- package/dist/utils/platform.d.ts +2 -0
- package/dist/workers/geometryWorker.d.cts +1 -0
- package/dist/workers/geometryWorker.d.ts +1 -0
- package/package.json +133 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const c=require("react"),x=require("react/jsx-runtime"),S=require("@element-editor/core"),E=require("@element-editor/core/internal"),J={attributes:!0,attributeFilter:["style","class","data-elm-theme"]},Q={attributes:!0,attributeFilter:["style","class"]},X={childList:!0,subtree:!0,characterData:!0,attributes:!0,attributeFilter:["href","media","disabled"]},g=new Set(["--elm-panel-offset","--elm-table-offset","--elm-bottom-row-height","--elm-bottom-stack-offset","--elm-bottom-toolbar-offset","--elm-left-center-shift","--elm-right-center-shift"]),N=t=>{if(!(t instanceof HTMLElement))return"";let e=`${t.className}|${t.getAttribute("data-elm-theme")??""}`;for(const s of t.style)!g.has(s)&&!s.startsWith("transition")&&(e+=`;${s}:${t.style.getPropertyValue(s)}`);return e};function V(t,e){const s=u=>{u.target instanceof HTMLLinkElement&&e()};let r=N(t);const n=new MutationObserver(u=>{const i=r;r=N(t),!(r===i&&u.every(m=>m.target===t))&&e()});return t&&n.observe(t,J),n.observe(document.documentElement,Q),n.observe(document.head,X),document.addEventListener("load",s,!0),()=>{n.disconnect(),document.removeEventListener("load",s,!0)}}const K=["--elm-font","--elm-font-mono","--elm-radius","--elm-radius-control","--elm-shadow","--elm-shadow-raised","--elm-shadow-control","--elm-surface","--elm-surface-raised","--elm-surface-sunken","--elm-surface-hover","--elm-control-hover","--elm-text","--elm-text-secondary","--elm-text-muted","--elm-text-subtle","--elm-text-disabled","--elm-border","--elm-border-subtle","--elm-border-strong","--elm-focus-ring","--elm-tooltip","--elm-tooltip-text"],tt=[...K,"--elm-accent",...[50,100,200,300,400,500,600,700,800,900,950].map(t=>`--elm-primary-${t}`)];function P(t){if(!t)return;const e=getComputedStyle(t);let s;for(const r of tt){const n=e.getPropertyValue(r).trim();n&&((s??(s={}))[r]=n)}return s}const et=(t,e)=>{if(t===e)return!0;if(!t||!e)return!1;const s=Object.keys(t);return s.length===Object.keys(e).length&&s.every(r=>t[r]===e[r])};function st(t){const[e,s]=c.useState(void 0);return c.useEffect(()=>{if(!t){s(void 0);return}const r=()=>{const m=P(t);s(a=>et(a,m)?a:m)};let n=0;const u=()=>{n||(n=requestAnimationFrame(()=>{n=0,r()}))};r();const i=V(t,u);return()=>{i(),cancelAnimationFrame(n)}},[t]),e}const B=c.createContext(void 0),D=new WeakMap;function rt(t,e){if(!e)return;const s=(e instanceof HTMLElement?e.className+"|"+e.getAttribute("data-elm-theme")+"|"+(e.getAttribute("style")??""):"")+"|"+document.documentElement.className+"|"+(document.documentElement.getAttribute("style")??""),r=D.get(t);if(r&&r.root===e&&r.key===s)return;const n=P(e)??{};for(const u of(r==null?void 0:r.names)??[])u in n||t.style.removeProperty(u);for(const[u,i]of Object.entries(n))t.style.setProperty(u,i);D.set(t,{root:e,key:s,names:Object.keys(n)})}const ot={point:"place-point",line:"draw-line",polygon:"draw-polygon",route:"draw-route",circle:"draw-circle",rectangle:"draw-rect",freehand:"draw-freehand",picker:"pick-shape",measure:"measure"},T=["topLeft","topCenter","topRight","leftCenter","rightCenter","bottomLeft","bottomCenter","bottomRight","statusLeft","statusRight"],H=t=>(t&&typeof t=="object"&&(Object.values(t).forEach(H),Object.freeze(t)),t),U=H({topCenter:["toolbar"],leftCenter:[{group:["undo","redo"]}],bottomLeft:["basemap","fitBounds","locate","zoomIndicator","table","schema","geojson","settings","keyboard","applyChanges"]});function f(t){const e=[];for(const s of t)s==="separator"&&(e.length===0||e[e.length-1]==="separator")||e.push(s);return e[e.length-1]==="separator"&&e.pop(),e}function nt(t,e,s){switch(t){case"fitBounds":return e.zoomToAll;case"locate":return e.locateButton;case"zoomIndicator":return e.zoomIndicator;case"table":return e.dataTable;case"schema":return e.schemaEditor&&!s.readonly;case"geojson":return e.geojsonEditor;case"settings":return e.settings;case"keyboard":return e.keyboardShortcuts.show;case"applyChanges":return s.canSubmit&&!s.readonly;case"undo":case"redo":return!s.readonly;case"basemap":return s.hasBasemaps;default:return!0}}function at(t,e){const s=[];for(const r of t)if(typeof r=="object"){const n=f(r.group.filter(u=>u==="separator"||e(u)));n.length&&s.push({group:n})}else(r==="separator"||e(r))&&s.push(r);return f(s)}function ut(t){return t===!1?{enabled:!1,show:!1,mapZoom:!1}:t===!0||t===void 0?{enabled:!0,show:!0,mapZoom:!1}:{enabled:t.enabled??!0,show:t.show??!0,mapZoom:t.mapZoom??!1}}const A=new Set(["toolbar","undo","redo","fitBounds","locate","zoomIndicator","table","schema","geojson","settings","keyboard","applyChanges","attribution","basemap"]),O=t=>t==="statusLeft"||t==="statusRight",$=t=>!!t&&typeof t=="object"&&Array.isArray(t.group);function lt(t,e,s){return A.has(t)?(t==="toolbar"||t==="basemap")&&s?`'${t}' can't go in a group`:O(e)&&(t==="toolbar"||t==="applyChanges")?`'${t}' can't go in the status bar`:t==="attribution"&&!O(e)?"'attribution' can only go in statusLeft or statusRight":null:`'${t}' is not a control`}const R=t=>Array.isArray(t)?{items:t}:{items:Array.isArray(t==null?void 0:t.items)?t.items:[],direction:t==null?void 0:t.direction};function Y(t){const e=new Map,s={};for(const r of T){const n=R(t[r]),u=O(r)?"horizontal":n.direction||(r==="leftCenter"||r==="rightCenter"?"vertical":"horizontal"),i=o=>{const l=e.get(o);return l?l===r?`'${o}' is listed twice in ${r}; keeping the first one`:`'${o}' is in both ${l} and ${r}; keeping ${l} (the first in slot order). To move one control without relisting the defaults, use withLayout({ move: { ${o}: '${r}' } })`:null},m=(o,l)=>{const p=o==="separator"?l||O(r)?null:"'separator' only goes inside a group or in the status bar (there's nothing to draw it on over the map); put it inside a { group: [...] }":typeof o!="string"?$(o)?"groups can't be nested":`${JSON.stringify(o)} is not a control, 'separator' or { group: [...] }`:lt(o,r,l)??i(o);return p?(E.warnOnce(`${r}:${p}`,`config.ui.layout.${r}: ${p}. Ignoring it.`),!1):(o!=="separator"&&e.set(o,r),!0)},a=[];for(const o of n.items)if($(o)){const l=f(o.group.filter(p=>m(p,!0)));l.length&&a.push({group:l})}else m(o,!1)&&a.push(o);s[r]={items:f(a),direction:u}}return s}function it(t,e=U){const s=Object.entries(t.move??{}),r=new Set(t.hide??[]);for(const a of[...s.map(([o])=>o),...r])A.has(a)||E.warnOnce(`withLayout:${a}`,`withLayout: '${a}' is not a control. Ignoring it.`);const n=new Set([...r,...s.map(([a])=>a)]),u=a=>!(typeof a=="string"&&n.has(a)),i={},m=(a,o,l)=>{i[a]=Array.isArray(o)||o===void 0?l:{...o,items:l}};for(const a of T){const o=e[a];if(o===void 0)continue;const l=R(o).items.flatMap(p=>{if(!$(p))return u(p)?[p]:[];const h=f(p.group.filter(u));return h.length?[{group:h}]:[]});m(a,o,f(l))}for(const[a,o]of s){if(!A.has(a))continue;if(r.has(a)){E.warnOnce(`withLayout:both:${a}`,`withLayout: '${a}' is both moved and hidden; hiding it.`);continue}const{slot:l,at:p="end"}=typeof o=="string"?{slot:o}:o??{};if(!T.includes(l)){E.warnOnce(`withLayout:slot:${String(l)}`,`withLayout: '${String(l)}' is not a slot (moving '${a}'). Ignoring it.`);continue}const h=i[l],y=[...R(h).items];m(l,h,p==="start"?[a,...y]:[...y,a])}return i}function mt(t,e){const s=new Set(T.flatMap(i=>t[i].items.flatMap(m=>typeof m=="object"?m.group:[m]))),r=[];!e.readonly&&(e.tools===null||e.tools.length>0)&&!s.has("toolbar")&&r.push(`'toolbar' isn't placed, so the drawing tools are ${e.shortcuts?"reachable only by keyboard shortcut":"unreachable"}. Put it in a map slot (withLayout({ move: { toolbar: 'topCenter' } })), or set readonly / tools: [] if that's on purpose`),e.canSubmit&&!e.readonly&&!s.has("applyChanges")&&r.push("onSubmit is set but 'applyChanges' isn't placed, so users can't submit. Place it, or call ref.submit() yourself");const u=["undo","redo"].filter(i=>!s.has(i));return!e.readonly&&!e.shortcuts&&u.length&&r.push(`${u.map(i=>`'${i}'`).join(" and ")} ${u.length>1?"aren't":"isn't"} placed and keyboard shortcuts are off, so users can't ${u.join(" or ")}`),r}const ct={topLeft:"top-left",topCenter:"top-center",topRight:"top-right",leftCenter:"left-center",rightCenter:"right-center",bottomLeft:"bottom-left",bottomCenter:"bottom-center",bottomRight:"bottom-right"};function _(t){var r,n,u,i,m,a,o,l,p,h,y,v,L,d,b,C,M,z;const e=Y(((r=t==null?void 0:t.ui)==null?void 0:r.layout)??U),s=T.find(W=>e[W].items.includes("toolbar"));return{mode:(t==null?void 0:t.mode)??"system",persistKey:(t==null?void 0:t.persistKey)||void 0,persist:(t==null?void 0:t.persist)??!0,network:(t==null?void 0:t.network)??{},accentColor:(t==null?void 0:t.accentColor)||void 0,featureColor:(t==null?void 0:t.featureColor)||void 0,tools:(t==null?void 0:t.tools)??"all",ui:{hints:((n=t==null?void 0:t.ui)==null?void 0:n.hints)??!0,dataTable:((u=t==null?void 0:t.ui)==null?void 0:u.dataTable)??!0,layerList:((i=t==null?void 0:t.ui)==null?void 0:i.layerList)??!0,schemaEditor:((m=t==null?void 0:t.ui)==null?void 0:m.schemaEditor)??!0,geojsonEditor:((a=t==null?void 0:t.ui)==null?void 0:a.geojsonEditor)??!0,geojsonEditorOpen:(((o=t==null?void 0:t.ui)==null?void 0:o.geojsonEditor)??!0)&&(((l=t==null?void 0:t.ui)==null?void 0:l.geojsonEditorOpen)??!1),settings:((p=t==null?void 0:t.ui)==null?void 0:p.settings)??!0,zoomToAll:((h=t==null?void 0:t.ui)==null?void 0:h.zoomToAll)??!0,zoomIndicator:((y=t==null?void 0:t.ui)==null?void 0:y.zoomIndicator)??!0,locateButton:((v=t==null?void 0:t.ui)==null?void 0:v.locateButton)??!0,keyboardShortcuts:ut((L=t==null?void 0:t.ui)==null?void 0:L.keyboardShortcuts),layout:e},toolbar:{position:s&&ct[s]||"top-center",direction:((d=t==null?void 0:t.toolbar)==null?void 0:d.direction)??"horizontal"},units:{length:((b=t==null?void 0:t.units)==null?void 0:b.length)??"auto",area:((C=t==null?void 0:t.units)==null?void 0:C.area)??"auto",display:((M=t==null?void 0:t.units)==null?void 0:M.display)??"human",precision:((z=t==null?void 0:t.units)==null?void 0:z.precision)??2}}}const q=c.createContext(_()),Z=c.createContext({override:{},setUnits:()=>{},resetUnits:()=>{}}),k="elm_units",w=1;function F(t){return t==="metric"||t==="imperial"||t==="auto"}function pt(t){if(!t||typeof t!="object")return null;const e=t,s={};return F(e.length)&&(s.length=e.length),F(e.area)&&(s.area=e.area),(e.display==="human"||e.display==="raw")&&(s.display=e.display),typeof e.precision=="number"&&e.precision>=0&&e.precision<=6&&(s.precision=e.precision),s}function dt({config:t,children:e}){var y,v,L;const s=t==null?void 0:t.persistKey,r=t==null?void 0:t.persist,[n,u]=c.useState(()=>S.readPersisted(k,w,pt,{persistKey:s,persist:r})??{}),i=c.useCallback(d=>{u(b=>{const C=typeof d=="function"?d(b):{...b,...d};return S.writePersisted(k,w,C,{persistKey:s,persist:r}),C})},[s,r]),m=c.useCallback(()=>{u({}),S.writePersisted(k,w,{},{persistKey:s,persist:r})},[s,r]),a=JSON.stringify(t??null),o=c.useRef((y=t==null?void 0:t.network)==null?void 0:y.fetch);o.current=(v=t==null?void 0:t.network)==null?void 0:v.fetch;const l=!!((L=t==null?void 0:t.network)!=null&&L.fetch),p=c.useMemo(()=>{const d=_(t);return l&&(d.network={...d.network,fetch:(b,C)=>o.current(b,C)}),{...d,units:{length:n.length??d.units.length,area:n.area??d.units.area,display:n.display??d.units.display,precision:n.precision??d.units.precision}}},[a,n,l]),h=c.useMemo(()=>({override:n,setUnits:i,resetUnits:m}),[n,i,m]);return x.jsx(q.Provider,{value:p,children:x.jsx(Z.Provider,{value:h,children:e})})}function I(){return c.useContext(q)}function ht(){return c.useContext(Z)}const G=c.createContext(void 0);function j(t){return t?{"--elm-accent":t}:void 0}function yt(){const t=I().accentColor,e=c.useContext(B),s=c.useContext(G);return c.useMemo(()=>e||s?{...j(t),...e,...s}:j(t),[t,e,s])}function bt(t){const e=I().accentColor;c.useLayoutEffect(()=>{if(!t||!e)return;const s=t.closest("[data-elm-theme]")??t;if(s.style.getPropertyValue("--elm-accent")!==e)return s.style.setProperty("--elm-accent",e),()=>{s.style.getPropertyValue("--elm-accent")===e&&s.style.removeProperty("--elm-accent")}},[t,e])}exports.DEFAULT_LAYOUT=U;exports.ElementEditorConfigProvider=dt;exports.LAYOUT_SLOTS=T;exports.RootCssVarsContext=G;exports.RootTokensContext=B;exports.THEME_TOKENS=K;exports.TOOL_MODES=ot;exports.accentStyle=j;exports.applyRootTokens=rt;exports.isControlVisible=nt;exports.layoutGaps=mt;exports.readRootTokens=P;exports.resolveConfig=_;exports.resolveLayout=Y;exports.useAccentStyle=yt;exports.useApplyAccentToRoot=bt;exports.useElementEditorConfig=I;exports.useRootTokens=st;exports.useUnitsOverride=ht;exports.visibleLayoutEntries=at;exports.watchThemeInputs=V;exports.withLayout=it;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const n=require("react"),k=require("@element-editor/core"),C=require("@element-editor/core/internal"),U=require("./useAccentStyle-hsGvyHZc.cjs"),I=require("react/jsx-runtime"),me=require("zustand"),B=require("sonner"),ne=n.createContext("light"),ge=()=>n.useContext(ne),pe=n.createContext(null),he=n.createContext(null);function Oe({children:e}){const[t,s]=n.useState("light"),[a,c]=n.useState(void 0);return I.jsx(pe.Provider,{value:s,children:I.jsx(he.Provider,{value:c,children:I.jsx(ne.Provider,{value:t,children:I.jsx(U.RootTokensContext.Provider,{value:a,children:e})})})})}function Te(e){const t=n.useContext(pe),s=n.useContext(he),a=U.useRootTokens(s&&e?e.closest("[data-elm-theme]"):null);n.useLayoutEffect(()=>{s==null||s(a)},[s,a]),n.useLayoutEffect(()=>{if(!t||!e)return;const c=e.closest("[data-elm-theme]");if(!c){C.warnOnce("adapter-no-theme-root",'The map container is not inside an element with a `data-elm-theme` attribute, so the editor UI renders unstyled and keyboard shortcuts are off. Wrap the map and the editor UI in one element: <div data-elm-theme="light" style={{ position: \'relative\', height: 600 }}>…</div> ("dark" for dark mode).');return}const l=()=>t(c.getAttribute("data-elm-theme")==="dark"?"dark":"light");l();const u=new MutationObserver(l);return u.observe(c,{attributes:!0,attributeFilter:["data-elm-theme"]}),()=>u.disconnect()},[t,e])}const Fe={success:null,info:null,warning:null,error:null},Re="ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji",Ie={light:{"--normal-bg":"var(--elm-surface, #ffffff)","--normal-border":"var(--elm-border, rgb(0 0 0 / 0.1))","--normal-text":"var(--elm-text, #171717)"},dark:{"--normal-bg":"var(--elm-surface, #171717)","--normal-border":"var(--elm-border, rgb(255 255 255 / 0.1))","--normal-text":"var(--elm-text, #fafafa)"}},Ne={"--border-radius":"calc(var(--elm-radius-control, 6px) + 2px)",fontFamily:`var(--elm-font, ${Re})`},$e={light:"!text-(--elm-text-muted,#737373)",dark:"!text-(--elm-text-muted,#a3a3a3)"};function Se(e){var l,u,h;const t=ge(),s=U.useAccentStyle(),{toastOptions:a,style:c}=e;return I.jsx(B.Toaster,{theme:t,icons:Fe,...e,style:{...s,...Ie[t],...Ne,...c},toastOptions:{...a,classNames:{...a==null?void 0:a.classNames,toast:`!p-[11px] ${((l=a==null?void 0:a.classNames)==null?void 0:l.toast)??""}`,title:`!font-normal ${((u=a==null?void 0:a.classNames)==null?void 0:u.title)??""}`,description:`${$e[t]} ${((h=a==null?void 0:a.classNames)==null?void 0:h.description)??""}`}}})}const je=new Set(["feature:broken","selection:copied","selection:pasted","error","warning","success"]);function Ae(e){switch(e.type){case"feature:deleted":return`Deleted "${e.label}"`;case"features:deleted":return`Deleted ${e.count} features`;case"feature:duplicated":return`Duplicated "${e.label}"`;case"features:duplicated":return`Duplicated ${e.count} features`;case"feature:broken":return`Broken into ${e.count} features`;case"selection:copied":return"Selection copied";case"selection:pasted":return e.count===1?"Feature pasted":`${e.count} features pasted`;case"undo":return"Undone";case"redo":return"Redone";case"error":return e.message;case"warning":return e.message;case"success":return e.message;default:return null}}const J=n.createContext(null),ye=n.createContext(null);function Me({onEvent:e,onError:t,toaster:s=!1,children:a}){const c=n.useRef(e);c.current=e;const l=n.useRef(t);l.current=t;const u=n.useContext(J),h=n.useRef(u);h.current=u;const[y,T]=n.useState(""),b=n.useRef(!!e),w=n.useRef(!!u&&!e&&!s),N=n.useId(),d=s&&!b.current?`elm-toaster-${N}`:void 0,p=w.current?u==null?void 0:u.toasterId:d,_=b.current||w.current&&!!(u!=null&&u.managed),x=n.useCallback($=>{var A;let g=$;if($.type==="error"){const{cause:D,featureId:M,quiet:L,error:q,...v}=$,Z=q??new k.ElementEditorError(v.code,v.source,v.description?`${v.message}: ${v.description}`:v.message,{cause:D,featureId:M});let F;try{F=(A=l.current)==null?void 0:A.call(l,Z)}catch(G){console.error(G)}if(F===!1||L)return;g=typeof F=="string"?{...v,message:F,description:void 0}:{...v,error:Z}}if(w.current&&h.current){h.current.emit(g);return}if(g.type==="error"){const{error:D,...M}=g;g=M}const j=Ae(g);if(j&&(c.current||!je.has(g.type))&&(T(""),requestAnimationFrame(()=>T(j))),c.current){c.current(g);return}const E={toasterId:p,description:g.description};switch(g.type){case"feature:deleted":case"features:deleted":case"feature:duplicated":case"features:duplicated":break;case"feature:broken":B.toast.success(`Broken into ${g.count} features`,{...E,action:{label:"Undo",onClick:g.undo},duration:5e3});break;case"selection:copied":B.toast.success("Copied selection",E);break;case"selection:pasted":B.toast.success(g.count===1?"Pasted feature":`Pasted ${g.count} features`,E);break;case"undo":case"redo":break;case"error":B.toast.error(g.message,E);break;case"warning":B.toast.warning(g.message,E);break;case"success":B.toast.success(g.message,E);break}},[p]),P=n.useContext(ye);n.useEffect(()=>{if(P)return P(($,g)=>x({type:"error",code:$.code,source:$.source,message:$.message,error:$,quiet:g==null?void 0:g.quiet})),()=>P(null)},[P,x]);const z=n.useMemo(()=>({emit:x,managed:_,toasterId:p}),[x,_,p]);return I.jsxs(J.Provider,{value:z,children:[a,d&&I.jsx(Se,{id:d,position:"bottom-right"}),I.jsx("div",{"aria-live":"polite","aria-atomic":"true",role:"status",style:{position:"absolute",width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",border:0},children:y})]})}function be(){const e=n.useContext(J);if(!e)throw new Error("useEmit must be used within EventProvider");return e.emit}function Pe(){var e;return((e=n.useContext(J))==null?void 0:e.managed)??!1}function De(){var e;return(e=n.useContext(J))==null?void 0:e.toasterId}function Ge(){var e;return(e=n.useContext(J))==null?void 0:e.emit}const ee=new WeakSet,K=n.createContext(null);function Ue({children:e}){var y;const t=n.useRef(null),s=n.useRef(null),a=(y=n.useContext(J))==null?void 0:y.emit,c=n.useRef(a);c.current=a;const l=n.useCallback(T=>{s.current=T},[]),u=U.useElementEditorConfig(),h=u.ui.geojsonEditorOpen;if(!t.current){const T=(d,p)=>{s.current?s.current(d,p):c.current?c.current({type:"error",code:d.code,source:d.source,message:d.message,error:d,quiet:p==null?void 0:p.quiet}):p!=null&&p.quiet||B.toast.error(d.message)},b={persistKey:u.persistKey,persist:u.persist},w=k.createDataStore({onError:T,persist:b}),N=k.createUIStore(w,{onError:T,persist:b});if(h){N.setState({codeModalOpen:!0}),ee.add(N);const d=N.subscribe(p=>{p.codeModalOpen||(ee.delete(N),d())})}t.current={dataStore:w,uiStore:N}}return I.jsx(K.Provider,{value:t.current,children:I.jsx(ye.Provider,{value:l,children:e})})}function we(e){const t=n.useContext(K);if(!t)throw new Error("useDataStore must be used within GeoStoreProvider");return me.useStore(t.dataStore,e)}function W(e){const t=n.useContext(K);if(!t)throw new Error("useUIStore must be used within GeoStoreProvider");return me.useStore(t.uiStore,e)}function oe(){const e=n.useContext(K);if(!e)throw new Error("useGeoStore must be used within GeoStoreProvider");return e}const Ee=n.createContext({flyTo:null,panTo:null,fitBounds:null,getCenter:null,setZoom:null,getZoomBounds:null}),Ce=()=>{},te=n.createContext(Ce);function Je({children:e}){const[t,s]=n.useState({flyTo:null,panTo:null,fitBounds:null,getCenter:null,setZoom:null,getZoomBounds:null});return n.useContext(te)!==Ce?I.jsx(I.Fragment,{children:e}):I.jsx(te.Provider,{value:s,children:I.jsx(Ee.Provider,{value:t,children:e})})}function ae(){return n.useContext(Ee)}function Le(){return n.useContext(te)}function se(e,t="features.geojson"){const s=t.toLowerCase().endsWith(".geojson")?t:`${t}.geojson`,a=new Blob([e],{type:"application/geo+json"}),c=URL.createObjectURL(a),l=document.createElement("a");return l.href=c,l.download=s,l.rel="noopener",document.body.appendChild(l),l.click(),document.body.removeChild(l),URL.revokeObjectURL(c),{name:s,bytes:a.size}}async function Be(e,t="features.geojson"){const s=t.toLowerCase().endsWith(".geojson")?t:`${t}.geojson`,a=new Blob([e],{type:"application/geo+json"}),c=window;if(typeof c.showSaveFilePicker=="function")try{const l=await c.showSaveFilePicker({suggestedName:s,types:[{description:"GeoJSON",accept:{"application/geo+json":[".geojson",".json"]}}]}),u=await l.createWritable();return await u.write(a),await u.close(),{name:l.name||s,bytes:a.size}}catch(l){if(l instanceof Error&&l.name==="AbortError")return null}return se(e,t),null}async function _e(e,t,s){let a;try{a=await e.text()}catch(l){return{ok:!1,code:"unknown",reason:"The file could not be read",cause:l}}const c=k.parseGeoJSONText(a);if(!c.ok){const l=c.error;return l.kind==="too-large"?{ok:!1,code:"too-large",reason:`The file is over the ${Math.round(l.maxBytes/1024/1024)} MB import limit`}:l.kind==="invalid-json"?{ok:!1,code:"invalid-data",reason:`Not valid JSON (${l.cause.message})`,cause:l.cause}:{ok:!1,code:"invalid-data",reason:"Not a FeatureCollection"}}try{const{skipped:l,duplicates:u}=t(c.fc,"replace");return{ok:!0,count:s(),skipped:l,duplicates:u}}catch(l){return{ok:!1,code:"invalid-data",reason:l instanceof Error?l.message:"Not a FeatureCollection",cause:l}}}function qe(){const{dataStore:e,uiStore:t}=oe(),s=be(),{fitBounds:a}=ae();return n.useCallback(async c=>{if(t.getState().readonly)return;if(!/\.(geo)?json$/i.test(c.name)&&!/json/i.test(c.type)){s({type:"error",code:"invalid-data",source:"import",message:"Import failed",description:`${c.name} is not a .geojson or .json file`});return}const l=e.getState(),u=await _e(c,l.importGeoJSON,()=>e.getState().features.length);if(!u.ok){s({type:"error",code:u.code,source:"import",message:"Import failed",description:u.reason,cause:u.cause});return}const{features:h,schemas:y,groups:T}=e.getState(),b=k.getFeatureCollectionBBox({type:"FeatureCollection",metadata:{schemas:y,groups:T},features:h});b&&(a==null||a(b)),s({type:"success",message:`Loaded ${c.name}`,description:u.count===1?"1 feature":`${u.count} features`});const w=u.skipped+u.duplicates;w>0&&s({type:"warning",message:`Skipped ${w===1?"1 feature":`${w} features`} from ${c.name}`,description:[u.skipped>0&&`${u.skipped} with a missing or unsupported geometry`,u.duplicates>0&&`${u.duplicates} with a repeated id`].filter(Boolean).join(", ")})},[e,t,s,a])}const Ze=400,ve="https://nominatim.openstreetmap.org/search",ze='Geocoding by <a href="https://nominatim.org/" target="_blank" rel="noopener">Nominatim</a>';function He(e){return e instanceof k.ElementEditorError?e:e instanceof SyntaxError?new k.ElementEditorError("invalid-data","search","Search service sent an answer that could not be read. Try again later.",{cause:e}):new k.ElementEditorError("network","search","Search unavailable. Check your connection.",{cause:e})}function We(e){const t=C.httpErrorCode(e),s=t==="rate-limited"?"Too many searches — wait a moment and try again.":t==="busy"?"Search service is busy — try again in a moment.":`Search failed (HTTP ${e}). Try again later.`;return new k.ElementEditorError(t,"search",s)}function Ke(e){var _;const[t,s]=n.useState([]),[a,c]=n.useState(!1),[l,u]=n.useState(null),h=n.useRef(null),y=n.useRef(null),T=(_=n.useContext(J))==null?void 0:_.emit,b=n.useRef(T);b.current=T;const{network:w}=U.useElementEditorConfig(),N=n.useRef(w);N.current=w;const d=n.useRef(null);n.useEffect(()=>{const x=e.trim();if(x.length<2){s([]),c(!1),u(null);return}c(!0),u(null),y.current&&clearTimeout(y.current);const P=async()=>{var z,$;d.current=null,y.current&&clearTimeout(y.current),(z=h.current)==null||z.abort(),h.current=new AbortController;try{const{nominatim:g,fetch:j=fetch}=N.current,E=g||{},A=new URLSearchParams({q:x,format:"json",limit:"6",addressdetails:"0",polygon_geojson:"1",...E.email&&{email:E.email}}),D=E.url??ve,M=await j(`${D}${D.includes("?")?"&":"?"}${A}`,{signal:h.current.signal});if(!M.ok)throw We(M.status);const L=await M.json(),q=new Set,v=new Set,Z=L.filter(F=>{const G=`${F.lat},${F.lon}`;return q.has(F.display_name)||v.has(G)?!1:(q.add(F.display_name),v.add(G),!0)});s(Z),u(null)}catch(g){if(g instanceof Error&&g.name==="AbortError")return;const j=He(g);u(j.message),($=b.current)==null||$.call(b,{type:"error",code:j.code,source:"search",message:j.message,error:j,quiet:!0}),s([])}finally{c(!1)}};return d.current=P,y.current=setTimeout(P,Ze),()=>{d.current=null,y.current&&clearTimeout(y.current)}},[e]),n.useEffect(()=>()=>{var x;(x=h.current)==null||x.abort(),y.current&&clearTimeout(y.current)},[]);const p=n.useCallback(()=>{var x;(x=d.current)==null||x.call(d)},[]);return{results:t,loading:a,error:l,flush:p}}const ie=(e,t)=>Object.is(e,t)||Array.isArray(e)&&Array.isArray(t)&&e.length===t.length&&e.every((s,a)=>Object.is(s,t[a]));function ke(e,t){return[...e.routing===!1?["route"]:[],...e.nominatim===!1?["search"]:[],...e.overpass===!1&&t==="leaflet"?["picker"]:[]]}function H(e,t,s){const a=n.useRef({has:!1,value:e});a.current.has||(a.current={has:!0,value:e},e!==void 0&&!ie(s(),e)&&t(e)),n.useLayoutEffect(()=>{ie(a.current.value,e)||(a.current={has:!0,value:e},t(e))})}const Ve=["properties","geometry","schemaId","hidden"];function le(e,t){const s=e;if(!s||typeof s!="object")return C.warnOnce(`ref-${t}-patch`,`${t}: a patch must be an object; it was skipped.`),null;const a={};for(const c of Ve)s[c]!==void 0&&(a[c]=s[c]);return a.geometry!==void 0&&!k.isGeometry(a.geometry)?(C.warnOnce(`ref-${t}-geometry`,`${t}: patch.geometry is not a valid GeoJSON geometry; the patch was skipped.`),null):a.properties!==void 0&&(typeof a.properties!="object"||a.properties===null||Array.isArray(a.properties))?(C.warnOnce(`ref-${t}-properties`,`${t}: patch.properties must be an object; the patch was skipped.`),null):a}function Q(e,t){C.warnOnce(`ref-${e}-unknown`,`${e}: no feature with id ${t.slice(0,3).map(s=>JSON.stringify(s)).join(", ")}${t.length>3?", …":""}; skipped.`)}function re(e){const{_validation:t,...s}=e;return s}function Ye(e,t){const s=new Map(e.features.map(u=>[u.id,u])),a=new Set(e.groups.filter(u=>u.hidden).map(u=>u.id)),c=[],l=[];for(const u of new Set(t)){const h=s.get(u);h&&!h.hidden&&!(h.groupId&&a.has(h.groupId))?c.push(h):l.push(u)}return{keep:c,dropped:l}}function Qe(e){const t=e;return(t==null?void 0:t.type)==="Feature"?{type:"FeatureCollection",features:[t]}:t}const Xe=Object.fromEntries(Object.entries(U.TOOL_MODES).map(([e,t])=>[t,e])),X=e=>Xe[e]??null;function de(e){const t=new Map(e.schemas.map(c=>[c.id,c])),s=e.schemas[0]??e.getDefaultSchema(),a={};for(const c of e.features){const l=c.schemaId&&t.get(c.schemaId)||s,u=k.validateFeature(c,l).errors;u.length>0&&(a[c.id]=u)}return a}function fe(e){return{type:"FeatureCollection",metadata:{schemas:e.schemas,groups:e.groups},features:e.features.map(re)}}const et=e=>e.features.length===0&&e.undoStack.length===0&&e.redoStack.length===0;function tt(e,t){if(e===t)return!0;const s=e==null?void 0:e.features,a=t==null?void 0:t.features;return!Array.isArray(s)||!Array.isArray(a)?!1:s===a||s.length===a.length&&s.every((c,l)=>{var u;return(c==null?void 0:c.id)===((u=a[l])==null?void 0:u.id)})}function rt(e){const{initialData:t,schema:s,onChange:a,onSubmit:c,onValidationError:l,onFeatureAdd:u,onFeatureUpdate:h,onFeatureDelete:y,onSelectionChange:T,onFeatureSelect:b,onZoomChange:w,onToolChange:N}=e,{dataStore:d,uiStore:p}=oe(),_=W(r=>r.setReadonly),x=W(r=>r.setEnabledTools),P=we(r=>r.setMaxFeatures),z=W(r=>r.setLayout),$=W(r=>r.setUnavailableTools),{network:g}=U.useElementEditorConfig(),j=ae(),E=n.useRef(j);E.current=j;const A=n.useRef(!1),D=n.useRef({});D.current={onChange:a,onFeatureAdd:u,onFeatureUpdate:h,onFeatureDelete:y,onSelectionChange:T},n.useEffect(()=>k.subscribeToDataChanges(d,()=>A.current?{onSelectionChange:D.current.onSelectionChange}:D.current),[d]),H(e.readonly,r=>_(r??!1),()=>p.getState().readonly),H(e.tools,r=>x(r??null),()=>p.getState().enabledTools),H(e.maxFeatures,P,()=>d.getState().maxFeatures),H(e.layout,r=>z(r??"panel"),()=>p.getState().layout),H(e.engine&&ke(g,e.engine),r=>$(r??[]),()=>p.getState().unavailableTools),n.useEffect(()=>{s&&d.setState(r=>r.schemas.find(o=>o.id===s.id)?r:{schemas:[...r.schemas,s]})},[s,d]);const M=(r,o)=>{o!==0&&p.getState().reportError(new k.ElementEditorError("invalid-data","import",`${o} feature${o===1?"":"s"} in ${r} had no usable geometry (null or an unknown type) and ${o===1?"was":"were"} left out.`))},L=n.useRef(!1),q=n.useRef(t),v=n.useRef(e.onInitialDataApplied);v.current=e.onInitialDataApplied;const Z=(r,o)=>{var f;const i=Qe(r);A.current=!0;try{const{skipped:m}=d.getState().importGeoJSON(i,"replace",{undoable:!1});A.current=!1,M("initialData",m),L.current=d.getState().features.length>0,(f=v.current)==null||f.call(v,i,o)}catch(m){const S=`initialData is not a valid FeatureCollection (${m instanceof Error?m.message:String(m)}). The editor started empty.`;console.error(`[element-editor] ${S}`),p.getState().reportError(new k.ElementEditorError("invalid-data","import",S,{cause:m}))}finally{A.current=!1}};n.useEffect(()=>{t&&Z(t,!1)},[]),n.useEffect(()=>{const r=q.current;if(tt(r,t)||(q.current=t,!t&&!L.current))return;if(t&&!L.current&&et(d.getState())){Z(t,!0);return}const o=L.current||!t;C.warnOnce(o?"initialData-changed":"initialData-after-edit",o?"`initialData` changed after the editor loaded its data; the change was ignored (`initialData` is the starting data). To replace the data, call `ref.current.setFeatureCollection(data, { silent: true })`, or remount the editor with a new `key` (e.g. key={projectId}).":"`initialData` arrived after the user started editing; it was ignored so their edits are kept. Render the editor once the data is there, call `ref.current.setFeatureCollection(data, { silent: true })`, or remount it with a new `key`.")},[t]);const F=n.useRef(c),G=n.useRef(l),V=n.useRef(w),ce=n.useRef(b);n.useEffect(()=>{F.current=c},[c]),n.useEffect(()=>{G.current=l},[l]),n.useEffect(()=>{V.current=w},[w]),n.useEffect(()=>{ce.current=b},[b]),n.useEffect(()=>d.subscribe((r,o)=>{var i;r.currentZoom!==o.currentZoom&&((i=V.current)==null||i.call(V,r.currentZoom))}),[d]),n.useEffect(()=>d.subscribe((r,o)=>{const i=ce.current;if(!i)return;const f=r.selectedIds.length===1?r.selectedIds[0]:null,m=o.selectedIds.length===1?o.selectedIds[0]:null,S=f?r.features.find(O=>O.id===f)??null:null,R=m?o.features.find(O=>O.id===m)??null:null;S!==R&&i(S)}),[d]);const Y=n.useRef(N);return Y.current=N,n.useEffect(()=>p.subscribe((r,o)=>{var f;if(r.editingMode===o.editingMode)return;const i=X(r.editingMode);i!==X(o.editingMode)&&((f=Y.current)==null||f.call(Y,i))}),[p]),n.useMemo(()=>({getFeatureCollection:()=>fe(d.getState()),getFeature:r=>{const o=d.getState().features.find(i=>i.id===r);return o?re(o):null},setFeatureCollection:(r,o)=>{A.current=!!(o!=null&&o.silent);try{const{skipped:i}=d.getState().importGeoJSON(r,"replace",{undoable:(o==null?void 0:o.undoable)!==!1});M("the data passed to setFeatureCollection",i)}finally{A.current=!1}},exportGeoJSON:()=>d.getState().exportGeoJSON(),exportAs:r=>{r==="geojson"&&se(d.getState().exportGeoJSON())},importGeoJSON:(r,o="replace")=>d.getState().importGeoJSON(r,o),updateFeatures:(r,o)=>{if(!Array.isArray(r)){C.warnOnce("ref-updateFeatures-array","updateFeatures: expected an array of { id, patch }.");return}const i=d.getState(),f=new Set(i.features.map(R=>R.id)),m=[],S=[];for(const R of r){const O=le(R==null?void 0:R.patch,"updateFeatures");if(O){if(!f.has(R.id)){S.push(String(R.id));continue}m.push({id:R.id,patch:O})}}S.length&&Q("updateFeatures",S),m.length&&i.updateFeatures(m,{undoable:(o==null?void 0:o.undoable)??!0})},addFeature:(r,o)=>{const i=r;if(!i||typeof i!="object"||!k.isGeometry(i.geometry))return C.warnOnce("ref-addFeature-geometry","addFeature: the feature needs a valid GeoJSON geometry; nothing was added."),null;const f=d.getState(),m=i.id!==void 0&&i.id!==null&&String(i.id)!==""?String(i.id):crypto.randomUUID();if(f.features.some(xe=>xe.id===m))return C.warnOnce("ref-addFeature-duplicate",`addFeature: a feature with id ${JSON.stringify(m)} already exists; nothing was added.`),null;const{_validation:S,bbox:R,...O}=i,ue=f.addFeature({...O,type:"Feature",id:m,properties:i.properties??{}},{programmatic:!0,undoable:o==null?void 0:o.undoable});return ue&&re(ue)},updateFeature:(r,o,i)=>{const f=le(o,"updateFeature");if(!f)return!1;const m=d.getState();return m.features.some(S=>S.id===r)?(m.updateFeatures([{id:r,patch:f}],{undoable:(i==null?void 0:i.undoable)??!0}),!0):(Q("updateFeature",[String(r)]),!1)},removeFeatures:(r,o)=>{if(!Array.isArray(r))return C.warnOnce("ref-removeFeatures-array","removeFeatures: expected an array of ids."),0;const i=d.getState(),f=new Set(i.features.map(S=>S.id)),m=r.filter(S=>!f.has(S));return m.length&&Q("removeFeatures",m.map(String)),i.deleteFeatures(r,{undoable:o==null?void 0:o.undoable})},getSelection:()=>[...d.getState().selectedIds],select:(r,o)=>{var S,R;if(!Array.isArray(r)){C.warnOnce("ref-select-array","select: expected an array of feature ids.");return}const i=d.getState(),{keep:f,dropped:m}=Ye(i,r);if(m.length&&C.warnOnce("ref-select-dropped",`select: left out ${m.slice(0,3).map(O=>JSON.stringify(O)).join(", ")}${m.length>3?", …":""}: unknown ids or hidden features (a group id isn't selectable; select its features).`),f.length===0?i.clearSelection():f.length===1?i.selectFeature(f[0].id):i.setSelection(f.map(O=>O.id)),o!=null&&o.fit&&f.length>0){const O=k.getFeatureCollectionBBox({type:"FeatureCollection",features:f});O&&((R=(S=E.current).fitBounds)==null||R.call(S,O))}},setTool:r=>{const o=p.getState();if(r===null)return o.setEditingMode("none"),!0;const i=r!=="search"&&Object.prototype.hasOwnProperty.call(U.TOOL_MODES,r)?U.TOOL_MODES[r]:null;return i?o.readonly&&r!=="measure"?(C.warnOnce("ref-setTool-readonly",`setTool(${JSON.stringify(r)}): the editor is readonly; only 'measure' is available.`),!1):o.isToolAvailable(r)?o.editingMode===i?!0:r!=="measure"&&!d.getState().canAddFeatures(1)?!1:(o.setEditingMode(i),!0):(C.warnOnce(`ref-setTool-disabled-${r}`,`setTool: ${JSON.stringify(r)} is not in the \`tools\` list${o.unavailableTools.includes(r)?" (config.network turns it off)":""}.`),!1):(C.warnOnce(`ref-setTool-${String(r)}`,`setTool: ${JSON.stringify(r)} is not a drawing tool${r==="search"?" (search is a box in the toolbar, not a tool)":""}.`),!1)},getTool:()=>X(p.getState().editingMode),canUndo:()=>d.getState().undoStack.length>0,canRedo:()=>d.getState().redoStack.length>0,validate:()=>{const r=de(d.getState());return{valid:Object.keys(r).length===0,errors:r}},getMap:()=>{var r,o;return((o=(r=E.current).getMap)==null?void 0:o.call(r))??null},flyTo:(r,o)=>{var f,m;const i=C.normalizeFlyToTarget(r,o);i&&((m=(f=E.current).flyTo)==null||m.call(f,[i.center[1],i.center[0]],i.zoom))},setZoom:r=>{const o=E.current.setZoom;return o?(o(r),!0):!1},fitBounds:r=>{var o,i;return(i=(o=E.current).fitBounds)==null?void 0:i.call(o,r)},submit:()=>{var i,f;const r=d.getState(),o=de(r);return Object.keys(o).length>0?((i=G.current)==null||i.call(G,o),!1):((f=F.current)==null||f.call(F,fe(r)),!0)},undo:()=>d.getState().undo(),redo:()=>d.getState().redo(),clearSelection:()=>d.getState().clearSelection()}),[d,p])}exports.ElementToaster=Se;exports.EventContext=J;exports.EventProvider=Me;exports.GeoStoreProvider=Ue;exports.MapControllerProvider=Je;exports.NOMINATIM_ATTRIBUTION=ze;exports.NOMINATIM_URL=ve;exports.StoreContext=K;exports.ThemeContext=ne;exports.ThemeReportingProvider=Oe;exports.inspectorOpenedOnLoad=ee;exports.networkUnavailableTools=ke;exports.saveGeoJSONFile=Be;exports.triggerGeoJSONDownload=se;exports.useAdapterControls=rt;exports.useDataStore=we;exports.useEmit=be;exports.useGeoJSONFileImport=qe;exports.useGeoStore=oe;exports.useIsManaged=Pe;exports.useMapController=ae;exports.useNominatim=Ke;exports.useOptionalEmit=Ge;exports.useReportThemeFromRoot=Te;exports.useSetMapController=Le;exports.useTheme=ge;exports.useToasterId=De;exports.useUIStore=W;
|