@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.
- package/dist/css/index.css +1 -1
- package/dist/esm/im-core.js +1 -1
- package/dist/esm/im-shell.js +1 -1
- package/dist/umd/im-core.js +1 -1
- package/dist/umd/index.js +1 -1
- package/docs/api.md +4 -4
- package/docs/plugins/draw.md +1 -1
- package/package.json +1 -1
- package/plugins/beta/map-styles/dist/esm/im-map-styles-plugin.js +1 -1
- package/plugins/beta/map-styles/dist/umd/im-map-styles-plugin.js +1 -1
- package/plugins/beta/map-styles/dist/umd/index.js +1 -1
- package/plugins/datasets/dist/esm/esriLayerAdapter.js +1 -1
- package/plugins/datasets/dist/esm/im-datasets-ml-adapter.js +1 -1
- package/plugins/datasets/dist/esm/im-datasets-plugin.js +1 -1
- package/plugins/datasets/dist/umd/im-datasets-esri-adapter.js +1 -1
- package/plugins/datasets/dist/umd/im-datasets-ml-adapter.js +1 -1
- package/plugins/datasets/dist/umd/im-datasets-plugin.js +1 -1
- package/plugins/datasets/src/adapters/esri/esriLayerAdapter.js +2 -3
- package/plugins/datasets/src/adapters/esri/registry/esriDataset.js +1 -1
- package/plugins/datasets/src/adapters/loadLayerAdapter.js +1 -1
- package/plugins/datasets/src/adapters/maplibre/maplibreLayerAdapter.js +1 -3
- package/plugins/datasets/src/adapters/maplibre/maplibreLayerAdapter.test.js +3 -3
- package/plugins/datasets/src/initialise/initialiseDatasets.js +0 -1
- package/plugins/datasets/src/registry/dataset.js +2 -3
- package/plugins/datasets/src/registry/datasetRegistry.js +0 -3
- package/plugins/datasets/src/registry/datasetRegistry.test.js +1 -1
- package/plugins/datasets/src/registry/globalDataset.js +0 -3
- package/plugins/draw/dist/esm/im-draw-ol-adapter.js +1 -1
- package/plugins/draw/dist/umd/im-draw-ol-adapter.js +1 -1
- package/plugins/draw/src/DrawInit.jsx +2 -2
- package/plugins/draw/src/adapters/maplibre/MaplibreDrawAdapter.js +1 -1
- package/plugins/draw/src/adapters/maplibre/modes/drawMode/pointerHandlers.js +1 -1
- package/plugins/draw/src/adapters/maplibre/modes/drawMode/pointerHandlers.test.js +1 -1
- package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/keyboardHandlers.js +1 -1
- package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/vertexOperations.js +3 -3
- package/plugins/draw/src/adapters/maplibre/modes/editVertexMode/vertexOperations.test.js +1 -1
- package/plugins/draw/src/adapters/maplibre/modes/editVertexMode.test.js +1 -1
- package/plugins/draw/src/adapters/openlayers/draw/DrawMode.js +1 -0
- package/plugins/draw/src/adapters/openlayers/draw/DrawMode.test.js +15 -1
- package/plugins/draw/src/adapters/openlayers/draw/drawInput.js +17 -3
- package/plugins/draw/src/adapters/openlayers/draw/drawInput.test.js +47 -3
- package/plugins/draw/src/adapters/openlayers/edit/EditMode.js +1 -1
- package/plugins/draw/src/adapters/openlayers/edit/EditMode.test.js +1 -1
- package/plugins/draw/src/adapters/openlayers/edit/keyboardHandler.test.js +1 -1
- package/plugins/draw/src/adapters/openlayers/edit/nudge.js +2 -2
- package/plugins/draw/src/adapters/openlayers/edit/nudge.test.js +2 -2
- package/plugins/draw/src/events.js +4 -4
- package/plugins/draw/src/events.test.js +1 -1
- package/plugins/interact/dist/esm/im-interact-plugin.js +1 -1
- package/plugins/interact/dist/umd/im-interact-plugin.js +1 -1
- package/plugins/interact/dist/umd/index.js +1 -1
- package/plugins/interact/src/hooks/useCrossHairVisibility.js +12 -4
- package/plugins/interact/src/hooks/useCrossHairVisibility.test.js +88 -1
- package/plugins/search/dist/esm/im-search-plugin.js +1 -1
- package/plugins/search/dist/umd/im-search-plugin.js +1 -1
- package/plugins/search/src/Search.jsx +5 -2
- package/sonar-project.properties +7 -1
- package/src/App/components/Attributions/Attributions.module.scss +10 -0
- package/src/App/components/Hints/Hints.jsx +7 -2
- package/src/App/components/KeyboardHelp/KeyboardHelp.jsx +2 -3
- package/src/App/components/KeyboardHelp/KeyboardHelp.test.jsx +3 -6
- package/src/App/components/{MoveControl/MoveControl.jsx → MoveControls/MoveControls.jsx} +10 -10
- package/src/App/components/{MoveControl/MoveControl.module.scss → MoveControls/MoveControls.module.scss} +24 -24
- package/src/App/components/{MoveControl/MoveControl.test.jsx → MoveControls/MoveControls.test.jsx} +48 -48
- package/src/App/components/Viewport/Viewport.jsx +9 -1
- package/src/App/components/Viewport/Viewport.test.jsx +11 -0
- package/src/App/initialiseApp.js +11 -8
- package/src/App/initialiseApp.test.js +15 -3
- package/src/App/layout/Layout.jsx +3 -1
- package/src/App/registry/keyboardShortcutRegistry.js +25 -13
- package/src/App/registry/keyboardShortcutRegistry.test.js +49 -32
- package/src/App/registry/pluginRegistry.js +1 -2
- package/src/App/registry/pluginRegistry.test.js +4 -3
- package/src/App/store/AppProvider.jsx +3 -2
- package/src/InteractiveMap/InteractiveMap.js +8 -2
- package/src/InteractiveMap/InteractiveMap.test.js +20 -3
- package/src/config/appConfig.js +17 -15
- package/src/config/appConfig.test.js +22 -22
- package/src/config/defaults.js +3 -1
- package/src/config/mergeConfig.js +7 -0
- package/src/config/mergeConfig.test.js +20 -0
- package/src/scss/main.scss +1 -1
- package/src/test-utils.js +5 -0
- 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
|
|
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
|
|
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
|
-
//
|
|
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
|
|
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
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
//
|
|
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 (
|
|
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
|
|
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
|
|
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:
|
|
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 (
|
|
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 —
|
|
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
|
|
33
|
-
// mapProvider.activeMoveTarget contract (
|
|
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
|
-
//
|
|
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
|
|
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
|
|
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};
|