@open-pioneer/feature-editing 1.3.0-dev.20260422120518 → 1.3.0-dev.20260519140411

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/CHANGELOG.md CHANGED
@@ -1,7 +1,11 @@
1
1
  # @open-pioneer/feature-editing
2
2
 
3
- ## 1.3.0-dev.20260422120518
3
+ ## 1.3.0-dev.20260519140411
4
4
 
5
5
  ### Minor Changes
6
6
 
7
7
  - d3e137d: Initial release
8
+
9
+ ### Patch Changes
10
+
11
+ - 0704cd6: Use `classnames` from `@open-pioneer/react-utils` instead of `classnames` package.
package/README.md CHANGED
@@ -15,6 +15,7 @@ It supports creating, modifying, and deleting features with declarative form con
15
15
  - **Undo/redo**: Built-in support for geometry editing history
16
16
 
17
17
  The Editing works with all vector layer sources and can therefore be used with any layer type that supports feature selection, such as `GeoJSON`, `WFS`, or `OGC API Features`.
18
+ To save feature edits, a `FeatureWriter` ([see below](#FeatureWriter)) has to be implemented.
18
19
  As the package does not manage feature storage or how changes are applied to the map, it fits a wide range of data management strategies and provides full flexibility to the using app.
19
20
 
20
21
  ## Usage
@@ -261,6 +262,8 @@ function useEditingSetup(map: MapModel) {
261
262
  The editor does not manage the lifetime of any features in the map, except for the feature currently being edited.
262
263
  To persist changes made by the editor, you must implement the `FeatureWriter` interface.
263
264
 
265
+ Note: there is currently no prepared FeatureWriter implementation for `WFS` or `OGC API Features` services available.
266
+
264
267
  The interface is flexible enough to work in many scenarios:
265
268
 
266
269
  - Transient client side state (e.g. an in-memory collection used for a `VectorSource`)
@@ -1,3 +1,4 @@
1
+ import { type FormatNumberOptions } from "@formatjs/intl";
1
2
  import type { BaseFieldConfig } from "./BaseFieldConfig";
2
3
  /**
3
4
  * Configuration for a checkbox field.
@@ -87,7 +88,7 @@ export interface NumberFieldConfig extends BaseFieldConfig {
87
88
  * `maximumFractionDigits`, `style`, `currency`, etc. Use this to control how the number
88
89
  * is displayed to the user (e.g., as currency, percentage, or with specific decimal places).
89
90
  */
90
- readonly formatOptions?: Intl.NumberFormatOptions;
91
+ readonly formatOptions?: FormatNumberOptions;
91
92
  /**
92
93
  * Increment/decrement step size when using stepper buttons.
93
94
  *
@@ -1 +1 @@
1
- {"version":3,"file":"NumberFieldControl.js","sources":["NumberFieldControl.tsx"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { NumberInput, type NumberInputValueChangeDetails } from \"@chakra-ui/react\";\nimport { useEvent } from \"@open-pioneer/react-utils\";\nimport { useIntl } from \"open-pioneer:react-hooks\";\nimport { useCallback, useEffect, useRef, useState, type ReactElement } from \"react\";\nimport type { NumberFieldConfig } from \"../../../api/fields/standardFieldConfigs\";\n\ninterface NumberFieldControlProps {\n readonly value: number | undefined;\n readonly field: NumberFieldConfig;\n readonly onChange: (newNumber: number | undefined) => void;\n}\n\n// This component allows its value to be specified as a number. The value is still stored as a\n// string internally to allow non-numeric characters (such as '-', '.', or 'e') to be entered.\nexport function NumberFieldControl({\n value,\n field,\n onChange\n}: NumberFieldControlProps): ReactElement {\n const formatNumber = useFormatNumber(field.formatOptions);\n const [stringValue, setStringValue] = useState(() => formatNumber(value));\n const setNumericValue = useNumericState(value, field.formatOptions, setStringValue);\n\n const onValueChange = useEvent(({ value, valueAsNumber }: NumberInputValueChangeDetails) => {\n setStringValue(value);\n if (!isNaN(valueAsNumber)) {\n setNumericValue(valueAsNumber);\n onChange?.(valueAsNumber);\n } else if (value === \"\") {\n setNumericValue(undefined);\n onChange?.(undefined);\n }\n });\n\n const element = useRef<HTMLInputElement>(null);\n\n return (\n <NumberInput.Root\n value={stringValue ?? \"\"}\n min={field.min}\n max={field.max}\n step={field.step}\n formatOptions={field.formatOptions}\n onValueChange={onValueChange}\n >\n <NumberInput.Input ref={element} placeholder={field.placeholder ?? field.label} />\n {field.showSteppers && <NumberInput.Control />}\n </NumberInput.Root>\n );\n}\n\n// Additionally store the state as a number to be able to react to outside changes of 'value'.\nfunction useNumericState(\n value: number | undefined,\n formatOptions: Intl.NumberFormatOptions | undefined,\n setStringValue: (newValue: string | undefined) => void\n) {\n const [numericValue, setNumericValue] = useState(value);\n const formatNumber = useFormatNumber(formatOptions);\n\n useEffect(() => {\n if (value !== numericValue) {\n const stringValue = formatNumber(value);\n setStringValue(stringValue);\n setNumericValue(value);\n }\n }, [formatNumber, numericValue, setStringValue, value]);\n\n return setNumericValue;\n}\n\nfunction useFormatNumber(formatOptions: Intl.NumberFormatOptions | undefined) {\n const { formatNumber } = useIntl();\n\n return useCallback(\n (number: number | undefined) => {\n if (number != null) {\n return formatNumber(number, { maximumFractionDigits: 20, ...formatOptions });\n } else {\n return undefined;\n }\n },\n [formatNumber, formatOptions]\n );\n}\n"],"names":["value"],"mappings":";;;;;;AAgBO,SAAS,kBAAA,CAAmB;AAAA,EAC/B,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACJ,CAAA,EAA0C;AACtC,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,KAAA,CAAM,aAAa,CAAA;AACxD,EAAA,MAAM,CAAC,aAAa,cAAc,CAAA,GAAI,SAAS,MAAM,YAAA,CAAa,KAAK,CAAC,CAAA;AACxE,EAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,KAAA,EAAO,KAAA,CAAM,eAAe,cAAc,CAAA;AAElF,EAAA,MAAM,gBAAgB,QAAA,CAAS,CAAC,EAAE,KAAA,EAAAA,MAAAA,EAAO,eAAc,KAAqC;AACxF,IAAA,cAAA,CAAeA,MAAK,CAAA;AACpB,IAAA,IAAI,CAAC,KAAA,CAAM,aAAa,CAAA,EAAG;AACvB,MAAA,eAAA,CAAgB,aAAa,CAAA;AAC7B,MAAA,QAAA,GAAW,aAAa,CAAA;AAAA,IAC5B,CAAA,MAAA,IAAWA,WAAU,EAAA,EAAI;AACrB,MAAA,eAAA,CAAgB,MAAS,CAAA;AACzB,MAAA,QAAA,GAAW,MAAS,CAAA;AAAA,IACxB;AAAA,EACJ,CAAC,CAAA;AAED,EAAA,MAAM,OAAA,GAAU,OAAyB,IAAI,CAAA;AAE7C,EAAA,uBACI,IAAA;AAAA,IAAC,WAAA,CAAY,IAAA;AAAA,IAAZ;AAAA,MACG,OAAO,WAAA,IAAe,EAAA;AAAA,MACtB,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,eAAe,KAAA,CAAM,aAAA;AAAA,MACrB,aAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,WAAA,CAAY,OAAZ,EAAkB,GAAA,EAAK,SAAS,WAAA,EAAa,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,KAAA,EAAO,CAAA;AAAA,QAC/E,KAAA,CAAM,YAAA,oBAAgB,GAAA,CAAC,WAAA,CAAY,SAAZ,EAAoB;AAAA;AAAA;AAAA,GAChD;AAER;AAGA,SAAS,eAAA,CACL,KAAA,EACA,aAAA,EACA,cAAA,EACF;AACE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,YAAA,GAAe,gBAAgB,aAAa,CAAA;AAElD,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,UAAU,YAAA,EAAc;AACxB,MAAA,MAAM,WAAA,GAAc,aAAa,KAAK,CAAA;AACtC,MAAA,cAAA,CAAe,WAAW,CAAA;AAC1B,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACzB;AAAA,EACJ,GAAG,CAAC,YAAA,EAAc,YAAA,EAAc,cAAA,EAAgB,KAAK,CAAC,CAAA;AAEtD,EAAA,OAAO,eAAA;AACX;AAEA,SAAS,gBAAgB,aAAA,EAAqD;AAC1E,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,OAAA,EAAQ;AAEjC,EAAA,OAAO,WAAA;AAAA,IACH,CAAC,MAAA,KAA+B;AAC5B,MAAA,IAAI,UAAU,IAAA,EAAM;AAChB,QAAA,OAAO,aAAa,MAAA,EAAQ,EAAE,uBAAuB,EAAA,EAAI,GAAG,eAAe,CAAA;AAAA,MAC/E,CAAA,MAAO;AACH,QAAA,OAAO,MAAA;AAAA,MACX;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,cAAc,aAAa;AAAA,GAChC;AACJ;;;;"}
1
+ {"version":3,"file":"NumberFieldControl.js","sources":["NumberFieldControl.tsx"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { NumberInput, type NumberInputValueChangeDetails } from \"@chakra-ui/react\";\nimport { type FormatNumberOptions } from \"@formatjs/intl\";\nimport { useEvent } from \"@open-pioneer/react-utils\";\nimport { useIntl } from \"open-pioneer:react-hooks\";\nimport { useCallback, useEffect, useRef, useState, type ReactElement } from \"react\";\nimport type { NumberFieldConfig } from \"../../../api/fields/standardFieldConfigs\";\n\ninterface NumberFieldControlProps {\n readonly value: number | undefined;\n readonly field: NumberFieldConfig;\n readonly onChange: (newNumber: number | undefined) => void;\n}\n\n// This component allows its value to be specified as a number. The value is still stored as a\n// string internally to allow non-numeric characters (such as '-', '.', or 'e') to be entered.\nexport function NumberFieldControl({\n value,\n field,\n onChange\n}: NumberFieldControlProps): ReactElement {\n const formatNumber = useFormatNumber(field.formatOptions);\n const [stringValue, setStringValue] = useState(() => formatNumber(value));\n const setNumericValue = useNumericState(value, field.formatOptions, setStringValue);\n\n const onValueChange = useEvent(({ value, valueAsNumber }: NumberInputValueChangeDetails) => {\n setStringValue(value);\n if (!isNaN(valueAsNumber)) {\n setNumericValue(valueAsNumber);\n onChange?.(valueAsNumber);\n } else if (value === \"\") {\n setNumericValue(undefined);\n onChange?.(undefined);\n }\n });\n\n const element = useRef<HTMLInputElement>(null);\n\n return (\n <NumberInput.Root\n value={stringValue ?? \"\"}\n min={field.min}\n max={field.max}\n step={field.step}\n formatOptions={field.formatOptions}\n onValueChange={onValueChange}\n >\n <NumberInput.Input ref={element} placeholder={field.placeholder ?? field.label} />\n {field.showSteppers && <NumberInput.Control />}\n </NumberInput.Root>\n );\n}\n\n// Additionally store the state as a number to be able to react to outside changes of 'value'.\nfunction useNumericState(\n value: number | undefined,\n formatOptions: FormatNumberOptions | undefined,\n setStringValue: (newValue: string | undefined) => void\n) {\n const [numericValue, setNumericValue] = useState(value);\n const formatNumber = useFormatNumber(formatOptions);\n\n useEffect(() => {\n if (value !== numericValue) {\n const stringValue = formatNumber(value);\n setStringValue(stringValue);\n setNumericValue(value);\n }\n }, [formatNumber, numericValue, setStringValue, value]);\n\n return setNumericValue;\n}\n\nfunction useFormatNumber(formatOptions: FormatNumberOptions | undefined) {\n const { formatNumber } = useIntl();\n\n return useCallback(\n (number: number | undefined) => {\n if (number != null) {\n return formatNumber(number, { maximumFractionDigits: 20, ...formatOptions });\n } else {\n return undefined;\n }\n },\n [formatNumber, formatOptions]\n );\n}\n"],"names":["value"],"mappings":";;;;;;AAiBO,SAAS,kBAAA,CAAmB;AAAA,EAC/B,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACJ,CAAA,EAA0C;AACtC,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,KAAA,CAAM,aAAa,CAAA;AACxD,EAAA,MAAM,CAAC,aAAa,cAAc,CAAA,GAAI,SAAS,MAAM,YAAA,CAAa,KAAK,CAAC,CAAA;AACxE,EAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,KAAA,EAAO,KAAA,CAAM,eAAe,cAAc,CAAA;AAElF,EAAA,MAAM,gBAAgB,QAAA,CAAS,CAAC,EAAE,KAAA,EAAAA,MAAAA,EAAO,eAAc,KAAqC;AACxF,IAAA,cAAA,CAAeA,MAAK,CAAA;AACpB,IAAA,IAAI,CAAC,KAAA,CAAM,aAAa,CAAA,EAAG;AACvB,MAAA,eAAA,CAAgB,aAAa,CAAA;AAC7B,MAAA,QAAA,GAAW,aAAa,CAAA;AAAA,IAC5B,CAAA,MAAA,IAAWA,WAAU,EAAA,EAAI;AACrB,MAAA,eAAA,CAAgB,MAAS,CAAA;AACzB,MAAA,QAAA,GAAW,MAAS,CAAA;AAAA,IACxB;AAAA,EACJ,CAAC,CAAA;AAED,EAAA,MAAM,OAAA,GAAU,OAAyB,IAAI,CAAA;AAE7C,EAAA,uBACI,IAAA;AAAA,IAAC,WAAA,CAAY,IAAA;AAAA,IAAZ;AAAA,MACG,OAAO,WAAA,IAAe,EAAA;AAAA,MACtB,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,eAAe,KAAA,CAAM,aAAA;AAAA,MACrB,aAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,WAAA,CAAY,OAAZ,EAAkB,GAAA,EAAK,SAAS,WAAA,EAAa,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,KAAA,EAAO,CAAA;AAAA,QAC/E,KAAA,CAAM,YAAA,oBAAgB,GAAA,CAAC,WAAA,CAAY,SAAZ,EAAoB;AAAA;AAAA;AAAA,GAChD;AAER;AAGA,SAAS,eAAA,CACL,KAAA,EACA,aAAA,EACA,cAAA,EACF;AACE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,YAAA,GAAe,gBAAgB,aAAa,CAAA;AAElD,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,UAAU,YAAA,EAAc;AACxB,MAAA,MAAM,WAAA,GAAc,aAAa,KAAK,CAAA;AACtC,MAAA,cAAA,CAAe,WAAW,CAAA;AAC1B,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACzB;AAAA,EACJ,GAAG,CAAC,YAAA,EAAc,YAAA,EAAc,cAAA,EAAgB,KAAK,CAAC,CAAA;AAEtD,EAAA,OAAO,eAAA;AACX;AAEA,SAAS,gBAAgB,aAAA,EAAgD;AACrE,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,OAAA,EAAQ;AAEjC,EAAA,OAAO,WAAA;AAAA,IACH,CAAC,MAAA,KAA+B;AAC5B,MAAA,IAAI,UAAU,IAAA,EAAM;AAChB,QAAA,OAAO,aAAa,MAAA,EAAQ,EAAE,uBAAuB,EAAA,EAAI,GAAG,eAAe,CAAA;AAAA,MAC/E,CAAA,MAAO;AACH,QAAA,OAAO,MAAA;AAAA,MACX;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,cAAc,aAAa;AAAA,GAChC;AACJ;;;;"}
@@ -8,6 +8,8 @@ class PropertyFormContextClass {
8
8
  const entries = PropertyFormContextClass.getPropertyEntries(modificationStep.feature);
9
9
  this.propertiesMap = reactiveMap(entries);
10
10
  }
11
+ modificationStep;
12
+ callbacks;
11
13
  propertiesMap;
12
14
  isValidSignal = reactive(false);
13
15
  getPropertiesAsObject() {
@@ -1 +1 @@
1
- {"version":3,"file":"PropertyFormContext.js","sources":["PropertyFormContext.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { reactive, reactiveMap, type ReactiveMap } from \"@conterra/reactivity-core\";\nimport type { Layer } from \"@open-pioneer/map\";\n\nimport type { Feature } from \"ol\";\nimport { createContext } from \"react\";\n\nimport type { Mode, PropertyFormContext } from \"../../api/editor/context\";\nimport type { ModificationStep } from \"../../api/model/EditingStep\";\nimport type { FeatureTemplate } from \"../../api/model/FeatureTemplate\";\nimport { EditingCallbacks } from \"../editor/useEditingCallbacks\";\n\nexport class PropertyFormContextClass implements PropertyFormContext {\n private readonly propertiesMap: ReactiveMap<string, unknown>;\n private readonly isValidSignal = reactive(false);\n\n constructor(\n private readonly modificationStep: ModificationStep,\n readonly callbacks: EditingCallbacks\n ) {\n const entries = PropertyFormContextClass.getPropertyEntries(modificationStep.feature);\n this.propertiesMap = reactiveMap(entries);\n }\n\n getPropertiesAsObject(): Record<string, unknown> {\n const entries = this.properties.entries();\n return Object.fromEntries(entries);\n }\n\n get feature(): Feature {\n return this.editingStep.feature;\n }\n\n get mode(): Mode {\n return this.editingStep.id === \"creation\" ? \"create\" : \"update\";\n }\n\n get editingStep(): ModificationStep {\n return this.modificationStep;\n }\n\n get properties(): ReactiveMap<string, unknown> {\n return this.propertiesMap;\n }\n\n get isValid(): boolean {\n return this.isValidSignal.value;\n }\n\n set isValid(value: boolean) {\n this.isValidSignal.value = value;\n }\n\n get template(): FeatureTemplate | undefined {\n return this.editingStep.id === \"creation\" ? this.editingStep.template : undefined;\n }\n\n get layer(): Layer | undefined {\n return this.editingStep.id === \"update\" ? this.editingStep.layer : undefined;\n }\n\n private static getPropertyEntries(feature: Feature): [string, unknown][] {\n const properties = feature.getProperties();\n const geometryName = feature.getGeometryName();\n return Object.entries(properties).filter(([key, _]) => key !== geometryName);\n }\n}\n\nexport const PropertyFormContextObject = createContext<PropertyFormContextClass | undefined>(\n undefined\n);\n"],"names":[],"mappings":";;;AAaO,MAAM,wBAAA,CAAwD;AAAA,EAIjE,WAAA,CACqB,kBACR,SAAA,EACX;AAFmB,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACR,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAET,IAAA,MAAM,OAAA,GAAU,wBAAA,CAAyB,kBAAA,CAAmB,gBAAA,CAAiB,OAAO,CAAA;AACpF,IAAA,IAAA,CAAK,aAAA,GAAgB,YAAY,OAAO,CAAA;AAAA,EAC5C;AAAA,EATiB,aAAA;AAAA,EACA,aAAA,GAAgB,SAAS,KAAK,CAAA;AAAA,EAU/C,qBAAA,GAAiD;AAC7C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,OAAA,EAAQ;AACxC,IAAA,OAAO,MAAA,CAAO,YAAY,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,IAAI,OAAA,GAAmB;AACnB,IAAA,OAAO,KAAK,WAAA,CAAY,OAAA;AAAA,EAC5B;AAAA,EAEA,IAAI,IAAA,GAAa;AACb,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,EAAA,KAAO,UAAA,GAAa,QAAA,GAAW,QAAA;AAAA,EAC3D;AAAA,EAEA,IAAI,WAAA,GAAgC;AAChC,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EAChB;AAAA,EAEA,IAAI,UAAA,GAA2C;AAC3C,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EAChB;AAAA,EAEA,IAAI,OAAA,GAAmB;AACnB,IAAA,OAAO,KAAK,aAAA,CAAc,KAAA;AAAA,EAC9B;AAAA,EAEA,IAAI,QAAQ,KAAA,EAAgB;AACxB,IAAA,IAAA,CAAK,cAAc,KAAA,GAAQ,KAAA;AAAA,EAC/B;AAAA,EAEA,IAAI,QAAA,GAAwC;AACxC,IAAA,OAAO,KAAK,WAAA,CAAY,EAAA,KAAO,UAAA,GAAa,IAAA,CAAK,YAAY,QAAA,GAAW,MAAA;AAAA,EAC5E;AAAA,EAEA,IAAI,KAAA,GAA2B;AAC3B,IAAA,OAAO,KAAK,WAAA,CAAY,EAAA,KAAO,QAAA,GAAW,IAAA,CAAK,YAAY,KAAA,GAAQ,MAAA;AAAA,EACvE;AAAA,EAEA,OAAe,mBAAmB,OAAA,EAAuC;AACrE,IAAA,MAAM,UAAA,GAAa,QAAQ,aAAA,EAAc;AACzC,IAAA,MAAM,YAAA,GAAe,QAAQ,eAAA,EAAgB;AAC7C,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,GAAA,EAAK,CAAC,CAAA,KAAM,GAAA,KAAQ,YAAY,CAAA;AAAA,EAC/E;AACJ;AAEO,MAAM,yBAAA,GAA4B,aAAA;AAAA,EACrC;AACJ;;;;"}
1
+ {"version":3,"file":"PropertyFormContext.js","sources":["PropertyFormContext.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { reactive, reactiveMap, type ReactiveMap } from \"@conterra/reactivity-core\";\nimport type { Layer } from \"@open-pioneer/map\";\n\nimport type { Feature } from \"ol\";\nimport { createContext } from \"react\";\n\nimport type { Mode, PropertyFormContext } from \"../../api/editor/context\";\nimport type { ModificationStep } from \"../../api/model/EditingStep\";\nimport type { FeatureTemplate } from \"../../api/model/FeatureTemplate\";\nimport { EditingCallbacks } from \"../editor/useEditingCallbacks\";\n\nexport class PropertyFormContextClass implements PropertyFormContext {\n private readonly propertiesMap: ReactiveMap<string, unknown>;\n private readonly isValidSignal = reactive(false);\n\n constructor(\n private readonly modificationStep: ModificationStep,\n readonly callbacks: EditingCallbacks\n ) {\n const entries = PropertyFormContextClass.getPropertyEntries(modificationStep.feature);\n this.propertiesMap = reactiveMap(entries);\n }\n\n getPropertiesAsObject(): Record<string, unknown> {\n const entries = this.properties.entries();\n return Object.fromEntries(entries);\n }\n\n get feature(): Feature {\n return this.editingStep.feature;\n }\n\n get mode(): Mode {\n return this.editingStep.id === \"creation\" ? \"create\" : \"update\";\n }\n\n get editingStep(): ModificationStep {\n return this.modificationStep;\n }\n\n get properties(): ReactiveMap<string, unknown> {\n return this.propertiesMap;\n }\n\n get isValid(): boolean {\n return this.isValidSignal.value;\n }\n\n set isValid(value: boolean) {\n this.isValidSignal.value = value;\n }\n\n get template(): FeatureTemplate | undefined {\n return this.editingStep.id === \"creation\" ? this.editingStep.template : undefined;\n }\n\n get layer(): Layer | undefined {\n return this.editingStep.id === \"update\" ? this.editingStep.layer : undefined;\n }\n\n private static getPropertyEntries(feature: Feature): [string, unknown][] {\n const properties = feature.getProperties();\n const geometryName = feature.getGeometryName();\n return Object.entries(properties).filter(([key, _]) => key !== geometryName);\n }\n}\n\nexport const PropertyFormContextObject = createContext<PropertyFormContextClass | undefined>(\n undefined\n);\n"],"names":[],"mappings":";;;AAaO,MAAM,wBAAA,CAAwD;AAAA,EAIjE,WAAA,CACqB,kBACR,SAAA,EACX;AAFmB,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACR,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAET,IAAA,MAAM,OAAA,GAAU,wBAAA,CAAyB,kBAAA,CAAmB,gBAAA,CAAiB,OAAO,CAAA;AACpF,IAAA,IAAA,CAAK,aAAA,GAAgB,YAAY,OAAO,CAAA;AAAA,EAC5C;AAAA,EALqB,gBAAA;AAAA,EACR,SAAA;AAAA,EALI,aAAA;AAAA,EACA,aAAA,GAAgB,SAAS,KAAK,CAAA;AAAA,EAU/C,qBAAA,GAAiD;AAC7C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,OAAA,EAAQ;AACxC,IAAA,OAAO,MAAA,CAAO,YAAY,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,IAAI,OAAA,GAAmB;AACnB,IAAA,OAAO,KAAK,WAAA,CAAY,OAAA;AAAA,EAC5B;AAAA,EAEA,IAAI,IAAA,GAAa;AACb,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,EAAA,KAAO,UAAA,GAAa,QAAA,GAAW,QAAA;AAAA,EAC3D;AAAA,EAEA,IAAI,WAAA,GAAgC;AAChC,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EAChB;AAAA,EAEA,IAAI,UAAA,GAA2C;AAC3C,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EAChB;AAAA,EAEA,IAAI,OAAA,GAAmB;AACnB,IAAA,OAAO,KAAK,aAAA,CAAc,KAAA;AAAA,EAC9B;AAAA,EAEA,IAAI,QAAQ,KAAA,EAAgB;AACxB,IAAA,IAAA,CAAK,cAAc,KAAA,GAAQ,KAAA;AAAA,EAC/B;AAAA,EAEA,IAAI,QAAA,GAAwC;AACxC,IAAA,OAAO,KAAK,WAAA,CAAY,EAAA,KAAO,UAAA,GAAa,IAAA,CAAK,YAAY,QAAA,GAAW,MAAA;AAAA,EAC5E;AAAA,EAEA,IAAI,KAAA,GAA2B;AAC3B,IAAA,OAAO,KAAK,WAAA,CAAY,EAAA,KAAO,QAAA,GAAW,IAAA,CAAK,YAAY,KAAA,GAAQ,MAAA;AAAA,EACvE;AAAA,EAEA,OAAe,mBAAmB,OAAA,EAAuC;AACrE,IAAA,MAAM,UAAA,GAAa,QAAQ,aAAA,EAAc;AACzC,IAAA,MAAM,YAAA,GAAe,QAAQ,eAAA,EAAgB;AAC7C,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,GAAA,EAAK,CAAC,CAAA,KAAM,GAAA,KAAQ,YAAY,CAAA;AAAA,EAC/E;AACJ;AAEO,MAAM,yBAAA,GAA4B,aAAA;AAAA,EACrC;AACJ;;;;"}
@@ -13,6 +13,9 @@ class EditingController {
13
13
  this.layerFactory = layerFactory;
14
14
  this.tooltipMessages = tooltipMessages;
15
15
  }
16
+ mapModel;
17
+ layerFactory;
18
+ tooltipMessages;
16
19
  currentInteractions = [];
17
20
  snappingSources = [];
18
21
  interactionOptions = {};
@@ -1 +1 @@
1
- {"version":3,"file":"EditingController.js","sources":["EditingController.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { LayerFactory, MapModel } from \"@open-pioneer/map\";\nimport type { Vector as VectorSource } from \"ol/source\";\nimport type { InteractionOptions } from \"../../../api/model/InteractionOptions\";\nimport { BaseInteraction } from \"../interactions/BaseInteraction\";\nimport { DoubleClickInteraction } from \"../interactions/DoubleClickInteraction\";\nimport { DrawingInteraction, type DrawingParameters } from \"../interactions/DrawingInteraction\";\nimport { HighlightingInteraction } from \"../interactions/HighlightingInteraction\";\nimport { KeyboardInteraction } from \"../interactions/KeyboardInteraction\";\nimport {\n ModificationInteraction,\n type ModificationParameters\n} from \"../interactions/ModificationInteraction\";\nimport {\n SelectionInteraction,\n type SelectionParameters\n} from \"../interactions/SelectionInteraction\";\nimport { SnappingInteraction } from \"../interactions/SnappingInteraction\";\nimport { DrawingSession } from \"./DrawingSession\";\nimport type { Type as GeometryType } from \"ol/geom/Geometry\";\nimport { ReactNode } from \"react\";\n\ntype StartDrawingFeatureOptions = Required<\n Omit<DrawingParameters, \"tracker\" | \"layerFactory\" | \"tooltipMessages\">\n>;\ntype StartSelectingFeatureOptions = Pick<SelectionParameters, \"layers\" | \"completionHandler\">;\ntype StartModifyingFeatureOptions = Pick<ModificationParameters, \"feature\" | \"drawLayer\">;\n\nexport interface TooltipMessages {\n getSelectionMessage(): ReactNode;\n getDrawingMessages(): Map<GeometryType, ReactNode>;\n getModificationMessages(): Map<string, ReactNode>;\n}\n\nexport class EditingController {\n private currentInteractions: BaseInteraction<unknown, unknown>[] = [];\n private snappingSources: VectorSource[] = [];\n private interactionOptions: InteractionOptions = {};\n\n readonly drawingSession = new DrawingSession();\n\n constructor(\n private readonly mapModel: MapModel,\n private readonly layerFactory: LayerFactory,\n private readonly tooltipMessages: TooltipMessages\n ) {}\n\n startDrawingFeature({\n geometryType,\n drawingOptions,\n completionHandler\n }: StartDrawingFeatureOptions): void {\n this.replaceInteractions(\n new DrawingInteraction(this.mapModel, {\n geometryType,\n tracker: this.drawingSession,\n drawingOptions: { ...this.interactionOptions.drawingOptions, ...drawingOptions },\n completionHandler,\n layerFactory: this.layerFactory,\n tooltipMessages: this.tooltipMessages\n }),\n new KeyboardInteraction(this.mapModel, {\n actions: this.drawingSession\n }),\n new SnappingInteraction(this.mapModel, {\n snappingSources: this.snappingSources,\n snappingOptions: this.interactionOptions.snappingOptions\n }),\n new DoubleClickInteraction(this.mapModel)\n );\n }\n\n startSelectingFeature({ layers, completionHandler }: StartSelectingFeatureOptions): void {\n this.replaceInteractions(\n new SelectionInteraction(this.mapModel, {\n layers,\n selectionOptions: this.interactionOptions.selectionOptions,\n completionHandler,\n tooltipMessages: this.tooltipMessages\n })\n );\n }\n\n startModifyingFeature({ feature, drawLayer }: StartModifyingFeatureOptions): void {\n this.replaceInteractions(\n new ModificationInteraction(this.mapModel, {\n feature,\n drawLayer,\n modificationOptions: this.interactionOptions.modificationOptions,\n tooltipMessages: this.tooltipMessages\n }),\n new HighlightingInteraction(this.mapModel, {\n feature,\n highlightOptions: this.interactionOptions.highlightingOptions\n }),\n new SnappingInteraction(this.mapModel, {\n snappingSources: this.snappingSources,\n snappingOptions: this.interactionOptions.snappingOptions\n })\n );\n }\n\n setSnappingSources(sources: VectorSource[] | undefined): void {\n this.snappingSources = sources ?? [];\n }\n\n setInteractionOptions(options: InteractionOptions): void {\n this.interactionOptions = options;\n }\n\n stopCurrentInteractions(): void {\n this.currentInteractions.forEach((interaction) => {\n interaction.stop();\n });\n this.currentInteractions = [];\n }\n\n private replaceInteractions(...interactions: BaseInteraction<unknown, unknown>[]): void {\n this.stopCurrentInteractions();\n this.currentInteractions = interactions;\n this.currentInteractions.forEach((interaction) => {\n interaction.start();\n });\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EditingController.js","sources":["EditingController.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { LayerFactory, MapModel } from \"@open-pioneer/map\";\nimport type { Vector as VectorSource } from \"ol/source\";\nimport type { InteractionOptions } from \"../../../api/model/InteractionOptions\";\nimport { BaseInteraction } from \"../interactions/BaseInteraction\";\nimport { DoubleClickInteraction } from \"../interactions/DoubleClickInteraction\";\nimport { DrawingInteraction, type DrawingParameters } from \"../interactions/DrawingInteraction\";\nimport { HighlightingInteraction } from \"../interactions/HighlightingInteraction\";\nimport { KeyboardInteraction } from \"../interactions/KeyboardInteraction\";\nimport {\n ModificationInteraction,\n type ModificationParameters\n} from \"../interactions/ModificationInteraction\";\nimport {\n SelectionInteraction,\n type SelectionParameters\n} from \"../interactions/SelectionInteraction\";\nimport { SnappingInteraction } from \"../interactions/SnappingInteraction\";\nimport { DrawingSession } from \"./DrawingSession\";\nimport type { Type as GeometryType } from \"ol/geom/Geometry\";\nimport { ReactNode } from \"react\";\n\ntype StartDrawingFeatureOptions = Required<\n Omit<DrawingParameters, \"tracker\" | \"layerFactory\" | \"tooltipMessages\">\n>;\ntype StartSelectingFeatureOptions = Pick<SelectionParameters, \"layers\" | \"completionHandler\">;\ntype StartModifyingFeatureOptions = Pick<ModificationParameters, \"feature\" | \"drawLayer\">;\n\nexport interface TooltipMessages {\n getSelectionMessage(): ReactNode;\n getDrawingMessages(): Map<GeometryType, ReactNode>;\n getModificationMessages(): Map<string, ReactNode>;\n}\n\nexport class EditingController {\n private currentInteractions: BaseInteraction<unknown, unknown>[] = [];\n private snappingSources: VectorSource[] = [];\n private interactionOptions: InteractionOptions = {};\n\n readonly drawingSession = new DrawingSession();\n\n constructor(\n private readonly mapModel: MapModel,\n private readonly layerFactory: LayerFactory,\n private readonly tooltipMessages: TooltipMessages\n ) {}\n\n startDrawingFeature({\n geometryType,\n drawingOptions,\n completionHandler\n }: StartDrawingFeatureOptions): void {\n this.replaceInteractions(\n new DrawingInteraction(this.mapModel, {\n geometryType,\n tracker: this.drawingSession,\n drawingOptions: { ...this.interactionOptions.drawingOptions, ...drawingOptions },\n completionHandler,\n layerFactory: this.layerFactory,\n tooltipMessages: this.tooltipMessages\n }),\n new KeyboardInteraction(this.mapModel, {\n actions: this.drawingSession\n }),\n new SnappingInteraction(this.mapModel, {\n snappingSources: this.snappingSources,\n snappingOptions: this.interactionOptions.snappingOptions\n }),\n new DoubleClickInteraction(this.mapModel)\n );\n }\n\n startSelectingFeature({ layers, completionHandler }: StartSelectingFeatureOptions): void {\n this.replaceInteractions(\n new SelectionInteraction(this.mapModel, {\n layers,\n selectionOptions: this.interactionOptions.selectionOptions,\n completionHandler,\n tooltipMessages: this.tooltipMessages\n })\n );\n }\n\n startModifyingFeature({ feature, drawLayer }: StartModifyingFeatureOptions): void {\n this.replaceInteractions(\n new ModificationInteraction(this.mapModel, {\n feature,\n drawLayer,\n modificationOptions: this.interactionOptions.modificationOptions,\n tooltipMessages: this.tooltipMessages\n }),\n new HighlightingInteraction(this.mapModel, {\n feature,\n highlightOptions: this.interactionOptions.highlightingOptions\n }),\n new SnappingInteraction(this.mapModel, {\n snappingSources: this.snappingSources,\n snappingOptions: this.interactionOptions.snappingOptions\n })\n );\n }\n\n setSnappingSources(sources: VectorSource[] | undefined): void {\n this.snappingSources = sources ?? [];\n }\n\n setInteractionOptions(options: InteractionOptions): void {\n this.interactionOptions = options;\n }\n\n stopCurrentInteractions(): void {\n this.currentInteractions.forEach((interaction) => {\n interaction.stop();\n });\n this.currentInteractions = [];\n }\n\n private replaceInteractions(...interactions: BaseInteraction<unknown, unknown>[]): void {\n this.stopCurrentInteractions();\n this.currentInteractions = interactions;\n this.currentInteractions.forEach((interaction) => {\n interaction.start();\n });\n }\n}\n"],"names":[],"mappings":"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"}
@@ -3,6 +3,8 @@ class BaseInteraction {
3
3
  this.mapModelInstance = mapModelInstance;
4
4
  this.parameters = parameters;
5
5
  }
6
+ mapModelInstance;
7
+ parameters;
6
8
  state = { type: "idle" };
7
9
  start() {
8
10
  if (this.state.type === "idle") {
@@ -1 +1 @@
1
- {"version":3,"file":"BaseInteraction.js","sources":["BaseInteraction.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport type { MapModel } from \"@open-pioneer/map\";\nimport type { Map } from \"ol\";\n\ntype EditingWorkflowState<T> = IdleState | ActiveState<T>;\n\ninterface IdleState {\n readonly type: \"idle\";\n}\n\ninterface ActiveState<T> {\n readonly type: \"active\";\n readonly data: T;\n}\n\nexport abstract class BaseInteraction<Params, Data> {\n private state: EditingWorkflowState<Data> = { type: \"idle\" };\n\n constructor(\n private readonly mapModelInstance: MapModel,\n private readonly parameters: Params\n ) {}\n\n start(): void {\n if (this.state.type === \"idle\") {\n const data = this.startInteraction(this.parameters);\n this.state = { type: \"active\", data };\n }\n }\n\n stop(): void {\n if (this.state.type === \"active\") {\n this.stopInteraction(this.state.data);\n this.state = { type: \"idle\" };\n }\n }\n\n protected get map(): Map {\n return this.mapModel.olMap;\n }\n\n protected get mapModel(): MapModel {\n return this.mapModelInstance;\n }\n\n protected abstract startInteraction(parameters: Params): Data;\n protected abstract stopInteraction(interactionData: Data): void;\n}\n"],"names":[],"mappings":"AAgBO,MAAe,eAAA,CAA8B;AAAA,EAGhD,WAAA,CACqB,kBACA,UAAA,EACnB;AAFmB,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAAA,EAClB;AAAA,EALK,KAAA,GAAoC,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,EAO3D,KAAA,GAAc;AACV,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AAC5B,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,UAAU,CAAA;AAClD,MAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK;AAAA,IACxC;AAAA,EACJ;AAAA,EAEA,IAAA,GAAa;AACT,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACpC,MAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IAChC;AAAA,EACJ;AAAA,EAEA,IAAc,GAAA,GAAW;AACrB,IAAA,OAAO,KAAK,QAAA,CAAS,KAAA;AAAA,EACzB;AAAA,EAEA,IAAc,QAAA,GAAqB;AAC/B,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EAChB;AAIJ;;;;"}
1
+ {"version":3,"file":"BaseInteraction.js","sources":["BaseInteraction.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport type { MapModel } from \"@open-pioneer/map\";\nimport type { Map } from \"ol\";\n\ntype EditingWorkflowState<T> = IdleState | ActiveState<T>;\n\ninterface IdleState {\n readonly type: \"idle\";\n}\n\ninterface ActiveState<T> {\n readonly type: \"active\";\n readonly data: T;\n}\n\nexport abstract class BaseInteraction<Params, Data> {\n private state: EditingWorkflowState<Data> = { type: \"idle\" };\n\n constructor(\n private readonly mapModelInstance: MapModel,\n private readonly parameters: Params\n ) {}\n\n start(): void {\n if (this.state.type === \"idle\") {\n const data = this.startInteraction(this.parameters);\n this.state = { type: \"active\", data };\n }\n }\n\n stop(): void {\n if (this.state.type === \"active\") {\n this.stopInteraction(this.state.data);\n this.state = { type: \"idle\" };\n }\n }\n\n protected get map(): Map {\n return this.mapModel.olMap;\n }\n\n protected get mapModel(): MapModel {\n return this.mapModelInstance;\n }\n\n protected abstract startInteraction(parameters: Params): Data;\n protected abstract stopInteraction(interactionData: Data): void;\n}\n"],"names":[],"mappings":"AAgBO,MAAe,eAAA,CAA8B;AAAA,EAGhD,WAAA,CACqB,kBACA,UAAA,EACnB;AAFmB,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAAA,EAClB;AAAA,EAFkB,gBAAA;AAAA,EACA,UAAA;AAAA,EAJb,KAAA,GAAoC,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,EAO3D,KAAA,GAAc;AACV,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AAC5B,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,UAAU,CAAA;AAClD,MAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK;AAAA,IACxC;AAAA,EACJ;AAAA,EAEA,IAAA,GAAa;AACT,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACpC,MAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IAChC;AAAA,EACJ;AAAA,EAEA,IAAc,GAAA,GAAW;AACrB,IAAA,OAAO,KAAK,QAAA,CAAS,KAAA;AAAA,EACzB;AAAA,EAEA,IAAc,QAAA,GAAqB;AAC/B,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EAChB;AAIJ;;;;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@open-pioneer/feature-editing",
4
- "version": "1.3.0-dev.20260422120518",
4
+ "version": "1.3.0-dev.20260519140411",
5
5
  "description": "Provides a component to create and edit feature geometries and properties.",
6
6
  "keywords": [
7
7
  "open-pioneer-trails"
@@ -14,19 +14,19 @@
14
14
  "directory": "src/packages/packages/feature-editing"
15
15
  },
16
16
  "dependencies": {
17
- "@chakra-ui/react": "^3.34.0",
18
- "@conterra/reactivity-core": "^0.8.2",
19
- "@open-pioneer/chakra-snippets": "4.6.0-dev.20260420101935",
20
- "@open-pioneer/core": "4.6.0-dev.20260420101935",
21
- "@open-pioneer/notifier": "4.6.0-dev.20260420101935",
22
- "@open-pioneer/react-utils": "4.6.0-dev.20260420101935",
23
- "@open-pioneer/reactivity": "4.6.0-dev.20260420101935",
24
- "@open-pioneer/runtime": "4.6.0-dev.20260420101935",
25
- "classnames": "^2.5.1",
26
- "react": "^19.2.5",
17
+ "@chakra-ui/react": "^3.35.0",
18
+ "@conterra/reactivity-core": "^0.8.5",
19
+ "@formatjs/intl": "^4.1.11",
20
+ "@open-pioneer/chakra-snippets": "4.6.0-dev.20260519125519",
21
+ "@open-pioneer/core": "4.6.0-dev.20260519125519",
22
+ "@open-pioneer/notifier": "4.6.0-dev.20260519125519",
23
+ "@open-pioneer/react-utils": "4.6.0-dev.20260519125519",
24
+ "@open-pioneer/reactivity": "4.6.0-dev.20260519125519",
25
+ "@open-pioneer/runtime": "4.6.0-dev.20260519125519",
26
+ "react": "^19.2.6",
27
27
  "ol": "^10.9.0",
28
28
  "react-icons": "^5.6.0",
29
- "@open-pioneer/map": "1.3.0-dev.20260422120518"
29
+ "@open-pioneer/map": "1.3.0-dev.20260519140411"
30
30
  },
31
31
  "exports": {
32
32
  "./package.json": "./package.json",
@@ -58,6 +58,6 @@
58
58
  ]
59
59
  },
60
60
  "properties": [],
61
- "packageFormatVersion": "1.0.0"
61
+ "packageFormatVersion": "1.0.1"
62
62
  }
63
63
  }