@galaxy-io/dls 1.6.0 → 2.0.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 (538) 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 +136 -116
  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 +32 -20
  46. package/dist/charts/ChartFrame.d.ts +69 -116
  47. package/dist/charts/ChartFrame.js +253 -119
  48. package/dist/charts/ChartGroupProvider.d.ts +30 -41
  49. package/dist/charts/ChartGroupProvider.js +20 -7
  50. package/dist/charts/ChartLegend.d.ts +27 -48
  51. package/dist/charts/ChartLegend.js +206 -125
  52. package/dist/charts/ChartMarkTargets.d.ts +12 -28
  53. package/dist/charts/ChartMarkTargets.js +33 -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 +295 -0
  60. package/dist/charts/LineChart.d.ts +54 -47
  61. package/dist/charts/LineChart.js +159 -117
  62. package/dist/charts/PieChart.d.ts +32 -53
  63. package/dist/charts/PieChart.js +149 -135
  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/constants.d.ts +96 -256
  79. package/dist/charts/constants.js +105 -275
  80. package/dist/charts/heatmapGeometry.d.ts +95 -0
  81. package/dist/charts/heatmapGeometry.js +155 -0
  82. package/dist/charts/lineChartGeometry.d.ts +108 -58
  83. package/dist/charts/lineChartGeometry.js +120 -78
  84. package/dist/charts/pieChartGeometry.d.ts +66 -40
  85. package/dist/charts/pieChartGeometry.js +68 -38
  86. package/dist/charts/types.d.ts +197 -466
  87. package/dist/charts/types.js +55 -144
  88. package/dist/charts/useCartesianChartLayout.d.ts +28 -59
  89. package/dist/charts/useCartesianChartLayout.js +47 -32
  90. package/dist/charts/useChartDimensions.d.ts +19 -40
  91. package/dist/charts/useChartDimensions.js +40 -56
  92. package/dist/charts/useChartFormatters.d.ts +6 -15
  93. package/dist/charts/useChartFormatters.js +4 -9
  94. package/dist/charts/useChartInteraction.d.ts +47 -116
  95. package/dist/charts/useChartInteraction.js +95 -71
  96. package/dist/charts/useChartTooltipPosition.d.ts +29 -39
  97. package/dist/charts/useChartTooltipPosition.js +14 -5
  98. package/dist/charts/useSeriesColorResolver.d.ts +11 -33
  99. package/dist/charts/useSeriesColorResolver.js +19 -12
  100. package/dist/chips/Chip.d.ts +155 -44
  101. package/dist/chips/Chip.js +329 -155
  102. package/dist/chips/ChipGroup.d.ts +53 -0
  103. package/dist/chips/ChipGroup.js +98 -0
  104. package/dist/drawer/Drawer.d.ts +81 -17
  105. package/dist/drawer/Drawer.js +370 -65
  106. package/dist/dropdown/Dropdown.d.ts +80 -63
  107. package/dist/dropdown/Dropdown.js +127 -129
  108. package/dist/editor/CodeEditor.d.ts +119 -40
  109. package/dist/editor/CodeEditor.js +490 -400
  110. package/dist/editor/CodeEditorReactWidget.d.ts +20 -17
  111. package/dist/editor/CodeEditorReactWidget.js +28 -21
  112. package/dist/feedback/Alert.d.ts +49 -0
  113. package/dist/feedback/Alert.js +172 -0
  114. package/dist/feedback/EmptyState.d.ts +39 -0
  115. package/dist/feedback/EmptyState.js +109 -0
  116. package/dist/feedback/ProgressBar.d.ts +125 -0
  117. package/dist/feedback/ProgressBar.js +183 -0
  118. package/dist/feedback/ProgressCircle.d.ts +99 -0
  119. package/dist/feedback/ProgressCircle.js +187 -0
  120. package/dist/feedback/Skeleton.d.ts +69 -0
  121. package/dist/feedback/Skeleton.js +130 -0
  122. package/dist/feedback/Spinner.d.ts +63 -0
  123. package/dist/feedback/Spinner.js +141 -0
  124. package/dist/fonts.css +70 -0
  125. package/dist/hooks/internal/useIsClient.d.ts +2 -0
  126. package/dist/hooks/internal/useIsClient.js +14 -0
  127. package/dist/hooks/useClipboard.d.ts +19 -0
  128. package/dist/hooks/useClipboard.js +45 -0
  129. package/dist/hooks/useControlledOpenState.d.ts +21 -0
  130. package/dist/hooks/useControlledOpenState.js +19 -0
  131. package/dist/hooks/useControlledState.d.ts +19 -0
  132. package/dist/hooks/useControlledState.js +22 -0
  133. package/dist/hooks/useDebouncedValue.d.ts +14 -0
  134. package/dist/hooks/useDebouncedValue.js +33 -0
  135. package/dist/hooks/useDisclosure.d.ts +26 -0
  136. package/dist/hooks/useDisclosure.js +36 -0
  137. package/dist/hooks/useDismiss.d.ts +23 -27
  138. package/dist/hooks/useDismiss.js +39 -27
  139. package/dist/hooks/useElementClientSize.d.ts +10 -10
  140. package/dist/hooks/useElementClientSize.js +8 -11
  141. package/dist/hooks/useElementWidth.d.ts +6 -13
  142. package/dist/hooks/useElementWidth.js +6 -14
  143. package/dist/hooks/useField.d.ts +47 -0
  144. package/dist/hooks/useField.js +40 -0
  145. package/dist/hooks/useHotkey.d.ts +77 -0
  146. package/dist/hooks/useHotkey.js +246 -0
  147. package/dist/hooks/useIsMac.d.ts +12 -0
  148. package/dist/hooks/useIsMac.js +27 -0
  149. package/dist/hooks/useIsomorphicLayoutEffect.d.ts +17 -0
  150. package/dist/hooks/useIsomorphicLayoutEffect.js +20 -0
  151. package/dist/hooks/useLocalStorage.d.ts +28 -0
  152. package/dist/hooks/useLocalStorage.js +145 -0
  153. package/dist/hooks/useMediaQuery.d.ts +11 -0
  154. package/dist/hooks/useMediaQuery.js +23 -0
  155. package/dist/hooks/usePrefersReducedMotion.d.ts +12 -0
  156. package/dist/hooks/usePrefersReducedMotion.js +25 -0
  157. package/dist/hooks/useResize.d.ts +42 -62
  158. package/dist/hooks/useResize.js +43 -31
  159. package/dist/icons/Icon.d.ts +64 -37
  160. package/dist/icons/Icon.js +96 -37
  161. package/dist/icons/internal/IconSlot.d.ts +10 -0
  162. package/dist/icons/internal/IconSlot.js +32 -0
  163. package/dist/inputs/CheckboxGroup.d.ts +115 -0
  164. package/dist/inputs/CheckboxGroup.js +183 -0
  165. package/dist/inputs/CheckboxInput.d.ts +98 -28
  166. package/dist/inputs/CheckboxInput.js +218 -88
  167. package/dist/inputs/ColorInput.d.ts +115 -29
  168. package/dist/inputs/ColorInput.js +748 -326
  169. package/dist/inputs/CopyInput.d.ts +49 -20
  170. package/dist/inputs/CopyInput.js +57 -49
  171. package/dist/inputs/CronInput.d.ts +94 -0
  172. package/dist/inputs/CronInput.js +618 -0
  173. package/dist/inputs/DateInput.d.ts +175 -28
  174. package/dist/inputs/DateInput.js +1109 -451
  175. package/dist/inputs/DurationInput.d.ts +101 -0
  176. package/dist/inputs/DurationInput.js +441 -0
  177. package/dist/inputs/Field.d.ts +75 -0
  178. package/dist/inputs/Field.js +247 -0
  179. package/dist/inputs/Fieldset.d.ts +53 -0
  180. package/dist/inputs/Fieldset.js +149 -0
  181. package/dist/inputs/FileInput.d.ts +110 -0
  182. package/dist/inputs/FileInput.js +476 -0
  183. package/dist/inputs/Input.d.ts +148 -187
  184. package/dist/inputs/Input.js +339 -259
  185. package/dist/inputs/KeyValueInput.d.ts +120 -0
  186. package/dist/inputs/KeyValueInput.js +383 -0
  187. package/dist/inputs/MultiSelectInput.d.ts +165 -54
  188. package/dist/inputs/MultiSelectInput.js +175 -559
  189. package/dist/inputs/NumberInput.d.ts +65 -9
  190. package/dist/inputs/NumberInput.js +197 -40
  191. package/dist/inputs/PasswordInput.d.ts +17 -12
  192. package/dist/inputs/PasswordInput.js +33 -33
  193. package/dist/inputs/PinInput.d.ts +117 -0
  194. package/dist/inputs/PinInput.js +364 -0
  195. package/dist/inputs/RadioGroup.d.ts +115 -0
  196. package/dist/inputs/RadioGroup.js +179 -0
  197. package/dist/inputs/RadioInput.d.ts +87 -24
  198. package/dist/inputs/RadioInput.js +182 -95
  199. package/dist/inputs/SearchInput.d.ts +66 -0
  200. package/dist/inputs/SearchInput.js +156 -0
  201. package/dist/inputs/SelectInput.d.ts +195 -55
  202. package/dist/inputs/SelectInput.js +1308 -446
  203. package/dist/inputs/SliderInput.d.ts +150 -30
  204. package/dist/inputs/SliderInput.js +441 -186
  205. package/dist/inputs/SwitchInput.d.ts +109 -0
  206. package/dist/inputs/SwitchInput.js +248 -0
  207. package/dist/inputs/TagInput.d.ts +117 -0
  208. package/dist/inputs/TagInput.js +408 -0
  209. package/dist/inputs/TextAreaInput.d.ts +146 -44
  210. package/dist/inputs/TextAreaInput.js +292 -198
  211. package/dist/inputs/TextInput.d.ts +4 -13
  212. package/dist/inputs/TextInput.js +13 -48
  213. package/dist/inputs/ToggleInput.d.ts +120 -22
  214. package/dist/inputs/ToggleInput.js +262 -116
  215. package/dist/inputs/internal/bareField.d.ts +18 -0
  216. package/dist/inputs/internal/bareField.js +38 -0
  217. package/dist/inputs/internal/devWarn.d.ts +7 -0
  218. package/dist/inputs/internal/devWarn.js +30 -0
  219. package/dist/inputs/internal/fieldFrame.d.ts +34 -0
  220. package/dist/inputs/internal/fieldFrame.js +64 -0
  221. package/dist/inputs/internal/fieldWiring.d.ts +50 -0
  222. package/dist/inputs/internal/fieldWiring.js +38 -0
  223. package/dist/inputs/internal/innerButton.d.ts +2 -0
  224. package/dist/inputs/internal/innerButton.js +24 -0
  225. package/dist/inputs/internal/ownField.d.ts +45 -0
  226. package/dist/inputs/internal/ownField.js +58 -0
  227. package/dist/inputs/internal/predicates.d.ts +9 -0
  228. package/dist/inputs/internal/predicates.js +11 -0
  229. package/dist/inputs/internal/useComboboxPopover.d.ts +46 -0
  230. package/dist/inputs/internal/useComboboxPopover.js +92 -0
  231. package/dist/json/JsonViewer.d.ts +62 -0
  232. package/dist/json/JsonViewer.js +483 -0
  233. package/dist/layout/Box.d.ts +87 -0
  234. package/dist/layout/Box.js +109 -0
  235. package/dist/layout/Divider.d.ts +25 -0
  236. package/dist/layout/Divider.js +70 -0
  237. package/dist/layout/Flex.d.ts +139 -0
  238. package/dist/layout/Flex.js +165 -0
  239. package/dist/layout/FlexItem.d.ts +72 -0
  240. package/dist/layout/FlexItem.js +84 -0
  241. package/dist/layout/Grid.d.ts +140 -0
  242. package/dist/layout/Grid.js +178 -0
  243. package/dist/layout/Portal.d.ts +29 -0
  244. package/dist/layout/Portal.js +27 -0
  245. package/dist/layout/ResizablePanels.d.ts +88 -0
  246. package/dist/layout/ResizablePanels.js +198 -0
  247. package/dist/layout/ResizeHandle.d.ts +48 -0
  248. package/dist/layout/ResizeHandle.js +143 -0
  249. package/dist/layout/ScrollArea.d.ts +30 -0
  250. package/dist/layout/ScrollArea.js +138 -0
  251. package/dist/links/Link.d.ts +101 -1
  252. package/dist/links/Link.js +166 -4
  253. package/dist/lists/BulletedList.d.ts +25 -7
  254. package/dist/lists/BulletedList.js +72 -27
  255. package/dist/lists/DescriptionList.d.ts +91 -0
  256. package/dist/lists/DescriptionList.js +147 -0
  257. package/dist/menu/ContextMenu.d.ts +64 -0
  258. package/dist/menu/ContextMenu.js +34 -0
  259. package/dist/menu/Menu.d.ts +280 -0
  260. package/dist/menu/Menu.js +1003 -0
  261. package/dist/modal/ConfirmDialog.d.ts +55 -0
  262. package/dist/modal/ConfirmDialog.js +151 -0
  263. package/dist/modal/Modal.d.ts +64 -14
  264. package/dist/modal/Modal.js +189 -48
  265. package/dist/navigation/Breadcrumbs.d.ts +65 -0
  266. package/dist/navigation/Breadcrumbs.js +243 -0
  267. package/dist/navigation/CommandPalette.d.ts +83 -0
  268. package/dist/navigation/CommandPalette.js +509 -0
  269. package/dist/navigation/Pagination.d.ts +87 -0
  270. package/dist/navigation/Pagination.js +300 -0
  271. package/dist/navigation/SidebarNav.d.ts +107 -0
  272. package/dist/navigation/SidebarNav.js +341 -0
  273. package/dist/navigation/Stepper.d.ts +52 -0
  274. package/dist/navigation/Stepper.js +207 -0
  275. package/dist/navigation/Tabs.d.ts +113 -0
  276. package/dist/navigation/Tabs.js +543 -0
  277. package/dist/navigation/Topbar.d.ts +20 -0
  278. package/dist/navigation/Topbar.js +62 -0
  279. package/dist/overlay/OverlayProvider.d.ts +28 -32
  280. package/dist/overlay/OverlayProvider.js +42 -93
  281. package/dist/overlay/useOverlay.d.ts +88 -12
  282. package/dist/overlay/useOverlay.js +220 -43
  283. package/dist/overlays/Popover.d.ts +114 -0
  284. package/dist/overlays/Popover.js +389 -0
  285. package/dist/shapes/Circle.d.ts +84 -8
  286. package/dist/shapes/Circle.js +122 -20
  287. package/dist/shapes/Square.d.ts +84 -8
  288. package/dist/shapes/Square.js +123 -20
  289. package/dist/styles/mixins.d.ts +35 -0
  290. package/dist/styles/mixins.js +60 -0
  291. package/dist/styles.css +1 -202
  292. package/dist/table/InfiniteSpreadsheet.d.ts +140 -10
  293. package/dist/table/InfiniteSpreadsheet.js +762 -225
  294. package/dist/table/InfiniteTable.d.ts +116 -14
  295. package/dist/table/InfiniteTable.js +287 -429
  296. package/dist/table/SpreadsheetCellEditor.d.ts +54 -6
  297. package/dist/table/SpreadsheetCellEditor.js +163 -84
  298. package/dist/table/TableCore.d.ts +252 -0
  299. package/dist/table/TableCore.js +1077 -0
  300. package/dist/table/VirtualizedInfiniteTable.d.ts +104 -14
  301. package/dist/table/VirtualizedInfiniteTable.js +280 -219
  302. package/dist/table/types.d.ts +66 -244
  303. package/dist/table/types.js +0 -51
  304. package/dist/table/useInfiniteScrollSentinel.d.ts +25 -21
  305. package/dist/table/useInfiniteScrollSentinel.js +38 -30
  306. package/dist/table/useSpreadsheetCellNavigation.d.ts +44 -0
  307. package/dist/table/useSpreadsheetCellNavigation.js +141 -0
  308. package/dist/table/useTableColumnLayout.d.ts +90 -25
  309. package/dist/table/useTableColumnLayout.js +255 -50
  310. package/dist/table/useTableKeyboardNavigation.d.ts +32 -21
  311. package/dist/table/useTableKeyboardNavigation.js +95 -71
  312. package/dist/table/useTableRowSelection.d.ts +24 -25
  313. package/dist/table/useTableRowSelection.js +57 -84
  314. package/dist/table/useTableVirtualizer.d.ts +20 -0
  315. package/dist/table/useTableVirtualizer.js +48 -0
  316. package/dist/text/Bold.d.ts +5 -6
  317. package/dist/text/Bold.js +16 -15
  318. package/dist/text/Code.d.ts +5 -6
  319. package/dist/text/Code.js +16 -25
  320. package/dist/text/CodeBlock.d.ts +77 -0
  321. package/dist/text/CodeBlock.js +373 -0
  322. package/dist/text/EditableText.d.ts +55 -15
  323. package/dist/text/EditableText.js +153 -135
  324. package/dist/text/Ellipsis.d.ts +34 -8
  325. package/dist/text/Ellipsis.js +55 -23
  326. package/dist/text/Kbd.d.ts +72 -0
  327. package/dist/text/Kbd.js +284 -0
  328. package/dist/text/MarkdownText.d.ts +27 -10
  329. package/dist/text/MarkdownText.js +317 -300
  330. package/dist/text/RequiredMarker.d.ts +17 -5
  331. package/dist/text/RequiredMarker.js +34 -36
  332. package/dist/text/Selectable.d.ts +5 -6
  333. package/dist/text/Selectable.js +16 -13
  334. package/dist/text/Span.d.ts +82 -0
  335. package/dist/text/Span.js +115 -0
  336. package/dist/text/Text.d.ts +128 -41
  337. package/dist/text/Text.js +209 -76
  338. package/dist/theme/GalaxyProvider.d.ts +75 -0
  339. package/dist/theme/GalaxyProvider.js +223 -0
  340. package/dist/theme/ThemeSwitcher.d.ts +52 -0
  341. package/dist/theme/ThemeSwitcher.js +94 -0
  342. package/dist/theme/enums.d.ts +118 -0
  343. package/dist/theme/enums.js +144 -0
  344. package/dist/theme/tokens/dark.d.ts +2 -0
  345. package/dist/theme/tokens/dark.js +275 -0
  346. package/dist/theme/tokens/generate.d.ts +15 -0
  347. package/dist/theme/tokens/generate.js +47 -0
  348. package/dist/theme/tokens/light.d.ts +2 -0
  349. package/dist/theme/tokens/light.js +274 -0
  350. package/dist/theme/tokens/palette.d.ts +14 -0
  351. package/dist/theme/tokens/palette.js +153 -0
  352. package/dist/theme/tokens/scales.d.ts +26 -0
  353. package/dist/theme/tokens/scales.js +154 -0
  354. package/dist/theme/tokens/t.d.ts +3 -0
  355. package/dist/theme/tokens/t.js +25 -0
  356. package/dist/theme/tokens/types.d.ts +189 -0
  357. package/dist/theme/tokens/types.js +0 -0
  358. package/dist/theme/useGalaxyTheme.d.ts +46 -0
  359. package/dist/theme/useGalaxyTheme.js +36 -0
  360. package/dist/theme/useInverseScope.d.ts +18 -0
  361. package/dist/theme/useInverseScope.js +33 -0
  362. package/dist/three/GalaxyLogomark3D.d.ts +46 -0
  363. package/dist/three/GalaxyLogomark3D.js +134 -0
  364. package/dist/three/assets/galaxy-logomark.js +4 -0
  365. package/dist/three/galaxyLogomark3DScene.d.ts +27 -0
  366. package/dist/three/galaxyLogomark3DScene.js +165 -0
  367. package/dist/timeline/Timeline.d.ts +99 -0
  368. package/dist/timeline/Timeline.js +269 -0
  369. package/dist/toast/Toast.d.ts +43 -19
  370. package/dist/toast/Toast.js +130 -89
  371. package/dist/toast/ToastProvider.d.ts +23 -23
  372. package/dist/toast/ToastProvider.js +298 -101
  373. package/dist/toast/ToastViewport.d.ts +12 -0
  374. package/dist/toast/ToastViewport.js +210 -0
  375. package/dist/toast/useToast.d.ts +139 -5
  376. package/dist/toast/useToast.js +15 -13
  377. package/dist/tokens.css +654 -0
  378. package/dist/tooltip/Tooltip.d.ts +64 -44
  379. package/dist/tooltip/Tooltip.js +280 -73
  380. package/dist/tooltip/internal/LazyTooltip.d.ts +7 -0
  381. package/dist/tooltip/internal/LazyTooltip.js +53 -0
  382. package/dist/transform/Fade.d.ts +33 -11
  383. package/dist/transform/Fade.js +71 -19
  384. package/dist/transform/Flasher.d.ts +25 -0
  385. package/dist/transform/Flasher.js +39 -0
  386. package/dist/transform/Rotate.d.ts +24 -12
  387. package/dist/transform/Rotate.js +36 -22
  388. package/dist/transform/ScaleFade.d.ts +36 -11
  389. package/dist/transform/ScaleFade.js +86 -28
  390. package/dist/transform/internal/CollapseMotion.d.ts +10 -0
  391. package/dist/transform/internal/CollapseMotion.js +65 -0
  392. package/dist/tree/Tree.d.ts +85 -0
  393. package/dist/tree/Tree.js +387 -0
  394. package/dist/tree/treeRow.d.ts +39 -0
  395. package/dist/tree/treeRow.js +75 -0
  396. package/dist/utils/colors.d.ts +46 -13
  397. package/dist/utils/colors.js +92 -34
  398. package/dist/utils/css.d.ts +23 -0
  399. package/dist/utils/css.js +30 -0
  400. package/dist/utils/format.d.ts +58 -0
  401. package/dist/utils/format.js +220 -0
  402. package/dist/vite/index.d.ts +16 -0
  403. package/dist/vite/index.js +52 -0
  404. package/dist/widget/Widget.d.ts +164 -48
  405. package/dist/widget/Widget.js +335 -96
  406. package/dist/widget/WidgetGroup.d.ts +36 -0
  407. package/dist/widget/WidgetGroup.js +103 -0
  408. package/package.json +851 -157
  409. package/dist/accordion/Accordion.d.ts +0 -54
  410. package/dist/accordion/Accordion.js +0 -183
  411. package/dist/assets/components/GalaxyFilamentWordmarkDark.d.ts +0 -3
  412. package/dist/assets/components/GalaxyFilamentWordmarkDark.js +0 -14
  413. package/dist/assets/components/GalaxyFilamentWordmarkLight.d.ts +0 -3
  414. package/dist/assets/components/GalaxyFilamentWordmarkLight.js +0 -14
  415. package/dist/assets/components/GalaxyLogomarkDark.d.ts +0 -3
  416. package/dist/assets/components/GalaxyLogomarkDark.js +0 -11
  417. package/dist/assets/components/GalaxyLogomarkLight.d.ts +0 -3
  418. package/dist/assets/components/GalaxyLogomarkLight.js +0 -17
  419. package/dist/assets/components/GalaxyWordmarkDark.d.ts +0 -3
  420. package/dist/assets/components/GalaxyWordmarkDark.js +0 -15
  421. package/dist/assets/components/GalaxyWordmarkLight.d.ts +0 -3
  422. package/dist/assets/components/GalaxyWordmarkLight.js +0 -28
  423. package/dist/assets/models/galaxy-animation.js +0 -136666
  424. package/dist/assets/models/galaxy-logomark.js +0 -4
  425. package/dist/avatar/AvatarShimmer.d.ts +0 -30
  426. package/dist/avatar/AvatarShimmer.js +0 -22
  427. package/dist/backgrounds/CellGridBackground.d.ts +0 -24
  428. package/dist/backgrounds/CellGridBackground.js +0 -44
  429. package/dist/backgrounds/CrossGridBackground.d.ts +0 -26
  430. package/dist/backgrounds/CrossGridBackground.js +0 -49
  431. package/dist/backgrounds/DotGridBackground.d.ts +0 -24
  432. package/dist/backgrounds/DotGridBackground.js +0 -47
  433. package/dist/badge/Badge.d.ts +0 -42
  434. package/dist/badge/Badge.js +0 -99
  435. package/dist/charts/ChartEmptyState.d.ts +0 -17
  436. package/dist/charts/ChartEmptyState.js +0 -29
  437. package/dist/charts/ProgressBar.d.ts +0 -29
  438. package/dist/charts/ProgressBar.js +0 -65
  439. package/dist/charts/chartTheme.d.ts +0 -18
  440. package/dist/charts/chartTheme.js +0 -26
  441. package/dist/containers/FlexItem.d.ts +0 -50
  442. package/dist/containers/FlexItem.js +0 -91
  443. package/dist/containers/FlexWrapper.d.ts +0 -96
  444. package/dist/containers/FlexWrapper.js +0 -143
  445. package/dist/containers/GridWrapper.d.ts +0 -79
  446. package/dist/containers/GridWrapper.js +0 -125
  447. package/dist/containers/Spacing.d.ts +0 -23
  448. package/dist/containers/Spacing.js +0 -59
  449. package/dist/containers/Wrapper.d.ts +0 -26
  450. package/dist/containers/Wrapper.js +0 -54
  451. package/dist/dividers/HorizontalDivider.d.ts +0 -7
  452. package/dist/dividers/HorizontalDivider.js +0 -39
  453. package/dist/dividers/VerticalDivider.d.ts +0 -6
  454. package/dist/dividers/VerticalDivider.js +0 -21
  455. package/dist/icons/GalaxyFilamentWordmark.d.ts +0 -11
  456. package/dist/icons/GalaxyFilamentWordmark.js +0 -25
  457. package/dist/icons/GalaxyLogomark.d.ts +0 -13
  458. package/dist/icons/GalaxyLogomark.js +0 -27
  459. package/dist/icons/GalaxyLogomark3D.d.ts +0 -56
  460. package/dist/icons/GalaxyLogomark3D.js +0 -319
  461. package/dist/icons/GalaxyLogomarkAnimation.d.ts +0 -18
  462. package/dist/icons/GalaxyLogomarkAnimation.js +0 -48
  463. package/dist/icons/GalaxyWordmark.d.ts +0 -11
  464. package/dist/icons/GalaxyWordmark.js +0 -25
  465. package/dist/inputs/MultiTextInput.d.ts +0 -32
  466. package/dist/inputs/MultiTextInput.js +0 -180
  467. package/dist/inputs/SwitcherInput.d.ts +0 -27
  468. package/dist/inputs/SwitcherInput.js +0 -64
  469. package/dist/inputs/hooks.d.ts +0 -10
  470. package/dist/inputs/hooks.js +0 -22
  471. package/dist/overlay/constants.d.ts +0 -28
  472. package/dist/overlay/constants.js +0 -37
  473. package/dist/resizable/HorizontalResizeHandle.d.ts +0 -17
  474. package/dist/resizable/HorizontalResizeHandle.js +0 -38
  475. package/dist/resizable/VerticalResizeHandle.d.ts +0 -18
  476. package/dist/resizable/VerticalResizeHandle.js +0 -39
  477. package/dist/table/SpreadsheetCell.d.ts +0 -21
  478. package/dist/table/SpreadsheetCell.js +0 -71
  479. package/dist/table/SpreadsheetHeaderCell.d.ts +0 -23
  480. package/dist/table/SpreadsheetHeaderCell.js +0 -91
  481. package/dist/table/SpreadsheetMenuItem.d.ts +0 -14
  482. package/dist/table/SpreadsheetMenuItem.js +0 -33
  483. package/dist/table/SpreadsheetPrimitives.d.ts +0 -172
  484. package/dist/table/SpreadsheetPrimitives.js +0 -105
  485. package/dist/table/SpreadsheetRow.d.ts +0 -33
  486. package/dist/table/SpreadsheetRow.js +0 -73
  487. package/dist/table/SpreadsheetRowActionCell.d.ts +0 -14
  488. package/dist/table/SpreadsheetRowActionCell.js +0 -51
  489. package/dist/table/TableExpandCell.d.ts +0 -11
  490. package/dist/table/TableExpandCell.js +0 -24
  491. package/dist/table/TableExpandedRow.d.ts +0 -16
  492. package/dist/table/TableExpandedRow.js +0 -77
  493. package/dist/table/TableHeaderCellContent.d.ts +0 -30
  494. package/dist/table/TableHeaderCellContent.js +0 -48
  495. package/dist/table/TablePrimitives.d.ts +0 -313
  496. package/dist/table/TablePrimitives.js +0 -302
  497. package/dist/table/TableSelectCell.d.ts +0 -18
  498. package/dist/table/TableSelectCell.js +0 -27
  499. package/dist/table/TableStatusRow.d.ts +0 -18
  500. package/dist/table/TableStatusRow.js +0 -50
  501. package/dist/table/useSpreadsheetEditing.d.ts +0 -13
  502. package/dist/table/useSpreadsheetEditing.js +0 -41
  503. package/dist/table/useTableColumnResize.d.ts +0 -38
  504. package/dist/table/useTableColumnResize.js +0 -155
  505. package/dist/table/useTableRowExpansion.d.ts +0 -24
  506. package/dist/table/useTableRowExpansion.js +0 -62
  507. package/dist/table/utils.d.ts +0 -50
  508. package/dist/table/utils.js +0 -78
  509. package/dist/text/HotKeys.d.ts +0 -30
  510. package/dist/text/HotKeys.js +0 -74
  511. package/dist/text/Paragraph.d.ts +0 -33
  512. package/dist/text/Paragraph.js +0 -83
  513. package/dist/text/TextShimmer.d.ts +0 -14
  514. package/dist/text/TextShimmer.js +0 -34
  515. package/dist/theme/GalaxyTheme.d.ts +0 -67
  516. package/dist/theme/GalaxyTheme.js +0 -119
  517. package/dist/theme/constants.d.ts +0 -8
  518. package/dist/theme/constants.js +0 -38
  519. package/dist/theme/index.d.ts +0 -6
  520. package/dist/theme/index.js +0 -7
  521. package/dist/theme/types.d.ts +0 -195
  522. package/dist/theme/types.js +0 -10
  523. package/dist/theme/typography.d.ts +0 -2
  524. package/dist/theme/typography.js +0 -73
  525. package/dist/theme/variants/dark.d.ts +0 -2
  526. package/dist/theme/variants/dark.js +0 -125
  527. package/dist/theme/variants/light.d.ts +0 -2
  528. package/dist/theme/variants/light.js +0 -125
  529. package/dist/toast/ToastContainer.d.ts +0 -10
  530. package/dist/toast/ToastContainer.js +0 -31
  531. package/dist/toast/ToastWrapper.d.ts +0 -6
  532. package/dist/toast/ToastWrapper.js +0 -27
  533. package/dist/transform/Flash.d.ts +0 -7
  534. package/dist/transform/Flash.js +0 -18
  535. package/dist/transform/Spin.d.ts +0 -14
  536. package/dist/transform/Spin.js +0 -25
  537. package/dist/utils/linaria.d.ts +0 -1
  538. 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,66 @@
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 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. */
13
+ selection?: ChartSelectionInput | undefined;
14
+ /** How off-category marks recede. @default ChartMarkState.MUTED */
75
15
  categoryMuteState?: ChartMarkState;
