@splunk/visualizations 28.6.0 → 28.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. package/Area.js +2 -2
  2. package/Area.js.map +2 -2
  3. package/Bar.js +2 -2
  4. package/Bar.js.map +2 -2
  5. package/Bubble.js +2 -2
  6. package/Bubble.js.map +2 -2
  7. package/CHANGELOG.external.md +45 -50
  8. package/ChoroplethSvg.js +2 -2
  9. package/ChoroplethSvg.js.map +2 -2
  10. package/Column.js +2 -2
  11. package/Column.js.map +2 -2
  12. package/Ellipse.js +2 -2
  13. package/Ellipse.js.map +2 -2
  14. package/Events/PureEvents/FieldSummaryTooltip.d.ts +8 -31
  15. package/Events/PureEvents/FieldSummaryTooltip.d.ts.map +1 -1
  16. package/Events/PureEvents/PureEvents.d.ts.map +1 -1
  17. package/Events/PureEvents/TimeControlsPopover.d.ts +6 -25
  18. package/Events/PureEvents/TimeControlsPopover.d.ts.map +1 -1
  19. package/Events.js +27 -101
  20. package/Events.js.map +2 -2
  21. package/FillerGauge.js +10 -5
  22. package/FillerGauge.js.map +2 -2
  23. package/Image.js +2 -2
  24. package/Image.js.map +2 -2
  25. package/Line.js +2 -2
  26. package/Line.js.map +2 -2
  27. package/LinkGraph.js +2 -2
  28. package/LinkGraph.js.map +2 -2
  29. package/Map/Map.d.ts +1 -0
  30. package/Map/Map.d.ts.map +1 -1
  31. package/Map/PureMap/BubbleLayer.d.ts +22 -4
  32. package/Map/PureMap/BubbleLayer.d.ts.map +1 -1
  33. package/Map/PureMap/ChoroplethLayer.d.ts +9 -1
  34. package/Map/PureMap/ChoroplethLayer.d.ts.map +1 -1
  35. package/Map/PureMap/ClusterLayer.d.ts +3 -1
  36. package/Map/PureMap/ClusterLayer.d.ts.map +1 -1
  37. package/Map/PureMap/LocalChoroplethLayer.d.ts +1 -0
  38. package/Map/PureMap/LocalChoroplethLayer.d.ts.map +1 -1
  39. package/Map/PureMap/MapContext.d.ts +13 -0
  40. package/Map/PureMap/MapContext.d.ts.map +1 -0
  41. package/Map/PureMap/MarkerLayer.d.ts +19 -2
  42. package/Map/PureMap/MarkerLayer.d.ts.map +1 -1
  43. package/Map/PureMap/MarkerWrapper.d.ts +3 -2
  44. package/Map/PureMap/MarkerWrapper.d.ts.map +1 -1
  45. package/Map/PureMap/PureMap.d.ts +1 -0
  46. package/Map/PureMap/PureMap.d.ts.map +1 -1
  47. package/Map/PureMap/PureMapContainer.d.ts.map +1 -1
  48. package/Map/PureMap/Tooltip.d.ts +6 -1
  49. package/Map/PureMap/Tooltip.d.ts.map +1 -1
  50. package/Map/PureMap/keyboardConstants.d.ts +11 -0
  51. package/Map/PureMap/keyboardConstants.d.ts.map +1 -0
  52. package/Map/PureMap/useRovingTabindex.d.ts +18 -0
  53. package/Map/PureMap/useRovingTabindex.d.ts.map +1 -0
  54. package/Map.js +1317 -478
  55. package/Map.js.map +4 -4
  56. package/Markdown/Markdown.d.ts.map +1 -1
  57. package/Markdown.config.js +1 -1
  58. package/Markdown.config.js.map +1 -1
  59. package/Markdown.js +24 -7
  60. package/Markdown.js.map +2 -2
  61. package/MarkerGauge.js +10 -5
  62. package/MarkerGauge.js.map +2 -2
  63. package/NetworkGraph/NetworkGraph.d.ts +2 -5
  64. package/NetworkGraph/NetworkGraph.d.ts.map +1 -1
  65. package/NetworkGraph/PureNetworkGraph/PureNetworkGraph.d.ts.map +1 -1
  66. package/NetworkGraph/PureNetworkGraph/components/NetworkGraphSvg.d.ts +1 -0
  67. package/NetworkGraph/PureNetworkGraph/components/NetworkGraphSvg.d.ts.map +1 -1
  68. package/NetworkGraph/PureNetworkGraph/components/Node.d.ts +1 -0
  69. package/NetworkGraph/PureNetworkGraph/components/Node.d.ts.map +1 -1
  70. package/NetworkGraph/PureNetworkGraph/components/Tooltip.d.ts +1 -1
  71. package/NetworkGraph/PureNetworkGraph/components/Tooltip.d.ts.map +1 -1
  72. package/NetworkGraph/PureNetworkGraph/components/ZoomControls.d.ts +1 -0
  73. package/NetworkGraph/PureNetworkGraph/components/ZoomControls.d.ts.map +1 -1
  74. package/NetworkGraph/PureNetworkGraph/utils/networkGraphUtils.d.ts +23 -0
  75. package/NetworkGraph/PureNetworkGraph/utils/networkGraphUtils.d.ts.map +1 -1
  76. package/NetworkGraph.config.js +2 -0
  77. package/NetworkGraph.config.js.map +2 -2
  78. package/NetworkGraph.js +353 -40
  79. package/NetworkGraph.js.map +4 -4
  80. package/ParallelCoordinates.js +2 -2
  81. package/ParallelCoordinates.js.map +2 -2
  82. package/Pie.js +2 -2
  83. package/Pie.js.map +2 -2
  84. package/ProcessTree/ProcessTree.d.ts +3 -1
  85. package/ProcessTree/ProcessTree.d.ts.map +1 -1
  86. package/ProcessTree/PureProcessTree/PureProcessTree.d.ts +1 -0
  87. package/ProcessTree/PureProcessTree/PureProcessTree.d.ts.map +1 -1
  88. package/ProcessTree/PureProcessTree/components/ProcessTreeLeftPanel.d.ts +2 -0
  89. package/ProcessTree/PureProcessTree/components/ProcessTreeLeftPanel.d.ts.map +1 -1
  90. package/ProcessTree/PureProcessTree/components/ProcessTreeRightPanel.d.ts.map +1 -1
  91. package/ProcessTree/PureProcessTree/hooks/useProcessTreeGraphData.d.ts +3 -1
  92. package/ProcessTree/PureProcessTree/hooks/useProcessTreeGraphData.d.ts.map +1 -1
  93. package/ProcessTree/PureProcessTree/mockdata/data.d.ts.map +1 -1
  94. package/ProcessTree/PureProcessTree/utils/processTreeUtils.d.ts +3 -1
  95. package/ProcessTree/PureProcessTree/utils/processTreeUtils.d.ts.map +1 -1
  96. package/ProcessTree.js +101 -31
  97. package/ProcessTree.js.map +3 -3
  98. package/Punchcard.js +2 -2
  99. package/Punchcard.js.map +2 -2
  100. package/README.md +2 -0
  101. package/Rectangle.js +2 -2
  102. package/Rectangle.js.map +2 -2
  103. package/RichText/PureRichText/Editor/EditorPanel.d.ts.map +1 -1
  104. package/RichText/PureRichText/InnerEditor.d.ts +10 -0
  105. package/RichText/PureRichText/InnerEditor.d.ts.map +1 -1
  106. package/RichText/PureRichText/PureRichText.d.ts +17 -0
  107. package/RichText/PureRichText/PureRichText.d.ts.map +1 -1
  108. package/RichText/PureRichText/PureRichTextContext.d.ts.map +1 -1
  109. package/RichText/PureRichText/hooks/useContentSave.d.ts +6 -0
  110. package/RichText/PureRichText/hooks/useContentSave.d.ts.map +1 -1
  111. package/RichText/PureRichText/hooks/useContentSync.d.ts +13 -1
  112. package/RichText/PureRichText/hooks/useContentSync.d.ts.map +1 -1
  113. package/RichText/PureRichText/hooks/useDashboardKeyboardNav.d.ts.map +1 -1
  114. package/RichText/PureRichText/hooks/useEditorSetup.d.ts.map +1 -1
  115. package/RichText/PureRichText/hooks/useFakeHighlight.d.ts +1 -16
  116. package/RichText/PureRichText/hooks/useFakeHighlight.d.ts.map +1 -1
  117. package/RichText/PureRichText/hooks/useTokenMap.d.ts +37 -35
  118. package/RichText/PureRichText/hooks/useTokenMap.d.ts.map +1 -1
  119. package/RichText/PureRichText/renderers/LeafRenderer.d.ts +0 -4
  120. package/RichText/PureRichText/renderers/LeafRenderer.d.ts.map +1 -1
  121. package/RichText/PureRichText/types.d.ts +15 -0
  122. package/RichText/PureRichText/types.d.ts.map +1 -1
  123. package/RichText/PureRichText/utils/slateUtils.d.ts.map +1 -1
  124. package/RichText/RichText.d.ts +2 -0
  125. package/RichText/RichText.d.ts.map +1 -1
  126. package/RichText/config.d.ts.map +1 -1
  127. package/RichText.config.js +14 -1
  128. package/RichText.config.js.map +2 -2
  129. package/RichText.js +733 -263
  130. package/RichText.js.map +4 -4
  131. package/Sankey.js +2 -2
  132. package/Sankey.js.map +2 -2
  133. package/Scatter.js +2 -2
  134. package/Scatter.js.map +2 -2
  135. package/SingleValue.js +368 -471
  136. package/SingleValue.js.map +4 -4
  137. package/SingleValueIcon.js +2 -2
  138. package/SingleValueIcon.js.map +2 -2
  139. package/SingleValueRadial.js +2 -2
  140. package/SingleValueRadial.js.map +2 -2
  141. package/SparkLine/SparkLine.d.ts +57 -0
  142. package/SparkLine/SparkLine.d.ts.map +1 -0
  143. package/SparkLine/index.d.ts +1 -1
  144. package/SparkLine/index.d.ts.map +1 -1
  145. package/SparkLine.js +384 -485
  146. package/SparkLine.js.map +4 -4
  147. package/Table/PureTable.d.ts +2 -0
  148. package/Table/PureTable.d.ts.map +1 -1
  149. package/Table/config.d.ts.map +1 -1
  150. package/Table/hooks.d.ts +1 -1
  151. package/Table/hooks.d.ts.map +1 -1
  152. package/Table.config.js +7 -0
  153. package/Table.config.js.map +2 -2
  154. package/Table.js +480 -500
  155. package/Table.js.map +4 -4
  156. package/Timeline/PureTimeline/PureTimeline.d.ts +6 -5
  157. package/Timeline/PureTimeline/PureTimeline.d.ts.map +1 -1
  158. package/Timeline/PureTimeline/src/CursorPlugin.d.ts +1 -0
  159. package/Timeline/PureTimeline/src/CursorPlugin.d.ts.map +1 -1
  160. package/Timeline/PureTimeline/src/TimelineLegend.d.ts +10 -7
  161. package/Timeline/PureTimeline/src/TimelineLegend.d.ts.map +1 -1
  162. package/Timeline/PureTimeline/src/TimelineTooltip.d.ts +5 -1
  163. package/Timeline/PureTimeline/src/TimelineTooltip.d.ts.map +1 -1
  164. package/Timeline/PureTimeline/src/TimelineUplot.d.ts +19 -2
  165. package/Timeline/PureTimeline/src/TimelineUplot.d.ts.map +1 -1
  166. package/Timeline/PureTimeline/src/TimelineYAxis.d.ts.map +1 -1
  167. package/Timeline/PureTimeline/src/XAxisPlugin.d.ts +1 -0
  168. package/Timeline/PureTimeline/src/XAxisPlugin.d.ts.map +1 -1
  169. package/Timeline/PureTimeline/src/utils/timelineUtils.d.ts +8 -0
  170. package/Timeline/PureTimeline/src/utils/timelineUtils.d.ts.map +1 -1
  171. package/Timeline.js +449 -211
  172. package/Timeline.js.map +4 -4
  173. package/Treemap/PureTreemap/components/PureTreemap.d.ts +42 -0
  174. package/Treemap/PureTreemap/components/PureTreemap.d.ts.map +1 -0
  175. package/Treemap/PureTreemap/components/TreemapBreadcrumb.d.ts +10 -0
  176. package/Treemap/PureTreemap/components/TreemapBreadcrumb.d.ts.map +1 -0
  177. package/Treemap/PureTreemap/components/TreemapChildCell.d.ts +28 -0
  178. package/Treemap/PureTreemap/components/TreemapChildCell.d.ts.map +1 -0
  179. package/Treemap/PureTreemap/components/TreemapHeader.d.ts +19 -0
  180. package/Treemap/PureTreemap/components/TreemapHeader.d.ts.map +1 -0
  181. package/Treemap/PureTreemap/components/TreemapHoverTarget.d.ts +17 -0
  182. package/Treemap/PureTreemap/components/TreemapHoverTarget.d.ts.map +1 -0
  183. package/Treemap/PureTreemap/components/TreemapLegend.d.ts +20 -0
  184. package/Treemap/PureTreemap/components/TreemapLegend.d.ts.map +1 -0
  185. package/Treemap/PureTreemap/components/TreemapNode.d.ts +5 -0
  186. package/Treemap/PureTreemap/components/TreemapNode.d.ts.map +1 -0
  187. package/Treemap/PureTreemap/components/TreemapParentNode.d.ts +10 -0
  188. package/Treemap/PureTreemap/components/TreemapParentNode.d.ts.map +1 -0
  189. package/Treemap/PureTreemap/components/TreemapStandaloneNode.d.ts +6 -0
  190. package/Treemap/PureTreemap/components/TreemapStandaloneNode.d.ts.map +1 -0
  191. package/Treemap/PureTreemap/components/TreemapTooltip.d.ts +17 -0
  192. package/Treemap/PureTreemap/components/TreemapTooltip.d.ts.map +1 -0
  193. package/Treemap/PureTreemap/mockdata/data.d.ts +90 -0
  194. package/Treemap/PureTreemap/mockdata/data.d.ts.map +1 -0
  195. package/Treemap/PureTreemap/utils/treemapColorUtils.d.ts +67 -0
  196. package/Treemap/PureTreemap/utils/treemapColorUtils.d.ts.map +1 -0
  197. package/Treemap/PureTreemap/utils/treemapDataColorUtils.d.ts +5 -0
  198. package/Treemap/PureTreemap/utils/treemapDataColorUtils.d.ts.map +1 -0
  199. package/Treemap/PureTreemap/utils/treemapDataUtils.d.ts +14 -0
  200. package/Treemap/PureTreemap/utils/treemapDataUtils.d.ts.map +1 -0
  201. package/Treemap/PureTreemap/utils/treemapLayout.d.ts +49 -0
  202. package/Treemap/PureTreemap/utils/treemapLayout.d.ts.map +1 -0
  203. package/Treemap/PureTreemap/utils/treemapNodeUtils.d.ts +81 -0
  204. package/Treemap/PureTreemap/utils/treemapNodeUtils.d.ts.map +1 -0
  205. package/Treemap/PureTreemap/utils/treemapTypes.d.ts +37 -0
  206. package/Treemap/PureTreemap/utils/treemapTypes.d.ts.map +1 -0
  207. package/Treemap/PureTreemap/utils/treemapUtils.d.ts +76 -0
  208. package/Treemap/PureTreemap/utils/treemapUtils.d.ts.map +1 -0
  209. package/Treemap/Treemap.d.ts +12 -0
  210. package/Treemap/Treemap.d.ts.map +1 -0
  211. package/Treemap/config.d.ts +4 -0
  212. package/Treemap/config.d.ts.map +1 -0
  213. package/Treemap/index.d.ts +3 -0
  214. package/Treemap/index.d.ts.map +1 -0
  215. package/Treemap.config.js +465 -0
  216. package/Treemap.config.js.map +7 -0
  217. package/Treemap.js +6233 -0
  218. package/Treemap.js.map +7 -0
  219. package/common/DocExampleWithVizSandbox.js.map +2 -2
  220. package/common/GaugeMajorTicks.js.map +2 -2
  221. package/common/GaugeValueMarker.js +1 -0
  222. package/common/GaugeValueMarker.js.map +2 -2
  223. package/common/OptionsDoc.js.map +1 -1
  224. package/common/OverviewDoc.js.map +2 -2
  225. package/common/docUtils.d.ts.map +1 -1
  226. package/common/docUtils.js +1 -8
  227. package/common/docUtils.js.map +2 -2
  228. package/common/gaugeUtils.d.ts.map +1 -1
  229. package/common/gaugeUtils.js +7 -3
  230. package/common/gaugeUtils.js.map +2 -2
  231. package/common/hocs/FixedSizeContainer.d.ts.map +1 -1
  232. package/common/hooks/useDynamicHeight.d.ts +67 -0
  233. package/common/hooks/useDynamicHeight.d.ts.map +1 -0
  234. package/common/interfaces/VizCategory.d.ts +2 -1
  235. package/common/interfaces/VizCategory.d.ts.map +1 -1
  236. package/common/utils/mapUtils.js +512 -179
  237. package/common/utils/mapUtils.js.map +4 -4
  238. package/common/utils/shadowDomUtils.d.ts +2 -0
  239. package/common/utils/shadowDomUtils.d.ts.map +1 -0
  240. package/common/utils/shadowDomUtils.js +39 -0
  241. package/common/utils/shadowDomUtils.js.map +7 -0
  242. package/common/withDashboardViz.js +2 -2
  243. package/common/withDashboardViz.js.map +2 -2
  244. package/docs-llm/INDEX.md +119 -0
  245. package/docs-llm/area/examples-json.md +3854 -0
  246. package/docs-llm/area/examples-react.md +2816 -0
  247. package/docs-llm/area/options.md +97 -0
  248. package/docs-llm/area/overview.md +27 -0
  249. package/docs-llm/bar/examples-json.md +3380 -0
  250. package/docs-llm/bar/examples-react.md +2352 -0
  251. package/docs-llm/bar/options.md +89 -0
  252. package/docs-llm/bar/overview.md +25 -0
  253. package/docs-llm/bubble/examples-json.md +4082 -0
  254. package/docs-llm/bubble/examples-react.md +3977 -0
  255. package/docs-llm/bubble/options.md +62 -0
  256. package/docs-llm/bubble/overview.md +26 -0
  257. package/docs-llm/choropleth-svg/examples-json.md +397 -0
  258. package/docs-llm/choropleth-svg/examples-react.md +389 -0
  259. package/docs-llm/choropleth-svg/options.md +15 -0
  260. package/docs-llm/choropleth-svg/overview.md +23 -0
  261. package/docs-llm/column/examples-json.md +3898 -0
  262. package/docs-llm/column/examples-react.md +2653 -0
  263. package/docs-llm/column/options.md +94 -0
  264. package/docs-llm/column/overview.md +31 -0
  265. package/docs-llm/dsl/examples-json.md +43 -0
  266. package/docs-llm/dsl/examples-react.md +78 -0
  267. package/docs-llm/dsl/formatters/format-by-type-examples-json.md +58 -0
  268. package/docs-llm/dsl/formatters/format-by-type-examples-react.md +43 -0
  269. package/docs-llm/dsl/formatters/format-by-type.md +38 -0
  270. package/docs-llm/dsl/formatters/frame-examples-json.md +42 -0
  271. package/docs-llm/dsl/formatters/frame-examples-react.md +24 -0
  272. package/docs-llm/dsl/formatters/frame.md +6 -0
  273. package/docs-llm/dsl/formatters/gradient-examples-json.md +98 -0
  274. package/docs-llm/dsl/formatters/gradient-examples-react.md +44 -0
  275. package/docs-llm/dsl/formatters/gradient.md +23 -0
  276. package/docs-llm/dsl/formatters/lerp-examples-json.md +40 -0
  277. package/docs-llm/dsl/formatters/lerp-examples-react.md +28 -0
  278. package/docs-llm/dsl/formatters/lerp.md +19 -0
  279. package/docs-llm/dsl/formatters/match-value-examples-json.md +65 -0
  280. package/docs-llm/dsl/formatters/match-value-examples-react.md +37 -0
  281. package/docs-llm/dsl/formatters/match-value.md +13 -0
  282. package/docs-llm/dsl/formatters/max-contrast-examples-json.md +39 -0
  283. package/docs-llm/dsl/formatters/max-contrast-examples-react.md +27 -0
  284. package/docs-llm/dsl/formatters/max-contrast.md +9 -0
  285. package/docs-llm/dsl/formatters/multi-format-examples-json.md +67 -0
  286. package/docs-llm/dsl/formatters/multi-format-examples-react.md +49 -0
  287. package/docs-llm/dsl/formatters/multi-format.md +12 -0
  288. package/docs-llm/dsl/formatters/objects-examples-json.md +49 -0
  289. package/docs-llm/dsl/formatters/objects-examples-react.md +37 -0
  290. package/docs-llm/dsl/formatters/objects.md +3 -0
  291. package/docs-llm/dsl/formatters/pick-examples-json.md +59 -0
  292. package/docs-llm/dsl/formatters/pick-examples-react.md +30 -0
  293. package/docs-llm/dsl/formatters/pick.md +9 -0
  294. package/docs-llm/dsl/formatters/prefix-examples-json.md +29 -0
  295. package/docs-llm/dsl/formatters/prefix-examples-react.md +19 -0
  296. package/docs-llm/dsl/formatters/prefix.md +3 -0
  297. package/docs-llm/dsl/formatters/prepend-examples-json.md +51 -0
  298. package/docs-llm/dsl/formatters/prepend-examples-react.md +33 -0
  299. package/docs-llm/dsl/formatters/prepend.md +9 -0
  300. package/docs-llm/dsl/formatters/range-value-examples-json.md +48 -0
  301. package/docs-llm/dsl/formatters/range-value-examples-react.md +34 -0
  302. package/docs-llm/dsl/formatters/range-value.md +15 -0
  303. package/docs-llm/dsl/formatters/set-color-channel-examples-json.md +40 -0
  304. package/docs-llm/dsl/formatters/set-color-channel-examples-react.md +31 -0
  305. package/docs-llm/dsl/formatters/set-color-channel.md +9 -0
  306. package/docs-llm/dsl/formatters/suffix-examples-json.md +29 -0
  307. package/docs-llm/dsl/formatters/suffix-examples-react.md +19 -0
  308. package/docs-llm/dsl/formatters/suffix.md +3 -0
  309. package/docs-llm/dsl/formatters/type-examples-json.md +37 -0
  310. package/docs-llm/dsl/formatters/type-examples-react.md +20 -0
  311. package/docs-llm/dsl/formatters/type.md +3 -0
  312. package/docs-llm/dsl/overview.md +41 -0
  313. package/docs-llm/dsl/selectors/abs.md +7 -0
  314. package/docs-llm/dsl/selectors/ceil.md +7 -0
  315. package/docs-llm/dsl/selectors/data-frame-average-examples-json.md +41 -0
  316. package/docs-llm/dsl/selectors/data-frame-average-examples-react.md +36 -0
  317. package/docs-llm/dsl/selectors/data-frame-average.md +7 -0
  318. package/docs-llm/dsl/selectors/data-frame-count-examples-json.md +41 -0
  319. package/docs-llm/dsl/selectors/data-frame-count-examples-react.md +36 -0
  320. package/docs-llm/dsl/selectors/data-frame-count.md +7 -0
  321. package/docs-llm/dsl/selectors/data-frame-examples-json.md +830 -0
  322. package/docs-llm/dsl/selectors/data-frame-examples-react.md +929 -0
  323. package/docs-llm/dsl/selectors/data-frame-get-field-examples-json.md +89 -0
  324. package/docs-llm/dsl/selectors/data-frame-get-field-examples-react.md +124 -0
  325. package/docs-llm/dsl/selectors/data-frame-get-field.md +5 -0
  326. package/docs-llm/dsl/selectors/data-frame-get-raw-value.md +5 -0
  327. package/docs-llm/dsl/selectors/data-frame-get-type.md +5 -0
  328. package/docs-llm/dsl/selectors/data-frame-get-value.md +5 -0
  329. package/docs-llm/dsl/selectors/data-frame-max-examples-json.md +51 -0
  330. package/docs-llm/dsl/selectors/data-frame-max-examples-react.md +41 -0
  331. package/docs-llm/dsl/selectors/data-frame-max.md +7 -0
  332. package/docs-llm/dsl/selectors/data-frame-min-examples-json.md +51 -0
  333. package/docs-llm/dsl/selectors/data-frame-min-examples-react.md +41 -0
  334. package/docs-llm/dsl/selectors/data-frame-min.md +7 -0
  335. package/docs-llm/dsl/selectors/data-frame-percentile-examples-json.md +41 -0
  336. package/docs-llm/dsl/selectors/data-frame-percentile-examples-react.md +36 -0
  337. package/docs-llm/dsl/selectors/data-frame-percentile.md +8 -0
  338. package/docs-llm/dsl/selectors/data-frame-set-value.md +5 -0
  339. package/docs-llm/dsl/selectors/data-frame-sum-examples-json.md +51 -0
  340. package/docs-llm/dsl/selectors/data-frame-sum-examples-react.md +41 -0
  341. package/docs-llm/dsl/selectors/data-frame-sum.md +7 -0
  342. package/docs-llm/dsl/selectors/data-frame.md +4 -0
  343. package/docs-llm/dsl/selectors/data-point-get-field.md +5 -0
  344. package/docs-llm/dsl/selectors/data-point-get-raw-value.md +4 -0
  345. package/docs-llm/dsl/selectors/data-point-get-type.md +5 -0
  346. package/docs-llm/dsl/selectors/data-point-get-value.md +5 -0
  347. package/docs-llm/dsl/selectors/data-point-set-value.md +4 -0
  348. package/docs-llm/dsl/selectors/data-point.md +5 -0
  349. package/docs-llm/dsl/selectors/data-series-average.md +22 -0
  350. package/docs-llm/dsl/selectors/data-series-count.md +14 -0
  351. package/docs-llm/dsl/selectors/data-series-get-field.md +5 -0
  352. package/docs-llm/dsl/selectors/data-series-get-raw-value.md +4 -0
  353. package/docs-llm/dsl/selectors/data-series-get-type.md +5 -0
  354. package/docs-llm/dsl/selectors/data-series-get-value.md +4 -0
  355. package/docs-llm/dsl/selectors/data-series-max.md +5 -0
  356. package/docs-llm/dsl/selectors/data-series-min.md +5 -0
  357. package/docs-llm/dsl/selectors/data-series-percentile.md +17 -0
  358. package/docs-llm/dsl/selectors/data-series-set-value.md +4 -0
  359. package/docs-llm/dsl/selectors/data-series-sum.md +24 -0
  360. package/docs-llm/dsl/selectors/data-series.md +4 -0
  361. package/docs-llm/dsl/selectors/delta.md +7 -0
  362. package/docs-llm/dsl/selectors/divide.md +8 -0
  363. package/docs-llm/dsl/selectors/first-point.md +5 -0
  364. package/docs-llm/dsl/selectors/floor.md +7 -0
  365. package/docs-llm/dsl/selectors/frame-by-series-index-range-examples-json.md +89 -0
  366. package/docs-llm/dsl/selectors/frame-by-series-index-range-examples-react.md +88 -0
  367. package/docs-llm/dsl/selectors/frame-by-series-index-range.md +10 -0
  368. package/docs-llm/dsl/selectors/frame-by-series-indexes-examples-json.md +88 -0
  369. package/docs-llm/dsl/selectors/frame-by-series-indexes-examples-react.md +87 -0
  370. package/docs-llm/dsl/selectors/frame-by-series-indexes.md +9 -0
  371. package/docs-llm/dsl/selectors/frame-by-series-names-examples-json.md +89 -0
  372. package/docs-llm/dsl/selectors/frame-by-series-names-examples-react.md +88 -0
  373. package/docs-llm/dsl/selectors/frame-by-series-names-or-indexes-examples-json.md +89 -0
  374. package/docs-llm/dsl/selectors/frame-by-series-names-or-indexes-examples-react.md +88 -0
  375. package/docs-llm/dsl/selectors/frame-by-series-names-or-indexes.md +9 -0
  376. package/docs-llm/dsl/selectors/frame-by-series-names.md +9 -0
  377. package/docs-llm/dsl/selectors/frame-by-series-types-examples-json.md +89 -0
  378. package/docs-llm/dsl/selectors/frame-by-series-types-examples-react.md +88 -0
  379. package/docs-llm/dsl/selectors/frame-by-series-types.md +9 -0
  380. package/docs-llm/dsl/selectors/frame-without-internal-fields-examples-json.md +137 -0
  381. package/docs-llm/dsl/selectors/frame-without-internal-fields-examples-react.md +135 -0
  382. package/docs-llm/dsl/selectors/frame-without-internal-fields-except-examples-json.md +157 -0
  383. package/docs-llm/dsl/selectors/frame-without-internal-fields-except-examples-react.md +155 -0
  384. package/docs-llm/dsl/selectors/frame-without-internal-fields-except.md +21 -0
  385. package/docs-llm/dsl/selectors/frame-without-internal-fields.md +17 -0
  386. package/docs-llm/dsl/selectors/frame-without-series-names.md +8 -0
  387. package/docs-llm/dsl/selectors/last-point.md +5 -0
  388. package/docs-llm/dsl/selectors/minus.md +8 -0
  389. package/docs-llm/dsl/selectors/multiply.md +8 -0
  390. package/docs-llm/dsl/selectors/plus.md +8 -0
  391. package/docs-llm/dsl/selectors/point-by-index.md +6 -0
  392. package/docs-llm/dsl/selectors/points-by-indexes.md +6 -0
  393. package/docs-llm/dsl/selectors/round.md +7 -0
  394. package/docs-llm/dsl/selectors/series-by-index-examples-json.md +49 -0
  395. package/docs-llm/dsl/selectors/series-by-index-examples-react.md +39 -0
  396. package/docs-llm/dsl/selectors/series-by-index.md +8 -0
  397. package/docs-llm/dsl/selectors/series-by-name-examples-json.md +49 -0
  398. package/docs-llm/dsl/selectors/series-by-name-examples-react.md +39 -0
  399. package/docs-llm/dsl/selectors/series-by-name.md +8 -0
  400. package/docs-llm/dsl/selectors/series-by-prioritized-types-examples-json.md +47 -0
  401. package/docs-llm/dsl/selectors/series-by-prioritized-types-examples-react.md +39 -0
  402. package/docs-llm/dsl/selectors/series-by-prioritized-types.md +10 -0
  403. package/docs-llm/dsl/selectors/series-by-type-examples-json.md +49 -0
  404. package/docs-llm/dsl/selectors/series-by-type-examples-react.md +39 -0
  405. package/docs-llm/dsl/selectors/series-by-type.md +10 -0
  406. package/docs-llm/dsl/selectors/series-by-types.md +6 -0
  407. package/docs-llm/ellipse/examples-json.md +5 -0
  408. package/docs-llm/ellipse/examples-react.md +5 -0
  409. package/docs-llm/ellipse/options.md +16 -0
  410. package/docs-llm/ellipse/overview.md +5 -0
  411. package/docs-llm/events/examples-json.md +705 -0
  412. package/docs-llm/events/examples-react.md +536 -0
  413. package/docs-llm/events/options.md +18 -0
  414. package/docs-llm/events/overview.md +5 -0
  415. package/docs-llm/filler-gauge/examples-json.md +376 -0
  416. package/docs-llm/filler-gauge/examples-react.md +274 -0
  417. package/docs-llm/filler-gauge/options.md +26 -0
  418. package/docs-llm/filler-gauge/overview.md +5 -0
  419. package/docs-llm/image/examples-json.md +39 -0
  420. package/docs-llm/image/examples-react.md +65 -0
  421. package/docs-llm/image/options.md +13 -0
  422. package/docs-llm/image/overview.md +5 -0
  423. package/docs-llm/line/examples-json.md +3724 -0
  424. package/docs-llm/line/examples-react.md +2683 -0
  425. package/docs-llm/line/options.md +95 -0
  426. package/docs-llm/line/overview.md +29 -0
  427. package/docs-llm/link-graph/examples-json.md +5 -0
  428. package/docs-llm/link-graph/examples-react.md +5 -0
  429. package/docs-llm/link-graph/options.md +26 -0
  430. package/docs-llm/link-graph/overview.md +16 -0
  431. package/docs-llm/map/examples-json.md +13973 -0
  432. package/docs-llm/map/examples-react.md +6154 -0
  433. package/docs-llm/map/options.md +22 -0
  434. package/docs-llm/map/overview.md +32 -0
  435. package/docs-llm/markdown/examples-json.md +63 -0
  436. package/docs-llm/markdown/examples-react.md +98 -0
  437. package/docs-llm/markdown/options.md +17 -0
  438. package/docs-llm/markdown/overview.md +5 -0
  439. package/docs-llm/marker-gauge/examples-json.md +436 -0
  440. package/docs-llm/marker-gauge/examples-react.md +367 -0
  441. package/docs-llm/marker-gauge/options.md +26 -0
  442. package/docs-llm/marker-gauge/overview.md +5 -0
  443. package/docs-llm/network-graph/examples-json.md +8843 -0
  444. package/docs-llm/network-graph/examples-react.md +7339 -0
  445. package/docs-llm/network-graph/options.md +50 -0
  446. package/docs-llm/network-graph/overview.md +28 -0
  447. package/docs-llm/parallel-coordinates/examples-json.md +8376 -0
  448. package/docs-llm/parallel-coordinates/examples-react.md +2771 -0
  449. package/docs-llm/parallel-coordinates/options.md +14 -0
  450. package/docs-llm/parallel-coordinates/overview.md +22 -0
  451. package/docs-llm/pie/examples-json.md +851 -0
  452. package/docs-llm/pie/examples-react.md +606 -0
  453. package/docs-llm/pie/options.md +34 -0
  454. package/docs-llm/pie/overview.md +23 -0
  455. package/docs-llm/process-tree/options.md +32 -0
  456. package/docs-llm/punchcard/examples-json.md +6134 -0
  457. package/docs-llm/punchcard/examples-react.md +4562 -0
  458. package/docs-llm/punchcard/options.md +33 -0
  459. package/docs-llm/punchcard/overview.md +5 -0
  460. package/docs-llm/pure-rich-text/options.md +29 -0
  461. package/docs-llm/rectangle/examples-json.md +5 -0
  462. package/docs-llm/rectangle/examples-react.md +5 -0
  463. package/docs-llm/rectangle/options.md +19 -0
  464. package/docs-llm/rectangle/overview.md +5 -0
  465. package/docs-llm/rich-text/examples-json.md +96 -0
  466. package/docs-llm/rich-text/examples-react.md +119 -0
  467. package/docs-llm/rich-text/options.md +29 -0
  468. package/docs-llm/rich-text/overview.md +5 -0
  469. package/docs-llm/sankey/examples-json.md +844 -0
  470. package/docs-llm/sankey/examples-react.md +546 -0
  471. package/docs-llm/sankey/options.md +19 -0
  472. package/docs-llm/sankey/overview.md +24 -0
  473. package/docs-llm/scatter/examples-json.md +4012 -0
  474. package/docs-llm/scatter/examples-react.md +3914 -0
  475. package/docs-llm/scatter/options.md +68 -0
  476. package/docs-llm/scatter/overview.md +25 -0
  477. package/docs-llm/single-value/examples-json.md +2613 -0
  478. package/docs-llm/single-value/examples-react.md +2296 -0
  479. package/docs-llm/single-value/options.md +49 -0
  480. package/docs-llm/single-value/overview.md +23 -0
  481. package/docs-llm/single-value-icon/examples-json.md +1686 -0
  482. package/docs-llm/single-value-icon/examples-react.md +1573 -0
  483. package/docs-llm/single-value-icon/options.md +43 -0
  484. package/docs-llm/single-value-icon/overview.md +5 -0
  485. package/docs-llm/single-value-radial/examples-json.md +1178 -0
  486. package/docs-llm/single-value-radial/examples-react.md +1028 -0
  487. package/docs-llm/single-value-radial/options.md +41 -0
  488. package/docs-llm/single-value-radial/overview.md +5 -0
  489. package/docs-llm/table/examples-json.md +5 -0
  490. package/docs-llm/table/examples-react.md +5 -0
  491. package/docs-llm/table/options.md +26 -0
  492. package/docs-llm/table/overview.md +24 -0
  493. package/docs-llm/timeline/examples-json.md +5 -0
  494. package/docs-llm/timeline/examples-react.md +5 -0
  495. package/docs-llm/timeline/options.md +27 -0
  496. package/docs-llm/timeline/overview.md +24 -0
  497. package/docs-llm/treemap/examples-json.md +5 -0
  498. package/docs-llm/treemap/examples-react.md +5 -0
  499. package/docs-llm/treemap/options.md +26 -0
  500. package/docs-llm/treemap/overview.md +27 -0
  501. package/package.json +33 -28
