@gooddata/sdk-ui-geo 11.6.0-alpha.5 → 11.6.0-alpha.7
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/esm/next/GeoPushpinChartNext.d.ts +12 -0
- package/esm/next/GeoPushpinChartNext.d.ts.map +1 -0
- package/esm/next/GeoPushpinChartNext.js +42 -0
- package/esm/next/GeoPushpinChartNext.js.map +1 -0
- package/esm/next/RenderGeoPushpinChart.d.ts +15 -0
- package/esm/next/RenderGeoPushpinChart.d.ts.map +1 -0
- package/esm/next/RenderGeoPushpinChart.js +97 -0
- package/esm/next/RenderGeoPushpinChart.js.map +1 -0
- package/esm/next/components/ErrorComponent.d.ts +13 -0
- package/esm/next/components/ErrorComponent.d.ts.map +1 -0
- package/esm/next/components/ErrorComponent.js +19 -0
- package/esm/next/components/ErrorComponent.js.map +1 -0
- package/esm/next/components/LoadingComponent.d.ts +5 -0
- package/esm/next/components/LoadingComponent.d.ts.map +1 -0
- package/esm/next/components/LoadingComponent.js +13 -0
- package/esm/next/components/LoadingComponent.js.map +1 -0
- package/esm/next/components/legends/Legend.d.ts +28 -0
- package/esm/next/components/legends/Legend.d.ts.map +1 -0
- package/esm/next/components/legends/Legend.js +54 -0
- package/esm/next/components/legends/Legend.js.map +1 -0
- package/esm/next/components/legends/LegendBody.d.ts +12 -0
- package/esm/next/components/legends/LegendBody.d.ts.map +1 -0
- package/esm/next/components/legends/LegendBody.js +30 -0
- package/esm/next/components/legends/LegendBody.js.map +1 -0
- package/esm/next/components/legends/legendPropsAdapter.d.ts +14 -0
- package/esm/next/components/legends/legendPropsAdapter.d.ts.map +1 -0
- package/esm/next/components/legends/legendPropsAdapter.js +34 -0
- package/esm/next/components/legends/legendPropsAdapter.js.map +1 -0
- package/esm/next/components/legends/types.d.ts +16 -0
- package/esm/next/components/legends/types.d.ts.map +1 -0
- package/esm/next/components/legends/types.js +3 -0
- package/esm/next/components/legends/types.js.map +1 -0
- package/esm/next/constants/geoChart.d.ts +108 -0
- package/esm/next/constants/geoChart.d.ts.map +1 -0
- package/esm/next/constants/geoChart.js +130 -0
- package/esm/next/constants/geoChart.js.map +1 -0
- package/esm/next/constants/internal.d.ts +19 -0
- package/esm/next/constants/internal.d.ts.map +1 -0
- package/esm/next/constants/internal.js +20 -0
- package/esm/next/constants/internal.js.map +1 -0
- package/esm/next/context/GeoDataContext.d.ts +69 -0
- package/esm/next/context/GeoDataContext.d.ts.map +1 -0
- package/esm/next/context/GeoDataContext.js +80 -0
- package/esm/next/context/GeoDataContext.js.map +1 -0
- package/esm/next/context/GeoLegendContext.d.ts +78 -0
- package/esm/next/context/GeoLegendContext.d.ts.map +1 -0
- package/esm/next/context/GeoLegendContext.js +74 -0
- package/esm/next/context/GeoLegendContext.js.map +1 -0
- package/esm/next/context/GeoPushpinPropsContext.d.ts +47 -0
- package/esm/next/context/GeoPushpinPropsContext.d.ts.map +1 -0
- package/esm/next/context/GeoPushpinPropsContext.js +81 -0
- package/esm/next/context/GeoPushpinPropsContext.js.map +1 -0
- package/esm/next/context/InitialExecutionContext.d.ts +43 -0
- package/esm/next/context/InitialExecutionContext.d.ts.map +1 -0
- package/esm/next/context/InitialExecutionContext.js +45 -0
- package/esm/next/context/InitialExecutionContext.js.map +1 -0
- package/esm/next/context/MapInstanceContext.d.ts +42 -0
- package/esm/next/context/MapInstanceContext.d.ts.map +1 -0
- package/esm/next/context/MapInstanceContext.js +62 -0
- package/esm/next/context/MapInstanceContext.js.map +1 -0
- package/esm/next/features/clustering/clustering.d.ts +23 -0
- package/esm/next/features/clustering/clustering.d.ts.map +1 -0
- package/esm/next/features/clustering/clustering.js +26 -0
- package/esm/next/features/clustering/clustering.js.map +1 -0
- package/esm/next/features/coloring/colorStrategy.d.ts +22 -0
- package/esm/next/features/coloring/colorStrategy.d.ts.map +1 -0
- package/esm/next/features/coloring/colorStrategy.js +83 -0
- package/esm/next/features/coloring/colorStrategy.js.map +1 -0
- package/esm/next/features/coloring/palette.d.ts +81 -0
- package/esm/next/features/coloring/palette.d.ts.map +1 -0
- package/esm/next/features/coloring/palette.js +233 -0
- package/esm/next/features/coloring/palette.js.map +1 -0
- package/esm/next/features/data/dataSourceManagement.d.ts +20 -0
- package/esm/next/features/data/dataSourceManagement.d.ts.map +1 -0
- package/esm/next/features/data/dataSourceManagement.js +30 -0
- package/esm/next/features/data/dataSourceManagement.js.map +1 -0
- package/esm/next/features/data/transformation.d.ts +99 -0
- package/esm/next/features/data/transformation.d.ts.map +1 -0
- package/esm/next/features/data/transformation.js +369 -0
- package/esm/next/features/data/transformation.js.map +1 -0
- package/esm/next/features/map/initializeMap.d.ts +30 -0
- package/esm/next/features/map/initializeMap.d.ts.map +1 -0
- package/esm/next/features/map/initializeMap.js +58 -0
- package/esm/next/features/map/initializeMap.js.map +1 -0
- package/esm/next/features/map/layerManagement.d.ts +51 -0
- package/esm/next/features/map/layerManagement.d.ts.map +1 -0
- package/esm/next/features/map/layerManagement.js +95 -0
- package/esm/next/features/map/layerManagement.js.map +1 -0
- package/esm/next/features/map/viewportManagement.d.ts +76 -0
- package/esm/next/features/map/viewportManagement.d.ts.map +1 -0
- package/esm/next/features/map/viewportManagement.js +193 -0
- package/esm/next/features/map/viewportManagement.js.map +1 -0
- package/esm/next/features/size/calculations.d.ts +32 -0
- package/esm/next/features/size/calculations.d.ts.map +1 -0
- package/esm/next/features/size/calculations.js +37 -0
- package/esm/next/features/size/calculations.js.map +1 -0
- package/esm/next/features/tooltip/formatting.d.ts +28 -0
- package/esm/next/features/tooltip/formatting.d.ts.map +1 -0
- package/esm/next/features/tooltip/formatting.js +51 -0
- package/esm/next/features/tooltip/formatting.js.map +1 -0
- package/esm/next/features/tooltip/tooltipManagement.d.ts +47 -0
- package/esm/next/features/tooltip/tooltipManagement.d.ts.map +1 -0
- package/esm/next/features/tooltip/tooltipManagement.js +73 -0
- package/esm/next/features/tooltip/tooltipManagement.js.map +1 -0
- package/esm/next/hooks/init/useInitExecution.d.ts +29 -0
- package/esm/next/hooks/init/useInitExecution.d.ts.map +1 -0
- package/esm/next/hooks/init/useInitExecution.js +91 -0
- package/esm/next/hooks/init/useInitExecution.js.map +1 -0
- package/esm/next/hooks/init/useInitExecutionResult.d.ts +17 -0
- package/esm/next/hooks/init/useInitExecutionResult.d.ts.map +1 -0
- package/esm/next/hooks/init/useInitExecutionResult.js +44 -0
- package/esm/next/hooks/init/useInitExecutionResult.js.map +1 -0
- package/esm/next/hooks/legend/useLegendConfig.d.ts +35 -0
- package/esm/next/hooks/legend/useLegendConfig.d.ts.map +1 -0
- package/esm/next/hooks/legend/useLegendConfig.js +25 -0
- package/esm/next/hooks/legend/useLegendConfig.js.map +1 -0
- package/esm/next/hooks/legend/useLegendDetails.d.ts +27 -0
- package/esm/next/hooks/legend/useLegendDetails.d.ts.map +1 -0
- package/esm/next/hooks/legend/useLegendDetails.js +39 -0
- package/esm/next/hooks/legend/useLegendDetails.js.map +1 -0
- package/esm/next/hooks/legend/useLegendItemClick.d.ts +16 -0
- package/esm/next/hooks/legend/useLegendItemClick.d.ts.map +1 -0
- package/esm/next/hooks/legend/useLegendItemClick.js +23 -0
- package/esm/next/hooks/legend/useLegendItemClick.js.map +1 -0
- package/esm/next/hooks/legend/useLegendItems.d.ts +27 -0
- package/esm/next/hooks/legend/useLegendItems.d.ts.map +1 -0
- package/esm/next/hooks/legend/useLegendItems.js +54 -0
- package/esm/next/hooks/legend/useLegendItems.js.map +1 -0
- package/esm/next/hooks/legend/useLegendItemsWithState.d.ts +21 -0
- package/esm/next/hooks/legend/useLegendItemsWithState.d.ts.map +1 -0
- package/esm/next/hooks/legend/useLegendItemsWithState.js +42 -0
- package/esm/next/hooks/legend/useLegendItemsWithState.js.map +1 -0
- package/esm/next/hooks/legend/useLegendProps.d.ts +53 -0
- package/esm/next/hooks/legend/useLegendProps.d.ts.map +1 -0
- package/esm/next/hooks/legend/useLegendProps.js +38 -0
- package/esm/next/hooks/legend/useLegendProps.js.map +1 -0
- package/esm/next/hooks/legend/useSelectedSegments.d.ts +17 -0
- package/esm/next/hooks/legend/useSelectedSegments.d.ts.map +1 -0
- package/esm/next/hooks/legend/useSelectedSegments.js +32 -0
- package/esm/next/hooks/legend/useSelectedSegments.js.map +1 -0
- package/esm/next/hooks/map/useAfterRender.d.ts +19 -0
- package/esm/next/hooks/map/useAfterRender.d.ts.map +1 -0
- package/esm/next/hooks/map/useAfterRender.js +99 -0
- package/esm/next/hooks/map/useAfterRender.js.map +1 -0
- package/esm/next/hooks/map/useMapCallbacks.d.ts +20 -0
- package/esm/next/hooks/map/useMapCallbacks.d.ts.map +1 -0
- package/esm/next/hooks/map/useMapCallbacks.js +44 -0
- package/esm/next/hooks/map/useMapCallbacks.js.map +1 -0
- package/esm/next/hooks/map/useMapDataSync.d.ts +44 -0
- package/esm/next/hooks/map/useMapDataSync.d.ts.map +1 -0
- package/esm/next/hooks/map/useMapDataSync.js +87 -0
- package/esm/next/hooks/map/useMapDataSync.js.map +1 -0
- package/esm/next/hooks/map/useMapInitialization.d.ts +56 -0
- package/esm/next/hooks/map/useMapInitialization.d.ts.map +1 -0
- package/esm/next/hooks/map/useMapInitialization.js +121 -0
- package/esm/next/hooks/map/useMapInitialization.js.map +1 -0
- package/esm/next/hooks/map/useTooltipHandlers.d.ts +22 -0
- package/esm/next/hooks/map/useTooltipHandlers.d.ts.map +1 -0
- package/esm/next/hooks/map/useTooltipHandlers.js +28 -0
- package/esm/next/hooks/map/useTooltipHandlers.js.map +1 -0
- package/esm/next/hooks/shared/useGeoDataTransformation.d.ts +23 -0
- package/esm/next/hooks/shared/useGeoDataTransformation.d.ts.map +1 -0
- package/esm/next/hooks/shared/useGeoDataTransformation.js +37 -0
- package/esm/next/hooks/shared/useGeoDataTransformation.js.map +1 -0
- package/esm/next/hooks/shared/usePushData.d.ts +8 -0
- package/esm/next/hooks/shared/usePushData.d.ts.map +1 -0
- package/esm/next/hooks/shared/usePushData.js +36 -0
- package/esm/next/hooks/shared/usePushData.js.map +1 -0
- package/esm/next/hooks/shared/useResolvedProps.d.ts +16 -0
- package/esm/next/hooks/shared/useResolvedProps.d.ts.map +1 -0
- package/esm/next/hooks/shared/useResolvedProps.js +40 -0
- package/esm/next/hooks/shared/useResolvedProps.js.map +1 -0
- package/esm/next/index.d.ts +5 -0
- package/esm/next/index.d.ts.map +1 -0
- package/esm/next/index.js +3 -0
- package/esm/next/index.js.map +1 -0
- package/esm/next/providers/maplibre/maplibreConfig.d.ts +68 -0
- package/esm/next/providers/maplibre/maplibreConfig.d.ts.map +1 -0
- package/esm/next/providers/maplibre/maplibreConfig.js +104 -0
- package/esm/next/providers/maplibre/maplibreConfig.js.map +1 -0
- package/esm/next/providers/maplibre/maplibreDataLayers.d.ts +51 -0
- package/esm/next/providers/maplibre/maplibreDataLayers.d.ts.map +1 -0
- package/esm/next/providers/maplibre/maplibreDataLayers.js +195 -0
- package/esm/next/providers/maplibre/maplibreDataLayers.js.map +1 -0
- package/esm/next/providers/maplibre/maplibreDataSource.d.ts +28 -0
- package/esm/next/providers/maplibre/maplibreDataSource.d.ts.map +1 -0
- package/esm/next/providers/maplibre/maplibreDataSource.js +117 -0
- package/esm/next/providers/maplibre/maplibreDataSource.js.map +1 -0
- package/esm/next/providers/maplibre/maplibreTooltip.d.ts +54 -0
- package/esm/next/providers/maplibre/maplibreTooltip.d.ts.map +1 -0
- package/esm/next/providers/maplibre/maplibreTooltip.js +158 -0
- package/esm/next/providers/maplibre/maplibreTooltip.js.map +1 -0
- package/esm/next/providers/maplibre/maplibreViewport.d.ts +45 -0
- package/esm/next/providers/maplibre/maplibreViewport.d.ts.map +1 -0
- package/esm/next/providers/maplibre/maplibreViewport.js +92 -0
- package/esm/next/providers/maplibre/maplibreViewport.js.map +1 -0
- package/esm/next/providers/maplibre/style.d.ts +3 -0
- package/esm/next/providers/maplibre/style.d.ts.map +1 -0
- package/esm/next/providers/maplibre/style.js +8361 -0
- package/esm/next/providers/maplibre/style.js.map +1 -0
- package/esm/next/types/config.d.ts +89 -0
- package/esm/next/types/config.d.ts.map +1 -0
- package/esm/next/types/config.js +3 -0
- package/esm/next/types/config.js.map +1 -0
- package/esm/next/types/internal.d.ts +17 -0
- package/esm/next/types/internal.d.ts.map +1 -0
- package/esm/next/types/internal.js +3 -0
- package/esm/next/types/internal.js.map +1 -0
- package/esm/next/types/mapProvider.d.ts +122 -0
- package/esm/next/types/mapProvider.d.ts.map +1 -0
- package/esm/next/types/mapProvider.js +3 -0
- package/esm/next/types/mapProvider.js.map +1 -0
- package/esm/next/types/public.d.ts +84 -0
- package/esm/next/types/public.d.ts.map +1 -0
- package/esm/next/types/public.js +15 -0
- package/esm/next/types/public.js.map +1 -0
- package/esm/next/types/shared.d.ts +209 -0
- package/esm/next/types/shared.d.ts.map +1 -0
- package/esm/next/types/shared.js +3 -0
- package/esm/next/types/shared.js.map +1 -0
- package/esm/next/utils/mapLocale.d.ts +26 -0
- package/esm/next/utils/mapLocale.d.ts.map +1 -0
- package/esm/next/utils/mapLocale.js +22 -0
- package/esm/next/utils/mapLocale.js.map +1 -0
- package/package.json +13 -10
- package/styles/css/main.css +925 -0
- package/styles/css/main.css.map +1 -1
- package/styles/scss/_geo-pushpin-next-legend.scss +166 -0
- package/styles/scss/_maplibre-overrides.scss +64 -0
- package/styles/scss/geo-pushpin-next.scss +58 -0
- package/styles/scss/main.scss +1 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// (C) 2025 GoodData Corporation
|
|
2
|
+
// =============================================================================
|
|
3
|
+
// Pushpin Size Configuration
|
|
4
|
+
// =============================================================================
|
|
5
|
+
/**
|
|
6
|
+
* Pushpin size mapping for different size options
|
|
7
|
+
*
|
|
8
|
+
* @remarks
|
|
9
|
+
* Defines minimum and maximum pushpin sizes for each size preset
|
|
10
|
+
*/
|
|
11
|
+
export const PUSHPIN_SIZE_OPTIONS_MAP = {
|
|
12
|
+
min: {
|
|
13
|
+
default: 8,
|
|
14
|
+
"0.5x": 4,
|
|
15
|
+
"0.75x": 6,
|
|
16
|
+
normal: 8,
|
|
17
|
+
"1.25x": 10,
|
|
18
|
+
"1.5x": 12,
|
|
19
|
+
},
|
|
20
|
+
max: {
|
|
21
|
+
default: 60,
|
|
22
|
+
"0.5x": 30,
|
|
23
|
+
"0.75x": 45,
|
|
24
|
+
normal: 60,
|
|
25
|
+
"1.25x": 75,
|
|
26
|
+
"1.5x": 90,
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
// =============================================================================
|
|
30
|
+
// Pushpin Color Configuration
|
|
31
|
+
// =============================================================================
|
|
32
|
+
/**
|
|
33
|
+
* Default border color for pushpins
|
|
34
|
+
*/
|
|
35
|
+
export const DEFAULT_PUSHPIN_BORDER_COLOR_VALUE = "rgb(233,237,241)";
|
|
36
|
+
/**
|
|
37
|
+
* Default opacity for pushpin colors
|
|
38
|
+
*/
|
|
39
|
+
export const DEFAULT_PUSHPIN_COLOR_OPACITY = 0.7;
|
|
40
|
+
/**
|
|
41
|
+
* Number of color scale steps for color gradients
|
|
42
|
+
*
|
|
43
|
+
* @remarks
|
|
44
|
+
* Used for creating color palettes. Should be less than 20 for performance.
|
|
45
|
+
*/
|
|
46
|
+
export const DEFAULT_PUSHPIN_COLOR_SCALE = 6;
|
|
47
|
+
/**
|
|
48
|
+
* Default color value for pushpins
|
|
49
|
+
*
|
|
50
|
+
* @remarks
|
|
51
|
+
* Used as fallback color when no color mapping is defined
|
|
52
|
+
*/
|
|
53
|
+
export const DEFAULT_PUSHPIN_COLOR_VALUE = "rgb(20,178,226)";
|
|
54
|
+
// =============================================================================
|
|
55
|
+
// Clustering Configuration
|
|
56
|
+
// =============================================================================
|
|
57
|
+
/**
|
|
58
|
+
* Maximum zoom level at which to cluster points
|
|
59
|
+
*/
|
|
60
|
+
export const DEFAULT_CLUSTER_MAX_ZOOM = 14;
|
|
61
|
+
/**
|
|
62
|
+
* Radius in pixels within which points will be clustered
|
|
63
|
+
*/
|
|
64
|
+
export const DEFAULT_CLUSTER_RADIUS = 50;
|
|
65
|
+
// =============================================================================
|
|
66
|
+
// Layer and Data Source Names
|
|
67
|
+
// =============================================================================
|
|
68
|
+
/**
|
|
69
|
+
* Default name for the pushpin data source
|
|
70
|
+
*/
|
|
71
|
+
export const DEFAULT_DATA_SOURCE_NAME = "gdcPushpinsData";
|
|
72
|
+
/**
|
|
73
|
+
* Default name for the pushpin layer
|
|
74
|
+
*/
|
|
75
|
+
export const DEFAULT_LAYER_NAME = "gdcPushpins";
|
|
76
|
+
/**
|
|
77
|
+
* Default name for the cluster layer
|
|
78
|
+
*/
|
|
79
|
+
export const DEFAULT_CLUSTER_LAYER_NAME = "gdcClusters";
|
|
80
|
+
/**
|
|
81
|
+
* Suffix for label layers
|
|
82
|
+
*/
|
|
83
|
+
export const LAYER_STYLE_LABEL_PREFIX = "-label";
|
|
84
|
+
// =============================================================================
|
|
85
|
+
// Pushpin Style Properties
|
|
86
|
+
// =============================================================================
|
|
87
|
+
/**
|
|
88
|
+
* Pushpin circle style type
|
|
89
|
+
*/
|
|
90
|
+
export const PUSHPIN_STYLE_CIRCLE = "circle";
|
|
91
|
+
/**
|
|
92
|
+
* Pushpin circle color property
|
|
93
|
+
*/
|
|
94
|
+
export const PUSHPIN_STYLE_CIRCLE_COLOR = "circle-color";
|
|
95
|
+
/**
|
|
96
|
+
* Pushpin circle size property
|
|
97
|
+
*/
|
|
98
|
+
export const PUSHPIN_STYLE_CIRCLE_SIZE = "circle-radius";
|
|
99
|
+
/**
|
|
100
|
+
* Pushpin circle stroke color property
|
|
101
|
+
*/
|
|
102
|
+
export const PUSHPIN_STYLE_CIRCLE_STROKE_COLOR = "circle-stroke-color";
|
|
103
|
+
// =============================================================================
|
|
104
|
+
// Data Limits
|
|
105
|
+
// =============================================================================
|
|
106
|
+
/**
|
|
107
|
+
* Maximum number of data points to render
|
|
108
|
+
*
|
|
109
|
+
* @remarks
|
|
110
|
+
* Limits are in place for performance reasons
|
|
111
|
+
*/
|
|
112
|
+
export const DEFAULT_DATA_POINTS_LIMIT = 25000;
|
|
113
|
+
// =============================================================================
|
|
114
|
+
// Tooltip Configuration
|
|
115
|
+
// =============================================================================
|
|
116
|
+
/**
|
|
117
|
+
* Default options for pushpin styling
|
|
118
|
+
*/
|
|
119
|
+
export const DEFAULT_PUSHPIN_OPTIONS = {
|
|
120
|
+
"circle-stroke-width": 1,
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* Value to display when data is null
|
|
124
|
+
*/
|
|
125
|
+
export const NULL_TOOLTIP_VALUE = "-";
|
|
126
|
+
/**
|
|
127
|
+
* Value used for empty segment filters
|
|
128
|
+
*/
|
|
129
|
+
export const EMPTY_SEGMENT_VALUE = "empty-segment-filter";
|
|
130
|
+
//# sourceMappingURL=geoChart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geoChart.js","sourceRoot":"","sources":["../../../src/next/constants/geoChart.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,gFAAgF;AAChF,6BAA6B;AAC7B,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACpC,GAAG,EAAE;QACD,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;KACb;IACD,GAAG,EAAE;QACD,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;KACb;CACK,CAAC;AAEX,gFAAgF;AAChF,8BAA8B;AAC9B,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,kBAAkB,CAAC;AAErE;;GAEG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,iBAAiB,CAAC;AAE7D,gFAAgF;AAChF,2BAA2B;AAC3B,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAE3C;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC,gFAAgF;AAChF,8BAA8B;AAC9B,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,iBAAiB,CAAC;AAE1D;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAC;AAEhD;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,aAAa,CAAC;AAExD;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,QAAQ,CAAC;AAEjD,gFAAgF;AAChF,2BAA2B;AAC3B,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAE7C;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,cAAc,CAAC;AAEzD;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,eAAe,CAAC;AAEzD;;GAEG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,qBAAqB,CAAC;AAEvE,gFAAgF;AAChF,cAAc;AACd,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAAC;AAE/C,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACnC,qBAAqB,EAAE,CAAC;CAClB,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAEtC;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Empty arrays (referentially stable)
|
|
3
|
+
*
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export declare const EMPTY_DRILLS: [];
|
|
7
|
+
/**
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
export declare const EMPTY_FILTERS: [];
|
|
11
|
+
/**
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export declare const EMPTY_SORT_BY: [];
|
|
15
|
+
/**
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
export declare const EMPTY_OBJECT: {};
|
|
19
|
+
//# sourceMappingURL=internal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../../src/next/constants/internal.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,EAAO,CAAC;AAEnC;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,EAAO,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,EAAO,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,YAAY,IAAK,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// (C) 2025 GoodData Corporation
|
|
2
|
+
/**
|
|
3
|
+
* Empty arrays (referentially stable)
|
|
4
|
+
*
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
7
|
+
export const EMPTY_DRILLS = [];
|
|
8
|
+
/**
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export const EMPTY_FILTERS = [];
|
|
12
|
+
/**
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export const EMPTY_SORT_BY = [];
|
|
16
|
+
/**
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
export const EMPTY_OBJECT = {};
|
|
20
|
+
//# sourceMappingURL=internal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../../../src/next/constants/internal.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAO,EAAE,CAAC;AAEnC;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAO,EAAE,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAO,EAAE,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import { IColorPalette } from "@gooddata/sdk-model";
|
|
3
|
+
import { IColorStrategy, IPushpinCategoryLegendItem } from "@gooddata/sdk-ui-vis-commons";
|
|
4
|
+
import { IAvailableLegends, IGeoData } from "../types/shared.js";
|
|
5
|
+
/**
|
|
6
|
+
* Context for geographic data and derived values.
|
|
7
|
+
*
|
|
8
|
+
* @remarks
|
|
9
|
+
* This context provides all computed data derived from the initial execution result.
|
|
10
|
+
* All values are computed once using useMemo and provided down the tree.
|
|
11
|
+
* This eliminates the need for useEffect state synchronization.
|
|
12
|
+
*
|
|
13
|
+
* @alpha
|
|
14
|
+
*/
|
|
15
|
+
interface IGeoDataContext {
|
|
16
|
+
/**
|
|
17
|
+
* Transformed geographic data
|
|
18
|
+
*/
|
|
19
|
+
geoData: IGeoData | null;
|
|
20
|
+
/**
|
|
21
|
+
* Color strategy used for visualization
|
|
22
|
+
*/
|
|
23
|
+
colorStrategy: IColorStrategy | null;
|
|
24
|
+
/**
|
|
25
|
+
* Color palette used for visualization
|
|
26
|
+
*/
|
|
27
|
+
colorPalette: IColorPalette;
|
|
28
|
+
/**
|
|
29
|
+
* Base category legend items (before applying visibility state)
|
|
30
|
+
*/
|
|
31
|
+
baseLegendItems: IPushpinCategoryLegendItem[];
|
|
32
|
+
/**
|
|
33
|
+
* Available legend types based on data
|
|
34
|
+
*/
|
|
35
|
+
availableLegends: IAvailableLegends;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Provider for geographic data.
|
|
39
|
+
*
|
|
40
|
+
* @remarks
|
|
41
|
+
* This provider computes all derived data from the initial execution result:
|
|
42
|
+
* - Transforms DataView to IGeoData
|
|
43
|
+
* - Creates color strategy
|
|
44
|
+
* - Generates legend items
|
|
45
|
+
* - Determines available legends
|
|
46
|
+
*
|
|
47
|
+
* All computations use useMemo and happen once per data change.
|
|
48
|
+
* No useEffect or state synchronization needed.
|
|
49
|
+
*
|
|
50
|
+
* @alpha
|
|
51
|
+
*/
|
|
52
|
+
export declare function GeoDataProvider({ children }: {
|
|
53
|
+
children: ReactNode;
|
|
54
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
55
|
+
/**
|
|
56
|
+
* Hook to access geographic data.
|
|
57
|
+
*
|
|
58
|
+
* @remarks
|
|
59
|
+
* Use this hook to access all computed data derived from the execution result.
|
|
60
|
+
* All values are already computed and memoized.
|
|
61
|
+
*
|
|
62
|
+
* @returns Geographic data context
|
|
63
|
+
* @throws Error if used outside of GeoDataProvider
|
|
64
|
+
*
|
|
65
|
+
* @alpha
|
|
66
|
+
*/
|
|
67
|
+
export declare function useGeoData(): IGeoDataContext;
|
|
68
|
+
export {};
|
|
69
|
+
//# sourceMappingURL=GeoDataContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeoDataContext.d.ts","sourceRoot":"","sources":["../../../src/next/context/GeoDataContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAsC,MAAM,OAAO,CAAC;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAQ1F,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEjE;;;;;;;;;GASG;AACH,UAAU,eAAe;IACrB;;OAEG;IACH,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IAEzB;;OAEG;IACH,aAAa,EAAE,cAAc,GAAG,IAAI,CAAC;IAErC;;OAEG;IACH,YAAY,EAAE,aAAa,CAAC;IAE5B;;OAEG;IACH,eAAe,EAAE,0BAA0B,EAAE,CAAC;IAE9C;;OAEG;IACH,gBAAgB,EAAE,iBAAiB,CAAC;CACvC;AAUD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CA4CpE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,IAAI,eAAe,CAQ5C"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// (C) 2025 GoodData Corporation
|
|
3
|
+
import { createContext, useContext, useMemo } from "react";
|
|
4
|
+
import { DefaultColorPalette } from "@gooddata/sdk-ui";
|
|
5
|
+
import { useGeoPushpinProps } from "./GeoPushpinPropsContext.js";
|
|
6
|
+
import { useInitialExecution } from "./InitialExecutionContext.js";
|
|
7
|
+
import { getColorStrategy } from "../features/coloring/colorStrategy.js";
|
|
8
|
+
import { getAvailableLegends } from "../features/data/transformation.js";
|
|
9
|
+
import { useLegendItems } from "../hooks/legend/useLegendItems.js";
|
|
10
|
+
import { useGeoDataTransformation } from "../hooks/shared/useGeoDataTransformation.js";
|
|
11
|
+
const GeoDataContext = createContext(undefined);
|
|
12
|
+
const EMPTY_AVAILABLE_LEGENDS = {
|
|
13
|
+
hasCategoryLegend: false,
|
|
14
|
+
hasColorLegend: false,
|
|
15
|
+
hasSizeLegend: false,
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Provider for geographic data.
|
|
19
|
+
*
|
|
20
|
+
* @remarks
|
|
21
|
+
* This provider computes all derived data from the initial execution result:
|
|
22
|
+
* - Transforms DataView to IGeoData
|
|
23
|
+
* - Creates color strategy
|
|
24
|
+
* - Generates legend items
|
|
25
|
+
* - Determines available legends
|
|
26
|
+
*
|
|
27
|
+
* All computations use useMemo and happen once per data change.
|
|
28
|
+
* No useEffect or state synchronization needed.
|
|
29
|
+
*
|
|
30
|
+
* @alpha
|
|
31
|
+
*/
|
|
32
|
+
export function GeoDataProvider({ children }) {
|
|
33
|
+
const props = useGeoPushpinProps();
|
|
34
|
+
const { initialDataView } = useInitialExecution();
|
|
35
|
+
// Transform execution data to geo format
|
|
36
|
+
const geoData = useGeoDataTransformation(initialDataView);
|
|
37
|
+
// Create color strategy (memoized to prevent infinite loops)
|
|
38
|
+
const colorPalette = useMemo(() => props.config?.colorPalette || DefaultColorPalette, [props.config?.colorPalette]);
|
|
39
|
+
const colorMapping = useMemo(() => props.config?.colorMapping || [], [props.config?.colorMapping]);
|
|
40
|
+
const colorStrategy = useMemo(() => geoData && initialDataView
|
|
41
|
+
? getColorStrategy(colorPalette, colorMapping, geoData, initialDataView)
|
|
42
|
+
: null, [colorPalette, colorMapping, geoData, initialDataView]);
|
|
43
|
+
// Get base legend items (with colors, but always isVisible: true)
|
|
44
|
+
const baseLegendItems = useLegendItems(initialDataView, geoData, colorStrategy);
|
|
45
|
+
// Compute available legends
|
|
46
|
+
const availableLegends = useMemo(() => {
|
|
47
|
+
if (!geoData) {
|
|
48
|
+
return EMPTY_AVAILABLE_LEGENDS;
|
|
49
|
+
}
|
|
50
|
+
return getAvailableLegends(baseLegendItems, geoData);
|
|
51
|
+
}, [baseLegendItems, geoData]);
|
|
52
|
+
const value = useMemo(() => ({
|
|
53
|
+
geoData,
|
|
54
|
+
colorStrategy,
|
|
55
|
+
colorPalette,
|
|
56
|
+
baseLegendItems,
|
|
57
|
+
availableLegends,
|
|
58
|
+
}), [geoData, colorStrategy, colorPalette, baseLegendItems, availableLegends]);
|
|
59
|
+
return _jsx(GeoDataContext.Provider, { value: value, children: children });
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Hook to access geographic data.
|
|
63
|
+
*
|
|
64
|
+
* @remarks
|
|
65
|
+
* Use this hook to access all computed data derived from the execution result.
|
|
66
|
+
* All values are already computed and memoized.
|
|
67
|
+
*
|
|
68
|
+
* @returns Geographic data context
|
|
69
|
+
* @throws Error if used outside of GeoDataProvider
|
|
70
|
+
*
|
|
71
|
+
* @alpha
|
|
72
|
+
*/
|
|
73
|
+
export function useGeoData() {
|
|
74
|
+
const context = useContext(GeoDataContext);
|
|
75
|
+
if (context === undefined) {
|
|
76
|
+
throw new Error("useGeoData must be used within a GeoDataProvider");
|
|
77
|
+
}
|
|
78
|
+
return context;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=GeoDataContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeoDataContext.js","sourceRoot":"","sources":["../../../src/next/context/GeoDataContext.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAEhC,OAAO,EAAa,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AAwCvF,MAAM,cAAc,GAAG,aAAa,CAA8B,SAAS,CAAC,CAAC;AAE7E,MAAM,uBAAuB,GAAsB;IAC/C,iBAAiB,EAAE,KAAK;IACxB,cAAc,EAAE,KAAK;IACrB,aAAa,EAAE,KAAK;CACvB,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAAC,EAAE,QAAQ,EAA2B;IACjE,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;IACnC,MAAM,EAAE,eAAe,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAElD,yCAAyC;IACzC,MAAM,OAAO,GAAG,wBAAwB,CAAC,eAAe,CAAC,CAAC;IAE1D,6DAA6D;IAC7D,MAAM,YAAY,GAAG,OAAO,CACxB,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,IAAI,mBAAmB,EACvD,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAC/B,CAAC;IACF,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IACnG,MAAM,aAAa,GAAG,OAAO,CACzB,GAAG,EAAE,CACD,OAAO,IAAI,eAAe;QACtB,CAAC,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,CAAC;QACxE,CAAC,CAAC,IAAI,EACd,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,CAAC,CACzD,CAAC;IAEF,kEAAkE;IAClE,MAAM,eAAe,GAAG,cAAc,CAAC,eAAe,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IAEhF,4BAA4B;IAC5B,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,EAAE;QAClC,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,uBAAuB,CAAC;QACnC,CAAC;QACD,OAAO,mBAAmB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC,EAAE,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IAE/B,MAAM,KAAK,GAAG,OAAO,CACjB,GAAG,EAAE,CAAC,CAAC;QACH,OAAO;QACP,aAAa;QACb,YAAY;QACZ,eAAe;QACf,gBAAgB;KACnB,CAAC,EACF,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAC5E,CAAC;IAEF,OAAO,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA2B,CAAC;AACvF,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,UAAU;IACtB,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAE3C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import { PositionType } from "@gooddata/sdk-ui-vis-commons";
|
|
3
|
+
/**
|
|
4
|
+
* Context for managing legend state and behavior.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* This context manages which legend items are enabled/visible, the legend position,
|
|
8
|
+
* and responsive layout behavior for smaller screens.
|
|
9
|
+
*
|
|
10
|
+
* @alpha
|
|
11
|
+
*/
|
|
12
|
+
interface IGeoLegendContext {
|
|
13
|
+
/**
|
|
14
|
+
* URIs of enabled legend items (empty array means all enabled)
|
|
15
|
+
*/
|
|
16
|
+
enabledLegendItems: string[];
|
|
17
|
+
/**
|
|
18
|
+
* Updates the enabled legend items
|
|
19
|
+
*/
|
|
20
|
+
setEnabledLegendItems: (items: string[]) => void;
|
|
21
|
+
/**
|
|
22
|
+
* Toggles a legend item's enabled state
|
|
23
|
+
*
|
|
24
|
+
* @param uri - The URI of the legend item to toggle
|
|
25
|
+
* @param allUris - All available legend item URIs (for toggle logic)
|
|
26
|
+
*/
|
|
27
|
+
toggleLegendItem: (uri: string, allUris: string[]) => void;
|
|
28
|
+
/**
|
|
29
|
+
* Position of the legend relative to the chart
|
|
30
|
+
*/
|
|
31
|
+
legendPosition: PositionType;
|
|
32
|
+
/**
|
|
33
|
+
* Updates the legend position
|
|
34
|
+
*/
|
|
35
|
+
setLegendPosition: (position: PositionType) => void;
|
|
36
|
+
/**
|
|
37
|
+
* Whether the legend is in responsive mode (horizontal layout on small screens)
|
|
38
|
+
*/
|
|
39
|
+
isResponsive: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Updates the responsive state
|
|
42
|
+
*/
|
|
43
|
+
setIsResponsive: (responsive: boolean) => void;
|
|
44
|
+
/**
|
|
45
|
+
* Whether the legend should show in a popup on small screens
|
|
46
|
+
*/
|
|
47
|
+
showPopup: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Updates the popup state
|
|
50
|
+
*/
|
|
51
|
+
setShowPopup: (show: boolean) => void;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Provider for legend state management.
|
|
55
|
+
*
|
|
56
|
+
* @remarks
|
|
57
|
+
* This provider manages the state of the legend including which items are visible,
|
|
58
|
+
* the legend position, and responsive behavior.
|
|
59
|
+
*
|
|
60
|
+
* @alpha
|
|
61
|
+
*/
|
|
62
|
+
export declare function GeoLegendProvider({ children }: {
|
|
63
|
+
children: ReactNode;
|
|
64
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
65
|
+
/**
|
|
66
|
+
* Hook to access legend state and controls.
|
|
67
|
+
*
|
|
68
|
+
* @remarks
|
|
69
|
+
* Use this hook to manage legend visibility, position, and responsive behavior.
|
|
70
|
+
*
|
|
71
|
+
* @returns Legend context
|
|
72
|
+
* @throws Error if used outside of GeoLegendProvider
|
|
73
|
+
*
|
|
74
|
+
* @alpha
|
|
75
|
+
*/
|
|
76
|
+
export declare function useGeoLegend(): IGeoLegendContext;
|
|
77
|
+
export {};
|
|
78
|
+
//# sourceMappingURL=GeoLegendContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeoLegendContext.d.ts","sourceRoot":"","sources":["../../../src/next/context/GeoLegendContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAuC,MAAM,OAAO,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D;;;;;;;;GAQG;AACH,UAAU,iBAAiB;IACvB;;OAEG;IACH,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAE7B;;OAEG;IACH,qBAAqB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAEjD;;;;;OAKG;IACH,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAE3D;;OAEG;IACH,cAAc,EAAE,YAAY,CAAC;IAE7B;;OAEG;IACH,iBAAiB,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAEpD;;OAEG;IACH,YAAY,EAAE,OAAO,CAAC;IAEtB;;OAEG;IACH,eAAe,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;IAE/C;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACzC;AAID;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAmDtE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,IAAI,iBAAiB,CAQhD"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// (C) 2025 GoodData Corporation
|
|
3
|
+
import { createContext, useContext, useState } from "react";
|
|
4
|
+
const GeoLegendContext = createContext(undefined);
|
|
5
|
+
/**
|
|
6
|
+
* Provider for legend state management.
|
|
7
|
+
*
|
|
8
|
+
* @remarks
|
|
9
|
+
* This provider manages the state of the legend including which items are visible,
|
|
10
|
+
* the legend position, and responsive behavior.
|
|
11
|
+
*
|
|
12
|
+
* @alpha
|
|
13
|
+
*/
|
|
14
|
+
export function GeoLegendProvider({ children }) {
|
|
15
|
+
const [enabledLegendItems, setEnabledLegendItems] = useState([]);
|
|
16
|
+
const [legendPosition, setLegendPosition] = useState("top");
|
|
17
|
+
const [isResponsive, setIsResponsive] = useState(false);
|
|
18
|
+
const [showPopup, setShowPopup] = useState(false);
|
|
19
|
+
const toggleLegendItem = (uri, allUris) => {
|
|
20
|
+
setEnabledLegendItems((prev) => {
|
|
21
|
+
// If empty (all enabled), clicking disables the clicked item
|
|
22
|
+
// by enabling all EXCEPT the clicked one
|
|
23
|
+
if (prev.length === 0) {
|
|
24
|
+
return allUris.filter((itemUri) => itemUri !== uri);
|
|
25
|
+
}
|
|
26
|
+
// If the item is enabled, disable it
|
|
27
|
+
if (prev.includes(uri)) {
|
|
28
|
+
const newEnabled = prev.filter((item) => item !== uri);
|
|
29
|
+
// If all items would be enabled again, return to "all enabled" state (empty array)
|
|
30
|
+
if (newEnabled.length === allUris.length - 1) {
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
return newEnabled;
|
|
34
|
+
}
|
|
35
|
+
// If the item is disabled, enable it
|
|
36
|
+
const newEnabled = [...prev, uri];
|
|
37
|
+
// If all items are now enabled, return to "all enabled" state (empty array)
|
|
38
|
+
if (newEnabled.length === allUris.length) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
return newEnabled;
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
return (_jsx(GeoLegendContext.Provider, { value: {
|
|
45
|
+
enabledLegendItems,
|
|
46
|
+
setEnabledLegendItems,
|
|
47
|
+
toggleLegendItem,
|
|
48
|
+
legendPosition,
|
|
49
|
+
setLegendPosition,
|
|
50
|
+
isResponsive,
|
|
51
|
+
setIsResponsive,
|
|
52
|
+
showPopup,
|
|
53
|
+
setShowPopup,
|
|
54
|
+
}, children: children }));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Hook to access legend state and controls.
|
|
58
|
+
*
|
|
59
|
+
* @remarks
|
|
60
|
+
* Use this hook to manage legend visibility, position, and responsive behavior.
|
|
61
|
+
*
|
|
62
|
+
* @returns Legend context
|
|
63
|
+
* @throws Error if used outside of GeoLegendProvider
|
|
64
|
+
*
|
|
65
|
+
* @alpha
|
|
66
|
+
*/
|
|
67
|
+
export function useGeoLegend() {
|
|
68
|
+
const context = useContext(GeoLegendContext);
|
|
69
|
+
if (context === undefined) {
|
|
70
|
+
throw new Error("useGeoLegend must be used within a GeoLegendProvider");
|
|
71
|
+
}
|
|
72
|
+
return context;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=GeoLegendContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeoLegendContext.js","sourceRoot":"","sources":["../../../src/next/context/GeoLegendContext.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAEhC,OAAO,EAAa,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AA+DvE,MAAM,gBAAgB,GAAG,aAAa,CAAgC,SAAS,CAAC,CAAC;AAEjF;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAE,QAAQ,EAA2B;IACnE,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IAC3E,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAe,KAAK,CAAC,CAAC;IAC1E,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElD,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAE,OAAiB,EAAE,EAAE;QACxD,qBAAqB,CAAC,CAAC,IAAI,EAAE,EAAE;YAC3B,6DAA6D;YAC7D,yCAAyC;YACzC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpB,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC;YACxD,CAAC;YAED,qCAAqC;YACrC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;gBACvD,mFAAmF;gBACnF,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3C,OAAO,EAAE,CAAC;gBACd,CAAC;gBACD,OAAO,UAAU,CAAC;YACtB,CAAC;YAED,qCAAqC;YACrC,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;YAClC,4EAA4E;YAC5E,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;gBACvC,OAAO,EAAE,CAAC;YACd,CAAC;YACD,OAAO,UAAU,CAAC;QACtB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,OAAO,CACH,KAAC,gBAAgB,CAAC,QAAQ,IACtB,KAAK,EAAE;YACH,kBAAkB;YAClB,qBAAqB;YACrB,gBAAgB;YAChB,cAAc;YACd,iBAAiB;YACjB,YAAY;YACZ,eAAe;YACf,SAAS;YACT,YAAY;SACf,YAEA,QAAQ,GACe,CAC/B,CAAC;AACN,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY;IACxB,MAAM,OAAO,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAE7C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
import { IGeoPushpinChartNextConfig } from "../types/config.js";
|
|
3
|
+
import { ICoreGeoPushpinChartNextProps } from "../types/internal.js";
|
|
4
|
+
/**
|
|
5
|
+
* Provider for GeoPushpinChartNext component props.
|
|
6
|
+
*
|
|
7
|
+
* @remarks
|
|
8
|
+
* This context provides access to all props passed to the GeoPushpinChartNext component
|
|
9
|
+
* including configuration, data properties, and callback handlers.
|
|
10
|
+
*
|
|
11
|
+
* @alpha
|
|
12
|
+
*/
|
|
13
|
+
export declare function GeoPushpinPropsProvider({ children, ...props }: ICoreGeoPushpinChartNextProps & {
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
type WithRequired<T, K extends keyof T> = T & Required<Pick<T, K>>;
|
|
17
|
+
type ConfigDefaults = "points" | "legend";
|
|
18
|
+
type ConfigWithDefaults = WithRequired<IGeoPushpinChartNextConfig, ConfigDefaults>;
|
|
19
|
+
type RootPropsDefaults = "drillableItems" | "filters" | "sortBy" | "config" | "execConfig";
|
|
20
|
+
type RootPropsWithDefaults = WithRequired<ICoreGeoPushpinChartNextProps, RootPropsDefaults>;
|
|
21
|
+
type GeoPushpinPropsWithDefaults = RootPropsWithDefaults & {
|
|
22
|
+
config: ConfigWithDefaults;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Applies default values to GeoPushpinChartNext props.
|
|
26
|
+
*
|
|
27
|
+
* @param props - The component props
|
|
28
|
+
* @returns Props with defaults applied
|
|
29
|
+
*
|
|
30
|
+
* @alpha
|
|
31
|
+
*/
|
|
32
|
+
export declare function applyGeoPushpinDefaultProps(props: ICoreGeoPushpinChartNextProps): GeoPushpinPropsWithDefaults;
|
|
33
|
+
/**
|
|
34
|
+
* Hook to access GeoPushpinChartNext component props.
|
|
35
|
+
*
|
|
36
|
+
* @remarks
|
|
37
|
+
* This hook provides access to all component props with default values applied
|
|
38
|
+
* and deep memoization for stable references across renders.
|
|
39
|
+
*
|
|
40
|
+
* @returns Component props with defaults
|
|
41
|
+
* @throws Error if used outside of GeoPushpinPropsProvider
|
|
42
|
+
*
|
|
43
|
+
* @alpha
|
|
44
|
+
*/
|
|
45
|
+
export declare function useGeoPushpinProps(): GeoPushpinPropsWithDefaults;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=GeoPushpinPropsContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeoPushpinPropsContext.d.ts","sourceRoot":"","sources":["../../../src/next/context/GeoPushpinPropsContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAA6B,MAAM,OAAO,CAAC;AAK7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AAIrE;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,EACpC,QAAQ,EACR,GAAG,KAAK,EACX,EAAE,6BAA6B,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAEzD;AAED,KAAK,YAAY,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAEnE,KAAK,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE1C,KAAK,kBAAkB,GAAG,YAAY,CAAC,0BAA0B,EAAE,cAAc,CAAC,CAAC;AAEnF,KAAK,iBAAiB,GAAG,gBAAgB,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE3F,KAAK,qBAAqB,GAAG,YAAY,CAAC,6BAA6B,EAAE,iBAAiB,CAAC,CAAC;AAE5F,KAAK,2BAA2B,GAAG,qBAAqB,GAAG;IACvD,MAAM,EAAE,kBAAkB,CAAC;CAC9B,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACvC,KAAK,EAAE,6BAA6B,GACrC,2BAA2B,CAwB7B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,IAAI,2BAA2B,CAmBhE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// (C) 2025 GoodData Corporation
|
|
3
|
+
import { createContext, useContext } from "react";
|
|
4
|
+
import { useDeepMemo } from "@gooddata/sdk-ui/internal";
|
|
5
|
+
import { EMPTY_DRILLS, EMPTY_FILTERS, EMPTY_OBJECT, EMPTY_SORT_BY } from "../constants/internal.js";
|
|
6
|
+
const GeoPushpinPropsContext = createContext(undefined);
|
|
7
|
+
/**
|
|
8
|
+
* Provider for GeoPushpinChartNext component props.
|
|
9
|
+
*
|
|
10
|
+
* @remarks
|
|
11
|
+
* This context provides access to all props passed to the GeoPushpinChartNext component
|
|
12
|
+
* including configuration, data properties, and callback handlers.
|
|
13
|
+
*
|
|
14
|
+
* @alpha
|
|
15
|
+
*/
|
|
16
|
+
export function GeoPushpinPropsProvider({ children, ...props }) {
|
|
17
|
+
return _jsx(GeoPushpinPropsContext.Provider, { value: props, children: children });
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Applies default values to GeoPushpinChartNext props.
|
|
21
|
+
*
|
|
22
|
+
* @param props - The component props
|
|
23
|
+
* @returns Props with defaults applied
|
|
24
|
+
*
|
|
25
|
+
* @alpha
|
|
26
|
+
*/
|
|
27
|
+
export function applyGeoPushpinDefaultProps(props) {
|
|
28
|
+
return {
|
|
29
|
+
...props,
|
|
30
|
+
drillableItems: props.drillableItems ?? EMPTY_DRILLS,
|
|
31
|
+
filters: props.filters ?? EMPTY_FILTERS,
|
|
32
|
+
sortBy: props.sortBy ?? EMPTY_SORT_BY,
|
|
33
|
+
config: {
|
|
34
|
+
...(props.config ?? {}),
|
|
35
|
+
center: props.config?.center,
|
|
36
|
+
zoom: props.config?.zoom,
|
|
37
|
+
points: {
|
|
38
|
+
...(props.config?.points ?? {}),
|
|
39
|
+
minSize: props.config?.points?.minSize ?? "normal",
|
|
40
|
+
maxSize: props.config?.points?.maxSize ?? "normal",
|
|
41
|
+
groupNearbyPoints: props.config?.points?.groupNearbyPoints ?? true,
|
|
42
|
+
},
|
|
43
|
+
legend: {
|
|
44
|
+
...(props.config?.legend ?? {}),
|
|
45
|
+
enabled: props.config?.legend?.enabled ?? true,
|
|
46
|
+
position: props.config?.legend?.position ?? "top",
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
execConfig: props.execConfig ?? EMPTY_OBJECT,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Hook to access GeoPushpinChartNext component props.
|
|
54
|
+
*
|
|
55
|
+
* @remarks
|
|
56
|
+
* This hook provides access to all component props with default values applied
|
|
57
|
+
* and deep memoization for stable references across renders.
|
|
58
|
+
*
|
|
59
|
+
* @returns Component props with defaults
|
|
60
|
+
* @throws Error if used outside of GeoPushpinPropsProvider
|
|
61
|
+
*
|
|
62
|
+
* @alpha
|
|
63
|
+
*/
|
|
64
|
+
export function useGeoPushpinProps() {
|
|
65
|
+
const context = useContext(GeoPushpinPropsContext);
|
|
66
|
+
const memoizeDeep = useDeepMemo();
|
|
67
|
+
if (context === undefined) {
|
|
68
|
+
throw new Error("useGeoPushpinProps must be used within a GeoPushpinPropsProvider");
|
|
69
|
+
}
|
|
70
|
+
const baseProps = applyGeoPushpinDefaultProps(context);
|
|
71
|
+
// Recursively memoize nested properties to maintain stable references
|
|
72
|
+
return {
|
|
73
|
+
...baseProps,
|
|
74
|
+
drillableItems: memoizeDeep("drillableItems", baseProps.drillableItems),
|
|
75
|
+
filters: memoizeDeep("filters", baseProps.filters),
|
|
76
|
+
sortBy: memoizeDeep("sortBy", baseProps.sortBy),
|
|
77
|
+
execConfig: memoizeDeep("execConfig", baseProps.execConfig),
|
|
78
|
+
config: memoizeDeep("config", baseProps.config),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=GeoPushpinPropsContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeoPushpinPropsContext.js","sourceRoot":"","sources":["../../../src/next/context/GeoPushpinPropsContext.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAEhC,OAAO,EAAa,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAIpG,MAAM,sBAAsB,GAAG,aAAa,CAA4C,SAAS,CAAC,CAAC;AAEnG;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CAAC,EACpC,QAAQ,EACR,GAAG,KAAK,EAC8C;IACtD,OAAO,KAAC,sBAAsB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAmC,CAAC;AACvG,CAAC;AAgBD;;;;;;;GAOG;AACH,MAAM,UAAU,2BAA2B,CACvC,KAAoC;IAEpC,OAAO;QACH,GAAG,KAAK;QACR,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,YAAY;QACpD,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,aAAa;QACvC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,aAAa;QACrC,MAAM,EAAE;YACJ,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;YACvB,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM;YAC5B,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI;YACxB,MAAM,EAAE;gBACJ,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC;gBAC/B,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,IAAI,QAAQ;gBAClD,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,IAAI,QAAQ;gBAClD,iBAAiB,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,iBAAiB,IAAI,IAAI;aACrE;YACD,MAAM,EAAE;gBACJ,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC;gBAC/B,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,IAAI,IAAI;gBAC9C,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,IAAI,KAAK;aACpD;SACJ;QACD,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,YAAY;KAC/C,CAAC;AACN,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB;IAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,WAAW,EAAE,CAAC;IAElC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,SAAS,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAEvD,sEAAsE;IACtE,OAAO;QACH,GAAG,SAAS;QACZ,cAAc,EAAE,WAAW,CAAC,gBAAgB,EAAE,SAAS,CAAC,cAAc,CAAC;QACvE,OAAO,EAAE,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC;QAClD,MAAM,EAAE,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC;QAC/C,UAAU,EAAE,WAAW,CAAC,YAAY,EAAE,SAAS,CAAC,UAAU,CAAC;QAC3D,MAAM,EAAE,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC;KAClD,CAAC;AACN,CAAC"}
|