@splunk/visualizations 28.6.0 → 28.7.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 (366) hide show
  1. package/Area.js +2 -2
  2. package/Bar.js +2 -2
  3. package/Bubble.js +2 -2
  4. package/CHANGELOG.external.md +19 -50
  5. package/ChoroplethSvg.js +2 -2
  6. package/Column.js +2 -2
  7. package/Ellipse.js +2 -2
  8. package/Events/PureEvents/FieldSummaryTooltip.d.ts +8 -31
  9. package/Events/PureEvents/FieldSummaryTooltip.d.ts.map +1 -1
  10. package/Events/PureEvents/PureEvents.d.ts.map +1 -1
  11. package/Events/PureEvents/TimeControlsPopover.d.ts +6 -25
  12. package/Events/PureEvents/TimeControlsPopover.d.ts.map +1 -1
  13. package/Events.js +27 -101
  14. package/Events.js.map +2 -2
  15. package/FillerGauge.js +2 -2
  16. package/Image.js +2 -2
  17. package/Line.js +2 -2
  18. package/LinkGraph.js +2 -2
  19. package/Map/Map.d.ts +1 -0
  20. package/Map/Map.d.ts.map +1 -1
  21. package/Map/PureMap/BubbleLayer.d.ts +22 -4
  22. package/Map/PureMap/BubbleLayer.d.ts.map +1 -1
  23. package/Map/PureMap/ChoroplethLayer.d.ts +9 -1
  24. package/Map/PureMap/ChoroplethLayer.d.ts.map +1 -1
  25. package/Map/PureMap/ClusterLayer.d.ts +3 -1
  26. package/Map/PureMap/ClusterLayer.d.ts.map +1 -1
  27. package/Map/PureMap/LocalChoroplethLayer.d.ts +1 -0
  28. package/Map/PureMap/LocalChoroplethLayer.d.ts.map +1 -1
  29. package/Map/PureMap/MapContext.d.ts +13 -0
  30. package/Map/PureMap/MapContext.d.ts.map +1 -0
  31. package/Map/PureMap/MarkerLayer.d.ts +19 -2
  32. package/Map/PureMap/MarkerLayer.d.ts.map +1 -1
  33. package/Map/PureMap/MarkerWrapper.d.ts +3 -2
  34. package/Map/PureMap/MarkerWrapper.d.ts.map +1 -1
  35. package/Map/PureMap/PureMap.d.ts +1 -0
  36. package/Map/PureMap/PureMap.d.ts.map +1 -1
  37. package/Map/PureMap/PureMapContainer.d.ts.map +1 -1
  38. package/Map/PureMap/Tooltip.d.ts +6 -1
  39. package/Map/PureMap/Tooltip.d.ts.map +1 -1
  40. package/Map/PureMap/keyboardConstants.d.ts +11 -0
  41. package/Map/PureMap/keyboardConstants.d.ts.map +1 -0
  42. package/Map/PureMap/useRovingTabindex.d.ts +18 -0
  43. package/Map/PureMap/useRovingTabindex.d.ts.map +1 -0
  44. package/Map.js +1317 -478
  45. package/Map.js.map +4 -4
  46. package/Markdown/Markdown.d.ts.map +1 -1
  47. package/Markdown.js +23 -6
  48. package/Markdown.js.map +2 -2
  49. package/MarkerGauge.js +2 -2
  50. package/NetworkGraph/NetworkGraph.d.ts +2 -5
  51. package/NetworkGraph/NetworkGraph.d.ts.map +1 -1
  52. package/NetworkGraph/PureNetworkGraph/PureNetworkGraph.d.ts.map +1 -1
  53. package/NetworkGraph/PureNetworkGraph/components/NetworkGraphSvg.d.ts +1 -0
  54. package/NetworkGraph/PureNetworkGraph/components/NetworkGraphSvg.d.ts.map +1 -1
  55. package/NetworkGraph/PureNetworkGraph/components/Node.d.ts +1 -0
  56. package/NetworkGraph/PureNetworkGraph/components/Node.d.ts.map +1 -1
  57. package/NetworkGraph/PureNetworkGraph/components/Tooltip.d.ts +1 -1
  58. package/NetworkGraph/PureNetworkGraph/components/Tooltip.d.ts.map +1 -1
  59. package/NetworkGraph/PureNetworkGraph/components/ZoomControls.d.ts +1 -0
  60. package/NetworkGraph/PureNetworkGraph/components/ZoomControls.d.ts.map +1 -1
  61. package/NetworkGraph/PureNetworkGraph/utils/networkGraphUtils.d.ts +23 -0
  62. package/NetworkGraph/PureNetworkGraph/utils/networkGraphUtils.d.ts.map +1 -1
  63. package/NetworkGraph.config.js +2 -0
  64. package/NetworkGraph.config.js.map +2 -2
  65. package/NetworkGraph.js +353 -40
  66. package/NetworkGraph.js.map +4 -4
  67. package/ParallelCoordinates.js +2 -2
  68. package/Pie.js +2 -2
  69. package/ProcessTree/ProcessTree.d.ts +3 -1
  70. package/ProcessTree/ProcessTree.d.ts.map +1 -1
  71. package/ProcessTree/PureProcessTree/PureProcessTree.d.ts +1 -0
  72. package/ProcessTree/PureProcessTree/PureProcessTree.d.ts.map +1 -1
  73. package/ProcessTree/PureProcessTree/components/ProcessTreeLeftPanel.d.ts +2 -0
  74. package/ProcessTree/PureProcessTree/components/ProcessTreeLeftPanel.d.ts.map +1 -1
  75. package/ProcessTree/PureProcessTree/components/ProcessTreeRightPanel.d.ts.map +1 -1
  76. package/ProcessTree/PureProcessTree/hooks/useProcessTreeGraphData.d.ts +3 -1
  77. package/ProcessTree/PureProcessTree/hooks/useProcessTreeGraphData.d.ts.map +1 -1
  78. package/ProcessTree/PureProcessTree/mockdata/data.d.ts.map +1 -1
  79. package/ProcessTree/PureProcessTree/utils/processTreeUtils.d.ts +3 -1
  80. package/ProcessTree/PureProcessTree/utils/processTreeUtils.d.ts.map +1 -1
  81. package/ProcessTree.js +101 -31
  82. package/ProcessTree.js.map +3 -3
  83. package/Punchcard.js +2 -2
  84. package/README.md +2 -0
  85. package/Rectangle.js +2 -2
  86. package/RichText.js +2 -2
  87. package/Sankey.js +2 -2
  88. package/Scatter.js +2 -2
  89. package/SingleValue.js +368 -471
  90. package/SingleValue.js.map +4 -4
  91. package/SingleValueIcon.js +2 -2
  92. package/SingleValueRadial.js +2 -2
  93. package/SparkLine/SparkLine.d.ts +57 -0
  94. package/SparkLine/SparkLine.d.ts.map +1 -0
  95. package/SparkLine/index.d.ts +1 -1
  96. package/SparkLine/index.d.ts.map +1 -1
  97. package/SparkLine.js +384 -485
  98. package/SparkLine.js.map +4 -4
  99. package/Table/PureTable.d.ts.map +1 -1
  100. package/Table/hooks.d.ts +1 -1
  101. package/Table/hooks.d.ts.map +1 -1
  102. package/Table.js +391 -493
  103. package/Table.js.map +4 -4
  104. package/Timeline.js +2 -2
  105. package/common/OptionsDoc.js.map +1 -1
  106. package/common/utils/mapUtils.js +512 -179
  107. package/common/utils/mapUtils.js.map +4 -4
  108. package/common/utils/shadowDomUtils.d.ts +2 -0
  109. package/common/utils/shadowDomUtils.d.ts.map +1 -0
  110. package/common/utils/shadowDomUtils.js +39 -0
  111. package/common/utils/shadowDomUtils.js.map +7 -0
  112. package/common/withDashboardViz.js +2 -2
  113. package/docs-llm/INDEX.md +118 -0
  114. package/docs-llm/area/examples-json.md +3854 -0
  115. package/docs-llm/area/examples-react.md +2816 -0
  116. package/docs-llm/area/options.md +97 -0
  117. package/docs-llm/area/overview.md +27 -0
  118. package/docs-llm/bar/examples-json.md +3380 -0
  119. package/docs-llm/bar/examples-react.md +2352 -0
  120. package/docs-llm/bar/options.md +89 -0
  121. package/docs-llm/bar/overview.md +25 -0
  122. package/docs-llm/bubble/examples-json.md +4082 -0
  123. package/docs-llm/bubble/examples-react.md +3977 -0
  124. package/docs-llm/bubble/options.md +62 -0
  125. package/docs-llm/bubble/overview.md +26 -0
  126. package/docs-llm/choropleth-svg/examples-json.md +397 -0
  127. package/docs-llm/choropleth-svg/examples-react.md +389 -0
  128. package/docs-llm/choropleth-svg/options.md +15 -0
  129. package/docs-llm/choropleth-svg/overview.md +23 -0
  130. package/docs-llm/column/examples-json.md +3898 -0
  131. package/docs-llm/column/examples-react.md +2653 -0
  132. package/docs-llm/column/options.md +94 -0
  133. package/docs-llm/column/overview.md +31 -0
  134. package/docs-llm/dsl/examples-json.md +43 -0
  135. package/docs-llm/dsl/examples-react.md +78 -0
  136. package/docs-llm/dsl/formatters/format-by-type-examples-json.md +58 -0
  137. package/docs-llm/dsl/formatters/format-by-type-examples-react.md +43 -0
  138. package/docs-llm/dsl/formatters/format-by-type.md +38 -0
  139. package/docs-llm/dsl/formatters/frame-examples-json.md +42 -0
  140. package/docs-llm/dsl/formatters/frame-examples-react.md +24 -0
  141. package/docs-llm/dsl/formatters/frame.md +6 -0
  142. package/docs-llm/dsl/formatters/gradient-examples-json.md +98 -0
  143. package/docs-llm/dsl/formatters/gradient-examples-react.md +44 -0
  144. package/docs-llm/dsl/formatters/gradient.md +23 -0
  145. package/docs-llm/dsl/formatters/lerp-examples-json.md +40 -0
  146. package/docs-llm/dsl/formatters/lerp-examples-react.md +28 -0
  147. package/docs-llm/dsl/formatters/lerp.md +19 -0
  148. package/docs-llm/dsl/formatters/match-value-examples-json.md +65 -0
  149. package/docs-llm/dsl/formatters/match-value-examples-react.md +37 -0
  150. package/docs-llm/dsl/formatters/match-value.md +13 -0
  151. package/docs-llm/dsl/formatters/max-contrast-examples-json.md +39 -0
  152. package/docs-llm/dsl/formatters/max-contrast-examples-react.md +27 -0
  153. package/docs-llm/dsl/formatters/max-contrast.md +9 -0
  154. package/docs-llm/dsl/formatters/multi-format-examples-json.md +67 -0
  155. package/docs-llm/dsl/formatters/multi-format-examples-react.md +49 -0
  156. package/docs-llm/dsl/formatters/multi-format.md +12 -0
  157. package/docs-llm/dsl/formatters/objects-examples-json.md +49 -0
  158. package/docs-llm/dsl/formatters/objects-examples-react.md +37 -0
  159. package/docs-llm/dsl/formatters/objects.md +3 -0
  160. package/docs-llm/dsl/formatters/pick-examples-json.md +59 -0
  161. package/docs-llm/dsl/formatters/pick-examples-react.md +30 -0
  162. package/docs-llm/dsl/formatters/pick.md +9 -0
  163. package/docs-llm/dsl/formatters/prefix-examples-json.md +29 -0
  164. package/docs-llm/dsl/formatters/prefix-examples-react.md +19 -0
  165. package/docs-llm/dsl/formatters/prefix.md +3 -0
  166. package/docs-llm/dsl/formatters/prepend-examples-json.md +51 -0
  167. package/docs-llm/dsl/formatters/prepend-examples-react.md +33 -0
  168. package/docs-llm/dsl/formatters/prepend.md +9 -0
  169. package/docs-llm/dsl/formatters/range-value-examples-json.md +48 -0
  170. package/docs-llm/dsl/formatters/range-value-examples-react.md +34 -0
  171. package/docs-llm/dsl/formatters/range-value.md +15 -0
  172. package/docs-llm/dsl/formatters/set-color-channel-examples-json.md +40 -0
  173. package/docs-llm/dsl/formatters/set-color-channel-examples-react.md +31 -0
  174. package/docs-llm/dsl/formatters/set-color-channel.md +9 -0
  175. package/docs-llm/dsl/formatters/suffix-examples-json.md +29 -0
  176. package/docs-llm/dsl/formatters/suffix-examples-react.md +19 -0
  177. package/docs-llm/dsl/formatters/suffix.md +3 -0
  178. package/docs-llm/dsl/formatters/type-examples-json.md +37 -0
  179. package/docs-llm/dsl/formatters/type-examples-react.md +20 -0
  180. package/docs-llm/dsl/formatters/type.md +3 -0
  181. package/docs-llm/dsl/overview.md +41 -0
  182. package/docs-llm/dsl/selectors/abs.md +7 -0
  183. package/docs-llm/dsl/selectors/ceil.md +7 -0
  184. package/docs-llm/dsl/selectors/data-frame-average-examples-json.md +41 -0
  185. package/docs-llm/dsl/selectors/data-frame-average-examples-react.md +36 -0
  186. package/docs-llm/dsl/selectors/data-frame-average.md +7 -0
  187. package/docs-llm/dsl/selectors/data-frame-count-examples-json.md +41 -0
  188. package/docs-llm/dsl/selectors/data-frame-count-examples-react.md +36 -0
  189. package/docs-llm/dsl/selectors/data-frame-count.md +7 -0
  190. package/docs-llm/dsl/selectors/data-frame-examples-json.md +830 -0
  191. package/docs-llm/dsl/selectors/data-frame-examples-react.md +929 -0
  192. package/docs-llm/dsl/selectors/data-frame-get-field-examples-json.md +89 -0
  193. package/docs-llm/dsl/selectors/data-frame-get-field-examples-react.md +124 -0
  194. package/docs-llm/dsl/selectors/data-frame-get-field.md +5 -0
  195. package/docs-llm/dsl/selectors/data-frame-get-raw-value.md +5 -0
  196. package/docs-llm/dsl/selectors/data-frame-get-type.md +5 -0
  197. package/docs-llm/dsl/selectors/data-frame-get-value.md +5 -0
  198. package/docs-llm/dsl/selectors/data-frame-max-examples-json.md +51 -0
  199. package/docs-llm/dsl/selectors/data-frame-max-examples-react.md +41 -0
  200. package/docs-llm/dsl/selectors/data-frame-max.md +7 -0
  201. package/docs-llm/dsl/selectors/data-frame-min-examples-json.md +51 -0
  202. package/docs-llm/dsl/selectors/data-frame-min-examples-react.md +41 -0
  203. package/docs-llm/dsl/selectors/data-frame-min.md +7 -0
  204. package/docs-llm/dsl/selectors/data-frame-percentile-examples-json.md +41 -0
  205. package/docs-llm/dsl/selectors/data-frame-percentile-examples-react.md +36 -0
  206. package/docs-llm/dsl/selectors/data-frame-percentile.md +8 -0
  207. package/docs-llm/dsl/selectors/data-frame-set-value.md +5 -0
  208. package/docs-llm/dsl/selectors/data-frame-sum-examples-json.md +51 -0
  209. package/docs-llm/dsl/selectors/data-frame-sum-examples-react.md +41 -0
  210. package/docs-llm/dsl/selectors/data-frame-sum.md +7 -0
  211. package/docs-llm/dsl/selectors/data-frame.md +4 -0
  212. package/docs-llm/dsl/selectors/data-point-get-field.md +5 -0
  213. package/docs-llm/dsl/selectors/data-point-get-raw-value.md +4 -0
  214. package/docs-llm/dsl/selectors/data-point-get-type.md +5 -0
  215. package/docs-llm/dsl/selectors/data-point-get-value.md +5 -0
  216. package/docs-llm/dsl/selectors/data-point-set-value.md +4 -0
  217. package/docs-llm/dsl/selectors/data-point.md +5 -0
  218. package/docs-llm/dsl/selectors/data-series-average.md +22 -0
  219. package/docs-llm/dsl/selectors/data-series-count.md +14 -0
  220. package/docs-llm/dsl/selectors/data-series-get-field.md +5 -0
  221. package/docs-llm/dsl/selectors/data-series-get-raw-value.md +4 -0
  222. package/docs-llm/dsl/selectors/data-series-get-type.md +5 -0
  223. package/docs-llm/dsl/selectors/data-series-get-value.md +4 -0
  224. package/docs-llm/dsl/selectors/data-series-max.md +5 -0
  225. package/docs-llm/dsl/selectors/data-series-min.md +5 -0
  226. package/docs-llm/dsl/selectors/data-series-percentile.md +17 -0
  227. package/docs-llm/dsl/selectors/data-series-set-value.md +4 -0
  228. package/docs-llm/dsl/selectors/data-series-sum.md +24 -0
  229. package/docs-llm/dsl/selectors/data-series.md +4 -0
  230. package/docs-llm/dsl/selectors/delta.md +7 -0
  231. package/docs-llm/dsl/selectors/divide.md +8 -0
  232. package/docs-llm/dsl/selectors/first-point.md +5 -0
  233. package/docs-llm/dsl/selectors/floor.md +7 -0
  234. package/docs-llm/dsl/selectors/frame-by-series-index-range-examples-json.md +89 -0
  235. package/docs-llm/dsl/selectors/frame-by-series-index-range-examples-react.md +88 -0
  236. package/docs-llm/dsl/selectors/frame-by-series-index-range.md +10 -0
  237. package/docs-llm/dsl/selectors/frame-by-series-indexes-examples-json.md +88 -0
  238. package/docs-llm/dsl/selectors/frame-by-series-indexes-examples-react.md +87 -0
  239. package/docs-llm/dsl/selectors/frame-by-series-indexes.md +9 -0
  240. package/docs-llm/dsl/selectors/frame-by-series-names-examples-json.md +89 -0
  241. package/docs-llm/dsl/selectors/frame-by-series-names-examples-react.md +88 -0
  242. package/docs-llm/dsl/selectors/frame-by-series-names-or-indexes-examples-json.md +89 -0
  243. package/docs-llm/dsl/selectors/frame-by-series-names-or-indexes-examples-react.md +88 -0
  244. package/docs-llm/dsl/selectors/frame-by-series-names-or-indexes.md +9 -0
  245. package/docs-llm/dsl/selectors/frame-by-series-names.md +9 -0
  246. package/docs-llm/dsl/selectors/frame-by-series-types-examples-json.md +89 -0
  247. package/docs-llm/dsl/selectors/frame-by-series-types-examples-react.md +88 -0
  248. package/docs-llm/dsl/selectors/frame-by-series-types.md +9 -0
  249. package/docs-llm/dsl/selectors/frame-without-internal-fields-examples-json.md +137 -0
  250. package/docs-llm/dsl/selectors/frame-without-internal-fields-examples-react.md +135 -0
  251. package/docs-llm/dsl/selectors/frame-without-internal-fields-except-examples-json.md +157 -0
  252. package/docs-llm/dsl/selectors/frame-without-internal-fields-except-examples-react.md +155 -0
  253. package/docs-llm/dsl/selectors/frame-without-internal-fields-except.md +21 -0
  254. package/docs-llm/dsl/selectors/frame-without-internal-fields.md +17 -0
  255. package/docs-llm/dsl/selectors/frame-without-series-names.md +8 -0
  256. package/docs-llm/dsl/selectors/last-point.md +5 -0
  257. package/docs-llm/dsl/selectors/minus.md +8 -0
  258. package/docs-llm/dsl/selectors/multiply.md +8 -0
  259. package/docs-llm/dsl/selectors/plus.md +8 -0
  260. package/docs-llm/dsl/selectors/point-by-index.md +6 -0
  261. package/docs-llm/dsl/selectors/points-by-indexes.md +6 -0
  262. package/docs-llm/dsl/selectors/round.md +7 -0
  263. package/docs-llm/dsl/selectors/series-by-index-examples-json.md +49 -0
  264. package/docs-llm/dsl/selectors/series-by-index-examples-react.md +39 -0
  265. package/docs-llm/dsl/selectors/series-by-index.md +8 -0
  266. package/docs-llm/dsl/selectors/series-by-name-examples-json.md +49 -0
  267. package/docs-llm/dsl/selectors/series-by-name-examples-react.md +39 -0
  268. package/docs-llm/dsl/selectors/series-by-name.md +8 -0
  269. package/docs-llm/dsl/selectors/series-by-prioritized-types-examples-json.md +47 -0
  270. package/docs-llm/dsl/selectors/series-by-prioritized-types-examples-react.md +39 -0
  271. package/docs-llm/dsl/selectors/series-by-prioritized-types.md +10 -0
  272. package/docs-llm/dsl/selectors/series-by-type-examples-json.md +49 -0
  273. package/docs-llm/dsl/selectors/series-by-type-examples-react.md +39 -0
  274. package/docs-llm/dsl/selectors/series-by-type.md +10 -0
  275. package/docs-llm/dsl/selectors/series-by-types.md +6 -0
  276. package/docs-llm/ellipse/examples-json.md +5 -0
  277. package/docs-llm/ellipse/examples-react.md +5 -0
  278. package/docs-llm/ellipse/options.md +16 -0
  279. package/docs-llm/ellipse/overview.md +5 -0
  280. package/docs-llm/events/examples-json.md +705 -0
  281. package/docs-llm/events/examples-react.md +536 -0
  282. package/docs-llm/events/options.md +18 -0
  283. package/docs-llm/events/overview.md +5 -0
  284. package/docs-llm/filler-gauge/examples-json.md +376 -0
  285. package/docs-llm/filler-gauge/examples-react.md +274 -0
  286. package/docs-llm/filler-gauge/options.md +26 -0
  287. package/docs-llm/filler-gauge/overview.md +5 -0
  288. package/docs-llm/image/examples-json.md +39 -0
  289. package/docs-llm/image/examples-react.md +65 -0
  290. package/docs-llm/image/options.md +13 -0
  291. package/docs-llm/image/overview.md +5 -0
  292. package/docs-llm/line/examples-json.md +3724 -0
  293. package/docs-llm/line/examples-react.md +2683 -0
  294. package/docs-llm/line/options.md +95 -0
  295. package/docs-llm/line/overview.md +29 -0
  296. package/docs-llm/link-graph/examples-json.md +5 -0
  297. package/docs-llm/link-graph/examples-react.md +5 -0
  298. package/docs-llm/link-graph/options.md +26 -0
  299. package/docs-llm/link-graph/overview.md +16 -0
  300. package/docs-llm/map/examples-json.md +13973 -0
  301. package/docs-llm/map/examples-react.md +6154 -0
  302. package/docs-llm/map/options.md +22 -0
  303. package/docs-llm/map/overview.md +32 -0
  304. package/docs-llm/markdown/examples-json.md +63 -0
  305. package/docs-llm/markdown/examples-react.md +98 -0
  306. package/docs-llm/markdown/options.md +17 -0
  307. package/docs-llm/markdown/overview.md +5 -0
  308. package/docs-llm/marker-gauge/examples-json.md +436 -0
  309. package/docs-llm/marker-gauge/examples-react.md +367 -0
  310. package/docs-llm/marker-gauge/options.md +26 -0
  311. package/docs-llm/marker-gauge/overview.md +5 -0
  312. package/docs-llm/network-graph/examples-json.md +8843 -0
  313. package/docs-llm/network-graph/examples-react.md +7339 -0
  314. package/docs-llm/network-graph/options.md +50 -0
  315. package/docs-llm/network-graph/overview.md +28 -0
  316. package/docs-llm/parallel-coordinates/examples-json.md +8376 -0
  317. package/docs-llm/parallel-coordinates/examples-react.md +2771 -0
  318. package/docs-llm/parallel-coordinates/options.md +14 -0
  319. package/docs-llm/parallel-coordinates/overview.md +22 -0
  320. package/docs-llm/pie/examples-json.md +851 -0
  321. package/docs-llm/pie/examples-react.md +606 -0
  322. package/docs-llm/pie/options.md +34 -0
  323. package/docs-llm/pie/overview.md +23 -0
  324. package/docs-llm/process-tree/options.md +32 -0
  325. package/docs-llm/punchcard/examples-json.md +6134 -0
  326. package/docs-llm/punchcard/examples-react.md +4562 -0
  327. package/docs-llm/punchcard/options.md +33 -0
  328. package/docs-llm/punchcard/overview.md +5 -0
  329. package/docs-llm/pure-rich-text/options.md +28 -0
  330. package/docs-llm/rectangle/examples-json.md +5 -0
  331. package/docs-llm/rectangle/examples-react.md +5 -0
  332. package/docs-llm/rectangle/options.md +19 -0
  333. package/docs-llm/rectangle/overview.md +5 -0
  334. package/docs-llm/rich-text/examples-json.md +96 -0
  335. package/docs-llm/rich-text/examples-react.md +119 -0
  336. package/docs-llm/rich-text/options.md +28 -0
  337. package/docs-llm/rich-text/overview.md +5 -0
  338. package/docs-llm/sankey/examples-json.md +844 -0
  339. package/docs-llm/sankey/examples-react.md +546 -0
  340. package/docs-llm/sankey/options.md +19 -0
  341. package/docs-llm/sankey/overview.md +24 -0
  342. package/docs-llm/scatter/examples-json.md +4012 -0
  343. package/docs-llm/scatter/examples-react.md +3914 -0
  344. package/docs-llm/scatter/options.md +68 -0
  345. package/docs-llm/scatter/overview.md +25 -0
  346. package/docs-llm/single-value/examples-json.md +2613 -0
  347. package/docs-llm/single-value/examples-react.md +2296 -0
  348. package/docs-llm/single-value/options.md +49 -0
  349. package/docs-llm/single-value/overview.md +23 -0
  350. package/docs-llm/single-value-icon/examples-json.md +1686 -0
  351. package/docs-llm/single-value-icon/examples-react.md +1573 -0
  352. package/docs-llm/single-value-icon/options.md +43 -0
  353. package/docs-llm/single-value-icon/overview.md +5 -0
  354. package/docs-llm/single-value-radial/examples-json.md +1178 -0
  355. package/docs-llm/single-value-radial/examples-react.md +1028 -0
  356. package/docs-llm/single-value-radial/options.md +41 -0
  357. package/docs-llm/single-value-radial/overview.md +5 -0
  358. package/docs-llm/table/examples-json.md +5 -0
  359. package/docs-llm/table/examples-react.md +5 -0
  360. package/docs-llm/table/options.md +25 -0
  361. package/docs-llm/table/overview.md +24 -0
  362. package/docs-llm/timeline/examples-json.md +5 -0
  363. package/docs-llm/timeline/examples-react.md +5 -0
  364. package/docs-llm/timeline/options.md +27 -0
  365. package/docs-llm/timeline/overview.md +24 -0
  366. package/package.json +28 -24