package/Map.js CHANGED
@@ -193,104 +193,273 @@ var defaultImport11 = __toESM(require("@splunk/react-ui/Button"));
193
193
  __reExport(Button_exports, require("@splunk/react-ui/Button"));
194
194
  var Button_default = "default" in defaultImport11 ? defaultImport11.default : defaultImport11;
195
195
 
196
+ // esm-externals:@splunk/react-ui/Tooltip
197
+ var Tooltip_exports = {};
198
+ __export(Tooltip_exports, {
199
+ default: () => Tooltip_default
200
+ });
201
+ var defaultImport12 = __toESM(require("@splunk/react-ui/Tooltip"));
202
+ __reExport(Tooltip_exports, require("@splunk/react-ui/Tooltip"));
203
+ var Tooltip_default = "default" in defaultImport12 ? defaultImport12.default : defaultImport12;
204
+
196
205
  // esm-externals:@splunk/visualization-context/MapContext
197
206
  var MapContext_exports = {};
198
207
  __export(MapContext_exports, {
199
208
  default: () => MapContext_default
200
209
  });
201
- var defaultImport12 = __toESM(require("@splunk/visualization-context/MapContext"));
210
+ var defaultImport13 = __toESM(require("@splunk/visualization-context/MapContext"));
202
211
  __reExport(MapContext_exports, require("@splunk/visualization-context/MapContext"));
203
- var MapContext_default = "default" in defaultImport12 ? defaultImport12.default : defaultImport12;
212
+ var MapContext_default = "default" in defaultImport13 ? defaultImport13.default : defaultImport13;
204
213
 
205
214
  // esm-externals:@splunk/visualization-schemas
206
215
  var visualization_schemas_exports = {};
207
216
  __export(visualization_schemas_exports, {
208
217
  default: () => visualization_schemas_default
209
218
  });
210
- var defaultImport13 = __toESM(require("@splunk/visualization-schemas"));
219
+ var defaultImport14 = __toESM(require("@splunk/visualization-schemas"));
211
220
  __reExport(visualization_schemas_exports, require("@splunk/visualization-schemas"));
212
- var visualization_schemas_default = "default" in defaultImport13 ? defaultImport13.default : defaultImport13;
221
+ var visualization_schemas_default = "default" in defaultImport14 ? defaultImport14.default : defaultImport14;
222
+
223
+ // src/common/utils/shadowDomUtils.ts
224
+ var getFloatingLayerStyleTarget = (anchor) => {
225
+ if (!anchor || typeof anchor.getRootNode !== "function") {
226
+ return void 0;
227
+ }
228
+ const rootNode = anchor.getRootNode();
229
+ if (typeof ShadowRoot !== "undefined" && rootNode instanceof ShadowRoot) {
230
+ return anchor.ownerDocument.head;
231
+ }
232
+ return void 0;
233
+ };
213
234
 
214
235
  // esm-externals:@splunk/visualizations-shared/style
215
236
  var style_exports = {};
216
237
  __export(style_exports, {
217
238
  default: () => style_default
218
239
  });
219
- var defaultImport14 = __toESM(require("@splunk/visualizations-shared/style"));
240
+ var defaultImport15 = __toESM(require("@splunk/visualizations-shared/style"));
220
241
  __reExport(style_exports, require("@splunk/visualizations-shared/style"));
221
- var style_default = "default" in defaultImport14 ? defaultImport14.default : defaultImport14;
242
+ var style_default = "default" in defaultImport15 ? defaultImport15.default : defaultImport15;
222
243
 
223
244
  // esm-externals:maplibre-gl/dist/maplibre-gl.css
224
245
  var maplibre_gl_exports2 = {};
225
246
  __export(maplibre_gl_exports2, {
226
247
  default: () => maplibre_gl_default2
227
248
  });
228
- var defaultImport15 = __toESM(require("maplibre-gl/dist/maplibre-gl.css"));
249
+ var defaultImport16 = __toESM(require("maplibre-gl/dist/maplibre-gl.css"));
229
250
  __reExport(maplibre_gl_exports2, require("maplibre-gl/dist/maplibre-gl.css"));
230
- var maplibre_gl_default2 = "default" in defaultImport15 ? defaultImport15.default : defaultImport15;
251
+ var maplibre_gl_default2 = "default" in defaultImport16 ? defaultImport16.default : defaultImport16;
231
252
 
232
253
  // esm-externals:@splunk/visualizations-shared/iconUtils
233
254
  var iconUtils_exports = {};
234
255
  __export(iconUtils_exports, {
235
256
  default: () => iconUtils_default
236
257
  });
237
- var defaultImport16 = __toESM(require("@splunk/visualizations-shared/iconUtils"));
258
+ var defaultImport17 = __toESM(require("@splunk/visualizations-shared/iconUtils"));
238
259
  __reExport(iconUtils_exports, require("@splunk/visualizations-shared/iconUtils"));
239
- var iconUtils_default = "default" in defaultImport16 ? defaultImport16.default : defaultImport16;
260
+ var iconUtils_default = "default" in defaultImport17 ? defaultImport17.default : defaultImport17;
240
261
 
241
262
  // esm-externals:@splunk/visualizations-shared/RemoteIcon
242
263
  var RemoteIcon_exports = {};
243
264
  __export(RemoteIcon_exports, {
244
265
  default: () => RemoteIcon_default
245
266
  });
246
- var defaultImport17 = __toESM(require("@splunk/visualizations-shared/RemoteIcon"));
267
+ var defaultImport18 = __toESM(require("@splunk/visualizations-shared/RemoteIcon"));
247
268
  __reExport(RemoteIcon_exports, require("@splunk/visualizations-shared/RemoteIcon"));
248
- var RemoteIcon_default = "default" in defaultImport17 ? defaultImport17.default : defaultImport17;
269
+ var RemoteIcon_default = "default" in defaultImport18 ? defaultImport18.default : defaultImport18;
249
270
 
250
271
  // esm-externals:@splunk/visualization-context/FeatureFlagContext
251
272
  var FeatureFlagContext_exports = {};
252
273
  __export(FeatureFlagContext_exports, {
253
274
  default: () => FeatureFlagContext_default
254
275
  });
255
- var defaultImport18 = __toESM(require("@splunk/visualization-context/FeatureFlagContext"));
276
+ var defaultImport19 = __toESM(require("@splunk/visualization-context/FeatureFlagContext"));
256
277
  __reExport(FeatureFlagContext_exports, require("@splunk/visualization-context/FeatureFlagContext"));
