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.
Files changed (36) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +190 -0
  3. package/dist/BasemapControl-C40PophU.js +1343 -0
  4. package/dist/BasemapControl-C40PophU.js.map +1 -0
  5. package/dist/BasemapControl-pnHGO378.cjs +1342 -0
  6. package/dist/BasemapControl-pnHGO378.cjs.map +1 -0
  7. package/dist/index.cjs +57 -0
  8. package/dist/index.cjs.map +1 -0
  9. package/dist/index.mjs +57 -0
  10. package/dist/index.mjs.map +1 -0
  11. package/dist/maplibre-gl-basemap-control.css +272 -0
  12. package/dist/react.cjs +126 -0
  13. package/dist/react.cjs.map +1 -0
  14. package/dist/react.mjs +126 -0
  15. package/dist/react.mjs.map +1 -0
  16. package/dist/types/index.d.ts +5 -0
  17. package/dist/types/index.d.ts.map +1 -0
  18. package/dist/types/lib/core/BasemapControl.d.ts +57 -0
  19. package/dist/types/lib/core/BasemapControl.d.ts.map +1 -0
  20. package/dist/types/lib/core/BasemapControlReact.d.ts +3 -0
  21. package/dist/types/lib/core/BasemapControlReact.d.ts.map +1 -0
  22. package/dist/types/lib/core/catalog.d.ts +14 -0
  23. package/dist/types/lib/core/catalog.d.ts.map +1 -0
  24. package/dist/types/lib/core/types.d.ts +85 -0
  25. package/dist/types/lib/core/types.d.ts.map +1 -0
  26. package/dist/types/lib/hooks/index.d.ts +2 -0
  27. package/dist/types/lib/hooks/index.d.ts.map +1 -0
  28. package/dist/types/lib/hooks/useBasemapState.d.ts +12 -0
  29. package/dist/types/lib/hooks/useBasemapState.d.ts.map +1 -0
  30. package/dist/types/lib/utils/helpers.d.ts +86 -0
  31. package/dist/types/lib/utils/helpers.d.ts.map +1 -0
  32. package/dist/types/lib/utils/index.d.ts +2 -0
  33. package/dist/types/lib/utils/index.d.ts.map +1 -0
  34. package/dist/types/react.d.ts +4 -0
  35. package/dist/types/react.d.ts.map +1 -0
  36. 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,3 @@
1
+ import { BasemapControlReactProps } from './types';
2
+ export declare function BasemapControlReact({ map, onStateChange, onBasemapChange, onError, activeBasemapId, ...options }: BasemapControlReactProps): null;
3
+ //# sourceMappingURL=BasemapControlReact.d.ts.map
@@ -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,2 @@
1
+ export { useBasemapState } from './useBasemapState';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export { clamp, formatNumericValue, generateId, debounce, throttle, classNames, } from './helpers';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}