@gooddata/sdk-ui-geo 11.39.0-alpha.1 → 11.39.0-alpha.2

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 (30) hide show
  1. package/esm/next/components/GeoChartDataLoader.js +2 -2
  2. package/esm/next/components/GeoChartProviders.d.ts +3 -1
  3. package/esm/next/components/GeoChartProviders.js +2 -2
  4. package/esm/next/context/GeoLayersContext.d.ts +7 -1
  5. package/esm/next/context/GeoLayersContext.js +3 -2
  6. package/esm/next/hooks/dataLoading/useGeoChartDataPipeline.d.ts +2 -0
  7. package/esm/next/hooks/dataLoading/useGeoChartDataPipeline.js +11 -0
  8. package/esm/next/hooks/layers/useLayerTooltips.d.ts +6 -1
  9. package/esm/next/hooks/layers/useLayerTooltips.js +5 -4
  10. package/esm/next/hooks/layers/useLayersTooltipData.d.ts +31 -0
  11. package/esm/next/hooks/layers/useLayersTooltipData.js +90 -0
  12. package/esm/next/hooks/layers/useSyncLayersToMap.js +2 -1
  13. package/esm/next/layers/area/adapter.js +48 -18
  14. package/esm/next/layers/area/tooltip/tooltipManagement.d.ts +2 -1
  15. package/esm/next/layers/area/tooltip/tooltipManagement.js +6 -5
  16. package/esm/next/layers/common/customTooltipExecution.d.ts +64 -0
  17. package/esm/next/layers/common/customTooltipExecution.js +82 -0
  18. package/esm/next/layers/common/customTooltipSection.d.ts +2 -1
  19. package/esm/next/layers/common/customTooltipSection.js +13 -6
  20. package/esm/next/layers/common/resolveReferencesFromGeoFeature.d.ts +1 -1
  21. package/esm/next/layers/common/resolveReferencesFromGeoFeature.js +5 -1
  22. package/esm/next/layers/common/tooltipUtils.d.ts +6 -0
  23. package/esm/next/layers/common/tooltipUtils.js +2 -0
  24. package/esm/next/layers/pushpin/adapter.js +67 -18
  25. package/esm/next/layers/pushpin/tooltip/tooltipManagement.d.ts +3 -2
  26. package/esm/next/layers/pushpin/tooltip/tooltipManagement.js +6 -5
  27. package/esm/next/layers/registry/adapterTypes.d.ts +17 -1
  28. package/package.json +11 -11
  29. package/styles/css/main.css +21 -17
  30. package/styles/css/main.css.map +1 -1