package/NetworkGraph.js CHANGED
@@ -1674,7 +1674,7 @@ var Cover = styled_components_default.div`
1674
1674
  bottom: 0;
1675
1675
  `;
1676
1676
  var Blocker = styled_components_default.div.attrs({
1677
- "data-splunk-visualization-version": "28.6.0 - 92427899a"
1677
+ "data-splunk-visualization-version": "28.7.0 - d7b18cab6"
1678
1678
  })`
1679
1679
  position: relative;
1680
1680
  width: 100%;
@@ -1785,7 +1785,7 @@ var withFixedSizeContainer = (Viz) => {
1785
1785
  FixSizeItem,
1786
1786
  {
1787
1787
  "data-test": "fix-size-item",
1788
- "data-splunk-visualization-version": "28.6.0 - 92427899a",
1788
+ "data-splunk-visualization-version": "28.7.0 - d7b18cab6",
1789
1789
  width,
1790
1790
  height,
1791
1791
  backgroundColor
@@ -4117,6 +4117,9 @@ var RECT_TOP_MARGIN = 4;
4117
4117
  var LABEL_FONT_SIZE = 12;
4118
4118
  var FONT = `${LABEL_FONT_SIZE}px ${VIZ_FONT_FAMILY}`;
4119
4119
  var DIM_OPACITY = 0.25;
4120
+ var NODE_FOCUS_RING_PADDING = 4;
4121
+ var NODE_FOCUS_RING_STROKE_WIDTH = 3;
4122
+ var NODE_FOCUS_RING_SCREEN_PADDING = NODE_FOCUS_RING_STROKE_WIDTH / 2;
4120
4123
  var MIN_NODE_SPACING = 4;
4121
4124
  var MIN_EDGE_LENGTH = 48;
4122
4125
  var MIN_NODE_CONTAINER_SIZE = DEFAULT_NODE_RADIUS * 2 + MIN_EDGE_LENGTH;
@@ -4547,9 +4550,10 @@ var truncateTextToMaxLines = (text = "", font = `12px ${VIZ_FONT_FAMILY}`, maxWi
4547
4550
  }
4548
4551
  return outputLines;
4549
4552
  };
4550
- var getNodeBounds = (node) => {
4553
+ var getNodeBounds = (node, options = {}) => {
4551
4554
  var _a, _b;
4552
4555
  if (!node) return void 0;
4556
+ if (!Number.isFinite(node.x) || !Number.isFinite(node.y)) return void 0;
4553
4557
  const truncatedText = truncateTextToMaxLines((_a = node.label) != null ? _a : "", FONT, MAX_TEXT_WIDTH, 2);
4554
4558
  const textWidth = truncatedText.length ? Math.max(...truncatedText.map((line) => computeTextWidth(line, FONT))) : 0;
4555
4559
  const labelHeight = truncatedText.length > 0 ? RECT_VERTICAL_PADDING * 2 + LINE_HEIGHT * truncatedText.length : 0;
@@ -4557,13 +4561,156 @@ var getNodeBounds = (node) => {
4557
4561
  const nodeLabelWidth = textWidth + RECT_HORIZONTAL_PADDING * 2;
4558
4562
  const nodeDiameter = (_b = node.size) != null ? _b : DEFAULT_NODE_RADIUS * 2;
4559
4563
  const nodeRadius = nodeDiameter / 2;
4564
+ const nodeCircleRadius = options.includeFocusRing ? nodeRadius + NODE_FOCUS_RING_PADDING : nodeRadius;
4565
+ const nodeLeft = node.x - Math.max(nodeCircleRadius, nodeLabelWidth / 2);
4566
+ const nodeWidth = Math.max(nodeCircleRadius * 2, nodeLabelWidth);
4560
4567
  return {
4561
- x: node.x - Math.max(nodeRadius, nodeLabelWidth / 2),
4562
- y: node.y - nodeRadius,
4563
- x2: node.x - Math.max(nodeRadius, nodeLabelWidth / 2) + Math.max(nodeRadius * 2, nodeLabelWidth),
4564
- y2: node.y + nodeRadius + nodeLabelHeightWithMargin
4568
+ x: nodeLeft,
4569
+ y: node.y - nodeCircleRadius,
4570
+ x2: nodeLeft + nodeWidth,
4571
+ y2: Math.max(node.y + nodeCircleRadius, node.y + nodeRadius + nodeLabelHeightWithMargin)
4565
4572
  };
4566
4573
  };
4574
+ var getScreenBounds = (node, transform, options = {}) => {
4575
+ const bounds = getNodeBounds(node, options);
4576
+ if (!bounds) {
4577
+ return null;
4578
+ }
4579
+ const screenPadding = options.includeFocusRing ? NODE_FOCUS_RING_SCREEN_PADDING : 0;
4580
+ const left = bounds.x * transform.k + transform.x - screenPadding;
4581
+ const top = bounds.y * transform.k + transform.y - screenPadding;
4582
+ const right = bounds.x2 * transform.k + transform.x + screenPadding;
4583
+ const bottom = bounds.y2 * transform.k + transform.y + screenPadding;
4584
+ return {
4585
+ left,
4586
+ top,
4587
+ right,
4588
+ bottom,
4589
+ width: right - left,
4590
+ height: bottom - top
4591
+ };
4592
+ };
4593
+ var isNodePartiallyVisible = (node, transform, viewportWidth, viewportHeight) => {
4594
+ const bounds = getScreenBounds(node, transform);
4595
+ if (!bounds) {
4596
+ return false;
4597
+ }
4598
+ return bounds.right >= 0 && bounds.left <= viewportWidth && bounds.bottom >= 0 && bounds.top <= viewportHeight;
4599
+ };
4600
+ var getOrderedNodesWithPositions = (nodeMap) => Object.values(nodeMap).filter((node) => Number.isFinite(node.x) && Number.isFinite(node.y)).sort((a, b) => a.index - b.index);
4601
+ var getCentermostNodeId = (nodeMap, transform, viewportWidth, viewportHeight) => {
4602
+ const nodesWithPositions = getOrderedNodesWithPositions(nodeMap);
4603
+ if (nodesWithPositions.length === 0) {
4604
+ return null;
4605
+ }
4606
+ const visibleNodes = nodesWithPositions.filter(
4607
+ (node) => isNodePartiallyVisible(node, transform, viewportWidth, viewportHeight)
4608
+ );
4609
+ const candidates = visibleNodes.length > 0 ? visibleNodes : nodesWithPositions;
4610
+ const viewportCenterX = viewportWidth / 2;
4611
+ const viewportCenterY = viewportHeight / 2;
4612
+ return candidates.reduce((closestNode, node) => {
4613
+ const closestDistance = __pow(closestNode.x * transform.k + transform.x - viewportCenterX, 2) + __pow(closestNode.y * transform.k + transform.y - viewportCenterY, 2);
4614
+ const distance = __pow(node.x * transform.k + transform.x - viewportCenterX, 2) + __pow(node.y * transform.k + transform.y - viewportCenterY, 2);
4615
+ if (distance < closestDistance) {
4616
+ return node;
4617
+ }
4618
+ return closestNode;
4619
+ }, candidates[0]).id;
4620
+ };
4621
+ var getNextNodeIdInDirection = (nodeMap, currentNodeId, direction) => {
4622
+ if (!currentNodeId || !nodeMap[currentNodeId]) {
4623
+ return null;
4624
+ }
4625
+ const currentNode = nodeMap[currentNodeId];
4626
+ if (!Number.isFinite(currentNode.x) || !Number.isFinite(currentNode.y)) {
4627
+ return null;
4628
+ }
4629
+ const candidates = getOrderedNodesWithPositions(nodeMap).filter((node) => node.id !== currentNodeId);
4630
+ const directionalCandidates = candidates.map((node) => {
4631
+ const dx = node.x - currentNode.x;
4632
+ const dy = node.y - currentNode.y;
4633
+ let primaryDistance;
4634
+ let secondaryDistance;
4635
+ switch (direction) {
4636
+ case "ArrowLeft":
4637
+ primaryDistance = -dx;
4638
+ secondaryDistance = Math.abs(dy);
4639
+ break;
4640
+ case "ArrowRight":
4641
+ primaryDistance = dx;
4642
+ secondaryDistance = Math.abs(dy);
4643
+ break;
4644
+ case "ArrowUp":
4645
+ primaryDistance = -dy;
4646
+ secondaryDistance = Math.abs(dx);
4647
+ break;
4648
+ case "ArrowDown":
4649
+ primaryDistance = dy;
4650
+ secondaryDistance = Math.abs(dx);
4651
+ break;
4652
+ default:
4653
+ primaryDistance = Number.NaN;
4654
+ secondaryDistance = Number.NaN;
4655
+ }
4656
+ return {
4657
+ node,
4658
+ primaryDistance,
4659
+ secondaryDistance,
4660
+ navigationScore: primaryDistance + secondaryDistance * 4,
4661
+ distance: __pow(dx, 2) + __pow(dy, 2),
4662
+ isDirectionallyAligned: primaryDistance >= secondaryDistance
4663
+ };
4664
+ }).filter(({ primaryDistance }) => primaryDistance > 0);
4665
+ if (directionalCandidates.length === 0) {
4666
+ return null;
4667
+ }
4668
+ const alignedCandidates = directionalCandidates.filter(
4669
+ ({ isDirectionallyAligned }) => isDirectionallyAligned
4670
+ );
4671
+ const candidatesToSort = alignedCandidates.length > 0 ? alignedCandidates : directionalCandidates;
4672
+ candidatesToSort.sort((a, b) => {
4673
+ if (a.navigationScore !== b.navigationScore) {
4674
+ return a.navigationScore - b.navigationScore;
4675
+ }
4676
+ if (a.secondaryDistance !== b.secondaryDistance) {
4677
+ return a.secondaryDistance - b.secondaryDistance;
4678
+ }
4679
+ return a.node.index - b.node.index;
4680
+ });
4681
+ return candidatesToSort[0].node.id;
4682
+ };
4683
+ var getPanDeltaToRevealNode = (node, transform, viewportWidth, viewportHeight) => {
4684
+ const bounds = getScreenBounds(node, transform, { includeFocusRing: true });
4685
+ if (!bounds) {
4686
+ return { dx: 0, dy: 0 };
4687
+ }
4688
+ let dx = 0;
4689
+ let dy = 0;
4690
+ if (bounds.width <= viewportWidth) {
4691
+ if (bounds.left < 0) {
4692
+ dx = -bounds.left;
4693
+ } else if (bounds.right > viewportWidth) {
4694
+ dx = viewportWidth - bounds.right;
4695
+ }
4696
+ } else if (bounds.left > 0) {
4697
+ dx = -bounds.left;
4698
+ } else if (bounds.right < viewportWidth) {
4699
+ dx = viewportWidth - bounds.right;
4700
+ }
4701
+ if (bounds.height <= viewportHeight) {
4702
+ if (bounds.top < 0) {
4703
+ dy = -bounds.top;
4704
+ } else if (bounds.bottom > viewportHeight) {
4705
+ dy = viewportHeight - bounds.bottom;
4706
+ }
4707
+ } else if (bounds.top > 0) {
4708
+ dy = -bounds.top;
4709
+ } else if (bounds.bottom < viewportHeight) {
4710
+ dy = viewportHeight - bounds.bottom;
4711
+ }
4712
+ return { dx, dy };
4713
+ };
4567
4714
  var getFullVizBoundsWithPadding = (nodeMap, padding) => {
4568
4715
  let minX = Infinity;
4569
4716
  let minY = Infinity;
@@ -5146,7 +5293,18 @@ var NodeCircle = styled_components_default.circle`
5146
5293
  var _a;
