@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,126 +1,178 @@
1
- import { buildValueScale } from "./chartScales";
2
- import { BarChartNormalization, BarCorners } from "./types";
3
- import type { BarChartGroupDatum, ChartPalette } from "./types";
4
1
  /**
5
- * Rectangle with one pair of corners rounded.
2
+ * @internal Bar chart geometry (BarChart; `layoutBars` is reused by Sparkline). Flattens the
3
+ * group → bar → component hierarchy into a flat array of rectangles plus one hit band per group,
4
+ * so the component body is a `.map()` with no nested loops or running accumulators.
6
5
  *
7
- * The radius is clamped to half the height as well as half the width, so a very
8
- * short bar renders as a symmetric cap instead of a lopsided half-pill.
6
+ * Pure: no React, no theme access. Colors arrive through a resolver callback so this module never
7
+ * has to know how the palette maps to tokens. Values equal to a scale step come from `SPACE` /
8
+ * `RADIUS` (through `constants.ts`); widths, ratios and thresholds are geometry, not spacing.
9
9
  */
10
- export declare function roundedRectPath(x: number, y: number, width: number, height: number, radius: number, corners: BarCorners): string;
10
+ import type { Hex } from "../theme/tokens/types.js";
11
+ import type { ChartSeriesColor } from "./chartPalette.js";
12
+ import type { ChartPalette } from "./types.js";
13
+ /** @internal Ceiling on one bar's width: past it the width stops carrying information (1.x). */
14
+ export declare const MAX_BAR_WIDTH = 44;
15
+ /** @internal Which pair of a rectangle's corners carries the radius. */
16
+ export declare enum BarCorners {
17
+ /** Cap for a bar growing up from the baseline. */
18
+ TOP = "TOP",
19
+ /** Cap for a bar growing down from the baseline. */
20
+ BOTTOM = "BOTTOM",
21
+ /** Interior stack segment: square on both ends. */
22
+ NONE = "NONE"
23
+ }
24
+ /** @internal How bar values are scaled before drawing (BarChart's `BarChartNormalization`, structurally). */
25
+ export type BarGeometryNormalization = "NONE" | "PERCENT";
26
+ /** @internal One stacked segment (BarChart's `BarChartComponentDatum`, structurally). */
27
+ export interface BarGeometryComponent<TComponentKey extends string> {
28
+ /** Segment key. */
29
+ key: TComponentKey;
30
+ /** Segment label. */
31
+ label: string;
32
+ /** Segment value. */
33
+ value: number;
34
+ /** Palette slot override. */
35
+ color?: ChartPalette | undefined;
36
+ /** Raw color override. */
37
+ hex?: Hex | undefined;
38
+ }
39
+ /** @internal One bar (BarChart's `BarChartBarDatum`, structurally). */
40
+ export interface BarGeometryBar<TMetric extends string, TComponentKey extends string> {
41
+ /** Series key. */
42
+ metric: TMetric;
43
+ /** Segments, stacked in array order outward from the baseline. */
44
+ components: BarGeometryComponent<TComponentKey>[];
45
+ }
46
+ /** @internal One category (BarChart's `BarChartGroupDatum`, structurally). */
47
+ export interface BarGeometryGroup<TMetric extends string, TComponentKey extends string> {
48
+ /** Raw category label. */
49
+ label: string;
50
+ /** Bars, left to right. */
51
+ bars: BarGeometryBar<TMetric, TComponentKey>[];
52
+ }
53
+ /** @internal Whole-pixel spacing of one category: every bar the same width, every gap the same. */
54
+ export interface BarSlotLayout {
55
+ /** Px between neighbouring bars in the group. */
56
+ barGap: number;
57
+ /** Px width of each bar (≥ 1). */
58
+ barWidth: number;
59
+ /** Px from the band's left edge to the first bar (centers the group in its band). */
60
+ offset: number;
61
+ }
11
62
  /**
12
- * Signed value domain across every group.
13
- *
14
- * Percent-normalized charts always span 0–1, so the axis is stable no matter
15
- * what the underlying totals are.
63
+ * @internal Lays `barCount` bars into a category band `step` px wide. Both gaps are proportional,
64
+ * so a narrow chart keeps its bars instead of its air: the category gap is `CATEGORY_GAP_RATIO` of
65
+ * the band, the in-group gap `BAR_GAP_RATIO` of a bar slot, each rounded and clamped to its floor
66
+ * and ceiling. Bar widths and gaps are whole pixels: bars round to the nearest pixel (unless that
67
+ * would push the category gap under its floor) and the remainder joins the category gap. When even the floors do not fit, the gaps give way before a bar drops below 1px.
16
68
  */
