@galaxy-io/dls 1.6.1 → 2.0.1

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 (540) hide show
  1. package/README.md +47 -50
  2. package/biome/index.json +74 -0
  3. package/biome/plugins/no-hex-literal.grit +20 -0
  4. package/biome/plugins/no-inline-style.grit +13 -0
  5. package/biome/plugins/no-margin.grit +9 -0
  6. package/biome/plugins/warn/no-hex-literal.grit +23 -0
  7. package/biome/plugins/warn/no-inline-style.grit +13 -0
  8. package/biome/plugins/warn/no-margin.grit +9 -0
  9. package/dist/a11y/FocusScope.d.ts +44 -0
  10. package/dist/a11y/FocusScope.js +229 -0
  11. package/dist/a11y/VisuallyHidden.d.ts +21 -0
  12. package/dist/a11y/VisuallyHidden.js +30 -0
  13. package/dist/avatar/Avatar.d.ts +56 -14
  14. package/dist/avatar/Avatar.js +250 -96
  15. package/dist/avatar/AvatarGroup.d.ts +43 -0
  16. package/dist/avatar/AvatarGroup.js +153 -0
  17. package/dist/backgrounds/GridBackground.d.ts +48 -0
  18. package/dist/backgrounds/GridBackground.js +146 -0
  19. package/dist/beacons/Beacon.d.ts +86 -22
  20. package/dist/beacons/Beacon.js +170 -47
  21. package/dist/brand/GalaxyFilamentWordmark.d.ts +30 -0
  22. package/dist/brand/GalaxyFilamentWordmark.js +39 -0
  23. package/dist/brand/GalaxyLogomark.d.ts +26 -0
  24. package/dist/brand/GalaxyLogomark.js +41 -0
  25. package/dist/brand/GalaxyLogomarkAnimation.d.ts +36 -0
  26. package/dist/brand/GalaxyLogomarkAnimation.js +107 -0
  27. package/dist/brand/GalaxyWordmark.d.ts +30 -0
  28. package/dist/brand/GalaxyWordmark.js +63 -0
  29. package/dist/brand/assets/galaxy-logomark-animation.js +136678 -0
  30. package/dist/brand/brandMark.d.ts +26 -0
  31. package/dist/brand/brandMark.js +35 -0
  32. package/dist/buttons/Button.d.ts +148 -59
  33. package/dist/buttons/Button.js +437 -227
  34. package/dist/buttons/ButtonGroup.d.ts +38 -0
  35. package/dist/buttons/ButtonGroup.js +68 -0
  36. package/dist/buttons/CopyButton.d.ts +77 -0
  37. package/dist/buttons/CopyButton.js +65 -0
  38. package/dist/charts/AreaChart.d.ts +49 -0
  39. package/dist/charts/AreaChart.js +31 -0
  40. package/dist/charts/BarChart.d.ts +54 -67
  41. package/dist/charts/BarChart.js +160 -124
  42. package/dist/charts/ChartAxis.d.ts +35 -40
  43. package/dist/charts/ChartAxis.js +114 -90
  44. package/dist/charts/ChartCategoryTargets.d.ts +12 -26
  45. package/dist/charts/ChartCategoryTargets.js +33 -20
  46. package/dist/charts/ChartFrame.d.ts +71 -116
  47. package/dist/charts/ChartFrame.js +306 -97
  48. package/dist/charts/ChartGroupProvider.d.ts +30 -41
  49. package/dist/charts/ChartGroupProvider.js +20 -7
  50. package/dist/charts/ChartLegend.d.ts +37 -48
  51. package/dist/charts/ChartLegend.js +243 -125
  52. package/dist/charts/ChartMarkTargets.d.ts +12 -28
  53. package/dist/charts/ChartMarkTargets.js +34 -20
  54. package/dist/charts/ChartPrimitives.d.ts +50 -305
  55. package/dist/charts/ChartPrimitives.js +65 -413
  56. package/dist/charts/ChartTooltip.d.ts +20 -26
  57. package/dist/charts/ChartTooltip.js +77 -40
  58. package/dist/charts/Heatmap.d.ts +35 -0
  59. package/dist/charts/Heatmap.js +307 -0
  60. package/dist/charts/LineChart.d.ts +54 -47
  61. package/dist/charts/LineChart.js +174 -121
  62. package/dist/charts/PieChart.d.ts +32 -53
  63. package/dist/charts/PieChart.js +159 -136
  64. package/dist/charts/Sparkline.d.ts +107 -0
  65. package/dist/charts/Sparkline.js +244 -0
  66. package/dist/charts/StatChart.d.ts +37 -13
  67. package/dist/charts/StatChart.js +82 -35
  68. package/dist/charts/barChartGeometry.d.ts +138 -86
  69. package/dist/charts/barChartGeometry.js +122 -101
  70. package/dist/charts/barChartLegend.d.ts +14 -18
  71. package/dist/charts/barChartLegend.js +18 -13
  72. package/dist/charts/chartFormat.d.ts +12 -18
  73. package/dist/charts/chartFormat.js +20 -52
  74. package/dist/charts/chartPalette.d.ts +33 -0
  75. package/dist/charts/chartPalette.js +68 -0
  76. package/dist/charts/chartScales.d.ts +41 -108
  77. package/dist/charts/chartScales.js +62 -128
  78. package/dist/charts/chartSelection.d.ts +15 -0
  79. package/dist/charts/chartSelection.js +22 -0
  80. package/dist/charts/constants.d.ts +100 -256
  81. package/dist/charts/constants.js +109 -275
  82. package/dist/charts/heatmapGeometry.d.ts +95 -0
  83. package/dist/charts/heatmapGeometry.js +155 -0
  84. package/dist/charts/lineChartGeometry.d.ts +108 -58
  85. package/dist/charts/lineChartGeometry.js +120 -78
  86. package/dist/charts/pieChartGeometry.d.ts +66 -40
  87. package/dist/charts/pieChartGeometry.js +68 -38
  88. package/dist/charts/types.d.ts +206 -466
  89. package/dist/charts/types.js +55 -144
  90. package/dist/charts/useCartesianChartLayout.d.ts +28 -59
  91. package/dist/charts/useCartesianChartLayout.js +47 -32
  92. package/dist/charts/useChartDimensions.d.ts +19 -40
  93. package/dist/charts/useChartDimensions.js +40 -56
  94. package/dist/charts/useChartFormatters.d.ts +6 -15
  95. package/dist/charts/useChartFormatters.js +4 -9
  96. package/dist/charts/useChartInteraction.d.ts +69 -116
  97. package/dist/charts/useChartInteraction.js +148 -78
  98. package/dist/charts/useChartTooltipPosition.d.ts +29 -39
  99. package/dist/charts/useChartTooltipPosition.js +14 -5
  100. package/dist/charts/useSeriesColorResolver.d.ts +11 -33
  101. package/dist/charts/useSeriesColorResolver.js +19 -12
  102. package/dist/chips/Chip.d.ts +155 -44
  103. package/dist/chips/Chip.js +329 -155
  104. package/dist/chips/ChipGroup.d.ts +53 -0
  105. package/dist/chips/ChipGroup.js +98 -0
  106. package/dist/drawer/Drawer.d.ts +83 -17
  107. package/dist/drawer/Drawer.js +399 -65
  108. package/dist/dropdown/Dropdown.d.ts +80 -63
  109. package/dist/dropdown/Dropdown.js +127 -129
  110. package/dist/editor/CodeEditor.d.ts +119 -40
  111. package/dist/editor/CodeEditor.js +490 -400
  112. package/dist/editor/CodeEditorReactWidget.d.ts +20 -17
  113. package/dist/editor/CodeEditorReactWidget.js +28 -21
  114. package/dist/feedback/Alert.d.ts +49 -0
  115. package/dist/feedback/Alert.js +172 -0
  116. package/dist/feedback/EmptyState.d.ts +39 -0
  117. package/dist/feedback/EmptyState.js +109 -0
  118. package/dist/feedback/ProgressBar.d.ts +125 -0
  119. package/dist/feedback/ProgressBar.js +183 -0
  120. package/dist/feedback/ProgressCircle.d.ts +99 -0
  121. package/dist/feedback/ProgressCircle.js +187 -0
  122. package/dist/feedback/Skeleton.d.ts +69 -0
  123. package/dist/feedback/Skeleton.js +130 -0
  124. package/dist/feedback/Spinner.d.ts +63 -0
  125. package/dist/feedback/Spinner.js +141 -0
  126. package/dist/fonts.css +70 -0
  127. package/dist/hooks/internal/useIsClient.d.ts +2 -0
  128. package/dist/hooks/internal/useIsClient.js +14 -0
  129. package/dist/hooks/useClipboard.d.ts +19 -0
  130. package/dist/hooks/useClipboard.js +45 -0
  131. package/dist/hooks/useControlledOpenState.d.ts +21 -0
  132. package/dist/hooks/useControlledOpenState.js +19 -0
  133. package/dist/hooks/useControlledState.d.ts +19 -0
  134. package/dist/hooks/useControlledState.js +22 -0
  135. package/dist/hooks/useDebouncedValue.d.ts +14 -0
  136. package/dist/hooks/useDebouncedValue.js +33 -0
  137. package/dist/hooks/useDisclosure.d.ts +26 -0
  138. package/dist/hooks/useDisclosure.js +36 -0
  139. package/dist/hooks/useDismiss.d.ts +23 -27
  140. package/dist/hooks/useDismiss.js +39 -27
  141. package/dist/hooks/useElementClientSize.d.ts +10 -10
  142. package/dist/hooks/useElementClientSize.js +8 -11
  143. package/dist/hooks/useElementWidth.d.ts +6 -13
  144. package/dist/hooks/useElementWidth.js +6 -14
  145. package/dist/hooks/useField.d.ts +47 -0
  146. package/dist/hooks/useField.js +40 -0
  147. package/dist/hooks/useHotkey.d.ts +77 -0
  148. package/dist/hooks/useHotkey.js +246 -0
  149. package/dist/hooks/useIsMac.d.ts +12 -0
  150. package/dist/hooks/useIsMac.js +27 -0
  151. package/dist/hooks/useIsomorphicLayoutEffect.d.ts +17 -0
  152. package/dist/hooks/useIsomorphicLayoutEffect.js +20 -0
  153. package/dist/hooks/useLocalStorage.d.ts +28 -0
  154. package/dist/hooks/useLocalStorage.js +145 -0
  155. package/dist/hooks/useMediaQuery.d.ts +11 -0
  156. package/dist/hooks/useMediaQuery.js +23 -0
  157. package/dist/hooks/usePrefersReducedMotion.d.ts +12 -0
  158. package/dist/hooks/usePrefersReducedMotion.js +25 -0
  159. package/dist/hooks/useResize.d.ts +42 -62
  160. package/dist/hooks/useResize.js +43 -31
  161. package/dist/icons/Icon.d.ts +64 -37
  162. package/dist/icons/Icon.js +96 -37
  163. package/dist/icons/internal/IconSlot.d.ts +10 -0
  164. package/dist/icons/internal/IconSlot.js +32 -0
  165. package/dist/inputs/CheckboxGroup.d.ts +115 -0
  166. package/dist/inputs/CheckboxGroup.js +183 -0
  167. package/dist/inputs/CheckboxInput.d.ts +98 -28
  168. package/dist/inputs/CheckboxInput.js +218 -88
  169. package/dist/inputs/ColorInput.d.ts +115 -29
  170. package/dist/inputs/ColorInput.js +748 -326
  171. package/dist/inputs/CopyInput.d.ts +49 -20
  172. package/dist/inputs/CopyInput.js +57 -49
  173. package/dist/inputs/CronInput.d.ts +94 -0
  174. package/dist/inputs/CronInput.js +618 -0
  175. package/dist/inputs/DateInput.d.ts +175 -28
  176. package/dist/inputs/DateInput.js +1109 -451
  177. package/dist/inputs/DurationInput.d.ts +101 -0
  178. package/dist/inputs/DurationInput.js +441 -0
  179. package/dist/inputs/Field.d.ts +75 -0
  180. package/dist/inputs/Field.js +247 -0
  181. package/dist/inputs/Fieldset.d.ts +53 -0
  182. package/dist/inputs/Fieldset.js +149 -0
  183. package/dist/inputs/FileInput.d.ts +110 -0
  184. package/dist/inputs/FileInput.js +476 -0
  185. package/dist/inputs/Input.d.ts +148 -187
  186. package/dist/inputs/Input.js +339 -259
  187. package/dist/inputs/KeyValueInput.d.ts +120 -0
  188. package/dist/inputs/KeyValueInput.js +383 -0
  189. package/dist/inputs/MultiSelectInput.d.ts +165 -54
  190. package/dist/inputs/MultiSelectInput.js +175 -559
  191. package/dist/inputs/NumberInput.d.ts +65 -9
  192. package/dist/inputs/NumberInput.js +197 -40
  193. package/dist/inputs/PasswordInput.d.ts +17 -12
  194. package/dist/inputs/PasswordInput.js +33 -33
  195. package/dist/inputs/PinInput.d.ts +117 -0
  196. package/dist/inputs/PinInput.js +364 -0
  197. package/dist/inputs/RadioGroup.d.ts +115 -0
  198. package/dist/inputs/RadioGroup.js +179 -0
  199. package/dist/inputs/RadioInput.d.ts +87 -24
  200. package/dist/inputs/RadioInput.js +182 -95
  201. package/dist/inputs/SearchInput.d.ts +66 -0
  202. package/dist/inputs/SearchInput.js +156 -0
  203. package/dist/inputs/SelectInput.d.ts +195 -55
  204. package/dist/inputs/SelectInput.js +1308 -446
  205. package/dist/inputs/SliderInput.d.ts +150 -30
  206. package/dist/inputs/SliderInput.js +441 -186
  207. package/dist/inputs/SwitchInput.d.ts +109 -0
  208. package/dist/inputs/SwitchInput.js +248 -0
  209. package/dist/inputs/TagInput.d.ts +117 -0
  210. package/dist/inputs/TagInput.js +408 -0
  211. package/dist/inputs/TextAreaInput.d.ts +146 -44
  212. package/dist/inputs/TextAreaInput.js +298 -198
  213. package/dist/inputs/TextInput.d.ts +4 -13
  214. package/dist/inputs/TextInput.js +13 -48
  215. package/dist/inputs/ToggleInput.d.ts +120 -22
  216. package/dist/inputs/ToggleInput.js +262 -116
  217. package/dist/inputs/internal/bareField.d.ts +18 -0
  218. package/dist/inputs/internal/bareField.js +38 -0
  219. package/dist/inputs/internal/devWarn.d.ts +7 -0
  220. package/dist/inputs/internal/devWarn.js +30 -0
  221. package/dist/inputs/internal/fieldFrame.d.ts +34 -0
  222. package/dist/inputs/internal/fieldFrame.js +64 -0
  223. package/dist/inputs/internal/fieldWiring.d.ts +50 -0
  224. package/dist/inputs/internal/fieldWiring.js +38 -0
  225. package/dist/inputs/internal/innerButton.d.ts +2 -0
  226. package/dist/inputs/internal/innerButton.js +24 -0
  227. package/dist/inputs/internal/ownField.d.ts +45 -0
  228. package/dist/inputs/internal/ownField.js +58 -0
  229. package/dist/inputs/internal/predicates.d.ts +9 -0
  230. package/dist/inputs/internal/predicates.js +11 -0
  231. package/dist/inputs/internal/useComboboxPopover.d.ts +46 -0
  232. package/dist/inputs/internal/useComboboxPopover.js +92 -0
  233. package/dist/json/JsonViewer.d.ts +62 -0
  234. package/dist/json/JsonViewer.js +483 -0
  235. package/dist/layout/Box.d.ts +87 -0
  236. package/dist/layout/Box.js +109 -0
  237. package/dist/layout/Divider.d.ts +25 -0
  238. package/dist/layout/Divider.js +70 -0
  239. package/dist/layout/Flex.d.ts +139 -0
  240. package/dist/layout/Flex.js +165 -0
  241. package/dist/layout/FlexItem.d.ts +72 -0
  242. package/dist/layout/FlexItem.js +84 -0
  243. package/dist/layout/Grid.d.ts +140 -0
  244. package/dist/layout/Grid.js +178 -0
  245. package/dist/layout/Portal.d.ts +29 -0
  246. package/dist/layout/Portal.js +27 -0
  247. package/dist/layout/ResizablePanels.d.ts +88 -0
  248. package/dist/layout/ResizablePanels.js +198 -0
  249. package/dist/layout/ResizeHandle.d.ts +48 -0
  250. package/dist/layout/ResizeHandle.js +143 -0
  251. package/dist/layout/ScrollArea.d.ts +30 -0
  252. package/dist/layout/ScrollArea.js +138 -0
  253. package/dist/links/Link.d.ts +101 -1
  254. package/dist/links/Link.js +166 -4
  255. package/dist/lists/BulletedList.d.ts +25 -7
  256. package/dist/lists/BulletedList.js +72 -27
  257. package/dist/lists/DescriptionList.d.ts +91 -0
  258. package/dist/lists/DescriptionList.js +147 -0
  259. package/dist/menu/ContextMenu.d.ts +64 -0
  260. package/dist/menu/ContextMenu.js +34 -0
  261. package/dist/menu/Menu.d.ts +280 -0
  262. package/dist/menu/Menu.js +1003 -0
  263. package/dist/modal/ConfirmDialog.d.ts +55 -0
  264. package/dist/modal/ConfirmDialog.js +151 -0
  265. package/dist/modal/Modal.d.ts +64 -14
  266. package/dist/modal/Modal.js +189 -48
  267. package/dist/navigation/Breadcrumbs.d.ts +65 -0
  268. package/dist/navigation/Breadcrumbs.js +243 -0
  269. package/dist/navigation/CommandPalette.d.ts +83 -0
  270. package/dist/navigation/CommandPalette.js +509 -0
  271. package/dist/navigation/Pagination.d.ts +87 -0
  272. package/dist/navigation/Pagination.js +300 -0
  273. package/dist/navigation/SidebarNav.d.ts +107 -0
  274. package/dist/navigation/SidebarNav.js +341 -0
  275. package/dist/navigation/Stepper.d.ts +52 -0
  276. package/dist/navigation/Stepper.js +207 -0
  277. package/dist/navigation/Tabs.d.ts +113 -0
  278. package/dist/navigation/Tabs.js +543 -0
  279. package/dist/navigation/Topbar.d.ts +20 -0
  280. package/dist/navigation/Topbar.js +62 -0
  281. package/dist/overlay/OverlayProvider.d.ts +28 -32
  282. package/dist/overlay/OverlayProvider.js +42 -93
  283. package/dist/overlay/useOverlay.d.ts +88 -12
  284. package/dist/overlay/useOverlay.js +220 -43
  285. package/dist/overlays/Popover.d.ts +114 -0
  286. package/dist/overlays/Popover.js +389 -0
  287. package/dist/shapes/Circle.d.ts +84 -8
  288. package/dist/shapes/Circle.js +122 -20
  289. package/dist/shapes/Square.d.ts +84 -8
  290. package/dist/shapes/Square.js +123 -20
  291. package/dist/styles/mixins.d.ts +35 -0
  292. package/dist/styles/mixins.js +60 -0
  293. package/dist/styles.css +1 -202
  294. package/dist/table/InfiniteSpreadsheet.d.ts +140 -10
  295. package/dist/table/InfiniteSpreadsheet.js +762 -225
  296. package/dist/table/InfiniteTable.d.ts +116 -14
  297. package/dist/table/InfiniteTable.js +287 -429
  298. package/dist/table/SpreadsheetCellEditor.d.ts +54 -6
  299. package/dist/table/SpreadsheetCellEditor.js +163 -84
  300. package/dist/table/TableCore.d.ts +252 -0
  301. package/dist/table/TableCore.js +1082 -0
  302. package/dist/table/VirtualizedInfiniteTable.d.ts +104 -14
  303. package/dist/table/VirtualizedInfiniteTable.js +280 -219
  304. package/dist/table/types.d.ts +66 -244
  305. package/dist/table/types.js +0 -51
  306. package/dist/table/useInfiniteScrollSentinel.d.ts +25 -21
  307. package/dist/table/useInfiniteScrollSentinel.js +38 -30
  308. package/dist/table/useSpreadsheetCellNavigation.d.ts +44 -0
  309. package/dist/table/useSpreadsheetCellNavigation.js +141 -0
  310. package/dist/table/useTableColumnLayout.d.ts +90 -25
  311. package/dist/table/useTableColumnLayout.js +255 -50
  312. package/dist/table/useTableKeyboardNavigation.d.ts +32 -21
  313. package/dist/table/useTableKeyboardNavigation.js +95 -71
  314. package/dist/table/useTableRowSelection.d.ts +24 -25
  315. package/dist/table/useTableRowSelection.js +57 -84
  316. package/dist/table/useTableVirtualizer.d.ts +20 -0
  317. package/dist/table/useTableVirtualizer.js +48 -0
  318. package/dist/text/Bold.d.ts +5 -6
  319. package/dist/text/Bold.js +16 -15
  320. package/dist/text/Code.d.ts +5 -6
  321. package/dist/text/Code.js +16 -25
  322. package/dist/text/CodeBlock.d.ts +77 -0
  323. package/dist/text/CodeBlock.js +373 -0
  324. package/dist/text/EditableText.d.ts +55 -15
  325. package/dist/text/EditableText.js +153 -135
  326. package/dist/text/Ellipsis.d.ts +34 -8
  327. package/dist/text/Ellipsis.js +55 -23
  328. package/dist/text/Kbd.d.ts +72 -0
  329. package/dist/text/Kbd.js +284 -0
  330. package/dist/text/MarkdownText.d.ts +27 -10
  331. package/dist/text/MarkdownText.js +317 -300
  332. package/dist/text/RequiredMarker.d.ts +17 -5
  333. package/dist/text/RequiredMarker.js +34 -36
  334. package/dist/text/Selectable.d.ts +5 -6
  335. package/dist/text/Selectable.js +16 -13
  336. package/dist/text/Span.d.ts +82 -0
  337. package/dist/text/Span.js +115 -0
  338. package/dist/text/Text.d.ts +128 -41
  339. package/dist/text/Text.js +209 -76
  340. package/dist/theme/GalaxyProvider.d.ts +75 -0
  341. package/dist/theme/GalaxyProvider.js +223 -0
  342. package/dist/theme/ThemeSwitcher.d.ts +52 -0
  343. package/dist/theme/ThemeSwitcher.js +94 -0
  344. package/dist/theme/enums.d.ts +118 -0
  345. package/dist/theme/enums.js +144 -0
  346. package/dist/theme/tokens/dark.d.ts +2 -0
  347. package/dist/theme/tokens/dark.js +275 -0
  348. package/dist/theme/tokens/generate.d.ts +15 -0
  349. package/dist/theme/tokens/generate.js +47 -0
  350. package/dist/theme/tokens/light.d.ts +2 -0
  351. package/dist/theme/tokens/light.js +274 -0
  352. package/dist/theme/tokens/palette.d.ts +14 -0
  353. package/dist/theme/tokens/palette.js +153 -0
  354. package/dist/theme/tokens/scales.d.ts +26 -0
  355. package/dist/theme/tokens/scales.js +154 -0
  356. package/dist/theme/tokens/t.d.ts +3 -0
  357. package/dist/theme/tokens/t.js +25 -0
  358. package/dist/theme/tokens/types.d.ts +189 -0
  359. package/dist/theme/tokens/types.js +0 -0
  360. package/dist/theme/useGalaxyTheme.d.ts +46 -0
  361. package/dist/theme/useGalaxyTheme.js +36 -0
  362. package/dist/theme/useInverseScope.d.ts +18 -0
  363. package/dist/theme/useInverseScope.js +33 -0
  364. package/dist/three/GalaxyLogomark3D.d.ts +46 -0
  365. package/dist/three/GalaxyLogomark3D.js +134 -0
  366. package/dist/three/assets/galaxy-logomark.js +4 -0
  367. package/dist/three/galaxyLogomark3DScene.d.ts +27 -0
  368. package/dist/three/galaxyLogomark3DScene.js +165 -0
  369. package/dist/timeline/Timeline.d.ts +120 -0
  370. package/dist/timeline/Timeline.js +301 -0
  371. package/dist/toast/Toast.d.ts +43 -19
  372. package/dist/toast/Toast.js +130 -89
  373. package/dist/toast/ToastProvider.d.ts +23 -23
  374. package/dist/toast/ToastProvider.js +298 -101
  375. package/dist/toast/ToastViewport.d.ts +12 -0
  376. package/dist/toast/ToastViewport.js +210 -0
  377. package/dist/toast/useToast.d.ts +139 -5
  378. package/dist/toast/useToast.js +15 -13
  379. package/dist/tokens.css +654 -0
  380. package/dist/tooltip/Tooltip.d.ts +64 -44
  381. package/dist/tooltip/Tooltip.js +280 -73
  382. package/dist/tooltip/internal/LazyTooltip.d.ts +7 -0
  383. package/dist/tooltip/internal/LazyTooltip.js +53 -0
  384. package/dist/transform/Fade.d.ts +33 -11
  385. package/dist/transform/Fade.js +71 -19
  386. package/dist/transform/Flasher.d.ts +25 -0
  387. package/dist/transform/Flasher.js +39 -0
  388. package/dist/transform/Rotate.d.ts +24 -12
  389. package/dist/transform/Rotate.js +36 -22
  390. package/dist/transform/ScaleFade.d.ts +36 -11
  391. package/dist/transform/ScaleFade.js +86 -28
  392. package/dist/transform/internal/CollapseMotion.d.ts +10 -0
  393. package/dist/transform/internal/CollapseMotion.js +65 -0
  394. package/dist/tree/Tree.d.ts +85 -0
  395. package/dist/tree/Tree.js +387 -0
  396. package/dist/tree/treeRow.d.ts +39 -0
  397. package/dist/tree/treeRow.js +75 -0
  398. package/dist/utils/colors.d.ts +46 -13
  399. package/dist/utils/colors.js +92 -34
  400. package/dist/utils/css.d.ts +23 -0
  401. package/dist/utils/css.js +30 -0
  402. package/dist/utils/format.d.ts +58 -0
  403. package/dist/utils/format.js +220 -0
  404. package/dist/vite/index.d.ts +16 -0
  405. package/dist/vite/index.js +52 -0
  406. package/dist/widget/Widget.d.ts +164 -48
  407. package/dist/widget/Widget.js +335 -96
  408. package/dist/widget/WidgetGroup.d.ts +36 -0
  409. package/dist/widget/WidgetGroup.js +103 -0
  410. package/package.json +855 -157
  411. package/dist/accordion/Accordion.d.ts +0 -54
  412. package/dist/accordion/Accordion.js +0 -183
  413. package/dist/assets/components/GalaxyFilamentWordmarkDark.d.ts +0 -3
  414. package/dist/assets/components/GalaxyFilamentWordmarkDark.js +0 -14
  415. package/dist/assets/components/GalaxyFilamentWordmarkLight.d.ts +0 -3
  416. package/dist/assets/components/GalaxyFilamentWordmarkLight.js +0 -14
  417. package/dist/assets/components/GalaxyLogomarkDark.d.ts +0 -3
  418. package/dist/assets/components/GalaxyLogomarkDark.js +0 -11
  419. package/dist/assets/components/GalaxyLogomarkLight.d.ts +0 -3
  420. package/dist/assets/components/GalaxyLogomarkLight.js +0 -17
  421. package/dist/assets/components/GalaxyWordmarkDark.d.ts +0 -3
  422. package/dist/assets/components/GalaxyWordmarkDark.js +0 -15
  423. package/dist/assets/components/GalaxyWordmarkLight.d.ts +0 -3
  424. package/dist/assets/components/GalaxyWordmarkLight.js +0 -28
  425. package/dist/assets/models/galaxy-animation.js +0 -136666
  426. package/dist/assets/models/galaxy-logomark.js +0 -4
  427. package/dist/avatar/AvatarShimmer.d.ts +0 -30
  428. package/dist/avatar/AvatarShimmer.js +0 -22
  429. package/dist/backgrounds/CellGridBackground.d.ts +0 -24
  430. package/dist/backgrounds/CellGridBackground.js +0 -44
  431. package/dist/backgrounds/CrossGridBackground.d.ts +0 -26
  432. package/dist/backgrounds/CrossGridBackground.js +0 -49
  433. package/dist/backgrounds/DotGridBackground.d.ts +0 -24
  434. package/dist/backgrounds/DotGridBackground.js +0 -47
  435. package/dist/badge/Badge.d.ts +0 -42
  436. package/dist/badge/Badge.js +0 -99
  437. package/dist/charts/ChartEmptyState.d.ts +0 -17
  438. package/dist/charts/ChartEmptyState.js +0 -29
  439. package/dist/charts/ProgressBar.d.ts +0 -29
  440. package/dist/charts/ProgressBar.js +0 -65
  441. package/dist/charts/chartTheme.d.ts +0 -18
  442. package/dist/charts/chartTheme.js +0 -26
  443. package/dist/containers/FlexItem.d.ts +0 -50
  444. package/dist/containers/FlexItem.js +0 -91
  445. package/dist/containers/FlexWrapper.d.ts +0 -96
  446. package/dist/containers/FlexWrapper.js +0 -143
  447. package/dist/containers/GridWrapper.d.ts +0 -79
  448. package/dist/containers/GridWrapper.js +0 -125
  449. package/dist/containers/Spacing.d.ts +0 -23
  450. package/dist/containers/Spacing.js +0 -59
  451. package/dist/containers/Wrapper.d.ts +0 -26
  452. package/dist/containers/Wrapper.js +0 -54
  453. package/dist/dividers/HorizontalDivider.d.ts +0 -7
  454. package/dist/dividers/HorizontalDivider.js +0 -39
  455. package/dist/dividers/VerticalDivider.d.ts +0 -6
  456. package/dist/dividers/VerticalDivider.js +0 -21
  457. package/dist/icons/GalaxyFilamentWordmark.d.ts +0 -11
  458. package/dist/icons/GalaxyFilamentWordmark.js +0 -25
  459. package/dist/icons/GalaxyLogomark.d.ts +0 -13
  460. package/dist/icons/GalaxyLogomark.js +0 -27
  461. package/dist/icons/GalaxyLogomark3D.d.ts +0 -56
  462. package/dist/icons/GalaxyLogomark3D.js +0 -319
  463. package/dist/icons/GalaxyLogomarkAnimation.d.ts +0 -18
  464. package/dist/icons/GalaxyLogomarkAnimation.js +0 -48
  465. package/dist/icons/GalaxyWordmark.d.ts +0 -11
  466. package/dist/icons/GalaxyWordmark.js +0 -25
  467. package/dist/inputs/MultiTextInput.d.ts +0 -32
  468. package/dist/inputs/MultiTextInput.js +0 -180
  469. package/dist/inputs/SwitcherInput.d.ts +0 -30
  470. package/dist/inputs/SwitcherInput.js +0 -81
  471. package/dist/inputs/hooks.d.ts +0 -10
  472. package/dist/inputs/hooks.js +0 -22
  473. package/dist/overlay/constants.d.ts +0 -28
  474. package/dist/overlay/constants.js +0 -37
  475. package/dist/resizable/HorizontalResizeHandle.d.ts +0 -17
  476. package/dist/resizable/HorizontalResizeHandle.js +0 -38
  477. package/dist/resizable/VerticalResizeHandle.d.ts +0 -18
  478. package/dist/resizable/VerticalResizeHandle.js +0 -39
  479. package/dist/table/SpreadsheetCell.d.ts +0 -21
  480. package/dist/table/SpreadsheetCell.js +0 -71
  481. package/dist/table/SpreadsheetHeaderCell.d.ts +0 -23
  482. package/dist/table/SpreadsheetHeaderCell.js +0 -91
  483. package/dist/table/SpreadsheetMenuItem.d.ts +0 -14
  484. package/dist/table/SpreadsheetMenuItem.js +0 -33
  485. package/dist/table/SpreadsheetPrimitives.d.ts +0 -172
  486. package/dist/table/SpreadsheetPrimitives.js +0 -105
  487. package/dist/table/SpreadsheetRow.d.ts +0 -33
  488. package/dist/table/SpreadsheetRow.js +0 -73
  489. package/dist/table/SpreadsheetRowActionCell.d.ts +0 -14
  490. package/dist/table/SpreadsheetRowActionCell.js +0 -51
  491. package/dist/table/TableExpandCell.d.ts +0 -11
  492. package/dist/table/TableExpandCell.js +0 -24
  493. package/dist/table/TableExpandedRow.d.ts +0 -16
  494. package/dist/table/TableExpandedRow.js +0 -77
  495. package/dist/table/TableHeaderCellContent.d.ts +0 -30
  496. package/dist/table/TableHeaderCellContent.js +0 -48
  497. package/dist/table/TablePrimitives.d.ts +0 -313
  498. package/dist/table/TablePrimitives.js +0 -302
  499. package/dist/table/TableSelectCell.d.ts +0 -18
  500. package/dist/table/TableSelectCell.js +0 -27
  501. package/dist/table/TableStatusRow.d.ts +0 -18
  502. package/dist/table/TableStatusRow.js +0 -50
  503. package/dist/table/useSpreadsheetEditing.d.ts +0 -13
  504. package/dist/table/useSpreadsheetEditing.js +0 -41
  505. package/dist/table/useTableColumnResize.d.ts +0 -38
  506. package/dist/table/useTableColumnResize.js +0 -155
  507. package/dist/table/useTableRowExpansion.d.ts +0 -24
  508. package/dist/table/useTableRowExpansion.js +0 -62
  509. package/dist/table/utils.d.ts +0 -50
  510. package/dist/table/utils.js +0 -78
  511. package/dist/text/HotKeys.d.ts +0 -30
  512. package/dist/text/HotKeys.js +0 -74
  513. package/dist/text/Paragraph.d.ts +0 -33
  514. package/dist/text/Paragraph.js +0 -83
  515. package/dist/text/TextShimmer.d.ts +0 -14
  516. package/dist/text/TextShimmer.js +0 -34
  517. package/dist/theme/GalaxyTheme.d.ts +0 -67
  518. package/dist/theme/GalaxyTheme.js +0 -119
  519. package/dist/theme/constants.d.ts +0 -8
  520. package/dist/theme/constants.js +0 -38
  521. package/dist/theme/index.d.ts +0 -6
  522. package/dist/theme/index.js +0 -7
  523. package/dist/theme/types.d.ts +0 -195
  524. package/dist/theme/types.js +0 -10
  525. package/dist/theme/typography.d.ts +0 -2
  526. package/dist/theme/typography.js +0 -73
  527. package/dist/theme/variants/dark.d.ts +0 -2
  528. package/dist/theme/variants/dark.js +0 -125
  529. package/dist/theme/variants/light.d.ts +0 -2
  530. package/dist/theme/variants/light.js +0 -125
  531. package/dist/toast/ToastContainer.d.ts +0 -10
  532. package/dist/toast/ToastContainer.js +0 -31
  533. package/dist/toast/ToastWrapper.d.ts +0 -6
  534. package/dist/toast/ToastWrapper.js +0 -27
  535. package/dist/transform/Flash.d.ts +0 -7
  536. package/dist/transform/Flash.js +0 -18
  537. package/dist/transform/Spin.d.ts +0 -14
  538. package/dist/transform/Spin.js +0 -25
  539. package/dist/utils/linaria.d.ts +0 -1
  540. package/dist/utils/linaria.js +0 -8