5147
5294
  return (_a = props.color) != null ? _a : themes_exports.variables.neutral100;
5148
5295
  }};
5149
- cursor: pointer;
5296
+ cursor: ${(props) => props.$isClickable ? "pointer" : "default"};
5297
+
5298
+ &:focus {
5299
+ outline: none;
5300
+ }
5301
+ `;
5302
+ var NodeFocusRing = styled_components_default.circle`
5303
+ fill: none;
5304
+ stroke: ${themes_exports.variables.focusColor};
5305
+ stroke-width: ${NODE_FOCUS_RING_STROKE_WIDTH}px;
5306
+ pointer-events: none;
5307
+ vector-effect: non-scaling-stroke;
5150
5308
  `;
5151
5309
  var IconElement = (_a) => {
5152
5310
  var _b = _a, { icon } = _b, iconProps = __objRest(_b, ["icon"]);
@@ -5185,7 +5343,8 @@ var Node = (0, react_exports.memo)(function Node2(props) {
5185
5343
  handleOpen,
5186
5344
  handleAnchor,
5187
5345
  handleRequestClose,
5188
- isDragging = false
5346
+ isDragging = false,
5347
+ tabIndex = 0
5189
5348
  } = props;
5190
5349
  const circleRef = (0, react_exports.useRef)(null);
5191
5350
  const truncatedText = truncateTextToMaxLines(label, FONT, MAX_TEXT_WIDTH, 2);
@@ -5203,6 +5362,8 @@ var Node = (0, react_exports.memo)(function Node2(props) {
5203
5362
  const { iconUrl, shouldRenderRemoteIcon } = (0, react_exports.useMemo)(() => getIconRenderInfo(icon), [icon]);
5204
5363
  const builtInIcon = (0, react_exports.useMemo)(() => isBuiltInIcon(icon) ? icon : null, [icon]);
5205
5364
  const [IconComponent, setIconComponent] = react_exports.useState(null);
5365
+ const [isFocused, setIsFocused] = react_exports.useState(false);
5366
+ const isClickable = typeof handleNodeClick === "function";
5206
5367
  react_exports.useEffect(() => {
5207
5368
  if (!builtInIcon) {
5208
5369
  setIconComponent(null);
@@ -5234,6 +5395,8 @@ var Node = (0, react_exports.memo)(function Node2(props) {
5234
5395
  };
5235
5396
  }, [builtInIcon]);
5236
5397
  const nodeClickHandler = (0, react_exports.useCallback)(() => {
5398
+ var _a2;
5399
+ (_a2 = circleRef.current) == null ? void 0 : _a2.focus();
5237
5400
  if (handleNodeClick) {
5238
5401
  handleNodeClick({ id, value, index });
5239
5402
  }
@@ -5285,12 +5448,29 @@ var Node = (0, react_exports.memo)(function Node2(props) {
5285
5448
  }
5286
5449
  handleRequestClose();
5287
5450
  }, [handleNodeMouseOut, nodeWithPosition, setHighlightedNode, handleRequestClose, isDragging]);
5451
+ const onFocus = (0, react_exports.useCallback)(() => {
5452
+ setIsFocused(true);
5453
+ onMouseEnter();
5454
+ }, [onMouseEnter]);
5455
+ const onBlur = (0, react_exports.useCallback)(() => {
5456
+ setIsFocused(false);
5457
+ onMouseLeave();
5458
+ }, [onMouseLeave]);
5288
5459
  react_exports.useEffect(() => {
5289
5460
  if (isDragging) {
5290
5461
  handleRequestClose();
5291
5462
  }
5292
5463
  }, [isDragging, handleRequestClose]);
5293
- return /* @__PURE__ */ react_exports.createElement(react_exports.Fragment, null, /* @__PURE__ */ react_exports.createElement(
5464
+ return /* @__PURE__ */ react_exports.createElement(react_exports.Fragment, null, isFocused && /* @__PURE__ */ react_exports.createElement(
5465
+ NodeFocusRing,
5466
+ {
5467
+ "data-test": "node-focus-ring",
5468
+ r: radius + NODE_FOCUS_RING_PADDING,
5469
+ cx: x,
5470
+ cy: y,
5471
+ opacity
5472
+ }
5473
+ ), /* @__PURE__ */ react_exports.createElement(
5294
5474
  NodeCircle,
5295
5475
  {
5296
5476
  "data-test": "node",
@@ -5301,17 +5481,18 @@ var Node = (0, react_exports.memo)(function Node2(props) {
5301
5481
  height: diameter,
5302
5482
  id: sanitizedId,
5303
5483
  ref: circleRef,
5304
- tabIndex: 0,
5305
- role: "button",
5484
+ tabIndex,
5485
+ role: isClickable ? "button" : "graphics-object",
5306
5486
  "aria-label": label || (0, i18n_exports._)("Node"),
5487
+ $isClickable: isClickable,
5307
5488
  color,
5308
5489
  opacity,
5309
- onClick: nodeClickHandler,
5310
- onKeyDown,
5490
+ onClick: isClickable ? nodeClickHandler : void 0,
5491
+ onKeyDown: isClickable ? onKeyDown : void 0,
5311
5492
  onMouseEnter,
5312
5493
  onMouseLeave,
5313
- onFocus: onMouseEnter,
5314
- onBlur: onMouseLeave
5494
+ onFocus,
5495
+ onBlur
5315
5496
  }
5316
5497
  ), !!IconComponent && !shouldHideIcon && /* @__PURE__ */ react_exports.createElement(
5317
5498
  NodeIcon,
@@ -5483,6 +5664,19 @@ var defaultImport114 = __toESM(require("@splunk/react-ui/Popover"));
5483
5664
  __reExport(Popover_exports, require("@splunk/react-ui/Popover"));
5484
5665
  var Popover_default = "default" in defaultImport114 ? defaultImport114.default : defaultImport114;
5485
5666
 
5667
+ // src/common/utils/shadowDomUtils.ts
5668
+ init_define_global();
5669
+ var getFloatingLayerStyleTarget = (anchor) => {
5670
+ if (!anchor || typeof anchor.getRootNode !== "function") {
5671
+ return void 0;
5672
+ }
5673
+ const rootNode = anchor.getRootNode();
5674
+ if (typeof ShadowRoot !== "undefined" && rootNode instanceof ShadowRoot) {
5675
+ return anchor.ownerDocument.head;
5676
+ }
5677
+ return void 0;
5678
+ };
5679
+
5486
5680
  // src/NetworkGraph/PureNetworkGraph/components/Tooltip.tsx
5487
5681
  var StyledPopover = styled_components_default(Popover_default)`