76
- /** Suppress all interaction — used while loading and when the tooltip is off. */
16
+ /** No category interaction (static plot, loading, empty). The legend stays live. */
77
17
  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
- */
18
+ /** Every mark is muted and following pauses. */
87
19
  isLoading?: boolean;
20
+ /** Cells laid out in rows of `columns` (Heatmap): Up / Down move by a row, Home / End stay in the row. */
21
+ grid?: {
22
+ columns: number;
23
+ };
88
24
  }
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;
25
+ /** @internal Which marks a mark-state query is about. */
26
+ export interface ChartMarkStateArgs {
27
+ /** Omit for marks that belong to no category (a line). */
28
+ categoryIndex?: number | undefined;
29
+ /** Omit for marks that belong to no series. */
30
+ seriesKey?: string | undefined;
94
31
  }
32
+ /** @internal What `useChartInteraction` returns. */
95
33
  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
- */
34
+ /** The engaged category: this chart's own (pointer or keyboard), else the one a sibling follows. */
100
35
  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
- */
36
+ /** True when this chart shows its tooltip for `activeIndex`. */
106
37
  showTooltip: boolean;
38
+ /** The legend key being hovered. */
107
39
  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
- */
40
+ /** Categories the selection names outright (persistent cursors). */
116
41
  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;
