maplibre-gl-basemap-control 0.1.0
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/LICENSE +21 -0
- package/README.md +190 -0
- package/dist/BasemapControl-C40PophU.js +1343 -0
- package/dist/BasemapControl-C40PophU.js.map +1 -0
- package/dist/BasemapControl-pnHGO378.cjs +1342 -0
- package/dist/BasemapControl-pnHGO378.cjs.map +1 -0
- package/dist/index.cjs +57 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.mjs +57 -0
- package/dist/index.mjs.map +1 -0
- package/dist/maplibre-gl-basemap-control.css +272 -0
- package/dist/react.cjs +126 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.mjs +126 -0
- package/dist/react.mjs.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/lib/core/BasemapControl.d.ts +57 -0
- package/dist/types/lib/core/BasemapControl.d.ts.map +1 -0
- package/dist/types/lib/core/BasemapControlReact.d.ts +3 -0
- package/dist/types/lib/core/BasemapControlReact.d.ts.map +1 -0
- package/dist/types/lib/core/catalog.d.ts +14 -0
- package/dist/types/lib/core/catalog.d.ts.map +1 -0
- package/dist/types/lib/core/types.d.ts +85 -0
- package/dist/types/lib/core/types.d.ts.map +1 -0
- package/dist/types/lib/hooks/index.d.ts +2 -0
- package/dist/types/lib/hooks/index.d.ts.map +1 -0
- package/dist/types/lib/hooks/useBasemapState.d.ts +12 -0
- package/dist/types/lib/hooks/useBasemapState.d.ts.map +1 -0
- package/dist/types/lib/utils/helpers.d.ts +86 -0
- package/dist/types/lib/utils/helpers.d.ts.map +1 -0
- package/dist/types/lib/utils/index.d.ts +2 -0
- package/dist/types/lib/utils/index.d.ts.map +1 -0
- package/dist/types/react.d.ts +4 -0
- package/dist/types/react.d.ts.map +1 -0
- package/package.json +107 -0
package/dist/react.cjs
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const react = require("react");
|
|
4
|
+
const BasemapControl = require("./BasemapControl-pnHGO378.cjs");
|
|
5
|
+
function BasemapControlReact({
|
|
6
|
+
map,
|
|
7
|
+
onStateChange,
|
|
8
|
+
onBasemapChange,
|
|
9
|
+
onError,
|
|
10
|
+
activeBasemapId,
|
|
11
|
+
...options
|
|
12
|
+
}) {
|
|
13
|
+
const controlRef = react.useRef(null);
|
|
14
|
+
const basemapKey = react.useMemo(
|
|
15
|
+
() => {
|
|
16
|
+
var _a;
|
|
17
|
+
return ((_a = options.basemaps) == null ? void 0 : _a.map((basemap) => basemap.id).join("|")) ?? "";
|
|
18
|
+
},
|
|
19
|
+
[options.basemaps]
|
|
20
|
+
);
|
|
21
|
+
const didInitCatalog = react.useRef(false);
|
|
22
|
+
react.useEffect(() => {
|
|
23
|
+
const control = new BasemapControl.BasemapControl({
|
|
24
|
+
...options,
|
|
25
|
+
defaultBasemapId: activeBasemapId ?? options.defaultBasemapId
|
|
26
|
+
});
|
|
27
|
+
controlRef.current = control;
|
|
28
|
+
if (onStateChange) {
|
|
29
|
+
control.on("statechange", (event) => onStateChange(event.state));
|
|
30
|
+
}
|
|
31
|
+
if (onBasemapChange) {
|
|
32
|
+
control.on("basemapchange", (event) => {
|
|
33
|
+
if (event.type === "basemapchange") {
|
|
34
|
+
onBasemapChange(event.basemap, event.state);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
if (onError) {
|
|
39
|
+
control.on("error", (event) => {
|
|
40
|
+
if (event.type === "error") {
|
|
41
|
+
onError(event.error, event.state);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
map.addControl(control, options.position ?? "top-right");
|
|
46
|
+
return () => {
|
|
47
|
+
if (map.hasControl(control)) {
|
|
48
|
+
map.removeControl(control);
|
|
49
|
+
}
|
|
50
|
+
controlRef.current = null;
|
|
51
|
+
};
|
|
52
|
+
}, [map]);
|
|
53
|
+
react.useEffect(() => {
|
|
54
|
+
const control = controlRef.current;
|
|
55
|
+
if (!control) return;
|
|
56
|
+
if (!didInitCatalog.current) {
|
|
57
|
+
didInitCatalog.current = true;
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
control.setBasemaps(BasemapControl.createBasemapCatalog(options.basemaps, options.includeDefaultBasemaps));
|
|
61
|
+
}, [basemapKey]);
|
|
62
|
+
react.useEffect(() => {
|
|
63
|
+
const control = controlRef.current;
|
|
64
|
+
if (!control || options.collapsed === void 0) return;
|
|
65
|
+
const currentState = control.getState();
|
|
66
|
+
if (options.collapsed === currentState.collapsed) return;
|
|
67
|
+
if (options.collapsed) {
|
|
68
|
+
control.collapse();
|
|
69
|
+
} else {
|
|
70
|
+
control.expand();
|
|
71
|
+
}
|
|
72
|
+
}, [options.collapsed]);
|
|
73
|
+
react.useEffect(() => {
|
|
74
|
+
const control = controlRef.current;
|
|
75
|
+
if (!control || !activeBasemapId) return;
|
|
76
|
+
if (control.getState().activeBasemapId === activeBasemapId) return;
|
|
77
|
+
control.setBasemap(activeBasemapId).catch(() => {
|
|
78
|
+
});
|
|
79
|
+
}, [activeBasemapId]);
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
const DEFAULT_STATE = {
|
|
83
|
+
collapsed: true,
|
|
84
|
+
panelWidth: 340,
|
|
85
|
+
query: "",
|
|
86
|
+
providerFilter: "",
|
|
87
|
+
categoryFilter: "",
|
|
88
|
+
loading: false
|
|
89
|
+
};
|
|
90
|
+
function useBasemapState(initialState) {
|
|
91
|
+
const [state, setState] = react.useState({
|
|
92
|
+
...DEFAULT_STATE,
|
|
93
|
+
...initialState
|
|
94
|
+
});
|
|
95
|
+
const setCollapsed = react.useCallback((collapsed) => {
|
|
96
|
+
setState((prev) => ({ ...prev, collapsed }));
|
|
97
|
+
}, []);
|
|
98
|
+
const setPanelWidth = react.useCallback((panelWidth) => {
|
|
99
|
+
setState((prev) => ({ ...prev, panelWidth }));
|
|
100
|
+
}, []);
|
|
101
|
+
const setActiveBasemapId = react.useCallback((activeBasemapId) => {
|
|
102
|
+
setState((prev) => ({ ...prev, activeBasemapId }));
|
|
103
|
+
}, []);
|
|
104
|
+
const setQuery = react.useCallback((query) => {
|
|
105
|
+
setState((prev) => ({ ...prev, query }));
|
|
106
|
+
}, []);
|
|
107
|
+
const reset = react.useCallback(() => {
|
|
108
|
+
setState({ ...DEFAULT_STATE, ...initialState });
|
|
109
|
+
}, [initialState]);
|
|
110
|
+
const toggle = react.useCallback(() => {
|
|
111
|
+
setState((prev) => ({ ...prev, collapsed: !prev.collapsed }));
|
|
112
|
+
}, []);
|
|
113
|
+
return {
|
|
114
|
+
state,
|
|
115
|
+
setState,
|
|
116
|
+
setCollapsed,
|
|
117
|
+
setPanelWidth,
|
|
118
|
+
setActiveBasemapId,
|
|
119
|
+
setQuery,
|
|
120
|
+
reset,
|
|
121
|
+
toggle
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
exports.BasemapControlReact = BasemapControlReact;
|
|
125
|
+
exports.useBasemapState = useBasemapState;
|
|
126
|
+
//# sourceMappingURL=react.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.cjs","sources":["../src/lib/core/BasemapControlReact.tsx","../src/lib/hooks/useBasemapState.ts"],"sourcesContent":["import { useEffect, useMemo, useRef } from 'react';\nimport { BasemapControl } from './BasemapControl';\nimport { createBasemapCatalog } from './catalog';\nimport type { BasemapControlReactProps } from './types';\n\nexport function BasemapControlReact({\n map,\n onStateChange,\n onBasemapChange,\n onError,\n activeBasemapId,\n ...options\n}: BasemapControlReactProps): null {\n const controlRef = useRef<BasemapControl | null>(null);\n const basemapKey = useMemo(\n () => options.basemaps?.map((basemap) => basemap.id).join('|') ?? '',\n [options.basemaps],\n );\n const didInitCatalog = useRef(false);\n\n useEffect(() => {\n const control = new BasemapControl({\n ...options,\n defaultBasemapId: activeBasemapId ?? options.defaultBasemapId,\n });\n controlRef.current = control;\n\n if (onStateChange) {\n control.on('statechange', (event) => onStateChange(event.state));\n }\n if (onBasemapChange) {\n control.on('basemapchange', (event) => {\n if (event.type === 'basemapchange') {\n onBasemapChange(event.basemap, event.state);\n }\n });\n }\n if (onError) {\n control.on('error', (event) => {\n if (event.type === 'error') {\n onError(event.error, event.state);\n }\n });\n }\n\n map.addControl(control, options.position ?? 'top-right');\n\n return () => {\n if (map.hasControl(control)) {\n map.removeControl(control);\n }\n controlRef.current = null;\n };\n }, [map]);\n\n useEffect(() => {\n const control = controlRef.current;\n if (!control) return;\n // Skip the first run: the control was just built with this catalog.\n // Updating in place (instead of recreating the control) avoids tearing\n // down and re-adding the managed basemap layer on catalog changes.\n if (!didInitCatalog.current) {\n didInitCatalog.current = true;\n return;\n }\n control.setBasemaps(createBasemapCatalog(options.basemaps, options.includeDefaultBasemaps));\n }, [basemapKey]);\n\n useEffect(() => {\n const control = controlRef.current;\n if (!control || options.collapsed === undefined) return;\n\n const currentState = control.getState();\n if (options.collapsed === currentState.collapsed) return;\n\n if (options.collapsed) {\n control.collapse();\n } else {\n control.expand();\n }\n }, [options.collapsed]);\n\n useEffect(() => {\n const control = controlRef.current;\n if (!control || !activeBasemapId) return;\n if (control.getState().activeBasemapId === activeBasemapId) return;\n\n // Failures are surfaced through the control's error event (onError);\n // swallow the rejection so it does not become an unhandled rejection.\n control.setBasemap(activeBasemapId).catch(() => {});\n }, [activeBasemapId]);\n\n return null;\n}\n","import { useCallback, useState } from 'react';\nimport type { BasemapControlState } from '../core/types';\n\nconst DEFAULT_STATE: BasemapControlState = {\n collapsed: true,\n panelWidth: 340,\n query: '',\n providerFilter: '',\n categoryFilter: '',\n loading: false,\n};\n\nexport function useBasemapState(initialState?: Partial<BasemapControlState>) {\n const [state, setState] = useState<BasemapControlState>({\n ...DEFAULT_STATE,\n ...initialState,\n });\n\n const setCollapsed = useCallback((collapsed: boolean) => {\n setState((prev) => ({ ...prev, collapsed }));\n }, []);\n\n const setPanelWidth = useCallback((panelWidth: number) => {\n setState((prev) => ({ ...prev, panelWidth }));\n }, []);\n\n const setActiveBasemapId = useCallback((activeBasemapId: string | undefined) => {\n setState((prev) => ({ ...prev, activeBasemapId }));\n }, []);\n\n const setQuery = useCallback((query: string) => {\n setState((prev) => ({ ...prev, query }));\n }, []);\n\n const reset = useCallback(() => {\n setState({ ...DEFAULT_STATE, ...initialState });\n }, [initialState]);\n\n const toggle = useCallback(() => {\n setState((prev) => ({ ...prev, collapsed: !prev.collapsed }));\n }, []);\n\n return {\n state,\n setState,\n setCollapsed,\n setPanelWidth,\n setActiveBasemapId,\n setQuery,\n reset,\n toggle,\n };\n}\n"],"names":["useRef","useMemo","useEffect","BasemapControl","createBasemapCatalog","useState","useCallback"],"mappings":"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"}
|
package/dist/react.mjs
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { useRef, useMemo, useEffect, useState, useCallback } from "react";
|
|
2
|
+
import { B as BasemapControl, b as createBasemapCatalog } from "./BasemapControl-C40PophU.js";
|
|
3
|
+
function BasemapControlReact({
|
|
4
|
+
map,
|
|
5
|
+
onStateChange,
|
|
6
|
+
onBasemapChange,
|
|
7
|
+
onError,
|
|
8
|
+
activeBasemapId,
|
|
9
|
+
...options
|
|
10
|
+
}) {
|
|
11
|
+
const controlRef = useRef(null);
|
|
12
|
+
const basemapKey = useMemo(
|
|
13
|
+
() => {
|
|
14
|
+
var _a;
|
|
15
|
+
return ((_a = options.basemaps) == null ? void 0 : _a.map((basemap) => basemap.id).join("|")) ?? "";
|
|
16
|
+
},
|
|
17
|
+
[options.basemaps]
|
|
18
|
+
);
|
|
19
|
+
const didInitCatalog = useRef(false);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
const control = new BasemapControl({
|
|
22
|
+
...options,
|
|
23
|
+
defaultBasemapId: activeBasemapId ?? options.defaultBasemapId
|
|
24
|
+
});
|
|
25
|
+
controlRef.current = control;
|
|
26
|
+
if (onStateChange) {
|
|
27
|
+
control.on("statechange", (event) => onStateChange(event.state));
|
|
28
|
+
}
|
|
29
|
+
if (onBasemapChange) {
|
|
30
|
+
control.on("basemapchange", (event) => {
|
|
31
|
+
if (event.type === "basemapchange") {
|
|
32
|
+
onBasemapChange(event.basemap, event.state);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if (onError) {
|
|
37
|
+
control.on("error", (event) => {
|
|
38
|
+
if (event.type === "error") {
|
|
39
|
+
onError(event.error, event.state);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
map.addControl(control, options.position ?? "top-right");
|
|
44
|
+
return () => {
|
|
45
|
+
if (map.hasControl(control)) {
|
|
46
|
+
map.removeControl(control);
|
|
47
|
+
}
|
|
48
|
+
controlRef.current = null;
|
|
49
|
+
};
|
|
50
|
+
}, [map]);
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
const control = controlRef.current;
|
|
53
|
+
if (!control) return;
|
|
54
|
+
if (!didInitCatalog.current) {
|
|
55
|
+
didInitCatalog.current = true;
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
control.setBasemaps(createBasemapCatalog(options.basemaps, options.includeDefaultBasemaps));
|
|
59
|
+
}, [basemapKey]);
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
const control = controlRef.current;
|
|
62
|
+
if (!control || options.collapsed === void 0) return;
|
|
63
|
+
const currentState = control.getState();
|
|
64
|
+
if (options.collapsed === currentState.collapsed) return;
|
|
65
|
+
if (options.collapsed) {
|
|
66
|
+
control.collapse();
|
|
67
|
+
} else {
|
|
68
|
+
control.expand();
|
|
69
|
+
}
|
|
70
|
+
}, [options.collapsed]);
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
const control = controlRef.current;
|
|
73
|
+
if (!control || !activeBasemapId) return;
|
|
74
|
+
if (control.getState().activeBasemapId === activeBasemapId) return;
|
|
75
|
+
control.setBasemap(activeBasemapId).catch(() => {
|
|
76
|
+
});
|
|
77
|
+
}, [activeBasemapId]);
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
const DEFAULT_STATE = {
|
|
81
|
+
collapsed: true,
|
|
82
|
+
panelWidth: 340,
|
|
83
|
+
query: "",
|
|
84
|
+
providerFilter: "",
|
|
85
|
+
categoryFilter: "",
|
|
86
|
+
loading: false
|
|
87
|
+
};
|
|
88
|
+
function useBasemapState(initialState) {
|
|
89
|
+
const [state, setState] = useState({
|
|
90
|
+
...DEFAULT_STATE,
|
|
91
|
+
...initialState
|
|
92
|
+
});
|
|
93
|
+
const setCollapsed = useCallback((collapsed) => {
|
|
94
|
+
setState((prev) => ({ ...prev, collapsed }));
|
|
95
|
+
}, []);
|
|
96
|
+
const setPanelWidth = useCallback((panelWidth) => {
|
|
97
|
+
setState((prev) => ({ ...prev, panelWidth }));
|
|
98
|
+
}, []);
|
|
99
|
+
const setActiveBasemapId = useCallback((activeBasemapId) => {
|
|
100
|
+
setState((prev) => ({ ...prev, activeBasemapId }));
|
|
101
|
+
}, []);
|
|
102
|
+
const setQuery = useCallback((query) => {
|
|
103
|
+
setState((prev) => ({ ...prev, query }));
|
|
104
|
+
}, []);
|
|
105
|
+
const reset = useCallback(() => {
|
|
106
|
+
setState({ ...DEFAULT_STATE, ...initialState });
|
|
107
|
+
}, [initialState]);
|
|
108
|
+
const toggle = useCallback(() => {
|
|
109
|
+
setState((prev) => ({ ...prev, collapsed: !prev.collapsed }));
|
|
110
|
+
}, []);
|
|
111
|
+
return {
|
|
112
|
+
state,
|
|
113
|
+
setState,
|
|
114
|
+
setCollapsed,
|
|
115
|
+
setPanelWidth,
|
|
116
|
+
setActiveBasemapId,
|
|
117
|
+
setQuery,
|
|
118
|
+
reset,
|
|
119
|
+
toggle
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
export {
|
|
123
|
+
BasemapControlReact,
|
|
124
|
+
useBasemapState
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=react.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.mjs","sources":["../src/lib/core/BasemapControlReact.tsx","../src/lib/hooks/useBasemapState.ts"],"sourcesContent":["import { useEffect, useMemo, useRef } from 'react';\nimport { BasemapControl } from './BasemapControl';\nimport { createBasemapCatalog } from './catalog';\nimport type { BasemapControlReactProps } from './types';\n\nexport function BasemapControlReact({\n map,\n onStateChange,\n onBasemapChange,\n onError,\n activeBasemapId,\n ...options\n}: BasemapControlReactProps): null {\n const controlRef = useRef<BasemapControl | null>(null);\n const basemapKey = useMemo(\n () => options.basemaps?.map((basemap) => basemap.id).join('|') ?? '',\n [options.basemaps],\n );\n const didInitCatalog = useRef(false);\n\n useEffect(() => {\n const control = new BasemapControl({\n ...options,\n defaultBasemapId: activeBasemapId ?? options.defaultBasemapId,\n });\n controlRef.current = control;\n\n if (onStateChange) {\n control.on('statechange', (event) => onStateChange(event.state));\n }\n if (onBasemapChange) {\n control.on('basemapchange', (event) => {\n if (event.type === 'basemapchange') {\n onBasemapChange(event.basemap, event.state);\n }\n });\n }\n if (onError) {\n control.on('error', (event) => {\n if (event.type === 'error') {\n onError(event.error, event.state);\n }\n });\n }\n\n map.addControl(control, options.position ?? 'top-right');\n\n return () => {\n if (map.hasControl(control)) {\n map.removeControl(control);\n }\n controlRef.current = null;\n };\n }, [map]);\n\n useEffect(() => {\n const control = controlRef.current;\n if (!control) return;\n // Skip the first run: the control was just built with this catalog.\n // Updating in place (instead of recreating the control) avoids tearing\n // down and re-adding the managed basemap layer on catalog changes.\n if (!didInitCatalog.current) {\n didInitCatalog.current = true;\n return;\n }\n control.setBasemaps(createBasemapCatalog(options.basemaps, options.includeDefaultBasemaps));\n }, [basemapKey]);\n\n useEffect(() => {\n const control = controlRef.current;\n if (!control || options.collapsed === undefined) return;\n\n const currentState = control.getState();\n if (options.collapsed === currentState.collapsed) return;\n\n if (options.collapsed) {\n control.collapse();\n } else {\n control.expand();\n }\n }, [options.collapsed]);\n\n useEffect(() => {\n const control = controlRef.current;\n if (!control || !activeBasemapId) return;\n if (control.getState().activeBasemapId === activeBasemapId) return;\n\n // Failures are surfaced through the control's error event (onError);\n // swallow the rejection so it does not become an unhandled rejection.\n control.setBasemap(activeBasemapId).catch(() => {});\n }, [activeBasemapId]);\n\n return null;\n}\n","import { useCallback, useState } from 'react';\nimport type { BasemapControlState } from '../core/types';\n\nconst DEFAULT_STATE: BasemapControlState = {\n collapsed: true,\n panelWidth: 340,\n query: '',\n providerFilter: '',\n categoryFilter: '',\n loading: false,\n};\n\nexport function useBasemapState(initialState?: Partial<BasemapControlState>) {\n const [state, setState] = useState<BasemapControlState>({\n ...DEFAULT_STATE,\n ...initialState,\n });\n\n const setCollapsed = useCallback((collapsed: boolean) => {\n setState((prev) => ({ ...prev, collapsed }));\n }, []);\n\n const setPanelWidth = useCallback((panelWidth: number) => {\n setState((prev) => ({ ...prev, panelWidth }));\n }, []);\n\n const setActiveBasemapId = useCallback((activeBasemapId: string | undefined) => {\n setState((prev) => ({ ...prev, activeBasemapId }));\n }, []);\n\n const setQuery = useCallback((query: string) => {\n setState((prev) => ({ ...prev, query }));\n }, []);\n\n const reset = useCallback(() => {\n setState({ ...DEFAULT_STATE, ...initialState });\n }, [initialState]);\n\n const toggle = useCallback(() => {\n setState((prev) => ({ ...prev, collapsed: !prev.collapsed }));\n }, []);\n\n return {\n state,\n setState,\n setCollapsed,\n setPanelWidth,\n setActiveBasemapId,\n setQuery,\n reset,\n toggle,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { BasemapControl } from './lib/core/BasemapControl';
|
|
2
|
+
export { DEFAULT_BASEMAPS, DEFAULT_BASEMAP_PROVIDERS, combineProviders, createBasemapCatalog, filterBasemaps, getBasemapCategories, resolveBasemapProviders, } from './lib/core/catalog';
|
|
3
|
+
export type { BasemapChangeEvent, BasemapControlEvent, BasemapControlEventHandler, BasemapControlEventPayload, BasemapControlOptions, BasemapControlPosition, BasemapControlState, BasemapDefinition, BasemapErrorEvent, BasemapProvider, BasemapSourceType, RasterBasemapSource, StyleBasemapSource, } from './lib/core/types';
|
|
4
|
+
export { clamp, formatNumericValue, generateId, debounce, throttle, classNames, } from './lib/utils';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,KAAK,EACL,kBAAkB,EAClB,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,UAAU,GACX,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { IControl, Map as MapLibreMap } from 'maplibre-gl';
|
|
2
|
+
import { BasemapControlEvent, BasemapControlEventHandler, BasemapControlOptions, BasemapControlState, BasemapDefinition } from './types';
|
|
3
|
+
export declare class BasemapControl implements IControl {
|
|
4
|
+
private _map?;
|
|
5
|
+
private _mapContainer?;
|
|
6
|
+
private _container?;
|
|
7
|
+
private _panel?;
|
|
8
|
+
private _content?;
|
|
9
|
+
private _options;
|
|
10
|
+
private _state;
|
|
11
|
+
private _basemaps;
|
|
12
|
+
private _providers;
|
|
13
|
+
private _eventHandlers;
|
|
14
|
+
private _managedSourceIds;
|
|
15
|
+
private _managedLayerIds;
|
|
16
|
+
private _resizeHandler;
|
|
17
|
+
private _mapResizeHandler;
|
|
18
|
+
private _clickOutsideHandler;
|
|
19
|
+
constructor(options?: BasemapControlOptions);
|
|
20
|
+
onAdd(map: MapLibreMap): HTMLElement;
|
|
21
|
+
onRemove(): void;
|
|
22
|
+
getState(): BasemapControlState;
|
|
23
|
+
setState(newState: Partial<BasemapControlState>): void;
|
|
24
|
+
getBasemaps(): BasemapDefinition[];
|
|
25
|
+
setBasemaps(basemaps: BasemapDefinition[]): void;
|
|
26
|
+
getActiveBasemap(): BasemapDefinition | undefined;
|
|
27
|
+
setBasemap(id: string): Promise<void>;
|
|
28
|
+
private _selectBasemap;
|
|
29
|
+
toggle(): void;
|
|
30
|
+
expand(): void;
|
|
31
|
+
collapse(): void;
|
|
32
|
+
on(event: BasemapControlEvent, handler: BasemapControlEventHandler): void;
|
|
33
|
+
off(event: BasemapControlEvent, handler: BasemapControlEventHandler): void;
|
|
34
|
+
getMap(): MapLibreMap | undefined;
|
|
35
|
+
getContainer(): HTMLElement | undefined;
|
|
36
|
+
private _emit;
|
|
37
|
+
private _handleError;
|
|
38
|
+
private _createContainer;
|
|
39
|
+
private _createPanel;
|
|
40
|
+
private _renderContent;
|
|
41
|
+
private _createSearchInput;
|
|
42
|
+
private _createFilterRow;
|
|
43
|
+
private _createSelect;
|
|
44
|
+
private _createStatus;
|
|
45
|
+
private _createResults;
|
|
46
|
+
private _formatBasemapMeta;
|
|
47
|
+
private _stripHtml;
|
|
48
|
+
private _addRasterBasemap;
|
|
49
|
+
private _waitForStyleReady;
|
|
50
|
+
private _removeManagedBasemap;
|
|
51
|
+
private _applyBasemapView;
|
|
52
|
+
private _findBasemapInsertBeforeId;
|
|
53
|
+
private _setupEventListeners;
|
|
54
|
+
private _getControlPosition;
|
|
55
|
+
private _updatePanelPosition;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=BasemapControl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BasemapControl.d.ts","sourceRoot":"","sources":["../../../../src/lib/core/BasemapControl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EAER,GAAG,IAAI,WAAW,EAEnB,MAAM,aAAa,CAAC;AAOrB,OAAO,KAAK,EACV,mBAAmB,EACnB,0BAA0B,EAC1B,qBAAqB,EAErB,mBAAmB,EACnB,iBAAiB,EAElB,MAAM,SAAS,CAAC;AAqBjB,qBAAa,cAAe,YAAW,QAAQ;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAc;IAC3B,OAAO,CAAC,aAAa,CAAC,CAAc;IACpC,OAAO,CAAC,UAAU,CAAC,CAAc;IACjC,OAAO,CAAC,MAAM,CAAC,CAAc;IAC7B,OAAO,CAAC,QAAQ,CAAC,CAAc;IAC/B,OAAO,CAAC,QAAQ,CASZ;IACJ,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,oBAAoB,CAA0C;gBAE1D,OAAO,CAAC,EAAE,qBAAqB;IAsB3C,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,WAAW;IAsBpC,QAAQ,IAAI,IAAI;IA0BhB,QAAQ,IAAI,mBAAmB;IAI/B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAMtD,WAAW,IAAI,iBAAiB,EAAE;IAIlC,WAAW,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,IAAI;IAiBhD,gBAAgB,IAAI,iBAAiB,GAAG,SAAS;IAI3C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkD3C,OAAO,CAAC,cAAc;IAItB,MAAM,IAAI,IAAI;IAiBd,MAAM,IAAI,IAAI;IAId,QAAQ,IAAI,IAAI;IAIhB,EAAE,CAAC,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,0BAA0B,GAAG,IAAI;IAOzE,GAAG,CAAC,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,0BAA0B,GAAG,IAAI;IAI1E,MAAM,IAAI,WAAW,GAAG,SAAS;IAIjC,YAAY,IAAI,WAAW,GAAG,SAAS;IAIvC,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,gBAAgB;IA0BxB,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,cAAc;IA4DtB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,0BAA0B;IAQlC,OAAO,CAAC,oBAAoB;IAyB5B,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,oBAAoB;CAuC7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BasemapControlReact.d.ts","sourceRoot":"","sources":["../../../../src/lib/core/BasemapControlReact.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAExD,wBAAgB,mBAAmB,CAAC,EAClC,GAAG,EACH,aAAa,EACb,eAAe,EACf,OAAO,EACP,eAAe,EACf,GAAG,OAAO,EACX,EAAE,wBAAwB,GAAG,IAAI,CAiFjC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { BasemapDefinition, BasemapProvider } from './types';
|
|
2
|
+
export declare const DEFAULT_BASEMAP_PROVIDERS: BasemapProvider[];
|
|
3
|
+
export declare const DEFAULT_BASEMAPS: BasemapDefinition[];
|
|
4
|
+
export declare function combineProviders(defaults: BasemapProvider[], custom?: BasemapProvider[]): BasemapProvider[];
|
|
5
|
+
export declare function resolveBasemapProviders(basemaps: BasemapDefinition[], customProviders?: BasemapProvider[], includeDefaultProviders?: boolean): BasemapProvider[];
|
|
6
|
+
export declare function createBasemapCatalog(customBasemaps?: BasemapDefinition[], includeDefaultBasemaps?: boolean): BasemapDefinition[];
|
|
7
|
+
export interface BasemapFilter {
|
|
8
|
+
query?: string;
|
|
9
|
+
provider?: string;
|
|
10
|
+
category?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function filterBasemaps(basemaps: BasemapDefinition[], filter: BasemapFilter): BasemapDefinition[];
|
|
13
|
+
export declare function getBasemapCategories(basemaps: BasemapDefinition[]): string[];
|
|
14
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../../src/lib/core/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAElE,eAAO,MAAM,yBAAyB,EAAE,eAAe,EAetD,CAAC;AAuCF,eAAO,MAAM,gBAAgB,EAAE,iBAAiB,EAwrB/C,CAAC;AAEF,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,eAAe,EAAE,EAC3B,MAAM,GAAE,eAAe,EAAO,GAC7B,eAAe,EAAE,CAKnB;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,eAAe,GAAE,eAAe,EAAO,EACvC,uBAAuB,UAAO,GAC7B,eAAe,EAAE,CAcnB;AAED,wBAAgB,oBAAoB,CAClC,cAAc,GAAE,iBAAiB,EAAO,EACxC,sBAAsB,UAAO,GAC5B,iBAAiB,EAAE,CAOrB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,MAAM,EAAE,aAAa,GACpB,iBAAiB,EAAE,CAqBrB;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,MAAM,EAAE,CAE5E"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Map } from 'maplibre-gl';
|
|
2
|
+
export type BasemapSourceType = 'raster' | 'vector-style' | 'style';
|
|
3
|
+
export type BasemapControlPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
|
|
4
|
+
export interface BasemapProvider {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
category?: string;
|
|
8
|
+
icon?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface RasterBasemapSource {
|
|
11
|
+
type: 'raster';
|
|
12
|
+
tiles: string[];
|
|
13
|
+
tileSize?: number;
|
|
14
|
+
minzoom?: number;
|
|
15
|
+
maxzoom?: number;
|
|
16
|
+
scheme?: 'xyz' | 'tms';
|
|
17
|
+
}
|
|
18
|
+
export interface StyleBasemapSource {
|
|
19
|
+
type: 'style' | 'vector-style';
|
|
20
|
+
url: string;
|
|
21
|
+
}
|
|
22
|
+
export interface BasemapDefinition {
|
|
23
|
+
id: string;
|
|
24
|
+
name: string;
|
|
25
|
+
provider: string;
|
|
26
|
+
type: BasemapSourceType;
|
|
27
|
+
category?: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
attribution?: string;
|
|
30
|
+
source: RasterBasemapSource | StyleBasemapSource;
|
|
31
|
+
view?: {
|
|
32
|
+
center?: [number, number];
|
|
33
|
+
zoom?: number;
|
|
34
|
+
bearing?: number;
|
|
35
|
+
pitch?: number;
|
|
36
|
+
};
|
|
37
|
+
tags?: string[];
|
|
38
|
+
}
|
|
39
|
+
export interface BasemapControlOptions {
|
|
40
|
+
collapsed?: boolean;
|
|
41
|
+
position?: BasemapControlPosition;
|
|
42
|
+
title?: string;
|
|
43
|
+
panelWidth?: number;
|
|
44
|
+
className?: string;
|
|
45
|
+
basemaps?: BasemapDefinition[];
|
|
46
|
+
providers?: BasemapProvider[];
|
|
47
|
+
includeDefaultBasemaps?: boolean;
|
|
48
|
+
defaultBasemapId?: string;
|
|
49
|
+
}
|
|
50
|
+
export interface BasemapControlState {
|
|
51
|
+
collapsed: boolean;
|
|
52
|
+
panelWidth: number;
|
|
53
|
+
activeBasemapId?: string;
|
|
54
|
+
query: string;
|
|
55
|
+
providerFilter: string;
|
|
56
|
+
categoryFilter: string;
|
|
57
|
+
loading: boolean;
|
|
58
|
+
error?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface BasemapChangeEvent {
|
|
61
|
+
type: 'basemapchange';
|
|
62
|
+
state: BasemapControlState;
|
|
63
|
+
basemap: BasemapDefinition;
|
|
64
|
+
}
|
|
65
|
+
export interface BasemapErrorEvent {
|
|
66
|
+
type: 'error';
|
|
67
|
+
state: BasemapControlState;
|
|
68
|
+
error: Error;
|
|
69
|
+
basemap?: BasemapDefinition;
|
|
70
|
+
}
|
|
71
|
+
export interface BasemapStateEvent {
|
|
72
|
+
type: 'collapse' | 'expand' | 'statechange';
|
|
73
|
+
state: BasemapControlState;
|
|
74
|
+
}
|
|
75
|
+
export type BasemapControlEvent = BasemapStateEvent['type'] | 'basemapchange' | 'error';
|
|
76
|
+
export type BasemapControlEventPayload = BasemapStateEvent | BasemapChangeEvent | BasemapErrorEvent;
|
|
77
|
+
export type BasemapControlEventHandler = (event: BasemapControlEventPayload) => void;
|
|
78
|
+
export interface BasemapControlReactProps extends BasemapControlOptions {
|
|
79
|
+
map: Map;
|
|
80
|
+
activeBasemapId?: string;
|
|
81
|
+
onStateChange?: (state: BasemapControlState) => void;
|
|
82
|
+
onBasemapChange?: (basemap: BasemapDefinition, state: BasemapControlState) => void;
|
|
83
|
+
onError?: (error: Error, state: BasemapControlState) => void;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/lib/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,cAAc,GAAG,OAAO,CAAC;AAEpE,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,CAAC;AAE/F,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,GAAG,cAAc,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,mBAAmB,GAAG,kBAAkB,CAAC;IACjD,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,mBAAmB,CAAC;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,aAAa,CAAC;IAC5C,KAAK,EAAE,mBAAmB,CAAC;CAC5B;AAED,MAAM,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,MAAM,CAAC,GAAG,eAAe,GAAG,OAAO,CAAC;AAExF,MAAM,MAAM,0BAA0B,GAClC,iBAAiB,GACjB,kBAAkB,GAClB,iBAAiB,CAAC;AAEtB,MAAM,MAAM,0BAA0B,GAAG,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;AAErF,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;IACrE,GAAG,EAAE,GAAG,CAAC;IACT,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACrD,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACnF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAC9D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BasemapControlState } from '../core/types';
|
|
2
|
+
export declare function useBasemapState(initialState?: Partial<BasemapControlState>): {
|
|
3
|
+
state: BasemapControlState;
|
|
4
|
+
setState: import('react').Dispatch<import('react').SetStateAction<BasemapControlState>>;
|
|
5
|
+
setCollapsed: (collapsed: boolean) => void;
|
|
6
|
+
setPanelWidth: (panelWidth: number) => void;
|
|
7
|
+
setActiveBasemapId: (activeBasemapId: string | undefined) => void;
|
|
8
|
+
setQuery: (query: string) => void;
|
|
9
|
+
reset: () => void;
|
|
10
|
+
toggle: () => void;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=useBasemapState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBasemapState.d.ts","sourceRoot":"","sources":["../../../../src/lib/hooks/useBasemapState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAWzD,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;;;8BAM5B,OAAO;gCAIL,MAAM;0CAII,MAAM,GAAG,SAAS;sBAItC,MAAM;;;EAsB5C"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clamps a value between a minimum and maximum.
|
|
3
|
+
*
|
|
4
|
+
* @param value - The value to clamp
|
|
5
|
+
* @param min - The minimum allowed value
|
|
6
|
+
* @param max - The maximum allowed value
|
|
7
|
+
* @returns The clamped value
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* clamp(5, 0, 10); // returns 5
|
|
12
|
+
* clamp(-5, 0, 10); // returns 0
|
|
13
|
+
* clamp(15, 0, 10); // returns 10
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare function clamp(value: number, min: number, max: number): number;
|
|
17
|
+
/**
|
|
18
|
+
* Formats a numeric value with appropriate decimal places based on step size.
|
|
19
|
+
*
|
|
20
|
+
* @param value - The value to format
|
|
21
|
+
* @param step - The step size to determine decimal places
|
|
22
|
+
* @returns The formatted value as a string
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* formatNumericValue(5, 1); // returns "5"
|
|
27
|
+
* formatNumericValue(0.5, 0.1); // returns "0.5"
|
|
28
|
+
* formatNumericValue(0.55, 0.01); // returns "0.55"
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function formatNumericValue(value: number, step: number): string;
|
|
32
|
+
/**
|
|
33
|
+
* Generates a unique ID string.
|
|
34
|
+
*
|
|
35
|
+
* @param prefix - Optional prefix for the ID
|
|
36
|
+
* @returns A unique ID string
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* generateId('control'); // returns "control-abc123"
|
|
41
|
+
* generateId(); // returns "abc123"
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function generateId(prefix?: string): string;
|
|
45
|
+
/**
|
|
46
|
+
* Debounces a function call.
|
|
47
|
+
*
|
|
48
|
+
* @param fn - The function to debounce
|
|
49
|
+
* @param delay - The delay in milliseconds
|
|
50
|
+
* @returns A debounced version of the function
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* const debouncedUpdate = debounce(() => updateMap(), 100);
|
|
55
|
+
* window.addEventListener('resize', debouncedUpdate);
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function debounce<T extends (...args: unknown[]) => void>(fn: T, delay: number): (...args: Parameters<T>) => void;
|
|
59
|
+
/**
|
|
60
|
+
* Throttles a function call.
|
|
61
|
+
*
|
|
62
|
+
* @param fn - The function to throttle
|
|
63
|
+
* @param limit - The minimum time between calls in milliseconds
|
|
64
|
+
* @returns A throttled version of the function
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const throttledScroll = throttle(() => handleScroll(), 100);
|
|
69
|
+
* window.addEventListener('scroll', throttledScroll);
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
export declare function throttle<T extends (...args: unknown[]) => void>(fn: T, limit: number): (...args: Parameters<T>) => void;
|
|
73
|
+
/**
|
|
74
|
+
* Creates a CSS class string from an object of class names.
|
|
75
|
+
*
|
|
76
|
+
* @param classes - Object with class names as keys and boolean values
|
|
77
|
+
* @returns A space-separated string of class names
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```typescript
|
|
81
|
+
* classNames({ active: true, disabled: false, visible: true });
|
|
82
|
+
* // returns "active visible"
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export declare function classNames(classes: Record<string, boolean>): string;
|
|
86
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/lib/utils/helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAErE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAItE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,EAC7D,EAAE,EAAE,CAAC,EACL,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAYlC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,EAC7D,EAAE,EAAE,CAAC,EACL,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAYlC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAKnE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,kBAAkB,EAClB,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,UAAU,GACX,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { BasemapControlReact } from './lib/core/BasemapControlReact';
|
|
2
|
+
export { useBasemapState } from './lib/hooks';
|
|
3
|
+
export type { BasemapChangeEvent, BasemapControlEvent, BasemapControlEventHandler, BasemapControlEventPayload, BasemapControlOptions, BasemapControlReactProps, BasemapControlState, BasemapDefinition, BasemapErrorEvent, BasemapProvider, BasemapSourceType, } from './lib/core/types';
|
|
4
|
+
//# sourceMappingURL=react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,GAClB,MAAM,kBAAkB,CAAC"}
|