@defra/interactive-map 0.0.39-alpha → 0.0.40-alpha

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 (84) hide show
  1. package/dist/css/index.css +1 -1
  2. package/dist/esm/im-core.js +1 -1
  3. package/dist/esm/im-shell.js +1 -1
  4. package/dist/umd/im-core.js +1 -1
  5. package/dist/umd/index.js +1 -1
  6. package/docs/api.md +4 -4
  7. package/docs/plugins/draw.md +1 -1
  8. package/package.json +1 -1
  9. package/plugins/beta/map-styles/dist/esm/im-map-styles-plugin.js +1 -1
  10. package/plugins/beta/map-styles/dist/umd/im-map-styles-plugin.js +1 -1
  11. package/plugins/beta/map-styles/dist/umd/index.js +1 -1
  12. package/plugins/datasets/dist/esm/esriLayerAdapter.js +1 -1
  13. package/plugins/datasets/dist/esm/im-datasets-ml-adapter.js +1 -1
  14. package/plugins/datasets/dist/esm/im-datasets-plugin.js +1 -1
  15. package/plugins/datasets/dist/umd/im-datasets-esri-adapter.js +1 -1
  16. package/plugins/datasets/dist/umd/im-datasets-ml-adapter.js +1 -1
  17. package/plugins/datasets/dist/umd/im-datasets-plugin.js +1 -1
  18. package/plugins/datasets/src/adapters/esri/esriLayerAdapter.js +2 -3
  19. package/plugins/datasets/src/adapters/esri/registry/esriDataset.js +1 -1
  20. package/plugins/datasets/src/adapters/loadLayerAdapter.js +1 -1
  21. package/plugins/datasets/src/adapters/maplibre/maplibreLayerAdapter.js +1 -3
  22. package/plugins/datasets/src/adapters/maplibre/maplibreLayerAdapter.test.js +3 -3
  23. package/plugins/datasets/src/initialise/initialiseDatasets.js +0 -1
  24. package/plugins/datasets/src/registry/dataset.js +2 -3
  25. package/plugins/datasets/src/registry/datasetRegistry.js +0 -3
  26. package/plugins/datasets/src/registry/datasetRegistry.test.js +1 -1
  27. package/plugins/datasets/src/registry/globalDataset.js +0 -3
  28. package/plugins/draw/dist/esm/im-draw-ol-adapter.js +1 -1
  29. package/plugins/draw/dist/umd/im-draw-ol-adapter.js +1 -1
  30. package/plugins/draw/src/DrawInit.jsx +2 -2
  31. package/plugins/draw/src/adapters/maplibre/MaplibreDrawAdapter.js +1 -1
  32. package/plugins/draw/src/adapters/maplibre/modes/drawMode/pointerHandlers.js +1 -1
  33. package/plugins/draw/src/adapters/maplibre/modes/drawMode/pointerHandlers.test.js +1 -1
  34. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/keyboardHandlers.js +1 -1
  35. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/vertexOperations.js +3 -3
  36. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/vertexOperations.test.js +1 -1
  37. package/plugins/draw/src/adapters/maplibre/modes/editVertexMode.test.js +1 -1
  38. package/plugins/draw/src/adapters/openlayers/draw/DrawMode.js +1 -0
  39. package/plugins/draw/src/adapters/openlayers/draw/DrawMode.test.js +15 -1
  40. package/plugins/draw/src/adapters/openlayers/draw/drawInput.js +17 -3
  41. package/plugins/draw/src/adapters/openlayers/draw/drawInput.test.js +47 -3
  42. package/plugins/draw/src/adapters/openlayers/edit/EditMode.js +1 -1
  43. package/plugins/draw/src/adapters/openlayers/edit/EditMode.test.js +1 -1
  44. package/plugins/draw/src/adapters/openlayers/edit/keyboardHandler.test.js +1 -1
  45. package/plugins/draw/src/adapters/openlayers/edit/nudge.js +2 -2
  46. package/plugins/draw/src/adapters/openlayers/edit/nudge.test.js +2 -2
  47. package/plugins/draw/src/events.js +4 -4
  48. package/plugins/draw/src/events.test.js +1 -1
  49. package/plugins/interact/dist/esm/im-interact-plugin.js +1 -1
  50. package/plugins/interact/dist/umd/im-interact-plugin.js +1 -1
  51. package/plugins/interact/dist/umd/index.js +1 -1
  52. package/plugins/interact/src/hooks/useCrossHairVisibility.js +12 -4
  53. package/plugins/interact/src/hooks/useCrossHairVisibility.test.js +88 -1
  54. package/plugins/search/dist/esm/im-search-plugin.js +1 -1
  55. package/plugins/search/dist/umd/im-search-plugin.js +1 -1
  56. package/plugins/search/src/Search.jsx +5 -2
  57. package/sonar-project.properties +7 -1
  58. package/src/App/components/Attributions/Attributions.module.scss +10 -0
  59. package/src/App/components/Hints/Hints.jsx +7 -2
  60. package/src/App/components/KeyboardHelp/KeyboardHelp.jsx +2 -3
  61. package/src/App/components/KeyboardHelp/KeyboardHelp.test.jsx +3 -6
  62. package/src/App/components/{MoveControl/MoveControl.jsx → MoveControls/MoveControls.jsx} +10 -10
  63. package/src/App/components/{MoveControl/MoveControl.module.scss → MoveControls/MoveControls.module.scss} +24 -24
  64. package/src/App/components/{MoveControl/MoveControl.test.jsx → MoveControls/MoveControls.test.jsx} +48 -48
  65. package/src/App/components/Viewport/Viewport.jsx +9 -1
  66. package/src/App/components/Viewport/Viewport.test.jsx +11 -0
  67. package/src/App/initialiseApp.js +11 -8
  68. package/src/App/initialiseApp.test.js +15 -3
  69. package/src/App/layout/Layout.jsx +3 -1
  70. package/src/App/registry/keyboardShortcutRegistry.js +25 -13
  71. package/src/App/registry/keyboardShortcutRegistry.test.js +49 -32
  72. package/src/App/registry/pluginRegistry.js +1 -2
  73. package/src/App/registry/pluginRegistry.test.js +4 -3
  74. package/src/App/store/AppProvider.jsx +3 -2
  75. package/src/InteractiveMap/InteractiveMap.js +8 -2
  76. package/src/InteractiveMap/InteractiveMap.test.js +20 -3
  77. package/src/config/appConfig.js +17 -15
  78. package/src/config/appConfig.test.js +22 -22
  79. package/src/config/defaults.js +3 -1
  80. package/src/config/mergeConfig.js +7 -0
  81. package/src/config/mergeConfig.test.js +20 -0
  82. package/src/scss/main.scss +1 -1
  83. package/src/test-utils.js +5 -0
  84. package/src/types.js +14 -6
@@ -35,7 +35,7 @@ export const DrawInit = ({ appState, appConfig, mapState, pluginConfig, pluginSt
35
35
  isMounted = false
36
36
  mapProvider.draw?.remove()
37
37
  mapProvider.draw = null
38
- // Release MoveControl's D-pad if this plugin instance still held it.
38
+ // Release MoveControls' D-pad if this plugin instance still held it.
39
39
  mapProvider.activeMoveTarget = null
40
40
  }
41
41
  }, [mapState.isMapReady, appState.mode])