5488
5682
  font-size: ${themes_exports.variables.fontSizeSmall};
@@ -5525,17 +5719,24 @@ var Tooltip = ({
5525
5719
  headerValue,
5526
5720
  nodeFields = {},
5527
5721
  onRequestClose
5528
- }) => /* @__PURE__ */ react_exports.createElement(
5529
- StyledPopover,
5530
- {
5531
- "data-test": "network-graph-tooltip",
5532
- open,
5533
- anchor,
5534
- onRequestClose,
5535
- defaultPlacement: "above"
5536
- },
5537
- /* @__PURE__ */ react_exports.createElement(StyledWrapper, null, /* @__PURE__ */ react_exports.createElement(Title, null, headerValue), /* @__PURE__ */ react_exports.createElement(StyledTable, null, /* @__PURE__ */ react_exports.createElement("tbody", null, Object.entries(nodeFields).map(([field, value]) => /* @__PURE__ */ react_exports.createElement("tr", { key: field }, /* @__PURE__ */ react_exports.createElement(StyledLabelCell, null, (0, i18n_exports._)(field)), /* @__PURE__ */ react_exports.createElement(StyledValueCell, null, (0, i18n_exports._)(String(value))))))))
5538
- );
5722
+ }) => {
5723
+ if (!open || !anchor) {
5724
+ return null;
5725
+ }
5726
+ const styleTarget = getFloatingLayerStyleTarget(anchor);
5727
+ const popover = /* @__PURE__ */ react_exports.createElement(
5728
+ StyledPopover,
5729
+ {
5730
+ "data-test": "network-graph-tooltip",
5731
+ open,
5732
+ anchor,
5733
+ onRequestClose,
5734
+ defaultPlacement: "above"
5735
+ },
5736
+ /* @__PURE__ */ react_exports.createElement(StyledWrapper, null, /* @__PURE__ */ react_exports.createElement(Title, null, headerValue), /* @__PURE__ */ react_exports.createElement(StyledTable, null, /* @__PURE__ */ react_exports.createElement("tbody", null, Object.entries(nodeFields).map(([field, value]) => /* @__PURE__ */ react_exports.createElement("tr", { key: field }, /* @__PURE__ */ react_exports.createElement(StyledLabelCell, null, (0, i18n_exports._)(field)), /* @__PURE__ */ react_exports.createElement(StyledValueCell, null, (0, i18n_exports._)(String(value))))))))
5737
+ );
5738
+ return styleTarget ? /* @__PURE__ */ react_exports.createElement(styled_components_exports.StyleSheetManager, { target: styleTarget }, popover) : popover;
5739
+ };
5539
5740
  var Tooltip_default = Tooltip;