17
- export declare function getBarValueDomain<TMetric extends string, TComponentKey extends string>(groups: BarChartGroupDatum<TMetric, TComponentKey>[], normalization: BarChartNormalization): [number, number];
69
+ export declare function layoutBarSlot(step: number, barCount: number): BarSlotLayout;
18
70
  /**
19
- * A single rendered rectangle.
20
- *
21
- * The geometry layer flattens the group/bar/component hierarchy into an array
22
- * of these, so rendering is a plain `.map()` with no nested loops or
23
- * accumulators in the component body.
71
+ * @internal `count` bars laid across `width` with `gap` between them, each 80% of its slot (capped
72
+ * at `MAX_BAR_WIDTH`) and centered in it: Sparkline's bar mark, in its stretched `0 0 100 100`
73
+ * viewBox, where pixels are unknown (so no whole-pixel snapping).
74
+ */
75
+ export declare function layoutBars(count: number, width: number, gap: number): {
76
+ x: number;
77
+ width: number;
78
+ }[];
79
+ /**
80
+ * @internal A rectangle with one pair of corners rounded. The radius is clamped to half the height
81
+ * as well as half the width, so a very short bar renders as a symmetric cap.
24
82
  */
25
- export interface BarChartRect<TMetric extends string, TComponentKey extends string = string> {
26
- /**
27
- * React key: `${groupIndex}:${barIndex}:${componentKey}`.
28
- *
29
- * Deliberately index-based rather than label-based — group labels are free to
30
- * repeat, and duplicated keys would silently drop rectangles.
31
- */
83
+ export declare function roundedRectPath(x: number, y: number, width: number, height: number, radius: number, corners: BarCorners): string;
84
+ /** @internal Signed extent of every bar's stacked total; `[0, 1]` when percent-normalized. */
85
+ export declare function getBarValueDomain(groups: BarGeometryGroup<string, string>[], normalization: BarGeometryNormalization): [number, number];
86
+ /** @internal `true` when any bar holds more than one component (the color and legend grammar). */
87
+ export declare function isBarChartStacked(groups: BarGeometryGroup<string, string>[]): boolean;
88
+ /** @internal One rendered rectangle. */
89
+ export interface BarChartRect<TMetric extends string, TComponentKey extends string> {
90
+ /** React key: `${groupIndex}:${barIndex}:${componentKey}` (labels may repeat; indices do not). */
32
91
  id: string;
92
+ /** Category index. */
33
93
  groupIndex: number;
94
+ /** Bar index within the group. */
95
+ barIndex: number;
96
+ /** The bar's metric. */
34
97
  metric: TMetric;
98
+ /** The segment's key. */
35
99
  componentKey: TComponentKey;
36
- /** The component's label, carried through for the tooltip. */
100
+ /** The segment's label. */
37
101
  label: string;
38
102
  /** The raw value, before any normalization. */
39
103
  value: number;
104
+ /** Left edge, plot coordinates. */
40
105
  x: number;
106
+ /** Top edge, plot coordinates. */
41
107
  y: number;
108
+ /** Width. */
42
109
  width: number;
110
+ /** Height. */
43
111
  height: number;
44
- /** Resolved from the theme — never a raw hex from consumer data. */
45
- color: string;
46
- /** Interior stack segments get {@link BarCorners.NONE}. */
112
+ /** Resolved color. */
113
+ color: ChartSeriesColor;
114
+ /** Which corners are rounded (interior stack segments: none). */
47
115
  corners: BarCorners;
48
- /** Corner radius in px, reduced for narrow bars so the curve can't dominate. */
116
+ /** Corner radius: smaller for narrow bars. */
49
117
  radius: number;
50
118
  }
51
- /**
52
- * A category's invisible hit target and tooltip anchor.
53
- *
54
- * Hit testing happens per group rather than per rectangle: a two-pixel bar is
55
- * then exactly as hoverable as a two-hundred-pixel one, and moving the pointer
56
- * between segments inside one group fires nothing, so the tooltip stays put
57
- * instead of jumping between segment tops.
58
- */
119
+ /** @internal A category's hit band and tooltip anchor; bands tile the plot edge to edge. */
59
120
  export interface BarChartGroupBand {
121
+ /** Category index. */
60
122
  groupIndex: number;
123
+ /** Raw label. */
61
124
  label: string;
62
- /** Tiles edge to edge with its neighbours, so there are no dead gutters. */
125
+ /** Left edge. */
63
126
  x: number;
127
+ /** Top edge (0). */
64
128
  y: number;
129
+ /** Band width: the category step, snapped to whole pixels. */
65
130
  width: number;
131
+ /** Band height (the plot height). */
66
132
  height: number;
67
- /** Group centre, at the top of its tallest bar. Stable while hovering. */
133
+ /** Group center. */
68
134
  anchorX: number;
135
+ /** Top of the group's tallest bar. */
69
136
  anchorY: number;
70
137
  }
71
- export interface BarChartGeometry<TMetric extends string, TComponentKey extends string = string> {
138
+ /** @internal The finished geometry. */
139
+ export interface BarChartGeometry<TMetric extends string, TComponentKey extends string> {
72
140
  /** Every rendered rectangle, in draw order. */
73
141
  rects: BarChartRect<TMetric, TComponentKey>[];
74
- /** One hit target per group, tiling the plot with no gaps. */
142
+ /** One band per group. */
75
143
  bands: BarChartGroupBand[];
76
- /** The resolved value scale, shared with the axis. */
77
- valueScale: ReturnType<typeof buildValueScale>;
78
- }
79
- interface BuildBarChartGeometryArgs<TMetric extends string, TComponentKey extends string> {
80
- groups: BarChartGroupDatum<TMetric, TComponentKey>[];
81
- plotWidth: number;
82
- plotHeight: number;
83
- normalization: BarChartNormalization;
84
- /**
85
- * Whether the chart as a whole is stacked.
86
- *
87
- * Chart-wide, not per bar, because it decides the *colour rule* and the legend
88
- * lists one domain for the whole chart. Deriving it per bar would colour a
89
- * single-component bar by metric while the legend named components.
90
- */
91
- isStacked: boolean;
92
- /**
93
- * The final value domain, already overridden, zeroed and niced.
94
- *
95
- * Resolved by the caller rather than here, because the left gutter is sized
96
- * from the tick labels and therefore needs the domain before the plot — and
97
- * hence this builder — exists.
98
- */
99
- domain: [number, number];
100
- /**
101
- * Maps one segment to a concrete color.
102
- *
103
- * The geometry deliberately does not decide the rule — it only reports what
104
- * it knows about the segment. Whether a stack is coloured by component or a
105
- * group by metric is a presentation question, and it needs the `series`
106
- * record to answer, which this module has no business importing.
107
- */
108
- resolveColor: (args: ResolveBarColorArgs<TMetric>) => string;
109
- /**
110
- * Minimum rendered length for a stack segment, in px. `0` disables it.
111
- *
112
- * See the prop of the same name on `BarChart` for what it costs.
113
- */
114
- minSegmentLength: number;
144
+ /** Value → y, shared with the axis. */
145
+ valueScale: (value: number) => number;
146
+ /** Exact category step (band widths are this, snapped to whole pixels). */
147
+ step: number;
115
148
  }
149
+ /** @internal What the color resolver is told about a segment. */
116
150
  export interface ResolveBarColorArgs<TMetric extends string> {
151
+ /** The bar's metric. */
117
152
  metric: TMetric;
118
153
  /** Index of the component within its bar. */
119
154
  componentIndex: number;
120
- /** True when the *chart* is stacked — see the option of the same name. */
121
- isStacked: boolean;
122
- /** The component's own palette override, if it declared one. */
123
- explicit?: ChartPalette;
155
+ /** The segment's palette override. */
156
+ explicit?: ChartPalette | undefined;
157
+ /** The segment's raw color override. */
158
+ hex?: Hex | undefined;
159
+ }
160
+ /** @internal Inputs of `buildBarChartGeometry`. */
161
+ export interface BuildBarChartGeometryArgs<TMetric extends string, TComponentKey extends string> {
162
+ /** Categories. */
163
+ groups: BarGeometryGroup<TMetric, TComponentKey>[];
164
+ /** Plot width. */
165
+ plotWidth: number;
166
+ /** Plot height. */
167
+ plotHeight: number;
168
+ /** Raw or percent. */
169
+ normalization: BarGeometryNormalization;
170
+ /** The resolved value domain (overridden, zeroed, niced). */
171
+ domain: [number, number];
172
+ /** Maps one segment to its color (the chart decides the grammar). */
173
+ resolveColor: (args: ResolveBarColorArgs<TMetric>) => ChartSeriesColor;
174
+ /** Minimum rendered length of a stack segment, px; 0 disables. */
175
+ minSegmentLength: number;
124
176
  }
125
- export declare function buildBarChartGeometry<TMetric extends string, TComponentKey extends string = string>({ groups, plotWidth, plotHeight, normalization, isStacked, domain, resolveColor, minSegmentLength, }: BuildBarChartGeometryArgs<TMetric, TComponentKey>): BarChartGeometry<TMetric, TComponentKey>;
126
- export {};
177
+ /** @internal Builds a bar chart's rectangles and bands. */
178
+ export declare function buildBarChartGeometry<TMetric extends string, TComponentKey extends string>({ groups, plotWidth, plotHeight, normalization, domain, resolveColor, minSegmentLength, }: BuildBarChartGeometryArgs<TMetric, TComponentKey>): BarChartGeometry<TMetric, TComponentKey>;
@@ -1,44 +1,76 @@
1
- import { BarChartNormalization, BarCorners } from "./types.js";
2
- import { BAR_WIDTH_RATIO, MAX_GAP_SHARE } from "./constants.js";
3
- import { buildValueScale, sanitizeValue } from "./chartScales.js";
1
+ import { BAR_GAP_RATIO, BAR_RADIUS, BAR_RADIUS_NARROW, CATEGORY_GAP_RATIO, MAX_BAR_GAP, MAX_CATEGORY_GAP, MIN_BAR_LENGTH, MIN_CATEGORY_GAP, STACK_SEGMENT_GAP } from "./constants.js";
2
+ import { buildValueScale, clamp, sanitizeValue } from "./chartScales.js";
4
3
  //#region src/charts/barChartGeometry.ts
4
+ /** @internal Ceiling on one bar's width: past it the width stops carrying information (1.x). */
5
+ var MAX_BAR_WIDTH = 44;
6
+ /** Share of its slot a Sparkline bar fills; the rest is air (1.x). Sparkline only. */
7
+ var SPARKLINE_BAR_WIDTH_RATIO = .8;
8
+ /** Ceiling on a Sparkline gap, as a share of a slot, so a long series keeps its bars (1.x). */
9
+ var SPARKLINE_MAX_GAP_SHARE = .3;
10
+ /** @internal Which pair of a rectangle's corners carries the radius. */
11
+ var BarCorners = /* @__PURE__ */ function(BarCorners) {
12
+ /** Cap for a bar growing up from the baseline. */
13
+ BarCorners["TOP"] = "TOP";
14
+ /** Cap for a bar growing down from the baseline. */
15
+ BarCorners["BOTTOM"] = "BOTTOM";
16
+ /** Interior stack segment: square on both ends. */
17
+ BarCorners["NONE"] = "NONE";
18
+ return BarCorners;
19
+ }({});
5
20
  /**
6
- * Pick gap sizes from how crowded the chart is.
7
- *
8
- * Sparse charts stay roomy regardless of width; once there are enough bars to
9
- * matter, the gaps tighten as the plot narrows.
21
+ * @internal Lays `barCount` bars into a category band `step` px wide. Both gaps are proportional,
22
+ * so a narrow chart keeps its bars instead of its air: the category gap is `CATEGORY_GAP_RATIO` of
23
+ * the band, the in-group gap `BAR_GAP_RATIO` of a bar slot, each rounded and clamped to its floor
24
+ * and ceiling. Bar widths and gaps are whole pixels: bars round to the nearest pixel (unless that
25
+ * would push the category gap under its floor) and the remainder joins the category gap. When even the floors do not fit, the gaps give way before a bar drops below 1px.
10
26
  */
11
- function getBarSpacing(plotWidth, totalBars) {
12
- if (totalBars < 13 || plotWidth > 650) return {
13
- groupGap: 24,
14
- barGap: 6
15
- };
16
- if (plotWidth > 500) return {
17
- groupGap: 16,
18
- barGap: 4
19
- };
27
+ function layoutBarSlot(step, barCount) {
28
+ const count = Math.max(1, barCount);
29
+ let categoryGap = clamp(Math.round(step * CATEGORY_GAP_RATIO), MIN_CATEGORY_GAP, MAX_CATEGORY_GAP);
30
+ if (step - categoryGap < count) categoryGap = Math.max(0, Math.floor(step - count));
31
+ const available = step - categoryGap;
32
+ let barGap = count > 1 ? clamp(Math.round(available / count * BAR_GAP_RATIO), 1, MAX_BAR_GAP) : 0;
33
+ if (count > 1 && available - (count - 1) * barGap < count) barGap = Math.max(0, Math.floor((available - count) / (count - 1)));
34
+ const exact = (available - (count - 1) * barGap) / count;
35
+ const rounded = Math.round(exact);
36
+ const barWidth = clamp(step - (count * rounded + (count - 1) * barGap) >= Math.min(MIN_CATEGORY_GAP, categoryGap) ? rounded : Math.floor(exact), 1, 44);
37
+ const barsWidth = count * barWidth + (count - 1) * barGap;
20
38
  return {
21
- groupGap: 12,
22
- barGap: 3
39
+ barGap,
40
+ barWidth,
41
+ offset: (step - barsWidth) / 2
23
42
  };
24
43
  }
25
44
  /**
26
- * Rectangle with one pair of corners rounded.
27
- *
28
- * The radius is clamped to half the height as well as half the width, so a very
29
- * short bar renders as a symmetric cap instead of a lopsided half-pill.
45
+ * @internal `count` bars laid across `width` with `gap` between them, each 80% of its slot (capped
46
+ * at `MAX_BAR_WIDTH`) and centered in it: Sparkline's bar mark, in its stretched `0 0 100 100`
47
+ * viewBox, where pixels are unknown (so no whole-pixel snapping).
48
+ */
49
+ function layoutBars(count, width, gap) {
50
+ if (count <= 0 || width <= 0) return [];
51
+ const effectiveGap = Math.min(gap, width / count * SPARKLINE_MAX_GAP_SHARE);
52
+ const slot = (width - (count - 1) * effectiveGap) / count;
53
+ const barWidth = Math.max(1, Math.min(slot * SPARKLINE_BAR_WIDTH_RATIO, 44));
54
+ return Array.from({ length: count }, (_, index) => ({
55
+ x: index * (slot + effectiveGap) + (slot - barWidth) / 2,
56
+ width: barWidth
57
+ }));
58
+ }
59
+ /**
60
+ * @internal A rectangle with one pair of corners rounded. The radius is clamped to half the height
61
+ * as well as half the width, so a very short bar renders as a symmetric cap.
30
62
  */
31
63
  function roundedRectPath(x, y, width, height, radius, corners) {
32
- const r = corners === BarCorners.NONE ? 0 : Math.max(0, Math.min(radius, width / 2, height / 2));
64
+ const r = corners === "NONE" ? 0 : Math.max(0, Math.min(radius, width / 2, height / 2));
33
65
  if (r === 0) return `M${x},${y} h${width} v${height} h${-width} z`;
34
- if (corners === BarCorners.TOP) return [
66
+ if (corners === "TOP") return [
35
67
  `M${x},${y + r}`,
36
68
  `a${r},${r} 0 0 1 ${r},${-r}`,
37
69
  `h${width - 2 * r}`,
38
70
  `a${r},${r} 0 0 1 ${r},${r}`,
39
71
  `v${height - r}`,
40
72
  `h${-width}`,
41
- `z`
73
+ "z"
42
74
  ].join(" ");
43
75
  return [
44
76
  `M${x},${y}`,
@@ -47,16 +79,13 @@ function roundedRectPath(x, y, width, height, radius, corners) {
47
79
  `a${r},${r} 0 0 1 ${-r},${r}`,
48
80
  `h${-(width - 2 * r)}`,
49
81
  `a${r},${r} 0 0 1 ${-r},${-r}`,
50
- `z`
82
+ "z"
51
83
  ].join(" ");
52
84
  }
53
85
  /**
54
- * Turn one bar's components into stacked `[from, to]` intervals.
55
- *
56
- * Positive and negative values accumulate on separate cursors, which is what
57
- * lets a bar mixing both stack upward and downward from the baseline without
58
- * any special-casing downstream — and is also why percent normalization is a
59
- * one-line division rather than a second code path.
86
+ * One bar's components as stacked `[from, to]` intervals. Positive and negative values accumulate
87
+ * on separate cursors, so a bar mixing both stacks up and down from the baseline; percent
88
+ * normalization is then one division.
60
89
  */
61
90
  function stackComponents(values, normalization) {
62
91
  let positiveCursor = 0;
@@ -79,7 +108,7 @@ function stackComponents(values, normalization) {
79
108
  to
80
109
  };
81
110
  });
82
- if (normalization !== BarChartNormalization.PERCENT) return intervals;
111
+ if (normalization !== "PERCENT") return intervals;
83
112
  const magnitude = positiveCursor - negativeCursor;
84
113
  if (magnitude === 0) return intervals;
85
114
  return intervals.map((interval) => ({
@@ -88,14 +117,9 @@ function stackComponents(values, normalization) {
88
117
  to: interval.to / magnitude
89
118
  }));
90
119
  }
91
- /**
92
- * Signed value domain across every group.
93
- *
94
- * Percent-normalized charts always span 0–1, so the axis is stable no matter
95
- * what the underlying totals are.
96
- */
120
+ /** @internal Signed extent of every bar's stacked total; `[0, 1]` when percent-normalized. */
97
121
  function getBarValueDomain(groups, normalization) {
98
- if (normalization === BarChartNormalization.PERCENT) return [0, 1];
122
+ if (normalization === "PERCENT") return [0, 1];
99
123
  let min = 0;
100
124
  let max = 0;
101
125
  for (const group of groups) for (const bar of group.bars) {
@@ -106,59 +130,51 @@ function getBarValueDomain(groups, normalization) {
106
130
  if (value >= 0) positive += value;
107
131
  else negative += value;
108
132
  }
109
- if (positive > max) max = positive;
110
- if (negative < min) min = negative;
133
+ max = Math.max(max, positive);
134
+ min = Math.min(min, negative);
111
135
  }
112
136
  return [min, max];
113
137
  }
138
+ /** @internal `true` when any bar holds more than one component (the color and legend grammar). */
139
+ function isBarChartStacked(groups) {
140
+ return groups.some((group) => group.bars.some((bar) => bar.components.length > 1));
141
+ }
114
142
  /**
115
- * Grow every under-sized segment to its minimum, paying for it out of the
116
- * segments that have room to spare.
117
- *
118
- * `lengths` and `minima` are one side of one stack, in baseline-outward order.
119
- * Returns `null` when nothing needs doing, and — deliberately — also when the
120
- * bill cannot be paid: if the surplus across the whole side is smaller than the
121
- * total deficit, every segment would end up pinned at its minimum and the bar
122
- * would no longer be a picture of its data. A stack that crowded is telling the
123
- * caller to drop the minimum or fold the tail into an "Other" component, and
124
- * silently redrawing it as a ladder of equal blocks would hide that.
143
+ * Grows every under-sized segment of one stack side to its minimum, paid for by the segments with
144
+ * room to spare, in proportion to their slack. Returns `null` when nothing needs doing, and also
145
+ * when the bill cannot be paid (every segment would be pinned at the minimum and the bar would no
146
+ * longer describe its data).
125
147
  */
126
148
  function distributeMinSegmentLengths(lengths, minima) {
127
149
  const result = [...lengths];
128
150
  let deficit = 0;
129
151
  let surplus = 0;
130
152
  lengths.forEach((length, index) => {
131
- if (length < minima[index]) {
132
- deficit += minima[index] - length;
133
- result[index] = minima[index];
134
- } else surplus += length - minima[index];
153
+ const minimum = minima[index] ?? 0;
154
+ if (length < minimum) {
155
+ deficit += minimum - length;
156
+ result[index] = minimum;
157
+ } else surplus += length - minimum;
135
158
  });
136
159
  if (deficit === 0 || surplus < deficit) return null;
137
160
  const donors = result.map((length, index) => ({
138
161
  index,
139
- slack: length - minima[index]
162
+ slack: length - (minima[index] ?? 0)
140
163
  })).filter((donor) => donor.slack > 0).sort((a, b) => b.slack - a.slack);
141
164
  let remainingSlack = surplus;
142
165
  for (const donor of donors) {
143
166
  if (deficit <= 0) break;
144
167
  const share = Math.min(donor.slack, Math.ceil(donor.slack / remainingSlack * deficit));
145
- result[donor.index] -= share;
168
+ result[donor.index] = (result[donor.index] ?? 0) - share;
146
169
  remainingSlack -= donor.slack;
147
170
  deficit -= share;
148
171
  }
149
172
  return result;
150
173
  }
151
174
  /**
152
- * Snapped pixel spans for one bar's segments, with {@link minSegmentLength}
153
- * enforced.
154
- *
155
- * The enforcement re-lays the affected side of the stack *cumulatively* from the
156
- * baseline outward, rather than nudging each segment's own edges. That is the
157
- * only way to grow a sliver without breaking the invariant the rounding above
158
- * exists to protect: each segment starts exactly where the previous one ended,
159
- * so there is still one shared edge per seam and no overlap. And because the
160
- * redistribution is zero-sum, the side's total extent is unchanged — the cap
161
- * still lands on the same axis value it did before.
175
+ * Snapped pixel spans for one bar's segments with `minSegmentLength` enforced. Enforcement re-lays
176
+ * the affected side cumulatively from the baseline outward, so each segment still starts where the
177
+ * previous one ended and the side's total extent is unchanged.
162
178
  */
163
179
  function resolveSegmentExtents(intervals, valueScale, minSegmentLength) {
164
180
  const extents = intervals.map(({ from, to }) => ({
@@ -171,14 +187,19 @@ function resolveSegmentExtents(intervals, valueScale, minSegmentLength) {
171
187
  interval,
172
188
  index
173
189
  })).filter(({ interval }) => Math.sign(interval.value) === sign).map(({ index }) => index);
174
- if (indices.length === 0) return;
175
- const adjusted = distributeMinSegmentLengths(indices.map((index) => Math.abs(extents[index].fromY - extents[index].toY)), indices.map((_, position) => position === 0 ? minSegmentLength : minSegmentLength + 2));
190
+ const firstIndex = indices[0];
191
+ if (firstIndex === void 0) return;
192
+ const adjusted = distributeMinSegmentLengths(indices.map((index) => {
193
+ const extent = extents[index];
194
+ return extent ? Math.abs(extent.fromY - extent.toY) : 0;
195
+ }), indices.map((_, position) => position === 0 ? minSegmentLength : minSegmentLength + STACK_SEGMENT_GAP));
176
196
  if (!adjusted) return;
177
197
  const direction = sign > 0 ? -1 : 1;
178
- const first = extents[indices[0]];
198
+ const first = extents[firstIndex];
199
+ if (!first) return;
179
200
  let cursor = sign > 0 ? first.fromY : first.toY;
180
201
  indices.forEach((index, position) => {
181
- const next = cursor + direction * adjusted[position];
202
+ const next = cursor + direction * (adjusted[position] ?? 0);
182
203
  extents[index] = {
183
204
  fromY: cursor,
184
205
  toY: next
@@ -190,32 +211,29 @@ function resolveSegmentExtents(intervals, valueScale, minSegmentLength) {
190
211
  adjustSide(-1);
191
212
  return extents;
192
213
  }
193
- function buildBarChartGeometry({ groups, plotWidth, plotHeight, normalization, isStacked, domain, resolveColor, minSegmentLength }) {
194
- const valueScale = buildValueScale(domain, [plotHeight, 0]);
214
+ /** @internal Builds a bar chart's rectangles and bands. */
215
+ function buildBarChartGeometry({ groups, plotWidth, plotHeight, normalization, domain, resolveColor, minSegmentLength }) {
216
+ const scale = buildValueScale(domain, [plotHeight, 0]);
217
+ const valueScale = (value) => scale(value);
195
218
  const baselineY = valueScale(0);
196
219
  const rects = [];
197
220
  const bands = [];
198
221
  if (groups.length === 0 || plotWidth <= 0 || plotHeight <= 0) return {
199
222
  rects,
200
223
  bands,
201
- valueScale
224
+ valueScale,
225
+ step: 0
202
226
  };
203
- const { groupGap, barGap } = getBarSpacing(plotWidth, groups.reduce((sum, group) => sum + group.bars.length, 0));
204
227
  const step = plotWidth / groups.length;
205
- const effectiveGroupGap = Math.min(groupGap, step * MAX_GAP_SHARE);
206
- const groupWidth = Math.max(1, step - effectiveGroupGap);
207
228
  groups.forEach((group, groupIndex) => {
208
- const bandX = groupIndex * step;
209
- const groupX = bandX + (step - groupWidth) / 2;
210
- const barCount = Math.max(1, group.bars.length);
211
- const effectiveBarGap = Math.min(barGap, groupWidth / barCount * MAX_GAP_SHARE);
212
- const slotWidth = (groupWidth - (barCount - 1) * effectiveBarGap) / barCount;
213
- const barWidth = Math.max(1, Math.min(slotWidth * BAR_WIDTH_RATIO, 44));
214
- const radius = barWidth < 40 ? 2 : 4;
215
- const barsStartX = groupX + (groupWidth - (barCount * barWidth + (barCount - 1) * effectiveBarGap)) / 2;
229
+ const bandX = Math.round(groupIndex * step);
230
+ const bandWidth = Math.round((groupIndex + 1) * step) - bandX;
231
+ const { barGap, barWidth, offset } = layoutBarSlot(step, Math.max(1, group.bars.length));
232
+ const radius = barWidth < 40 ? BAR_RADIUS_NARROW : BAR_RADIUS;
233
+ const barsStartX = Math.round(groupIndex * step + offset);
216
234
  let groupTopY = baselineY;
217
235
  group.bars.forEach((bar, barIndex) => {
218
- const barX = barsStartX + barIndex * (barWidth + effectiveBarGap);
236
+ const barX = barsStartX + barIndex * (barWidth + barGap);
219
237
  const values = bar.components.map((component) => sanitizeValue(component.value));
220
238
  const intervals = stackComponents(values, normalization);
221
239
  const isStackedBar = bar.components.length > 1;
@@ -235,20 +253,22 @@ function buildBarChartGeometry({ groups, plotWidth, plotHeight, normalization, i
235
253
  }
236
254
  });
237
255
  bar.components.forEach((component, componentIndex) => {
238
- const { value } = intervals[componentIndex];
239
- if (value === 0) return;
256
+ const interval = intervals[componentIndex];
257
+ const extent = extents[componentIndex];
258
+ if (!interval || !extent || interval.value === 0) return;
259
+ const { value } = interval;
240
260
  const isNegative = value < 0;
241
261
  const isCap = componentIndex === (isNegative ? lastNegative : lastPositive);
242
- const { fromY, toY } = extents[componentIndex];
243
- const topY = Math.min(fromY, toY);
244
- const rawHeight = Math.abs(fromY - toY);
245
- const shave = componentIndex === (isNegative ? firstNegative : firstPositive) ? 0 : 2;
246
- const height = Math.max(isStackedBar ? 0 : 2, rawHeight - shave);
262
+ const topY = Math.min(extent.fromY, extent.toY);
263
+ const rawHeight = Math.abs(extent.fromY - extent.toY);
264
+ const shave = componentIndex === (isNegative ? firstNegative : firstPositive) ? 0 : STACK_SEGMENT_GAP;
265
+ const height = Math.max(isStackedBar ? 0 : MIN_BAR_LENGTH, rawHeight - shave);
247
266
  const y = isNegative ? topY + shave : topY;
248
267
  if (!isNegative && y < groupTopY) groupTopY = y;
249
268
  rects.push({
250
269
  id: `${groupIndex}:${barIndex}:${component.key}`,
251
270
  groupIndex,
271
+ barIndex,
252
272
  metric: bar.metric,
253
273
  componentKey: component.key,
254
274
  label: component.label,
@@ -260,10 +280,10 @@ function buildBarChartGeometry({ groups, plotWidth, plotHeight, normalization, i
260
280
  color: resolveColor({
261
281
  metric: bar.metric,
262
282
  componentIndex,
263
- isStacked,
264
- explicit: component.color
283
+ explicit: component.color,
284
+ hex: component.hex
265
285
  }),
266
- corners: isCap ? isNegative ? BarCorners.BOTTOM : BarCorners.TOP : BarCorners.NONE,
286
+ corners: isCap ? isNegative ? "BOTTOM" : "TOP" : "NONE",
267
287
  radius
268
288
  });
269
289
  });
@@ -273,17 +293,18 @@ function buildBarChartGeometry({ groups, plotWidth, plotHeight, normalization, i
273
293
  label: group.label,
274
294
  x: bandX,
275
295
  y: 0,
276
- width: step,
296
+ width: bandWidth,
277
297
  height: plotHeight,
278
- anchorX: bandX + step / 2,
298
+ anchorX: groupIndex * step + step / 2,
279
299
  anchorY: groupTopY
280
300
  });
281
301
  });
282
302
  return {
283
303
  rects,
284
304
  bands,
285
- valueScale
305
+ valueScale,
306
+ step
286
307
  };
287
308
  }
288
309
  //#endregion
289
- export { buildBarChartGeometry, getBarValueDomain, roundedRectPath };
310
+ export { BarCorners, MAX_BAR_WIDTH, buildBarChartGeometry, getBarValueDomain, isBarChartStacked, layoutBarSlot, layoutBars, roundedRectPath };