42
+ /** Emphasis of one mark, composed from selection, series and category. */
43
+ getMarkState: (args: ChartMarkStateArgs) => ChartMarkState;
44
+ /** Pointer entered a category's target. */
129
45
  onCategoryEnter: (categoryIndex: number) => void;
46
+ /** Pointer left the plot. */
130
47
  onCategoryLeave: () => void;
48
+ /** Pointer entered a legend entry. */
131
49
  onSeriesEnter: (seriesKey: string) => void;
50
+ /** Pointer left a legend entry. */
132
51
  onSeriesLeave: () => void;
52
+ /** Keyboard focus reached the plot: engage the last category, or the first. Returns it. */
53
+ onKeyboardFocus: () => number | null;
54
+ /** A navigation key; returns the newly engaged index, or `null` if the key does not navigate. */
55
+ onKeyboardMove: (key: string) => number | null;
56
+ /** Escape: clear the engaged category (focus stays). */
57
+ onKeyboardClear: () => void;
58
+ /** Focus left the plot. */
59
+ onKeyboardBlur: () => void;
133
60
  }
134
- export declare function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, enableGroupSync, selection, categoryMuteState, isDisabled, isLoading, }: UseChartInteractionOptions): ChartInteraction;
135
- export {};
61
+ /** @internal The next index for a navigation key, stopping at the ends (no wrap). */
62
+ export declare function getNextCategoryIndex(current: number, key: string, count: number, grid?: {
63
+ columns: number;
64
+ }): number | null;
65
+ /** @internal Shared interaction model; see the module comment. */
66
+ export declare function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, enableGroupSync, selection, categoryMuteState, isDisabled, isLoading, grid, }: UseChartInteractionOptions): ChartInteraction;
@@ -1,32 +1,58 @@
1
1
  import { ChartMarkState } from "./types.js";