257
- var FeatureFlagContext_default = "default" in defaultImport18 ? defaultImport18.default : defaultImport18;
278
+ var FeatureFlagContext_default = "default" in defaultImport19 ? defaultImport19.default : defaultImport19;
279
+
280
+ // esm-externals:@splunk/ui-utils/format
281
+ var format_exports = {};
282
+ __export(format_exports, {
283
+ default: () => format_default
284
+ });
285
+ var defaultImport20 = __toESM(require("@splunk/ui-utils/format"));
286
+ __reExport(format_exports, require("@splunk/ui-utils/format"));
287
+ var format_default = "default" in defaultImport20 ? defaultImport20.default : defaultImport20;
288
+
289
+ // src/Map/PureMap/keyboardConstants.ts
290
+ var KEYBOARD_KEYS = {
291
+ ARROW_RIGHT: "ArrowRight",
292
+ ARROW_LEFT: "ArrowLeft",
293
+ ARROW_UP: "ArrowUp",
294
+ ARROW_DOWN: "ArrowDown",
295
+ HOME: "Home",
296
+ END: "End",
297
+ ENTER: "Enter",
298
+ SPACE: " "
299
+ };
300
+
301
+ // esm-externals:@splunk/react-ui/Popover
302
+ var Popover_exports = {};
303
+ __export(Popover_exports, {
304
+ default: () => Popover_default
305
+ });
306
+ var defaultImport21 = __toESM(require("@splunk/react-ui/Popover"));
307
+ __reExport(Popover_exports, require("@splunk/react-ui/Popover"));
308
+ var Popover_default = "default" in defaultImport21 ? defaultImport21.default : defaultImport21;
309
+
310
+ // esm-externals:@splunk/themes
311
+ var themes_exports = {};
312
+ __export(themes_exports, {
313
+ default: () => themes_default
314
+ });
315
+ var defaultImport22 = __toESM(require("@splunk/themes"));
316
+ __reExport(themes_exports, require("@splunk/themes"));
317
+ var themes_default = "default" in defaultImport22 ? defaultImport22.default : defaultImport22;
258
318
 
259
319
  // esm-externals:@splunk/ui-utils/id
260
320
  var id_exports = {};
261
321
  __export(id_exports, {
262
322
  default: () => id_default
263
323
  });
264
- var defaultImport19 = __toESM(require("@splunk/ui-utils/id"));
324
+ var defaultImport23 = __toESM(require("@splunk/ui-utils/id"));
265
325
  __reExport(id_exports, require("@splunk/ui-utils/id"));
266
- var id_default = "default" in defaultImport19 ? defaultImport19.default : defaultImport19;
326
+ var id_default = "default" in defaultImport23 ? defaultImport23.default : defaultImport23;
327
+
328
+ // src/Map/PureMap/Tooltip.tsx
329
+ var StyledPopover = styled_components_default(Popover_default)`
330
+ min-width: 250px;
331
+ max-width: 332px;
332
+ max-width: fit-content;
333
+ font-size: 12px;
334
+ `;
335
+ var StyledTable = styled_components_default.table`
336
+ margin: 2px 6px 2px 6px;
337
+ width: calc(100% - 12px);
338
+ `;
339
+ var StyledTitleColumn = styled_components_default.td`
340
+ opacity: 0.85;
341
+ word-break: break-all;
342
+ vertical-align: top;
343
+ `;
344
+ var StyledValueColumn = styled_components_default.td`
345
+ text-align: right;
346
+ word-break: break-all;
347
+ vertical-align: top;
348
+ `;
349
+ var StyledColorBlock = styled_components_default.div`
350
+ background-color: ${(props) => props.color};
351
+ display: inline-block;
352
+ margin-right: 4px;
353
+ border-radius: 2px;
354
+ width: 6px;
355
+ height: 11px;
356
+ transform: translateY(1px);
357
+ `;
358
+ var StyledIconWrapper = styled_components_default.span`
359
+ margin-left: 4px;
360
+ display: inline-block;
361
+ vertical-align: middle;
362
+ `;
363
+ var StyledTooltipHeader = styled_components_default.thead`
364
+ th {
365
+ height: 16px;
366
+ color: ${themes_exports.variables.contentColorActive};
367
+ padding: 0;
368
+ }
369
+
370
+ span {
371
+ display: block;
372
+ white-space: nowrap;
373
+ overflow: hidden;
374
+ text-overflow: ellipsis;
375
+ width: 100%;
376
+ }
377
+ `;
378
+ var convertDegToDMS = (decimalDegree, type) => {
379
+ const truncate = (n) => n > 0 ? Math.floor(n) : Math.ceil(n);
380
+ const absoluteDegree = Math.abs(decimalDegree);
381
+ let degrees = truncate(absoluteDegree);
382
+ let minutes = truncate((absoluteDegree - degrees) * 60);
383
+ let seconds = Math.round((absoluteDegree - degrees - minutes / 60) * 3600);
384
+ if (seconds === 60) {
385
+ minutes += 1;
386
+ seconds = 0;
387
+ }
388
+ if (minutes === 60) {
389
+ degrees += 1;
390
+ minutes = 0;
391
+ }
392
+ let direction;
393
+ if (type === "longitude") {
394
+ direction = decimalDegree < 0 ? "W" : "E";
395
+ } else if (type === "latitude") {
396
+ direction = decimalDegree < 0 ? "S" : "N";
397
+ }
398
+ return `${degrees}\xB0 ${minutes}' ${seconds}" ${direction}`;
399
+ };
400
+ var Tooltip = ({
401
+ id,
402
+ open,
403
+ anchor,
404
+ latitude,
405
+ longitude,
406
+ areaId,
407
+ areaValue,
408
+ additionalFields = [],
409
+ showCoordinates = true,
410
+ tooltipHeader = null,
411
+ stylesManagedExternally = false,
412
+ onMouseEnter,
413
+ onMouseLeave
414
+ }) => {
415
+ const featureFlagContext = react_exports.useContext(FeatureFlagContext_default);
416
+ const isTooltipIconFlagEnabled = Boolean(featureFlagContext == null ? void 0 : featureFlagContext.visualizations_enableTooltipIcon);
417
+ const styleTarget = stylesManagedExternally ? void 0 : getFloatingLayerStyleTarget(anchor);
418
+ const popover = /* @__PURE__ */ react_exports.createElement(
419
+ StyledPopover,
420
+ {
421
+ id,
422
+ role: "tooltip",
423
+ open,
424
+ animation: false,
425
+ anchor,
426
+ "data-test": "map-marker-tooltip",
427
+ defaultPlacement: "above",
428
+ onMouseEnter,
429
+ onMouseLeave
430
+ },
431
+ /* @__PURE__ */ react_exports.createElement(StyledTable, null, tooltipHeader && /* @__PURE__ */ react_exports.createElement(StyledTooltipHeader, { "data-test": "tooltip-header" }, /* @__PURE__ */ react_exports.createElement("tr", null, /* @__PURE__ */ react_exports.createElement("th", { colSpan: 2 }, /* @__PURE__ */ react_exports.createElement("span", { "data-test": "tooltip-header-value" }, tooltipHeader)))), /* @__PURE__ */ react_exports.createElement("tbody", null, Boolean(areaId && areaValue) && /* @__PURE__ */ react_exports.createElement("tr", null, /* @__PURE__ */ react_exports.createElement(StyledTitleColumn, { "data-test": "area-id" }, areaId), /* @__PURE__ */ react_exports.createElement(StyledValueColumn, { "data-test": "area-value" }, areaValue)), Boolean(showCoordinates && latitude) && /* @__PURE__ */ react_exports.createElement("tr", null, /* @__PURE__ */ react_exports.createElement(StyledTitleColumn, null, (0, i18n_exports._)("Latitude")), /* @__PURE__ */ react_exports.createElement(StyledValueColumn, { "data-test": "latitude" }, convertDegToDMS(latitude, "latitude"))), Boolean(showCoordinates && longitude) && /* @__PURE__ */ react_exports.createElement("tr", null, /* @__PURE__ */ react_exports.createElement(StyledTitleColumn, null, (0, i18n_exports._)("Longitude")), /* @__PURE__ */ react_exports.createElement(StyledValueColumn, { "data-test": "longitude" }, convertDegToDMS(longitude, "longitude"))), additionalFields.filter(({ value }) => value && String(value) !== "0").map(({ name, value, color, icon }) => /* @__PURE__ */ react_exports.createElement("tr", { key: (0, id_exports.createDOMID)() }, /* @__PURE__ */ react_exports.createElement(StyledTitleColumn, { "data-test": "field-title" }, color ? /* @__PURE__ */ react_exports.createElement(StyledColorBlock, { "data-test": "field-color", color }) : null, /* @__PURE__ */ react_exports.createElement("span", null, name, isTooltipIconFlagEnabled && icon && ((0, iconUtils_exports.isRemoteIcon)(icon) || (0, iconUtils_exports.isDataURI)(icon)) ? /* @__PURE__ */ react_exports.createElement(StyledIconWrapper, { "data-test": "field-icon" }, /* @__PURE__ */ react_exports.createElement(RemoteIcon_default, { iconURL: icon, width: 16, height: 16 })) : null)), /* @__PURE__ */ react_exports.createElement(StyledValueColumn, { "data-test": "field-value" }, value)))))
432
+ );
433
+ return styleTarget ? /* @__PURE__ */ react_exports.createElement(styled_components_exports.StyleSheetManager, { target: styleTarget }, popover) : popover;
434
+ };
435
+ var Tooltip_default2 = Tooltip;
267
436
 
268
437
  // esm-externals:d3-scale
269
438
  var d3_scale_exports = {};
270
439
  __export(d3_scale_exports, {
271
440
  default: () => d3_scale_default
272
441
  });
273
- var defaultImport20 = __toESM(require("d3-scale"));
442
+ var defaultImport24 = __toESM(require("d3-scale"));
274
443
  __reExport(d3_scale_exports, require("d3-scale"));
275
- var d3_scale_default = "default" in defaultImport20 ? defaultImport20.default : defaultImport20;
444
+ var d3_scale_default = "default" in defaultImport24 ? defaultImport24.default : defaultImport24;
276
445
 
277
446
  // esm-externals:@splunk/visualization-color-palettes
278
447
  var visualization_color_palettes_exports = {};
279
448
  __export(visualization_color_palettes_exports, {
280
449
  default: () => visualization_color_palettes_default
281
450
  });
282
- var defaultImport21 = __toESM(require("@splunk/visualization-color-palettes"));
451
+ var defaultImport25 = __toESM(require("@splunk/visualization-color-palettes"));
283
452
  __reExport(visualization_color_palettes_exports, require("@splunk/visualization-color-palettes"));
284
- var visualization_color_palettes_default = "default" in defaultImport21 ? defaultImport21.default : defaultImport21;
453
+ var visualization_color_palettes_default = "default" in defaultImport25 ? defaultImport25.default : defaultImport25;
285
454
 
286
455
  // esm-externals:@splunk/visualization-encoding/utils/types
287
456
  var types_exports = {};
288
457
  __export(types_exports, {
289
458
  default: () => types_default
290
459
  });
291
- var defaultImport22 = __toESM(require("@splunk/visualization-encoding/utils/types"));
460
+ var defaultImport26 = __toESM(require("@splunk/visualization-encoding/utils/types"));
292
461
  __reExport(types_exports, require("@splunk/visualization-encoding/utils/types"));
293
- var types_default = "default" in defaultImport22 ? defaultImport22.default : defaultImport22;
462
+ var types_default = "default" in defaultImport26 ? defaultImport26.default : defaultImport26;
294
463
 
295
464
  // src/Map/PureMap/MapUtils.ts
296
465
  var MAX_LATITUDE = 90;
@@ -474,7 +643,7 @@ var transposeArray = (array2) => {
474
643
  if (!(array2 == null ? void 0 : array2.length) || !((_a = array2[0]) == null ? void 0 : _a.length)) {
475
644
  return [];
476
645
  }
477
- return array2[0].map((_7, i) => array2.map((row) => row[i]));
646
+ return array2[0].map((_10, i) => array2.map((row) => row[i]));
478
647
  };
479
648
  var sanitizeValues = (values) => {
480
649
  if (!values) {
@@ -652,122 +821,30 @@ var formatMetadata = (choroplethLayer, i) => {
652
821
  }, base);
653
822
  };
654
823
 