5540
5741
 
5541
5742
  // src/NetworkGraph/PureNetworkGraph/components/NetworkGraphSvg.tsx
@@ -5559,7 +5760,8 @@ var NetworkGraphSvg = (0, react_exports.memo)(function NetworkGraphSvg2({
5559
5760
  handleNodeMouseOut,
5560
5761
  highlightedNode,
5561
5762
  setHighlightedNode = () => void 0,
5562
- isDragging = false
5763
+ isDragging = false,
5764
+ activeNodeId
5563
5765
  }) {
5564
5766
  var _a, _b;
5565
5767
  const graphId = (0, react_exports.useId)();
@@ -5593,6 +5795,15 @@ var NetworkGraphSvg = (0, react_exports.memo)(function NetworkGraphSvg2({
5593
5795
  const anchorNodeVisual = anchorId ? nodeMapVisual[anchorId] : void 0;
5594
5796
  const headerValue = (_a = anchorNodeVisual == null ? void 0 : anchorNodeVisual.tooltipHeader) != null ? _a : "";
5595
5797
  const nodeFields = (_b = anchorNodeVisual == null ? void 0 : anchorNodeVisual.tooltipFields) != null ? _b : {};
5798
+ const getNodeTabIndex = (0, react_exports.useCallback)(
5799
+ (id) => {
5800
+ if (activeNodeId === void 0) {
5801
+ return 0;
5802
+ }
5803
+ return activeNodeId === id ? 0 : -1;
5804
+ },
5805
+ [activeNodeId]
5806
+ );
5596
5807
  (0, react_exports.useEffect)(() => {
5597
5808
  if (isReadyToRender) {
5598
5809
  (0, d3_selection_exports.select)(svgRef == null ? void 0 : svgRef.current).selectAll("circle").on("mousedown", (event) => {
@@ -5697,7 +5908,8 @@ var NetworkGraphSvg = (0, react_exports.memo)(function NetworkGraphSvg2({
5697
5908
  handleOpen,
5698
5909
  handleAnchor,
5699
5910
  handleRequestClose,
5700
- isDragging
5911
+ isDragging,
5912
+ tabIndex: getNodeTabIndex(id)
5701
5913
  }
5702
5914
  );
5703
5915
  }))
@@ -5801,7 +6013,8 @@ var ZoomControls = (0, react_exports.memo)(function ZoomControls2(props) {
5801
6013
  hideReset = false,
5802
6014
  hideZoomControls = false,
5803
6015
  disableZoomIn = false,
5804
- disableZoomOut = false
6016
+ disableZoomOut = false,
6017
+ buttonTabIndex
5805
6018
  } = props;
5806
6019
  return /* @__PURE__ */ react_exports.createElement(StyledZoomControlsContainer, { "data-test": "zoom-controls-container" }, !hideZoomControls && /* @__PURE__ */ react_exports.createElement(StyledBaseContainer, { "data-test": "zoom-buttons-container" }, /* @__PURE__ */ react_exports.createElement(Tooltip_default2, { contentRelationship: "label", content: (0, i18n_exports._)("Zoom in") }, /* @__PURE__ */ react_exports.createElement(
5807
6020
  StyledZoomInButton,
@@ -5810,7 +6023,8 @@ var ZoomControls = (0, react_exports.memo)(function ZoomControls2(props) {
5810
6023
  appearance: "subtle",
5811
6024
  onClick: handleZoomIn,
5812
6025
  disabled: disableZoomIn,
5813
- "data-test": "zoom-in-button"
6026
+ "data-test": "zoom-in-button",
6027
+ tabIndex: buttonTabIndex
5814
6028
  }
5815
6029
  )), /* @__PURE__ */ react_exports.createElement(Tooltip_default2, { contentRelationship: "label", content: (0, i18n_exports._)("Zoom out") }, /* @__PURE__ */ react_exports.createElement(
5816
6030
  StyledZoomOutButton,
@@ -5819,7 +6033,8 @@ var ZoomControls = (0, react_exports.memo)(function ZoomControls2(props) {
5819
6033
  appearance: "subtle",
5820
6034
  onClick: handleZoomOut,
5821
6035
  disabled: disableZoomOut,
5822
- "data-test": "zoom-out-button"
6036
+ "data-test": "zoom-out-button",
6037
+ tabIndex: buttonTabIndex
5823
6038
  }
5824
6039
  ))), !hideReset && /* @__PURE__ */ react_exports.createElement(StyledResetContainer, { moveToTop: hideZoomControls, "data-test": "reset-button-container" }, /* @__PURE__ */ react_exports.createElement(Tooltip_default2, { contentRelationship: "label", content: (0, i18n_exports._)("Reset zoom") }, /* @__PURE__ */ react_exports.createElement(
5825
6040
  StyledButton,
@@ -5827,7 +6042,8 @@ var ZoomControls = (0, react_exports.memo)(function ZoomControls2(props) {
5827
6042
  icon: /* @__PURE__ */ react_exports.createElement(SquareAndCorners_default, null),
5828
6043
  appearance: "subtle",
5829
6044
  onClick: handleReset,
5830
- "data-test": "reset-button"
6045
+ "data-test": "reset-button",
6046
+ tabIndex: buttonTabIndex
5831
6047
  }
5832
6048
  ))));
5833
6049
  });
@@ -5847,6 +6063,11 @@ var forwardMouseDownEvent = (event, container) => {
5847
6063
  const forwarded = new MouseEvent("mousedown", event);
5848
6064
  container == null ? void 0 : container.dispatchEvent(forwarded);
5849
6065
  };
6066
+ var getNodeIdFromEventTarget = (target) => {
6067
+ const nodeElement = target instanceof Element ? target.closest('[data-test="node"]') : null;
6068
+ return (nodeElement == null ? void 0 : nodeElement.id) ? unsanitizeSvgId(nodeElement.id) : null;
6069
+ };
6070
+ var isKeyboardNavigationDirection = (key) => key === "ArrowLeft" || key === "ArrowRight" || key === "ArrowUp" || key === "ArrowDown";
5850
6071
  var PureNetworkGraph = ({
5851
6072
  width = DEFAULT_CHART_WIDTH,
5852
6073
  height = DEFAULT_CHART_HEIGHT,
@@ -5889,7 +6110,7 @@ var PureNetworkGraph = ({
5889
6110
  tooltipNodeFields = EMPTY_ARRAY,
5890
6111
  tooltipHeaderFieldName = "",
5891
6112
  onOptionsChange = lodash_exports.noop,
5892
- onNodeClick = lodash_exports.noop,
6113
+ onNodeClick,
5893
6114
  onNodeMouseOver = lodash_exports.noop,
5894
6115
  onNodeMouseOut = lodash_exports.noop,
5895
6116
  onNodeDrag = lodash_exports.noop
@@ -5911,6 +6132,7 @@ var PureNetworkGraph = ({
5911
6132
  x: null,
5912
6133
  y: null
5913
6134
  });
6135
+ const hasNodeClickHandler = typeof onNodeClick === "function";
5914
6136
  const frozenNodeMapForZoomRef = (0, react_exports.useRef)(null);
5915
6137
  const dragOffsetRef = (0, react_exports.useRef)(null);
5916
6138
  const baseNodeMapRef = (0, react_exports.useRef)(null);
@@ -6017,6 +6239,7 @@ var PureNetworkGraph = ({
6017
6239
  const [hideReset, setHideReset] = (0, react_exports.useState)(true);
6018
6240
  const [isReadyToRender, setIsReadyToRender] = (0, react_exports.useState)(false);
6019
6241
  const [highlightedNode, setHighlightedNode] = (0, react_exports.useState)(null);
6242
+ const [focusedNodeId, setFocusedNodeId] = (0, react_exports.useState)(null);
6020
6243
  const numberWidth = typeof width === "string" ? containerSize.width : width;
6021
6244
  const numberHeight = typeof height === "string" ? containerSize.height : height;
6022
6245
  const effectiveWidth = Math.max(numberWidth, 0);
@@ -6032,6 +6255,22 @@ var PureNetworkGraph = ({
6032
6255
  () => d3_zoom_exports.zoomIdentity.translate(effectiveWidth / 2, effectiveHeight / 2).scale(autoZoomLevel).translate(-autoCenter[0], -autoCenter[1]),
6033
6256
  [autoCenter, autoZoomLevel, effectiveWidth, effectiveHeight]
6034
6257
  );
6258
+ const currentKeyboardTransform = (0, react_exports.useMemo)(
6259
+ () => {
6260
+ var _a2, _b2, _c, _d, _e, _f, _g;
6261
+ return {
6262
+ k: (_c = (_b2 = (_a2 = parentZoomAndPanState.zoom) != null ? _a2 : initialTransform.k) != null ? _b2 : autoZoomLevel) != null ? _c : 1,
6263
+ x: (_e = (_d = parentZoomAndPanState.x) != null ? _d : initialTransform.x) != null ? _e : 0,
6264
+ y: (_g = (_f = parentZoomAndPanState.y) != null ? _f : initialTransform.y) != null ? _g : 0
6265
+ };
6266
+ },
6267
+ [autoZoomLevel, initialTransform, parentZoomAndPanState]
6268
+ );
6269
+ const centermostNodeId = (0, react_exports.useMemo)(
6270
+ () => getCentermostNodeId(nodeMapStruct, currentKeyboardTransform, effectiveWidth, effectiveHeight),
6271
+ [currentKeyboardTransform, effectiveHeight, effectiveWidth, nodeMapStruct]
6272
+ );
6273
+ const activeNodeId = focusedNodeId && nodeMapStruct[focusedNodeId] ? focusedNodeId : centermostNodeId;
6035
6274
  const { disableZoomIn, disableZoomOut } = (0, react_exports.useMemo)(
6036
6275
  () => getZoomDisableState(parentZoomAndPanState.zoom, autoZoomLevel, minZoomLevel),
6037
6276
  [parentZoomAndPanState.zoom, autoZoomLevel, minZoomLevel]
@@ -6085,6 +6324,11 @@ var PureNetworkGraph = ({
6085
6324
  const shouldHideReset = (!parentZoomAndPanState.zoom || nearlyEqual(parentZoomAndPanState.zoom, initialTransform.k, 0.01, true)) && (!parentZoomAndPanState.x || nearlyEqual(parentZoomAndPanState.x, initialTransform.x)) && (!parentZoomAndPanState.y || nearlyEqual(parentZoomAndPanState.y, initialTransform.y));
6086
6325
  setHideReset(shouldHideReset);
6087
6326
  }, [parentZoomAndPanState, initialTransform]);
6327
+ (0, react_exports.useEffect)(() => {
6328
+ if (focusedNodeId && !nodeMapStruct[focusedNodeId]) {
6329
+ setFocusedNodeId(null);
6330
+ }
6331
+ }, [focusedNodeId, nodeMapStruct]);
6088
6332
  (0, react_exports.useEffect)(() => {
6089
6333
  if ((0, d3_selection_exports.select)(svgRef.current).on) (0, d3_selection_exports.select)(svgRef.current).on(".zoom", null);
6090
6334
  const minTopLeft = [autoCenter[0] - minZoomWidth / 2, autoCenter[1] - minZoomHeight / 2];
@@ -6136,8 +6380,68 @@ var PureNetworkGraph = ({
6136
6380
  },
6137
6381
  [zoomFunc]
6138
6382
  );
6383
+ const handleAutoPan = (0, react_exports.useCallback)(
6384
+ (dx, dy) => {
6385
+ if (!svgRef.current || !dx && !dy) {
6386
+ return;
6387
+ }
6388
+ const transform = (0, d3_zoom_exports.zoomTransform)(svgRef.current);
6389
+ const zoomLevel = Number.isFinite(transform.k) && transform.k > 0 ? transform.k : currentKeyboardTransform.k;
6390
+ (0, d3_selection_exports.select)(svgRef.current).call(zoomFunc.translateBy, dx / zoomLevel, dy / zoomLevel);
6391
+ },
6392
+ [currentKeyboardTransform.k, zoomFunc]
6393
+ );
6394
+ const focusNodeById = (0, react_exports.useCallback)((nodeId) => {
6395
+ var _a2;
6396
+ const nodeElement = (_a2 = svgRef.current) == null ? void 0 : _a2.querySelector(`#${sanitizeSvgId(nodeId)}`);
6397
+ nodeElement == null ? void 0 : nodeElement.focus();
6398
+ }, []);
6399
+ const ensureNodeVisible = (0, react_exports.useCallback)(
6400
+ (nodeId) => {
6401
+ const node = nodeMapStruct[nodeId];
6402
+ if (!node) {
6403
+ return;
6404
+ }
6405
+ const { dx, dy } = getPanDeltaToRevealNode(
6406
+ node,
6407
+ currentKeyboardTransform,
6408
+ effectiveWidth,
6409
+ effectiveHeight
6410
+ );
6411
+ handleAutoPan(dx, dy);
6412
+ },
6413
+ [currentKeyboardTransform, effectiveHeight, effectiveWidth, handleAutoPan, nodeMapStruct]
6414
+ );
6415
+ const handleFocus = (0, react_exports.useCallback)(
6416
+ (e) => {
6417
+ const nodeId = getNodeIdFromEventTarget(e.target);
6418
+ setFocusedNodeId(nodeId);
6419
+ if (nodeId) {
6420
+ ensureNodeVisible(nodeId);
6421
+ }
6422
+ },
6423
+ [ensureNodeVisible]
6424
+ );
6425
+ const handleBlur = (0, react_exports.useCallback)((e) => {
6426
+ var _a2;
6427
+ const nextTarget = e.relatedTarget;
6428
+ if (!nextTarget || !((_a2 = containerRef.current) == null ? void 0 : _a2.contains(nextTarget))) {
6429
+ setFocusedNodeId(null);
6430
+ }
6431
+ }, []);
6139
6432
  const handleKeyDown = (0, react_exports.useCallback)(
6140
6433
  (e) => {
6434
+ const nodeId = getNodeIdFromEventTarget(e.target);
6435
+ if (nodeId && isKeyboardNavigationDirection(e.key)) {
6436
+ const nextNodeId = getNextNodeIdInDirection(nodeMapStruct, nodeId, e.key);
6437
+ e.preventDefault();
6438
+ e.stopPropagation();
6439
+ if (nextNodeId) {
6440
+ setFocusedNodeId(nextNodeId);
6441
+ focusNodeById(nextNodeId);
6442
+ }
6443
+ return;
6444
+ }
6141
6445
  switch (e.key) {
6142
6446
  case "+":
6143
6447
  case "=":
@@ -6163,7 +6467,7 @@ var PureNetworkGraph = ({
6163
6467
  }
6164
6468
  e.preventDefault();
6165
6469
  },
6166
- [handlePan, handleZoomIn, handleZoomOut]
6470
+ [focusNodeById, handlePan, handleZoomIn, handleZoomOut, nodeMapStruct]
6167
6471
  );
6168
6472
  const handleMouseDown = (0, react_exports.useCallback)(
6169
6473
  // mousedown uses event from d3 which is typed to any
@@ -6248,7 +6552,7 @@ var PureNetworkGraph = ({
6248
6552
  );
6249
6553
  const handleNodeClick = (0, react_exports.useCallback)(
6250
6554
  (node) => {
6251
- if (node) {
6555
+ if (node && typeof onNodeClick === "function") {
6252
6556
  const metadataForNode = metadata[node.index] || {};
6253
6557
  onNodeClick({
6254
6558
  type: "node.click",
@@ -6317,7 +6621,9 @@ var PureNetworkGraph = ({
6317
6621
  width: cssWidth,
6318
6622
  height: cssHeight,
6319
6623
  tabIndex: 0,
6320
- onKeyDown: handleKeyDown
6624
+ onKeyDown: handleKeyDown,
6625
+ onFocus: handleFocus,
6626
+ onBlur: handleBlur
6321
6627
  },
6322
6628
  nodeMapVisual && nodeMapStruct && /* @__PURE__ */ react_default.createElement(react_default.Fragment, null, isReadyToRender && /* @__PURE__ */ react_default.createElement(
6323
6629
  ZoomControls_default,
@@ -6347,12 +6653,13 @@ var PureNetworkGraph = ({
6347
6653
  handleMouseDown,
6348
6654
  handleMouseUp,
6349
6655
  handleDrag,
6350
- handleNodeClick,
6656
+ handleNodeClick: hasNodeClickHandler ? handleNodeClick : void 0,
6351
6657
  handleNodeMouseOver,
6352
6658
  handleNodeMouseOut,
6353
6659
  highlightedNode,
6354
6660
  setHighlightedNode,
6355
- isDragging: isDragging.dragStarted
6661
+ isDragging: isDragging.dragStarted,
6662
+ activeNodeId
6356
6663
  }
6357
6664
  ))
6358
6665
  );
@@ -7221,7 +7528,13 @@ var computeVizProps = (_a) => {
7221
7528
  };
7222
7529
  var withTooltipFields = (Viz) => {
7223
7530
  const VizWithTooltipFields = (_a) => {
7224
- var _b = _a, { dataSources, options } = _b, otherProps = __objRest(_b, ["dataSources", "options"]);
7531
+ var _b = _a, {
7532
+ dataSources,
7533
+ options
7534
+ } = _b, otherProps = __objRest(_b, [
7535
+ "dataSources",
7536
+ "options"
7537
+ ]);
7225
7538
  var _a2;
7226
7539
  if (!((_a2 = dataSources == null ? void 0 : dataSources.primary) == null ? void 0 : _a2.data)) {
7227
7540
  return /* @__PURE__ */ react_exports.createElement(Viz, __spreadProps(__spreadValues({}, otherProps), { options }));