@@ -1,15 +1,10 @@
1
1
  import { resolveLabelFormatter, resolveValueFormatter } from "./chartFormat.js";
2
2
  import { useMemo } from "react";
3
3
  //#region src/charts/useChartFormatters.ts
4
- /**
5
- * Resolves the value and label formatters once per chart.
6
- *
7
- * Doing this centrally is what keeps axis ticks, value labels and tooltip rows
8
- * from drifting apart — the recurring failure when each call site formats for
9
- * itself.
10
- */
11
- function useChartFormatters({ valueFormatter, valueUnit, labelFormatter }) {
12
- const formatValue = useMemo(() => resolveValueFormatter(valueFormatter, valueUnit), [valueFormatter, valueUnit]);
4
+ /** @internal Resolves a chart's value and label formatters once per render. */
5
+ /** @internal Resolves `valueFormatter` (default `formatNumber(v, { precision: 2 })`) and `labelFormatter` (identity). */
6
+ function useChartFormatters(valueFormatter, labelFormatter) {
7
+ const formatValue = useMemo(() => resolveValueFormatter(valueFormatter), [valueFormatter]);
13
8
  const formatLabel = useMemo(() => resolveLabelFormatter(labelFormatter), [labelFormatter]);
14
9
  return useMemo(() => ({
15
10
  formatValue,
@@ -1,135 +1,88 @@
1
- import { ChartMarkState } from "./types";
2
- import type { ChartSelectionInput } from "./types";
3
- /**
4
- * Hover interaction shared by every chart.
5
- *
6
- * Two independent axes, both hover-only:
7
- *
8
- * - **Category** — a numeric index along the plot. Hovering previews it: the
9
- * tooltip opens and everything outside the category recedes.
10
- * - **Series** — a legend key. Hovering (or focusing) a legend entry isolates
11
- * that series.
12
- *
13
- * Plus one read-only source: inside a `ChartGroupProvider`, a chart that
14
- * supplies {@link UseChartInteractionOptions.categoryKeys} follows the category
15
- * hovered in a sibling chart, matched by raw label. Following emphasizes; it
16
- * opens the tooltip only when the provider opts in via `sharedTooltip`, which
17
- * is what {@link ChartInteraction.showTooltip} folds together. The series axis
18
- * deliberately does not sync: series keys are chart-local vocabulary, and
19
- * isolating "Delivered" in a chart that happens to share the name would
20
- * correlate nothing.
21
- *
22
- * Plus one axis that is not hover at all: **selection**, supplied by the caller
23
- * and never changed here. A selection is a commitment rather than a preview —
24
- * it outranks both hover filters, and it releases only when the caller says so.
25
- *
26
- * Clicking deliberately does *not* pin the hover. That is what it used to do,
27
- * with no effect outside the chart, and it read as the plot getting stuck. A
28
- * click now only reports what was hit; whether anything lights up afterwards is
29
- * the caller's `selection` to decide.
30
- */
31
- interface UseChartInteractionOptions {
32
- /** Number of hoverable categories. A shrinking count clears stale indices. */
1
+ import { ChartMarkState, type ChartSelection, type ChartSelectionInput } from "./types.js";
2
+ /** @internal Inputs of `useChartInteraction`. */
3
+ export interface UseChartInteractionOptions {
4
+ /** Number of categories (slices, cells). A shrinking count clears stale indices. */
33
5
  categoryCount: number;
34
- /** Legend keys currently rendered. A key that disappears clears stale hover. */
6
+ /** Legend keys rendered; a key that disappears clears a stale series hover. */
35
7
  seriesKeys?: string[];
36
- /**
37
- * Raw category labels, index-aligned with {@link categoryCount}. Raw labels,
38
- * never `labelFormatter` output — two charts formatting the same label
39
- * differently must still match, and so must a caller's `selection`.
40
- *
41
- * Identity only. Opting into `ChartGroupProvider` sync is
42
- * {@link enableGroupSync}, which used to be implied by supplying these — the
43
- * two were split once selection needed the labels in a chart (PieChart) that
44
- * must stay out of the sync group.
45
- */
8
+ /** Raw category labels, index-aligned. Needed for selection and sync. */
46
9
  categoryKeys?: string[];
47
- /**
48
- * Follow a `ChartGroupProvider` sibling's hovered category. PieChart passes
49
- * `false`: it has no category axis, so there is nothing to correlate.
50
- * @default true
51
- */
10
+ /** Follow and publish to a `ChartGroupProvider`. PieChart and Heatmap pass `false`. @default true */
52
11
  enableGroupSync?: boolean;
53
- /**
54
- * Marks the caller has selected. Matching marks hold full strength and the
55
- * rest recede — the same "soften everything else" grammar the hover axes use,
56
- * which is why selection needs no visual vocabulary of its own.
57
- *
58
- * Presentational and strictly read-only: this hook never writes it. The state
59
- * lives with whatever the selection is filtering, so the chart and that thing
60
- * cannot drift apart, and the DLS never has to pick toggle or multi-select
61
- * semantics.
62
- *
63
- * Normalized here rather than by each chart, so "one, several, or none" is
64
- * spelled once.
65
- */
66
- selection?: ChartSelectionInput;
67
- /**
68
- * How marks outside the active category recede. Defaults to
69
- * {@link ChartMarkState.MUTED}; BarChart passes
70
- * {@link ChartMarkState.DIMMED} because its cursor band already carries the
71
- * category highlight and strong muting on top of it would shout. Only the
72
- * category axis softens — series (legend) isolation always mutes fully,
73
- * since there the muting *is* the affordance.
74
- */
12
+ /** The caller's selection: presentational, or the controlled filter with `isFilterable`. */
13
+ selection?: ChartSelectionInput | undefined;
14
+ /** Clicks toggle the filter; the filter chips' × and Escape clear it. @default false */
15
+ isFilterable?: boolean;
16
+ /** Initial filter while uncontrolled, with `isFilterable`. */
17
+ defaultSelection?: ChartSelectionInput | undefined;
18
+ /** Called with the new filter, with `isFilterable`. */
19
+ onSelectionChange?: ((selection: ChartSelection[]) => void) | undefined;
20
+ /** How off-category marks recede. @default ChartMarkState.MUTED */
75
21
  categoryMuteState?: ChartMarkState;
76
- /** Suppress all interaction — used while loading and when the tooltip is off. */
22
+ /** No category interaction (static plot, loading, empty). The legend stays live. */
77
23
  isDisabled?: boolean;
78
- /**
79
- * Render every mark muted, whatever the two axes say.
80
- *
81
- * Distinct from {@link isDisabled}, which suppresses *input*. Loading suppresses
82
- * *emphasis*: there is nothing yet worth drawing attention to. Folded in here
83
- * rather than left to each mark, because the alternative is the same
84
- * `isLoading ? MUTED : getMarkState(…)` ternary hand-copied at every mark —
85
- * which is exactly how one of them came to be missing it.
86
- */
24
+ /** Every mark is muted and following pauses. */
87
25
  isLoading?: boolean;
26
+ /** Cells laid out in rows of `columns` (Heatmap): Up / Down move by a row, Home / End stay in the row. */
27
+ grid?: {
28
+ columns: number;
29
+ };
88
30
  }
89
- interface MarkStateArgs {
90
- /** Omit for marks that belong to no particular category, such as a line. */
91
- categoryIndex?: number;
92
- /** Omit for marks that belong to no particular series. */
93
- seriesKey?: string;
31
+ /** @internal Which marks a mark-state query is about. */
32
+ export interface ChartMarkStateArgs {
33
+ /** Omit for marks that belong to no category (a line). */
34
+ categoryIndex?: number | undefined;
35
+ /** Omit for marks that belong to no series. */
36
+ seriesKey?: string | undefined;
94
37
  }
38
+ /** @internal What `useChartInteraction` returns. */
95
39
  export interface ChartInteraction {
96
- /**
97
- * The active category — this chart's own hover, or failing that the category
98
- * a `ChartGroupProvider` sibling is hovering, resolved to a local index.
99
- */
40
+ /** The engaged category: this chart's own (pointer or keyboard), else the one a sibling follows. */
100
41
  activeIndex: number | null;
101
- /**
102
- * True when this chart should present its tooltip for {@link activeIndex}:
103
- * its own pointer hover always, a synced sibling's only when the
104
- * `ChartGroupProvider` opts in via `sharedTooltip`.
105
- */
42
+ /** True when this chart shows its tooltip for `activeIndex`. */
106
43
  showTooltip: boolean;
44
+ /** The legend key being hovered. */
107
45
  hoveredSeriesKey: string | null;
108
- /**
109
- * Categories a {@link UseChartInteractionOptions.selection} names outright.
110
- *
111
- * Drives the persistent cursor a cartesian chart draws at a selected
112
- * category. A descriptor carrying only a `seriesKey` names no category and
113
- * contributes nothing here — "every failure" should mute the other series,
114
- * not band every column on the axis.
115
- */
46
+ /** Categories the selection names outright (persistent cursors). */
116
47
  selectedCategoryIndices: ReadonlySet<number>;
117
- /**
118
- * Emphasis for one mark, composed from both axes.
119
- *
120
- * The grammar is inherited from the reference and is the opposite of the
121
- * obvious one: engaging something does not brighten it, it softens everything
122
- * else.
123
- *
124
- * A mark has to survive *both* filters to stay active — the two axes
125
- * intersect rather than override, so hovering a legend entry and a category
126
- * at once leaves only their overlap lit.
127
- */
128
- getMarkState: (args: MarkStateArgs) => ChartMarkState;
48
+ /** Clicks filter (`isFilterable`). */
49
+ isFilterable: boolean;
50
+ /** Something is pinned (or the caller's selection is not empty). */
51
+ hasSelection: boolean;
52
+ /** The selection as a list (the pinned filter with `isFilterable`). */
53
+ selection: readonly ChartSelection[];
54
+ /** One click on a descriptor: pin, unpin, switch, or (additive) add / remove. No-op unless filterable. */
55
+ toggleSelection: (descriptor: ChartSelection, isAdditive: boolean) => void;
56
+ /** Replace the filter (a chip's × dropping one part of a pin). No-op unless filterable. */
57
+ setSelection: (selection: ChartSelection[]) => void;
58
+ /** Clear the filter (the chip's ×, Escape). No-op unless filterable. */
59
+ clearSelection: () => void;
60
+ /** A legend entry's emphasis: the hovered entry, else whether the selection covers its series. */
61
+ getSeriesState: (seriesKey: string) => ChartMarkState;
62
+ /** The series is pinned on its own (`{ seriesKey }` is in the filter): its legend entry reads pressed. */
63
+ isSeriesPinned: (seriesKey: string) => boolean;
64
+ /** Emphasis of one mark, composed from selection, series and category. */
65
+ getMarkState: (args: ChartMarkStateArgs) => ChartMarkState;
66
+ /** Pointer entered a category's target. */
129
67
  onCategoryEnter: (categoryIndex: number) => void;
68
+ /** Pointer left the plot. */
130
69
  onCategoryLeave: () => void;
70
+ /** Pointer entered a legend entry. */
131
71
  onSeriesEnter: (seriesKey: string) => void;
72
+ /** Pointer left a legend entry. */
132
73
  onSeriesLeave: () => void;
74
+ /** Keyboard focus reached the plot: engage the last category, or the first. Returns it. */
75
+ onKeyboardFocus: () => number | null;
76
+ /** A navigation key; returns the newly engaged index, or `null` if the key does not navigate. */
77
+ onKeyboardMove: (key: string) => number | null;
78
+ /** Escape: clear the engaged category (focus stays). */
79
+ onKeyboardClear: () => void;
80
+ /** Focus left the plot. */
81
+ onKeyboardBlur: () => void;
133
82
  }
134
- export declare function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, enableGroupSync, selection, categoryMuteState, isDisabled, isLoading, }: UseChartInteractionOptions): ChartInteraction;
135
- export {};
83
+ /** @internal The next index for a navigation key, stopping at the ends (no wrap). */
84
+ export declare function getNextCategoryIndex(current: number, key: string, count: number, grid?: {
85
+ columns: number;
86
+ }): number | null;
87
+ /** @internal Shared interaction model; see the module comment. */
88
+ export declare function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, enableGroupSync, selection, isFilterable, defaultSelection, onSelectionChange, categoryMuteState, isDisabled, isLoading, grid, }: UseChartInteractionOptions): ChartInteraction;
@@ -1,32 +1,62 @@
1
+ import { useControlledState } from "../hooks/useControlledState.js";
1
2
  import { ChartMarkState } from "./types.js";
3
+ import { isSameSelection, toSelectionList, toggleSelection } from "./chartSelection.js";
2
4
  import { ChartGroupContext } from "./ChartGroupProvider.js";
3
- import { useCallback, useContext, useEffect, useId, useMemo, useState } from "react";
5
+ import { useCallback, useContext, useEffect, useId, useMemo, useRef, useState } from "react";
4
6
  //#region src/charts/useChartInteraction.ts
5
- /** Stable identity, so an absent selection never re-memoizes anything. */
6
- var NO_SELECTION = [];
7
+ /**
8
+ * @internal Hover, keyboard, selection and group sync for every chart.
9
+ *
10
+ * Two local axes:
11
+ * - **Category**: an index along the plot, engaged by pointer hover or by the keyboard (the plot
12
+ * box is one tab stop; arrows move, Home / End jump, Escape clears). Engaging previews it: the
13
+ * tooltip opens and the rest recedes.
14
+ * - **Series**: a legend key, engaged by hovering a legend entry. Isolates that series.
15
+ *
16
+ * Plus a read-only source: inside a `ChartGroupProvider`, a chart that passes `categoryKeys`
17
+ * follows the category a sibling engages (matched by raw label). Following emphasizes; it opens
18
+ * the tooltip only when the provider shares tooltips. Series hover never syncs.
19
+ *
20
+ * And **selection**: the marks that hold full strength while the rest recede. Without
21
+ * `isFilterable` it is the caller's, presentational, and clicks only report. With `isFilterable`
22
+ * it is the chart's filter (controlled or not): legend and plot clicks toggle descriptors in it, and
23
+ * the filter chips' × or Escape clear it. A pinned selection outranks category hover; hovering a legend entry
24
+ * previews that series over it.
25
+ */
7
26
  var NO_SELECTED_INDICES = /* @__PURE__ */ new Set();
8
- function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, enableGroupSync = true, selection, categoryMuteState = ChartMarkState.MUTED, isDisabled = false, isLoading = false }) {
9
- const [hoveredIndex, setHoveredIndex] = useState(null);
27
+ /** @internal The next index for a navigation key, stopping at the ends (no wrap). */
28
+ function getNextCategoryIndex(current, key, count, grid) {
29
+ if (count <= 0) return null;
30
+ const columns = grid ? Math.max(1, grid.columns) : count;
31
+ const rowStart = grid ? current - current % columns : 0;
32
+ const rowEnd = grid ? Math.min(count - 1, rowStart + columns - 1) : count - 1;
33
+ switch (key) {
34
+ case "ArrowRight": return Math.min(current + 1, rowEnd);
35
+ case "ArrowLeft": return Math.max(current - 1, rowStart);
36
+ case "Home": return rowStart;
37
+ case "End": return rowEnd;
38
+ case "ArrowDown": return grid && current + columns < count ? current + columns : grid ? current : null;
39
+ case "ArrowUp": return grid && current - columns >= 0 ? current - columns : grid ? current : null;
40
+ default: return null;
41
+ }
42
+ }
43
+ /** @internal Shared interaction model; see the module comment. */
44
+ function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, enableGroupSync = true, selection, isFilterable = false, defaultSelection, onSelectionChange, categoryMuteState = ChartMarkState.MUTED, isDisabled = false, isLoading = false, grid }) {
45
+ const [pointerIndex, setPointerIndex] = useState(null);
46
+ const [keyboardIndex, setKeyboardIndex] = useState(null);
10
47
  const [hoveredSeriesKey, setHoveredSeriesKey] = useState(null);
48
+ /** The last engaged category, where keyboard focus resumes. */
49
+ const lastIndexRef = useRef(null);
11
50
  const sync = useContext(ChartGroupContext);
12
51
  const syncId = useId();
13
52
  const canSync = sync !== null && categoryKeys !== void 0 && enableGroupSync;
14
53
  const setActive = sync?.setActive;
15
54
  const clearActive = sync?.clearActive;
16
- const safeHovered = hoveredIndex !== null && hoveredIndex < categoryCount ? hoveredIndex : null;
55
+ const inRange = (index) => index !== null && index < categoryCount && !isDisabled ? index : null;
56
+ const localIndex = inRange(pointerIndex) ?? inRange(keyboardIndex);
57
+ if (localIndex !== null) lastIndexRef.current = localIndex;
17
58
  const safeHoveredSeries = hoveredSeriesKey !== null && (seriesKeys === void 0 || seriesKeys.includes(hoveredSeriesKey)) ? hoveredSeriesKey : null;
18
- /**
19
- * Publish this chart's hover to the sync group.
20
- *
21
- * An effect over the derived label rather than calls inside the pointer
22
- * handlers, so three edge cases collapse into one place: data shrinking
23
- * under a resting pointer (the `safeHovered` guard nulls the key → clears),
24
- * the label at the resting index changing (republishes what is now under
25
- * the pointer), and unmount while source (the cleanup effect below).
26
- * Source-only writes still hold — `localKey` derives from `safeHovered`,
27
- * which only this chart's own pointer sets.
28
- */
29
- const localKey = canSync && safeHovered !== null ? categoryKeys[safeHovered] ?? null : null;
59
+ const localKey = canSync && localIndex !== null ? categoryKeys[localIndex] ?? null : null;
30
60
  useEffect(() => {
31
61
  if (!setActive || !clearActive) return;
32
62
  if (localKey !== null) setActive({
@@ -41,16 +71,8 @@ function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, enableGr
41
71
  localKey
42
72
  ]);
43
73
  useEffect(() => () => clearActive?.(syncId), [clearActive, syncId]);
44
- /**
45
- * The category a sibling is hovering, resolved to this chart's own index.
46
- *
47
- * `isLoading` blocks following — the marks are force-muted anyway, but
48
- * without the guard LineChart would still draw its cursor and dots through
49
- * a loading plot. An unmatched label resolves to no crosshair at all, which
50
- * is how charts with partially overlapping categories degrade.
51
- */
52
74
  const followedIndex = useMemo(() => {
53
- if (!canSync || isLoading) return null;
75
+ if (!canSync || isLoading || isDisabled) return null;
54
76
  const entry = sync.activeEntry;
55
77
  if (entry === null || entry.sourceId === syncId) return null;
56
78
  const index = categoryKeys.indexOf(entry.categoryKey);
@@ -58,43 +80,72 @@ function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, enableGr
58
80
  }, [
59
81
  canSync,
60
82
  isLoading,
83
+ isDisabled,
61
84
  sync?.activeEntry,
62
85
  syncId,
63
86
  categoryKeys
64
87
  ]);
65
- const effectiveIndex = safeHovered ?? followedIndex;
66
- const showTooltip = safeHovered !== null || followedIndex !== null && (sync?.sharedTooltip ?? false);
88
+ const activeIndex = localIndex ?? followedIndex;
89
+ const showTooltip = localIndex !== null || followedIndex !== null && (sync?.shouldShareTooltip ?? false);
67
90
  const onCategoryEnter = useCallback((categoryIndex) => {
68
91
  if (isDisabled) return;
69
- setHoveredIndex(categoryIndex);
70
- }, [isDisabled]);
71
- const onCategoryLeave = useCallback(() => {
72
- if (isDisabled) return;
73
- setHoveredIndex(null);
92
+ setPointerIndex(categoryIndex);
74
93
  }, [isDisabled]);
75
- const onSeriesEnter = useCallback((seriesKey) => {
76
- setHoveredSeriesKey(seriesKey);
77
- }, []);
78
- const onSeriesLeave = useCallback(() => {
79
- setHoveredSeriesKey(null);
94
+ const onCategoryLeave = useCallback(() => setPointerIndex(null), []);
95
+ const onSeriesEnter = useCallback((seriesKey) => setHoveredSeriesKey(seriesKey), []);
96
+ const onSeriesLeave = useCallback(() => setHoveredSeriesKey(null), []);
97
+ const onKeyboardFocus = useCallback(() => {
98
+ if (isDisabled || categoryCount === 0) return null;
99
+ const last = lastIndexRef.current;
100
+ const index = last !== null && last < categoryCount ? last : 0;
101
+ setKeyboardIndex(index);
102
+ return index;
103
+ }, [isDisabled, categoryCount]);
104
+ const onKeyboardMove = useCallback((key) => {
105
+ if (isDisabled || categoryCount === 0) return null;
106
+ const current = localIndex ?? lastIndexRef.current;
107
+ const next = current === null || current >= categoryCount ? getNextCategoryIndex(0, key, categoryCount, grid) === null ? null : 0 : getNextCategoryIndex(current, key, categoryCount, grid);
108
+ if (next === null) return null;
109
+ setPointerIndex(null);
110
+ setKeyboardIndex(next);
111
+ return next;
112
+ }, [
113
+ isDisabled,
114
+ categoryCount,
115
+ localIndex,
116
+ grid
117
+ ]);
118
+ const onKeyboardClear = useCallback(() => {
119
+ setPointerIndex(null);
120
+ setKeyboardIndex(null);
80
121
  }, []);
81
- const selectionList = useMemo(() => {
82
- if (selection === void 0 || selection === null) return NO_SELECTION;
83
- if (!Array.isArray(selection)) return [selection];
84
- return selection.length === 0 ? NO_SELECTION : selection;
85
- }, [selection]);
122
+ const onKeyboardBlur = useCallback(() => setKeyboardIndex(null), []);
123
+ const [selectionList, setSelectionList] = useControlledState({
124
+ value: useMemo(() => selection === void 0 ? void 0 : toSelectionList(selection), [selection]),
125
+ defaultValue: isFilterable ? toSelectionList(defaultSelection) : [],
126
+ onChange: onSelectionChange
127
+ });
86
128
  const hasSelection = selectionList.length > 0;
87
- /**
88
- * Whether one mark falls inside the selection.
89
- *
90
- * A descriptor is a conjunction of the fields it *carries*: an absent field
91
- * constrains nothing, and a field the mark itself has no notion of cannot
92
- * exclude it. The second half is what keeps `{ categoryKey: "00:00" }` from
93
- * muting every LineChart stroke — a stroke spans all the categories and is
94
- * asked about none — while still muting the bars outside that column.
95
- *
96
- * Several descriptors union: a mark inside any of them is selected.
97
- */
129
+ const toggleSelection$1 = useCallback((descriptor, isAdditive) => {
130
+ if (!isFilterable) return;
131
+ setSelectionList(toggleSelection(selectionList, descriptor, isAdditive));
132
+ }, [
133
+ isFilterable,
134
+ selectionList,
135
+ setSelectionList
136
+ ]);
137
+ const setSelection = useCallback((next) => {
138
+ if (isFilterable) setSelectionList(next);
139
+ }, [isFilterable, setSelectionList]);
140
+ const clearSelection = useCallback(() => {
141
+ if (!isFilterable || selectionList.length === 0) return;
142
+ setSelectionList([]);
143
+ }, [
144
+ isFilterable,
145
+ selectionList,
146
+ setSelectionList
147
+ ]);
148
+ /** A descriptor is a conjunction of the fields it carries; a field the mark lacks never excludes it. */
98
149
  const matchesSelection = useCallback(({ categoryIndex, seriesKey }) => {
99
150
  if (!hasSelection) return true;
100
151
  return selectionList.some((descriptor) => {
@@ -107,23 +158,13 @@ function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, enableGr
107
158
  selectionList,
108
159
  categoryKeys
109
160
  ]);
110
- /**
111
- * Resolved once rather than per mark: the cursor a cartesian chart draws at a
112
- * selected category needs the set, and every mark would otherwise re-scan
113
- * every descriptor.
114
- *
115
- * Deliberately not pruned when the data shrinks under it, unlike the hover
116
- * indices above. A selection is the caller's state and describes what they
117
- * asked for; a key that is momentarily absent from the data — mid-refetch,
118
- * say — simply matches nothing until it returns.
119
- */
120
161
  const selectedCategoryIndices = useMemo(() => {
121
162
  if (!hasSelection || categoryKeys === void 0) return NO_SELECTED_INDICES;
122
- const selectedKeys = new Set(selectionList.map((descriptor) => descriptor.categoryKey).filter((key) => key !== void 0));
123
- if (selectedKeys.size === 0) return NO_SELECTED_INDICES;
163
+ const keys = new Set(selectionList.map((descriptor) => descriptor.categoryKey).filter((key) => key !== void 0));
164
+ if (keys.size === 0) return NO_SELECTED_INDICES;
124
165
  const indices = /* @__PURE__ */ new Set();
125
166
  categoryKeys.forEach((key, index) => {
126
- if (selectedKeys.has(key)) indices.add(index);
167
+ if (keys.has(key)) indices.add(index);
127
168
  });
128
169
  return indices;
129
170
  }, [
@@ -133,42 +174,71 @@ function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, enableGr
133
174
  ]);
134
175
  const getMarkState = useCallback(({ categoryIndex, seriesKey }) => {
135
176
  if (isLoading) return ChartMarkState.MUTED;
177
+ if (seriesKey !== void 0 && safeHoveredSeries !== null) return seriesKey === safeHoveredSeries ? ChartMarkState.ACTIVE : ChartMarkState.MUTED;
136
178
  if (!matchesSelection({
137
179
  categoryIndex,
138
180
  seriesKey
139
181
  })) return ChartMarkState.MUTED;
140
- const categoryMuted = categoryIndex !== void 0 && effectiveIndex !== null && categoryIndex !== effectiveIndex;
141
- if (seriesKey !== void 0 && safeHoveredSeries !== null && seriesKey !== safeHoveredSeries) return ChartMarkState.MUTED;
142
- if (categoryMuted) return categoryMuteState;
143
- return ChartMarkState.ACTIVE;
182
+ if (hasSelection) return ChartMarkState.ACTIVE;
183
+ return categoryIndex !== void 0 && activeIndex !== null && categoryIndex !== activeIndex ? categoryMuteState : ChartMarkState.ACTIVE;
144
184
  }, [
145
185
  isLoading,
146
186
  matchesSelection,
147
- effectiveIndex,
148
187
  safeHoveredSeries,
188
+ hasSelection,
189
+ activeIndex,
149
190
  categoryMuteState
150
191
  ]);
192
+ const getSeriesState = useCallback((seriesKey) => {
193
+ if (safeHoveredSeries !== null) return seriesKey === safeHoveredSeries ? ChartMarkState.ACTIVE : ChartMarkState.MUTED;
194
+ return matchesSelection({ seriesKey }) ? ChartMarkState.ACTIVE : ChartMarkState.MUTED;
195
+ }, [safeHoveredSeries, matchesSelection]);
196
+ const isSeriesPinned = useCallback((seriesKey) => isFilterable && selectionList.some((item) => isSameSelection(item, { seriesKey })), [isFilterable, selectionList]);
151
197
  return useMemo(() => ({
152
- activeIndex: effectiveIndex,
198
+ activeIndex,
153
199
  showTooltip,
154
200
  hoveredSeriesKey: safeHoveredSeries,
155
201
  selectedCategoryIndices,
202
+ isFilterable,
203
+ hasSelection,
204
+ selection: selectionList,
205
+ toggleSelection: toggleSelection$1,
206
+ setSelection,
207
+ clearSelection,
208
+ getSeriesState,
209
+ isSeriesPinned,
156
210
  getMarkState,
157
211
  onCategoryEnter,
158
212
  onCategoryLeave,
159
213
  onSeriesEnter,
160
- onSeriesLeave
214
+ onSeriesLeave,
215
+ onKeyboardFocus,
216
+ onKeyboardMove,
217
+ onKeyboardClear,
218
+ onKeyboardBlur
161
219
  }), [
162
- effectiveIndex,
220
+ activeIndex,
163
221
  showTooltip,
164
222
  safeHoveredSeries,
165
223
  selectedCategoryIndices,
224
+ isFilterable,
225
+ hasSelection,
226
+ selectionList,
227
+ toggleSelection$1,
228
+ setSelection,
229
+ clearSelection,
230
+ getSeriesState,
231
+ isSeriesPinned,
166
232
  getMarkState,
167
233
  onCategoryEnter,
168
234
  onCategoryLeave,
169
235
  onSeriesEnter,
170
- onSeriesLeave
236
+ onSeriesLeave,
237
+ onKeyboardFocus,
238
+ onKeyboardMove,
239
+ onKeyboardClear,
240
+ onKeyboardBlur
171
241
  ]);
172
242
  }
173
243
  //#endregion
174
- export { useChartInteraction };
244
+ export { getNextCategoryIndex, useChartInteraction };
@@ -1,53 +1,43 @@
1
1
  /**
2
- * Tooltip placement with edge collision handling.
3
- *
4
- * Computed in JS rather than CSS because clamping needs a percentage of the
5
- * tooltip's own size measured against a percentage of the container's, and
6
- * `min()`/`max()` cannot resolve two different percentage bases in one
7
- * expression. Any CSS-only attempt works until the first long label.
2
+ * @internal Chart tooltip placement with edge collision handling (1.x logic): beside the anchor,
3
+ * flipped away from it, clamped inside the plot box. Computed in JS because clamping needs the
4
+ * tooltip's own measured size against the box's.
8
5
  */
9
- interface UseChartTooltipPositionOptions {
10
- /** Anchor in container coordinates. */
6
+ import { type RefObject } from "react";
7
+ /** @internal Vertical placement of the tooltip relative to its anchor. */
8
+ export declare enum ChartTooltipVerticalAlign {
9
+ /** The anchor marks the top of something (the highest point in a column). */
10
+ ABOVE = "ABOVE",
11
+ /** The anchor marks a position (a point on an arc). */
12
+ CENTERED = "CENTERED"
13
+ }
14
+ /** @internal Inputs of `useChartTooltipPosition`. */
15
+ export interface UseChartTooltipPositionOptions {
16
+ /** Anchor x in plot-box coordinates. */
11
17
  anchorX: number;
18
+ /** Anchor y in plot-box coordinates. */
12
19
  anchorY: number;
13
- /** The box to stay inside. */
20
+ /** Plot box width. */
14
21
  containerWidth: number;
22
+ /** Plot box height. */
15
23
  containerHeight: number;
16
- /** Half-width of the anchored category, so the tooltip can sit beside it. */
17
- anchorHalfWidth?: number;
18
- /**
19
- * An x coordinate to move away from, instead of flipping on the container's
20
- * midline.
21
- *
22
- * Radial charts need this. Their anchor already sits on the arc's outer edge,
23
- * so "which half of the container am I in" points the tooltip back over the
24
- * middle of the chart — across the very slices it describes, and across any
25
- * donut-hole content. Passing the centre pushes it outward instead.
26
- */
27
- placeAwayFromX?: number;
28
- /**
29
- * Where the tooltip sits vertically relative to its anchor.
30
- *
31
- * `ABOVE` suits an anchor that marks the top of something (a bar, the highest
32
- * point in a column). `CENTERED` suits an anchor that marks a position rather
33
- * than a top, such as a point on an arc.
34
- */
35
- verticalAlign?: ChartTooltipVerticalAlign;
36
- }
37
- export declare enum ChartTooltipVerticalAlign {
38
- ABOVE = "ABOVE",
39
- CENTERED = "CENTERED"
24
+ /** Half the anchored category's width, so the tooltip sits beside it. */
25
+ anchorHalfWidth?: number | undefined;
26
+ /** An x to move away from instead of the box's midline (radial charts pass their center). */
27
+ placeAwayFromX?: number | undefined;
28
+ /** @default ChartTooltipVerticalAlign.ABOVE */
29
+ verticalAlign?: ChartTooltipVerticalAlign | undefined;
40
30
  }
31
+ /** @internal The tooltip's measured position. */
41
32
  export interface ChartTooltipPosition {
42
33
  /** Attach to the tooltip element so it can be measured. */
43
- tooltipRef: React.RefObject<HTMLDivElement>;
34
+ tooltipRef: RefObject<HTMLDivElement>;
35
+ /** Left edge in plot-box coordinates. */
44
36
  x: number;
37
+ /** Top edge in plot-box coordinates. */
45
38
  y: number;
46
- /**
47
- * False for the first frame after the content changes, while the measured
48
- * size is still stale. Gating visibility on it hides the reflow.
49
- */
39
+ /** `false` until the tooltip has been measured once. */
50
40
  isMeasured: boolean;
51
41
  }
42
+ /** @internal Positions the chart tooltip. */
52
43
  export declare function useChartTooltipPosition({ anchorX, anchorY, containerWidth, containerHeight, anchorHalfWidth, placeAwayFromX, verticalAlign, }: UseChartTooltipPositionOptions): ChartTooltipPosition;
53
- export {};