@@ -59,7 +59,7 @@ export const DrawInit = ({ appState, appConfig, mapState, pluginConfig, pluginSt
59
59
  // Keep the active draw/edit session in sync with the global interface type so
60
60
  // the touch offset target shows/hides, and the rubber band keeps following the
61
61
  // map, immediately when the input device changes mid-session (e.g. the user
62
- // starts drawing with the mouse then switches to touch and pans via MoveControl).
62
+ // starts drawing with the mouse then switches to touch and pans via MoveControls).
63
63
  useEffect(() => {
64
64
  if (!['edit_vertex', 'draw_polygon', 'draw_line'].includes(pluginState.mode) || !mapProvider.draw) {
65
65
  return undefined
@@ -215,7 +215,7 @@ export class MaplibreDrawAdapter {
215
215
  this._map.fire(CUSTOM_DRAW_EVENTS.UNDO)
216
216
  }
217
217
 
218
- // MoveControl's D-pad, routed here via mapProvider.activeMoveTarget (see
218
+ // MoveControls' D-pad, routed here via mapProvider.activeMoveTarget (see
219
219
  // events.js) once a vertex is selected. Bridged into the running edit mode the
220
220
  // same way setInterfaceType is, since the adapter has no direct reference to the
221
221
  // mode's live state.
@@ -17,7 +17,7 @@ export const createPointerHandlers = ({ ParentMode, getFeature, getCoords }) =>
17
17
  this.onMove(state, e)
18
18
  },
19
19
 
20
- // The global interface type (e.g. switching to touch and panning via MoveControl)
20
+ // The global interface type (e.g. switching to touch and panning via MoveControls)
21
21
  // can change mid-session without any touch/pointer/key event ever landing on the
22
22
  // map container, so this can't rely on onTouchStart/onPointerdown alone — refresh
23
23
  // the rubber band immediately rather than waiting for the next incidental 'move'.
@@ -44,7 +44,7 @@ describe('touch and pointer interface', () => {
44
44
  expect(marker.style.display).toBe('none')
45
45
  })
46
46
 
47
- test('draw.interfacetypechange (e.g. switching to touch and panning via MoveControl mid-session) updates the interface and refreshes the rubber band immediately', () => {
47
+ test('draw.interfacetypechange (e.g. switching to touch and panning via MoveControls mid-session) updates the interface and refreshes the rubber band immediately', () => {
48
48
  const { ctx, state } = setup(DrawPolygonMode)
49
49
  clickAt(ctx, state, 0, 0)
50
50
  ctx.map.fire('draw.interfacetypechange', { interfaceType: 'touch' })
@@ -106,7 +106,7 @@ export const keyboardHandlers = {
106
106
 
107
107
  // Resolve the destination coordinate for a keyboard nudge, applying or breaking
108
108
  // snap — delegates to the shared resolver (vertexOperations.js) also used by
109
- // MoveControl's nudgeVertexByDelta, so both snap identically.
109
+ // MoveControls' nudgeVertexByDelta, so both snap identically.
110
110
  _keyboardMoveTarget (state, e, currentCoord) {
111
111
  const [dx, dy] = ARROW_OFFSETS[e.key]
112
112
  return this.resolveSnapTarget(state, dx, dy, currentCoord, () => this.getNewCoord(state, e))
@@ -44,7 +44,7 @@ export const vertexOperations = {
44
44
  },
45
45
 
46
46
  // Explicit-delta counterpart to getOffset, driven by a unit direction vector and
47
- // MoveControl's own Precision toggle rather than a KeyboardEvent — used by
47
+ // MoveControls' own Precision toggle rather than a KeyboardEvent — used by
48
48
  // nudgeVertexByDelta below.
49
49
  getOffsetByDelta (coord, dx, dy, isLargeStep) {
50
50
  const pt = this.map.project(coord)
@@ -54,7 +54,7 @@ export const vertexOperations = {
54
54
 
55
55
  // Resolves the destination coordinate for a vertex nudge by (dx, dy) unit
56
56
  // direction, applying snap or breaking out of an already-active one — shared by
57
- // the keyboard arrow-key path (_keyboardMoveTarget) and MoveControl's
57
+ // the keyboard arrow-key path (_keyboardMoveTarget) and MoveControls'
58
58
  // explicit-delta path (nudgeVertexByDelta) so both snap identically. dx/dy are
59
59
  // only needed for the snap-escape offset; getCandidate computes the raw,
60
60
  // un-snapped destination the caller would otherwise have used.
@@ -83,7 +83,7 @@ export const vertexOperations = {
83
83
  },
84
84
 
85
85
  // Moves the selected vertex by an explicit (dx, dy) unit direction — the entry
86
- // point for MoveControl's D-pad (see mapProvider.activeMoveTarget in events.js),
86
+ // point for MoveControls' D-pad (see mapProvider.activeMoveTarget in events.js),
87
87
  // as opposed to moveVertexByKey's KeyboardEvent-driven path. Each call is treated
88
88
  // as one complete, undoable action (no held-key sequencing, since a button click
89
89
  // has no "held" state to batch the way arrow keys do) — but still honours snap
@@ -73,7 +73,7 @@ describe('vertexOperations', () => {
73
73
  expect(map._undoStack).toHaveLength(0)
74
74
  })
75
75
 
76
- test('nudgeVertexByDelta snaps to a nearby target, breaks out of an active snap, and falls back to the raw coord when snap is inactive — same as keyboard nudging (regression: MoveControl bypassed snap entirely before resolveSnapTarget was shared)', () => {
76
+ test('nudgeVertexByDelta snaps to a nearby target, breaks out of an active snap, and falls back to the raw coord when snap is inactive — same as keyboard nudging (regression: MoveControls bypassed snap entirely before resolveSnapTarget was shared)', () => {
77
77
  const { ctx, state, map } = createHarness()
78
78
  state.selectedVertexIndex = 1
79
79
  state.selectedVertexType = 'vertex'
@@ -99,7 +99,7 @@ describe('selection, scale and update events', () => {
99
99
  ctx.onInterfaceTypeChange({ ...state, selectedVertexIndex: -1 }, { interfaceType: 'mouse' })
100
100
  })
101
101
 
102
- test('draw.nudgevertex moves the selected vertex and repositions the touch target — the inbound bridge for MoveControl.mapProvider.activeMoveTarget', () => {
102
+ test('draw.nudgevertex moves the selected vertex and repositions the touch target — the inbound bridge for MoveControls.mapProvider.activeMoveTarget', () => {
103
103
  jest.useFakeTimers()
104
104
  const { state, map } = createHarness(POLYGON(), { interfaceType: 'touch', selectedVertexIndex: 0, selectedVertexType: 'vertex' })
105
105
  jest.runAllTimers() // flush onSetup's deferred initial touch-target positioning
@@ -172,6 +172,7 @@ const buildDrawInput = ({ drawInteraction, options, geometryType, getSketch, upd
172
172
  addVertexButtonId: options.addVertexButtonId,
173
173
  mapProvider: options.mapProvider,
174
174
  snap: options.snap,
175
+ crossHair: options.crossHair,
175
176
  onUndo: () => { drawInteraction.removeLastPoint(); updateVertexCount(); emitUndoValidation() },
176
177
  canFinish: () => canFinish(geometryType, getSketch()),
177
178
  canPlace: canPlaceVertex
@@ -187,6 +187,20 @@ describe('drawing lifecycle', () => {
187
187
  expect(typeof inputOptions.canPlace).toBe('function')
188
188
  })
189
189
 
190
+ test('drawInput receives the crossHair passed to the mode, so it can sync visibility itself', () => {
191
+ const map = createFakeMap()
192
+ const manager = createFakeManager()
193
+ manager.store = createFeatureStore()
194
+ const crossHair = { fixAtCenter: jest.fn(), hide: jest.fn() }
195
+ createDrawMode({
196
+ map,
197
+ manager,
198
+ options: { geometryType: 'Polygon', featureId: 'shape-1', properties: {}, container: null, snap: null, crossHair }
199
+ })
200
+ const inputOptions = createDrawInput.mock.calls.at(-1)[0].options
201
+ expect(inputOptions.crossHair).toBe(crossHair)
202
+ })
203
+
190
204
  test('a placement-vetoing path disables Add point; a legal one re-enables it', () => {
191
205
  const { emitted, interaction } = setup('Polygon')
192
206
  const sketch = polygonFeature([[0, 0], [5, 5], [0, 0]])
@@ -249,7 +263,7 @@ describe('drawing lifecycle', () => {
249
263
  expect(changed).toHaveBeenCalled()
250
264
  })
251
265
 
252
- test('setInterfaceType forwards to the draw input (e.g. DrawInit syncing MoveControl-driven interface changes mid-session)', () => {
266
+ test('setInterfaceType forwards to the draw input (e.g. DrawInit syncing MoveControls-driven interface changes mid-session)', () => {
253
267
  const { mode, input } = setup('Polygon')
254
268
  mode.setInterfaceType('touch')
255
269
  expect(input.setInterfaceType).toHaveBeenCalledWith('touch')
@@ -2,6 +2,16 @@ import { createVertexPlacement } from './vertexPlacement.js'
2
2
 
3
3
  const ARROW_KEYS = new Set(['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'])
4
4
 
5
+ // Mirrors DrawInit.jsx's fixAtCenter()/hide() gate, but reasserted on every interface-type transition this module detects — matching MapLibre's own onSetup/onInterfaceTypeChange redundancy.
6
+ const applyCrossHairVisibility = (crossHair, type) => {
7
+ if (!crossHair) { return }
8
+ if (['touch', 'keyboard'].includes(type)) {
9
+ crossHair.fixAtCenter()
10
+ } else {
11
+ crossHair.hide()
12
+ }
13
+ }
14
+
5
15
  const wireInputEvents = ({
6
16
  container, addVertexButtonId, olView, onUndo,
7
17
  getInterfaceType, setInterfaceType, clearLastCoord,
@@ -83,7 +93,7 @@ const wireInputEvents = ({
83
93
  * @returns {{ getInterfaceType: () => string, destroy: () => void }}
84
94
  */
85
95
  export const createDrawInput = ({ drawInteraction, options }) => {
86
- const { container, addVertexButtonId, mapProvider, snap, onUndo, canFinish, canPlace } = options
96
+ const { container, addVertexButtonId, mapProvider, snap, onUndo, canFinish, canPlace, crossHair } = options
87
97
  let interfaceType = options.interfaceType ?? 'mouse'
88
98
  const getInterfaceType = () => interfaceType
89
99
 
@@ -105,12 +115,15 @@ export const createDrawInput = ({ drawInteraction, options }) => {
105
115
  olView,
106
116
  onUndo,
107
117
  getInterfaceType,
108
- setInterfaceType: (t) => { interfaceType = t },
118
+ setInterfaceType: (t) => { interfaceType = t; applyCrossHairVisibility(crossHair, t) },
109
119
  clearLastCoord: placement.clearLastCoord,
110
120
  updateRubberbanding: placement.updateRubberbanding,
111
121
  placeVertex: placement.placeVertex
112
122
  })
113
123
 
124
+ // Sync on creation too (mirrors MapLibre's own onSetup), so the crosshair reflects the mode's starting interface type immediately.
125
+ applyCrossHairVisibility(crossHair, interfaceType)
126
+
114
127
  // change:center fires once when a keyboard pan animation starts; postrender tracks each frame.
115
128
  const onMapRender = () => {
116
129
  if (interfaceType !== 'mouse' && olView?.getAnimating()) {
@@ -122,11 +135,12 @@ export const createDrawInput = ({ drawInteraction, options }) => {
122
135
  return {
123
136
  getInterfaceType,
124
137
  // Called when the global interface type changes without any pointer/touch/key
125
- // event landing on the map container (e.g. panning via MoveControl after
138
+ // event landing on the map container (e.g. panning via MoveControls after
126
139
  // switching to touch) — refresh the rubber band immediately rather than
127
140
  // waiting for the next incidental change:center/postrender event.
128
141
  setInterfaceType (type) {
129
142
  interfaceType = type
143
+ applyCrossHairVisibility(crossHair, type)
130
144
  if (type !== 'mouse') {
131
145
  placement.updateRubberbanding()
132
146
  }
@@ -10,7 +10,7 @@ jest.mock('./vertexPlacement.js', () => ({
10
10
  }))
11
11
  }))
12
12
 
13
- const setup = (interfaceType = 'mouse') => {
13
+ const setup = (interfaceType = 'mouse', crossHair) => {
14
14
  const map = createFakeMap()
15
15
  const container = createContainer()
16
16
  const button = document.createElement('button')
@@ -19,13 +19,15 @@ const setup = (interfaceType = 'mouse') => {
19
19
  const onUndo = jest.fn()
20
20
  const input = createDrawInput({
21
21
  drawInteraction: { getMap: () => map },
22
- options: { container, addVertexButtonId: 'add-pt', interfaceType, mapProvider: {}, snap: null, onUndo }
22
+ options: { container, addVertexButtonId: 'add-pt', interfaceType, mapProvider: {}, snap: null, onUndo, crossHair }
23
23
  })
24
24
  const placement = createVertexPlacement.mock.results.at(-1).value
25
25
  liveInputs.push(input)
26
26
  return { map, view: map.getView(), container, button, input, placement, onUndo }
27
27
  }
28
28
 
29
+ const fakeCrossHair = () => ({ fixAtCenter: jest.fn(), hide: jest.fn() })
30
+
29
31
  const liveInputs = []
30
32
  afterEach(() => {
31
33
  liveInputs.splice(0).forEach((i) => i.destroy())
@@ -109,7 +111,7 @@ test('pointer moves and map pans update the rubber band except for the mouse int
109
111
  expect(mouse.placement.updateRubberbanding).not.toHaveBeenCalled()
110
112
  })
111
113
 
112
- test('setInterfaceType updates the interface and refreshes the rubber band immediately for non-mouse types, e.g. switching to touch and panning via MoveControl mid-session', () => {
114
+ test('setInterfaceType updates the interface and refreshes the rubber band immediately for non-mouse types, e.g. switching to touch and panning via MoveControls mid-session', () => {
113
115
  const { input, placement } = setup('mouse')
114
116
  input.setInterfaceType('touch')
115
117
  expect(input.getInterfaceType()).toBe('touch')
@@ -130,6 +132,48 @@ test('keyboard pan animations keep the rubber band anchored via postrender', ()
130
132
  expect(placement.updateRubberbanding).toHaveBeenCalledTimes(1)
131
133
  })
132
134
 
135
+ test('syncs the crosshair on creation to match the starting interface type', () => {
136
+ const touchCrossHair = fakeCrossHair()
137
+ setup('touch', touchCrossHair)
138
+ expect(touchCrossHair.fixAtCenter).toHaveBeenCalled()
139
+ expect(touchCrossHair.hide).not.toHaveBeenCalled()
140
+
141
+ const mouseCrossHair = fakeCrossHair()
142
+ setup('mouse', mouseCrossHair)
143
+ expect(mouseCrossHair.hide).toHaveBeenCalled()
144
+ expect(mouseCrossHair.fixAtCenter).not.toHaveBeenCalled()
145
+ })
146
+
147
+ test('shows the crosshair when a key press switches to keyboard, hides it when a mouse pointerdown switches back', () => {
148
+ const crossHair = fakeCrossHair()
149
+ const { container } = setup('mouse', crossHair)
150
+ expect(crossHair.hide).toHaveBeenCalledTimes(1) // initial sync at creation, starting interface is 'mouse'
151
+
152
+ container.focus()
153
+ key({ key: 'ArrowUp' })
154
+ expect(crossHair.fixAtCenter).toHaveBeenCalledTimes(1)
155
+
156
+ container.dispatchEvent(Object.assign(new Event('pointerdown'), { pointerType: 'mouse' }))
157
+ expect(crossHair.hide).toHaveBeenCalledTimes(2)
158
+ })
159
+
160
+ test('setInterfaceType syncs the crosshair the same way as a detected input change', () => {
161
+ const crossHair = fakeCrossHair()
162
+ const { input } = setup('mouse', crossHair)
163
+ expect(crossHair.hide).toHaveBeenCalledTimes(1) // initial sync at creation, starting interface is 'mouse'
164
+
165
+ input.setInterfaceType('touch')
166
+ expect(crossHair.fixAtCenter).toHaveBeenCalledTimes(1)
167
+
168
+ input.setInterfaceType('mouse')
169
+ expect(crossHair.hide).toHaveBeenCalledTimes(2)
170
+ })
171
+
172
+ test('tolerates a missing crosshair (e.g. edit_vertex mode, which does not supply one)', () => {
173
+ const { input } = setup('mouse')
174
+ expect(() => input.setInterfaceType('keyboard')).not.toThrow()
175
+ })
176
+
133
177
  test('destroy removes all listeners', () => {
134
178
  const { container, button, input, placement } = setup()
135
179
  input.destroy()
@@ -291,7 +291,7 @@ const buildModeApi = ({ manager, store, olFeature, originalFeatureStyle, selecti
291
291
 
292
292
  undo: actions.doUndo,
293
293
  deleteVertex: actions.doDeleteVertex,
294
- // MoveControl's D-pad, routed here via mapProvider.activeMoveTarget (see
294
+ // MoveControls' D-pad, routed here via mapProvider.activeMoveTarget (see
295
295
  // events.js) once a vertex is selected.
296
296
  nudgeSelectedVertex: parts.keyboardHandler.nudgeByDelta,
297
297
 
@@ -123,7 +123,7 @@ test('select via pointer, delete the vertex, then undo restores it', () => {
123
123
  mode.undo() // empty stack — no-op
124
124
  })
125
125
 
126
- test('nudgeSelectedVertex (MoveControl D-pad) moves the selected vertex and is undoable', () => {
126
+ test('nudgeSelectedVertex (MoveControls D-pad) moves the selected vertex and is undoable', () => {
127
127
  const { container, manager, mode, ring } = setup()
128
128
  container.dispatchEvent(domEvent('pointerdown', { pointerType: 'mouse', clientX: 100, clientY: 0 }))
129
129
  mode.nudgeSelectedVertex(1, 0, true)
@@ -33,7 +33,7 @@ afterEach(() => {
33
33
 
34
34
  const key = (type, props) => window.dispatchEvent(new KeyboardEvent(type, { cancelable: true, ...props }))
35
35
 
36
- test('nudgeByDelta (exposed for MoveControl) moves the selected vertex and reports it via onVertexMoved', () => {
36
+ test('nudgeByDelta (exposed for MoveControls) moves the selected vertex and reports it via onVertexMoved', () => {
37
37
  const { state, handler, onVertexMoved } = setup()
38
38
  Object.assign(state, { selectedVertexIndex: 1, selectedVertexType: 'vertex' })
39
39
  handler.nudgeByDelta(1, 0, true)
@@ -99,12 +99,12 @@ export const wireNudge = ({ map, snap, getState, setState, onInserted, onVertexM
99
99
  moveSelectedVertexBy(dx, dy)
100
100
  }
101
101
 
102
- // Explicit-delta counterpart to nudge(e) — the entry point for MoveControl's
102
+ // Explicit-delta counterpart to nudge(e) — the entry point for MoveControls'
103
103
  // D-pad (see mapProvider.activeMoveTarget in events.js). Unlike nudge(e)'s
104
104
  // held-key sequencing (undo pushed on keyup via keyMove, so repeated keydowns
105
105
  // while held batch into one undo step), each call here is one complete,
106
106
  // undoable action — a button click has no "held" state to batch. Midpoints
107
- // aren't handled here: MoveControl only claims the D-pad once a real vertex is
107
+ // aren't handled here: MoveControls only claims the D-pad once a real vertex is
108
108
  // selected (see buildVertexMoveTarget in events.js).
109
109
  const nudgeByDelta = (dx, dy, isLargeStep) => {
110
110
  const step = isLargeStep ? KEYBOARD.stepAmount : KEYBOARD.nudgeAmount
@@ -53,7 +53,7 @@ describe('nudging a vertex', () => {
53
53
  })
54
54
  })
55
55
 
56
- describe('nudgeByDelta (MoveControl D-pad)', () => {
56
+ describe('nudgeByDelta (MoveControls D-pad)', () => {
57
57
  test('moves the selected vertex by an explicit direction, scaled by isLargeStep, and reports the move for undo', () => {
58
58
  const { state, nudgeByDelta, olFeature, onVertexMoved } = setup()
59
59
  Object.assign(state, { selectedVertexIndex: 1, selectedVertexType: 'vertex' })
@@ -79,7 +79,7 @@ describe('nudgeByDelta (MoveControl D-pad)', () => {
79
79
  const { state, nudgeByDelta, onVertexMoved } = setup()
80
80
  nudgeByDelta(1, 0, true) // nothing selected
81
81
  Object.assign(state, { selectedVertexIndex: 4, selectedVertexType: 'midpoint' })
82
- nudgeByDelta(1, 0, true) // midpoint selected — MoveControl only claims a real vertex
82
+ nudgeByDelta(1, 0, true) // midpoint selected — MoveControls only claims a real vertex
83
83
  state.olFeature = null
84
84
  Object.assign(state, { selectedVertexIndex: 1, selectedVertexType: 'vertex' })
85
85
  nudgeByDelta(1, 0, true)
@@ -29,8 +29,8 @@ const createGeometryInvalidEmitter = (eventBus, hints) => (payload) => {
29
29
  if (payload.reason && !isIncompleteShape(payload.reason)) { hints.show(payload.reason) }
30
30
  }
31
31
 
32
- // Claims MoveControl's D-pad for the currently selected vertex — see the generic
33
- // mapProvider.activeMoveTarget contract (MoveControl.jsx). Any plugin could use
32
+ // Claims MoveControls' D-pad for the currently selected vertex — see the generic
33
+ // mapProvider.activeMoveTarget contract (MoveControls.jsx). Any plugin could use
34
34
  // this slot; the draw plugin is just its first consumer.
35
35
  const buildVertexMoveTarget = (draw) => ({
36
36
  move: (dx, dy, isLargeStep) => draw.nudgeSelectedVertex(dx, dy, isLargeStep),
@@ -38,7 +38,7 @@ const buildVertexMoveTarget = (draw) => ({
38
38
  })
39
39
 
40
40
  // Vertex-selection handlers: sync pluginState.selectedVertexIndex, and claim/release
41
- // MoveControl's D-pad via buildVertexMoveTarget above.
41
+ // MoveControls' D-pad via buildVertexMoveTarget above.
42
42
  const createVertexSelectionHandlers = ({ draw, pluginState, mapProvider, eventBus }) => ({
43
43
  onVertexSelection: (e) => {
44
44
  pluginState.dispatch({ type: 'SET_SELECTED_VERTEX_INDEX', payload: e })
@@ -226,7 +226,7 @@ export function attachEvents ({ appState, appConfig, mapState, pluginState, mapP
226
226
  const resetState = () => {
227
227
  pluginState.dispatch({ type: 'SET_MODE', payload: null })
228
228
  pluginState.dispatch({ type: 'SET_FEATURE', payload: { feature: null, tempFeature: null } })
229
- // Release MoveControl's D-pad back to panning the map whenever a draw/edit
229
+ // Release MoveControls' D-pad back to panning the map whenever a draw/edit
230
230
  // session ends — a stale claim here would silently hijack it for good.
231
231
  mapProvider.activeMoveTarget = null
232
232
  }
@@ -172,7 +172,7 @@ describe('draw event handlers', () => {
172
172
  expect(() => drawHandler(draw, 'cancel')()).not.toThrow()
173
173
  })
174
174
 
175
- test('vertexselection dispatches, emits, and claims mapProvider.activeMoveTarget for MoveControl', () => {
175
+ test('vertexselection dispatches, emits, and claims mapProvider.activeMoveTarget for MoveControls', () => {
176
176
  const { draw, dispatch, eventBus, mapProvider } = setup()
177
177
  drawHandler(draw, 'vertexselection')({ index: 2 })
178
178
  expect(dispatch).toHaveBeenCalledWith({ type: 'SET_SELECTED_VERTEX_INDEX', payload: { index: 2 } })
@@ -1 +1 @@
1
- import e from"@babel/runtime/helpers/defineProperty";import"@babel/runtime/helpers/objectWithoutProperties";import{useContext as t,createContext as r,useState as n,useCallback as o,useRef as i,useEffect as a,useMemo as l}from"preact/compat";import{jsxs as s,jsx as c}from"preact/jsx-runtime";import"@babel/runtime/helpers/asyncToGenerator";var u={APP_ADD_MARKER:"app:addmarker",APP_UPDATE_MARKER:"app:updatemarker",APP_REMOVE_MARKER:"app:removemarker",APP_SET_MODE:"app:setmode",APP_REVERT_MODE:"app:revertmode",APP_ADD_BUTTON:"app:addbutton",APP_TOGGLE_BUTTON_STATE:"app:togglebuttonstate",APP_ADD_PANEL:"app:addpanel",APP_REMOVE_PANEL:"app:removepanel",APP_SHOW_PANEL:"app:showpanel",APP_HIDE_PANEL:"app:hidepanel",APP_ADD_CONTROL:"app:addcontrol",APP_SHOW_HINT:"app:showhint",APP_DISMISS_HINT:"app:dismisshint",APP_READY:"app:ready",APP_OPENED:"app:opened",APP_CLOSED:"app:closed",APP_FULLSCREEN_CHANGE:"app:fullscreenchange",APP_PANEL_OPENED:"app:panelopened",APP_PANEL_CLOSED:"app:panelclosed",MAP_SET_STYLE:"map:setstyle",MAP_SET_SIZE:"map:setsize",MAP_SET_FEATURES:"map:setfeatures",MAP_SET_ACTIVE_FEATURE:"map:setactivefeature",MAP_SELECT_FEATURE:"map:selectfeature",MAP_SET_PIXEL_RATIO:"map:setpixelratio",MAP_FIT_TO_BOUNDS:"map:fittobounds",MAP_SET_VIEW:"map:setview",MAP_INIT_MAP_STYLES:"map:initmapstyles",MAP_STYLE_CHANGE:"map:stylechange",MAP_LOADED:"map:loaded",MAP_READY:"map:ready",MAP_SIZE_CHANGE:"map:sizechange",MAP_FIRST_IDLE:"map:firstidle",MAP_MOVE_START:"map:movestart",MAP_MOVE:"map:move",MAP_MOVE_END:"map:moveend",MAP_STATE_UPDATED:"map:stateupdated",MAP_DATA_CHANGE:"map:datachange",MAP_RENDER:"map:render",MAP_CLICK:"map:click",MAP_DESTROY:"map:destroy"};function p(e,t,r={}){const n={type:"Feature"};return(0===r.id||r.id)&&(n.id=r.id),r.bbox&&(n.bbox=r.bbox),n.properties=t||{},n.geometry=e,n}function d(e,t,r={}){if(!e)throw new Error("coordinates is required");if(!Array.isArray(e))throw new Error("coordinates must be an Array");if(e.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!g(e[0])||!g(e[1]))throw new Error("coordinates must contain numbers");return p({type:"Point",coordinates:e},t,r)}function f(e,t,r={}){if(e.length<2)throw new Error("coordinates must be an array of two or more positions");return p({type:"LineString",coordinates:e},t,r)}function y(e,t={}){const r={type:"FeatureCollection"};return t.id&&(r.id=t.id),t.bbox&&(r.bbox=t.bbox),r.features=e,r}function v(e,t,r={}){return p({type:"MultiLineString",coordinates:e},t,r)}function g(e){return!isNaN(e)&&null!==e&&!Array.isArray(e)}const m=11102230246251565e-32,E=134217729,h=(3+8*m)*m;function S(e,t,r,n,o){let i,a,l,s,c=t[0],u=n[0],p=0,d=0;u>c==u>-c?(i=c,c=t[++p]):(i=u,u=n[++d]);let f=0;if(p<e&&d<r)for(u>c==u>-c?(a=c+i,l=i-(a-c),c=t[++p]):(a=u+i,l=i-(a-u),u=n[++d]),i=a,0!==l&&(o[f++]=l);p<e&&d<r;)u>c==u>-c?(a=i+c,s=a-i,l=i-(a-s)+(c-s),c=t[++p]):(a=i+u,s=a-i,l=i-(a-s)+(u-s),u=n[++d]),i=a,0!==l&&(o[f++]=l);for(;p<e;)a=i+c,s=a-i,l=i-(a-s)+(c-s),c=t[++p],i=a,0!==l&&(o[f++]=l);for(;d<r;)a=i+u,s=a-i,l=i-(a-s)+(u-s),u=n[++d],i=a,0!==l&&(o[f++]=l);return 0===i&&0!==f||(o[f++]=i),f}function b(e){return new Float64Array(e)}const P=b(4),A=b(8),_=b(12),O=b(16),w=b(4);function k(e,t,r,n,o,i){const a=(t-i)*(r-o),l=(e-o)*(n-i),s=a-l,c=Math.abs(a+l);return Math.abs(s)>=33306690738754716e-32*c?s:-function(e,t,r,n,o,i,a){let l,s,c,u,p,d,f,y,v,g,m,b,k,M,T,I,L,C;const F=e-o,D=r-o,R=t-i,j=n-i;M=F*j,d=E*F,f=d-(d-F),y=F-f,d=E*j,v=d-(d-j),g=j-v,T=y*g-(M-f*v-y*v-f*g),I=R*D,d=E*R,f=d-(d-R),y=R-f,d=E*D,v=d-(d-D),g=D-v,L=y*g-(I-f*v-y*v-f*g),m=T-L,p=T-m,P[0]=T-(m+p)+(p-L),b=M+m,p=b-M,k=M-(b-p)+(m-p),m=k-I,p=k-m,P[1]=k-(m+p)+(p-I),C=b+m,p=C-b,P[2]=b-(C-p)+(m-p),P[3]=C;let x=function(e,t){let r=t[0];for(let n=1;n<e;n++)r+=t[n];return r}(4,P),N=22204460492503146e-32*a;if(x>=N||-x>=N)return x;if(p=e-F,l=e-(F+p)+(p-o),p=r-D,c=r-(D+p)+(p-o),p=t-R,s=t-(R+p)+(p-i),p=n-j,u=n-(j+p)+(p-i),0===l&&0===s&&0===c&&0===u)return x;if(N=11093356479670487e-47*a+h*Math.abs(x),x+=F*u+j*l-(R*c+D*s),x>=N||-x>=N)return x;M=l*j,d=E*l,f=d-(d-l),y=l-f,d=E*j,v=d-(d-j),g=j-v,T=y*g-(M-f*v-y*v-f*g),I=s*D,d=E*s,f=d-(d-s),y=s-f,d=E*D,v=d-(d-D),g=D-v,L=y*g-(I-f*v-y*v-f*g),m=T-L,p=T-m,w[0]=T-(m+p)+(p-L),b=M+m,p=b-M,k=M-(b-p)+(m-p),m=k-I,p=k-m,w[1]=k-(m+p)+(p-I),C=b+m,p=C-b,w[2]=b-(C-p)+(m-p),w[3]=C;const B=S(4,P,4,w,A);M=F*u,d=E*F,f=d-(d-F),y=F-f,d=E*u,v=d-(d-u),g=u-v,T=y*g-(M-f*v-y*v-f*g),I=R*c,d=E*R,f=d-(d-R),y=R-f,d=E*c,v=d-(d-c),g=c-v,L=y*g-(I-f*v-y*v-f*g),m=T-L,p=T-m,w[0]=T-(m+p)+(p-L),b=M+m,p=b-M,k=M-(b-p)+(m-p),m=k-I,p=k-m,w[1]=k-(m+p)+(p-I),C=b+m,p=C-b,w[2]=b-(C-p)+(m-p),w[3]=C;const G=S(B,A,4,w,_);M=l*u,d=E*l,f=d-(d-l),y=l-f,d=E*u,v=d-(d-u),g=u-v,T=y*g-(M-f*v-y*v-f*g),I=s*c,d=E*s,f=d-(d-s),y=s-f,d=E*c,v=d-(d-c),g=c-v,L=y*g-(I-f*v-y*v-f*g),m=T-L,p=T-m,w[0]=T-(m+p)+(p-L),b=M+m,p=b-M,k=M-(b-p)+(m-p),m=k-I,p=k-m,w[1]=k-(m+p)+(p-I),C=b+m,p=C-b,w[2]=b-(C-p)+(m-p),w[3]=C;const U=S(G,_,4,w,O);return O[U-1]}(e,t,r,n,o,i,c)}function M(e,t){var r,n,o,i,a,l,s,c,u,p=0,d=e[0],f=e[1],y=t.length;for(r=0;r<y;r++){n=0;var v=t[r],g=v.length-1;if((c=v[0])[0]!==v[g][0]&&c[1]!==v[g][1])throw new Error("First and last coordinates in a ring must be the same");for(i=c[0]-d,a=c[1]-f;n<g;n++){if(l=(u=v[n+1])[0]-d,s=u[1]-f,0===a&&0===s){if(l<=0&&i>=0||i<=0&&l>=0)return 0}else if(s>=0&&a<=0||s<=0&&a>=0){if(0===(o=k(i,l,a,s,0,0)))return 0;(o>0&&s>0&&a<=0||o<0&&s<=0&&a>0)&&p++}c=u,a=s,i=l}}return p%2!=0}function T(e){return"Feature"===e.type?e.geometry:e}function I(e,t,r={}){if(!e)throw new Error("point is required");if(!t)throw new Error("polygon is required");const n=function(e){if(!e)throw new Error("coord is required");if(!Array.isArray(e)){if("Feature"===e.type&&null!==e.geometry&&"Point"===e.geometry.type)return[...e.geometry.coordinates];if("Point"===e.type)return[...e.coordinates]}if(Array.isArray(e)&&e.length>=2&&!Array.isArray(e[0])&&!Array.isArray(e[1]))return[...e];throw new Error("coord must be GeoJSON Point or an Array of numbers")}(e),o=T(t),i=o.type,a=t.bbox;let l=o.coordinates;if(a&&!1===function(e,t){return t[0]<=e[0]&&t[1]<=e[1]&&t[2]>=e[0]&&t[3]>=e[1]}(n,a))return!1;"Polygon"===i&&(l=[l]);let s=!1;for(var c=0;c<l.length;++c){const e=M(n,l[c]);if(0===e)return!r.ignoreBoundary;e&&(s=!0)}return s}class L{constructor(e=[],t=C){if(this.data=e,this.length=this.data.length,this.compare=t,this.length>0)for(let e=(this.length>>1)-1;e>=0;e--)this._down(e)}push(e){this.data.push(e),this.length++,this._up(this.length-1)}pop(){if(0===this.length)return;const e=this.data[0],t=this.data.pop();return this.length--,this.length>0&&(this.data[0]=t,this._down(0)),e}peek(){return this.data[0]}_up(e){const{data:t,compare:r}=this,n=t[e];for(;e>0;){const o=e-1>>1,i=t[o];if(r(n,i)>=0)break;t[e]=i,e=o}t[e]=n}_down(e){const{data:t,compare:r}=this,n=this.length>>1,o=t[e];for(;e<n;){let n=1+(e<<1),i=t[n];const a=n+1;if(a<this.length&&r(t[a],i)<0&&(n=a,i=t[a]),r(i,o)>=0)break;t[e]=i,e=n}t[e]=o}}function C(e,t){return e<t?-1:e>t?1:0}function F(e,t){return e.p.x>t.p.x?1:e.p.x<t.p.x?-1:e.p.y!==t.p.y?e.p.y>t.p.y?1:-1:1}function D(e,t){return e.rightSweepEvent.p.x>t.rightSweepEvent.p.x?1:e.rightSweepEvent.p.x<t.rightSweepEvent.p.x?-1:e.rightSweepEvent.p.y!==t.rightSweepEvent.p.y?e.rightSweepEvent.p.y<t.rightSweepEvent.p.y?1:-1:1}class R{constructor(e,t,r,n){this.p={x:e[0],y:e[1]},this.featureId=t,this.ringId=r,this.eventId=n,this.otherEvent=null,this.isLeftEndpoint=null}isSamePoint(e){return this.p.x===e.p.x&&this.p.y===e.p.y}}let j=0,x=0,N=0;function B(e,t){const r="Feature"===e.type?e.geometry:e;let n=r.coordinates;"Polygon"!==r.type&&"MultiLineString"!==r.type||(n=[n]),"LineString"===r.type&&(n=[[n]]);for(let e=0;e<n.length;e++)for(let r=0;r<n[e].length;r++){let o=n[e][r][0],i=null;x+=1;for(let a=0;a<n[e][r].length-1;a++){i=n[e][r][a+1];const l=new R(o,j,x,N),s=new R(i,j,x,N+1);l.otherEvent=s,s.otherEvent=l,F(l,s)>0?(s.isLeftEndpoint=!0,l.isLeftEndpoint=!1):(l.isLeftEndpoint=!0,s.isLeftEndpoint=!1),t.push(l),t.push(s),o=i,N+=1}}j+=1}class G{constructor(e){this.leftSweepEvent=e,this.rightSweepEvent=e.otherEvent}}function U(e,t){if(null===e||null===t)return!1;if(e.leftSweepEvent.ringId===t.leftSweepEvent.ringId&&(e.rightSweepEvent.isSamePoint(t.leftSweepEvent)||e.rightSweepEvent.isSamePoint(t.leftSweepEvent)||e.rightSweepEvent.isSamePoint(t.rightSweepEvent)||e.leftSweepEvent.isSamePoint(t.leftSweepEvent)||e.leftSweepEvent.isSamePoint(t.rightSweepEvent)))return!1;const r=e.leftSweepEvent.p.x,n=e.leftSweepEvent.p.y,o=e.rightSweepEvent.p.x,i=e.rightSweepEvent.p.y,a=t.leftSweepEvent.p.x,l=t.leftSweepEvent.p.y,s=t.rightSweepEvent.p.x,c=t.rightSweepEvent.p.y,u=(c-l)*(o-r)-(s-a)*(i-n),p=(s-a)*(n-l)-(c-l)*(r-a),d=(o-r)*(n-l)-(i-n)*(r-a);if(0===u)return!1;const f=p/u,y=d/u;if(f>=0&&f<=1&&y>=0&&y<=1){return[r+f*(o-r),n+f*(i-n)]}return!1}var H=function(e,t){const r=new L([],F);return function(e,t){if("FeatureCollection"===e.type){const r=e.features;for(let e=0;e<r.length;e++)B(r[e],t)}else B(e,t)}(e,r),function(e,t){t=t||!1;const r=[],n=new L([],D);for(;e.length;){const o=e.pop();if(o.isLeftEndpoint){const e=new G(o);for(let i=0;i<n.data.length;i++){const a=n.data[i];if(t&&a.leftSweepEvent.featureId===o.featureId)continue;const l=U(e,a);!1!==l&&r.push(l)}n.push(e)}else!1===o.isLeftEndpoint&&n.pop()}return r}(r,t)};function V(e,t,r={}){const{removeDuplicates:n=!0,ignoreSelfIntersections:o=!0}=r;let i=[];"FeatureCollection"===e.type?i=i.concat(e.features):"Feature"===e.type?i.push(e):"LineString"!==e.type&&"Polygon"!==e.type&&"MultiLineString"!==e.type&&"MultiPolygon"!==e.type||i.push(p(e)),"FeatureCollection"===t.type?i=i.concat(t.features):"Feature"===t.type?i.push(t):"LineString"!==t.type&&"Polygon"!==t.type&&"MultiLineString"!==t.type&&"MultiPolygon"!==t.type||i.push(p(t));const a=H(y(i),o);let l=[];if(n){const e={};a.forEach(t=>{const r=t.join(",");e[r]||(e[r]=!0,l.push(t))})}else l=a;return y(l.map(e=>d(e)))}function K(e,t){!function(e,t){var r,n,o,i,a,l,s,c,u,p,d=0,f="FeatureCollection"===e.type,y="Feature"===e.type,v=f?e.features.length:1;for(r=0;r<v;r++){for(l=f?e.features[r].geometry:y?e.geometry:e,c=f?e.features[r].properties:y?e.properties:{},u=f?e.features[r].bbox:y?e.bbox:void 0,p=f?e.features[r].id:y?e.id:void 0,a=(s=!!l&&"GeometryCollection"===l.type)?l.geometries.length:1,o=0;o<a;o++)if(null!==(i=s?l.geometries[o]:l))switch(i.type){case"Point":case"LineString":case"MultiPoint":case"Polygon":case"MultiLineString":case"MultiPolygon":if(!1===t(i,d,c,u,p))return!1;break;case"GeometryCollection":for(n=0;n<i.geometries.length;n++)if(!1===t(i.geometries[n],d,c,u,p))return!1;break;default:throw new Error("Unknown Geometry Type")}else if(!1===t(null,d,c,u,p))return!1;d++}}(e,function(e,r,n,o,i){var a,l=null===e?null:e.type;switch(l){case null:case"Point":case"LineString":case"Polygon":return!1!==t(p(e,n,{bbox:o,id:i}),r,0)&&void 0}switch(l){case"MultiPoint":a="Point";break;case"MultiLineString":a="LineString";break;case"MultiPolygon":a="Polygon"}for(var s=0;s<e.coordinates.length;s++){var c=e.coordinates[s];if(!1===t(p({type:a,coordinates:c},n),r,s))return!1}})}function W(e,t={}){const r=T(e);switch(t.properties||"Feature"!==e.type||(t.properties=e.properties),r.type){case"Polygon":return function(e,t={}){const r=T(e),n=r.coordinates,o=t.properties?t.properties:"Feature"===e.type?e.properties:{};return Y(n,o)}(r,t);case"MultiPolygon":return function(e,t={}){const r=T(e),n=r.coordinates,o=t.properties?t.properties:"Feature"===e.type?e.properties:{},i=[];return n.forEach(e=>{i.push(Y(e,o))}),y(i)}(r,t);default:throw new Error("invalid poly")}}function Y(e,t){return e.length>1?v(e,t):f(e[0],t)}function q(e,t){for(let r=0;r<e.coordinates.length-1;r++)if(X(e.coordinates[r],e.coordinates[r+1],t.coordinates))return!0;return!1}function z(e,t,r){for(const r of t.coordinates)if(I(r,e))return!0;return V(t,W(e),{ignoreSelfIntersections:r}).features.length>0}function X(e,t,r){const n=r[0]-e[0],o=r[1]-e[1],i=t[0]-e[0],a=t[1]-e[1];return 0===n*a-o*i&&(Math.abs(i)>=Math.abs(a)?i>0?e[0]<=r[0]&&r[0]<=t[0]:t[0]<=r[0]&&r[0]<=e[0]:a>0?e[1]<=r[1]&&r[1]<=t[1]:t[1]<=r[1]&&r[1]<=e[1])}var Z=function(e,t,{ignoreSelfIntersections:r=!0}={ignoreSelfIntersections:!0}){let n=!0;return K(e,e=>{K(t,t=>{if(!1===n)return!1;n=function(e,t,r){switch(e.type){case"Point":switch(t.type){case"Point":return n=e.coordinates,o=t.coordinates,!(n[0]===o[0]&&n[1]===o[1]);case"LineString":return!q(t,e);case"Polygon":return!I(e,t)}break;case"LineString":switch(t.type){case"Point":return!q(e,t);case"LineString":return!function(e,t,r){const n=V(e,t,{ignoreSelfIntersections:r});if(n.features.length>0)return!0;return!1}(e,t,r);case"Polygon":return!z(t,e,r)}break;case"Polygon":switch(t.type){case"Point":return!I(t,e);case"LineString":return!z(e,t,r);case"Polygon":return!function(e,t,r){for(const r of e.coordinates[0])if(I(r,t))return!0;for(const r of t.coordinates[0])if(I(r,e))return!0;const n=V(W(e),W(t),{ignoreSelfIntersections:r});if(n.features.length>0)return!0;return!1}(t,e,r)}}var n,o;return!1}(e.geometry,t.geometry,r)})}),n};function J(e){var t=e.geometry||e;switch(t.type){case"Polygon":return function(e,t,r={}){for(const t of e){if(t.length<4)throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");if(t[t.length-1].length!==t[0].length)throw new Error("First and last Position are not equivalent.");for(let e=0;e<t[t.length-1].length;e++)if(t[t.length-1][e]!==t[0][e])throw new Error("First and last Position are not equivalent.")}return p({type:"Polygon",coordinates:e},t,r)}(t.coordinates);case"MultiPolygon":return function(e,t,r={}){return p({type:"MultiPolygon",coordinates:e},t,r)}(t.coordinates);case"LineString":return f(t.coordinates);case"MultiLineString":return v(t.coordinates);case"Point":return d(t.coordinates);case"MultiPoint":return function(e,t,r={}){return p({type:"MultiPoint",coordinates:e},t,r)}(t.coordinates);default:throw new Error("Unsupported geometry type: ".concat(t.type))}}function Q(e,t){return t.some(t=>!Z(J(t),J(e)))}function $(e){if(e.length<2)return!1;if(e.some(e=>{var t;return!(null!==(t=e.geometry)&&void 0!==t&&t.type)}))return!1;for(var t=new Set([0]),r=!0;r;){r=!1;for(var n=1;n<e.length;n++)if(!t.has(n)){var o=[...t].map(t=>e[t]);Q(e[n],o)&&(t.add(n),r=!0)}}return t.size===e.length}var ee=e=>{var t={};for(var r of e)t[r.layerId]=r;return t},te=(e,t,r)=>{try{return(null==e?void 0:e.getFeaturesAtPoint(t,r))||[]}catch(e){return console.warn("Feature query failed:",e),[]}},re=e=>{var t,r=null===(t=e.geometry)||void 0===t?void 0:t.type;return"Point"===r||"MultiPoint"===r};var ne,oe;var ie=/mac/i.test(null!==(ne=null===(oe=navigator.userAgentData)||void 0===oe?void 0:oe.platform)&&void 0!==ne?ne:navigator.platform)?"<kbd>Option</kbd>":"<kbd>Alt</kbd>",ae=("".concat(ie," + <kbd>Enter</kbd>"),"".concat(ie," + <kbd>→</kbd>, <kbd>←</kbd>, <kbd>↑</kbd> or <kbd>↓</kbd>"),new Set,(e,t)=>{if(!e)return null;if("string"==typeof e)return e.trim();if("object"==typeof e){if(t&&e[t])return e[t];var r=Object.values(e)[0];return null!=r?r:null}return null}),le=e=>!!e.label&&(!e.symbol&&!e.symbolSvgContent&&(null===e.symbol||null===e.symbolSvgContent)),se={light:{haloColor:"#ffffff",selectedColor:"#0b0c0c",activeColor:"#ffdd00",foregroundColor:"#0b0c0c"},dark:{haloColor:"#0b0c0c",selectedColor:"#ffffff",activeColor:"#ffdd00",foregroundColor:"#ffffff"}};function ce(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function ue(t){for(var r=1;r<arguments.length;r++){var n=null!=arguments[r]?arguments[r]:{};r%2?ce(Object(n),!0).forEach(function(r){e(t,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):ce(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))})}return t}var pe={slot:"middle",open:!1,dismissible:!0,modal:!0};ue({},pe),ue(ue({},pe),{},{width:"500px"}),ue(ue({},pe),{},{width:"500px"});var de={small:1,medium:1.5,large:2};function fe(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function ye(t){for(var r=1;r<arguments.length;r++){var n=null!=arguments[r]?arguments[r]:{};r%2?fe(Object(n),!0).forEach(function(r){e(t,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):fe(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))})}return t}var ve=(e,t,r,n)=>({featureId:e,multiSelect:t,layerId:r.layerId,idProperty:r.idProperty,properties:n.properties,geometry:n.geometry}),ge=e=>{var t,{featureId:r,feature:n,config:o,selectedFeatures:i,dispatch:a,multiSelect:l}=e;if(!i.length)return!1;var s=i.findIndex(e=>e.featureId===r&&e.layerId===o.layerId);if(-1!==s){if(i.length<3)return!1;var c=(e=>{for(var t=new Set([0]),r=!0;r;){r=!1;for(var n=1;n<e.length;n++){var o;if(!t.has(n)){var i=[...t].map(t=>e[t]);null!==(o=e[n].geometry)&&void 0!==o&&o.type&&Q(e[n],i)&&(t.add(n),r=!0)}}}return t.size===e.length?null:[...t].map(t=>e[t])})(i.filter((e,t)=>t!==s));return!!c&&(a({type:"SET_SELECTED_FEATURES",payload:c}),!0)}var u=i.filter(e=>{var t;return null===(t=e.geometry)||void 0===t?void 0:t.type});return!(null===(t=n.geometry)||void 0===t||!t.type||!u.length)&&(!Q(n,u)&&(a({type:"TOGGLE_SELECTED_FEATURES",payload:ye(ye({},ve(r,l,o,n)),{},{replaceAll:!0})}),!0))},me=e=>{var{mapProvider:t,layers:r,interactionModes:n,multiSelect:i,dispatch:a,markers:l,layerConfigMap:s,debug:c,tolerance:u,processFeatureMatch:p,processFallback:d,scale:f}=e;return o(e=>{var{point:o,coords:y}=e,v=c?te(t,o,{radius:u}):null;if(v&&((e,t)=>{var[r,n]=e;console.groupCollapsed("[interact] click (".concat(r.toFixed(4),", ").concat(n.toFixed(4),") — ").concat(t.length," feature").concat(1!==t.length?"s":"")),t.forEach(e=>{var t,r;console.log({layer:e.layer.id,type:e.layer.type,id:null!==(t=e.id)&&void 0!==t?t:"—",sourceLayer:null!==(r=e.sourceLayer)&&void 0!==r?r:"—",properties:e.properties})}),console.groupEnd()})(y,v),n.includes("selectMarker")){var g=((e,t,r)=>{for(var n of e.items){var o,i=null===(o=e.markerRefs)||void 0===o?void 0:o.get(n.id);if(i&&!le(n)){var a=i.closest(".im-c-viewport__markers")||i.parentElement,l=a?a.getBoundingClientRect():{left:0,top:0},{left:s,top:c,right:u,bottom:p}=i.getBoundingClientRect(),d=t.x*r,f=t.y*r;if(d>=s-l.left&&d<=u-l.left&&f>=c-l.top&&f<=p-l.top)return n.id}}return null})(l,o,f);if(g)return void a({type:"TOGGLE_SELECTED_MARKERS",payload:{markerId:g,multiSelect:i}})}if(n.includes("selectFeature")&&r.length>0){var m=((e,t)=>{var r=e.filter(e=>{var r;return t[null===(r=e.layer)||void 0===r?void 0:r.id]}),n=r.find(re);if(n)return{feature:n,config:t[n.layer.id]};var o=r[0];return o?{feature:o,config:t[o.layer.id]}:null})(null!=v?v:te(t,o,{radius:u}),s);if(m)return void p(m)}d({coords:y})},[t,r,n,i,a,l,s,c,u,p,d,f])},Ee=e=>{var t,{mapState:r,pluginState:n,services:l,mapProvider:s}=e,{markers:c,mapSize:u}=r,{dispatch:p,layers:d,interactionModes:f,multiSelect:y,contiguous:v,marker:g,tolerance:m,selectedFeatures:E,selectedMarkers:h,deselectOnClickOutside:S}=n,{eventBus:b}=l,P=ee(d),A=null!==(t=de[u])&&void 0!==t?t:1,_=o(e=>{var t,r,n,{feature:o,config:i}=e;c.remove("location");var a=null!==(t=null===(r=o.properties)||void 0===r?void 0:r[i.idProperty])&&void 0!==t?t:o.id;if(null!=a){var l=null===(n=s.getFeatureGeometry)||void 0===n?void 0:n.call(s,i.layerId,a,i.idProperty),u=l?ye(ye({},o),{},{geometry:l}):o;if(v&&y)if(ge({featureId:a,feature:u,config:i,selectedFeatures:E,dispatch:p,multiSelect:y}))return;p({type:"TOGGLE_SELECTED_FEATURES",payload:ve(a,y,i,u)})}},[c,p,y,v,E,s]),O=o(e=>{var{coords:t}=e,r=f.includes("placeMarker");(r||S)&&(p({type:"CLEAR_SELECTED_FEATURES"}),r&&(c.add("location",t,g),b.emit("interact:markerchange",{coords:t})))},[f,p,c,g,b,S]),w=me({mapProvider:s,layers:d,interactionModes:f,multiSelect:y,dispatch:p,markers:c,layerConfigMap:P,debug:null==n?void 0:n.debug,tolerance:m,processFeatureMatch:_,processFallback:O,scale:A});return((e,t,r)=>{var n=i(null);a(()=>{var o=n.current;(null===o||0===o.features.length&&0===o.markers.length)&&0===t.length&&0===r.length||(e.emit("interact:selectionchange",{selectedFeatures:t.map(e=>{var{featureId:t,layerId:r,idProperty:n,properties:o,geometry:i}=e;return{featureId:t,layerId:r,idProperty:n,properties:o,geometryType:null==i?void 0:i.type}}),selectedMarkers:r,contiguous:$(t)}),n.current={features:t,markers:r})},[t,r])})(b,E,h),{handleInteraction:w}};function he(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function Se(t){for(var r=1;r<arguments.length;r++){var n=null!=arguments[r]?arguments[r]:{};r%2?he(Object(n),!0).forEach(function(r){e(t,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):he(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))})}return t}var be=(e,t)=>{var r,n;return t?null!==(r=null===(n=e.properties)||void 0===n?void 0:n[t.idProperty])&&void 0!==r?r:e.id:null},Pe=e=>{var t=e.closest(".im-c-viewport__markers");if(!t)return!1;var r=t.getBoundingClientRect(),{left:n,right:o,top:i,bottom:a}=e.getBoundingClientRect();return o>r.left&&n<r.right&&a>r.top&&i<r.bottom},Ae=(e,t,r)=>{var n,o,i,a=t[null===(n=e.layer)||void 0===n?void 0:n.id];if(null==a||!a.labelProperty)return null;var l=be(e,a),s=null==l?null:String(l);return null==s||r.has(s)?null:(r.add(s),{id:s,label:null!==(o=null===(i=e.properties)||void 0===i?void 0:i[a.labelProperty])&&void 0!==o?o:s})};function _e(e){var{markers:t,interactionModes:r,layers:n,mapProvider:o,multiSelect:i,eventBus:l}=e;a(()=>{var e=()=>{var e=[];null!=r&&r.includes("selectMarker")&&e.push(...(e=>{var t=[];for(var r of e.items){var n;if(r.label){var o=null===(n=e.markerRefs)||void 0===n?void 0:n.get(r.id);!le(r)&&o&&Pe(o)&&t.push({id:r.id,label:r.label})}}return t})(t)),null!=r&&r.includes("selectFeature")&&n.length>0&&e.push(...((e,t)=>{var r=[],n=new Set,o=t.map(e=>e.layerId),i=ee(t),a=e.getVisibleFeatures(o);for(var l of a){var s=Ae(l,i,n);s&&r.push(s)}return r})(o,n)),l.emit(u.MAP_SET_FEATURES,{items:e,multiselectable:i})};return e(),l.on(u.MAP_MOVE_END,e),l.on(u.MAP_DATA_CHANGE,e),()=>{l.off(u.MAP_MOVE_END,e),l.off(u.MAP_DATA_CHANGE,e)}},[t,r,n,o,i,l])}function Oe(e){var{markers:t,interactionModes:r,layers:n,mapProvider:o,eventBus:i,dispatch:l,listboxActiveItemRef:s}=e;a(()=>{var e=e=>{var{id:i}=e;if(null===i)return s.current=null,void l({type:"SET_LISTBOX_ACTIVE",payload:null});if(t.items.some(e=>e.id===i))return s.current={id:i,isMarker:!0},void l({type:"SET_LISTBOX_ACTIVE",payload:null});if(null!=r&&r.includes("selectFeature")&&n.length>0){var a=n.map(e=>e.layerId),c=ee(n),u=((e,t,r)=>{for(var n of e){var o,i=t[null===(o=n.layer)||void 0===o?void 0:o.id],a=be(n,i);if(null!=a&&String(a)===String(r))return{feature:n,config:i,rawId:a}}return null})(o.getVisibleFeatures(a),c,i);if(u){var p={featureId:u.rawId,layerId:u.config.layerId,idProperty:u.config.idProperty,geometry:u.feature.geometry};s.current=Se(Se({id:i,isMarker:!1},p),{},{properties:u.feature.properties}),l({type:"SET_LISTBOX_ACTIVE",payload:p})}}};return i.on(u.MAP_SET_ACTIVE_FEATURE,e),()=>{i.off(u.MAP_SET_ACTIVE_FEATURE,e)}},[t,r,n,o,i,l,s])}function we(e){var{mapState:t,pluginState:r,services:n,mapProvider:o}=e,{markers:l}=t,{dispatch:s,interactionModes:c,layers:p,multiSelect:d}=r,{eventBus:f}=n,y=i(null);_e({markers:l,interactionModes:c,layers:p,mapProvider:o,multiSelect:d,eventBus:f}),Oe({markers:l,interactionModes:c,layers:p,mapProvider:o,eventBus:f,dispatch:s,listboxActiveItemRef:y}),function(e){var{eventBus:t,dispatch:r,listboxActiveItemRef:n,multiSelect:o}=e;a(()=>{var e=()=>{var e=n.current;if(e)if(e.isMarker)r({type:"TOGGLE_SELECTED_MARKERS",payload:{markerId:e.id,multiSelect:o}});else{var{featureId:t,layerId:i,idProperty:a,geometry:l,properties:s}=e;r({type:"TOGGLE_SELECTED_FEATURES",payload:{featureId:t,layerId:i,idProperty:a,geometry:l,properties:s,multiSelect:o,replaceAll:!o}})}};return t.on(u.MAP_SELECT_FEATURE,e),()=>{t.off(u.MAP_SELECT_FEATURE,e)}},[t,r,n,o])}({eventBus:f,dispatch:s,listboxActiveItemRef:y,multiSelect:d})}var ke=e=>{var{mapProvider:t,mapStyle:r,pluginState:n,selectedFeatures:o,events:i,eventBus:s}=e,{layers:c,listboxActiveItem:u}=n,p=l(()=>r?((e,t)=>{var r,n,o,i={};if(!t)return console.warn("[interact] buildStylesMap: mapStyle is null/undefined, cannot build styles"),i;var a=null!==(r=se[t.mapColorScheme])&&void 0!==r?r:se.light,l=null!==(n=t.activeColor)&&void 0!==n?n:a.activeColor,s=null!==(o=t.selectedColor)&&void 0!==o?o:a.selectedColor;return e.forEach(e=>{var r=e.activeStroke||l,n=e.selectedStroke||s,o=e.selectedFill||"transparent",a=e.selectedStrokeWidth||3,c=a+6;i[e.layerId]={stroke:ae(r,t.id),selectionStroke:ae(n,t.id),fill:ae(o,t.id),strokeWidth:a,activeStrokeWidth:c}}),i})(c,r):null,[c,r]),d=()=>{var e,r=u?[{featureId:u.featureId,layerId:u.layerId,idProperty:u.idProperty,geometry:u.geometry}]:[];null===(e=t.updateHighlightedFeatures)||void 0===e||e.call(t,o,r,p)};a(()=>{if(t&&p){d();var e=()=>{s.once(i.MAP_DATA_CHANGE,d)};return s.on(i.MAP_STYLE_CHANGE,e),()=>{s.off(i.MAP_STYLE_CHANGE,e)}}},[o,u,t,p,s])};function Me(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function Te(t){for(var r=1;r<arguments.length;r++){var n=null!=arguments[r]?arguments[r]:{};r%2?Me(Object(n),!0).forEach(function(r){e(t,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):Me(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))})}return t}function Ie(e){var t,r,n,{getAppState:o,mapState:i,getPluginState:a,buttonConfig:l,events:s,eventBus:c,handleInteraction:u,clickReadyRef:p}=e,{selectAtTarget:d}=l,f=()=>u(i.crossHair.getDetail()),y=e=>{p.current&&u(e)},{handleKeydown:v,handleKeyup:g}=(t=o().layoutRefs.viewportRef,r=f,n=!1,{handleKeydown:e=>{n="Enter"===e.key&&t.current===e.target},handleKeyup:e=>{"Enter"===e.key&&n&&(e.preventDefault(),r())}}),m=((e,t)=>(r,n)=>{var o=t();e.markers.remove("location"),o.dispatch({type:"TOGGLE_SELECTED_FEATURES",payload:Te({multiSelect:o.multiSelect,addToExisting:n},r)})})(i,a),E=e=>m(e,!0),h=e=>m(e,!1);return document.addEventListener("keydown",v),document.addEventListener("keyup",g),c.on(s.MAP_CLICK,y),c.on("interact:selectFeature",E),c.on("interact:unselectFeature",h),d.onClick=f,()=>{d.onClick=null,document.removeEventListener("keydown",v),document.removeEventListener("keyup",g),c.off(s.MAP_CLICK,y),c.off("interact:selectFeature",E),c.off("interact:unselectFeature",h)}}var Le=e=>1===(null==e?void 0:e.length)&&e.includes("selectMarker");function Ce(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function Fe(t){for(var r=1;r<arguments.length;r++){var n=null!=arguments[r]?arguments[r]:{};r%2?Ce(Object(n),!0).forEach(function(r){e(t,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):Ce(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))})}return t}var De={ENABLE:(e,t)=>Fe(Fe(Fe({},e),t),{},{enabled:!0}),DISABLE:e=>Fe(Fe({},e),{},{enabled:!1,selectedFeatures:[],selectedMarkers:[],listboxActiveItem:null}),TOGGLE_SELECTED_FEATURES:(e,t)=>{var{featureId:r,multiSelect:n,layerId:o,idProperty:i,addToExisting:a=!0,replaceAll:l=!1,properties:s,geometry:c}=t,u=Array.isArray(e.selectedFeatures)?e.selectedFeatures:[],p=u.findIndex(e=>e.featureId===r&&e.layerId===o);if(!1===a){var d=u.filter((e,t)=>t!==p);return Fe(Fe({},e),{},{selectedFeatures:d})}var f,y={featureId:r,layerId:o,idProperty:i,properties:s,geometry:c};if(n&&!l){var v=[...u];-1===p?v.push(y):v.splice(p,1),f=v}else{f=-1!==p&&1===u.length?[]:[y]}return Fe(Fe({},e),{},{selectedFeatures:f,selectedMarkers:n&&!l?e.selectedMarkers:[]})},TOGGLE_SELECTED_MARKERS:(e,t)=>{var{markerId:r,multiSelect:n}=t,o=e.selectedMarkers,i=o.includes(r);if(n){var a=i?o.filter(e=>e!==r):[...o,r];return Fe(Fe({},e),{},{selectedMarkers:a})}return Fe(Fe({},e),{},{selectedFeatures:[],selectedMarkers:i&&1===o.length?[]:[r]})},CLEAR_SELECTED_FEATURES:e=>Fe(Fe({},e),{},{selectedFeatures:[],selectedMarkers:[]}),SET_SELECTED_FEATURES:(e,t)=>Fe(Fe({},e),{},{selectedFeatures:t}),SELECT_MARKER:(e,t)=>{var{markerId:r,multiSelect:n}=t,o=e.selectedMarkers;if(o.includes(r))return e;var i=n?[...o,r]:[r];return Fe(Fe({},e),{},{selectedFeatures:n?e.selectedFeatures:[],selectedMarkers:i})},UNSELECT_MARKER:(e,t)=>{var{markerId:r}=t,n=e.selectedMarkers;return n.includes(r)?Fe(Fe({},e),{},{selectedMarkers:n.filter(e=>e!==r)}):e},SET_LISTBOX_ACTIVE:(e,t)=>Fe(Fe({},e),{},{listboxActiveItem:null!=t?t:null})},Re={tolerance:10,interactionModes:["selectMarker"],multiSelect:!1,contiguous:!1,deselectOnClickOutside:!1,marker:{}};function je(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function xe(t){for(var r=1;r<arguments.length;r++){var n=null!=arguments[r]?arguments[r]:{};r%2?je(Object(n),!0).forEach(function(r){e(t,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):je(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))})}return t}var Ne="Select features",Be={InitComponent:e=>{var{appState:t,mapState:r,services:n,buttonConfig:l,mapProvider:s,pluginState:c}=e,{enabled:p,selectedFeatures:d,interactionModes:f,layers:y}=c,{eventBus:v}=n,{crossHair:g,mapStyle:m,markers:E}=r,h=Le(f);we({mapState:r,pluginState:c,services:n,mapProvider:s});var{handleInteraction:S}=Ee({mapState:r,pluginState:c,services:n,mapProvider:s});return ke({mapProvider:s,mapStyle:m,pluginState:c,selectedFeatures:d,events:u,eventBus:v}),a(()=>{v.emit("interact:active",{active:p,interactionModes:f})},[p,f]),function(e){var{enabled:t,interactionModes:r,markers:n,layers:o,eventBus:i}=e;a(()=>{if(t){var e=(null==r?void 0:r.includes("selectMarker"))&&n.items.some(e=>e.label),a=(null==r?void 0:r.includes("selectFeature"))&&o.some(e=>e.labelProperty);(e||a)&&i.emit("interact:listboxcapable")}},[t,r,n,o,i])}({enabled:p,interactionModes:f,markers:E,layers:y,eventBus:v}),((e,t,r,n)=>{a(()=>{var o,i=t&&(null==r?void 0:r.includes("selectFeature"))?n.map(e=>e.layerId):[];return null===(o=e.setHoverCursor)||void 0===o||o.call(e,i),()=>{var t;return null===(t=e.setHoverCursor)||void 0===t?void 0:t.call(e,[])}},[t,r,n])})(s,p,f,y),function(e){var{crossHair:t,enabled:r,selectMarkerOnly:n,appState:l}=e,s=i(r);s.current=r;var c=i(n);c.current=n;var u=i(t);u.current=t;var p=i(!1),d=i(l.interfaceType);d.current=l.interfaceType;var f=o(()=>{var e=d.current,t=["touch","keyboard"].includes(e);!s.current||p.current||!t||"touch"===e&&c.current?u.current.hide():u.current.fixAtCenter()},[]);a(()=>{f()},[r,n,l.interfaceType,f]),a(()=>{var e,t=null===(e=l.layoutRefs)||void 0===e||null===(e=e.appContainerRef)||void 0===e?void 0:e.current;if(t){var r=e=>{var t=!!e.target.closest('[role="listbox"], [role="option"]');p.current!==t&&(p.current=t,f())};return t.addEventListener("focusin",r),()=>{t.removeEventListener("focusin",r)}}},[l.layoutRefs,f])}({crossHair:g,enabled:p,selectMarkerOnly:h,appState:t}),function(e){var{pluginState:t,appState:r,mapState:n,buttonConfig:o,eventBus:l,handleInteraction:s}=e,c=i(s);c.current=s;var p=i(t);p.current=t;var d=i(r);d.current=r;var f=i(!1);a(()=>{f.current=!1;var e=setTimeout(()=>{f.current=!0},0);return()=>clearTimeout(e)},[t.enabled]),a(()=>{if(t.enabled)return Ie({getAppState:()=>d.current,mapState:n,getPluginState:()=>p.current,buttonConfig:o,events:u,eventBus:l,handleInteraction:e=>c.current(e),clickReadyRef:f})},[t.enabled,o,l])}({pluginState:c,appState:t,mapState:r,buttonConfig:l,eventBus:v,handleInteraction:S}),null},reducer:{initialState:{enabled:!1,layers:[],marker:null,interactionModes:null,multiSelect:!1,deselectOnClickOutside:!1,selectedFeatures:[],selectedMarkers:[],closeOnAction:!0,listboxActiveItem:null},actions:De},buttons:[{id:"selectAtTarget",label:"Select",variant:"primary",hiddenWhen:e=>{var{appState:t,pluginState:r}=e;return!r.enabled||"touch"!==t.interfaceType||Le(r.interactionModes)},mobile:{slot:"actions"},tablet:{slot:"actions"},desktop:{slot:"actions"}}],keyboardShortcuts:[{id:"clickAtTarget",title:"Click at target",command:"<kbd>Enter</kbd>"},{id:"selectFeatures",group:Ne,context:"listbox",title:"Select features",command:"<kbd>Tab</kbd>"},{id:"navigateFeatures",group:Ne,context:"listbox",title:"Navigate features",command:"<kbd>↑</kbd> or <kbd>↓</kbd>"},{id:"selectFeature",group:Ne,context:"listbox",title:"Select a feature",command:"<kbd>Enter</kbd> or <kbd>Space</kbd>"},{id:"dismissHintOrReturn",group:Ne,context:"listbox",title:"Dismiss hint / return to map",command:"<kbd>Escape</kbd>"}],icons:[{id:"select",svgContent:'<path d="M22 14a8 8 0 0 1-8 8"/><path d="M18 11v-1a2 2 0 0 0-2-2a2 2 0 0 0-2 2"/><path d="M14 10V9a2 2 0 0 0-2-2a2 2 0 0 0-2 2v1"/><path d="M10 9.5V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v10"/><path d="M18 11a2 2 0 1 1 4 0v3a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15"/>'}],api:{enable:(e,t)=>{var{pluginState:r,pluginConfig:n}=e;r.dispatch({type:"ENABLE",payload:xe(xe(xe({},Re),n),t)})},disable:e=>{var{pluginState:t}=e;t.dispatch({type:"DISABLE"})},clear:e=>{var{pluginState:t,mapState:r}=e;t.dispatch({type:"CLEAR_SELECTED_FEATURES"}),r.markers.remove("location")},selectFeature:(e,t)=>{var{services:r}=e,{featureId:n,layerId:o,idProperty:i}=t;r.eventBus.emit("interact:selectFeature",{featureId:n,layerId:o,idProperty:i})},unselectFeature:(e,t)=>{var{services:r}=e,{featureId:n,layerId:o,idProperty:i}=t;r.eventBus.emit("interact:unselectFeature",{featureId:n,layerId:o,idProperty:i})},selectMarker:(e,t)=>{var{pluginState:r}=e;r.dispatch({type:"SELECT_MARKER",payload:{markerId:t,multiSelect:r.multiSelect}})},unselectMarker:(e,t)=>{var{pluginState:r}=e;r.dispatch({type:"UNSELECT_MARKER",payload:{markerId:t}})}}};export{Be as manifest};
1
+ import e from"@babel/runtime/helpers/defineProperty";import"@babel/runtime/helpers/objectWithoutProperties";import{useContext as t,createContext as r,useState as n,useCallback as o,useRef as i,useEffect as a,useMemo as l}from"preact/compat";import{jsxs as s,jsx as c}from"preact/jsx-runtime";import"@babel/runtime/helpers/asyncToGenerator";var u={APP_ADD_MARKER:"app:addmarker",APP_UPDATE_MARKER:"app:updatemarker",APP_REMOVE_MARKER:"app:removemarker",APP_SET_MODE:"app:setmode",APP_REVERT_MODE:"app:revertmode",APP_ADD_BUTTON:"app:addbutton",APP_TOGGLE_BUTTON_STATE:"app:togglebuttonstate",APP_ADD_PANEL:"app:addpanel",APP_REMOVE_PANEL:"app:removepanel",APP_SHOW_PANEL:"app:showpanel",APP_HIDE_PANEL:"app:hidepanel",APP_ADD_CONTROL:"app:addcontrol",APP_SHOW_HINT:"app:showhint",APP_DISMISS_HINT:"app:dismisshint",APP_READY:"app:ready",APP_OPENED:"app:opened",APP_CLOSED:"app:closed",APP_FULLSCREEN_CHANGE:"app:fullscreenchange",APP_PANEL_OPENED:"app:panelopened",APP_PANEL_CLOSED:"app:panelclosed",MAP_SET_STYLE:"map:setstyle",MAP_SET_SIZE:"map:setsize",MAP_SET_FEATURES:"map:setfeatures",MAP_SET_ACTIVE_FEATURE:"map:setactivefeature",MAP_SELECT_FEATURE:"map:selectfeature",MAP_SET_PIXEL_RATIO:"map:setpixelratio",MAP_FIT_TO_BOUNDS:"map:fittobounds",MAP_SET_VIEW:"map:setview",MAP_INIT_MAP_STYLES:"map:initmapstyles",MAP_STYLE_CHANGE:"map:stylechange",MAP_LOADED:"map:loaded",MAP_READY:"map:ready",MAP_SIZE_CHANGE:"map:sizechange",MAP_FIRST_IDLE:"map:firstidle",MAP_MOVE_START:"map:movestart",MAP_MOVE:"map:move",MAP_MOVE_END:"map:moveend",MAP_STATE_UPDATED:"map:stateupdated",MAP_DATA_CHANGE:"map:datachange",MAP_RENDER:"map:render",MAP_CLICK:"map:click",MAP_DESTROY:"map:destroy"};function p(e,t,r={}){const n={type:"Feature"};return(0===r.id||r.id)&&(n.id=r.id),r.bbox&&(n.bbox=r.bbox),n.properties=t||{},n.geometry=e,n}function d(e,t,r={}){if(!e)throw new Error("coordinates is required");if(!Array.isArray(e))throw new Error("coordinates must be an Array");if(e.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!g(e[0])||!g(e[1]))throw new Error("coordinates must contain numbers");return p({type:"Point",coordinates:e},t,r)}function f(e,t,r={}){if(e.length<2)throw new Error("coordinates must be an array of two or more positions");return p({type:"LineString",coordinates:e},t,r)}function y(e,t={}){const r={type:"FeatureCollection"};return t.id&&(r.id=t.id),t.bbox&&(r.bbox=t.bbox),r.features=e,r}function v(e,t,r={}){return p({type:"MultiLineString",coordinates:e},t,r)}function g(e){return!isNaN(e)&&null!==e&&!Array.isArray(e)}const m=11102230246251565e-32,E=134217729,h=(3+8*m)*m;function S(e,t,r,n,o){let i,a,l,s,c=t[0],u=n[0],p=0,d=0;u>c==u>-c?(i=c,c=t[++p]):(i=u,u=n[++d]);let f=0;if(p<e&&d<r)for(u>c==u>-c?(a=c+i,l=i-(a-c),c=t[++p]):(a=u+i,l=i-(a-u),u=n[++d]),i=a,0!==l&&(o[f++]=l);p<e&&d<r;)u>c==u>-c?(a=i+c,s=a-i,l=i-(a-s)+(c-s),c=t[++p]):(a=i+u,s=a-i,l=i-(a-s)+(u-s),u=n[++d]),i=a,0!==l&&(o[f++]=l);for(;p<e;)a=i+c,s=a-i,l=i-(a-s)+(c-s),c=t[++p],i=a,0!==l&&(o[f++]=l);for(;d<r;)a=i+u,s=a-i,l=i-(a-s)+(u-s),u=n[++d],i=a,0!==l&&(o[f++]=l);return 0===i&&0!==f||(o[f++]=i),f}function P(e){return new Float64Array(e)}const b=P(4),A=P(8),_=P(12),O=P(16),w=P(4);function M(e,t,r,n,o,i){const a=(t-i)*(r-o),l=(e-o)*(n-i),s=a-l,c=Math.abs(a+l);return Math.abs(s)>=33306690738754716e-32*c?s:-function(e,t,r,n,o,i,a){let l,s,c,u,p,d,f,y,v,g,m,P,M,k,T,I,L,C;const F=e-o,D=r-o,R=t-i,j=n-i;k=F*j,d=E*F,f=d-(d-F),y=F-f,d=E*j,v=d-(d-j),g=j-v,T=y*g-(k-f*v-y*v-f*g),I=R*D,d=E*R,f=d-(d-R),y=R-f,d=E*D,v=d-(d-D),g=D-v,L=y*g-(I-f*v-y*v-f*g),m=T-L,p=T-m,b[0]=T-(m+p)+(p-L),P=k+m,p=P-k,M=k-(P-p)+(m-p),m=M-I,p=M-m,b[1]=M-(m+p)+(p-I),C=P+m,p=C-P,b[2]=P-(C-p)+(m-p),b[3]=C;let x=function(e,t){let r=t[0];for(let n=1;n<e;n++)r+=t[n];return r}(4,b),N=22204460492503146e-32*a;if(x>=N||-x>=N)return x;if(p=e-F,l=e-(F+p)+(p-o),p=r-D,c=r-(D+p)+(p-o),p=t-R,s=t-(R+p)+(p-i),p=n-j,u=n-(j+p)+(p-i),0===l&&0===s&&0===c&&0===u)return x;if(N=11093356479670487e-47*a+h*Math.abs(x),x+=F*u+j*l-(R*c+D*s),x>=N||-x>=N)return x;k=l*j,d=E*l,f=d-(d-l),y=l-f,d=E*j,v=d-(d-j),g=j-v,T=y*g-(k-f*v-y*v-f*g),I=s*D,d=E*s,f=d-(d-s),y=s-f,d=E*D,v=d-(d-D),g=D-v,L=y*g-(I-f*v-y*v-f*g),m=T-L,p=T-m,w[0]=T-(m+p)+(p-L),P=k+m,p=P-k,M=k-(P-p)+(m-p),m=M-I,p=M-m,w[1]=M-(m+p)+(p-I),C=P+m,p=C-P,w[2]=P-(C-p)+(m-p),w[3]=C;const B=S(4,b,4,w,A);k=F*u,d=E*F,f=d-(d-F),y=F-f,d=E*u,v=d-(d-u),g=u-v,T=y*g-(k-f*v-y*v-f*g),I=R*c,d=E*R,f=d-(d-R),y=R-f,d=E*c,v=d-(d-c),g=c-v,L=y*g-(I-f*v-y*v-f*g),m=T-L,p=T-m,w[0]=T-(m+p)+(p-L),P=k+m,p=P-k,M=k-(P-p)+(m-p),m=M-I,p=M-m,w[1]=M-(m+p)+(p-I),C=P+m,p=C-P,w[2]=P-(C-p)+(m-p),w[3]=C;const G=S(B,A,4,w,_);k=l*u,d=E*l,f=d-(d-l),y=l-f,d=E*u,v=d-(d-u),g=u-v,T=y*g-(k-f*v-y*v-f*g),I=s*c,d=E*s,f=d-(d-s),y=s-f,d=E*c,v=d-(d-c),g=c-v,L=y*g-(I-f*v-y*v-f*g),m=T-L,p=T-m,w[0]=T-(m+p)+(p-L),P=k+m,p=P-k,M=k-(P-p)+(m-p),m=M-I,p=M-m,w[1]=M-(m+p)+(p-I),C=P+m,p=C-P,w[2]=P-(C-p)+(m-p),w[3]=C;const U=S(G,_,4,w,O);return O[U-1]}(e,t,r,n,o,i,c)}function k(e,t){var r,n,o,i,a,l,s,c,u,p=0,d=e[0],f=e[1],y=t.length;for(r=0;r<y;r++){n=0;var v=t[r],g=v.length-1;if((c=v[0])[0]!==v[g][0]&&c[1]!==v[g][1])throw new Error("First and last coordinates in a ring must be the same");for(i=c[0]-d,a=c[1]-f;n<g;n++){if(l=(u=v[n+1])[0]-d,s=u[1]-f,0===a&&0===s){if(l<=0&&i>=0||i<=0&&l>=0)return 0}else if(s>=0&&a<=0||s<=0&&a>=0){if(0===(o=M(i,l,a,s,0,0)))return 0;(o>0&&s>0&&a<=0||o<0&&s<=0&&a>0)&&p++}c=u,a=s,i=l}}return p%2!=0}function T(e){return"Feature"===e.type?e.geometry:e}function I(e,t,r={}){if(!e)throw new Error("point is required");if(!t)throw new Error("polygon is required");const n=function(e){if(!e)throw new Error("coord is required");if(!Array.isArray(e)){if("Feature"===e.type&&null!==e.geometry&&"Point"===e.geometry.type)return[...e.geometry.coordinates];if("Point"===e.type)return[...e.coordinates]}if(Array.isArray(e)&&e.length>=2&&!Array.isArray(e[0])&&!Array.isArray(e[1]))return[...e];throw new Error("coord must be GeoJSON Point or an Array of numbers")}(e),o=T(t),i=o.type,a=t.bbox;let l=o.coordinates;if(a&&!1===function(e,t){return t[0]<=e[0]&&t[1]<=e[1]&&t[2]>=e[0]&&t[3]>=e[1]}(n,a))return!1;"Polygon"===i&&(l=[l]);let s=!1;for(var c=0;c<l.length;++c){const e=k(n,l[c]);if(0===e)return!r.ignoreBoundary;e&&(s=!0)}return s}class L{constructor(e=[],t=C){if(this.data=e,this.length=this.data.length,this.compare=t,this.length>0)for(let e=(this.length>>1)-1;e>=0;e--)this._down(e)}push(e){this.data.push(e),this.length++,this._up(this.length-1)}pop(){if(0===this.length)return;const e=this.data[0],t=this.data.pop();return this.length--,this.length>0&&(this.data[0]=t,this._down(0)),e}peek(){return this.data[0]}_up(e){const{data:t,compare:r}=this,n=t[e];for(;e>0;){const o=e-1>>1,i=t[o];if(r(n,i)>=0)break;t[e]=i,e=o}t[e]=n}_down(e){const{data:t,compare:r}=this,n=this.length>>1,o=t[e];for(;e<n;){let n=1+(e<<1),i=t[n];const a=n+1;if(a<this.length&&r(t[a],i)<0&&(n=a,i=t[a]),r(i,o)>=0)break;t[e]=i,e=n}t[e]=o}}function C(e,t){return e<t?-1:e>t?1:0}function F(e,t){return e.p.x>t.p.x?1:e.p.x<t.p.x?-1:e.p.y!==t.p.y?e.p.y>t.p.y?1:-1:1}function D(e,t){return e.rightSweepEvent.p.x>t.rightSweepEvent.p.x?1:e.rightSweepEvent.p.x<t.rightSweepEvent.p.x?-1:e.rightSweepEvent.p.y!==t.rightSweepEvent.p.y?e.rightSweepEvent.p.y<t.rightSweepEvent.p.y?1:-1:1}class R{constructor(e,t,r,n){this.p={x:e[0],y:e[1]},this.featureId=t,this.ringId=r,this.eventId=n,this.otherEvent=null,this.isLeftEndpoint=null}isSamePoint(e){return this.p.x===e.p.x&&this.p.y===e.p.y}}let j=0,x=0,N=0;function B(e,t){const r="Feature"===e.type?e.geometry:e;let n=r.coordinates;"Polygon"!==r.type&&"MultiLineString"!==r.type||(n=[n]),"LineString"===r.type&&(n=[[n]]);for(let e=0;e<n.length;e++)for(let r=0;r<n[e].length;r++){let o=n[e][r][0],i=null;x+=1;for(let a=0;a<n[e][r].length-1;a++){i=n[e][r][a+1];const l=new R(o,j,x,N),s=new R(i,j,x,N+1);l.otherEvent=s,s.otherEvent=l,F(l,s)>0?(s.isLeftEndpoint=!0,l.isLeftEndpoint=!1):(l.isLeftEndpoint=!0,s.isLeftEndpoint=!1),t.push(l),t.push(s),o=i,N+=1}}j+=1}class G{constructor(e){this.leftSweepEvent=e,this.rightSweepEvent=e.otherEvent}}function U(e,t){if(null===e||null===t)return!1;if(e.leftSweepEvent.ringId===t.leftSweepEvent.ringId&&(e.rightSweepEvent.isSamePoint(t.leftSweepEvent)||e.rightSweepEvent.isSamePoint(t.leftSweepEvent)||e.rightSweepEvent.isSamePoint(t.rightSweepEvent)||e.leftSweepEvent.isSamePoint(t.leftSweepEvent)||e.leftSweepEvent.isSamePoint(t.rightSweepEvent)))return!1;const r=e.leftSweepEvent.p.x,n=e.leftSweepEvent.p.y,o=e.rightSweepEvent.p.x,i=e.rightSweepEvent.p.y,a=t.leftSweepEvent.p.x,l=t.leftSweepEvent.p.y,s=t.rightSweepEvent.p.x,c=t.rightSweepEvent.p.y,u=(c-l)*(o-r)-(s-a)*(i-n),p=(s-a)*(n-l)-(c-l)*(r-a),d=(o-r)*(n-l)-(i-n)*(r-a);if(0===u)return!1;const f=p/u,y=d/u;if(f>=0&&f<=1&&y>=0&&y<=1){return[r+f*(o-r),n+f*(i-n)]}return!1}var H=function(e,t){const r=new L([],F);return function(e,t){if("FeatureCollection"===e.type){const r=e.features;for(let e=0;e<r.length;e++)B(r[e],t)}else B(e,t)}(e,r),function(e,t){t=t||!1;const r=[],n=new L([],D);for(;e.length;){const o=e.pop();if(o.isLeftEndpoint){const e=new G(o);for(let i=0;i<n.data.length;i++){const a=n.data[i];if(t&&a.leftSweepEvent.featureId===o.featureId)continue;const l=U(e,a);!1!==l&&r.push(l)}n.push(e)}else!1===o.isLeftEndpoint&&n.pop()}return r}(r,t)};function V(e,t,r={}){const{removeDuplicates:n=!0,ignoreSelfIntersections:o=!0}=r;let i=[];"FeatureCollection"===e.type?i=i.concat(e.features):"Feature"===e.type?i.push(e):"LineString"!==e.type&&"Polygon"!==e.type&&"MultiLineString"!==e.type&&"MultiPolygon"!==e.type||i.push(p(e)),"FeatureCollection"===t.type?i=i.concat(t.features):"Feature"===t.type?i.push(t):"LineString"!==t.type&&"Polygon"!==t.type&&"MultiLineString"!==t.type&&"MultiPolygon"!==t.type||i.push(p(t));const a=H(y(i),o);let l=[];if(n){const e={};a.forEach(t=>{const r=t.join(",");e[r]||(e[r]=!0,l.push(t))})}else l=a;return y(l.map(e=>d(e)))}function K(e,t){!function(e,t){var r,n,o,i,a,l,s,c,u,p,d=0,f="FeatureCollection"===e.type,y="Feature"===e.type,v=f?e.features.length:1;for(r=0;r<v;r++){for(l=f?e.features[r].geometry:y?e.geometry:e,c=f?e.features[r].properties:y?e.properties:{},u=f?e.features[r].bbox:y?e.bbox:void 0,p=f?e.features[r].id:y?e.id:void 0,a=(s=!!l&&"GeometryCollection"===l.type)?l.geometries.length:1,o=0;o<a;o++)if(null!==(i=s?l.geometries[o]:l))switch(i.type){case"Point":case"LineString":case"MultiPoint":case"Polygon":case"MultiLineString":case"MultiPolygon":if(!1===t(i,d,c,u,p))return!1;break;case"GeometryCollection":for(n=0;n<i.geometries.length;n++)if(!1===t(i.geometries[n],d,c,u,p))return!1;break;default:throw new Error("Unknown Geometry Type")}else if(!1===t(null,d,c,u,p))return!1;d++}}(e,function(e,r,n,o,i){var a,l=null===e?null:e.type;switch(l){case null:case"Point":case"LineString":case"Polygon":return!1!==t(p(e,n,{bbox:o,id:i}),r,0)&&void 0}switch(l){case"MultiPoint":a="Point";break;case"MultiLineString":a="LineString";break;case"MultiPolygon":a="Polygon"}for(var s=0;s<e.coordinates.length;s++){var c=e.coordinates[s];if(!1===t(p({type:a,coordinates:c},n),r,s))return!1}})}function W(e,t={}){const r=T(e);switch(t.properties||"Feature"!==e.type||(t.properties=e.properties),r.type){case"Polygon":return function(e,t={}){const r=T(e),n=r.coordinates,o=t.properties?t.properties:"Feature"===e.type?e.properties:{};return Y(n,o)}(r,t);case"MultiPolygon":return function(e,t={}){const r=T(e),n=r.coordinates,o=t.properties?t.properties:"Feature"===e.type?e.properties:{},i=[];return n.forEach(e=>{i.push(Y(e,o))}),y(i)}(r,t);default:throw new Error("invalid poly")}}function Y(e,t){return e.length>1?v(e,t):f(e[0],t)}function q(e,t){for(let r=0;r<e.coordinates.length-1;r++)if(X(e.coordinates[r],e.coordinates[r+1],t.coordinates))return!0;return!1}function z(e,t,r){for(const r of t.coordinates)if(I(r,e))return!0;return V(t,W(e),{ignoreSelfIntersections:r}).features.length>0}function X(e,t,r){const n=r[0]-e[0],o=r[1]-e[1],i=t[0]-e[0],a=t[1]-e[1];return 0===n*a-o*i&&(Math.abs(i)>=Math.abs(a)?i>0?e[0]<=r[0]&&r[0]<=t[0]:t[0]<=r[0]&&r[0]<=e[0]:a>0?e[1]<=r[1]&&r[1]<=t[1]:t[1]<=r[1]&&r[1]<=e[1])}var Z=function(e,t,{ignoreSelfIntersections:r=!0}={ignoreSelfIntersections:!0}){let n=!0;return K(e,e=>{K(t,t=>{if(!1===n)return!1;n=function(e,t,r){switch(e.type){case"Point":switch(t.type){case"Point":return n=e.coordinates,o=t.coordinates,!(n[0]===o[0]&&n[1]===o[1]);case"LineString":return!q(t,e);case"Polygon":return!I(e,t)}break;case"LineString":switch(t.type){case"Point":return!q(e,t);case"LineString":return!function(e,t,r){const n=V(e,t,{ignoreSelfIntersections:r});if(n.features.length>0)return!0;return!1}(e,t,r);case"Polygon":return!z(t,e,r)}break;case"Polygon":switch(t.type){case"Point":return!I(t,e);case"LineString":return!z(e,t,r);case"Polygon":return!function(e,t,r){for(const r of e.coordinates[0])if(I(r,t))return!0;for(const r of t.coordinates[0])if(I(r,e))return!0;const n=V(W(e),W(t),{ignoreSelfIntersections:r});if(n.features.length>0)return!0;return!1}(t,e,r)}}var n,o;return!1}(e.geometry,t.geometry,r)})}),n};function J(e){var t=e.geometry||e;switch(t.type){case"Polygon":return function(e,t,r={}){for(const t of e){if(t.length<4)throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");if(t[t.length-1].length!==t[0].length)throw new Error("First and last Position are not equivalent.");for(let e=0;e<t[t.length-1].length;e++)if(t[t.length-1][e]!==t[0][e])throw new Error("First and last Position are not equivalent.")}return p({type:"Polygon",coordinates:e},t,r)}(t.coordinates);case"MultiPolygon":return function(e,t,r={}){return p({type:"MultiPolygon",coordinates:e},t,r)}(t.coordinates);case"LineString":return f(t.coordinates);case"MultiLineString":return v(t.coordinates);case"Point":return d(t.coordinates);case"MultiPoint":return function(e,t,r={}){return p({type:"MultiPoint",coordinates:e},t,r)}(t.coordinates);default:throw new Error("Unsupported geometry type: ".concat(t.type))}}function Q(e,t){return t.some(t=>!Z(J(t),J(e)))}function $(e){if(e.length<2)return!1;if(e.some(e=>{var t;return!(null!==(t=e.geometry)&&void 0!==t&&t.type)}))return!1;for(var t=new Set([0]),r=!0;r;){r=!1;for(var n=1;n<e.length;n++)if(!t.has(n)){var o=[...t].map(t=>e[t]);Q(e[n],o)&&(t.add(n),r=!0)}}return t.size===e.length}var ee=e=>{var t={};for(var r of e)t[r.layerId]=r;return t},te=(e,t,r)=>{try{return(null==e?void 0:e.getFeaturesAtPoint(t,r))||[]}catch(e){return console.warn("Feature query failed:",e),[]}},re=e=>{var t,r=null===(t=e.geometry)||void 0===t?void 0:t.type;return"Point"===r||"MultiPoint"===r};var ne=(e,t)=>{if(!e)return null;if("string"==typeof e)return e.trim();if("object"==typeof e){if(t&&e[t])return e[t];var r=Object.values(e)[0];return null!=r?r:null}return null},oe=e=>!!e.label&&(!e.symbol&&!e.symbolSvgContent&&(null===e.symbol||null===e.symbolSvgContent)),ie={light:{haloColor:"#ffffff",selectedColor:"#0b0c0c",activeColor:"#ffdd00",foregroundColor:"#0b0c0c"},dark:{haloColor:"#0b0c0c",selectedColor:"#ffffff",activeColor:"#ffdd00",foregroundColor:"#ffffff"}};function ae(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function le(t){for(var r=1;r<arguments.length;r++){var n=null!=arguments[r]?arguments[r]:{};r%2?ae(Object(n),!0).forEach(function(r){e(t,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):ae(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))})}return t}var se={slot:"middle",open:!1,dismissible:!0,modal:!0};le({},se),le(le({},se),{},{width:"500px"}),le(le({},se),{},{width:"500px"});var ce={small:1,medium:1.5,large:2};function ue(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function pe(t){for(var r=1;r<arguments.length;r++){var n=null!=arguments[r]?arguments[r]:{};r%2?ue(Object(n),!0).forEach(function(r){e(t,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):ue(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))})}return t}var de=(e,t,r,n)=>({featureId:e,multiSelect:t,layerId:r.layerId,idProperty:r.idProperty,properties:n.properties,geometry:n.geometry}),fe=e=>{var t,{featureId:r,feature:n,config:o,selectedFeatures:i,dispatch:a,multiSelect:l}=e;if(!i.length)return!1;var s=i.findIndex(e=>e.featureId===r&&e.layerId===o.layerId);if(-1!==s){if(i.length<3)return!1;var c=(e=>{for(var t=new Set([0]),r=!0;r;){r=!1;for(var n=1;n<e.length;n++){var o;if(!t.has(n)){var i=[...t].map(t=>e[t]);null!==(o=e[n].geometry)&&void 0!==o&&o.type&&Q(e[n],i)&&(t.add(n),r=!0)}}}return t.size===e.length?null:[...t].map(t=>e[t])})(i.filter((e,t)=>t!==s));return!!c&&(a({type:"SET_SELECTED_FEATURES",payload:c}),!0)}var u=i.filter(e=>{var t;return null===(t=e.geometry)||void 0===t?void 0:t.type});return!(null===(t=n.geometry)||void 0===t||!t.type||!u.length)&&(!Q(n,u)&&(a({type:"TOGGLE_SELECTED_FEATURES",payload:pe(pe({},de(r,l,o,n)),{},{replaceAll:!0})}),!0))},ye=e=>{var{mapProvider:t,layers:r,interactionModes:n,multiSelect:i,dispatch:a,markers:l,layerConfigMap:s,debug:c,tolerance:u,processFeatureMatch:p,processFallback:d,scale:f}=e;return o(e=>{var{point:o,coords:y}=e,v=c?te(t,o,{radius:u}):null;if(v&&((e,t)=>{var[r,n]=e;console.groupCollapsed("[interact] click (".concat(r.toFixed(4),", ").concat(n.toFixed(4),") — ").concat(t.length," feature").concat(1!==t.length?"s":"")),t.forEach(e=>{var t,r;console.log({layer:e.layer.id,type:e.layer.type,id:null!==(t=e.id)&&void 0!==t?t:"—",sourceLayer:null!==(r=e.sourceLayer)&&void 0!==r?r:"—",properties:e.properties})}),console.groupEnd()})(y,v),n.includes("selectMarker")){var g=((e,t,r)=>{for(var n of e.items){var o,i=null===(o=e.markerRefs)||void 0===o?void 0:o.get(n.id);if(i&&!oe(n)){var a=i.closest(".im-c-viewport__markers")||i.parentElement,l=a?a.getBoundingClientRect():{left:0,top:0},{left:s,top:c,right:u,bottom:p}=i.getBoundingClientRect(),d=t.x*r,f=t.y*r;if(d>=s-l.left&&d<=u-l.left&&f>=c-l.top&&f<=p-l.top)return n.id}}return null})(l,o,f);if(g)return void a({type:"TOGGLE_SELECTED_MARKERS",payload:{markerId:g,multiSelect:i}})}if(n.includes("selectFeature")&&r.length>0){var m=((e,t)=>{var r=e.filter(e=>{var r;return t[null===(r=e.layer)||void 0===r?void 0:r.id]}),n=r.find(re);if(n)return{feature:n,config:t[n.layer.id]};var o=r[0];return o?{feature:o,config:t[o.layer.id]}:null})(null!=v?v:te(t,o,{radius:u}),s);if(m)return void p(m)}d({coords:y})},[t,r,n,i,a,l,s,c,u,p,d,f])},ve=e=>{var t,{mapState:r,pluginState:n,services:l,mapProvider:s}=e,{markers:c,mapSize:u}=r,{dispatch:p,layers:d,interactionModes:f,multiSelect:y,contiguous:v,marker:g,tolerance:m,selectedFeatures:E,selectedMarkers:h,deselectOnClickOutside:S}=n,{eventBus:P}=l,b=ee(d),A=null!==(t=ce[u])&&void 0!==t?t:1,_=o(e=>{var t,r,n,{feature:o,config:i}=e;c.remove("location");var a=null!==(t=null===(r=o.properties)||void 0===r?void 0:r[i.idProperty])&&void 0!==t?t:o.id;if(null!=a){var l=null===(n=s.getFeatureGeometry)||void 0===n?void 0:n.call(s,i.layerId,a,i.idProperty),u=l?pe(pe({},o),{},{geometry:l}):o;if(v&&y)if(fe({featureId:a,feature:u,config:i,selectedFeatures:E,dispatch:p,multiSelect:y}))return;p({type:"TOGGLE_SELECTED_FEATURES",payload:de(a,y,i,u)})}},[c,p,y,v,E,s]),O=o(e=>{var{coords:t}=e,r=f.includes("placeMarker");(r||S)&&(p({type:"CLEAR_SELECTED_FEATURES"}),r&&(c.add("location",t,g),P.emit("interact:markerchange",{coords:t})))},[f,p,c,g,P,S]),w=ye({mapProvider:s,layers:d,interactionModes:f,multiSelect:y,dispatch:p,markers:c,layerConfigMap:b,debug:null==n?void 0:n.debug,tolerance:m,processFeatureMatch:_,processFallback:O,scale:A});return((e,t,r)=>{var n=i(null);a(()=>{var o=n.current;(null===o||0===o.features.length&&0===o.markers.length)&&0===t.length&&0===r.length||(e.emit("interact:selectionchange",{selectedFeatures:t.map(e=>{var{featureId:t,layerId:r,idProperty:n,properties:o,geometry:i}=e;return{featureId:t,layerId:r,idProperty:n,properties:o,geometryType:null==i?void 0:i.type}}),selectedMarkers:r,contiguous:$(t)}),n.current={features:t,markers:r})},[t,r])})(P,E,h),{handleInteraction:w}};function ge(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function me(t){for(var r=1;r<arguments.length;r++){var n=null!=arguments[r]?arguments[r]:{};r%2?ge(Object(n),!0).forEach(function(r){e(t,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):ge(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))})}return t}var Ee=(e,t)=>{var r,n;return t?null!==(r=null===(n=e.properties)||void 0===n?void 0:n[t.idProperty])&&void 0!==r?r:e.id:null},he=e=>{var t=e.closest(".im-c-viewport__markers");if(!t)return!1;var r=t.getBoundingClientRect(),{left:n,right:o,top:i,bottom:a}=e.getBoundingClientRect();return o>r.left&&n<r.right&&a>r.top&&i<r.bottom},Se=(e,t,r)=>{var n,o,i,a=t[null===(n=e.layer)||void 0===n?void 0:n.id];if(null==a||!a.labelProperty)return null;var l=Ee(e,a),s=null==l?null:String(l);return null==s||r.has(s)?null:(r.add(s),{id:s,label:null!==(o=null===(i=e.properties)||void 0===i?void 0:i[a.labelProperty])&&void 0!==o?o:s})};function Pe(e){var{markers:t,interactionModes:r,layers:n,mapProvider:o,multiSelect:i,eventBus:l}=e;a(()=>{var e=()=>{var e=[];null!=r&&r.includes("selectMarker")&&e.push(...(e=>{var t=[];for(var r of e.items){var n;if(r.label){var o=null===(n=e.markerRefs)||void 0===n?void 0:n.get(r.id);!oe(r)&&o&&he(o)&&t.push({id:r.id,label:r.label})}}return t})(t)),null!=r&&r.includes("selectFeature")&&n.length>0&&e.push(...((e,t)=>{var r=[],n=new Set,o=t.map(e=>e.layerId),i=ee(t),a=e.getVisibleFeatures(o);for(var l of a){var s=Se(l,i,n);s&&r.push(s)}return r})(o,n)),l.emit(u.MAP_SET_FEATURES,{items:e,multiselectable:i})};return e(),l.on(u.MAP_MOVE_END,e),l.on(u.MAP_DATA_CHANGE,e),()=>{l.off(u.MAP_MOVE_END,e),l.off(u.MAP_DATA_CHANGE,e)}},[t,r,n,o,i,l])}function be(e){var{markers:t,interactionModes:r,layers:n,mapProvider:o,eventBus:i,dispatch:l,listboxActiveItemRef:s}=e;a(()=>{var e=e=>{var{id:i}=e;if(null===i)return s.current=null,void l({type:"SET_LISTBOX_ACTIVE",payload:null});if(t.items.some(e=>e.id===i))return s.current={id:i,isMarker:!0},void l({type:"SET_LISTBOX_ACTIVE",payload:null});if(null!=r&&r.includes("selectFeature")&&n.length>0){var a=n.map(e=>e.layerId),c=ee(n),u=((e,t,r)=>{for(var n of e){var o,i=t[null===(o=n.layer)||void 0===o?void 0:o.id],a=Ee(n,i);if(null!=a&&String(a)===String(r))return{feature:n,config:i,rawId:a}}return null})(o.getVisibleFeatures(a),c,i);if(u){var p={featureId:u.rawId,layerId:u.config.layerId,idProperty:u.config.idProperty,geometry:u.feature.geometry};s.current=me(me({id:i,isMarker:!1},p),{},{properties:u.feature.properties}),l({type:"SET_LISTBOX_ACTIVE",payload:p})}}};return i.on(u.MAP_SET_ACTIVE_FEATURE,e),()=>{i.off(u.MAP_SET_ACTIVE_FEATURE,e)}},[t,r,n,o,i,l,s])}function Ae(e){var{mapState:t,pluginState:r,services:n,mapProvider:o}=e,{markers:l}=t,{dispatch:s,interactionModes:c,layers:p,multiSelect:d}=r,{eventBus:f}=n,y=i(null);Pe({markers:l,interactionModes:c,layers:p,mapProvider:o,multiSelect:d,eventBus:f}),be({markers:l,interactionModes:c,layers:p,mapProvider:o,eventBus:f,dispatch:s,listboxActiveItemRef:y}),function(e){var{eventBus:t,dispatch:r,listboxActiveItemRef:n,multiSelect:o}=e;a(()=>{var e=()=>{var e=n.current;if(e)if(e.isMarker)r({type:"TOGGLE_SELECTED_MARKERS",payload:{markerId:e.id,multiSelect:o}});else{var{featureId:t,layerId:i,idProperty:a,geometry:l,properties:s}=e;r({type:"TOGGLE_SELECTED_FEATURES",payload:{featureId:t,layerId:i,idProperty:a,geometry:l,properties:s,multiSelect:o,replaceAll:!o}})}};return t.on(u.MAP_SELECT_FEATURE,e),()=>{t.off(u.MAP_SELECT_FEATURE,e)}},[t,r,n,o])}({eventBus:f,dispatch:s,listboxActiveItemRef:y,multiSelect:d})}var _e=e=>{var{mapProvider:t,mapStyle:r,pluginState:n,selectedFeatures:o,events:i,eventBus:s}=e,{layers:c,listboxActiveItem:u}=n,p=l(()=>r?((e,t)=>{var r,n,o,i={};if(!t)return console.warn("[interact] buildStylesMap: mapStyle is null/undefined, cannot build styles"),i;var a=null!==(r=ie[t.mapColorScheme])&&void 0!==r?r:ie.light,l=null!==(n=t.activeColor)&&void 0!==n?n:a.activeColor,s=null!==(o=t.selectedColor)&&void 0!==o?o:a.selectedColor;return e.forEach(e=>{var r=e.activeStroke||l,n=e.selectedStroke||s,o=e.selectedFill||"transparent",a=e.selectedStrokeWidth||3,c=a+6;i[e.layerId]={stroke:ne(r,t.id),selectionStroke:ne(n,t.id),fill:ne(o,t.id),strokeWidth:a,activeStrokeWidth:c}}),i})(c,r):null,[c,r]),d=()=>{var e,r=u?[{featureId:u.featureId,layerId:u.layerId,idProperty:u.idProperty,geometry:u.geometry}]:[];null===(e=t.updateHighlightedFeatures)||void 0===e||e.call(t,o,r,p)};a(()=>{if(t&&p){d();var e=()=>{s.once(i.MAP_DATA_CHANGE,d)};return s.on(i.MAP_STYLE_CHANGE,e),()=>{s.off(i.MAP_STYLE_CHANGE,e)}}},[o,u,t,p,s])};function Oe(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function we(t){for(var r=1;r<arguments.length;r++){var n=null!=arguments[r]?arguments[r]:{};r%2?Oe(Object(n),!0).forEach(function(r){e(t,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):Oe(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))})}return t}function Me(e){var t,r,n,{getAppState:o,mapState:i,getPluginState:a,buttonConfig:l,events:s,eventBus:c,handleInteraction:u,clickReadyRef:p}=e,{selectAtTarget:d}=l,f=()=>u(i.crossHair.getDetail()),y=e=>{p.current&&u(e)},{handleKeydown:v,handleKeyup:g}=(t=o().layoutRefs.viewportRef,r=f,n=!1,{handleKeydown:e=>{n="Enter"===e.key&&t.current===e.target},handleKeyup:e=>{"Enter"===e.key&&n&&(e.preventDefault(),r())}}),m=((e,t)=>(r,n)=>{var o=t();e.markers.remove("location"),o.dispatch({type:"TOGGLE_SELECTED_FEATURES",payload:we({multiSelect:o.multiSelect,addToExisting:n},r)})})(i,a),E=e=>m(e,!0),h=e=>m(e,!1);return document.addEventListener("keydown",v),document.addEventListener("keyup",g),c.on(s.MAP_CLICK,y),c.on("interact:selectFeature",E),c.on("interact:unselectFeature",h),d.onClick=f,()=>{d.onClick=null,document.removeEventListener("keydown",v),document.removeEventListener("keyup",g),c.off(s.MAP_CLICK,y),c.off("interact:selectFeature",E),c.off("interact:unselectFeature",h)}}var ke=e=>1===(null==e?void 0:e.length)&&e.includes("selectMarker");function Te(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function Ie(t){for(var r=1;r<arguments.length;r++){var n=null!=arguments[r]?arguments[r]:{};r%2?Te(Object(n),!0).forEach(function(r){e(t,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):Te(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))})}return t}var Le={ENABLE:(e,t)=>Ie(Ie(Ie({},e),t),{},{enabled:!0}),DISABLE:e=>Ie(Ie({},e),{},{enabled:!1,selectedFeatures:[],selectedMarkers:[],listboxActiveItem:null}),TOGGLE_SELECTED_FEATURES:(e,t)=>{var{featureId:r,multiSelect:n,layerId:o,idProperty:i,addToExisting:a=!0,replaceAll:l=!1,properties:s,geometry:c}=t,u=Array.isArray(e.selectedFeatures)?e.selectedFeatures:[],p=u.findIndex(e=>e.featureId===r&&e.layerId===o);if(!1===a){var d=u.filter((e,t)=>t!==p);return Ie(Ie({},e),{},{selectedFeatures:d})}var f,y={featureId:r,layerId:o,idProperty:i,properties:s,geometry:c};if(n&&!l){var v=[...u];-1===p?v.push(y):v.splice(p,1),f=v}else{f=-1!==p&&1===u.length?[]:[y]}return Ie(Ie({},e),{},{selectedFeatures:f,selectedMarkers:n&&!l?e.selectedMarkers:[]})},TOGGLE_SELECTED_MARKERS:(e,t)=>{var{markerId:r,multiSelect:n}=t,o=e.selectedMarkers,i=o.includes(r);if(n){var a=i?o.filter(e=>e!==r):[...o,r];return Ie(Ie({},e),{},{selectedMarkers:a})}return Ie(Ie({},e),{},{selectedFeatures:[],selectedMarkers:i&&1===o.length?[]:[r]})},CLEAR_SELECTED_FEATURES:e=>Ie(Ie({},e),{},{selectedFeatures:[],selectedMarkers:[]}),SET_SELECTED_FEATURES:(e,t)=>Ie(Ie({},e),{},{selectedFeatures:t}),SELECT_MARKER:(e,t)=>{var{markerId:r,multiSelect:n}=t,o=e.selectedMarkers;if(o.includes(r))return e;var i=n?[...o,r]:[r];return Ie(Ie({},e),{},{selectedFeatures:n?e.selectedFeatures:[],selectedMarkers:i})},UNSELECT_MARKER:(e,t)=>{var{markerId:r}=t,n=e.selectedMarkers;return n.includes(r)?Ie(Ie({},e),{},{selectedMarkers:n.filter(e=>e!==r)}):e},SET_LISTBOX_ACTIVE:(e,t)=>Ie(Ie({},e),{},{listboxActiveItem:null!=t?t:null})},Ce={tolerance:10,interactionModes:["selectMarker"],multiSelect:!1,contiguous:!1,deselectOnClickOutside:!1,marker:{}};function Fe(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function De(t){for(var r=1;r<arguments.length;r++){var n=null!=arguments[r]?arguments[r]:{};r%2?Fe(Object(n),!0).forEach(function(r){e(t,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):Fe(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))})}return t}var Re="Select features",je={InitComponent:e=>{var{appState:t,mapState:r,services:n,buttonConfig:l,mapProvider:s,pluginState:c}=e,{enabled:p,selectedFeatures:d,interactionModes:f,layers:y}=c,{eventBus:v}=n,{crossHair:g,mapStyle:m,markers:E}=r,h=ke(f);Ae({mapState:r,pluginState:c,services:n,mapProvider:s});var{handleInteraction:S}=ve({mapState:r,pluginState:c,services:n,mapProvider:s});return _e({mapProvider:s,mapStyle:m,pluginState:c,selectedFeatures:d,events:u,eventBus:v}),a(()=>{v.emit("interact:active",{active:p,interactionModes:f})},[p,f]),function(e){var{enabled:t,interactionModes:r,markers:n,layers:o,eventBus:i}=e;a(()=>{if(t){var e=(null==r?void 0:r.includes("selectMarker"))&&n.items.some(e=>e.label),a=(null==r?void 0:r.includes("selectFeature"))&&o.some(e=>e.labelProperty);(e||a)&&i.emit("interact:listboxcapable")}},[t,r,n,o,i])}({enabled:p,interactionModes:f,markers:E,layers:y,eventBus:v}),((e,t,r,n)=>{a(()=>{var o,i=t&&(null==r?void 0:r.includes("selectFeature"))?n.map(e=>e.layerId):[];return null===(o=e.setHoverCursor)||void 0===o||o.call(e,i),()=>{var t;return null===(t=e.setHoverCursor)||void 0===t?void 0:t.call(e,[])}},[t,r,n])})(s,p,f,y),function(e){var{crossHair:t,enabled:r,selectMarkerOnly:n,appState:l}=e,s=i(r);s.current=r;var c=i(n);c.current=n;var u=i(t);u.current=t;var p=i(!1),d=i(!1),f=i(l.interfaceType);f.current=l.interfaceType;var y=o(()=>{var e=f.current,t="keyboard"===e&&d.current,r="touch"===e&&!c.current&&!p.current;s.current&&(t||r)?u.current.fixAtCenter():u.current.hide()},[]);a(()=>{y()},[r,n,l.interfaceType,y]),a(()=>{var e,t,r=null===(e=l.layoutRefs)||void 0===e||null===(e=e.appContainerRef)||void 0===e?void 0:e.current;if(r){d.current=!(null===(t=document.activeElement)||void 0===t||!t.closest("[data-map-keyboard-scope]"));var n=e=>{var t=!!e.target.closest('[role="listbox"], [role="option"]'),r=!!e.target.closest("[data-map-keyboard-scope]"),n=p.current!==t||d.current!==r;p.current=t,d.current=r,n&&s.current&&y()};return r.addEventListener("focusin",n),()=>{r.removeEventListener("focusin",n)}}},[l.layoutRefs,y])}({crossHair:g,enabled:p,selectMarkerOnly:h,appState:t}),function(e){var{pluginState:t,appState:r,mapState:n,buttonConfig:o,eventBus:l,handleInteraction:s}=e,c=i(s);c.current=s;var p=i(t);p.current=t;var d=i(r);d.current=r;var f=i(!1);a(()=>{f.current=!1;var e=setTimeout(()=>{f.current=!0},0);return()=>clearTimeout(e)},[t.enabled]),a(()=>{if(t.enabled)return Me({getAppState:()=>d.current,mapState:n,getPluginState:()=>p.current,buttonConfig:o,events:u,eventBus:l,handleInteraction:e=>c.current(e),clickReadyRef:f})},[t.enabled,o,l])}({pluginState:c,appState:t,mapState:r,buttonConfig:l,eventBus:v,handleInteraction:S}),null},reducer:{initialState:{enabled:!1,layers:[],marker:null,interactionModes:null,multiSelect:!1,deselectOnClickOutside:!1,selectedFeatures:[],selectedMarkers:[],closeOnAction:!0,listboxActiveItem:null},actions:Le},buttons:[{id:"selectAtTarget",label:"Select",variant:"primary",hiddenWhen:e=>{var{appState:t,pluginState:r}=e;return!r.enabled||"touch"!==t.interfaceType||ke(r.interactionModes)},mobile:{slot:"actions"},tablet:{slot:"actions"},desktop:{slot:"actions"}}],keyboardShortcuts:[{id:"clickAtTarget",title:"Click at target",command:"<kbd>Enter</kbd>"},{id:"selectFeatures",group:Re,context:"listbox",title:"Select features",command:"<kbd>Tab</kbd>"},{id:"navigateFeatures",group:Re,context:"listbox",title:"Navigate features",command:"<kbd>↑</kbd> or <kbd>↓</kbd>"},{id:"selectFeature",group:Re,context:"listbox",title:"Select a feature",command:"<kbd>Enter</kbd> or <kbd>Space</kbd>"},{id:"dismissHintOrReturn",group:Re,context:"listbox",title:"Dismiss hint / return to map",command:"<kbd>Escape</kbd>"}],icons:[{id:"select",svgContent:'<path d="M22 14a8 8 0 0 1-8 8"/><path d="M18 11v-1a2 2 0 0 0-2-2a2 2 0 0 0-2 2"/><path d="M14 10V9a2 2 0 0 0-2-2a2 2 0 0 0-2 2v1"/><path d="M10 9.5V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v10"/><path d="M18 11a2 2 0 1 1 4 0v3a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15"/>'}],api:{enable:(e,t)=>{var{pluginState:r,pluginConfig:n}=e;r.dispatch({type:"ENABLE",payload:De(De(De({},Ce),n),t)})},disable:e=>{var{pluginState:t}=e;t.dispatch({type:"DISABLE"})},clear:e=>{var{pluginState:t,mapState:r}=e;t.dispatch({type:"CLEAR_SELECTED_FEATURES"}),r.markers.remove("location")},selectFeature:(e,t)=>{var{services:r}=e,{featureId:n,layerId:o,idProperty:i}=t;r.eventBus.emit("interact:selectFeature",{featureId:n,layerId:o,idProperty:i})},unselectFeature:(e,t)=>{var{services:r}=e,{featureId:n,layerId:o,idProperty:i}=t;r.eventBus.emit("interact:unselectFeature",{featureId:n,layerId:o,idProperty:i})},selectMarker:(e,t)=>{var{pluginState:r}=e;r.dispatch({type:"SELECT_MARKER",payload:{markerId:t,multiSelect:r.multiSelect}})},unselectMarker:(e,t)=>{var{pluginState:r}=e;r.dispatch({type:"UNSELECT_MARKER",payload:{markerId:t}})}}};export{je as manifest};