2
2
  import { ChartGroupContext } from "./ChartGroupProvider.js";
3
- import { useCallback, useContext, useEffect, useId, useMemo, useState } from "react";
3
+ import { useCallback, useContext, useEffect, useId, useMemo, useRef, useState } from "react";
4
4
  //#region src/charts/useChartInteraction.ts
5
- /** Stable identity, so an absent selection never re-memoizes anything. */
5
+ /**
6
+ * @internal Hover, keyboard, selection and group sync for every chart.
7
+ *
8
+ * Two local axes:
9
+ * - **Category**: an index along the plot, engaged by pointer hover or by the keyboard (the plot
10
+ * box is one tab stop; arrows move, Home / End jump, Escape clears). Engaging previews it: the
11
+ * tooltip opens and the rest recedes.
12
+ * - **Series**: a legend key, engaged by hovering a legend entry. Isolates that series.
13
+ *
14
+ * Plus a read-only source: inside a `ChartGroupProvider`, a chart that passes `categoryKeys`
15
+ * follows the category a sibling engages (matched by raw label). Following emphasizes; it opens
16
+ * the tooltip only when the provider shares tooltips. Series hover never syncs.
17
+ *
18
+ * And **selection**, supplied by the caller and never written here: it outranks hover. Clicks do
19
+ * not pin anything; they only report (the 1.x rationale).
20
+ */
6
21
  var NO_SELECTION = [];
