@galaxy-io/dls 1.6.1 → 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 -30
  468. package/dist/inputs/SwitcherInput.js +0 -81
  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
@@ -0,0 +1,141 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ //#region src/table/useSpreadsheetCellNavigation.ts
3
+ /**
4
+ * @internal Shared by InfiniteSpreadsheet; apps use InfiniteSpreadsheet.
5
+ *
6
+ * Roving cell focus over a spreadsheet body (the WAI-ARIA grid pattern): one cell is the tab stop
7
+ * (`tabIndex` 0), every other -1. Arrow keys move one cell, Home / End go to the ends of the row,
8
+ * Ctrl/Cmd+Home / End to the first / last cell of the grid, PageUp / PageDown one visible page.
9
+ * A move scrolls the row into the virtual window first (`scrollToIndex`), focuses the cell once it
10
+ * is mounted and scrolls it into view sideways. A cell element replaced in place (a skeleton row
11
+ * whose data arrives, a row re-keyed by id) takes the focus back on mount.
12
+ */
13
+ /** Frames to wait for a virtual row to mount after `scrollToIndex`. */
14
+ var MOUNT_RETRY_FRAMES = 6;
15
+ var keyOf = (rowIndex, columnIndex) => `${rowIndex}:${columnIndex}`;
16
+ /** @internal Roving focus over the cells of a spreadsheet body. */
17
+ function useSpreadsheetCellNavigation({ rowCount, columnCount, getPageSize, scrollToIndex }) {
18
+ const [tabStop, setTabStop] = useState({
19
+ rowIndex: 0,
20
+ columnIndex: 0
21
+ });
22
+ const active = {
23
+ rowIndex: rowCount === 0 ? 0 : Math.min(tabStop.rowIndex, rowCount - 1),
24
+ columnIndex: columnCount === 0 ? 0 : Math.min(tabStop.columnIndex, columnCount - 1)
25
+ };
26
+ const cellsRef = useRef(/* @__PURE__ */ new Map());
27
+ const focusedKeyRef = useRef(null);
28
+ const frameRef = useRef(null);
29
+ const optionsRef = useRef({
30
+ rowCount,
31
+ columnCount,
32
+ getPageSize,
33
+ scrollToIndex
34
+ });
35
+ optionsRef.current = {
36
+ rowCount,
37
+ columnCount,
38
+ getPageSize,
39
+ scrollToIndex
40
+ };
41
+ useEffect(() => () => {
42
+ if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);
43
+ }, []);
44
+ const registerCell = useCallback((rowIndex, columnIndex, element) => {
45
+ const key = keyOf(rowIndex, columnIndex);
46
+ const cells = cellsRef.current;
47
+ if (element === null) {
48
+ if (!cells.get(key)?.isConnected) cells.delete(key);
49
+ return;
50
+ }
51
+ const previous = cells.get(key);
52
+ cells.set(key, element);
53
+ const activeElement = element.ownerDocument.activeElement;
54
+ const isFocusLost = activeElement === null || activeElement === element.ownerDocument.body || !activeElement.isConnected;
55
+ if (previous !== void 0 && previous !== element && !previous.isConnected && focusedKeyRef.current === key && isFocusLost) element.focus({ preventScroll: true });
56
+ }, []);
57
+ const focusCell = useCallback((rowIndex, columnIndex) => {
58
+ setTabStop({
59
+ rowIndex,
60
+ columnIndex
61
+ });
62
+ optionsRef.current.scrollToIndex(rowIndex);
63
+ if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);
64
+ let attempts = 0;
65
+ const tryFocus = () => {
66
+ frameRef.current = null;
67
+ const element = cellsRef.current.get(keyOf(rowIndex, columnIndex));
68
+ if (element?.isConnected) {
69
+ focusedKeyRef.current = keyOf(rowIndex, columnIndex);
70
+ element.focus({ preventScroll: true });
71
+ element.scrollIntoView({
72
+ block: "nearest",
73
+ inline: "nearest"
74
+ });
75
+ return;
76
+ }
77
+ attempts += 1;
78
+ if (attempts <= MOUNT_RETRY_FRAMES) frameRef.current = requestAnimationFrame(tryFocus);
79
+ };
80
+ tryFocus();
81
+ }, []);
82
+ return {
83
+ active,
84
+ registerCell,
85
+ focusCell,
86
+ handleCellFocus: useCallback((rowIndex, columnIndex) => {
87
+ focusedKeyRef.current = keyOf(rowIndex, columnIndex);
88
+ setTabStop((current) => current.rowIndex === rowIndex && current.columnIndex === columnIndex ? current : {
89
+ rowIndex,
90
+ columnIndex
91
+ });
92
+ }, []),
93
+ handleNavigationKey: useCallback((from, event) => {
94
+ const { rowCount: rows, columnCount: columns, getPageSize: pageSize } = optionsRef.current;
95
+ if (rows === 0 || columns === 0) return false;
96
+ const isCommand = event.ctrlKey || event.metaKey;
97
+ if (event.altKey) return false;
98
+ let { rowIndex, columnIndex } = from;
99
+ switch (event.key) {
100
+ case "ArrowDown":
101
+ if (isCommand) return false;
102
+ rowIndex += 1;
103
+ break;
104
+ case "ArrowUp":
105
+ if (isCommand) return false;
106
+ rowIndex -= 1;
107
+ break;
108
+ case "ArrowRight":
109
+ if (isCommand) return false;
110
+ columnIndex += 1;
111
+ break;
112
+ case "ArrowLeft":
113
+ if (isCommand) return false;
114
+ columnIndex -= 1;
115
+ break;
116
+ case "Home":
117
+ columnIndex = 0;
118
+ if (isCommand) rowIndex = 0;
119
+ break;
120
+ case "End":
121
+ columnIndex = columns - 1;
122
+ if (isCommand) rowIndex = rows - 1;
123
+ break;
124
+ case "PageDown":
125
+ if (isCommand) return false;
126
+ rowIndex += Math.max(1, pageSize());
127
+ break;
128
+ case "PageUp":
129
+ if (isCommand) return false;
130
+ rowIndex -= Math.max(1, pageSize());
131
+ break;
132
+ default: return false;
133
+ }
134
+ event.preventDefault();
135
+ focusCell(Math.min(Math.max(rowIndex, 0), rows - 1), Math.min(Math.max(columnIndex, 0), columns - 1));
136
+ return true;
137
+ }, [focusCell])
138
+ };
139
+ }
140
+ //#endregion
141
+ export { useSpreadsheetCellNavigation };
@@ -1,28 +1,93 @@
1
- import { type ColumnDef, type ColumnSizingState } from "./types";
2
- export interface TableColumnLayout<TData> {
3
- /**
4
- * Resolved width for a column, or `undefined` when the column is flexible
5
- * and should share the leftover space.
6
- */
7
- getColumnWidth: (column: ColumnDef<TData, unknown>) => number | undefined;
8
- /** Sticky offset in pixels, keyed by column id, for pinned columns only. */
9
- pinnedOffsets: Map<string, number>;
10
- /** Sum of every column's resolved width — the table's minimum content width. */
11
- rowMinWidth: number;
12
- }
13
- interface UseTableColumnLayoutOptions<TData> {
14
- columns: ColumnDef<TData, unknown>[];
15
- /** Widths produced by resizing; they win over the column's declared `size`. */
16
- columnSizing?: ColumnSizingState;
17
- /** Reserved space at the trailing edge, ahead of any right-pinned columns. */
18
- rightOffsetBase?: number;
19
- }
20
1
  /**
21
- * Derives column widths, sticky offsets for pinned columns, and the row's
22
- * minimum content width from plain column definitions.
2
+ * @internal Shared by the table components; apps use InfiniteTable, VirtualizedInfiniteTable or
3
+ * InfiniteSpreadsheet.
23
4
  *
24
- * Deliberately independent of any TanStack table instance so the virtualized
25
- * table — which has none — shares exactly the same layout maths.
5
+ * Column arrangement: the `columnLayout` value triple, the visible columns in display order
6
+ * (grouped left-pinned, unpinned, right-pinned), resolved widths and pinned offsets, the column
7
+ * custom properties written on the table root, measured header widths, and the resize / move /
8
+ * hide / reset actions. Every action builds the next full `TableColumnLayout` and reports it.
26
9
  */