@@ -22,7 +22,7 @@ export function GeoChartDataLoader({ layerExecutions, }) {
22
22
  const intl = useIntl();
23
23
  const backend = useBackendStrict(props.backend, "GeoDataLoadingGate");
24
24
  const workspace = useWorkspaceStrict(props.workspace, "GeoDataLoadingGate");
25
- const { layerOutputs, status, error } = useGeoChartData({
25
+ const { layerOutputs, tooltipLookups, status, error } = useGeoChartData({
26
26
  layerExecutions,
27
27
  backend,
28
28
  workspace,
@@ -76,5 +76,5 @@ export function GeoChartDataLoader({ layerExecutions, }) {
76
76
  if (status !== "success") {
77
77
  return _jsx(GeoLoadingComponent, {});
78
78
  }
79
- return (_jsx(GeoChartProviders, { layerExecutions: layerExecutions, layerOutputs: layerOutputs, children: _jsx(RenderGeoChart, { onMapError: setMapError }) }));
79
+ return (_jsx(GeoChartProviders, { layerExecutions: layerExecutions, layerOutputs: layerOutputs, tooltipLookups: tooltipLookups, children: _jsx(RenderGeoChart, { onMapError: setMapError }) }));
80
80
  }
@@ -1,10 +1,12 @@
1
1
  import { type ReactElement, type ReactNode } from "react";
2
2
  import type { ILayerPreparedData } from "../hooks/layers/useLayersPrepare.js";
3
+ import type { IGeoLayerTooltipLookup } from "../layers/common/customTooltipExecution.js";
3
4
  import type { ILayerExecutionRecord } from "../types/props/geoChart/internal.js";
4
5
  interface IGeoChartProvidersProps {
5
6
  children: ReactNode;
6
7
  layerExecutions: ILayerExecutionRecord[];
7
8
  layerOutputs: Map<string, ILayerPreparedData>;
9
+ tooltipLookups: Map<string, IGeoLayerTooltipLookup>;
8
10
  }
9
- export declare function GeoChartProviders({ children, layerExecutions, layerOutputs }: IGeoChartProvidersProps): ReactElement;
11
+ export declare function GeoChartProviders({ children, layerExecutions, layerOutputs, tooltipLookups }: IGeoChartProvidersProps): ReactElement;
10
12
  export {};
@@ -4,8 +4,8 @@ import { useMemo } from "react";
4
4
  import { GeoLayersProvider, useGeoLayers } from "../context/GeoLayersContext.js";
5
5
  import { GeoLegendProvider } from "../context/GeoLegendContext.js";
6
6
  import { InitialExecutionContextProvider } from "../context/InitialExecutionContext.js";
7
- export function GeoChartProviders({ children, layerExecutions, layerOutputs, }) {
8
- return (_jsx(GeoLayersProvider, { layerExecutions: layerExecutions, layerOutputs: layerOutputs, children: _jsx(GeoLegendProvider, { children: _jsx(InitialExecutionProvider, { children: children }) }) }));
7
+ export function GeoChartProviders({ children, layerExecutions, layerOutputs, tooltipLookups, }) {
8
+ return (_jsx(GeoLayersProvider, { layerExecutions: layerExecutions, layerOutputs: layerOutputs, tooltipLookups: tooltipLookups, children: _jsx(GeoLegendProvider, { children: _jsx(InitialExecutionProvider, { children: children }) }) }));
9
9
  }
10
10
  function InitialExecutionProvider({ children }) {
11
11
  const { primaryLayer } = useGeoLayers();
@@ -2,6 +2,7 @@ import { type ReactNode } from "react";
2
2
  import { type DataViewFacade } from "@gooddata/sdk-ui";
3
3
  import { type IColorStrategy } from "@gooddata/sdk-ui-vis-commons";
4
4
  import type { ILayerPreparedData } from "../hooks/layers/useLayersPrepare.js";
5
+ import type { IGeoLayerTooltipLookup } from "../layers/common/customTooltipExecution.js";
5
6
  import type { GeoJSONSourceSpecification } from "../layers/common/mapFacade.js";
6
7
  import type { ITooltipReferenceMaps } from "../layers/registry/adapterTypes.js";
7
8
  import { type IAvailableLegends, type IGeoLegendItem } from "../types/common/legends.js";
@@ -83,6 +84,10 @@ export interface IGeoLayersContext {
83
84
  * Primary (first) layer data - used for legend/tooltips.
84
85
  */
85
86
  primaryLayer: IGeoLayerData | null;
87
+ /**
88
+ * Per-layer custom-tooltip lookups (empty when nothing external is fetched).
89
+ */
90
+ tooltipLookups: Map<string, IGeoLayerTooltipLookup>;
86
91
  }
87
92
  /**
88
93
  * Provider that exposes pre-loaded layer data through context.
@@ -93,10 +98,11 @@ export interface IGeoLayersContext {
93
98
  *
94
99
  * @internal
95
100
  */
96
- export declare function GeoLayersProvider({ children, layerExecutions, layerOutputs }: {
101
+ export declare function GeoLayersProvider({ children, layerExecutions, layerOutputs, tooltipLookups }: {
97
102
  children: ReactNode;
98
103
  layerExecutions: ILayerExecutionRecord[];
99
104
  layerOutputs: Map<string, ILayerPreparedData>;
105
+ tooltipLookups: Map<string, IGeoLayerTooltipLookup>;
100
106
  }): import("react/jsx-runtime").JSX.Element;
101
107
  /**
102
108
  * Hook to access multi-layer geo data context
@@ -17,7 +17,7 @@ const GeoLayersContext = createContext(undefined);
17
17
  *
18
18
  * @internal
19
19
  */
20
- export function GeoLayersProvider({ children, layerExecutions, layerOutputs, }) {
20
+ export function GeoLayersProvider({ children, layerExecutions, layerOutputs, tooltipLookups, }) {
21
21
  const layersData = useMemo(() => {
22
22
  const map = new Map();
23
23
  for (const layerExecution of layerExecutions) {
@@ -46,7 +46,8 @@ export function GeoLayersProvider({ children, layerExecutions, layerOutputs, })
46
46
  layerExecutions,
47
47
  layers: layersData,
48
48
  primaryLayer,
49
- }), [layerExecutions, layersData, primaryLayer]);
49
+ tooltipLookups,
50
+ }), [layerExecutions, layersData, primaryLayer, tooltipLookups]);
50
51
  return _jsx(GeoLayersContext.Provider, { value: value, children: children });
51
52
  }
52
53
  /**
@@ -2,11 +2,13 @@ import { type IntlShape } from "react-intl";
2
2
  import { type IAnalyticalBackend } from "@gooddata/sdk-backend-spi";
3
3
  import { type IExecutionConfig } from "@gooddata/sdk-model";
4
4
  import { type GoodDataSdkError, type UseCancelablePromiseStatus } from "@gooddata/sdk-ui";
5
+ import type { IGeoLayerTooltipLookup } from "../../layers/common/customTooltipExecution.js";
5
6
  import { type IGeoChartConfig } from "../../types/config/unified.js";
6
7
  import { type ILayerExecutionRecord } from "../../types/props/geoChart/internal.js";
7
8
  import { type ILayerPreparedData } from "../layers/useLayersPrepare.js";
8
9
  export interface IGeoChartDataResult {
9
10
  layerOutputs: Map<string, ILayerPreparedData>;
11
+ tooltipLookups: Map<string, IGeoLayerTooltipLookup>;
10
12
  status: UseCancelablePromiseStatus;
11
13
  error?: GoodDataSdkError;
12
14
  }
@@ -4,6 +4,7 @@ import { DataTooLargeToDisplaySdkError, } from "@gooddata/sdk-ui";
4
4
  import { getDataPointsLimit, validateLayersDataSize } from "../../utils/dataValidation.js";
5
5
  import { useLayersData } from "../layers/useLayersData.js";
6
6
  import { useLayersPrepare, } from "../layers/useLayersPrepare.js";
7
+ import { useLayersTooltipData } from "../layers/useLayersTooltipData.js";
7
8
  /**
8
9
  * Status priority for combining multiple statuses.
9
10
  * Lower number = higher priority (takes precedence).
@@ -32,6 +33,15 @@ export function useGeoChartData(params) {
32
33
  intl,
33
34
  };
34
35
  const { layerOutputs, status: prepareStatus, error: prepareError, } = useLayersPrepare(layerExecutions, layerDataViews, dataStatus, prepareContext);
36
+ const { tooltipLookups } = useLayersTooltipData({
37
+ layerExecutions,
38
+ layerDataViews,
39
+ backend,
40
+ workspace,
41
+ config,
42
+ execConfig,
43
+ intl,
44
+ });
35
45
  const combinedStatus = combineStatus(dataStatus, prepareStatus);
36
46
  const pipelineError = dataError ?? prepareError;
37
47
  const dataSizeValidation = useMemo(() => {
@@ -51,6 +61,7 @@ export function useGeoChartData(params) {
51
61
  const error = pipelineError ?? dataTooLargeError;
52
62
  return {
53
63
  layerOutputs,
64
+ tooltipLookups,
54
65
  status,
55
66
  error,
56
67
  };
@@ -1,5 +1,6 @@
1
1
  import { type IHeaderPredicate } from "@gooddata/sdk-ui";
2
2
  import { type IGeoLayerData } from "../../context/GeoLayersContext.js";
3
+ import type { IGeoLayerTooltipLookup } from "../../layers/common/customTooltipExecution.js";
3
4
  import type { IMapFacade, IPopupFacade } from "../../layers/common/mapFacade.js";
4
5
  import type { IGeoAdapterContext } from "../../layers/registry/adapterTypes.js";
5
6
  import { type ILayerExecutionRecord } from "../../types/props/geoChart/internal.js";
@@ -32,6 +33,10 @@ interface IUseLayerTooltipsParams {
32
33
  * Adapter context for tooltip registration.
33
34
  */
34
35
  adapterContext: IGeoAdapterContext;
36
+ /**
37
+ * Per-layer custom-tooltip lookups, keyed by layerId.
38
+ */
39
+ tooltipLookups: Map<string, IGeoLayerTooltipLookup>;
35
40
  }
36
41
  /**
37
42
  * Hook that manages unified tooltip handling for all layers.
@@ -43,5 +48,5 @@ interface IUseLayerTooltipsParams {
43
48
  *
44
49
  * @internal
45
50
  */
46
- export declare function useLayerTooltips({ map, isMapReady, tooltip, drillablePredicates, layerExecutions, layers, adapterContext }: IUseLayerTooltipsParams): void;
51
+ export declare function useLayerTooltips({ map, isMapReady, tooltip, drillablePredicates, layerExecutions, layers, adapterContext, tooltipLookups }: IUseLayerTooltipsParams): void;
47
52
  export {};
@@ -5,7 +5,7 @@ import { buildOutputFromLayerData } from "../../layers/registry/output.js";
5
5
  /**
6
6
  * Collects tooltip configuration from an adapter.
7
7
  */
8
- function getLayerTooltipConfig(layerExecution, layerData, adapterContext, tooltip, drillablePredicates) {
8
+ function getLayerTooltipConfig(layerExecution, layerData, adapterContext, tooltip, drillablePredicates, tooltipLookup) {
9
9
  const { layer } = layerExecution;
10
10
  const adapter = getLayerAdapter(layer);
11
11
  const layerOutput = buildOutputFromLayerData(layerData);
@@ -15,6 +15,7 @@ function getLayerTooltipConfig(layerExecution, layerData, adapterContext, toolti
15
15
  return (adapter.getTooltipConfig(layer, layerOutput, adapterContext, {
16
16
  tooltip,
17
17
  drillablePredicates,
18
+ tooltipLookup,
18
19
  }) ?? null);
19
20
  }
20
21
  /**
@@ -27,7 +28,7 @@ function getLayerTooltipConfig(layerExecution, layerData, adapterContext, toolti
27
28
  *
28
29
  * @internal
29
30
  */
30
- export function useLayerTooltips({ map, isMapReady, tooltip, drillablePredicates, layerExecutions, layers, adapterContext, }) {
31
+ export function useLayerTooltips({ map, isMapReady, tooltip, drillablePredicates, layerExecutions, layers, adapterContext, tooltipLookups, }) {
31
32
  const currentTooltipConfigRef = useRef(null);
32
33
  const tooltipConfigs = useMemo(() => {
33
34
  if (!tooltip) {
@@ -39,13 +40,13 @@ export function useLayerTooltips({ map, isMapReady, tooltip, drillablePredicates
39
40
  if (!layerData) {
40
41
  continue;
41
42
  }
42
- const config = getLayerTooltipConfig(layerExecution, layerData, adapterContext, tooltip, drillablePredicates);
43
+ const config = getLayerTooltipConfig(layerExecution, layerData, adapterContext, tooltip, drillablePredicates, tooltipLookups.get(layerExecution.layerId));
43
44
  if (config) {
44
45
  configs.push(config);
45
46
  }
46
47
  }
47
48
  return configs;
48
- }, [layerExecutions, layers, adapterContext, tooltip, drillablePredicates]);
49
+ }, [layerExecutions, layers, adapterContext, tooltip, drillablePredicates, tooltipLookups]);
49
50
  const layerIdToConfig = useMemo(() => {
50
51
  const lookup = new Map();
51
52
  for (const config of tooltipConfigs) {
@@ -0,0 +1,31 @@
1
+ import { type IntlShape } from "react-intl";
2
+ import { type IAnalyticalBackend } from "@gooddata/sdk-backend-spi";
3
+ import { type IExecutionConfig } from "@gooddata/sdk-model";
4
+ import { type DataViewFacade } from "@gooddata/sdk-ui";
5
+ import { type IGeoLayerTooltipLookup } from "../../layers/common/customTooltipExecution.js";
6
+ import { type IGeoChartConfig } from "../../types/config/unified.js";
7
+ import { type ILayerExecutionRecord } from "../../types/props/geoChart/internal.js";
8
+ /**
9
+ * @internal
10
+ */
11
+ export interface IGeoTooltipDataResult {
12
+ tooltipLookups: Map<string, IGeoLayerTooltipLookup>;
13
+ }
14
+ interface IUseLayersTooltipDataParams {
15
+ layerExecutions: ILayerExecutionRecord[];
16
+ /**
17
+ * DataViews per layer from `useLayersData`. Source of the PREPARED execution
18
+ * definition — pushpin's `prepareExecution` adds the TOOLTIP_TEXT bucket that
19
+ * the unprepared `record.execution.definition` lacks, and the tooltip plan
20
+ * keys its slicing attributes off that bucket. Empty when data hasn't loaded
21
+ * yet, in which case the plan is empty too.
22
+ */
23
+ layerDataViews: Map<string, DataViewFacade>;
24
+ backend: IAnalyticalBackend;
25
+ workspace: string;
26
+ config?: IGeoChartConfig;
27
+ execConfig?: IExecutionConfig;
28
+ intl: IntlShape;
29
+ }
30
+ export declare function useLayersTooltipData(params: IUseLayersTooltipDataParams): IGeoTooltipDataResult;
31
+ export {};
@@ -0,0 +1,90 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { useMemo } from "react";
3
+ import { defineMessages } from "react-intl";
4
+ import { useTooltipLookupExecutions } from "@gooddata/sdk-ui-vis-commons";
5
+ import { getLayerAdapter } from "../../layers/registry/adapterRegistry.js";
6
+ const customTooltipMessages = defineMessages({
7
+ noData: { id: "richText.no_data" },
8
+ multipleItems: { id: "richText.multiple_data" },
9
+ });
10
+ const EMPTY_RESULT = { tooltipLookups: new Map() };
11
+ function planTooltipExecutions(layerExecutions, layerDataViews, backend, workspace, config, execConfig, intl) {
12
+ const planned = [];
13
+ for (const record of layerExecutions) {
14
+ const adapter = getLayerAdapter(record.layer.type);
15
+ if (!adapter.buildTooltipExecution) {
16
+ continue;
17
+ }
18
+ // The unprepared `record.execution.definition` can be missing buckets
19
+ // (e.g. pushpin's TOOLTIP_TEXT, added by `prepareExecution`). The
20
+ // dataView's definition reflects the prepared one — wait for it.
21
+ const dataView = layerDataViews.get(record.layerId);
22
+ if (!dataView) {
23
+ continue;
24
+ }
25
+ const mainDefinition = dataView.definition;
26
+ const context = {
27
+ backend,
28
+ workspace,
29
+ config,
30
+ execConfig,
31
+ intl,
32
+ };
33
+ let built;
34
+ try {
35
+ built = adapter.buildTooltipExecution(record.layer, context, mainDefinition);
36
+ }
37
+ catch {
38
+ continue;
39
+ }
40
+ if (!built) {
41
+ continue;
42
+ }
43
+ planned.push({
44
+ key: record.layerId,
45
+ execution: built.execution,
46
+ meta: built.meta,
47
+ context: built.buildFeatureKey,
48
+ });
49
+ }
50
+ return planned;
51
+ }
52
+ export function useLayersTooltipData(params) {
53
+ const { layerExecutions, layerDataViews, backend, workspace, config, execConfig, intl } = params;
54
+ const isExportMode = config?.isExportMode ?? false;
55
+ const customTooltip = config?.customTooltip;
56
+ const tooltipContent = customTooltip?.content ?? "";
57
+ const tooltipEnabled = !isExportMode && Boolean(customTooltip?.enabled) && Boolean(tooltipContent);
58
+ // Content arrives already debounced from the AD editor.
59
+ // `config` / `execConfig` are excluded from deps: any change that affects
60
+ // the tooltip execution is already baked into `record.execution` upstream.
61
+ // `intl` is read inside the planning function for forward-compat with future adapters.
62
+ const planned = useMemo(() => {
63
+ if (!tooltipEnabled || layerExecutions.length === 0) {
64
+ return [];
65
+ }
66
+ return planTooltipExecutions(layerExecutions, layerDataViews, backend, workspace, config, execConfig, intl);
67
+ // eslint-disable-next-line react-hooks/exhaustive-deps
68
+ }, [tooltipEnabled, layerExecutions, layerDataViews, backend, workspace, tooltipContent]);
69
+ const separators = config?.separators;
70
+ const localizedStrings = useMemo(() => ({
71
+ noData: `(${intl.formatMessage(customTooltipMessages.noData)})`,
72
+ multipleItems: `(${intl.formatMessage(customTooltipMessages.multipleItems)})`,
73
+ }), [intl]);
74
+ const lookupResults = useTooltipLookupExecutions(planned, separators, localizedStrings);
75
+ // Lookup-table construction is downstream of the cancelable promise so a
76
+ // separators-only change rebuilds the cached strings without a backend call.
77
+ // No stale-guard needed here: `useTooltipLookupExecutions` clears its result
78
+ // when the planned set changes, so a planned-set switch surfaces as
79
+ // `EMPTY_RESULT` until the new executions land.
80
+ return useMemo(() => {
81
+ if (lookupResults.size === 0) {
82
+ return EMPTY_RESULT;
83
+ }
84
+ const map = new Map();
85
+ for (const [layerId, entry] of lookupResults) {
86
+ map.set(layerId, { lookup: entry.lookup, buildFeatureKey: entry.context });
87
+ }
88
+ return { tooltipLookups: map };
89
+ }, [lookupResults]);
90
+ }
@@ -27,7 +27,7 @@ import { useUpdateLayersOnMap } from "./useUpdateLayersOnMap.js";
27
27
  */
28
28
  export function useSyncLayersToMap({ drillablePredicates, onDrill }) {
29
29
  const { map, isMapReady, tooltip, adapterContext } = useMapRuntime();
30
- const { layers, layerExecutions } = useGeoLayers();
30
+ const { layers, layerExecutions, tooltipLookups } = useGeoLayers();
31
31
  const { hiddenLayers, enabledItemsByLayer } = useGeoLegend();
32
32
  // Key capturing adapter-declared config changes that require a full re-sync.
33
33
  // Keeps this hook generic (no layer-specific config knowledge).
@@ -86,6 +86,7 @@ export function useSyncLayersToMap({ drillablePredicates, onDrill }) {
86
86
  layerExecutions: visibleLayerExecutions,
87
87
  layers,
88
88
  adapterContext,
89
+ tooltipLookups,
89
90
  });
90
91
  useLayerClickEvent(map, isMapReady, layers, drillablePredicates, onDrill);
91
92
  }
@@ -1,11 +1,13 @@
1
1
  // (C) 2025-2026 GoodData Corporation
2
- import { attributeDisplayFormRef, isIdentifierRef, isUriRef, newBucket, } from "@gooddata/sdk-model";
2
+ import { attributeDisplayFormRef, newBucket, } from "@gooddata/sdk-model";
3
3
  import { BucketNames } from "@gooddata/sdk-ui";
4
+ import { buildKeySegment, buildTooltipExecution } from "@gooddata/sdk-ui-vis-commons";
4
5
  import { bboxToViewport } from "../../map/viewport/viewportCalculation.js";
5
6
  import { getLocationCollectionMetadata } from "../../utils/geoCollection.js";
6
7
  import { getGeoHeaderStrings } from "../../utils/geoHeaders.js";
7
8
  import { getHeaderPredicateFingerprint } from "../../utils/predicateFingerprint.js";
8
9
  import { computeLegend } from "../common/computeLegend.js";
10
+ import { getAttributeIdRefIdentifier, getAttributeLocalIdsFromBuckets, getAttributeRefId, } from "../common/customTooltipExecution.js";
9
11
  import { getGeoChartDimensions } from "../common/dimensions.js";
10
12
  import { canSetGeoJsonSourceData, trySetGeoJsonSourceData } from "../common/layerOps.js";
11
13
  import { buildTooltipReferenceMaps } from "../common/tooltipReferenceMaps.js";
@@ -21,19 +23,6 @@ import { createAreaTooltipConfig } from "./tooltip/tooltipManagement.js";
21
23
  const COLLECTION_OVERRIDES = {
22
24
  region: { collectionId: "regions" },
23
25
  };
24
- function getDisplayFormId(attribute) {
25
- if (!attribute) {
26
- return undefined;
27
- }
28
- const ref = attributeDisplayFormRef(attribute);
29
- if (isIdentifierRef(ref)) {
30
- return ref.identifier;
31
- }
32
- if (isUriRef(ref)) {
33
- return ref.uri;
34
- }
35
- return undefined;
36
- }
37
26
  function normalizeCollectionId(collectionId) {
38
27
  return COLLECTION_OVERRIDES[collectionId]?.collectionId ?? collectionId;
39
28
  }
@@ -87,11 +76,52 @@ async function fetchAreaFeatures(dataView, areaAttribute, metadata) {
87
76
  });
88
77
  return result?.features ?? [];
89
78
  }
79
+ function buildAreaTooltipExecution(layer, context, mainDefinition) {
80
+ const customTooltip = context.config?.customTooltip;
81
+ if (!customTooltip?.enabled || !customTooltip.content) {
82
+ return null;
83
+ }
84
+ // idRef-only: `buildLookupTable` keys rows by the result descriptor's
85
+ // identifier. A uriRef-backed display form would produce a hover key the
86
+ // lookup can't match — skip the whole tooltip execution rather than fetch
87
+ // values that won't resolve at hover time.
88
+ const areaAttrId = getAttributeIdRefIdentifier(layer.area);
89
+ if (!areaAttrId) {
90
+ return null;
91
+ }
92
+ // Slice by AREA only — features are deduplicated by areaUri, so a tooltip
93
+ // execution sliced by AREA + SEGMENT would expand rows past one-per-feature.
94
+ const slicingAttributeLocalIds = getAttributeLocalIdsFromBuckets(mainDefinition, [BucketNames.AREA]);
95
+ if (slicingAttributeLocalIds.length === 0) {
96
+ return null;
97
+ }
98
+ const factory = context.executionFactory ?? context.backend.workspace(context.workspace).execution();
99
+ const built = buildTooltipExecution(factory, mainDefinition, customTooltip.content, {
100
+ slicingAttributeLocalIds,
101
+ });
102
+ if (!built) {
103
+ return null;
104
+ }
105
+ const buildFeatureKey = (properties) => {
106
+ if (!properties) {
107
+ return null;
108
+ }
109
+ const areaUri = typeof properties["areaUri"] === "string" ? properties["areaUri"] : "";
110
+ if (!areaUri) {
111
+ return null;
112
+ }
113
+ return buildKeySegment(areaAttrId, areaUri);
114
+ };
115
+ return { ...built, buildFeatureKey };
116
+ }
90
117
  export const areaAdapter = {
91
118
  type: "area",
92
119
  buildExecution(layer, context) {
93
120
  return createExecution(layer, context);
94
121
  },
122
+ buildTooltipExecution(layer, context, mainDefinition) {
123
+ return buildAreaTooltipExecution(layer, context, mainDefinition);
124
+ },
95
125
  async prepareExecution(layer, context, execution) {
96
126
  const needsTooltip = !execution.definition.buckets.some((b) => b.localIdentifier === BucketNames.TOOLTIP_TEXT);
97
127
  const displayFormRef = layer.area ? attributeDisplayFormRef(layer.area) : undefined;
@@ -128,8 +158,8 @@ export const areaAdapter = {
128
158
  config: areaConfig,
129
159
  features: boundaryFeatures,
130
160
  tooltipAttrIds: {
131
- locationName: getDisplayFormId(layer.area),
132
- segment: getDisplayFormId(layer.segmentBy),
161
+ locationName: getAttributeRefId(layer.area),
162
+ segment: getAttributeRefId(layer.segmentBy),
133
163
  },
134
164
  });
135
165
  const legend = computeLegend(geoData, colorStrategy, {
@@ -198,14 +228,14 @@ export const areaAdapter = {
198
228
  removeFromMap(layer, map) {
199
229
  removeAreaLayer(map, layer.id);
200
230
  },
201
- getTooltipConfig(layer, output, context, { tooltip, drillablePredicates }) {
231
+ getTooltipConfig(layer, output, context, { tooltip, drillablePredicates, tooltipLookup }) {
202
232
  if (!tooltip || !context.intl) {
203
233
  return undefined;
204
234
  }
205
235
  const config = context.config ?? {};
206
236
  const ids = getAreaLayerIds(layer.id);
207
237
  const layerIds = [ids.fillLayerId, ids.outlineLayerId];
208
- return createAreaTooltipConfig(tooltip, config, drillablePredicates, context.intl, layerIds, output.tooltipReferenceMaps);
238
+ return createAreaTooltipConfig(tooltip, config, drillablePredicates, context.intl, layerIds, output.tooltipReferenceMaps, tooltipLookup);
209
239
  },
210
240
  getMapLibreLayerIds(layer) {
211
241
  const ids = getAreaLayerIds(layer.id);
@@ -1,6 +1,7 @@
1
1
  import { type IntlShape } from "react-intl";
2
2
  import { type IHeaderPredicate } from "@gooddata/sdk-ui";
3
3
  import { type IGeoAreaChartConfig } from "../../../types/config/areaChart.js";
4
+ import { type IGeoLayerTooltipLookup } from "../../common/customTooltipExecution.js";
4
5
  import type { IPopupFacade } from "../../common/mapFacade.js";
5
6
  import type { IGeoTooltipConfig, ITooltipReferenceMaps } from "../../registry/adapterTypes.js";
6
7
  /**
@@ -17,4 +18,4 @@ import type { IGeoTooltipConfig, ITooltipReferenceMaps } from "../../registry/ad
17
18
  *
18
19
  * @internal
19
20
  */
20
- export declare function createAreaTooltipConfig(tooltip: IPopupFacade, config: IGeoAreaChartConfig, _drillableItems: IHeaderPredicate[] | undefined, intl: IntlShape, layerIds: string[], referenceMaps?: ITooltipReferenceMaps): IGeoTooltipConfig;
21
+ export declare function createAreaTooltipConfig(tooltip: IPopupFacade, config: IGeoAreaChartConfig, _drillableItems: IHeaderPredicate[] | undefined, intl: IntlShape, layerIds: string[], referenceMaps?: ITooltipReferenceMaps, tooltipLookup?: IGeoLayerTooltipLookup): IGeoTooltipConfig;
@@ -13,15 +13,16 @@ const tooltipFormatConfig = {
13
13
  emptyValue: "-",
14
14
  escape: escapeHtml,
15
15
  };
16
- function buildAreaTooltipHtml(rawProperties, locationName, color, segment, strokeColor, separators, customConfig, referenceMaps, intl) {
16
+ function buildAreaTooltipHtml(rawProperties, locationName, color, segment, strokeColor, separators, customConfig, referenceMaps, intl, tooltipLookup) {
17
17
  const attributeItems = dedupeAttributePayloadsByAttrId([locationName, segment])
18
18
  .map((payload) => formatAttributeHtml(payload, tooltipFormatConfig))
19
19
  .filter((item) => item !== null);
20
20
  const measureItem = formatMeasureHtml(color, separators, tooltipFormatConfig);
21
21
  const items = [...attributeItems, ...(measureItem ? [measureItem] : [])];
22
22
  const defaultItemsHtml = items.join("");
23
- const fallbackText = `(${intl.formatMessage({ id: "richText.no_data" })})`;
24
- const customPieces = buildCustomTooltipPieces(rawProperties, customConfig, referenceMaps, separators, fallbackText);
23
+ const fallbackText = `(${intl.formatMessage({ id: "richText.no_fetch" })})`;
24
+ const noDataLabel = `(${intl.formatMessage({ id: "richText.no_data" })})`;
25
+ const customPieces = buildCustomTooltipPieces(rawProperties, customConfig, referenceMaps, separators, fallbackText, noDataLabel, tooltipLookup);
25
26
  // Suppress the tooltip entirely only when there's nothing to show in
26
27
  // either the default or the custom section.
27
28
  if (items.length === 0 && !customPieces.sectionHtml) {
@@ -49,7 +50,7 @@ function buildAreaTooltipHtml(rawProperties, locationName, color, segment, strok
49
50
  *
50
51
  * @internal
51
52
  */
52
- export function createAreaTooltipConfig(tooltip, config, _drillableItems, intl, layerIds, referenceMaps) {
53
+ export function createAreaTooltipConfig(tooltip, config, _drillableItems, intl, layerIds, referenceMaps, tooltipLookup) {
53
54
  const { separators } = config;
54
55
  return {
55
56
  layerIds,
@@ -62,7 +63,7 @@ export function createAreaTooltipConfig(tooltip, config, _drillableItems, intl,
62
63
  // Build tooltip HTML
63
64
  const fallbackStroke = properties["color_fill"];
64
65
  const tooltipStroke = color?.fill ?? (typeof fallbackStroke === "string" ? fallbackStroke : "#20B2E2");
65
- const tooltipHtml = buildAreaTooltipHtml(feature.properties, locationName, color, segment, tooltipStroke, separators, config.customTooltip, referenceMaps, intl);
66
+ const tooltipHtml = buildAreaTooltipHtml(feature.properties, locationName, color, segment, tooltipStroke, separators, config.customTooltip, referenceMaps, intl, tooltipLookup);
66
67
  if (tooltipHtml) {
67
68
  tooltip
68
69
  .setLngLat([lngLat.lng, lngLat.lat])
@@ -0,0 +1,64 @@
1
+ import { type IAttribute, type IExecutionDefinition } from "@gooddata/sdk-model";
2
+ import { type IResolvedReferenceValues, type ITooltipExecutionBundle } from "@gooddata/sdk-ui-vis-commons";
3
+ import { type JsonValue } from "../../utils/guards.js";
4
+ /**
5
+ * Returns the lookup key for a hovered feature in the same format
6
+ * `buildLookupTable` produces — or `null` if the feature lacks the data
7
+ * needed to build a stable key.
8
+ *
9
+ * @internal
10
+ */
11
+ export type BuildFeatureKey = (properties: GeoJSON.GeoJsonProperties) => string | null;
12
+ /**
13
+ * @internal
14
+ */
15
+ export interface IGeoLayerCustomTooltipExecution extends ITooltipExecutionBundle {
16
+ buildFeatureKey: BuildFeatureKey;
17
+ }
18
+ /**
19
+ * Lives here (not in the hook file) to break a circular import with
20
+ * `adapterTypes.ts`.
21
+ *
22
+ * @internal
23
+ */
24
+ export interface IGeoLayerTooltipLookup {
25
+ lookup: Map<string, IResolvedReferenceValues>;
26
+ buildFeatureKey: BuildFeatureKey;
27
+ }
28
+ /**
29
+ * Returned localIdentifiers follow `bucketNames` order — both the row dim and
30
+ * the hover-time key segment order rely on it.
31
+ *
32
+ * @internal
33
+ */
34
+ export declare function getAttributeLocalIdsFromBuckets(definition: IExecutionDefinition, bucketNames: readonly string[]): string[];
35
+ /**
36
+ * Narrow a tooltip attribute payload (e.g. `feature.properties.locationName`)
37
+ * to its identifying fields. `attrId === undefined` signals "no stable key for
38
+ * this feature" — callers compare against the expected layer attribute id.
39
+ *
40
+ * Reuses `parseTooltipPayload` so the JSON-string-or-object handling stays in
41
+ * one place (MapLibre stringifies complex GeoJSON property values when they
42
+ * round-trip through `queryRenderedFeatures`).
43
+ *
44
+ * @internal
45
+ */
46
+ export declare function readAttrIdentity(payload: JsonValue | undefined): {
47
+ attrId?: string;
48
+ uri: string;
49
+ };
50
+ /**
51
+ * URI refs return `undefined` — the tooltip-execution backend path can't
52
+ * resolve uriRef display forms, so the caller must skip that layer.
53
+ * For payload bookkeeping that accepts either ref kind, use {@link getAttributeRefId}.
54
+ *
55
+ * @internal
56
+ */
57
+ export declare function getAttributeIdRefIdentifier(attribute: IAttribute | undefined): string | undefined;
58
+ /**
59
+ * Returns identifier for idRef, uri for uriRef — a stable key for feature
60
+ * payloads whichever ref kind the layer uses.
61
+ *
62
+ * @internal
63
+ */
64
+ export declare function getAttributeRefId(attribute: IAttribute | undefined): string | undefined;
@@ -0,0 +1,82 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { attributeDisplayFormRef, isAttribute, isIdentifierRef, isUriRef, } from "@gooddata/sdk-model";
3
+ import { parseTooltipPayload } from "./tooltipUtils.js";
4
+ /**
5
+ * Returned localIdentifiers follow `bucketNames` order — both the row dim and
6
+ * the hover-time key segment order rely on it.
7
+ *
8
+ * @internal
9
+ */
10
+ export function getAttributeLocalIdsFromBuckets(definition, bucketNames) {
11
+ const localIds = [];
12
+ for (const bucketName of bucketNames) {
13
+ const bucket = definition.buckets.find((b) => b.localIdentifier === bucketName);
14
+ if (!bucket) {
15
+ continue;
16
+ }
17
+ for (const item of bucket.items) {
18
+ if (isAttribute(item)) {
19
+ localIds.push(item.attribute.localIdentifier);
20
+ }
21
+ }
22
+ }
23
+ return localIds;
24
+ }
25
+ /**
26
+ * Narrow a tooltip attribute payload (e.g. `feature.properties.locationName`)
27
+ * to its identifying fields. `attrId === undefined` signals "no stable key for
28
+ * this feature" — callers compare against the expected layer attribute id.
29
+ *
30
+ * Reuses `parseTooltipPayload` so the JSON-string-or-object handling stays in
31
+ * one place (MapLibre stringifies complex GeoJSON property values when they
32
+ * round-trip through `queryRenderedFeatures`).
33
+ *
34
+ * @internal
35
+ */
36
+ export function readAttrIdentity(payload) {
37
+ // Pushpin call sites read from GeoJsonProperties (e.g. `properties["locationName"]`),
38
+ // where a missing key yields `undefined` at runtime. The `any` type from
39
+ // @types/geojson hides that from TS, but we want the function to short-circuit
40
+ // safely rather than crash inside parseTooltipPayload.
41
+ if (payload === undefined) {
42
+ return { uri: "" };
43
+ }
44
+ const parsed = parseTooltipPayload(payload);
45
+ return { attrId: parsed?.attrId, uri: parsed?.uri ?? "" };
46
+ }
47
+ /**
48
+ * URI refs return `undefined` — the tooltip-execution backend path can't
49
+ * resolve uriRef display forms, so the caller must skip that layer.
50
+ * For payload bookkeeping that accepts either ref kind, use {@link getAttributeRefId}.
51
+ *
52
+ * @internal
53
+ */
54
+ export function getAttributeIdRefIdentifier(attribute) {
55
+ if (!attribute) {
56
+ return undefined;
57
+ }
58
+ const ref = attributeDisplayFormRef(attribute);
59
+ if (isIdentifierRef(ref)) {
60
+ return ref.identifier;
61
+ }
62
+ return undefined;
63
+ }
64
+ /**
65
+ * Returns identifier for idRef, uri for uriRef — a stable key for feature
66
+ * payloads whichever ref kind the layer uses.
67
+ *
68
+ * @internal
69
+ */
70
+ export function getAttributeRefId(attribute) {
71
+ if (!attribute) {
72
+ return undefined;
73
+ }
74
+ const ref = attributeDisplayFormRef(attribute);
75
+ if (isIdentifierRef(ref)) {
76
+ return ref.identifier;
77
+ }
78
+ if (isUriRef(ref)) {
79
+ return ref.uri;
80
+ }
81
+ return undefined;
82
+ }
@@ -1,6 +1,7 @@
1
1
  import { type ISeparators } from "@gooddata/sdk-model";
2
2
  import { type ICustomTooltipConfig } from "@gooddata/sdk-ui-vis-commons";
3
3
  import { type ITooltipReferenceMaps } from "../registry/adapterTypes.js";
4
+ import { type IGeoLayerTooltipLookup } from "./customTooltipExecution.js";
4
5
  interface ICustomTooltipPieces {
5
6
  /** Wrapped `<div class="gd-viz-tooltip-custom-section">…</div>` or "" if disabled/empty. */
6
7
  sectionHtml: string;
@@ -15,7 +16,7 @@ interface ICustomTooltipPieces {
15
16
  *
16
17
  * @internal
17
18
  */
18
- export declare function buildCustomTooltipPieces(properties: GeoJSON.GeoJsonProperties, customConfig: ICustomTooltipConfig | undefined, referenceMaps: ITooltipReferenceMaps | undefined, separators: ISeparators | undefined, fallbackText: string): ICustomTooltipPieces;
19
+ export declare function buildCustomTooltipPieces(properties: GeoJSON.GeoJsonProperties, customConfig: ICustomTooltipConfig | undefined, referenceMaps: ITooltipReferenceMaps | undefined, separators: ISeparators | undefined, fallbackText: string, noDataLabel: string, tooltipLookup?: IGeoLayerTooltipLookup): ICustomTooltipPieces;
19
20
  /**
20
21
  * Splice custom-tooltip pieces into the default tooltip body.
21
22
  *
@@ -1,5 +1,5 @@
1
1
  // (C) 2026 GoodData Corporation
2
- import { markdownToHtml, resolveReferences } from "@gooddata/sdk-ui-vis-commons";
2
+ import { composeCustomTooltipSectionHtml } from "@gooddata/sdk-ui-vis-commons";
3
3
  import { resolveReferencesFromGeoFeature } from "./resolveReferencesFromGeoFeature.js";
4
4
  /**
5
5
  * Build the custom-tooltip section + separator HTML pieces for a hovered feature.
@@ -9,14 +9,21 @@ import { resolveReferencesFromGeoFeature } from "./resolveReferencesFromGeoFeatu
9
9
  *
10
10
  * @internal
11
11
  */
12
- export function buildCustomTooltipPieces(properties, customConfig, referenceMaps, separators, fallbackText) {
12
+ export function buildCustomTooltipPieces(properties, customConfig, referenceMaps, separators, fallbackText, noDataLabel, tooltipLookup) {
13
13
  if (!customConfig?.enabled || !customConfig.content) {
14
14
  return { sectionHtml: "", separatorHtml: "" };
15
15
  }
16
- const values = resolveReferencesFromGeoFeature(properties, referenceMaps, separators);
17
- const resolvedContent = resolveReferences(customConfig.content, values, fallbackText);
18
- const html = markdownToHtml(resolvedContent);
19
- const sectionHtml = `<div class="gd-viz-tooltip-custom-section">${html}</div>`;
16
+ // In-chart values from the rendered feature's properties.
17
+ const pointLocal = resolveReferencesFromGeoFeature(properties, referenceMaps, separators, noDataLabel);
18
+ // External values from the precomputed lookup (refs not on the feature).
19
+ let externalValues = {};
20
+ if (tooltipLookup) {
21
+ const featureKey = tooltipLookup.buildFeatureKey(properties);
22
+ if (featureKey != null) {
23
+ externalValues = tooltipLookup.lookup.get(featureKey) ?? {};
24
+ }
25
+ }
26
+ const sectionHtml = composeCustomTooltipSectionHtml(customConfig.content, pointLocal, externalValues, fallbackText);
20
27
  // Replace mode shows only the custom section, so no separator is needed.
21
28
  const separatorHtml = customConfig.placement === "replace" ? "" : `<div class="gd-viz-tooltip-custom-separator"></div>`;
22
29
  return { sectionHtml, separatorHtml };
@@ -17,4 +17,4 @@ import { type ITooltipReferenceMaps } from "../registry/adapterTypes.js";
17
17
  *
18
18
  * @internal
19
19
  */
20
- export declare function resolveReferencesFromGeoFeature(properties: GeoJSON.GeoJsonProperties, referenceMaps: ITooltipReferenceMaps | undefined, separators: ISeparators | undefined): IResolvedReferenceValues;
20
+ export declare function resolveReferencesFromGeoFeature(properties: GeoJSON.GeoJsonProperties, referenceMaps: ITooltipReferenceMaps | undefined, separators: ISeparators | undefined, noDataLabel: string): IResolvedReferenceValues;
@@ -17,7 +17,7 @@ import { getTooltipProperties, parseTooltipPayload } from "./tooltipUtils.js";
17
17
  *
18
18
  * @internal
19
19
  */
20
- export function resolveReferencesFromGeoFeature(properties, referenceMaps, separators) {
20
+ export function resolveReferencesFromGeoFeature(properties, referenceMaps, separators, noDataLabel) {
21
21
  const values = {};
22
22
  if (!properties) {
23
23
  return values;
@@ -59,6 +59,10 @@ export function resolveReferencesFromGeoFeature(properties, referenceMaps, separ
59
59
  }
60
60
  const rawValue = payload.value;
61
61
  if (typeof rawValue !== "number" || !Number.isFinite(rawValue)) {
62
+ // Null / undefined / NaN on the rendered feature — emit the no-data
63
+ // sentinel so the custom section reads "(No data)" instead of falling
64
+ // through to the resolution-failure fallback text.
65
+ values[key] = noDataLabel;
62
66
  return;
63
67
  }
64
68
  // Use the raw formatted value without HTML escaping. The resolved
@@ -5,6 +5,12 @@ export type TooltipPayload = {
5
5
  value?: string | number;
6
6
  format?: string;
7
7
  attrId?: string;
8
+ /**
9
+ * Attribute element URI. By convention only set by attribute payload
10
+ * writers (locationName, segment, tooltipText). Used by the custom-tooltip
11
+ * execution path to build per-feature lookup keys.
12
+ */
13
+ uri?: string;
8
14
  fill?: string;
9
15
  /**
10
16
  * Bucket `localIdentifier` of the underlying measure. By convention only
@@ -30,6 +30,7 @@ export function parseTooltipPayload(item) {
30
30
  const value = typeof rawValue === "string" || typeof rawValue === "number" ? rawValue : undefined;
31
31
  const format = typeof parsed["format"] === "string" ? parsed["format"] : undefined;
32
32
  const attrId = typeof parsed["attrId"] === "string" ? parsed["attrId"] : undefined;
33
+ const uri = typeof parsed["uri"] === "string" ? parsed["uri"] : undefined;
33
34
  const fill = typeof parsed["fill"] === "string" ? parsed["fill"] : undefined;
34
35
  const localId = typeof parsed["localId"] === "string" ? parsed["localId"] : undefined;
35
36
  return {
@@ -37,6 +38,7 @@ export function parseTooltipPayload(item) {
37
38
  value,
38
39
  format,
39
40
  attrId,
41
+ uri,
40
42
  fill,
41
43
  localId,
42
44
  };
@@ -1,10 +1,12 @@
1
1
  // (C) 2025-2026 GoodData Corporation
2
- import { attributeDisplayFormRef, isIdentifierRef, isUriRef, newBucket, } from "@gooddata/sdk-model";
2
+ import { attributeDisplayFormRef, newBucket } from "@gooddata/sdk-model";
3
3
  import { BucketNames } from "@gooddata/sdk-ui";
4
+ import { buildKeySegment, buildTooltipExecution, joinKeySegments } from "@gooddata/sdk-ui-vis-commons";
4
5
  import { calculateViewport } from "../../map/viewport/viewportCalculation.js";
5
6
  import { getGeoHeaderStrings } from "../../utils/geoHeaders.js";
6
7
  import { getHeaderPredicateFingerprint } from "../../utils/predicateFingerprint.js";
7
8
  import { computeLegend } from "../common/computeLegend.js";
9
+ import { getAttributeIdRefIdentifier, getAttributeLocalIdsFromBuckets, getAttributeRefId, readAttrIdentity, } from "../common/customTooltipExecution.js";
8
10
  import { getGeoChartDimensions } from "../common/dimensions.js";
9
11
  import { canSetGeoJsonSourceData, trySetGeoJsonSourceData } from "../common/layerOps.js";
10
12
  import { buildTooltipReferenceMaps } from "../common/tooltipReferenceMaps.js";
@@ -14,6 +16,7 @@ import { prepareExecutionWithTooltipText } from "../execution/prepareTooltipExec
14
16
  import { resolveAttributeDisplayForms } from "../execution/resolveAttributeDisplayForms.js";
15
17
  import { isClusteringAllowed } from "./clustering/clustering.js";
16
18
  import { getPushpinColorStrategy } from "./coloring/colorStrategy.js";
19
+ import { EMPTY_SEGMENT_VALUE } from "./constants.js";
17
20
  import { transformPushpinData } from "./data/transformation.js";
18
21
  import { UNCLUSTER_FILTER } from "./layers.js";
19
22
  import { getPushpinLayerIds, removePushpinLayer, syncPushpinLayerToMap } from "./operations.js";
@@ -107,19 +110,6 @@ function computeInitialViewport(geoData) {
107
110
  const dataViewportConfig = { viewport: { area: "auto" } };
108
111
  return calculateViewport(validLocations, dataViewportConfig);
109
112
  }
110
- function getDisplayFormId(attribute) {
111
- if (!attribute) {
112
- return undefined;
113
- }
114
- const ref = attributeDisplayFormRef(attribute);
115
- if (isIdentifierRef(ref)) {
116
- return ref.identifier;
117
- }
118
- if (isUriRef(ref)) {
119
- return ref.uri;
120
- }
121
- return undefined;
122
- }
123
113
  function createPushpinConfig(context) {
124
114
  return {
125
115
  ...context.config,
@@ -128,8 +118,8 @@ function createPushpinConfig(context) {
128
118
  }
129
119
  function createPushpinTooltipAttrIds(layer) {
130
120
  return {
131
- locationName: getDisplayFormId(layer.tooltipText),
132
- segment: getDisplayFormId(layer.segmentBy),
121
+ locationName: getAttributeRefId(layer.tooltipText),
122
+ segment: getAttributeRefId(layer.segmentBy),
133
123
  };
134
124
  }
135
125
  function createPushpinSource(layer, geoData, colorStrategy, context) {
@@ -190,11 +180,70 @@ function createExecution(layer, context) {
190
180
  }
191
181
  return execution;
192
182
  }
183
+ function buildPushpinTooltipExecution(layer, context, mainDefinition) {
184
+ const customTooltip = context.config?.customTooltip;
185
+ if (!customTooltip?.enabled || !customTooltip.content) {
186
+ return null;
187
+ }
188
+ // Pushpin keys features by tooltipText; without it the feature has no
189
+ // stable display-form id to reconcile a tooltip row to.
190
+ if (!layer.tooltipText) {
191
+ return null;
192
+ }
193
+ const tooltipAttrId = getAttributeIdRefIdentifier(layer.tooltipText);
194
+ if (!tooltipAttrId) {
195
+ return null;
196
+ }
197
+ const segmentAttrId = layer.segmentBy ? getAttributeIdRefIdentifier(layer.segmentBy) : undefined;
198
+ const desiredBuckets = [BucketNames.TOOLTIP_TEXT];
199
+ // URI-backed segments are absent from buildFeatureKey; skip them from slicing too or keys won't match.
200
+ if (segmentAttrId) {
201
+ desiredBuckets.push(BucketNames.SEGMENT);
202
+ }
203
+ const slicingAttributeLocalIds = getAttributeLocalIdsFromBuckets(mainDefinition, desiredBuckets);
204
+ if (slicingAttributeLocalIds.length === 0) {
205
+ return null;
206
+ }
207
+ const factory = context.executionFactory ?? context.backend.workspace(context.workspace).execution();
208
+ const built = buildTooltipExecution(factory, mainDefinition, customTooltip.content, {
209
+ slicingAttributeLocalIds,
210
+ });
211
+ if (!built) {
212
+ return null;
213
+ }
214
+ const buildFeatureKey = (properties) => {
215
+ if (!properties) {
216
+ return null;
217
+ }
218
+ const locationName = readAttrIdentity(properties["locationName"]);
219
+ if (locationName.attrId !== tooltipAttrId) {
220
+ return null;
221
+ }
222
+ const parts = [buildKeySegment(locationName.attrId, locationName.uri)];
223
+ if (segmentAttrId) {
224
+ const segment = readAttrIdentity(properties["segment"]);
225
+ if (segment.attrId !== segmentAttrId) {
226
+ return null;
227
+ }
228
+ // Pushpin payload writer substitutes EMPTY_SEGMENT_VALUE for null
229
+ // segment URIs (needed for MapLibre `in` filtering). The tooltip
230
+ // execution result preserves the original null/empty URI, so
231
+ // normalize back here or the key never matches.
232
+ const segmentUri = segment.uri === EMPTY_SEGMENT_VALUE ? "" : segment.uri;
233
+ parts.push(buildKeySegment(segment.attrId, segmentUri));
234
+ }
235
+ return joinKeySegments(parts);
236
+ };
237
+ return { ...built, buildFeatureKey };
238
+ }
193
239
  export const pushpinAdapter = {
194
240
  type: "pushpin",
195
241
  buildExecution(layer, context) {
196
242
  return createExecution(layer, context);
197
243
  },
244
+ buildTooltipExecution(layer, context, mainDefinition) {
245
+ return buildPushpinTooltipExecution(layer, context, mainDefinition);
246
+ },
198
247
  async prepareExecution(layer, context, execution) {
199
248
  // Resolve tooltip and geoIcon display forms in a single backend call.
200
249
  // Skip the metadata lookup entirely when both derived buckets already exist.
@@ -293,7 +342,7 @@ export const pushpinAdapter = {
293
342
  removeFromMap(layer, map) {
294
343
  removePushpinLayer(map, layer.id);
295
344
  },
296
- getTooltipConfig(layer, output, context, { tooltip, drillablePredicates }) {
345
+ getTooltipConfig(layer, output, context, { tooltip, drillablePredicates, tooltipLookup }) {
297
346
  if (!tooltip || !context.intl) {
298
347
  return undefined;
299
348
  }
@@ -303,7 +352,7 @@ export const pushpinAdapter = {
303
352
  if (layerIds.length === 0) {
304
353
  return undefined;
305
354
  }
306
- return createPushpinTooltipConfig(tooltip, config, drillablePredicates, context.intl, layerIds, output.tooltipReferenceMaps);
355
+ return createPushpinTooltipConfig(tooltip, config, drillablePredicates, context.intl, layerIds, output.tooltipReferenceMaps, tooltipLookup);
307
356
  },
308
357
  getMapLibreLayerIds(layer) {
309
358
  const ids = getPushpinLayerIds(layer.id);
@@ -3,6 +3,7 @@ import { type ISeparators } from "@gooddata/sdk-model";
3
3
  import { type IHeaderPredicate } from "@gooddata/sdk-ui";
4
4
  import { type ICustomTooltipConfig } from "@gooddata/sdk-ui-vis-commons";
5
5
  import { type IGeoPushpinChartConfig } from "../../../types/config/pushpinChart.js";
6
+ import { type IGeoLayerTooltipLookup } from "../../common/customTooltipExecution.js";
6
7
  import { type IPopupFacade } from "../../common/mapFacade.js";
7
8
  import type { IGeoTooltipConfig, ITooltipReferenceMaps } from "../../registry/adapterTypes.js";
8
9
  export declare const TOOLTIP_MAX_WIDTH = 320;
@@ -37,7 +38,7 @@ export declare function shouldShowTooltip(geoProperties: GeoJSON.GeoJsonProperti
37
38
  *
38
39
  * @internal
39
40
  */
40
- export declare function getTooltipHtml(geoProperties: GeoJSON.GeoJsonProperties, tooltipStroke: string, maxWidth: number, separators: ISeparators | undefined, drillableItems: IHeaderPredicate[] | undefined, intl: IntlShape, showStroke?: boolean, customConfig?: ICustomTooltipConfig, referenceMaps?: ITooltipReferenceMaps): string;
41
+ export declare function getTooltipHtml(geoProperties: GeoJSON.GeoJsonProperties, tooltipStroke: string, maxWidth: number, separators: ISeparators | undefined, drillableItems: IHeaderPredicate[] | undefined, intl: IntlShape, showStroke?: boolean, customConfig?: ICustomTooltipConfig, referenceMaps?: ITooltipReferenceMaps, tooltipLookup?: IGeoLayerTooltipLookup): string;
41
42
  /**
42
43
  * Creates tooltip configuration for the unified tooltip handler.
43
44
  *
@@ -50,4 +51,4 @@ export declare function getTooltipHtml(geoProperties: GeoJSON.GeoJsonProperties,
50
51
  *
51
52
  * @internal
52
53
  */
53
- export declare function createPushpinTooltipConfig(tooltip: IPopupFacade, config: IGeoPushpinChartConfig, drillableItems: IHeaderPredicate[] | undefined, intl: IntlShape, layerIds: string[], referenceMaps?: ITooltipReferenceMaps): IGeoTooltipConfig;
54
+ export declare function createPushpinTooltipConfig(tooltip: IPopupFacade, config: IGeoPushpinChartConfig, drillableItems: IHeaderPredicate[] | undefined, intl: IntlShape, layerIds: string[], referenceMaps?: ITooltipReferenceMaps, tooltipLookup?: IGeoLayerTooltipLookup): IGeoTooltipConfig;
@@ -99,7 +99,7 @@ function getInteractionMessage(drillableItems, intl) {
99
99
  *
100
100
  * @internal
101
101
  */
102
- export function getTooltipHtml(geoProperties, tooltipStroke, maxWidth, separators, drillableItems, intl, showStroke = true, customConfig, referenceMaps) {
102
+ export function getTooltipHtml(geoProperties, tooltipStroke, maxWidth, separators, drillableItems, intl, showStroke = true, customConfig, referenceMaps, tooltipLookup) {
103
103
  const interactionMessage = getInteractionMessage(drillableItems, intl);
104
104
  const properties = getTooltipProperties(geoProperties);
105
105
  const locationPayload = parseTooltipPayload(properties["locationName"]);
@@ -124,8 +124,9 @@ export function getTooltipHtml(geoProperties, tooltipStroke, maxWidth, separator
124
124
  ]
125
125
  .filter((item) => item !== null)
126
126
  .join("");
127
- const fallbackText = `(${intl.formatMessage({ id: "richText.no_data" })})`;
128
- const customPieces = buildCustomTooltipPieces(geoProperties, customConfig, referenceMaps, separators, fallbackText);
127
+ const fallbackText = `(${intl.formatMessage({ id: "richText.no_fetch" })})`;
128
+ const noDataLabel = `(${intl.formatMessage({ id: "richText.no_data" })})`;
129
+ const customPieces = buildCustomTooltipPieces(geoProperties, customConfig, referenceMaps, separators, fallbackText, noDataLabel, tooltipLookup);
129
130
  const itemsBody = composeTooltipBody(tooltipItems, customPieces, customConfig?.placement);
130
131
  const strokeHtml = showStroke
131
132
  ? `<span class="gd-viz-tooltip-stroke" style="border-top-color: ${tooltipStroke}"></span>`
@@ -156,7 +157,7 @@ function resolveTooltipCoordinatesFromGeometry(geometry) {
156
157
  *
157
158
  * @internal
158
159
  */
159
- export function createPushpinTooltipConfig(tooltip, config, drillableItems, intl, layerIds, referenceMaps) {
160
+ export function createPushpinTooltipConfig(tooltip, config, drillableItems, intl, layerIds, referenceMaps, tooltipLookup) {
160
161
  const { separators } = config;
161
162
  return {
162
163
  layerIds,
@@ -185,7 +186,7 @@ export function createPushpinTooltipConfig(tooltip, config, drillableItems, intl
185
186
  const maxTooltipContentWidth = getTooltipContentWidth(isFullScreenTooltip, chartWidth, TOOLTIP_MAX_WIDTH);
186
187
  const shapeType = config.points?.shapeType ?? "circle";
187
188
  const isIconShape = shapeType === "iconByValue" || shapeType === "oneIcon";
188
- const tooltipHtml = getTooltipHtml(parsedProps, tooltipStroke, maxTooltipContentWidth, separators, drillableItems, intl, !isIconShape, config.customTooltip, referenceMaps);
189
+ const tooltipHtml = getTooltipHtml(parsedProps, tooltipStroke, maxTooltipContentWidth, separators, drillableItems, intl, !isIconShape, config.customTooltip, referenceMaps, tooltipLookup);
189
190
  tooltip
190
191
  .setLngLat(coordinates)
191
192
  .setHTML(tooltipHtml)
@@ -1,6 +1,6 @@
1
1
  import type { IntlShape } from "react-intl";
2
2
  import type { IAnalyticalBackend, IExecutionFactory, IPreparedExecution } from "@gooddata/sdk-backend-spi";
3
- import type { IColorPalette, IExecutionConfig, INullableFilter } from "@gooddata/sdk-model";
3
+ import type { IColorPalette, IExecutionConfig, IExecutionDefinition, INullableFilter } from "@gooddata/sdk-model";
4
4
  import type { DataViewFacade, IHeaderPredicate } from "@gooddata/sdk-ui";
5
5
  import type { IColorMapping, IColorStrategy } from "@gooddata/sdk-ui-vis-commons";
6
6
  import type { IAvailableLegends, IGeoLegendItem } from "../../types/common/legends.js";
@@ -9,6 +9,7 @@ import type { IAreaGeoData } from "../../types/geoData/area.js";
9
9
  import type { IPushpinGeoData } from "../../types/geoData/pushpin.js";
10
10
  import type { GeoLayerType, IGeoLayer, IGeoLayerArea, IGeoLayerPushpin } from "../../types/layers/index.js";
11
11
  import type { IMapViewport } from "../../types/map/provider.js";
12
+ import type { IGeoLayerCustomTooltipExecution, IGeoLayerTooltipLookup } from "../common/customTooltipExecution.js";
12
13
  import type { FilterSpecification, GeoJSONSourceSpecification, IMapFacade, IPopupFacade } from "../common/mapFacade.js";
13
14
  /**
14
15
  * Context provided to adapter methods.
@@ -221,6 +222,7 @@ export type IGeoLayerAdapterByType<TType extends GeoLayerType> = IGeoLayerAdapte
221
222
  export interface IGeoLayerTooltipParams {
222
223
  tooltip: IPopupFacade;
223
224
  drillablePredicates: IHeaderPredicate[];
225
+ tooltipLookup?: IGeoLayerTooltipLookup;
224
226
  }
225
227
  /**
226
228
  * Tooltip configuration returned by adapters for unified tooltip handling.
@@ -303,6 +305,20 @@ export interface IGeoLayerAdapter<TLayer extends IGeoLayer, TOutput extends IGeo
303
305
  * @returns Prepared execution ready to be executed
304
306
  */
305
307
  prepareExecution?(layer: TLayer, context: IGeoAdapterContext, execution: IPreparedExecution): Promise<IPreparedExecution>;
308
+ /**
309
+ * Build a secondary execution that fetches external `{metric/id}` / `{label/id}`
310
+ * references for this layer, sliced so each row uniquely identifies one feature.
311
+ * The returned closure builds the matching key from feature properties at hover
312
+ * time. Return `null` when nothing external needs to be fetched.
313
+ *
314
+ * @param mainDefinition - The PREPARED layer execution definition (post
315
+ * `prepareExecution`, taken from the loaded
316
+ * dataView). Carries the TOOLTIP_TEXT / SEGMENT
317
+ * buckets that the unprepared definition can lack,
318
+ * plus filters / execConfig and the in-chart refs
319
+ * used for dedup.
320
+ */
321
+ buildTooltipExecution?(layer: TLayer, context: IGeoAdapterContext, mainDefinition: IExecutionDefinition): IGeoLayerCustomTooltipExecution | null;
306
322
  /**
307
323
  * Prepare layer output from execution result.
308
324
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gooddata/sdk-ui-geo",
3
- "version": "11.39.0-alpha.1",
3
+ "version": "11.39.0-alpha.2",
4
4
  "description": "GoodData.UI SDK - Geo Charts",
5
5
  "license": "MIT",
6
6
  "author": "GoodData Corporation",
@@ -43,12 +43,12 @@
43
43
  "ts-invariant": "0.10.3",
44
44
  "tslib": "2.8.1",
45
45
  "uuid": "11.1.0",
46
- "@gooddata/sdk-backend-spi": "11.39.0-alpha.1",
47
- "@gooddata/sdk-model": "11.39.0-alpha.1",
48
- "@gooddata/sdk-ui-kit": "11.39.0-alpha.1",
49
- "@gooddata/sdk-ui-theme-provider": "11.39.0-alpha.1",
50
- "@gooddata/sdk-ui": "11.39.0-alpha.1",
51
- "@gooddata/sdk-ui-vis-commons": "11.39.0-alpha.1"
46
+ "@gooddata/sdk-backend-spi": "11.39.0-alpha.2",
47
+ "@gooddata/sdk-ui": "11.39.0-alpha.2",
48
+ "@gooddata/sdk-ui-kit": "11.39.0-alpha.2",
49
+ "@gooddata/sdk-ui-theme-provider": "11.39.0-alpha.2",
50
+ "@gooddata/sdk-model": "11.39.0-alpha.2",
51
+ "@gooddata/sdk-ui-vis-commons": "11.39.0-alpha.2"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@microsoft/api-documenter": "^7.17.0",
@@ -91,10 +91,10 @@
91
91
  "typescript": "5.9.3",
92
92
  "vitest": "4.1.0",
93
93
  "vitest-dom": "0.1.1",
94
- "@gooddata/oxlint-config": "11.39.0-alpha.1",
95
- "@gooddata/sdk-backend-mockingbird": "11.39.0-alpha.1",
96
- "@gooddata/stylelint-config": "11.39.0-alpha.1",
97
- "@gooddata/eslint-config": "11.39.0-alpha.1"
94
+ "@gooddata/oxlint-config": "11.39.0-alpha.2",
95
+ "@gooddata/eslint-config": "11.39.0-alpha.2",
96
+ "@gooddata/sdk-backend-mockingbird": "11.39.0-alpha.2",
97
+ "@gooddata/stylelint-config": "11.39.0-alpha.2"
98
98
  },
99
99
  "peerDependencies": {
100
100
  "react": "^18.0.0 || ^19.0.0",
@@ -1730,56 +1730,60 @@ a.mapboxgl-ctrl-logo.mapboxgl-compact {
1730
1730
  }
1731
1731
 
1732
1732
  .gd-viz-tooltip-custom-section {
1733
- font-size: 13px;
1734
- line-height: 1.4;
1733
+ font-size: 14px;
1734
+ line-height: 1.2;
1735
1735
  text-align: left;
1736
1736
  white-space: normal;
1737
1737
  word-wrap: break-word;
1738
1738
  min-width: 200px;
1739
+ color: var(--gd-palette-complementary-7);
1739
1740
  }
1740
1741
  .gd-viz-tooltip-custom-section h1,
1741
1742
  .gd-viz-tooltip-custom-section h2,
1742
1743
  .gd-viz-tooltip-custom-section h3,
1743
1744
  .gd-viz-tooltip-custom-section h4 {
1744
- margin: 0 0 2px;
1745
+ margin: 0;
1745
1746
  font-weight: 700;
1746
- color: var(--gd-chart-tooltip-valueColor);
1747
+ color: var(--gd-palette-complementary-9);
1747
1748
  font-size: 14px;
1748
- line-height: 1.3;
1749
+ line-height: 1.2;
1750
+ padding: 5px 0;
1749
1751
  }
1750
1752
  .gd-viz-tooltip-custom-section p {
1751
- margin: 0 0 1px;
1753
+ margin: 0;
1754
+ padding-block-end: 5px;
1752
1755
  }
1753
1756
  .gd-viz-tooltip-custom-section strong {
1754
1757
  font-weight: 700;
1755
- color: var(--gd-chart-tooltip-valueColor);
1756
1758
  }
1757
1759
  .gd-viz-tooltip-custom-section ul,
1758
1760
  .gd-viz-tooltip-custom-section ol {
1759
- margin: 2px 0;
1760
- padding-left: 18px;
1761
- }
1762
- .gd-viz-tooltip-custom-section li {
1763
- margin-bottom: 1px;
1761
+ padding: 0 0 0 18px;
1762
+ margin: 0;
1764
1763
  }
1765
1764
  .gd-viz-tooltip-custom-section hr {
1766
1765
  border: 0;
1767
1766
  border-top: 1px solid var(--gd-palette-complementary-3);
1768
- margin: 4px 0;
1767
+ padding: 4px 0;
1769
1768
  }
1770
1769
  .gd-viz-tooltip-custom-section img {
1771
1770
  max-width: 100%;
1772
1771
  display: block;
1773
- margin: 4px 0;
1772
+ padding: 3px 0;
1774
1773
  }
1775
- .gd-viz-tooltip-custom-section .gd-viz-tooltip-custom-link {
1774
+ .gd-viz-tooltip-custom-section a {
1776
1775
  text-decoration: underline;
1777
- color: var(--gd-chart-tooltip-labelColor-from-theme);
1776
+ color: inherit;
1777
+ cursor: pointer;
1778
+ pointer-events: auto;
1779
+ }
1780
+ .gd-viz-tooltip-custom-section a:hover {
1781
+ color: var(--gd-palette-primary-base);
1778
1782
  }
1779
1783
 
1780
1784
  .gd-viz-tooltip-custom-separator {
1781
1785
  border-top: 1px solid var(--gd-palette-complementary-3);
1782
- margin: 8px 0;
1786
+ padding: 7px 0;
1783
1787
  }
1784
1788
 
1785
1789
  .gd-viz-tooltip {
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../../node_modules/@gooddata/sdk-ui-kit/src/@ui/defaultTheme.scss","../../node_modules/mapbox-gl/dist/mapbox-gl.css","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/aria.scss","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/Button/_variables.scss","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/mixins.scss","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/Bubble/_variables.scss","../../node_modules/@gooddata/sdk-ui-vis-commons/styles/scss/legend.scss","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/variables.scss","../../node_modules/@gooddata/sdk-ui-vis-commons/styles/scss/customTooltip.scss","../scss/tooltip.scss","../scss/_variables.scss","../scss/charts.scss","../../node_modules/maplibre-gl/dist/maplibre-gl.css","../scss/_maplibre-overrides.scss","../scss/_geo-pushpin-next-legend.scss","../scss/geo-pushpin-next.scss","../scss/geo-area-next.scss","../scss/geo-chart-next.scss","../scss/_geo-multi-layer-legend.scss","../scss/main.scss"],"names":[],"mappings":";AAIA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EAGA;EACA;EAGA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;AAAA;AAAA;AAAA;EAIA;EAGA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EAGA;EACA;EAGA;EAGA;EACA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA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;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA,kBJvGiB;;AI4GzB;EACI;;AAEA;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA,OP5FI;;AO+FR;EACI;EACA;EACA;EACA;EACA;EACA;EACA,OJnIiB;EIoIjB,aPhCM;;AOoCN;EACI;;AAMZ;EACI;EACA;EACA;;AAEA;EACI;EACA;;AAMJ;EACI;EACA;EACA;;;ACvJR;EACI;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;ACpDJ;EACI;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;;;AClBJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;;;ACOR;EACI;EACA;EACA;EACA;EACA,kBXRa;EWSb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA,aX4Dc;EW3Dd;EACA;EAEA;EAEA;;AAEA;EAzBJ;IA0BQ;;;AAIJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAMJ;EACI;EACA;EACA;EACA;EACA;EACA;EAGA;;AAGA;EACI;;AAIJ;EACI;EACA;EACA;;AAIJ;EACI;;AAKR;EACI;EACA;EACA;EACA;EACA;EACA;EACA,kBXrGS;EWsGT;EAEA;EACA;;AAIA;EACI;;AAEA;EACI;;AAGJ;EACI;EACA;;AAMZ;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;;AAKR;EACI;EACA;EACA;EACA;EACA;EACA;;AAIJ;EACI;EACA,OAhLe;EAiLf;EACA;;AAEA;EACI;;AAKR;EACI;EACA;EACA;EACA;EACA,OAjMa;EAkMb;EACA;EACA;;AAIJ;EACI;EACA;EACA;;AAGJ;EACI;;AAIJ;EAEI;EACA;EACA;;AAKJ;EACI;EACA;EAEA;EACA;EACA;EACA;EACA;EA0CA;EACA;;AAxCA;EACI;EACA;EACA;;AAIJ;EACI;EACA;EACA;;AAKJ;EACI;EACA;EACA;;AAIJ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAWR;EAGI;;AAGA;EACI;;AAIJ;EACI;EACA;;AAGJ;EACI;;AAIA;EACI,YACI;EAjShB;EACA;;AAuSA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA,OA5TY;EA6TZ;EACA;EACA;EACA;;AAMJ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA,OAhWY;EAiWZ;;AAMJ;EACI;EACA;;AAIA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;EACA;;AAGA;EACI;EACA;EACA;EACA;;AAGA;EACI;;AAGJ;EApYR;EACA,gBAoY0C;EAnY1C;;AA0YQ;EA5YR;EACA,gBA4Y0C;EA3Y1C;EAIA;EACA;;AAyYY;EACI;;AAOR;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAKZ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA,OArbY;EAsbZ;EACA;EACA;;AAGJ;EACI;EACA,OA7bY;EA8bZ;;AAMJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EAEA;;AAOJ;EACI;EACA;EACA;;AAGJ;EAEI;EACA;EACA;EACA,OAleY;;;ACUZ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAIR;EACI;EACA;;AAOA;EACI;;AAIR;EACI;EACA;EACA;EACA;;AAIA;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAMZ;EACI;EACA;EACA;;;AAKJ;EAEI;;AAGJ;EACI;;AAEA;EAEI;;AAGJ;EAEI;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;AAAA;EAEI;;AAGJ;EACI;;AAGJ;EACI;;;AAIR;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA,OZ1HQ;EY2HR;EACA;EACA;EACA;;AAIA;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA,OZ5II;;AY+IR;EACI,OT7KiB;ES8KjB,aZ1EM;;AY8EN;EACI;;AAKZ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;;AAIR;EACI;;;AAGJ;EACI;EAGA;;;AAIJ;EAEI;;;AAIJ;EACI;EACA;EACA;;;AAGJ;AACA;EACI;;;AAGJ;EACI;EACA;;;AAGJ;AACA;AAAA;EAEI,aT3Oe;ES6Of;EACA,OZpNoB;EYqNpB;;;AAIJ;EAEI;EAEA","file":"main.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../../node_modules/@gooddata/sdk-ui-kit/src/@ui/defaultTheme.scss","../../node_modules/mapbox-gl/dist/mapbox-gl.css","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/aria.scss","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/Button/_variables.scss","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/mixins.scss","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/Bubble/_variables.scss","../../node_modules/@gooddata/sdk-ui-vis-commons/styles/scss/legend.scss","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/variables.scss","../../node_modules/@gooddata/sdk-ui-vis-commons/styles/scss/customTooltip.scss","../scss/tooltip.scss","../scss/_variables.scss","../scss/charts.scss","../../node_modules/maplibre-gl/dist/maplibre-gl.css","../scss/_maplibre-overrides.scss","../scss/_geo-pushpin-next-legend.scss","../scss/geo-pushpin-next.scss","../scss/geo-area-next.scss","../scss/geo-chart-next.scss","../scss/_geo-multi-layer-legend.scss","../scss/main.scss"],"names":[],"mappings":";AAIA;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EAGA;EACA;EAGA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;AAAA;AAAA;AAAA;EAIA;EAGA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EAGA;EACA;EAGA;EAGA;EACA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;AAAA;AAAA;AAAA;EAIA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA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AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA,kBJvGiB;;AI4GzB;EACI;;AAEA;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA,OP5FI;;AO+FR;EACI;EACA;EACA;EACA;EACA;EACA;EACA,OJnIiB;EIoIjB,aPhCM;;AOoCN;EACI;;AAMZ;EACI;EACA;EACA;;AAEA;EACI;EACA;;AAMJ;EACI;EACA;EACA;;;ACvJR;EACI;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;ACpDJ;EACI;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;;;AClBJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;;;ACOR;EACI;EACA;EACA;EACA;EACA,kBXRa;EWSb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA,aX4Dc;EW3Dd;EACA;EAEA;EAEA;;AAEA;EAzBJ;IA0BQ;;;AAIJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAMJ;EACI;EACA;EACA;EACA;EACA;EACA;EAGA;;AAGA;EACI;;AAIJ;EACI;EACA;EACA;;AAIJ;EACI;;AAKR;EACI;EACA;EACA;EACA;EACA;EACA;EACA,kBXrGS;EWsGT;EAEA;EACA;;AAIA;EACI;;AAEA;EACI;;AAGJ;EACI;EACA;;AAMZ;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;;AAKR;EACI;EACA;EACA;EACA;EACA;EACA;;AAIJ;EACI;EACA,OAhLe;EAiLf;EACA;;AAEA;EACI;;AAKR;EACI;EACA;EACA;EACA;EACA,OAjMa;EAkMb;EACA;EACA;;AAIJ;EACI;EACA;EACA;;AAGJ;EACI;;AAIJ;EAEI;EACA;EACA;;AAKJ;EACI;EACA;EAEA;EACA;EACA;EACA;EACA;EA0CA;EACA;;AAxCA;EACI;EACA;EACA;;AAIJ;EACI;EACA;EACA;;AAKJ;EACI;EACA;EACA;;AAIJ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAWR;EAGI;;AAGA;EACI;;AAIJ;EACI;EACA;;AAGJ;EACI;;AAIA;EACI,YACI;EAjShB;EACA;;AAuSA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA,OA5TY;EA6TZ;EACA;EACA;EACA;;AAMJ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA,OAhWY;EAiWZ;;AAMJ;EACI;EACA;;AAIA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;EACA;;AAGA;EACI;EACA;EACA;EACA;;AAGA;EACI;;AAGJ;EApYR;EACA,gBAoY0C;EAnY1C;;AA0YQ;EA5YR;EACA,gBA4Y0C;EA3Y1C;EAIA;EACA;;AAyYY;EACI;;AAOR;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAKZ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA,OArbY;EAsbZ;EACA;EACA;;AAGJ;EACI;EACA,OA7bY;EA8bZ;;AAMJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EAEA;;AAOJ;EACI;EACA;EACA;;AAGJ;EAEI;EACA;EACA;EACA,OAleY;;;ACUZ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAIR;EACI;EACA;;AAOA;EACI;;AAIR;EACI;EACA;EACA;EACA;;AAIA;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAMZ;EACI;EACA;EACA;;;AAKJ;EAEI;;AAGJ;EACI;;AAEA;EAEI;;AAGJ;EAEI;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;AAAA;EAEI;;AAGJ;EACI;;AAGJ;EACI;;;AAIR;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA,OZ1HQ;EY2HR;EACA;EACA;EACA;;AAIA;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA,OZ5II;;AY+IR;EACI,OT7KiB;ES8KjB,aZ1EM;;AY8EN;EACI;;AAKZ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;;AAIR;EACI;;;AAGJ;EACI;EAGA;;;AAIJ;EAEI;;;AAIJ;EACI;EACA;EACA;;;AAGJ;AACA;EACI;;;AAGJ;EACI;EACA;;;AAGJ;AACA;AAAA;EAEI,aT3Oe;ES6Of;EACA,OZpNoB;EYqNpB;;;AAIJ;EAEI;EAEA","file":"main.css"}