7
22
  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);
23
+ /** @internal The next index for a navigation key, stopping at the ends (no wrap). */
24
+ function getNextCategoryIndex(current, key, count, grid) {
25
+ if (count <= 0) return null;
26
+ const columns = grid ? Math.max(1, grid.columns) : count;
27
+ const rowStart = grid ? current - current % columns : 0;
28
+ const rowEnd = grid ? Math.min(count - 1, rowStart + columns - 1) : count - 1;
29
+ switch (key) {
30
+ case "ArrowRight": return Math.min(current + 1, rowEnd);
31
+ case "ArrowLeft": return Math.max(current - 1, rowStart);
32
+ case "Home": return rowStart;
33
+ case "End": return rowEnd;
34
+ case "ArrowDown": return grid && current + columns < count ? current + columns : grid ? current : null;
35
+ case "ArrowUp": return grid && current - columns >= 0 ? current - columns : grid ? current : null;
36
+ default: return null;
37
+ }
38
+ }
39
+ /** @internal Shared interaction model; see the module comment. */
40
+ function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, enableGroupSync = true, selection, categoryMuteState = ChartMarkState.MUTED, isDisabled = false, isLoading = false, grid }) {
41
+ const [pointerIndex, setPointerIndex] = useState(null);
42
+ const [keyboardIndex, setKeyboardIndex] = useState(null);
10
43
  const [hoveredSeriesKey, setHoveredSeriesKey] = useState(null);
44
+ /** The last engaged category, where keyboard focus resumes. */
45
+ const lastIndexRef = useRef(null);
11
46
  const sync = useContext(ChartGroupContext);
12
47
  const syncId = useId();
13
48
  const canSync = sync !== null && categoryKeys !== void 0 && enableGroupSync;
14
49
  const setActive = sync?.setActive;
15
50
  const clearActive = sync?.clearActive;
16
- const safeHovered = hoveredIndex !== null && hoveredIndex < categoryCount ? hoveredIndex : null;
51
+ const inRange = (index) => index !== null && index < categoryCount && !isDisabled ? index : null;
52
+ const localIndex = inRange(pointerIndex) ?? inRange(keyboardIndex);
53
+ if (localIndex !== null) lastIndexRef.current = localIndex;
17
54
  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;
55
+ const localKey = canSync && localIndex !== null ? categoryKeys[localIndex] ?? null : null;
30
56
  useEffect(() => {
31
57
  if (!setActive || !clearActive) return;
32
58
  if (localKey !== null) setActive({
@@ -41,16 +67,8 @@ function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, enableGr
41
67
  localKey
42
68
  ]);
43
69
  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
70
  const followedIndex = useMemo(() => {
53
- if (!canSync || isLoading) return null;
71
+ if (!canSync || isLoading || isDisabled) return null;
54
72
  const entry = sync.activeEntry;
55
73
  if (entry === null || entry.sourceId === syncId) return null;
56
74
  const index = categoryKeys.indexOf(entry.categoryKey);
@@ -58,43 +76,53 @@ function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, enableGr
58
76
  }, [
59
77
  canSync,
60
78
  isLoading,
79
+ isDisabled,
61
80
  sync?.activeEntry,
62
81
  syncId,
63
82
  categoryKeys
64
83
  ]);
65
- const effectiveIndex = safeHovered ?? followedIndex;
66
- const showTooltip = safeHovered !== null || followedIndex !== null && (sync?.sharedTooltip ?? false);
84
+ const activeIndex = localIndex ?? followedIndex;
85
+ const showTooltip = localIndex !== null || followedIndex !== null && (sync?.shouldShareTooltip ?? false);
67
86
  const onCategoryEnter = useCallback((categoryIndex) => {
68
87
  if (isDisabled) return;
69
- setHoveredIndex(categoryIndex);
70
- }, [isDisabled]);
71
- const onCategoryLeave = useCallback(() => {
72
- if (isDisabled) return;
73
- setHoveredIndex(null);
88
+ setPointerIndex(categoryIndex);
74
89
  }, [isDisabled]);
75
- const onSeriesEnter = useCallback((seriesKey) => {
76
- setHoveredSeriesKey(seriesKey);
77
- }, []);
78
- const onSeriesLeave = useCallback(() => {
79
- setHoveredSeriesKey(null);
90
+ const onCategoryLeave = useCallback(() => setPointerIndex(null), []);
91
+ const onSeriesEnter = useCallback((seriesKey) => setHoveredSeriesKey(seriesKey), []);
92
+ const onSeriesLeave = useCallback(() => setHoveredSeriesKey(null), []);
93
+ const onKeyboardFocus = useCallback(() => {
94
+ if (isDisabled || categoryCount === 0) return null;
95
+ const last = lastIndexRef.current;
96
+ const index = last !== null && last < categoryCount ? last : 0;
97
+ setKeyboardIndex(index);
98
+ return index;
99
+ }, [isDisabled, categoryCount]);
100
+ const onKeyboardMove = useCallback((key) => {
101
+ if (isDisabled || categoryCount === 0) return null;
102
+ const current = localIndex ?? lastIndexRef.current;
103
+ const next = current === null || current >= categoryCount ? getNextCategoryIndex(0, key, categoryCount, grid) === null ? null : 0 : getNextCategoryIndex(current, key, categoryCount, grid);
104
+ if (next === null) return null;
105
+ setPointerIndex(null);
106
+ setKeyboardIndex(next);
107
+ return next;
108
+ }, [
109
+ isDisabled,
110
+ categoryCount,
111
+ localIndex,
112
+ grid
113
+ ]);
114
+ const onKeyboardClear = useCallback(() => {
115
+ setPointerIndex(null);
116
+ setKeyboardIndex(null);
80
117
  }, []);
118
+ const onKeyboardBlur = useCallback(() => setKeyboardIndex(null), []);
81
119
  const selectionList = useMemo(() => {
82
120
  if (selection === void 0 || selection === null) return NO_SELECTION;
83
121
  if (!Array.isArray(selection)) return [selection];
84
122
  return selection.length === 0 ? NO_SELECTION : selection;
85
123
  }, [selection]);
86
124
  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
- */
125
+ /** A descriptor is a conjunction of the fields it carries; a field the mark lacks never excludes it. */
98
126
  const matchesSelection = useCallback(({ categoryIndex, seriesKey }) => {
99
127
  if (!hasSelection) return true;
100
128
  return selectionList.some((descriptor) => {
@@ -107,23 +135,13 @@ function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, enableGr
107
135
  selectionList,
108
136
  categoryKeys
109
137
  ]);
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
138
  const selectedCategoryIndices = useMemo(() => {
121
139
  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;
140
+ const keys = new Set(selectionList.map((descriptor) => descriptor.categoryKey).filter((key) => key !== void 0));
141
+ if (keys.size === 0) return NO_SELECTED_INDICES;
124
142
  const indices = /* @__PURE__ */ new Set();
125
143
  categoryKeys.forEach((key, index) => {
126
- if (selectedKeys.has(key)) indices.add(index);
144
+ if (keys.has(key)) indices.add(index);
127
145
  });
128
146
  return indices;
129
147
  }, [
@@ -137,19 +155,17 @@ function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, enableGr
137
155
  categoryIndex,
138
156
  seriesKey
139
157
  })) return ChartMarkState.MUTED;
140
- const categoryMuted = categoryIndex !== void 0 && effectiveIndex !== null && categoryIndex !== effectiveIndex;
141
158
  if (seriesKey !== void 0 && safeHoveredSeries !== null && seriesKey !== safeHoveredSeries) return ChartMarkState.MUTED;
142
- if (categoryMuted) return categoryMuteState;
143
- return ChartMarkState.ACTIVE;
159
+ return categoryIndex !== void 0 && activeIndex !== null && categoryIndex !== activeIndex ? categoryMuteState : ChartMarkState.ACTIVE;
144
160
  }, [
145
161
  isLoading,
146
162
  matchesSelection,
147
- effectiveIndex,
148
163
  safeHoveredSeries,
164
+ activeIndex,
149
165
  categoryMuteState
150
166
  ]);
151
167
  return useMemo(() => ({
152
- activeIndex: effectiveIndex,
168
+ activeIndex,
153
169
  showTooltip,
154
170
  hoveredSeriesKey: safeHoveredSeries,
155
171
  selectedCategoryIndices,
@@ -157,9 +173,13 @@ function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, enableGr
157
173
  onCategoryEnter,
158
174
  onCategoryLeave,
159
175
  onSeriesEnter,
160
- onSeriesLeave
176
+ onSeriesLeave,
177
+ onKeyboardFocus,
178
+ onKeyboardMove,
179
+ onKeyboardClear,
180
+ onKeyboardBlur
161
181
  }), [
162
- effectiveIndex,
182
+ activeIndex,
163
183
  showTooltip,
164
184
  safeHoveredSeries,
165
185
  selectedCategoryIndices,
@@ -167,8 +187,12 @@ function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, enableGr
167
187
  onCategoryEnter,
168
188
  onCategoryLeave,
169
189
  onSeriesEnter,
170
- onSeriesLeave
190
+ onSeriesLeave,
191
+ onKeyboardFocus,
192
+ onKeyboardMove,
193
+ onKeyboardClear,
194
+ onKeyboardBlur
171
195
  ]);
172
196
  }
173
197
  //#endregion
174
- export { useChartInteraction };
198
+ 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 {};
@@ -1,13 +1,22 @@
1
- import { useElementClientSize } from "../hooks/useElementClientSize.js";
2
- import "./constants.js";
1
+ import { CHART_TOOLTIP_OFFSET } from "./constants.js";
3
2
  import { clamp } from "./chartScales.js";
3
+ import { useElementClientSize } from "../hooks/useElementClientSize.js";
4
4
  import { useMemo, useRef } from "react";
5
5
  //#region src/charts/useChartTooltipPosition.ts
6
+ /**
7
+ * @internal Chart tooltip placement with edge collision handling (1.x logic): beside the anchor,
8
+ * flipped away from it, clamped inside the plot box. Computed in JS because clamping needs the
9
+ * tooltip's own measured size against the box's.
10
+ */
11
+ /** @internal Vertical placement of the tooltip relative to its anchor. */
6
12
  var ChartTooltipVerticalAlign = /* @__PURE__ */ function(ChartTooltipVerticalAlign) {
13
+ /** The anchor marks the top of something (the highest point in a column). */
7
14
  ChartTooltipVerticalAlign["ABOVE"] = "ABOVE";
15
+ /** The anchor marks a position (a point on an arc). */
8
16
  ChartTooltipVerticalAlign["CENTERED"] = "CENTERED";
9
17
  return ChartTooltipVerticalAlign;
10
18
  }({});
19
+ /** @internal Positions the chart tooltip. */
11
20
  function useChartTooltipPosition({ anchorX, anchorY, containerWidth, containerHeight, anchorHalfWidth = 0, placeAwayFromX, verticalAlign = "ABOVE" }) {
12
21
  const tooltipRef = useRef(null);
13
22
  const { width: tooltipWidth, height: tooltipHeight } = useElementClientSize(tooltipRef);
@@ -15,12 +24,12 @@ function useChartTooltipPosition({ anchorX, anchorY, containerWidth, containerHe
15
24
  const isMeasured = tooltipWidth !== void 0 && tooltipHeight !== void 0;
16
25
  const w = tooltipWidth ?? 0;
17
26
  const h = tooltipHeight ?? 0;
18
- const rawX = (placeAwayFromX !== void 0 ? anchorX < placeAwayFromX : anchorX > containerWidth / 2) ? anchorX - anchorHalfWidth - 10 - w : anchorX + anchorHalfWidth + 10;
27
+ const rawX = (placeAwayFromX !== void 0 ? anchorX < placeAwayFromX : anchorX > containerWidth / 2) ? anchorX - anchorHalfWidth - CHART_TOOLTIP_OFFSET - w : anchorX + anchorHalfWidth + CHART_TOOLTIP_OFFSET;
19
28
  const rawY = verticalAlign === "CENTERED" ? anchorY - h / 2 : Math.min(anchorY, containerHeight / 2);
20
29
  return {
21
30
  tooltipRef,
22
- x: clamp(rawX, 0, Math.max(0, containerWidth - w)),
23
- y: clamp(rawY, 0, Math.max(0, containerHeight - h)),
31
+ x: Math.round(clamp(rawX, 0, Math.max(0, containerWidth - w))),
32
+ y: Math.round(clamp(rawY, 0, Math.max(0, containerHeight - h))),
24
33
  isMeasured
25
34
  };
26
35
  }, [
@@ -1,37 +1,15 @@
1
- import type { ChartPalette, ChartSeriesStyles } from "./types";
2
- /**
3
- * Palette assignment for a chart's series, shared by all three charts.
4
- *
5
- * Every chart resolved colour the same way — look the key up in the `series`
6
- * record, take its slot, fall back to the palette — but each spelled it
7
- * differently and each rebuilt the key list itself. Doing it once here is what
8
- * makes "adding a series never recolours the existing ones" a property of the
9
- * design rather than of three separate call sites remembering to use
10
- * `indexOf` instead of the loop counter.
11
- */
1
+ import { type ChartSeriesColor } from "./chartPalette.js";
2
+ import { ChartPalette, type ChartSeriesStyles } from "./types.js";
3
+ /** @internal What `useSeriesColorResolver` returns. */
12
4
  export interface SeriesColorResolver<TKey extends string> {
13
- /**
14
- * Series keys in `series` record order.
15
- *
16
- * Insertion order is what makes a key's palette slot stable regardless of
17
- * which data happens to contain it, so this is never sorted.
18
- */
5
+ /** Series keys in `series` record order (never sorted: the order is what keeps slots stable). */
19
6
  keys: TKey[];
20
- /** Colour for a series. The record's own `color` wins over the slot. */
21
- resolve: (key: TKey, explicit?: ChartPalette) => string;
22
- /**
23
- * Colour by palette position, for marks that are not series.
24
- *
25
- * A stacked bar's segments are a second dimension with no record of their
26
- * own, so they take the ramp by position rather than by key.
27
- */
28
- resolveByIndex: (index: number, explicit?: ChartPalette) => string;
29
- /**
30
- * Neutral, for a mark that names no series at all.
31
- *
32
- * The pie's folded bucket is not one of the slices, so borrowing a hue would
33
- * imply it is.
34
- */
35
- neutral: string;
7
+ /** Color of a series: its `hex`, its `color` slot, or its position in the automatic order. */
8
+ resolve: (key: TKey) => ChartSeriesColor;
9
+ /** Color by position, for marks that are not series (a stack's components). */
10
+ resolveByIndex: (index: number, explicit?: ChartPalette) => ChartSeriesColor;
11
+ /** Neutral, for a mark that names no series. */
12
+ neutral: ChartSeriesColor;
36
13
  }
14
+ /** @internal Resolves series colors from the `series` record. */
37
15
  export declare function useSeriesColorResolver<TKey extends string>(series: ChartSeriesStyles<TKey>): SeriesColorResolver<TKey>;