655
- // esm-externals:@splunk/react-ui/Popover
656
- var Popover_exports = {};
657
- __export(Popover_exports, {
658
- default: () => Popover_default
659
- });
660
- var defaultImport23 = __toESM(require("@splunk/react-ui/Popover"));
661
- __reExport(Popover_exports, require("@splunk/react-ui/Popover"));
662
- var Popover_default = "default" in defaultImport23 ? defaultImport23.default : defaultImport23;
663
-
664
- // esm-externals:@splunk/themes
665
- var themes_exports = {};
666
- __export(themes_exports, {
667
- default: () => themes_default
668
- });
669
- var defaultImport24 = __toESM(require("@splunk/themes"));
670
- __reExport(themes_exports, require("@splunk/themes"));
671
- var themes_default = "default" in defaultImport24 ? defaultImport24.default : defaultImport24;
672
-
673
- // src/Map/PureMap/Tooltip.tsx
674
- var StyledPopover = styled_components_default(Popover_default)`
675
- min-width: 250px;
676
- max-width: 332px;
677
- max-width: fit-content;
678
- font-size: 12px;
679
- `;
680
- var StyledTable = styled_components_default.table`
681
- margin: 2px 6px 2px 6px;
682
- width: calc(100% - 12px);
683
- `;
684
- var StyledTitleColumn = styled_components_default.td`
685
- opacity: 0.85;
686
- word-break: break-all;
687
- vertical-align: top;
688
- `;
689
- var StyledValueColumn = styled_components_default.td`
690
- text-align: right;
691
- word-break: break-all;
692
- vertical-align: top;
693
- `;
694
- var StyledColorBlock = styled_components_default.div`
695
- background-color: ${(props) => props.color};
696
- display: inline-block;
697
- margin-right: 4px;
698
- border-radius: 2px;
699
- width: 6px;
700
- height: 11px;
701
- transform: translateY(1px);
702
- `;
703
- var StyledIconWrapper = styled_components_default.span`
704
- margin-left: 4px;
705
- display: inline-block;
706
- vertical-align: middle;
707
- `;
708
- var StyledTooltipHeader = styled_components_default.thead`
709
- th {
710
- height: 16px;
711
- color: ${themes_exports.variables.contentColorActive};
712
- padding: 0;
713
- }
714
-
715
- span {
716
- display: block;
717
- white-space: nowrap;
718
- overflow: hidden;
719
- text-overflow: ellipsis;
720
- width: 100%;
721
- }
722
- `;
723
- var convertDegToDMS = (decimalDegree, type) => {
724
- const truncate = (n) => n > 0 ? Math.floor(n) : Math.ceil(n);
725
- const absoluteDegree = Math.abs(decimalDegree);
726
- let degrees = truncate(absoluteDegree);
727
- let minutes = truncate((absoluteDegree - degrees) * 60);
728
- let seconds = Math.round((absoluteDegree - degrees - minutes / 60) * 3600);
729
- if (seconds === 60) {
730
- minutes += 1;
731
- seconds = 0;
732
- }
733
- if (minutes === 60) {
734
- degrees += 1;
735
- minutes = 0;
736
- }
737
- let direction;
738
- if (type === "longitude") {
739
- direction = decimalDegree < 0 ? "W" : "E";
740
- } else if (type === "latitude") {
741
- direction = decimalDegree < 0 ? "S" : "N";
824
+ // src/Map/PureMap/MapContext.tsx
825
+ var MapContext = react_exports.createContext({
826
+ activeTooltipId: null,
827
+ setActiveTooltipId: () => {
828
+ },
829
+ activeChoroplethId: null,
830
+ setActiveChoroplethId: () => {
742
831
  }
743
- return `${degrees}\xB0 ${minutes}' ${seconds}" ${direction}`;
744
- };
745
- var Tooltip = ({
746
- open,
747
- anchor,
748
- latitude,
749
- longitude,
750
- areaId,
751
- areaValue,
752
- additionalFields = [],
753
- showCoordinates = true,
754
- tooltipHeader = null
755
- }) => {
756
- const featureFlagContext = react_exports.useContext(FeatureFlagContext_default);
757
- const isTooltipIconFlagEnabled = Boolean(featureFlagContext == null ? void 0 : featureFlagContext.visualizations_enableTooltipIcon);
758
- return /* @__PURE__ */ react_exports.createElement(
759
- StyledPopover,
760
- {
761
- open,
762
- animation: false,
763
- anchor,
764
- "data-test": "map-marker-tooltip",
765
- defaultPlacement: "above"
766
- },
767
- /* @__PURE__ */ react_exports.createElement(StyledTable, null, tooltipHeader && /* @__PURE__ */ react_exports.createElement(StyledTooltipHeader, { "data-test": "tooltip-header" }, /* @__PURE__ */ react_exports.createElement("tr", null, /* @__PURE__ */ react_exports.createElement("th", { colSpan: 2 }, /* @__PURE__ */ react_exports.createElement("span", { "data-test": "tooltip-header-value" }, tooltipHeader)))), /* @__PURE__ */ react_exports.createElement("tbody", null, Boolean(areaId && areaValue) && /* @__PURE__ */ react_exports.createElement("tr", null, /* @__PURE__ */ react_exports.createElement(StyledTitleColumn, { "data-test": "area-id" }, areaId), /* @__PURE__ */ react_exports.createElement(StyledValueColumn, { "data-test": "area-value" }, areaValue)), Boolean(showCoordinates && latitude) && /* @__PURE__ */ react_exports.createElement("tr", null, /* @__PURE__ */ react_exports.createElement(StyledTitleColumn, null, (0, i18n_exports._)("Latitude")), /* @__PURE__ */ react_exports.createElement(StyledValueColumn, { "data-test": "latitude" }, convertDegToDMS(latitude, "latitude"))), Boolean(showCoordinates && longitude) && /* @__PURE__ */ react_exports.createElement("tr", null, /* @__PURE__ */ react_exports.createElement(StyledTitleColumn, null, (0, i18n_exports._)("Longitude")), /* @__PURE__ */ react_exports.createElement(StyledValueColumn, { "data-test": "longitude" }, convertDegToDMS(longitude, "longitude"))), additionalFields.filter(({ value }) => value && String(value) !== "0").map(({ name, value, color, icon }) => /* @__PURE__ */ react_exports.createElement("tr", { key: (0, id_exports.createDOMID)() }, /* @__PURE__ */ react_exports.createElement(StyledTitleColumn, { "data-test": "field-title" }, color ? /* @__PURE__ */ react_exports.createElement(StyledColorBlock, { "data-test": "field-color", color }) : null, /* @__PURE__ */ react_exports.createElement("span", null, name, isTooltipIconFlagEnabled && icon && ((0, iconUtils_exports.isRemoteIcon)(icon) || (0, iconUtils_exports.isDataURI)(icon)) ? /* @__PURE__ */ react_exports.createElement(StyledIconWrapper, { "data-test": "field-icon" }, /* @__PURE__ */ react_exports.createElement(RemoteIcon_default, { iconURL: icon, width: 16, height: 16 })) : null)), /* @__PURE__ */ react_exports.createElement(StyledValueColumn, { "data-test": "field-value" }, value)))))
832
+ });
833
+ var MapProvider = ({ children }) => {
834
+ const [activeTooltipId, setActiveTooltipId] = react_exports.useState(null);
835
+ const [activeChoroplethId, setActiveChoroplethId] = react_exports.useState(null);
836
+ const value = react_exports.useMemo(
837
+ () => ({
838
+ activeTooltipId,
839
+ setActiveTooltipId,
840
+ activeChoroplethId,
841
+ setActiveChoroplethId
842
+ }),
843
+ [activeTooltipId, activeChoroplethId]
768
844
  );
845
+ return /* @__PURE__ */ react_exports.createElement(MapContext.Provider, { value }, children);
769
846
  };
770
- var Tooltip_default = Tooltip;
847
+ var useMapContext = () => react_exports.useContext(MapContext);
771
848
 
772
849
  // src/Map/PureMap/MarkerWrapper.tsx
773
850
  var MarkerWrapper = (_a) => {
@@ -779,9 +856,10 @@ var MarkerWrapper = (_a) => {
779
856
  additionalFields = [],
780
857
  tooltipHeader = null,
781
858
  map,
782
- isChoroplethTooltipOpen,
783
859
  children,
784
- showCoordinates = true
860
+ showCoordinates = true,
861
+ stylesManagedExternally = false,
862
+ customMarkerId
785
863
  } = _b, otherProps = __objRest(_b, [
786
864
  "longitude",
787
865
  "latitude",
@@ -790,19 +868,120 @@ var MarkerWrapper = (_a) => {
790
868
  "additionalFields",
791
869
  "tooltipHeader",
792
870
  "map",
793
- "isChoroplethTooltipOpen",
794
871
  "children",
795
- "showCoordinates"
872
+ "showCoordinates",
873
+ "stylesManagedExternally",
874
+ "customMarkerId"
796
875
  ]);
797
876
  const container = react_exports.useRef();
798
877
  const marker = react_exports.useRef();
799
878
  const [isTooltipOpen, setTooltipOpenStatus] = react_exports.useState(false);
800
- const isChoroplethTooltip = react_exports.useCallback(
801
- () => isChoroplethTooltipOpen !== void 0,
802
- [isChoroplethTooltipOpen]
879
+ const [isFocused, setIsFocused] = react_exports.useState(false);
880
+ const [isHovered, setIsHovered] = react_exports.useState(false);
881
+ const [isPopoverHovered, setIsPopoverHovered] = react_exports.useState(false);
882
+ const tooltipId = react_exports.useMemo(() => (0, id_exports.createDOMID)(), []);
883
+ const pendingMoveEndHandler = react_exports.useRef(null);
884
+ const closeTimeoutRef = react_exports.useRef(null);
885
+ const generatedMarkerId = react_exports.useMemo(() => (0, id_exports.createDOMID)(), []);
886
+ const markerId = customMarkerId || generatedMarkerId;
887
+ const { activeTooltipId, setActiveTooltipId } = useMapContext();
888
+ const mapMoveHandlerRef = react_exports.useRef(null);
889
+ const openTooltip = react_exports.useCallback(() => {
890
+ setActiveTooltipId(markerId);
891
+ setTooltipOpenStatus(true);
892
+ }, [markerId, setActiveTooltipId]);
893
+ const cleanupPendingMoveEnd = react_exports.useCallback(() => {
894
+ if (pendingMoveEndHandler.current && map.current && typeof map.current.off === "function") {
895
+ map.current.off("moveend", pendingMoveEndHandler.current);
896
+ pendingMoveEndHandler.current = null;
897
+ }
898
+ }, [map]);
899
+ const cleanupMapMoveHandler = react_exports.useCallback(() => {
900
+ if (mapMoveHandlerRef.current && map.current && typeof map.current.off === "function") {
901
+ map.current.off("move", mapMoveHandlerRef.current);
902
+ mapMoveHandlerRef.current = null;
903
+ }
904
+ }, [map]);
905
+ const shouldCloseTooltip = react_exports.useCallback(
906
+ (focused, hovered, popoverHovered) => {
907
+ return !focused && !hovered && !popoverHovered;
908
+ },
909
+ []
803
910
  );
804
- const openTooltip = react_exports.useCallback(() => setTooltipOpenStatus(true), []);
805
- const closeTooltip = react_exports.useCallback(() => setTooltipOpenStatus(false), []);
911
+ const cancelCloseTimeout = react_exports.useCallback(() => {
912
+ if (closeTimeoutRef.current) {
913
+ clearTimeout(closeTimeoutRef.current);
914
+ closeTimeoutRef.current = null;
915
+ }
916
+ }, []);
917
+ const closeTooltipIfShould = react_exports.useCallback(
918
+ (focused, hovered, popoverHovered) => {
919
+ cancelCloseTimeout();
920
+ if (shouldCloseTooltip(focused, hovered, popoverHovered)) {
921
+ closeTimeoutRef.current = setTimeout(() => {
922
+ setTooltipOpenStatus(false);
923
+ setActiveTooltipId((currentId) => currentId === markerId ? null : currentId);
924
+ closeTimeoutRef.current = null;
925
+ }, 100);
926
+ }
927
+ },
928
+ [shouldCloseTooltip, markerId, setActiveTooltipId, cancelCloseTimeout]
929
+ );
930
+ const handleMouseEnter = react_exports.useCallback(() => {
931
+ cancelCloseTimeout();
932
+ setIsHovered(true);
933
+ openTooltip();
934
+ }, [openTooltip, cancelCloseTimeout]);
935
+ const handleMouseLeave = react_exports.useCallback(() => {
936
+ setIsHovered(false);
937
+ closeTooltipIfShould(isFocused, false, isPopoverHovered);
938
+ }, [isFocused, isPopoverHovered, closeTooltipIfShould]);
939
+ const handlePopoverMouseEnter = react_exports.useCallback(() => {
940
+ cancelCloseTimeout();
941
+ setIsPopoverHovered(true);
942
+ }, [cancelCloseTimeout]);
943
+ const handlePopoverMouseLeave = react_exports.useCallback(() => {
944
+ setIsPopoverHovered(false);
945
+ closeTooltipIfShould(isFocused, isHovered, false);
946
+ }, [isFocused, isHovered, closeTooltipIfShould]);
947
+ const handleBlur = react_exports.useCallback(() => {
948
+ setIsFocused(false);
949
+ cleanupPendingMoveEnd();
950
+ closeTooltipIfShould(false, isHovered, isPopoverHovered);
951
+ }, [isHovered, isPopoverHovered, cleanupPendingMoveEnd, closeTooltipIfShould]);
952
+ const handleEscapeKey = react_exports.useCallback(
953
+ (e) => {
954
+ if (e.key === "Escape" && activeTooltipId === markerId) {
955
+ cancelCloseTimeout();
956
+ setIsFocused(false);
957
+ setIsHovered(false);
958
+ setIsPopoverHovered(false);
959
+ cleanupPendingMoveEnd();
960
+ setTooltipOpenStatus(false);
961
+ setActiveTooltipId(null);
962
+ }
963
+ },
964
+ [activeTooltipId, markerId, cleanupPendingMoveEnd, setActiveTooltipId, cancelCloseTimeout]
965
+ );
966
+ const handleFocus = react_exports.useCallback(() => {
967
+ cleanupPendingMoveEnd();
968
+ if (map.current && longitude !== void 0 && latitude !== void 0 && typeof map.current.once === "function") {
969
+ const bounds = map.current.getBounds();
970
+ if (!bounds.contains([longitude, latitude])) {
971
+ const moveEndHandler = () => {
972
+ pendingMoveEndHandler.current = null;
973
+ setIsFocused(true);
974
+ openTooltip();
975
+ };
976
+ pendingMoveEndHandler.current = moveEndHandler;
977
+ map.current.once("moveend", moveEndHandler);
978
+ map.current.panTo([longitude, latitude]);
979
+ return;
980
+ }
981
+ }
982
+ setIsFocused(true);
983
+ openTooltip();
984
+ }, [openTooltip, map, longitude, latitude, cleanupPendingMoveEnd]);
806
985
  const cleanupMarker = react_exports.useCallback(() => {
807
986
  if (marker.current) {
808
987
  marker.current.remove();
@@ -823,40 +1002,231 @@ var MarkerWrapper = (_a) => {
823
1002
  cleanupMarker();
824
1003
  }
825
1004
  }, [latitude, longitude, map]);
826
- react_exports.useEffect(() => cleanupMarker, []);
1005
+ react_exports.useEffect(() => {
1006
+ if (isTooltipOpen && activeTooltipId === markerId) {
1007
+ document.addEventListener("keydown", handleEscapeKey);
1008
+ return () => {
1009
+ document.removeEventListener("keydown", handleEscapeKey);
1010
+ };
1011
+ }
1012
+ return void 0;
1013
+ }, [isTooltipOpen, activeTooltipId, markerId, handleEscapeKey]);
1014
+ react_exports.useEffect(() => {
1015
+ if (isTooltipOpen && activeTooltipId !== markerId && activeTooltipId !== null) {
1016
+ setTooltipOpenStatus(false);
1017
+ }
1018
+ }, [activeTooltipId, markerId, isTooltipOpen]);
1019
+ react_exports.useEffect(() => {
1020
+ if (!isTooltipOpen && activeTooltipId === null && (isFocused || isHovered || isPopoverHovered)) {
1021
+ openTooltip();
1022
+ }
1023
+ }, [activeTooltipId, isTooltipOpen, isFocused, isHovered, isPopoverHovered, openTooltip]);
1024
+ react_exports.useEffect(() => {
1025
+ if (!customMarkerId) return;
1026
+ if (activeTooltipId === markerId) {
1027
+ setTooltipOpenStatus(true);
1028
+ } else {
1029
+ setTooltipOpenStatus(false);
1030
+ }
1031
+ }, [customMarkerId, activeTooltipId, markerId]);
1032
+ const [, forceUpdate] = react_exports.useReducer((x) => x + 1, 0);
1033
+ react_exports.useEffect(() => {
1034
+ if (!isTooltipOpen || !map.current || typeof map.current.on !== "function") {
1035
+ return void 0;
1036
+ }
1037
+ let rafId = null;
1038
+ const handleMapMove = () => {
1039
+ if (rafId === null) {
1040
+ rafId = requestAnimationFrame(() => {
1041
+ forceUpdate();
1042
+ rafId = null;
1043
+ });
1044
+ }
1045
+ };
1046
+ mapMoveHandlerRef.current = handleMapMove;
1047
+ map.current.on("move", handleMapMove);
1048
+ return () => {
1049
+ if (rafId !== null) {
1050
+ cancelAnimationFrame(rafId);
1051
+ }
1052
+ cleanupMapMoveHandler();
1053
+ };
1054
+ }, [isTooltipOpen, map, cleanupMapMoveHandler]);
1055
+ react_exports.useEffect(
1056
+ () => () => {
1057
+ cancelCloseTimeout();
1058
+ cleanupPendingMoveEnd();
1059
+ cleanupMapMoveHandler();
1060
+ cleanupMarker();
1061
+ },
1062
+ [cancelCloseTimeout, cleanupPendingMoveEnd, cleanupMapMoveHandler, cleanupMarker]
1063
+ );
827
1064
  const filteredAdditionalFields = additionalFields.filter(({ value }) => value && String(value) !== "0");
828
- const showTooltip = showCoordinates || filteredAdditionalFields.length || areaId && areaValue;
829
- return /* @__PURE__ */ react_exports.createElement("div", { style: { visibility: isChoroplethTooltip() ? "hidden" : "visible" } }, /* @__PURE__ */ react_exports.createElement(
1065
+ const showTooltip = showCoordinates || filteredAdditionalFields.length || areaId && !Number.isNaN(areaValue);
1066
+ const isTooltipVisible = activeTooltipId === markerId && (isTooltipOpen || customMarkerId !== void 0);
1067
+ const childrenWithTooltipId = react_exports.useMemo(() => {
1068
+ if (!children) return null;
1069
+ if (!react_exports.isValidElement(children)) return children;
1070
+ return react_exports.cloneElement(children, {
1071
+ "aria-describedby": tooltipId
1072
+ });
1073
+ }, [children, tooltipId]);
1074
+ return /* @__PURE__ */ react_exports.createElement("div", null, /* @__PURE__ */ react_exports.createElement(
830
1075
  "div",
831
1076
  __spreadValues({
832
- style: {
833
- visibility: isChoroplethTooltip() ? "hidden" : "visible"
834
- },
835
1077
  ref: container,
836
1078
  "data-test": "map-marker",
837
- onMouseOver: openTooltip,
838
- onMouseLeave: closeTooltip,
839
- onFocus: openTooltip,
840
- onBlur: closeTooltip
1079
+ onMouseEnter: handleMouseEnter,
1080
+ onMouseLeave: handleMouseLeave,
1081
+ onFocus: handleFocus,
1082
+ onBlur: handleBlur
841
1083
  }, otherProps),
842
- children
1084
+ childrenWithTooltipId
843
1085
  ), /* @__PURE__ */ react_exports.createElement("div", null, showTooltip && /* @__PURE__ */ react_exports.createElement(
844
- Tooltip_default,
1086
+ Tooltip_default2,
845
1087
  {
846
- open: isChoroplethTooltip() ? isChoroplethTooltipOpen : isTooltipOpen,
1088
+ id: tooltipId,
1089
+ open: isTooltipVisible,
847
1090
  anchor: container.current,
848
- latitude: isChoroplethTooltip() ? null : latitude,
849
- longitude: isChoroplethTooltip() ? null : longitude,
1091
+ latitude: showCoordinates ? latitude : null,
1092
+ longitude: showCoordinates ? longitude : null,
850
1093
  areaId,
851
1094
  areaValue,
852
1095
  additionalFields,
853
1096
  showCoordinates,
854
- tooltipHeader
1097
+ tooltipHeader,
1098
+ stylesManagedExternally,
1099
+ onMouseEnter: handlePopoverMouseEnter,
1100
+ onMouseLeave: handlePopoverMouseLeave
855
1101
  }
856
1102
  )));
857
1103
  };
858
1104
  var MarkerWrapper_default = MarkerWrapper;
859
1105
 
1106
+ // src/Map/PureMap/useRovingTabindex.ts
1107
+ var useRovingTabindex = (map) => {
1108
+ const elementRefsRef = react_exports.useRef(
1109
+ new globalThis.Map()
1110
+ );
1111
+ const focusedIndexRef = react_exports.useRef(0);
1112
+ const moveFocusOnElementRemove = react_exports.useCallback((removedElementIndex) => {
1113
+ const removedElement = elementRefsRef.current.get(removedElementIndex);
1114
+ const wasFocused = (removedElement == null ? void 0 : removedElement.getAttribute("tabindex")) === "0";
1115
+ elementRefsRef.current.delete(removedElementIndex);
1116
+ if (wasFocused) {
1117
+ let replacementIndex = null;
1118
+ const indices = Array.from(elementRefsRef.current.keys()).sort((a, b) => a - b);
1119
+ const nextIndex = indices.find((i) => i > removedElementIndex);
1120
+ if (nextIndex !== void 0) {
1121
+ replacementIndex = nextIndex;
1122
+ } else if (indices.length > 0) {
1123
+ replacementIndex = indices[indices.length - 1];
1124
+ }
1125
+ if (replacementIndex !== null) {
1126
+ focusedIndexRef.current = replacementIndex;
1127
+ const replacementElement = elementRefsRef.current.get(replacementIndex);
1128
+ if (replacementElement) {
1129
+ replacementElement.setAttribute("tabindex", "0");
1130
+ }
1131
+ } else {
1132
+ focusedIndexRef.current = 0;
1133
+ }
1134
+ }
1135
+ }, []);
1136
+ const setElementRef = react_exports.useCallback(
1137
+ (index, element) => {
1138
+ if (element) {
1139
+ const existingElement = elementRefsRef.current.get(index);
1140
+ const hadFocus = (existingElement == null ? void 0 : existingElement.getAttribute("tabindex")) === "0";
1141
+ elementRefsRef.current.set(index, element);
1142
+ if (hadFocus) {
1143
+ element.setAttribute("tabindex", "0");
1144
+ } else {
1145
+ element.setAttribute("tabindex", index === focusedIndexRef.current ? "0" : "-1");
1146
+ }
1147
+ } else {
1148
+ moveFocusOnElementRemove(index);
1149
+ }
1150
+ },
1151
+ [moveFocusOnElementRemove]
1152
+ );
1153
+ const resolveFocusedIndex = react_exports.useCallback(() => {
1154
+ let currentIndex = focusedIndexRef.current;
1155
+ if (!elementRefsRef.current.has(currentIndex)) {
1156
+ for (const [index, element] of elementRefsRef.current.entries()) {
1157
+ if (element.getAttribute("tabindex") === "0") {
1158
+ currentIndex = index;
1159
+ focusedIndexRef.current = index;
1160
+ break;
1161
+ }
1162
+ }
1163
+ }
1164
+ return currentIndex;
1165
+ }, []);
1166
+ const handleKeyDown = react_exports.useCallback(
1167
+ (e) => {
1168
+ const currentIndex = resolveFocusedIndex();
1169
+ const count = elementRefsRef.current.size;
1170
+ let newIndex;
1171
+ switch (e.key) {
1172
+ case KEYBOARD_KEYS.ARROW_RIGHT:
1173
+ case KEYBOARD_KEYS.ARROW_DOWN:
1174
+ e.preventDefault();
1175
+ newIndex = currentIndex === count - 1 ? 0 : currentIndex + 1;
1176
+ break;
1177
+ case KEYBOARD_KEYS.ARROW_LEFT:
1178
+ case KEYBOARD_KEYS.ARROW_UP:
1179
+ e.preventDefault();
1180
+ newIndex = currentIndex === 0 ? count - 1 : currentIndex - 1;
1181
+ break;
1182
+ case KEYBOARD_KEYS.HOME:
1183
+ e.preventDefault();
1184
+ newIndex = 0;
1185
+ break;
1186
+ case KEYBOARD_KEYS.END:
1187
+ e.preventDefault();
1188
+ newIndex = count - 1;
1189
+ break;
1190
+ default:
1191
+ return;
1192
+ }
1193
+ if (newIndex !== currentIndex) {
1194
+ focusedIndexRef.current = newIndex;
1195
+ const oldElement = elementRefsRef.current.get(currentIndex);
1196
+ const newElement = elementRefsRef.current.get(newIndex);
1197
+ if (oldElement) {
1198
+ oldElement.setAttribute("tabindex", "-1");
1199
+ }
1200
+ if (newElement) {
1201
+ newElement.setAttribute("tabindex", "0");
1202
+ requestAnimationFrame(() => {
1203
+ newElement.focus();
1204
+ });
1205
+ }
1206
+ }
1207
+ },
1208
+ [resolveFocusedIndex]
1209
+ );
1210
+ const handleFocus = react_exports.useCallback(() => {
1211
+ var _a;
1212
+ if ((_a = map.current) == null ? void 0 : _a.keyboard) {
1213
+ map.current.keyboard.disable();
1214
+ }
1215
+ }, [map]);
1216
+ const handleBlur = react_exports.useCallback(() => {
1217
+ var _a;
1218
+ if ((_a = map.current) == null ? void 0 : _a.keyboard) {
1219
+ map.current.keyboard.enable();
1220
+ }
1221
+ }, [map]);
1222
+ return {
1223
+ handleKeyDown,
1224
+ handleFocus,
1225
+ handleBlur,
1226
+ setElementRef
1227
+ };
1228
+ };
1229
+
860
1230
  // src/Map/PureMap/BubbleLayer.tsx
861
1231
  var GEO_BOUND_PREFIX = "_geo_bounds_";
862
1232
  var GEO_LAT_AND_LONG_FIELD = ["_geo_long_field", "_geo_lat_field"];
@@ -869,21 +1239,51 @@ var PieSegment = react_exports.memo(
869
1239
  color,
870
1240
  themeColor,
871
1241
  segmentMetadata,
872
- handleBubbleClick
1242
+ handleBubbleClick,
1243
+ ariaLabel,
1244
+ "aria-describedby": ariaDescribedBy,
1245
+ onKeyDown,
1246
+ onFocus,
1247
+ onBlur,
1248
+ elementRef,
1249
+ hasEventHandlers
873
1250
  }) => {
874
1251
  const { name, value } = segmentMetadata != null ? segmentMetadata : {};
875
- const handleSegmentClick = react_exports.useCallback(
1252
+ const handleInteraction = react_exports.useCallback(
876
1253
  (e) => {
1254
+ if ("key" in e && e.key !== KEYBOARD_KEYS.ENTER && e.key !== KEYBOARD_KEYS.SPACE) {
1255
+ return;
1256
+ }
1257
+ e.preventDefault();
877
1258
  handleBubbleClick(e, name, value);
878
1259
  },
879
1260
  [name, value, handleBubbleClick]
880
1261
  );
1262
+ const handleKeyDown = react_exports.useCallback(
1263
+ (e) => {
1264
+ if (hasEventHandlers && (e.key === KEYBOARD_KEYS.ENTER || e.key === KEYBOARD_KEYS.SPACE)) {
1265
+ handleInteraction(e);
1266
+ }
1267
+ if (onKeyDown) {
1268
+ onKeyDown(e);
1269
+ }
1270
+ },
1271
+ [hasEventHandlers, handleInteraction, onKeyDown]
1272
+ );
881
1273
  if (end - start === 1) {
882
1274
  return /* @__PURE__ */ react_exports.createElement(
883
1275
  BubbleSegment,
884
1276
  {
1277
+ $hasEventHandlers: hasEventHandlers,
1278
+ ref: elementRef,
885
1279
  as: "circle",
886
- onClick: handleSegmentClick,
1280
+ role: hasEventHandlers ? "button" : "graphics-symbol",
1281
+ "aria-label": ariaLabel,
1282
+ "aria-describedby": ariaDescribedBy,
1283
+ onClick: hasEventHandlers ? handleInteraction : void 0,
1284
+ onKeyDown: handleKeyDown,
1285
+ onFocus,
1286
+ onBlur,
887
1287
  cx: radius,
888
1288
  cy: radius,
889
1289
  r: radius,
@@ -904,8 +1304,16 @@ var PieSegment = react_exports.memo(
904
1304
  return /* @__PURE__ */ react_exports.createElement(
905
1305
  BubbleSegment,
906
1306
  {
1307
+ $hasEventHandlers: hasEventHandlers,
1308
+ ref: elementRef,
907
1309
  as: "path",
908
- onClick: handleSegmentClick,
1310
+ role: hasEventHandlers ? "button" : "graphics-symbol",
1311
+ "aria-label": ariaLabel,
1312
+ "aria-describedby": ariaDescribedBy,
1313
+ onClick: hasEventHandlers ? handleInteraction : void 0,
1314
+ onKeyDown: handleKeyDown,
1315
+ onFocus,
1316
+ onBlur,
909
1317
  d: `M ${radius} ${radius} L ${radius + radius * x0} ${radius + radius * y0} A ${radius} ${radius} 0 ${arc} 1 ${radius + radius * x1} ${radius + radius * y1} L ${radius} ${radius} A 0 0 0 ${arc} 0 ${radius} ${radius}`,
910
1318
  fill: color,
911
1319
  fillOpacity: 0.8,
@@ -916,18 +1324,126 @@ var PieSegment = react_exports.memo(
916
1324
  );
917
1325
  }
918
1326
  );
919
- PieSegment.displayName = "MapBubblePieSegment";
920
- var BubbleSegment = styled_components_default.path`
921
- transition: 0.2s ease-in-out;
922
- transition-property: fill, stroke;
923
- `;
924
- var BUBBLE_SEGMENT_DIMMED_STYLES = {
925
- fill: "rgba(150, 150, 150, 0.3)",
926
- stroke: "rgba(200, 200, 200, 0.4)"
927
- };
928
- var StyledMarkerWrapper = styled_components_default(MarkerWrapper_default)`
929
- cursor: pointer;
930
- `;
1327
+ PieSegment.displayName = "MapBubblePieSegment";
1328
+ var BubbleSegment = styled_components_default.path`
1329
+ transition: 0.2s ease-in-out;
1330
+ transition-property: fill, stroke;
1331
+ ${({ $hasEventHandlers }) => $hasEventHandlers && "cursor: pointer;"}
1332
+
1333
+ &:focus {
1334
+ outline: none;
1335
+ }
1336
+ `;
1337
+ var BUBBLE_SEGMENT_DIMMED_STYLES = {
1338
+ fill: "rgba(150, 150, 150, 0.3)",
1339
+ stroke: "rgba(200, 200, 200, 0.4)"
1340
+ };
1341
+ var BubbleSvg = react_exports.memo(
1342
+ ({
1343
+ values,
1344
+ valueRange,
1345
+ tooltipHeader,
1346
+ latitude,
1347
+ longitude,
1348
+ icon,
1349
+ isPie,
1350
+ themeColor,
1351
+ segmentStartIndex,
1352
+ colors,
1353
+ bubbleSize,
1354
+ onClick,
1355
+ "aria-describedby": ariaDescribedBy,
1356
+ onKeyDown,
1357
+ onFocus,
1358
+ onBlur,
1359
+ setElementRef,
1360
+ hasEventHandlers
1361
+ }) => {
1362
+ const featureFlagContext = react_exports.useContext(FeatureFlagContext_default);
1363
+ const isBubbleMapIconFlagEnabled = Boolean(featureFlagContext == null ? void 0 : featureFlagContext.visualizations_enableBubbleMapIcon);
1364
+ const total = values.reduce((totalValue, v) => totalValue + v, 0);
1365
+ const radius = matchBubbleSize(valueRange, total);
1366
+ const getAriaLabel = react_exports.useCallback(
1367
+ (segmentName, segmentValue) => {
1368
+ let segmentLabel = (0, i18n_exports._)("Map marker");
1369
+ if (tooltipHeader) {
1370
+ segmentLabel = tooltipHeader;
1371
+ } else if (latitude !== void 0 && longitude !== void 0) {
1372
+ segmentLabel = (0, format_exports.sprintf)((0, i18n_exports._)("Location: %(lat)s, %(lng)s"), {
1373
+ lat: convertDegToDMS(latitude, "latitude"),
1374
+ lng: convertDegToDMS(longitude, "longitude")
1375
+ });
1376
+ }
1377
+ if (segmentName != null && segmentValue != null) {
1378
+ segmentLabel = (0, format_exports.sprintf)((0, i18n_exports._)("%(locationLabel)s, %(segmentName)s: %(segmentValue)s"), {
1379
+ locationLabel: segmentLabel,
1380
+ segmentName,
1381
+ segmentValue: segmentValue.toString()
1382
+ });
1383
+ }
1384
+ if (hasEventHandlers) {
1385
+ segmentLabel = (0, format_exports.sprintf)((0, i18n_exports._)("%(label)s, Click for drilldown"), { label: segmentLabel });
1386
+ }
1387
+ return segmentLabel;
1388
+ },
1389
+ [tooltipHeader, latitude, longitude, hasEventHandlers]
1390
+ );
1391
+ const offsets = [];
1392
+ let runningTotal = 0;
1393
+ values.forEach((count) => {
1394
+ offsets.push(runningTotal);
1395
+ runningTotal += count;
1396
+ });
1397
+ const width = radius * 2;
1398
+ const showIcon = isBubbleMapIconFlagEnabled && radius >= ICON_DISPLAY_CUTOFF && icon && ((0, iconUtils_exports.isRemoteIcon)(icon) || (0, iconUtils_exports.isDataURI)(icon));
1399
+ return /* @__PURE__ */ react_exports.createElement("svg", { width, height: width, viewBox: `-3 -3 ${width + 6} ${width + 6}` }, isPie && /* @__PURE__ */ react_exports.createElement(
1400
+ "circle",
1401
+ {
1402
+ cx: radius,
1403
+ cy: radius,
1404
+ r: radius,
1405
+ fill: "none",
1406
+ strokeWidth: 2,
1407
+ stroke: themeColor,
1408
+ strokeOpacity: 0.3
1409
+ }
1410
+ ), values.map((v, i) => {
1411
+ var _a, _b;
1412
+ const globalIndex = segmentStartIndex + i;
1413
+ return /* @__PURE__ */ react_exports.createElement(
1414
+ PieSegment,
1415
+ {
1416
+ key: globalIndex,
1417
+ start: offsets[i] / total,
1418
+ end: (offsets[i] + v) / total,
1419
+ radius,
1420
+ color: colors[i],
1421
+ themeColor,
1422
+ segmentMetadata: bubbleSize[i],
1423
+ handleBubbleClick: onClick,
1424
+ ariaLabel: getAriaLabel((_a = bubbleSize[i]) == null ? void 0 : _a.name, (_b = bubbleSize[i]) == null ? void 0 : _b.value),
1425
+ "aria-describedby": ariaDescribedBy,
1426
+ onKeyDown,
1427
+ onFocus,
1428
+ onBlur,
1429
+ elementRef: setElementRef ? (element) => setElementRef(globalIndex, element) : void 0,
1430
+ hasEventHandlers
1431
+ }
1432
+ );
1433
+ }), showIcon && /* @__PURE__ */ react_exports.createElement(
1434
+ "foreignObject",
1435
+ {
1436
+ x: radius - radius * 0.8 / 2,
1437
+ y: radius - radius * 0.8 / 2,
1438
+ width: radius * 0.8,
1439
+ height: radius * 0.8,
1440
+ style: { pointerEvents: "none" },
1441
+ "data-test": "bubble-icon-wrapper"
1442
+ },
1443
+ /* @__PURE__ */ react_exports.createElement(RemoteIcon_default, { iconURL: icon, width: radius * 0.8, height: radius * 0.8 })
1444
+ ));
1445
+ }
1446
+ );
931
1447
  var Bubble = react_exports.memo(
932
1448
  ({
933
1449
  originalValues,
@@ -943,10 +1459,15 @@ var Bubble = react_exports.memo(
943
1459
  map,
944
1460
  handleMapClick,
945
1461
  icon,
946
- showCoordinates
1462
+ showCoordinates,
1463
+ stylesManagedExternally,
1464
+ segmentStartIndex = 0,
1465
+ onKeyDown,
1466
+ onFocus,
1467
+ onBlur,
1468
+ setElementRef,
1469
+ hasEventHandlers
947
1470
  }) => {
948
- const featureFlagContext = react_exports.useContext(FeatureFlagContext_default);
949
- const isBubbleMapIconFlagEnabled = Boolean(featureFlagContext == null ? void 0 : featureFlagContext.visualizations_enableBubbleMapIcon);
950
1471
  const onBubbleClick = react_exports.useCallback(
951
1472
  (e, name, value) => {
952
1473
  handleMapClick(e, name, value);
@@ -956,58 +1477,9 @@ var Bubble = react_exports.memo(
956
1477
  );
957
1478
  const allZeros = originalValues.every((v) => v === 0);
958
1479
  const values = originalValues.map((v) => v > 0 ? v : 0);
959
- const total = values.reduce((totalValue, v) => totalValue + v, 0);
960
- const radius = matchBubbleSize(valueRange, total);
961
- const bubble = react_exports.useMemo(() => {
962
- if (allZeros || !originalValues.length) return null;
963
- const offsets = [];
964
- let runningTotal = 0;
965
- values.forEach((count) => {
966
- offsets.push(runningTotal);
967
- runningTotal += count;
968
- });
969
- const width = radius * 2;
970
- return /* @__PURE__ */ react_exports.createElement("svg", { width, height: width, viewBox: `-3 -3 ${width + 6} ${width + 6}` }, isPie && /* @__PURE__ */ react_exports.createElement(
971
- "circle",
972
- {
973
- cx: radius,
974
- cy: radius,
975
- r: radius,
976
- fill: "none",
977
- strokeWidth: 2,
978
- stroke: themeColor,
979
- strokeOpacity: 0.3
980
- }
981
- ), values.map((v, i) => /* @__PURE__ */ react_exports.createElement(
982
- PieSegment,
983
- {
984
- key: (0, id_exports.createDOMID)(),
985
- start: offsets[i] / total,
986
- end: (offsets[i] + v) / total,
987
- radius,
988
- color: colors[i],
989
- themeColor,
990
- segmentMetadata: bubbleSize[i],
991
- handleBubbleClick: onBubbleClick
992
- }
993
- )));
994
- }, [
995
- bubbleSize,
996
- colors,
997
- isPie,
998
- onBubbleClick,
999
- originalValues,
1000
- themeColor,
1001
- allZeros,
1002
- radius,
1003
- total,
1004
- values
1005
- ]);
1006
- if (!bubble) {
1007
- return null;
1008
- }
1480
+ if (allZeros || !originalValues.length) return null;
1009
1481
  return /* @__PURE__ */ react_exports.createElement(
1010
- StyledMarkerWrapper,
1482
+ MarkerWrapper_default,
1011
1483
  {
1012
1484
  longitude,
1013
1485
  latitude,
@@ -1015,29 +1487,46 @@ var Bubble = react_exports.memo(
1015
1487
  tooltipHeader,
1016
1488
  map,
1017
1489
  "data-test-type": "bubble",
1018
- showCoordinates
1490
+ showCoordinates,
1491
+ stylesManagedExternally
1019
1492
  },
1020
- bubble,
1021
- isBubbleMapIconFlagEnabled && radius >= ICON_DISPLAY_CUTOFF && icon && ((0, iconUtils_exports.isRemoteIcon)(icon) || (0, iconUtils_exports.isDataURI)(icon)) && /* @__PURE__ */ react_exports.createElement(
1022
- "div",
1493
+ /* @__PURE__ */ react_exports.createElement(
1494
+ BubbleSvg,
1023
1495
  {
1024
- "data-test": "bubble-icon-wrapper",
1025
- style: {
1026
- position: "absolute",
1027
- top: `${radius}px`,
1028
- left: `${radius}px`,
1029
- transform: "translate(-50%, -50%)",
1030
- pointerEvents: "none"
1031
- }
1032
- },
1033
- /* @__PURE__ */ react_exports.createElement(RemoteIcon_default, { iconURL: icon, width: radius * 0.8, height: radius * 0.8 })
1496
+ values,
1497
+ valueRange,
1498
+ colors,
1499
+ bubbleSize,
1500
+ isPie,
1501
+ themeColor,
1502
+ segmentStartIndex,
1503
+ latitude,
1504
+ longitude,
1505
+ tooltipHeader,
1506
+ icon,
1507
+ onClick: onBubbleClick,
1508
+ onKeyDown,
1509
+ onFocus,
1510
+ onBlur,
1511
+ setElementRef,
1512
+ hasEventHandlers
1513
+ }
1034
1514
  )
1035
1515
  );
1036
1516
  }
1037
1517
  );
1038
1518
  Bubble.displayName = "MapBubble";
1039
1519
  var BubbleLayer = (props) => {
1040
- const { bubbleLayer, themeColorScheme, map, zoom, onMapClick, showCoordinates } = props;
1520
+ const {
1521
+ bubbleLayer,
1522
+ themeColorScheme,
1523
+ map,
1524
+ zoom,
1525
+ onMapClick,
1526
+ showCoordinates,
1527
+ stylesManagedExternally = false,
1528
+ hasEventHandlers
1529
+ } = props;
1041
1530
  bubbleLayer.seriesColors = bubbleLayer.seriesColors || DEFAULT_SERIES_COLORS;
1042
1531
  bubbleLayer.bubbleSize = bubbleLayer.bubbleSize || [];
1043
1532
  bubbleLayer.icon = bubbleLayer.icon || [];
@@ -1077,7 +1566,15 @@ var BubbleLayer = (props) => {
1077
1566
  },
1078
1567
  [dataToRender, onMapClick]
1079
1568
  );
1569
+ const { handleKeyDown, handleFocus, handleBlur, setElementRef } = useRovingTabindex(map);
1570
+ let globalSegmentIndex = 0;
1080
1571
  return /* @__PURE__ */ react_exports.createElement(react_exports.Fragment, null, dataToRender.map((datum, i) => {
1572
+ const allZeros = datum.data.values.every((v) => v === 0);
1573
+ const segmentStartIndex = globalSegmentIndex;
1574
+ const segmentCount = datum.data.values.length;
1575
+ if (!allZeros) {
1576
+ globalSegmentIndex += segmentCount;
1577
+ }
1081
1578
  const colors = dynamicColors ? [
1082
1579
  dataToRender.map(
1083
1580
  (obj) => (0, colorUtils_exports.isColor)(dynamicColors[obj.idx]) ? dynamicColors[obj.idx] : DEFAULT_CLUSTER_COLOR
@@ -1115,7 +1612,14 @@ var BubbleLayer = (props) => {
1115
1612
  map,
1116
1613
  handleMapClick: (e, name, value) => handleMapClick(e, name, value, i),
1117
1614
  icon: bubbleLayer.icon[datum.idx],
1118
- showCoordinates
1615
+ showCoordinates,
1616
+ stylesManagedExternally,
1617
+ segmentStartIndex,
1618
+ onKeyDown: handleKeyDown,
1619
+ onFocus: handleFocus,
1620
+ onBlur: handleBlur,
1621
+ setElementRef,
1622
+ hasEventHandlers
1119
1623
  }
1120
1624
  );
1121
1625
  }));
@@ -1138,37 +1642,6 @@ var PureMapContainer = styled_components_default.div.attrs({
1138
1642
  z-index: 0;
1139
1643
  }
1140
1644
 
1141
- // overwrite maplibregl zoom control styles
1142
- .maplibregl-ctrl-top-left {
1143
- display: ${(props) => props.showZoomControls ? "block" : "none"};
1144
- position: absolute;
1145
- top: 12px;
1146
- left: 16px;
1147
- .maplibregl-ctrl-group {
1148
- width: 40px !important;
1149
- height: 87px !important;
1150
- border-radius: 4px;
1151
- margin: 8px 0px;
1152
- background-color: ${(props) => props.controlBackgroundColor};
1153
- box-shadow:
1154
- 0px 26px 103px rgba(0, 0, 0, 0.64),
1155
- 0px 11px 18px rgba(0, 0, 0, 0.32),
1156
- 0px 3px 6px rgba(0, 0, 0, 0.3);
1157
- & button {
1158
- width: 40px;
1159
- height: 43px;
1160
- border-top: 0;
1161
- }
1162
- .maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon {
1163
- background-image: url('data:image/svg+xml;charset=UTF-8,<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M9 1C9 0.447715 8.55229 0 8 0C7.44772 0 7 0.447715 7 1V7H1C0.447715 7 0 7.44772 0 8C0 8.55229 0.447715 9 1 9H7V15C7 15.5523 7.44772 16 8 16C8.55229 16 9 15.5523 9 15V9H15C15.5523 9 16 8.55229 16 8C16 7.44772 15.5523 7 15 7H9V1Z" fill="${(props) => props.controlIconColorEncoded.color}" fill-opacity="${(props) => props.controlIconColorEncoded.opacity}" /></svg>');
1164
- }
1165
-
1166
- .maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon {
1167
- background-image: url('data:image/svg+xml;charset=UTF-8,<svg width="14" height="3" viewBox="0 0 14 3" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M0 1.99707C0 1.44479 0.447715 0.99707 1 0.99707H13C13.5523 0.99707 14 1.44479 14 1.99707C14 2.54936 13.5523 2.99707 13 2.99707H1C0.447715 2.99707 0 2.54936 0 1.99707Z" fill="${(props) => props.controlIconColorEncoded.color}" fill-opacity="${(props) => props.controlIconColorEncoded.opacity}" /></svg>');
1168
- }
1169
- }
1170
- }
1171
-
1172
1645
  // overwrite maplibregl scale styles
1173
1646
  .maplibregl-ctrl-bottom-left {
1174
1647
  display: ${(props) => props.showScale ? "block" : "none"};
@@ -1201,7 +1674,8 @@ var PureMapContainer = styled_components_default.div.attrs({
1201
1674
  }
1202
1675
  }
1203
1676
 
1204
- :has(${BubbleSegment}:hover) ${BubbleSegment}:not(:hover) {
1677
+ /* When a segment is hovered/focused, dim other segments */
1678
+ :has(${BubbleSegment}:is(:focus-visible, :hover)) ${BubbleSegment}:not(:is(:focus-visible, :hover)) {
1205
1679
  fill: ${BUBBLE_SEGMENT_DIMMED_STYLES.fill};
1206
1680
  stroke: ${BUBBLE_SEGMENT_DIMMED_STYLES.stroke};
1207
1681
  }
@@ -1209,29 +1683,92 @@ var PureMapContainer = styled_components_default.div.attrs({
1209
1683
  var PureMapContainer_default = PureMapContainer;
1210
1684
 
1211
1685
  // src/Map/PureMap/MarkerLayer.tsx
1686
+ var svgFocusStyle = styled_components_exports.css`
1687
+ &:focus {
1688
+ outline: none;
1689
+ filter: drop-shadow(2px 0px 1px ${themes_exports.variables.focusColor})
1690
+ drop-shadow(-2px 0px 1px ${themes_exports.variables.focusColor}) drop-shadow(0px 2px 1px ${themes_exports.variables.focusColor})
1691
+ drop-shadow(0px -2px 1px ${themes_exports.variables.focusColor});
1692
+ }
1693
+ `;
1694
+ var FocusableSvg = styled_components_default.svg`
1695
+ ${({ $hasEventHandlers }) => $hasEventHandlers && "cursor: pointer;"}
1696
+ ${svgFocusStyle}
1697
+ `;
1212
1698
  var MarkerIcon = (_a) => {
1213
- var _b = _a, { theme, color } = _b, otherProps = __objRest(_b, ["theme", "color"]);
1699
+ var _b = _a, {
1700
+ theme,
1701
+ color,
1702
+ ariaLabel,
1703
+ "aria-describedby": ariaDescribedby,
1704
+ onInteraction,
1705
+ onKeyDown: onKeyDownProp,
1706
+ onFocus,
1707
+ onBlur,
1708
+ elementRef,
1709
+ hasEventHandlers
1710
+ } = _b, otherProps = __objRest(_b, [
1711
+ "theme",
1712
+ "color",
1713
+ "ariaLabel",
1714
+ "aria-describedby",
1715
+ "onInteraction",
1716
+ "onKeyDown",
1717
+ "onFocus",
1718
+ "onBlur",
1719
+ "elementRef",
1720
+ "hasEventHandlers"
1721
+ ]);
1214
1722
  const strokeOpacity = theme === "light" ? 0.7 : 0.15;
1215
- return /* @__PURE__ */ react_exports.createElement("svg", __spreadValues({ width: 22, height: 28, fill: "none" }, otherProps), /* @__PURE__ */ react_exports.createElement(
1216
- "path",
1217
- {
1218
- d: "M11 .5C5.201.5.5 5.201.5 11c0 3.136 1.376 5.952 3.555 7.875 2.839 2.506 4.144 4.58 4.893 6.02.183.35.334.665.469.946l.014.03c.136.285.263.548.387.766.235.412.571.863 1.182.863.61 0 .947-.45 1.182-.863.124-.218.25-.48.387-.765l.014-.03c.135-.282.286-.597.469-.947.75-1.44 2.054-3.514 4.893-6.02A10.476 10.476 0 0 0 21.5 11C21.5 5.201 16.799.5 11 .5Z",
1219
- fill: color
1220
- }
1221
- ), /* @__PURE__ */ react_exports.createElement(
1222
- "path",
1223
- {
1224
- d: "M11 .5C5.201.5.5 5.201.5 11c0 3.136 1.376 5.952 3.555 7.875 2.839 2.506 4.144 4.58 4.893 6.02.183.35.334.665.469.946l.014.03c.136.285.263.548.387.766.235.412.571.863 1.182.863.61 0 .947-.45 1.182-.863.124-.218.25-.48.387-.765l.014-.03c.135-.282.286-.597.469-.947.75-1.44 2.054-3.514 4.893-6.02A10.476 10.476 0 0 0 21.5 11C21.5 5.201 16.799.5 11 .5Z",
1225
- stroke: "#08090A"
1226
- }
1227
- ), /* @__PURE__ */ react_exports.createElement(
1228
- "path",
1229
- {
1230
- d: "M11 .5C5.201.5.5 5.201.5 11c0 3.136 1.376 5.952 3.555 7.875 2.839 2.506 4.144 4.58 4.893 6.02.183.35.334.665.469.946l.014.03c.136.285.263.548.387.766.235.412.571.863 1.182.863.61 0 .947-.45 1.182-.863.124-.218.25-.48.387-.765l.014-.03c.135-.282.286-.597.469-.947.75-1.44 2.054-3.514 4.893-6.02A10.476 10.476 0 0 0 21.5 11C21.5 5.201 16.799.5 11 .5Z",
1231
- stroke: color,
1232
- strokeOpacity
1233
- }
1234
- ));
1723
+ const handleKeyDown = react_exports.useCallback(
1724
+ (e) => {
1725
+ if (hasEventHandlers && (e.key === KEYBOARD_KEYS.ENTER || e.key === KEYBOARD_KEYS.SPACE)) {
1726
+ e.preventDefault();
1727
+ onInteraction == null ? void 0 : onInteraction(e);
1728
+ }
1729
+ onKeyDownProp == null ? void 0 : onKeyDownProp(e);
1730
+ },
1731
+ [hasEventHandlers, onInteraction, onKeyDownProp]
1732
+ );
1733
+ return /* @__PURE__ */ react_exports.createElement(
1734
+ FocusableSvg,
1735
+ __spreadValues({
1736
+ $hasEventHandlers: hasEventHandlers,
1737
+ ref: elementRef,
1738
+ width: 22,
1739
+ height: 28,
1740
+ fill: "none",
1741
+ role: hasEventHandlers ? "button" : "graphics-symbol",
1742
+ "aria-label": ariaLabel,
1743
+ "aria-describedby": ariaDescribedby,
1744
+ onClick: hasEventHandlers ? onInteraction : void 0,
1745
+ onKeyDown: handleKeyDown,
1746
+ onFocus,
1747
+ onBlur
1748
+ }, otherProps),
1749
+ /* @__PURE__ */ react_exports.createElement(
1750
+ "path",
1751
+ {
1752
+ d: "M11 .5C5.201.5.5 5.201.5 11c0 3.136 1.376 5.952 3.555 7.875 2.839 2.506 4.144 4.58 4.893 6.02.183.35.334.665.469.946l.014.03c.136.285.263.548.387.766.235.412.571.863 1.182.863.61 0 .947-.45 1.182-.863.124-.218.25-.48.387-.765l.014-.03c.135-.282.286-.597.469-.947.75-1.44 2.054-3.514 4.893-6.02A10.476 10.476 0 0 0 21.5 11C21.5 5.201 16.799.5 11 .5Z",
1753
+ fill: color
1754
+ }
1755
+ ),
1756
+ /* @__PURE__ */ react_exports.createElement(
1757
+ "path",
1758
+ {
1759
+ d: "M11 .5C5.201.5.5 5.201.5 11c0 3.136 1.376 5.952 3.555 7.875 2.839 2.506 4.144 4.58 4.893 6.02.183.35.334.665.469.946l.014.03c.136.285.263.548.387.766.235.412.571.863 1.182.863.61 0 .947-.45 1.182-.863.124-.218.25-.48.387-.765l.014-.03c.135-.282.286-.597.469-.947.75-1.44 2.054-3.514 4.893-6.02A10.476 10.476 0 0 0 21.5 11C21.5 5.201 16.799.5 11 .5Z",
1760
+ stroke: "#08090A"
1761
+ }
1762
+ ),
1763
+ /* @__PURE__ */ react_exports.createElement(
1764
+ "path",
1765
+ {
1766
+ d: "M11 .5C5.201.5.5 5.201.5 11c0 3.136 1.376 5.952 3.555 7.875 2.839 2.506 4.144 4.58 4.893 6.02.183.35.334.665.469.946l.014.03c.136.285.263.548.387.766.235.412.571.863 1.182.863.61 0 .947-.45 1.182-.863.124-.218.25-.48.387-.765l.014-.03c.135-.282.286-.597.469-.947.75-1.44 2.054-3.514 4.893-6.02A10.476 10.476 0 0 0 21.5 11C21.5 5.201 16.799.5 11 .5Z",
1767
+ stroke: color,
1768
+ strokeOpacity
1769
+ }
1770
+ )
1771
+ );
1235
1772
  };
1236
1773
  var Marker2 = react_exports.memo(
1237
1774
  ({
@@ -1243,14 +1780,58 @@ var Marker2 = react_exports.memo(
1243
1780
  additionalFields,
1244
1781
  handleLayerClick,
1245
1782
  showCoordinates,
1246
- tooltipHeader
1783
+ tooltipHeader,
1784
+ stylesManagedExternally,
1785
+ onKeyDown,
1786
+ onFocus,
1787
+ onBlur,
1788
+ elementRef,
1789
+ hasEventHandlers
1247
1790
  }) => {
1791
+ const ariaLabel = react_exports.useMemo(() => {
1792
+ let markerLabel = (0, i18n_exports._)("Map marker");
1793
+ if (tooltipHeader) {
1794
+ markerLabel = tooltipHeader;
1795
+ } else if (latitude !== void 0 && longitude !== void 0) {
1796
+ markerLabel = (0, format_exports.sprintf)((0, i18n_exports._)("Location: %(lat)s, %(lng)s"), {
1797
+ lat: convertDegToDMS(latitude, "latitude"),
1798
+ lng: convertDegToDMS(longitude, "longitude")
1799
+ });
1800
+ }
1801
+ if (hasEventHandlers) {
1802
+ markerLabel = (0, format_exports.sprintf)((0, i18n_exports._)("%(label)s, Click for drilldown"), { label: markerLabel });
1803
+ }
1804
+ return markerLabel;
1805
+ }, [tooltipHeader, latitude, longitude, hasEventHandlers]);
1248
1806
  const icon = react_exports.useMemo(
1249
- () => /* @__PURE__ */ react_exports.createElement(MarkerIcon, { color, theme: themeColorScheme, onClick: handleLayerClick }),
1250
- [color, handleLayerClick, themeColorScheme]
1807
+ () => /* @__PURE__ */ react_exports.createElement(
1808
+ MarkerIcon,
1809
+ {
1810
+ color,
1811
+ theme: themeColorScheme,
1812
+ ariaLabel,
1813
+ onInteraction: handleLayerClick,
1814
+ onKeyDown,
1815
+ onFocus,
1816
+ onBlur,
1817
+ elementRef,
1818
+ hasEventHandlers
1819
+ }
1820
+ ),
1821
+ [
1822
+ color,
1823
+ handleLayerClick,
1824
+ themeColorScheme,
1825
+ ariaLabel,
1826
+ onKeyDown,
1827
+ onFocus,
1828
+ onBlur,
1829
+ elementRef,
1830
+ hasEventHandlers
1831
+ ]
1251
1832
  );
1252
1833
  return /* @__PURE__ */ react_exports.createElement(
1253
- StyledMarkerWrapper2,
1834
+ StyledMarkerWrapper,
1254
1835
  {
1255
1836
  latitude,
1256
1837
  longitude,
@@ -1258,14 +1839,15 @@ var Marker2 = react_exports.memo(
1258
1839
  additionalFields,
1259
1840
  "data-test-type": "marker",
1260
1841
  showCoordinates,
1261
- tooltipHeader
1842
+ tooltipHeader,
1843
+ stylesManagedExternally
1262
1844
  },
1263
1845
  icon
1264
1846
  );
1265
1847
  }
1266
1848
  );
1267
1849
  Marker2.displayName = "MapMarker";
1268
- var StyledMarkerWrapper2 = styled_components_default(MarkerWrapper_default)`
1850
+ var StyledMarkerWrapper = styled_components_default(MarkerWrapper_default)`
1269
1851
  width: 22px;
1270
1852
  height: 28px;
1271
1853
  cursor: pointer;
@@ -1313,12 +1895,21 @@ var generateMarkerWrapperProps = (markerLayer, showCoordinates, onMapClick = lod
1313
1895
  return markerProps;
1314
1896
  };
1315
1897
  var MarkerLayer = (props) => {
1316
- const { map, themeColorScheme, markerLayer, onMapClick, showCoordinates = true } = props;
1898
+ const {
1899
+ map,
1900
+ themeColorScheme,
1901
+ markerLayer,
1902
+ onMapClick,
1903
+ showCoordinates = true,
1904
+ stylesManagedExternally = false,
1905
+ hasEventHandlers
1906
+ } = props;
1317
1907
  markerLayer.seriesColors = markerLayer.seriesColors || DEFAULT_SERIES_COLORS;
1318
1908
  const markerPropsList = react_exports.useMemo(
1319
1909
  () => generateMarkerWrapperProps(markerLayer, showCoordinates, onMapClick),
1320
1910
  [markerLayer, onMapClick, showCoordinates]
1321
1911
  );
1912
+ const { handleKeyDown, handleFocus, handleBlur, setElementRef } = useRovingTabindex(map);
1322
1913
  return /* @__PURE__ */ react_exports.createElement(react_exports.Fragment, null, markerPropsList.map((markerProps, i) => /* @__PURE__ */ react_exports.createElement(
1323
1914
  Marker2,
1324
1915
  __spreadProps(__spreadValues({
@@ -1326,7 +1917,13 @@ var MarkerLayer = (props) => {
1326
1917
  themeColorScheme,
1327
1918
  map
1328
1919
  }, markerProps), {
1329
- showCoordinates
1920
+ showCoordinates,
1921
+ stylesManagedExternally,
1922
+ onKeyDown: handleKeyDown,
1923
+ onFocus: handleFocus,
1924
+ onBlur: handleBlur,
1925
+ elementRef: (element) => setElementRef(i, element),
1926
+ hasEventHandlers
1330
1927
  })
1331
1928
  )));
1332
1929
  };
@@ -1339,24 +1936,28 @@ var ClusterLayer = ({
1339
1936
  zoom,
1340
1937
  map,
1341
1938
  onMapClick,
1342
- showCoordinates
1939
+ showCoordinates,
1940
+ stylesManagedExternally = false,
1941
+ hasEventHandlers
1343
1942
  }) => {
1344
1943
  var _a;
1345
1944
  if (((_a = map == null ? void 0 : map.current) == null ? void 0 : _a.isStyleLoaded) && [clusterLayer.longitude, clusterLayer.latitude].every(Array.isArray)) {
1346
1945
  if ((clusterLayer == null ? void 0 : clusterLayer.type) === visualization_schemas_exports.LAYER_TYPE.Marker && !("geobin" in clusterLayer)) {
1347
- return /* @__PURE__ */ react_exports.createElement(
1946
+ return /* @__PURE__ */ react_exports.createElement(MapProvider, null, /* @__PURE__ */ react_exports.createElement(
1348
1947
  MarkerLayer_default,
1349
1948
  {
1350
1949
  markerLayer: clusterLayer,
1351
1950
  themeColorScheme,
1352
1951
  map,
1353
1952
  onMapClick,
1354
- showCoordinates
1953
+ showCoordinates,
1954
+ stylesManagedExternally,
1955
+ hasEventHandlers
1355
1956
  }
1356
- );
1957
+ ));
1357
1958
  }
1358
1959
  if ((clusterLayer == null ? void 0 : clusterLayer.type) === visualization_schemas_exports.LAYER_TYPE.Bubble && Array.isArray(clusterLayer.bubbleSize)) {
1359
- return /* @__PURE__ */ react_exports.createElement(
1960
+ return /* @__PURE__ */ react_exports.createElement(MapProvider, null, /* @__PURE__ */ react_exports.createElement(
1360
1961
  BubbleLayer_default,
1361
1962
  {
1362
1963
  bubbleLayer: clusterLayer,
@@ -1364,9 +1965,11 @@ var ClusterLayer = ({
1364
1965
  map,
1365
1966
  zoom,
1366
1967
  onMapClick,
1367
- showCoordinates
1968
+ showCoordinates,
1969
+ stylesManagedExternally,
1970
+ hasEventHandlers
1368
1971
  }
1369
- );
1972
+ ));
1370
1973
  }
1371
1974
  }
1372
1975
  return null;
@@ -1377,6 +1980,25 @@ var ClusterLayer_default = ClusterLayer;
1377
1980
  var getShapeId = (id) => `shape-${id}`;
1378
1981
  var getSourceId = (id) => `source-${id}`;
1379
1982
  var getStrokeId = (id) => `stroke-${id}`;
1983
+ var getCentroid = (geom) => {
1984
+ if (!(geom == null ? void 0 : geom.coordinates)) {
1985
+ return null;
1986
+ }
1987
+ const flattenCoordinates = (coords) => {
1988
+ if (typeof coords[0] === "number") return [coords];
1989
+ return coords.flatMap(flattenCoordinates);
1990
+ };
1991
+ const allCoords = flattenCoordinates(geom.coordinates);
1992
+ if (allCoords.length === 0) {
1993
+ return null;
1994
+ }
1995
+ const lngs = allCoords.map((c) => c[0]);
1996
+ const lats = allCoords.map((c) => c[1]);
1997
+ return [lngs.reduce((a, b) => a + b, 0) / lngs.length, lats.reduce((a, b) => a + b, 0) / lats.length];
1998
+ };
1999
+ var FocusableShapeButton = styled_components_default.button`
2000
+ ${themes_exports.mixins.screenReaderContent()};
2001
+ `;
1380
2002
  var compareGeom = (prev, next) => {
1381
2003
  if (prev !== null && next !== null) {
1382
2004
  return prev.type === next.type && (0, lodash_exports.isEqual)(prev.coordinates, next.coordinates);
@@ -1384,7 +2006,7 @@ var compareGeom = (prev, next) => {
1384
2006
  return prev === null && next === null;
1385
2007
  };
1386
2008
  var compareChoropleth = (prevProps, nextProps) => {
1387
- return compareGeom(prevProps.geomData, nextProps.geomData) && prevProps.id === nextProps.id && prevProps.map === nextProps.map && prevProps.areaId === nextProps.areaId && prevProps.areaValue === nextProps.areaValue && prevProps.color === nextProps.color && prevProps.opacity === nextProps.opacity && prevProps.strokeColor === nextProps.strokeColor && prevProps.isThemeChanged === nextProps.isThemeChanged && (0, lodash_exports.isEqual)(prevProps.additionalFields, nextProps.additionalFields) && prevProps.tooltipHeader === nextProps.tooltipHeader && prevProps.handleMapClick.toString() === nextProps.handleMapClick.toString();
2009
+ return compareGeom(prevProps.geomData, nextProps.geomData) && prevProps.id === nextProps.id && prevProps.map === nextProps.map && prevProps.areaId === nextProps.areaId && prevProps.areaValue === nextProps.areaValue && prevProps.color === nextProps.color && prevProps.opacity === nextProps.opacity && prevProps.strokeColor === nextProps.strokeColor && prevProps.isThemeChanged === nextProps.isThemeChanged && (0, lodash_exports.isEqual)(prevProps.additionalFields, nextProps.additionalFields) && prevProps.tooltipHeader === nextProps.tooltipHeader && prevProps.handleMapClick === nextProps.handleMapClick && prevProps.hasEventHandlers === nextProps.hasEventHandlers;
1388
2010
  };
1389
2011
  var cleanupChoropleth = (shapeId, sourceId, strokeId, map) => {
1390
2012
  var _a, _b, _c;
@@ -1421,26 +2043,40 @@ var Choropleth = react_exports.memo(
1421
2043
  isThemeChanged,
1422
2044
  additionalFields,
1423
2045
  tooltipHeader,
1424
- handleMapClick
2046
+ handleMapClick,
2047
+ stylesManagedExternally = false,
2048
+ onKeyDown,
2049
+ onFocus,
2050
+ onBlur,
2051
+ elementRef,
2052
+ hasEventHandlers
1425
2053
  }) => {
1426
2054
  const sourceId = getSourceId(id);
1427
2055
  const shapeId = getShapeId(id);
1428
2056
  const strokeId = getStrokeId(id);
1429
- const formattedGeomData = {
1430
- type: "Feature",
1431
- geometry: geomData,
1432
- properties: {}
1433
- };
1434
- const [isTooltipOpen, setTooltipOpenStatus] = react_exports.useState(false);
1435
- const [mouseLat, setmouseLat] = react_exports.useState(0);
1436
- const [mouseLng, setmouseLng] = react_exports.useState(0);
1437
- const openTooltip = react_exports.useCallback(() => {
1438
- setTooltipOpenStatus(true);
1439
- }, []);
1440
- const closeTooltip = react_exports.useCallback(() => {
1441
- setTooltipOpenStatus(false);
1442
- }, []);
1443
- const updateChoropleth = react_exports.useCallback(() => {
2057
+ const formattedGeomData = react_exports.useMemo(
2058
+ () => ({
2059
+ type: "Feature",
2060
+ geometry: geomData,
2061
+ properties: {}
2062
+ }),
2063
+ [geomData]
2064
+ );
2065
+ const [isFocused, setIsFocused] = react_exports.useState(false);
2066
+ const [isHovered, setIsHovered] = react_exports.useState(false);
2067
+ const [centroidLat, centroidLng] = react_exports.useMemo(() => {
2068
+ const centroid = getCentroid(geomData);
2069
+ if (!centroid) {
2070
+ return [null, null];
2071
+ }
2072
+ const [lng, lat] = centroid;
2073
+ return [lat, lng];
2074
+ }, [geomData]);
2075
+ const [mouseLat, setmouseLat] = react_exports.useState(centroidLat != null ? centroidLat : 0);
2076
+ const [mouseLng, setmouseLng] = react_exports.useState(centroidLng != null ? centroidLng : 0);
2077
+ const markerId = react_exports.useMemo(() => `choropleth-${shapeId}`, [shapeId]);
2078
+ const { activeChoroplethId, setActiveChoroplethId, setActiveTooltipId } = useMapContext();
2079
+ const updateLayers = react_exports.useCallback(() => {
1444
2080
  cleanupChoropleth(shapeId, sourceId, strokeId, map);
1445
2081
  map.current.addSource(sourceId, {
1446
2082
  type: "geojson",
@@ -1468,41 +2104,142 @@ var Choropleth = react_exports.memo(
1468
2104
  }
1469
2105
  });
1470
2106
  }
1471
- map.current.on("mousemove", shapeId, (e) => {
1472
- const mouseLngLat = e.lngLat;
1473
- setmouseLat(mouseLngLat.lat);
1474
- setmouseLng(mouseLngLat.lng);
1475
- openTooltip();
2107
+ }, [shapeId, sourceId, strokeId, map, formattedGeomData, color, opacity, strokeColor]);
2108
+ const registerEventHandlers = react_exports.useCallback(() => {
2109
+ var _a;
2110
+ const layer = (_a = map.current) == null ? void 0 : _a.getLayer(shapeId);
2111
+ if (!layer) return () => {
2112
+ };
2113
+ const handleMouseMove = (e) => {
2114
+ setmouseLat(e.lngLat.lat);
2115
+ setmouseLng(e.lngLat.lng);
2116
+ setIsHovered(true);
2117
+ setActiveTooltipId(markerId);
1476
2118
  map.current.getCanvas().style.cursor = "pointer";
1477
- });
1478
- map.current.on("mouseleave", shapeId, () => {
1479
- closeTooltip();
2119
+ };
2120
+ const handleMouseLeave = () => {
2121
+ setIsHovered(false);
2122
+ setActiveTooltipId(null);
1480
2123
  map.current.getCanvas().style.cursor = "";
1481
- });
1482
- map.current.on("click", shapeId, (e) => {
1483
- handleMapClick(e);
1484
- });
1485
- }, [shapeId, sourceId, map, color, opacity, formattedGeomData]);
2124
+ };
2125
+ const handleClick2 = (e) => {
2126
+ if (hasEventHandlers) {
2127
+ handleMapClick == null ? void 0 : handleMapClick(e);
2128
+ }
2129
+ };
2130
+ map.current.on("mousemove", shapeId, handleMouseMove);
2131
+ map.current.on("mouseleave", shapeId, handleMouseLeave);
2132
+ map.current.on("click", shapeId, handleClick2);
2133
+ return () => {
2134
+ if (map.current) {
2135
+ map.current.off("mousemove", shapeId, handleMouseMove);
2136
+ map.current.off("mouseleave", shapeId, handleMouseLeave);
2137
+ map.current.off("click", shapeId, handleClick2);
2138
+ }
2139
+ };
2140
+ }, [shapeId, markerId, map, setActiveTooltipId, hasEventHandlers, handleMapClick]);
1486
2141
  react_exports.useEffect(() => {
1487
- updateChoropleth();
1488
- }, [map, geomData, color, opacity, id, strokeColor]);
2142
+ updateLayers();
2143
+ }, [updateLayers]);
2144
+ react_exports.useEffect(() => {
2145
+ return registerEventHandlers();
2146
+ }, [registerEventHandlers]);
2147
+ react_exports.useEffect(() => {
2148
+ if (!map.current) return;
2149
+ const layer = map.current.getLayer(shapeId);
2150
+ if (!layer) return;
2151
+ if (activeChoroplethId === null || activeChoroplethId === shapeId) {
2152
+ map.current.setPaintProperty(shapeId, "fill-opacity", opacity);
2153
+ } else {
2154
+ map.current.setPaintProperty(shapeId, "fill-opacity", opacity * 0.3);
2155
+ }
2156
+ }, [activeChoroplethId, shapeId, opacity, map]);
1489
2157
  react_exports.useEffect(() => () => cleanupChoropleth(shapeId, sourceId, strokeId, map), []);
1490
2158
  if (isThemeChanged) {
1491
- updateChoropleth();
2159
+ updateLayers();
1492
2160
  }
2161
+ const handleFocus = react_exports.useCallback(() => {
2162
+ if (onFocus) {
2163
+ onFocus();
2164
+ }
2165
+ setIsFocused(true);
2166
+ setmouseLat(centroidLat);
2167
+ setmouseLng(centroidLng);
2168
+ setActiveChoroplethId(shapeId);
2169
+ setActiveTooltipId(markerId);
2170
+ }, [centroidLat, centroidLng, shapeId, markerId, setActiveChoroplethId, setActiveTooltipId, onFocus]);
2171
+ const handleBlur = react_exports.useCallback(() => {
2172
+ setIsFocused(false);
2173
+ setActiveChoroplethId(null);
2174
+ setActiveTooltipId(null);
2175
+ onBlur == null ? void 0 : onBlur();
2176
+ }, [setActiveChoroplethId, setActiveTooltipId, onBlur]);
2177
+ const handleKeyDown = react_exports.useCallback(
2178
+ (e) => {
2179
+ var _a, _b;
2180
+ onKeyDown == null ? void 0 : onKeyDown(e);
2181
+ if (hasEventHandlers && (e.key === KEYBOARD_KEYS.ENTER || e.key === KEYBOARD_KEYS.SPACE)) {
2182
+ e.preventDefault();
2183
+ const mockEvent = {
2184
+ lngLat: {
2185
+ lng: (_a = mouseLng != null ? mouseLng : centroidLng) != null ? _a : 0,
2186
+ lat: (_b = mouseLat != null ? mouseLat : centroidLat) != null ? _b : 0
2187
+ },
2188
+ originalEvent: e
2189
+ };
2190
+ handleMapClick(mockEvent);
2191
+ }
2192
+ },
2193
+ [hasEventHandlers, handleMapClick, onKeyDown, centroidLat, centroidLng, mouseLat, mouseLng]
2194
+ );
2195
+ const tooltipPosition = react_exports.useMemo(() => {
2196
+ if (isFocused) return { lat: centroidLat, lng: centroidLng };
2197
+ if (!isHovered || !map.current) return { lat: mouseLat, lng: mouseLng };
2198
+ const mousePoint = map.current.project([mouseLng, mouseLat]);
2199
+ mousePoint.y -= 24;
2200
+ const offsetCoords = map.current.unproject(mousePoint);
2201
+ return { lat: offsetCoords.lat, lng: offsetCoords.lng };
2202
+ }, [isFocused, isHovered, mouseLat, mouseLng, centroidLat, centroidLng, map]);
2203
+ const hasCentroid = centroidLat !== null && centroidLng !== null;
2204
+ const ariaLabel = react_exports.useMemo(() => {
2205
+ const formattedAreaValue = typeof areaValue === "number" && !Number.isNaN(areaValue) ? areaValue.toString() : "N/A";
2206
+ let choroplethLabel = (0, format_exports.sprintf)((0, i18n_exports._)("%(areaId)s: %(areaValue)s"), {
2207
+ areaId: areaId.toString(),
2208
+ areaValue: formattedAreaValue
2209
+ });
2210
+ if (hasEventHandlers) {
2211
+ choroplethLabel = (0, format_exports.sprintf)((0, i18n_exports._)("%(label)s, Click for drilldown"), { label: choroplethLabel });
2212
+ }
2213
+ return choroplethLabel;
2214
+ }, [areaId, areaValue, hasEventHandlers]);
1493
2215
  return /* @__PURE__ */ react_exports.createElement(
1494
2216
  MarkerWrapper_default,
1495
2217
  {
1496
- isChoroplethTooltipOpen: isTooltipOpen,
1497
2218
  additionalFields,
1498
2219
  tooltipHeader,
1499
- latitude: mouseLat,
1500
- longitude: mouseLng,
2220
+ latitude: tooltipPosition.lat,
2221
+ longitude: tooltipPosition.lng,
1501
2222
  map,
1502
2223
  areaId,
1503
- areaValue
2224
+ areaValue,
2225
+ stylesManagedExternally,
2226
+ customMarkerId: markerId,
2227
+ showCoordinates: false
1504
2228
  },
1505
- /* @__PURE__ */ react_exports.createElement("div", { "data-test": "choropleth-anchor", style: { padding: "24px", visibility: "hidden" } })
2229
+ /* @__PURE__ */ react_exports.createElement(
2230
+ FocusableShapeButton,
2231
+ {
2232
+ "data-test": "choropleth-anchor",
2233
+ ref: elementRef,
2234
+ role: hasEventHandlers && hasCentroid ? "button" : "graphics-symbol",
2235
+ "aria-label": ariaLabel,
2236
+ "aria-hidden": !hasCentroid,
2237
+ onFocus: handleFocus,
2238
+ onBlur: handleBlur,
2239
+ onKeyDown: handleKeyDown,
2240
+ onClick: hasEventHandlers ? handleMapClick : void 0
2241
+ }
2242
+ )
1506
2243
  );
1507
2244
  },
1508
2245
  compareChoropleth
@@ -1510,7 +2247,15 @@ var Choropleth = react_exports.memo(
1510
2247
  Choropleth.displayName = "MapChoropleth";
1511
2248
  var ChoroplethLayer = (props) => {
1512
2249
  var _a, _b, _c, _d, _e, _f, _g, _h;
1513
- const { map, choroplethLayer, isThemeChanged, setIsThemeChanged, onMapClick } = props;
2250
+ const {
2251
+ map,
2252
+ choroplethLayer,
2253
+ isThemeChanged,
2254
+ setIsThemeChanged,
2255
+ onMapClick,
2256
+ stylesManagedExternally = false,
2257
+ hasEventHandlers
2258
+ } = props;
1514
2259
  const cfgOpacity = Math.min(Math.max(choroplethLayer == null ? void 0 : choroplethLayer.choroplethOpacity, 0), 1);
1515
2260
  const scaledOpacities = (_a = getScaledOpacities(choroplethLayer == null ? void 0 : choroplethLayer.dataColors, cfgOpacity)) != null ? _a : [];
1516
2261
  const colors = (_b = choroplethLayer == null ? void 0 : choroplethLayer.dataColors) == null ? void 0 : _b.map((color) => (color == null ? void 0 : color.length) > 7 ? color.slice(0, 7) : color);
@@ -1520,6 +2265,7 @@ var ChoroplethLayer = (props) => {
1520
2265
  (_f = (_e = choroplethLayer == null ? void 0 : choroplethLayer.geom) == null ? void 0 : _e.length) != null ? _f : 0,
1521
2266
  (choroplethLayer == null ? void 0 : choroplethLayer.resultLimit) ? choroplethLayer.resultLimit : DEFAULT_RESULT_LIMIT
1522
2267
  );
2268
+ const { handleKeyDown, handleFocus, handleBlur, setElementRef } = useRovingTabindex(map);
1523
2269
  const areaIdSliced = (_h = (_g = choroplethLayer == null ? void 0 : choroplethLayer.areaIds) == null ? void 0 : _g.slice(0, limit)) != null ? _h : [];
1524
2270
  const uniqueAreaIdSliced = (0, lodash_exports.uniq)(areaIdSliced).length !== areaIdSliced.length ? areaIdSliced.map((id, i) => `${id}${i}`) : areaIdSliced;
1525
2271
  const additionalFields = (choroplethLayer == null ? void 0 : choroplethLayer.metadata) ? choroplethLayer.metadata.map((choroplethMetadata) => {
@@ -1560,7 +2306,13 @@ var ChoroplethLayer = (props) => {
1560
2306
  areaValue,
1561
2307
  additionalFields: additionalFields[i],
1562
2308
  tooltipHeader: tooltipHeaderField == null ? void 0 : tooltipHeaderField[i],
1563
- handleMapClick: (e) => handleMapClick(e, i)
2309
+ handleMapClick: (e) => handleMapClick(e, i),
2310
+ stylesManagedExternally,
2311
+ onKeyDown: handleKeyDown,
2312
+ onFocus: handleFocus,
2313
+ onBlur: handleBlur,
2314
+ elementRef: (element) => setElementRef(i, element),
2315
+ hasEventHandlers
1564
2316
  }
1565
2317
  );
1566
2318
  }));
@@ -1572,32 +2324,41 @@ var Message_exports = {};
1572
2324
  __export(Message_exports, {
1573
2325
  default: () => Message_default
1574
2326
  });
1575
- var defaultImport25 = __toESM(require("@splunk/visualizations-shared/Message"));
2327
+ var defaultImport27 = __toESM(require("@splunk/visualizations-shared/Message"));
1576
2328
  __reExport(Message_exports, require("@splunk/visualizations-shared/Message"));
1577
- var Message_default = "default" in defaultImport25 ? defaultImport25.default : defaultImport25;
2329
+ var Message_default = "default" in defaultImport27 ? defaultImport27.default : defaultImport27;
1578
2330
 
1579
2331
  // esm-externals:@splunk/visualization-context/GeoRegistry
1580
2332
  var GeoRegistry_exports = {};
1581
2333
  __export(GeoRegistry_exports, {
1582
2334
  default: () => GeoRegistry_default
1583
2335
  });
1584
- var defaultImport26 = __toESM(require("@splunk/visualization-context/GeoRegistry"));
2336
+ var defaultImport28 = __toESM(require("@splunk/visualization-context/GeoRegistry"));
1585
2337
  __reExport(GeoRegistry_exports, require("@splunk/visualization-context/GeoRegistry"));
1586
- var GeoRegistry_default = "default" in defaultImport26 ? defaultImport26.default : defaultImport26;
2338
+ var GeoRegistry_default = "default" in defaultImport28 ? defaultImport28.default : defaultImport28;
1587
2339
 
1588
2340
  // esm-externals:@splunk/visualization-context/GeoJsonProvider
1589
2341
  var GeoJsonProvider_exports = {};
1590
2342
  __export(GeoJsonProvider_exports, {
1591
2343
  default: () => GeoJsonProvider_default
1592
2344
  });
1593
- var defaultImport27 = __toESM(require("@splunk/visualization-context/GeoJsonProvider"));
2345
+ var defaultImport29 = __toESM(require("@splunk/visualization-context/GeoJsonProvider"));
1594
2346
  __reExport(GeoJsonProvider_exports, require("@splunk/visualization-context/GeoJsonProvider"));
1595
- var GeoJsonProvider_default = "default" in defaultImport27 ? defaultImport27.default : defaultImport27;
2347
+ var GeoJsonProvider_default = "default" in defaultImport29 ? defaultImport29.default : defaultImport29;
1596
2348
 
1597
2349
  // src/Map/PureMap/LocalChoroplethLayer.tsx
1598
2350
  var LocalChoroplethLayer = (props) => {
1599
2351
  var _a, _b;
1600
- const { width, height, map, choroplethLayer, isThemeChanged, setIsThemeChanged, onMapClick } = props;
2352
+ const {
2353
+ width,
2354
+ height,
2355
+ map,
2356
+ choroplethLayer,
2357
+ isThemeChanged,
2358
+ setIsThemeChanged,
2359
+ onMapClick,
2360
+ hasEventHandlers
2361
+ } = props;
1601
2362
  const cfgOpacity = Math.min(Math.max(choroplethLayer == null ? void 0 : choroplethLayer.choroplethOpacity, 0), 1);
1602
2363
  const emptyFeature = {
1603
2364
  type: "Feature",
@@ -1614,6 +2375,7 @@ var LocalChoroplethLayer = (props) => {
1614
2375
  const [geoJsonError, setGeoJsonError] = react_exports.useState({
1615
2376
  message: ""
1616
2377
  });
2378
+ const { handleKeyDown, handleFocus, handleBlur, setElementRef } = useRovingTabindex(map);
1617
2379
  react_exports.useEffect(() => {
1618
2380
  let isMounted = true;
1619
2381
  const geoRegistry = GeoRegistry_default.create();
@@ -1716,29 +2478,42 @@ var LocalChoroplethLayer = (props) => {
1716
2478
  level: "error",
1717
2479
  message: geoJsonError.message
1718
2480
  }
1719
- ), validGeoJson && updatedAllChoroplethData.map((el, i) => {
1720
- var _a2, _b2;
1721
- const geometry = (_a2 = geoJson.features[i]) == null ? void 0 : _a2.geometry;
1722
- const geomData = geometry && (geometry.type === "MultiPolygon" || geometry.type === "Polygon") ? geometry : null;
1723
- return /* @__PURE__ */ react_exports.createElement(
1724
- Choropleth,
1725
- {
1726
- key: el.name,
1727
- id: el.name,
1728
- map,
1729
- color: el.color,
1730
- opacity: el.opacity,
1731
- strokeColor: choroplethLayer.choroplethStrokeColor,
1732
- areaId: el.name,
1733
- areaValue: typeof el.areaValue === "number" ? el.areaValue : Number(el.areaValue),
1734
- handleMapClick: (e) => handleMapClick(e, el.idx),
1735
- isThemeChanged,
1736
- geomData,
1737
- additionalFields: additionalFields[el.idx],
1738
- tooltipHeader: (_b2 = choroplethLayer.tooltipHeaderField) == null ? void 0 : _b2[el.idx]
2481
+ ), validGeoJson && (() => {
2482
+ let renderIndex = 0;
2483
+ return updatedAllChoroplethData.map((el, i) => {
2484
+ var _a2, _b2;
2485
+ const geometry = (_a2 = geoJson.features[i]) == null ? void 0 : _a2.geometry;
2486
+ const geomData = geometry && (geometry.type === "MultiPolygon" || geometry.type === "Polygon") ? geometry : null;
2487
+ if (!geomData) {
2488
+ return null;
1739
2489
  }
1740
- );
1741
- }));
2490
+ const currentRenderIndex = renderIndex;
2491
+ renderIndex += 1;
2492
+ return /* @__PURE__ */ react_exports.createElement(
2493
+ Choropleth,
2494
+ {
2495
+ key: el.name,
2496
+ id: el.name,
2497
+ map,
2498
+ color: el.color,
2499
+ opacity: el.opacity,
2500
+ strokeColor: choroplethLayer.choroplethStrokeColor,
2501
+ areaId: el.name,
2502
+ areaValue: typeof el.areaValue === "number" ? el.areaValue : Number(el.areaValue),
2503
+ handleMapClick: (e) => handleMapClick(e, el.idx),
2504
+ isThemeChanged,
2505
+ geomData,
2506
+ additionalFields: additionalFields[el.idx],
2507
+ tooltipHeader: (_b2 = choroplethLayer.tooltipHeaderField) == null ? void 0 : _b2[el.idx],
2508
+ onKeyDown: handleKeyDown,
2509
+ onFocus: handleFocus,
2510
+ onBlur: handleBlur,
2511
+ elementRef: (element) => setElementRef(currentRenderIndex, element),
2512
+ hasEventHandlers
2513
+ }
2514
+ );
2515
+ });
2516
+ })());
1742
2517
  };
1743
2518
  var LocalChoroplethLayer_default = LocalChoroplethLayer;
1744
2519
 
@@ -1758,24 +2533,49 @@ var formatColor = (color) => {
1758
2533
  opacity: chromaColor.alpha()
1759
2534
  };
1760
2535
  };
1761
- var StyledFitToDataButton = styled_components_default(Button_default).attrs({
1762
- "data-test": "fit-to-data-button"
1763
- })`
2536
+ var ControlButtonContainer = styled_components_default.div`
1764
2537
  position: absolute;
1765
- top: ${(props) => props.showZoomControls ? "115px" : "12px"};
1766
2538
  left: 16px;
1767
2539
  z-index: 3;
1768
- width: 40px !important;
1769
- height: 40px;
2540
+ width: 40px;
1770
2541
  border-radius: 4px;
1771
- border: none;
2542
+ background-color: ${(props) => props.controlBackgroundColor};
1772
2543
  box-shadow:
1773
2544
  0px 26px 103px rgba(0, 0, 0, 0.64),
1774
2545
  0px 11px 18px rgba(0, 0, 0, 0.32),
1775
- 0px 3px 6px rgba(0, 0, 0, 0.3) !important;
1776
- background-color: ${(props) => props.controlBackgroundColor} !important;
2546
+ 0px 3px 6px rgba(0, 0, 0, 0.3);
2547
+ `;
2548
+ var ZoomControlsContainer = styled_components_default(ControlButtonContainer)`
2549
+ top: 12px;
2550
+ display: flex;
2551
+ flex-direction: column;
2552
+ `;
2553
+ var FitToDataButtonContainer = styled_components_default(ControlButtonContainer)`
2554
+ top: ${(props) => props.showZoomControls ? "115px" : "12px"};
2555
+ `;
2556
+ var ControlButton = styled_components_default(Button_default)`
2557
+ width: 40px;
2558
+ height: 43px;
2559
+ border: none;
2560
+ background-color: ${(props) => props.controlBackgroundColor};
1777
2561
  background-repeat: no-repeat;
1778
2562
  background-position: center;
2563
+ `;
2564
+ var ZoomInButton = styled_components_default(ControlButton).attrs({
2565
+ "data-test": "zoom-in-button",
2566
+ "data-is-first": true
2567
+ })`
2568
+ background-image: url('data:image/svg+xml;charset=UTF-8,<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M9 1C9 0.447715 8.55229 0 8 0C7.44772 0 7 0.447715 7 1V7H1C0.447715 7 0 7.44772 0 8C0 8.55229 0.447715 9 1 9H7V15C7 15.5523 7.44772 16 8 16C8.55229 16 9 15.5523 9 15V9H15C15.5523 9 16 8.55229 16 8C16 7.44772 15.5523 7 15 7H9V1Z" fill="${(props) => props.controlIconColorEncoded.color}" fill-opacity="${(props) => props.controlIconColorEncoded.opacity}" /></svg>');
2569
+ `;
2570
+ var ZoomOutButton = styled_components_default(ControlButton).attrs({
2571
+ "data-test": "zoom-out-button"
2572
+ })`
2573
+ background-image: url('data:image/svg+xml;charset=UTF-8,<svg width="14" height="3" viewBox="0 0 14 3" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M0 1.99707C0 1.44479 0.447715 0.99707 1 0.99707H13C13.5523 0.99707 14 1.44479 14 1.99707C14 2.54936 13.5523 2.99707 13 2.99707H1C0.447715 2.99707 0 2.54936 0 1.99707Z" fill="${(props) => props.controlIconColorEncoded.color}" fill-opacity="${(props) => props.controlIconColorEncoded.opacity}" /></svg>');
2574
+ `;
2575
+ var StyledFitToDataButton = styled_components_default(ControlButton).attrs({
2576
+ "data-test": "fit-to-data-button"
2577
+ })`
2578
+ height: 40px;
1779
2579
  background-image: url('data:image/svg+xml;charset=UTF-8,<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="9" stroke="${(props) => props.controlIconColorEncoded.color}" stroke-width="2" stroke-linecap="round"/><path d="M12 3.5V6.5M12 20.5V17.5M3.5 12H6.5M20.5 12H17.5" stroke="${(props) => props.controlIconColorEncoded.color}" stroke-width="2" stroke-linecap="round"/></svg>');
1780
2580
  `;
1781
2581
  PureMapContainer_default.displayName = "PureMapContainer";
@@ -1800,13 +2600,13 @@ var PureMap = (props) => {
1800
2600
  onMapClick,
1801
2601
  onOptionsChange,
1802
2602
  title,
1803
- showCoordinates
2603
+ showCoordinates,
2604
+ hasEventHandlers = false
1804
2605
  } = props;
1805
2606
  const { defaultTileConfig, customTileConfig } = (0, react_exports.useContext)(MapContext_default);
1806
2607
  const basemapContainer = (0, react_exports.useRef)(null);
1807
2608
  const map = (0, react_exports.useRef)(null);
1808
2609
  const scaleControl = (0, react_exports.useRef)(null);
1809
- const zoomControl = (0, react_exports.useRef)(null);
1810
2610
  const fitToDataButtonClickedRef = (0, react_exports.useRef)(false);
1811
2611
  const isUserInteractingRef = (0, react_exports.useRef)(false);
1812
2612
  const [hasUserPanned, setHasUserPanned] = react_exports.useState(false);
@@ -1955,8 +2755,6 @@ var PureMap = (props) => {
1955
2755
  setMapMinZoom(mapZoomLevel);
1956
2756
  }
1957
2757
  });
1958
- zoomControl.current = new maplibre_gl_exports.NavigationControl({ showCompass: false });
1959
- map.current.addControl(zoomControl.current, "top-left");
1960
2758
  },
1961
2759
  [lngLatCenter, zoomLevel, layers == null ? void 0 : layers.length]
1962
2760
  );
@@ -2095,6 +2893,19 @@ var PureMap = (props) => {
2095
2893
  }
2096
2894
  onOptionsChangeProxy({ center: void 0, zoom: void 0 });
2097
2895
  }, [onOptionsChangeProxy, fitMapToContent, center, zoom, lngLatCenter, zoomLevel]);
2896
+ const floatingLayerStyleTarget = getFloatingLayerStyleTarget(basemapContainer.current);
2897
+ const stylesManagedExternally = Boolean(floatingLayerStyleTarget);
2898
+ const wrapFloatingLayers = (children) => floatingLayerStyleTarget ? /* @__PURE__ */ react_exports.createElement(styled_components_exports.StyleSheetManager, { target: floatingLayerStyleTarget }, children) : children;
2899
+ const handleZoomIn = (0, react_exports.useCallback)(() => {
2900
+ if (map.current) {
2901
+ map.current.zoomIn();
2902
+ }
2903
+ }, []);
2904
+ const handleZoomOut = (0, react_exports.useCallback)(() => {
2905
+ if (map.current) {
2906
+ map.current.zoomOut();
2907
+ }
2908
+ }, []);
2098
2909
  return /* @__PURE__ */ react_exports.createElement(
2099
2910
  PureMapContainer_default,
2100
2911
  {
@@ -2110,49 +2921,76 @@ var PureMap = (props) => {
2110
2921
  showScale,
2111
2922
  showZoomControls
2112
2923
  },
2113
- showResetButton() && /* @__PURE__ */ react_exports.createElement(
2114
- StyledFitToDataButton,
2924
+ showZoomControls && /* @__PURE__ */ react_exports.createElement(ZoomControlsContainer, { controlBackgroundColor }, /* @__PURE__ */ react_exports.createElement(Tooltip_default, { content: (0, i18n_exports._)("Zoom in"), contentRelationship: "label" }, /* @__PURE__ */ react_exports.createElement(
2925
+ ZoomInButton,
2115
2926
  {
2116
- onClick: handleResetClick,
2117
- title: (0, i18n_exports._)("Fit to data"),
2927
+ onClick: handleZoomIn,
2118
2928
  controlBackgroundColor,
2119
2929
  controlForegroundColor,
2120
- controlIconColorEncoded: formatColor(controlForegroundColor),
2121
- showZoomControls
2930
+ controlIconColorEncoded: formatColor(controlForegroundColor)
2122
2931
  }
2123
- ),
2124
- isMapLoaded && layer && (layer.type === visualization_schemas_exports.LAYER_TYPE.Bubble || layer.type === visualization_schemas_exports.LAYER_TYPE.Marker) && /* @__PURE__ */ react_exports.createElement(
2125
- ClusterLayer_default,
2932
+ )), /* @__PURE__ */ react_exports.createElement(Tooltip_default, { content: (0, i18n_exports._)("Zoom out"), contentRelationship: "label" }, /* @__PURE__ */ react_exports.createElement(
2933
+ ZoomOutButton,
2126
2934
  {
2127
- clusterLayer: layer,
2128
- themeColorScheme,
2129
- map,
2130
- zoom: currentZoomLevel,
2131
- onMapClick,
2132
- showCoordinates
2935
+ onClick: handleZoomOut,
2936
+ controlBackgroundColor,
2937
+ controlForegroundColor,
2938
+ controlIconColorEncoded: formatColor(controlForegroundColor)
2133
2939
  }
2134
- ),
2135
- isMapLoaded && layer && layer.type === visualization_schemas_exports.LAYER_TYPE.Choropleth && layer.source && /* @__PURE__ */ react_exports.createElement(
2136
- LocalChoroplethLayer_default,
2940
+ ))),
2941
+ showResetButton() && /* @__PURE__ */ react_exports.createElement(
2942
+ FitToDataButtonContainer,
2137
2943
  {
2138
- width,
2139
- height,
2140
- map,
2141
- choroplethLayer: layer,
2142
- isThemeChanged,
2143
- setIsThemeChanged: setIsThemeChangedCallback,
2144
- onMapClick
2145
- }
2944
+ controlBackgroundColor,
2945
+ showZoomControls
2946
+ },
2947
+ /* @__PURE__ */ react_exports.createElement(Tooltip_default, { content: (0, i18n_exports._)("Fit to data"), contentRelationship: "label" }, /* @__PURE__ */ react_exports.createElement(
2948
+ StyledFitToDataButton,
2949
+ {
2950
+ onClick: handleResetClick,
2951
+ controlBackgroundColor,
2952
+ controlForegroundColor,
2953
+ controlIconColorEncoded: formatColor(controlForegroundColor)
2954
+ }
2955
+ ))
2146
2956
  ),
2147
- isMapLoaded && layer && layer.type === visualization_schemas_exports.LAYER_TYPE.Choropleth && !layer.source && /* @__PURE__ */ react_exports.createElement(
2148
- ChoroplethLayer_default,
2149
- {
2150
- map,
2151
- choroplethLayer: layer,
2152
- isThemeChanged,
2153
- setIsThemeChanged: setIsThemeChangedCallback,
2154
- onMapClick
2155
- }
2957
+ wrapFloatingLayers(
2958
+ /* @__PURE__ */ react_exports.createElement(react_exports.Fragment, null, isMapLoaded && layer && (layer.type === visualization_schemas_exports.LAYER_TYPE.Bubble || layer.type === visualization_schemas_exports.LAYER_TYPE.Marker) && /* @__PURE__ */ react_exports.createElement(
2959
+ ClusterLayer_default,
2960
+ {
2961
+ clusterLayer: layer,
2962
+ themeColorScheme,
2963
+ map,
2964
+ zoom: currentZoomLevel,
2965
+ onMapClick,
2966
+ showCoordinates,
2967
+ stylesManagedExternally,
2968
+ hasEventHandlers
2969
+ }
2970
+ ), isMapLoaded && layer && layer.type === visualization_schemas_exports.LAYER_TYPE.Choropleth && layer.source && /* @__PURE__ */ react_exports.createElement(MapProvider, null, /* @__PURE__ */ react_exports.createElement(
2971
+ LocalChoroplethLayer_default,
2972
+ {
2973
+ width,
2974
+ height,
2975
+ map,
2976
+ choroplethLayer: layer,
2977
+ isThemeChanged,
2978
+ setIsThemeChanged: setIsThemeChangedCallback,
2979
+ onMapClick,
2980
+ hasEventHandlers
2981
+ }
2982
+ )), isMapLoaded && layer && layer.type === visualization_schemas_exports.LAYER_TYPE.Choropleth && !layer.source && /* @__PURE__ */ react_exports.createElement(MapProvider, null, /* @__PURE__ */ react_exports.createElement(
2983
+ ChoroplethLayer_default,
2984
+ {
2985
+ map,
2986
+ choroplethLayer: layer,
2987
+ isThemeChanged,
2988
+ setIsThemeChanged: setIsThemeChangedCallback,
2989
+ onMapClick,
2990
+ stylesManagedExternally,
2991
+ hasEventHandlers
2992
+ }
2993
+ )))
2156
2994
  )
2157
2995
  );
2158
2996
  };
@@ -2232,36 +3070,36 @@ var PresetPalettes_exports = {};
2232
3070
  __export(PresetPalettes_exports, {
2233
3071
  default: () => PresetPalettes_default
2234
3072
  });
2235
- var defaultImport28 = __toESM(require("@splunk/visualization-color-palettes/editors/PresetPalettes"));
3073
+ var defaultImport30 = __toESM(require("@splunk/visualization-color-palettes/editors/PresetPalettes"));
2236
3074
  __reExport(PresetPalettes_exports, require("@splunk/visualization-color-palettes/editors/PresetPalettes"));
2237
- var PresetPalettes_default = "default" in defaultImport28 ? defaultImport28.default : defaultImport28;
3075
+ var PresetPalettes_default = "default" in defaultImport30 ? defaultImport30.default : defaultImport30;
2238
3076
 
2239
3077
  // esm-externals:@splunk/visualization-icons
2240
3078
  var visualization_icons_exports = {};
2241
3079
  __export(visualization_icons_exports, {
2242
3080
  default: () => visualization_icons_default
2243
3081
  });
2244
- var defaultImport29 = __toESM(require("@splunk/visualization-icons"));
3082
+ var defaultImport31 = __toESM(require("@splunk/visualization-icons"));
2245
3083
  __reExport(visualization_icons_exports, require("@splunk/visualization-icons"));
2246
- var visualization_icons_default = "default" in defaultImport29 ? defaultImport29.default : defaultImport29;
3084
+ var visualization_icons_default = "default" in defaultImport31 ? defaultImport31.default : defaultImport31;
2247
3085
 
2248
3086
  // esm-externals:@splunk/visualization-icons/placeholders
2249
3087
  var placeholders_exports = {};
2250
3088
  __export(placeholders_exports, {
2251
3089
  default: () => placeholders_default
2252
3090
  });
2253
- var defaultImport30 = __toESM(require("@splunk/visualization-icons/placeholders"));
3091
+ var defaultImport32 = __toESM(require("@splunk/visualization-icons/placeholders"));
2254
3092
  __reExport(placeholders_exports, require("@splunk/visualization-icons/placeholders"));
2255
- var placeholders_default = "default" in defaultImport30 ? defaultImport30.default : defaultImport30;
3093
+ var placeholders_default = "default" in defaultImport32 ? defaultImport32.default : defaultImport32;
2256
3094
 
2257
3095
  // esm-externals:@splunk/visualizations-shared/configUtils
2258
3096
  var configUtils_exports = {};
2259
3097
  __export(configUtils_exports, {
2260
3098
  default: () => configUtils_default
2261
3099
  });
2262
- var defaultImport31 = __toESM(require("@splunk/visualizations-shared/configUtils"));
3100
+ var defaultImport33 = __toESM(require("@splunk/visualizations-shared/configUtils"));
2263
3101
  __reExport(configUtils_exports, require("@splunk/visualizations-shared/configUtils"));
2264
- var configUtils_default = "default" in defaultImport31 ? defaultImport31.default : defaultImport31;
3102
+ var configUtils_default = "default" in defaultImport33 ? defaultImport33.default : defaultImport33;
2265
3103
 
2266
3104
  // src/common/utils/configUtils.ts
2267
3105
  function enhanceConfig(vizConfig) {
@@ -2295,18 +3133,18 @@ var pick_exports = {};
2295
3133
  __export(pick_exports, {
2296
3134
  default: () => pick_default
2297
3135
  });
2298
- var defaultImport32 = __toESM(require("@splunk/themes/pick"));
3136
+ var defaultImport34 = __toESM(require("@splunk/themes/pick"));
2299
3137
  __reExport(pick_exports, require("@splunk/themes/pick"));
2300
- var pick_default = "default" in defaultImport32 ? defaultImport32.default : defaultImport32;
3138
+ var pick_default = "default" in defaultImport34 ? defaultImport34.default : defaultImport34;
2301
3139
 
2302
3140
  // esm-externals:@splunk/themes/variables
2303
3141
  var variables_exports = {};
2304
3142
  __export(variables_exports, {
2305
3143
  default: () => variables_default
2306
3144
  });
2307
- var defaultImport33 = __toESM(require("@splunk/themes/variables"));
3145
+ var defaultImport35 = __toESM(require("@splunk/themes/variables"));
2308
3146
  __reExport(variables_exports, require("@splunk/themes/variables"));
2309
- var variables_default = "default" in defaultImport33 ? defaultImport33.default : defaultImport33;
3147
+ var variables_default = "default" in defaultImport35 ? defaultImport35.default : defaultImport35;
2310
3148
 
2311
3149
  // src/common/ThemedDefaults.tsx
2312
3150
  var defaultBackgroundColor = (props) => pick_default({
@@ -2821,54 +3659,54 @@ var getSettingsFromThemedProps_exports = {};
2821
3659
  __export(getSettingsFromThemedProps_exports, {
2822
3660
  default: () => getSettingsFromThemedProps_default
2823
3661
  });
2824
- var defaultImport34 = __toESM(require("@splunk/themes/getSettingsFromThemedProps"));
3662
+ var defaultImport36 = __toESM(require("@splunk/themes/getSettingsFromThemedProps"));
2825
3663
  __reExport(getSettingsFromThemedProps_exports, require("@splunk/themes/getSettingsFromThemedProps"));
2826
- var getSettingsFromThemedProps_default = "default" in defaultImport34 ? defaultImport34.default : defaultImport34;
3664
+ var getSettingsFromThemedProps_default = "default" in defaultImport36 ? defaultImport36.default : defaultImport36;
2827
3665
 
2828
3666
  // esm-externals:@splunk/visualization-encoding/Options
2829
3667
  var Options_exports = {};
2830
3668
  __export(Options_exports, {
2831
3669
  default: () => Options_default
2832
3670
  });
2833
- var defaultImport35 = __toESM(require("@splunk/visualization-encoding/Options"));
3671
+ var defaultImport37 = __toESM(require("@splunk/visualization-encoding/Options"));
2834
3672
  __reExport(Options_exports, require("@splunk/visualization-encoding/Options"));
2835
- var Options_default = "default" in defaultImport35 ? defaultImport35.default : defaultImport35;
3673
+ var Options_default = "default" in defaultImport37 ? defaultImport37.default : defaultImport37;
2836
3674
 
2837
3675
  // esm-externals:@splunk/visualizations-shared/SanitizeProps
2838
3676
  var SanitizeProps_exports = {};
2839
3677
  __export(SanitizeProps_exports, {
2840
3678
  default: () => SanitizeProps_default
2841
3679
  });
2842
- var defaultImport36 = __toESM(require("@splunk/visualizations-shared/SanitizeProps"));
3680
+ var defaultImport38 = __toESM(require("@splunk/visualizations-shared/SanitizeProps"));
2843
3681
  __reExport(SanitizeProps_exports, require("@splunk/visualizations-shared/SanitizeProps"));
2844
- var SanitizeProps_default = "default" in defaultImport36 ? defaultImport36.default : defaultImport36;
3682
+ var SanitizeProps_default = "default" in defaultImport38 ? defaultImport38.default : defaultImport38;
2845
3683
 
2846
3684
  // esm-externals:@splunk/visualization-context/TimezoneContext
2847
3685
  var TimezoneContext_exports = {};
2848
3686
  __export(TimezoneContext_exports, {
2849
3687
  default: () => TimezoneContext_default
2850
3688
  });
2851
- var defaultImport37 = __toESM(require("@splunk/visualization-context/TimezoneContext"));
3689
+ var defaultImport39 = __toESM(require("@splunk/visualization-context/TimezoneContext"));
2852
3690
  __reExport(TimezoneContext_exports, require("@splunk/visualization-context/TimezoneContext"));
2853
- var TimezoneContext_default = "default" in defaultImport37 ? defaultImport37.default : defaultImport37;
3691
+ var TimezoneContext_default = "default" in defaultImport39 ? defaultImport39.default : defaultImport39;
2854
3692
 
2855
3693
  // esm-externals:@splunk/moment
2856
3694
  var moment_exports = {};
2857
3695
  __export(moment_exports, {
2858
3696
  default: () => moment_default
2859
3697
  });
2860
- var defaultImport38 = __toESM(require("@splunk/moment"));
3698
+ var defaultImport40 = __toESM(require("@splunk/moment"));
2861
3699
  __reExport(moment_exports, require("@splunk/moment"));
2862
- var moment_default = "default" in defaultImport38 ? defaultImport38.default : defaultImport38;
3700
+ var moment_default = "default" in defaultImport40 ? defaultImport40.default : defaultImport40;
2863
3701
 
2864
3702
  // esm-externals:@splunk/async-dynamic-options-evaluator
2865
3703
  var async_dynamic_options_evaluator_exports = {};
2866
3704
  __export(async_dynamic_options_evaluator_exports, {
2867
3705
  default: () => async_dynamic_options_evaluator_default
2868
3706
  });
2869
- var defaultImport39 = __toESM(require("@splunk/async-dynamic-options-evaluator"));
3707
+ var defaultImport41 = __toESM(require("@splunk/async-dynamic-options-evaluator"));
2870
3708
  __reExport(async_dynamic_options_evaluator_exports, require("@splunk/async-dynamic-options-evaluator"));
2871
- var async_dynamic_options_evaluator_default = "default" in defaultImport39 ? defaultImport39.default : defaultImport39;
3709
+ var async_dynamic_options_evaluator_default = "default" in defaultImport41 ? defaultImport41.default : defaultImport41;
2872
3710
 
2873
3711
  // src/common/interfaces/VizActionHandler.ts
2874
3712
  var DefaultVizActionHandler = class {
@@ -3076,9 +3914,9 @@ var SizeAwareWrapper_exports = {};
3076
3914
  __export(SizeAwareWrapper_exports, {
3077
3915
  default: () => SizeAwareWrapper_default
3078
3916
  });
3079
- var defaultImport40 = __toESM(require("@splunk/visualizations-shared/SizeAwareWrapper"));
3917
+ var defaultImport42 = __toESM(require("@splunk/visualizations-shared/SizeAwareWrapper"));
3080
3918
  __reExport(SizeAwareWrapper_exports, require("@splunk/visualizations-shared/SizeAwareWrapper"));
3081
- var SizeAwareWrapper_default = "default" in defaultImport40 ? defaultImport40.default : defaultImport40;
3919
+ var SizeAwareWrapper_default = "default" in defaultImport42 ? defaultImport42.default : defaultImport42;
3082
3920
 
3083
3921
  // src/common/components/MissingPropsMessage.tsx
3084
3922
  var isMissing = (v) => {
@@ -3133,7 +3971,7 @@ var Cover = styled_components_default.div`
3133
3971
  bottom: 0;
3134
3972
  `;
3135
3973
  var Blocker = styled_components_default.div.attrs({
3136
- "data-splunk-visualization-version": "28.6.0 - 92427899a"
3974
+ "data-splunk-visualization-version": "28.8.0 - 633c53372"
3137
3975
  })`
3138
3976
  position: relative;
3139
3977
  width: 100%;
@@ -3205,7 +4043,7 @@ var withFixedSizeContainer = (Viz) => {
3205
4043
  FixSizeItem,
3206
4044
  {
3207
4045
  "data-test": "fix-size-item",
3208
- "data-splunk-visualization-version": "28.6.0 - 92427899a",
4046
+ "data-splunk-visualization-version": "28.8.0 - 633c53372",
3209
4047
  width,
3210
4048
  height,
3211
4049
  backgroundColor
@@ -3296,9 +4134,9 @@ var numberUtils_exports = {};
3296
4134
  __export(numberUtils_exports, {
3297
4135
  default: () => numberUtils_default
3298
4136
  });
3299
- var defaultImport41 = __toESM(require("@splunk/visualizations-shared/numberUtils"));
4137
+ var defaultImport43 = __toESM(require("@splunk/visualizations-shared/numberUtils"));
3300
4138
  __reExport(numberUtils_exports, require("@splunk/visualizations-shared/numberUtils"));
3301
- var numberUtils_default = "default" in defaultImport41 ? defaultImport41.default : defaultImport41;
4139
+ var numberUtils_default = "default" in defaultImport43 ? defaultImport43.default : defaultImport43;
3302
4140
 
3303
4141
  // src/common/utils/dataUtils.ts
3304
4142
  var convertToArrOfObjects = (columns, fields) => {
@@ -3697,9 +4535,9 @@ var FeatureFlags_exports = {};
3697
4535
  __export(FeatureFlags_exports, {
3698
4536
  default: () => FeatureFlags_default
3699
4537
  });
3700
- var defaultImport42 = __toESM(require("@splunk/visualization-context/FeatureFlags"));
4538
+ var defaultImport44 = __toESM(require("@splunk/visualization-context/FeatureFlags"));
3701
4539
  __reExport(FeatureFlags_exports, require("@splunk/visualization-context/FeatureFlags"));
3702
- var FeatureFlags_default = "default" in defaultImport42 ? defaultImport42.default : defaultImport42;
4540
+ var FeatureFlags_default = "default" in defaultImport44 ? defaultImport44.default : defaultImport44;
3703
4541
 
3704
4542
  // src/common/utils/featureFlagUtils.ts
3705
4543
  var getFeatureFlag = (context, flagName) => {
@@ -3717,9 +4555,9 @@ var trellisUtils_exports = {};
3717
4555
  __export(trellisUtils_exports, {
3718
4556
  default: () => trellisUtils_default
3719
4557
  });
3720
- var defaultImport43 = __toESM(require("@splunk/visualizations-shared/trellisUtils"));
4558
+ var defaultImport45 = __toESM(require("@splunk/visualizations-shared/trellisUtils"));
3721
4559
  __reExport(trellisUtils_exports, require("@splunk/visualizations-shared/trellisUtils"));
3722
- var trellisUtils_default = "default" in defaultImport43 ? defaultImport43.default : defaultImport43;
4560
+ var trellisUtils_default = "default" in defaultImport45 ? defaultImport45.default : defaultImport45;
3723
4561
 
3724
4562
  // src/common/utils/trellisUtils.ts
3725
4563
  var turnOffLegendDisplayWhenTrellisIsOn = (isTrellisOn, options) => {
@@ -3736,9 +4574,9 @@ var visualization_canvas_exports = {};
3736
4574
  __export(visualization_canvas_exports, {
3737
4575
  default: () => visualization_canvas_default
3738
4576
  });
3739
- var defaultImport44 = __toESM(require("@splunk/visualization-canvas"));
4577
+ var defaultImport46 = __toESM(require("@splunk/visualization-canvas"));
3740
4578
  __reExport(visualization_canvas_exports, require("@splunk/visualization-canvas"));
3741
- var visualization_canvas_default = "default" in defaultImport44 ? defaultImport44.default : defaultImport44;
4579
+ var visualization_canvas_default = "default" in defaultImport46 ? defaultImport46.default : defaultImport46;
3742
4580
 
3743
4581
  // src/common/components/VizStyleWrapper.jsx
3744
4582
  var VizStyleWrapper = styled_components_default.div.attrs(({ dataTestKey }) => ({
@@ -3760,27 +4598,27 @@ var Triangle_exports = {};
3760
4598
  __export(Triangle_exports, {
3761
4599
  default: () => Triangle_default
3762
4600
  });
3763
- var defaultImport45 = __toESM(require("@splunk/react-icons/Triangle"));
4601
+ var defaultImport47 = __toESM(require("@splunk/react-icons/Triangle"));
3764
4602
  __reExport(Triangle_exports, require("@splunk/react-icons/Triangle"));
3765
- var Triangle_default = "default" in defaultImport45 ? defaultImport45.default : defaultImport45;
4603
+ var Triangle_default = "default" in defaultImport47 ? defaultImport47.default : defaultImport47;
3766
4604
 
3767
4605
  // esm-externals:@splunk/visualizations-shared/propUtils
3768
4606
  var propUtils_exports = {};
3769
4607
  __export(propUtils_exports, {
3770
4608
  default: () => propUtils_default
3771
4609
  });
3772
- var defaultImport46 = __toESM(require("@splunk/visualizations-shared/propUtils"));
4610
+ var defaultImport48 = __toESM(require("@splunk/visualizations-shared/propUtils"));
3773
4611
  __reExport(propUtils_exports, require("@splunk/visualizations-shared/propUtils"));
3774
- var propUtils_default = "default" in defaultImport46 ? defaultImport46.default : defaultImport46;
4612
+ var propUtils_default = "default" in defaultImport48 ? defaultImport48.default : defaultImport48;
3775
4613
 
3776
4614
  // esm-externals:@splunk/visualizations-shared/simpleXMLOptions
3777
4615
  var simpleXMLOptions_exports = {};
3778
4616
  __export(simpleXMLOptions_exports, {
3779
4617
  default: () => simpleXMLOptions_default
3780
4618
  });
3781
- var defaultImport47 = __toESM(require("@splunk/visualizations-shared/simpleXMLOptions"));
4619
+ var defaultImport49 = __toESM(require("@splunk/visualizations-shared/simpleXMLOptions"));
3782
4620
  __reExport(simpleXMLOptions_exports, require("@splunk/visualizations-shared/simpleXMLOptions"));
3783
- var simpleXMLOptions_default = "default" in defaultImport47 ? defaultImport47.default : defaultImport47;
4621
+ var simpleXMLOptions_default = "default" in defaultImport49 ? defaultImport49.default : defaultImport49;
3784
4622
 
3785
4623
  // src/common/chartingUtils.ts
3786
4624
  var DEFAULT_LINE_WIDTH = 2;
@@ -5118,9 +5956,9 @@ var dsl_exports = {};
5118
5956
  __export(dsl_exports, {
5119
5957
  default: () => dsl_default
5120
5958
  });
5121
- var defaultImport48 = __toESM(require("@splunk/visualization-encoding/utils/dsl"));
5959
+ var defaultImport50 = __toESM(require("@splunk/visualization-encoding/utils/dsl"));
5122
5960
  __reExport(dsl_exports, require("@splunk/visualization-encoding/utils/dsl"));
5123
- var dsl_default = "default" in defaultImport48 ? defaultImport48.default : defaultImport48;
5961
+ var dsl_default = "default" in defaultImport50 ? defaultImport50.default : defaultImport50;
5124
5962
 
5125
5963
  // src/common/utils/mapUtils.ts
5126
5964
  var columnsNullToZeros = (config2, dataSources, options) => {
@@ -5196,7 +6034,7 @@ var formatLayer = (l, dataFields, dataSourceData, transformedData) => {
5196
6034
  };
5197
6035
  var computeVizProps = (props) => {
5198
6036
  var _a, _b, _c;
5199
- const { themeFunc, theme, layers, dataSources, onOptionsChange, title } = props;
6037
+ const { themeFunc, theme, layers, dataSources, onOptionsChange, title, hasEventHandlers } = props;
5200
6038
  const themeColorVariables = ["controlBackgroundColor", "controlForegroundColor"];
5201
6039
  const themeColors = {};
5202
6040
  themeColorVariables.forEach((variable) => {
@@ -5213,7 +6051,8 @@ var computeVizProps = (props) => {
5213
6051
  themeColorScheme
5214
6052
  }), layers), {
5215
6053
  onOptionsChange,
5216
- title
6054
+ title,
6055
+ hasEventHandlers
5217
6056
  });
5218
6057
  };
5219
6058
  var withTooltipFields = (Viz) => {