27
- export declare function useTableColumnLayout<TData>({ columns, columnSizing, rightOffsetBase, }: UseTableColumnLayoutOptions<TData>): TableColumnLayout<TData>;
28
- export {};
10
+ import { type CSSProperties } from "react";
11
+ import type { TableColumn, TableColumnLayout, TableColumnPin } from "./types.js";
12
+ /** @internal A visible column with everything the parts need to lay it out. */
13
+ export interface TableResolvedColumn<TData> {
14
+ /** The app's column definition. */
15
+ column: TableColumn<TData>;
16
+ /** Position among the visible columns, from 0: the `<n>` of its custom properties. */
17
+ position: number;
18
+ /** Fixed width in pixels, or `undefined` for a column that shares the leftover space. */
19
+ width: number | undefined;
20
+ /** Smallest width in pixels. */
21
+ minWidth: number;
22
+ /** Largest resize width in pixels. */
23
+ maxWidth: number;
24
+ /** The pinned side, if any. */
25
+ pin: TableColumnPin | undefined;
26
+ /** Last left-pinned or first right-pinned data column: draws the edge hairline. */
27
+ isPinEdge: boolean;
28
+ /** The user can resize it. */
29
+ canResize: boolean;
30
+ /** The user can hide it from the Columns menu. */
31
+ canHide: boolean;
32
+ /** Per-cell style: points the cell at its column's custom properties. */
33
+ cellStyle: CSSProperties;
34
+ }
35
+ /** @internal One row of the Columns menu. */
36
+ export interface TableColumnsMenuEntry {
37
+ /** Column id. */
38
+ id: string;
39
+ /** Column header. */
40
+ header: string;
41
+ /** Shown in the table. */
42
+ isVisible: boolean;
43
+ /** Why it cannot be toggled, if it cannot. */
44
+ disabledReason: string | undefined;
45
+ }
46
+ /** @internal Options for `useTableColumnLayout`. */
47
+ export interface UseTableColumnLayoutOptions<TData> {
48
+ /** The columns in their default order. */
49
+ columns: TableColumn<TData>[];
50
+ /** Controlled arrangement. */
51
+ columnLayout: TableColumnLayout | undefined;
52
+ /** Initial arrangement while uncontrolled. */
53
+ defaultColumnLayout: TableColumnLayout;
54
+ /** Called with the full next arrangement. */
55
+ onColumnLayoutChange: ((columnLayout: TableColumnLayout) => void) | undefined;
56
+ /** The table's `canResizeColumns`. */
57
+ canResizeColumns: boolean;
58
+ /** The table's `canCustomizeColumns`. */
59
+ canCustomizeColumns: boolean;
60
+ /** Number of leading synthetic columns (select, expand). */
61
+ leadingCount: number;
62
+ /** A trailing synthetic column (row actions / Columns corner) is shown. */
63
+ hasTrailing: boolean;
64
+ /** Width of a synthetic column, in pixels (the row height). */
65
+ syntheticWidthPx: number;
66
+ }
67
+ /** @internal What `useTableColumnLayout` returns. */
68
+ export interface TableColumnLayoutResult<TData> {
69
+ /** The current arrangement. */
70
+ layout: TableColumnLayout;
71
+ /** Visible columns in display order. */
72
+ visibleColumns: TableResolvedColumn<TData>[];
73
+ /** Every column in display order with its visibility, for the Columns menu. */
74
+ menuEntries: TableColumnsMenuEntry[];
75
+ /** Custom properties for the table root: per-column flex, min, max and pinned offset, and the table min width. */
76
+ variables: Record<`--gx-${string}`, string>;
77
+ /** Width of a resizable column for the resize handle: its resolved or measured width. */
78
+ getColumnWidth: (id: string) => number;
79
+ /** Registers a header cell for width measurement (flexible columns that can resize). */
80
+ registerHeaderCell: (id: string, element: HTMLElement | null) => void;
81
+ /** Sets a column's width (resize). */
82
+ resizeColumn: (id: string, width: number) => void;
83
+ /** Moves a column to before `beforeId` among the unpinned columns (`null`: to the end). */
84
+ moveColumnBefore: (id: string, beforeId: string | null) => void;
85
+ /** Moves a column one place within its group; returns its new 1-based position, or `null` when it cannot move. */
86
+ moveColumnBy: (id: string, delta: -1 | 1) => number | null;
87
+ /** Shows or hides a column. */
88
+ setColumnHidden: (id: string, isHidden: boolean) => void;
89
+ /** Back to the columns as defined (`{}`). */
90
+ resetLayout: () => void;
91
+ }
92
+ /** Column arrangement state and the column custom properties. */
93
+ export declare function useTableColumnLayout<TData>({ columns, columnLayout, defaultColumnLayout, onColumnLayoutChange, canResizeColumns, canCustomizeColumns, leadingCount, hasTrailing, syntheticWidthPx, }: UseTableColumnLayoutOptions<TData>): TableColumnLayoutResult<TData>;
@@ -1,62 +1,267 @@
1
- import { ColumnPin } from "./types.js";
2
- import "./utils.js";
3
- import { useEffect, useMemo } from "react";
1
+ import { Side } from "../theme/enums.js";
2
+ import { useControlledState } from "../hooks/useControlledState.js";
3
+ import { isDevelopment } from "./TableCore.js";
4
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
5
  //#region src/table/useTableColumnLayout.ts
5
- function resolveColumnWidth(column, columnSizing) {
6
- const override = columnSizing?.[column.id];
7
- if (override !== void 0) return override;
8
- if (column.size !== void 0) return column.size;
9
- if (column.pin) return column.minSize ?? 150;
10
- }
11
6
  /**
12
- * Derives column widths, sticky offsets for pinned columns, and the row's
13
- * minimum content width from plain column definitions.
7
+ * @internal Shared by the table components; apps use InfiniteTable, VirtualizedInfiniteTable or
8
+ * InfiniteSpreadsheet.
14
9
  *
15
- * Deliberately independent of any TanStack table instance so the virtualized
16
- * table — which has none — shares exactly the same layout maths.
10
+ * Column arrangement: the `columnLayout` value triple, the visible columns in display order
11
+ * (grouped left-pinned, unpinned, right-pinned), resolved widths and pinned offsets, the column
12
+ * custom properties written on the table root, measured header widths, and the resize / move /
13
+ * hide / reset actions. Every action builds the next full `TableColumnLayout` and reports it.
17
14
  */
18
- function useTableColumnLayout({ columns, columnSizing, rightOffsetBase = 0 }) {
19
- const layout = useMemo(() => {
20
- const widths = /* @__PURE__ */ new Map();
21
- let rowMinWidth = 0;
22
- columns.forEach((column) => {
23
- const width = resolveColumnWidth(column, columnSizing);
24
- widths.set(column.id, width);
25
- rowMinWidth += width ?? column.minSize ?? 0;
26
- });
27
- const pinnedOffsets = /* @__PURE__ */ new Map();
28
- let leftOffset = 0;
29
- columns.forEach((column) => {
30
- if (column.pin !== ColumnPin.LEFT) return;
31
- pinnedOffsets.set(column.id, leftOffset);
32
- leftOffset += widths.get(column.id) ?? 150;
33
- });
34
- let rightOffset = rightOffsetBase;
35
- [...columns].reverse().forEach((column) => {
36
- if (column.pin !== ColumnPin.RIGHT) return;
37
- pinnedOffsets.set(column.id, rightOffset);
38
- rightOffset += widths.get(column.id) ?? 150;
15
+ /** Column ids in display order: `order` first (unknown ids dropped), the rest in `columns` order. */
16
+ function resolveOrder(columns, order) {
17
+ const known = new Map(columns.map((column) => [column.id, column]));
18
+ const seen = /* @__PURE__ */ new Set();
19
+ const result = [];
20
+ for (const id of order ?? []) {
21
+ const column = known.get(id);
22
+ if (column === void 0 || seen.has(id)) continue;
23
+ seen.add(id);
24
+ result.push(column);
25
+ }
26
+ for (const column of columns) if (!seen.has(column.id)) result.push(column);
27
+ return result;
28
+ }
29
+ /** Pin group of a column: 0 left, 1 unpinned, 2 right. */
30
+ function pinGroup(pin) {
31
+ if (pin === Side.LEFT) return 0;
32
+ if (pin === Side.RIGHT) return 2;
33
+ return 1;
34
+ }
35
+ /** Column arrangement state and the column custom properties. */
36
+ function useTableColumnLayout({ columns, columnLayout, defaultColumnLayout, onColumnLayoutChange, canResizeColumns, canCustomizeColumns, leadingCount, hasTrailing, syntheticWidthPx }) {
37
+ const [layout, setLayout] = useControlledState({
38
+ value: columnLayout,
39
+ defaultValue: defaultColumnLayout,
40
+ onChange: onColumnLayoutChange
41
+ });
42
+ const layoutRef = useRef(layout);
43
+ layoutRef.current = layout;
44
+ const columnsRef = useRef(columns);
45
+ columnsRef.current = columns;
46
+ const ordered = useMemo(() => resolveOrder(columns, layout.order), [columns, layout.order]);
47
+ const hiddenKey = (layout.hiddenIds ?? []).join("\0");
48
+ const visibleColumns = useMemo(() => {
49
+ const hidden = new Set(hiddenKey === "" ? [] : hiddenKey.split("\0"));
50
+ const visible = ordered.filter((column) => !hidden.has(column.id)).sort((a, b) => pinGroup(a.pin) - pinGroup(b.pin));
51
+ const lastLeft = visible.filter((column) => column.pin === Side.LEFT).at(-1);
52
+ const firstRight = visible.find((column) => column.pin === Side.RIGHT);
53
+ return visible.map((column, position) => {
54
+ const minWidth = column.minWidth ?? 60;
55
+ const maxWidth = column.maxWidth ?? 800;
56
+ const pin = column.pin;
57
+ const variable = (part) => `var(--gx-table-col-${position}-${part})`;
58
+ const cellStyle = {
59
+ "--gx-table-cell-flex": variable("flex"),
60
+ "--gx-table-cell-min-width": variable("min"),
61
+ "--gx-table-cell-max-width": variable("max")
62
+ };
63
+ if (pin !== void 0) cellStyle["--gx-table-cell-offset"] = variable("offset");
64
+ return {
65
+ column,
66
+ position,
67
+ width: void 0,
68
+ minWidth,
69
+ maxWidth,
70
+ pin,
71
+ isPinEdge: column === lastLeft || column === firstRight,
72
+ canResize: column.canResize ?? canResizeColumns,
73
+ canHide: column.canHide ?? canCustomizeColumns,
74
+ cellStyle
75
+ };
39
76
  });
40
- return {
41
- widths,
42
- pinnedOffsets,
43
- rowMinWidth
44
- };
45
77
  }, [
46
- columns,
47
- columnSizing,
48
- rightOffsetBase
78
+ ordered,
79
+ hiddenKey,
80
+ canResizeColumns,
81
+ canCustomizeColumns
49
82
  ]);
50
- const unsizedPinnedColumnIds = useMemo(() => columns.filter((column) => column.pin && column.size === void 0 && column.minSize === void 0).map((column) => column.id), [columns]);
83
+ const widths = layout.widths;
84
+ const resolvedWidths = useMemo(() => {
85
+ const result = /* @__PURE__ */ new Map();
86
+ for (const { column, pin, minWidth, maxWidth } of visibleColumns) {
87
+ const own = widths?.[column.id] ?? column.width;
88
+ if (own !== void 0) result.set(column.id, Math.min(Math.max(own, minWidth), maxWidth));
89
+ else if (pin !== void 0) result.set(column.id, 150);
90
+ else result.set(column.id, void 0);
91
+ }
92
+ return result;
93
+ }, [visibleColumns, widths]);
94
+ const warnedRef = useRef(/* @__PURE__ */ new Set());
51
95
  useEffect(() => {
52
- if (unsizedPinnedColumnIds.length === 0) return;
53
- console.warn(`[InfiniteTable] Pinned columns need an explicit \`size\` so their sticky offset is correct. Falling back to 150px for: ${unsizedPinnedColumnIds.join(", ")}.`);
54
- }, [unsizedPinnedColumnIds]);
55
- const { widths, pinnedOffsets, rowMinWidth } = layout;
96
+ if (!isDevelopment()) return;
97
+ for (const { column, pin } of visibleColumns) {
98
+ if (pin === void 0 || column.width !== void 0 || warnedRef.current.has(column.id)) continue;
99
+ warnedRef.current.add(column.id);
100
+ console.warn(`[@galaxy-io/dls] Table column "${column.id}" is pinned without a \`width\`; it falls back to 150px.`);
101
+ }
102
+ }, [visibleColumns]);
103
+ const variables = useMemo(() => {
104
+ const result = {};
105
+ let minTotal = (leadingCount + (hasTrailing ? 1 : 0)) * syntheticWidthPx;
106
+ let leftOffset = leadingCount * syntheticWidthPx;
107
+ const rightColumns = [];
108
+ for (const resolved of visibleColumns) {
109
+ const { column, position, minWidth, pin } = resolved;
110
+ const width = resolvedWidths.get(column.id);
111
+ const prefix = `--gx-table-col-${position}`;
112
+ if (width !== void 0) {
113
+ result[`${prefix}-flex`] = `0 0 ${width}px`;
114
+ result[`${prefix}-min`] = `${width}px`;
115
+ result[`${prefix}-max`] = `${width}px`;
116
+ minTotal += width;
117
+ } else {
118
+ result[`${prefix}-flex`] = "1 1 0px";
119
+ result[`${prefix}-min`] = `${minWidth}px`;
120
+ result[`${prefix}-max`] = "none";
121
+ minTotal += minWidth;
122
+ }
123
+ if (pin === Side.LEFT) {
124
+ result[`${prefix}-offset`] = `${leftOffset}px`;
125
+ leftOffset += width ?? 150;
126
+ } else if (pin === Side.RIGHT) rightColumns.push(resolved);
127
+ }
128
+ let rightOffset = hasTrailing ? syntheticWidthPx : 0;
129
+ for (const { column, position } of [...rightColumns].reverse()) {
130
+ result[`--gx-table-col-${position}-offset`] = `${rightOffset}px`;
131
+ rightOffset += resolvedWidths.get(column.id) ?? 150;
132
+ }
133
+ result["--gx-table-min-width"] = `${minTotal}px`;
134
+ return result;
135
+ }, [
136
+ visibleColumns,
137
+ resolvedWidths,
138
+ leadingCount,
139
+ hasTrailing,
140
+ syntheticWidthPx
141
+ ]);
142
+ const menuEntries = useMemo(() => {
143
+ const hidden = new Set(hiddenKey === "" ? [] : hiddenKey.split("\0"));
144
+ const hideable = ordered.filter((column) => !hidden.has(column.id) && (column.canHide ?? canCustomizeColumns));
145
+ return ordered.map((column) => {
146
+ const isVisible = !hidden.has(column.id);
147
+ const canHide = column.canHide ?? canCustomizeColumns;
148
+ let disabledReason;
149
+ if (!canHide) disabledReason = "Always shown";
150
+ else if (isVisible && hideable.length === 1) disabledReason = "At least one column stays visible";
151
+ return {
152
+ id: column.id,
153
+ header: column.header,
154
+ isVisible,
155
+ disabledReason
156
+ };
157
+ });
158
+ }, [
159
+ ordered,
160
+ hiddenKey,
161
+ canCustomizeColumns
162
+ ]);
163
+ const [measured, setMeasured] = useState({});
164
+ const headerCellsRef = useRef(/* @__PURE__ */ new Map());
165
+ const observerRef = useRef(null);
166
+ const measure = useCallback((id, element) => {
167
+ const width = Math.round(element.getBoundingClientRect().width);
168
+ setMeasured((current) => current[id] === width ? current : {
169
+ ...current,
170
+ [id]: width
171
+ });
172
+ }, []);
173
+ const registerHeaderCell = useCallback((id, element) => {
174
+ const cells = headerCellsRef.current;
175
+ const previous = cells.get(id);
176
+ if (previous === element) return;
177
+ if (previous !== void 0) observerRef.current?.unobserve(previous);
178
+ if (element === null) {
179
+ cells.delete(id);
180
+ return;
181
+ }
182
+ cells.set(id, element);
183
+ if (typeof ResizeObserver === "undefined") {
184
+ measure(id, element);
185
+ return;
186
+ }
187
+ if (observerRef.current === null) observerRef.current = new ResizeObserver((entries) => {
188
+ for (const entry of entries) for (const [cellId, cell] of headerCellsRef.current) if (cell === entry.target) measure(cellId, cell);
189
+ });
190
+ observerRef.current.observe(element);
191
+ }, [measure]);
192
+ useEffect(() => () => observerRef.current?.disconnect(), []);
193
+ const getColumnWidth = useCallback((id) => resolvedWidths.get(id) ?? measured[id] ?? 60, [resolvedWidths, measured]);
194
+ const resizeColumn = useCallback((id, width) => {
195
+ const current = layoutRef.current;
196
+ setLayout({
197
+ ...current,
198
+ widths: {
199
+ ...current.widths,
200
+ [id]: width
201
+ }
202
+ });
203
+ }, [setLayout]);
204
+ /** The full display order of every column, as ids. */
205
+ const fullOrder = useCallback(() => resolveOrder(columnsRef.current, layoutRef.current.order).map((column) => column.id), []);
206
+ const moveColumnBefore = useCallback((id, beforeId) => {
207
+ if (id === beforeId) return;
208
+ const order = fullOrder().filter((entry) => entry !== id);
209
+ const hidden = new Set(layoutRef.current.hiddenIds ?? []);
210
+ let index;
211
+ if (beforeId === null) {
212
+ const lastUnpinned = [...order].reverse().find((entry) => {
213
+ const column = columnsRef.current.find((candidate) => candidate.id === entry);
214
+ return column !== void 0 && column.pin === void 0 && !hidden.has(entry);
215
+ });
216
+ index = lastUnpinned === void 0 ? order.length : order.indexOf(lastUnpinned) + 1;
217
+ } else {
218
+ index = order.indexOf(beforeId);
219
+ if (index === -1) index = order.length;
220
+ }
221
+ order.splice(index, 0, id);
222
+ if (fullOrder().every((entry, i) => entry === order[i])) return;
223
+ setLayout({
224
+ ...layoutRef.current,
225
+ order
226
+ });
227
+ }, [fullOrder, setLayout]);
228
+ const visibleRef = useRef(visibleColumns);
229
+ visibleRef.current = visibleColumns;
56
230
  return {
57
- getColumnWidth: useMemo(() => (column) => widths.get(column.id), [widths]),
58
- pinnedOffsets,
59
- rowMinWidth
231
+ layout,
232
+ visibleColumns,
233
+ menuEntries,
234
+ variables,
235
+ getColumnWidth,
236
+ registerHeaderCell,
237
+ resizeColumn,
238
+ moveColumnBefore,
239
+ moveColumnBy: useCallback((id, delta) => {
240
+ const visible = visibleRef.current;
241
+ const self = visible.find((entry) => entry.column.id === id);
242
+ if (self === void 0) return null;
243
+ const group = visible.filter((entry) => pinGroup(entry.pin) === pinGroup(self.pin));
244
+ const target = group[group.indexOf(self) + delta];
245
+ if (target === void 0) return null;
246
+ const order = fullOrder().filter((entry) => entry !== id);
247
+ const targetIndex = order.indexOf(target.column.id);
248
+ order.splice(delta === 1 ? targetIndex + 1 : targetIndex, 0, id);
249
+ setLayout({
250
+ ...layoutRef.current,
251
+ order
252
+ });
253
+ return self.position + delta + 1;
254
+ }, [fullOrder, setLayout]),
255
+ setColumnHidden: useCallback((id, isHidden) => {
256
+ const current = layoutRef.current;
257
+ const hidden = (current.hiddenIds ?? []).filter((entry) => entry !== id);
258
+ if (isHidden) hidden.push(id);
259
+ setLayout({
260
+ ...current,
261
+ hiddenIds: hidden
262
+ });
263
+ }, [setLayout]),
264
+ resetLayout: useCallback(() => setLayout({}), [setLayout])
60
265
  };
61
266
  }
62
267
  //#endregion
@@ -1,25 +1,36 @@
1
- /** Body rows carry this attribute so focus can be moved without a ref per row. */
2
- export declare const ROW_INDEX_ATTRIBUTE = "data-row-index";
3
- interface UseTableKeyboardNavigationOptions {
4
- /** The element containing the body rows. */
5
- bodyRef: React.RefObject<HTMLElement | null>;
1
+ /**
2
+ * @internal Shared by the table components; apps use InfiniteTable, VirtualizedInfiniteTable or
3
+ * InfiniteSpreadsheet.
4
+ *
5
+ * Roving row focus over a table body: one row is the tab stop (`tabIndex` 0), the rest -1.
6
+ * ArrowUp / ArrowDown, Home / End and PageUp / PageDown move focus; a virtual body passes
7
+ * `scrollToIndex` so the target row is scrolled into the window before it is focused. Every other
8
+ * key (Enter, Space, ArrowLeft / ArrowRight, Shift+F10) goes to the host's `onKeyDown`.
9
+ */
10
+ import { type KeyboardEvent } from "react";
11
+ /** @internal Options for `useTableKeyboardNavigation`. */
12
+ export interface UseTableKeyboardNavigationOptions {
13
+ /** Rows the keys move over (loaded rows, or every virtual row). */
6
14
  rowCount: number;
7
- enabled?: boolean;
8
- onActivate?: (rowIndex: number, event: React.KeyboardEvent) => void;
9
- onToggleSelect?: (rowIndex: number, event: React.KeyboardEvent) => void;
10
- /** Lets a virtualized host bring an off-screen row into the DOM first. */
11
- scrollToIndex?: (rowIndex: number) => void;
15
+ /** Rows in one visible page, for PageUp / PageDown. */
16
+ getPageSize: () => number;
17
+ /** Brings a row into the rendered window first (virtual bodies). */
18
+ scrollToIndex?: ((index: number) => void) | undefined;
19
+ /** Keys the hook does not handle. */
20
+ onKeyDown: (rowIndex: number, event: KeyboardEvent<HTMLTableRowElement>) => void;
12
21
  }
22
+ /** @internal What `useTableKeyboardNavigation` returns. */
13
23
  export interface TableKeyboardNavigation {
14
- focusedRowIndex: number;
15
- /** Roving tabindex: exactly one body row is in the tab order. */
16
- getRowTabIndex: (rowIndex: number) => number | undefined;
17
- onRowKeyDown: (rowIndex: number, event: React.KeyboardEvent) => void;
18
- onRowFocus: (rowIndex: number) => void;
24
+ /** The row that is the tab stop. */
25
+ tabStopIndex: number;
26
+ /** Ref registration for each rendered row element. */
27
+ registerRow: (rowIndex: number, element: HTMLElement | null) => void;
28
+ /** The row `keydown` handler (only for events whose target is the row itself). */
29
+ handleRowKeyDown: (rowIndex: number, event: KeyboardEvent<HTMLTableRowElement>) => void;
30
+ /** The row (or a control in it) received focus: it becomes the tab stop. */
31
+ handleRowFocus: (rowIndex: number) => void;
32
+ /** Moves focus to a row, scrolling it into the window first. */
33
+ focusRow: (rowIndex: number) => void;
19
34
  }
20
- /**
21
- * Roving-tabindex keyboard navigation over table rows: one Tab stop for the
22
- * whole body, arrows to move between rows, Enter to activate, Space to select.
23
- */
24
- export declare function useTableKeyboardNavigation({ bodyRef, rowCount, enabled, onActivate, onToggleSelect, scrollToIndex, }: UseTableKeyboardNavigationOptions): TableKeyboardNavigation;
25
- export {};
35
+ /** @internal Roving focus over the rows of a table body. */
36
+ export declare function useTableKeyboardNavigation({ rowCount, getPageSize, scrollToIndex, onKeyDown, }: UseTableKeyboardNavigationOptions): TableKeyboardNavigation;