@galaxy-io/dls 1.6.1 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (540) hide show
  1. package/README.md +47 -50
  2. package/biome/index.json +74 -0
  3. package/biome/plugins/no-hex-literal.grit +20 -0
  4. package/biome/plugins/no-inline-style.grit +13 -0
  5. package/biome/plugins/no-margin.grit +9 -0
  6. package/biome/plugins/warn/no-hex-literal.grit +23 -0
  7. package/biome/plugins/warn/no-inline-style.grit +13 -0
  8. package/biome/plugins/warn/no-margin.grit +9 -0
  9. package/dist/a11y/FocusScope.d.ts +44 -0
  10. package/dist/a11y/FocusScope.js +229 -0
  11. package/dist/a11y/VisuallyHidden.d.ts +21 -0
  12. package/dist/a11y/VisuallyHidden.js +30 -0
  13. package/dist/avatar/Avatar.d.ts +56 -14
  14. package/dist/avatar/Avatar.js +250 -96
  15. package/dist/avatar/AvatarGroup.d.ts +43 -0
  16. package/dist/avatar/AvatarGroup.js +153 -0
  17. package/dist/backgrounds/GridBackground.d.ts +48 -0
  18. package/dist/backgrounds/GridBackground.js +146 -0
  19. package/dist/beacons/Beacon.d.ts +86 -22
  20. package/dist/beacons/Beacon.js +170 -47
  21. package/dist/brand/GalaxyFilamentWordmark.d.ts +30 -0
  22. package/dist/brand/GalaxyFilamentWordmark.js +39 -0
  23. package/dist/brand/GalaxyLogomark.d.ts +26 -0
  24. package/dist/brand/GalaxyLogomark.js +41 -0
  25. package/dist/brand/GalaxyLogomarkAnimation.d.ts +36 -0
  26. package/dist/brand/GalaxyLogomarkAnimation.js +107 -0
  27. package/dist/brand/GalaxyWordmark.d.ts +30 -0
  28. package/dist/brand/GalaxyWordmark.js +63 -0
  29. package/dist/brand/assets/galaxy-logomark-animation.js +136678 -0
  30. package/dist/brand/brandMark.d.ts +26 -0
  31. package/dist/brand/brandMark.js +35 -0
  32. package/dist/buttons/Button.d.ts +148 -59
  33. package/dist/buttons/Button.js +437 -227
  34. package/dist/buttons/ButtonGroup.d.ts +38 -0
  35. package/dist/buttons/ButtonGroup.js +68 -0
  36. package/dist/buttons/CopyButton.d.ts +77 -0
  37. package/dist/buttons/CopyButton.js +65 -0
  38. package/dist/charts/AreaChart.d.ts +49 -0
  39. package/dist/charts/AreaChart.js +31 -0
  40. package/dist/charts/BarChart.d.ts +54 -67
  41. package/dist/charts/BarChart.js +160 -124
  42. package/dist/charts/ChartAxis.d.ts +35 -40
  43. package/dist/charts/ChartAxis.js +114 -90
  44. package/dist/charts/ChartCategoryTargets.d.ts +12 -26
  45. package/dist/charts/ChartCategoryTargets.js +33 -20
  46. package/dist/charts/ChartFrame.d.ts +71 -116
  47. package/dist/charts/ChartFrame.js +306 -97
  48. package/dist/charts/ChartGroupProvider.d.ts +30 -41
  49. package/dist/charts/ChartGroupProvider.js +20 -7
  50. package/dist/charts/ChartLegend.d.ts +37 -48
  51. package/dist/charts/ChartLegend.js +243 -125
  52. package/dist/charts/ChartMarkTargets.d.ts +12 -28
  53. package/dist/charts/ChartMarkTargets.js +34 -20
  54. package/dist/charts/ChartPrimitives.d.ts +50 -305
  55. package/dist/charts/ChartPrimitives.js +65 -413
  56. package/dist/charts/ChartTooltip.d.ts +20 -26
  57. package/dist/charts/ChartTooltip.js +77 -40
  58. package/dist/charts/Heatmap.d.ts +35 -0
  59. package/dist/charts/Heatmap.js +307 -0
  60. package/dist/charts/LineChart.d.ts +54 -47
  61. package/dist/charts/LineChart.js +174 -121
  62. package/dist/charts/PieChart.d.ts +32 -53
  63. package/dist/charts/PieChart.js +159 -136
  64. package/dist/charts/Sparkline.d.ts +107 -0
  65. package/dist/charts/Sparkline.js +244 -0
  66. package/dist/charts/StatChart.d.ts +37 -13
  67. package/dist/charts/StatChart.js +82 -35
  68. package/dist/charts/barChartGeometry.d.ts +138 -86
  69. package/dist/charts/barChartGeometry.js +122 -101
  70. package/dist/charts/barChartLegend.d.ts +14 -18
  71. package/dist/charts/barChartLegend.js +18 -13
  72. package/dist/charts/chartFormat.d.ts +12 -18
  73. package/dist/charts/chartFormat.js +20 -52
  74. package/dist/charts/chartPalette.d.ts +33 -0
  75. package/dist/charts/chartPalette.js +68 -0
  76. package/dist/charts/chartScales.d.ts +41 -108
  77. package/dist/charts/chartScales.js +62 -128
  78. package/dist/charts/chartSelection.d.ts +15 -0
  79. package/dist/charts/chartSelection.js +22 -0
  80. package/dist/charts/constants.d.ts +100 -256
  81. package/dist/charts/constants.js +109 -275
  82. package/dist/charts/heatmapGeometry.d.ts +95 -0
  83. package/dist/charts/heatmapGeometry.js +155 -0
  84. package/dist/charts/lineChartGeometry.d.ts +108 -58
  85. package/dist/charts/lineChartGeometry.js +120 -78
  86. package/dist/charts/pieChartGeometry.d.ts +66 -40
  87. package/dist/charts/pieChartGeometry.js +68 -38
  88. package/dist/charts/types.d.ts +206 -466
  89. package/dist/charts/types.js +55 -144
  90. package/dist/charts/useCartesianChartLayout.d.ts +28 -59
  91. package/dist/charts/useCartesianChartLayout.js +47 -32
  92. package/dist/charts/useChartDimensions.d.ts +19 -40
  93. package/dist/charts/useChartDimensions.js +40 -56
  94. package/dist/charts/useChartFormatters.d.ts +6 -15
  95. package/dist/charts/useChartFormatters.js +4 -9
  96. package/dist/charts/useChartInteraction.d.ts +69 -116
  97. package/dist/charts/useChartInteraction.js +148 -78
  98. package/dist/charts/useChartTooltipPosition.d.ts +29 -39
  99. package/dist/charts/useChartTooltipPosition.js +14 -5
  100. package/dist/charts/useSeriesColorResolver.d.ts +11 -33
  101. package/dist/charts/useSeriesColorResolver.js +19 -12
  102. package/dist/chips/Chip.d.ts +155 -44
  103. package/dist/chips/Chip.js +329 -155
  104. package/dist/chips/ChipGroup.d.ts +53 -0
  105. package/dist/chips/ChipGroup.js +98 -0
  106. package/dist/drawer/Drawer.d.ts +83 -17
  107. package/dist/drawer/Drawer.js +399 -65
  108. package/dist/dropdown/Dropdown.d.ts +80 -63
  109. package/dist/dropdown/Dropdown.js +127 -129
  110. package/dist/editor/CodeEditor.d.ts +119 -40
  111. package/dist/editor/CodeEditor.js +490 -400
  112. package/dist/editor/CodeEditorReactWidget.d.ts +20 -17
  113. package/dist/editor/CodeEditorReactWidget.js +28 -21
  114. package/dist/feedback/Alert.d.ts +49 -0
  115. package/dist/feedback/Alert.js +172 -0
  116. package/dist/feedback/EmptyState.d.ts +39 -0
  117. package/dist/feedback/EmptyState.js +109 -0
  118. package/dist/feedback/ProgressBar.d.ts +125 -0
  119. package/dist/feedback/ProgressBar.js +183 -0
  120. package/dist/feedback/ProgressCircle.d.ts +99 -0
  121. package/dist/feedback/ProgressCircle.js +187 -0
  122. package/dist/feedback/Skeleton.d.ts +69 -0
  123. package/dist/feedback/Skeleton.js +130 -0
  124. package/dist/feedback/Spinner.d.ts +63 -0
  125. package/dist/feedback/Spinner.js +141 -0
  126. package/dist/fonts.css +70 -0
  127. package/dist/hooks/internal/useIsClient.d.ts +2 -0
  128. package/dist/hooks/internal/useIsClient.js +14 -0
  129. package/dist/hooks/useClipboard.d.ts +19 -0
  130. package/dist/hooks/useClipboard.js +45 -0
  131. package/dist/hooks/useControlledOpenState.d.ts +21 -0
  132. package/dist/hooks/useControlledOpenState.js +19 -0
  133. package/dist/hooks/useControlledState.d.ts +19 -0
  134. package/dist/hooks/useControlledState.js +22 -0
  135. package/dist/hooks/useDebouncedValue.d.ts +14 -0
  136. package/dist/hooks/useDebouncedValue.js +33 -0
  137. package/dist/hooks/useDisclosure.d.ts +26 -0
  138. package/dist/hooks/useDisclosure.js +36 -0
  139. package/dist/hooks/useDismiss.d.ts +23 -27
  140. package/dist/hooks/useDismiss.js +39 -27
  141. package/dist/hooks/useElementClientSize.d.ts +10 -10
  142. package/dist/hooks/useElementClientSize.js +8 -11
  143. package/dist/hooks/useElementWidth.d.ts +6 -13
  144. package/dist/hooks/useElementWidth.js +6 -14
  145. package/dist/hooks/useField.d.ts +47 -0
  146. package/dist/hooks/useField.js +40 -0
  147. package/dist/hooks/useHotkey.d.ts +77 -0
  148. package/dist/hooks/useHotkey.js +246 -0
  149. package/dist/hooks/useIsMac.d.ts +12 -0
  150. package/dist/hooks/useIsMac.js +27 -0
  151. package/dist/hooks/useIsomorphicLayoutEffect.d.ts +17 -0
  152. package/dist/hooks/useIsomorphicLayoutEffect.js +20 -0
  153. package/dist/hooks/useLocalStorage.d.ts +28 -0
  154. package/dist/hooks/useLocalStorage.js +145 -0
  155. package/dist/hooks/useMediaQuery.d.ts +11 -0
  156. package/dist/hooks/useMediaQuery.js +23 -0
  157. package/dist/hooks/usePrefersReducedMotion.d.ts +12 -0
  158. package/dist/hooks/usePrefersReducedMotion.js +25 -0
  159. package/dist/hooks/useResize.d.ts +42 -62
  160. package/dist/hooks/useResize.js +43 -31
  161. package/dist/icons/Icon.d.ts +64 -37
  162. package/dist/icons/Icon.js +96 -37
  163. package/dist/icons/internal/IconSlot.d.ts +10 -0
  164. package/dist/icons/internal/IconSlot.js +32 -0
  165. package/dist/inputs/CheckboxGroup.d.ts +115 -0
  166. package/dist/inputs/CheckboxGroup.js +183 -0
  167. package/dist/inputs/CheckboxInput.d.ts +98 -28
  168. package/dist/inputs/CheckboxInput.js +218 -88
  169. package/dist/inputs/ColorInput.d.ts +115 -29
  170. package/dist/inputs/ColorInput.js +748 -326
  171. package/dist/inputs/CopyInput.d.ts +49 -20
  172. package/dist/inputs/CopyInput.js +57 -49
  173. package/dist/inputs/CronInput.d.ts +94 -0
  174. package/dist/inputs/CronInput.js +618 -0
  175. package/dist/inputs/DateInput.d.ts +175 -28
  176. package/dist/inputs/DateInput.js +1109 -451
  177. package/dist/inputs/DurationInput.d.ts +101 -0
  178. package/dist/inputs/DurationInput.js +441 -0
  179. package/dist/inputs/Field.d.ts +75 -0
  180. package/dist/inputs/Field.js +247 -0
  181. package/dist/inputs/Fieldset.d.ts +53 -0
  182. package/dist/inputs/Fieldset.js +149 -0
  183. package/dist/inputs/FileInput.d.ts +110 -0
  184. package/dist/inputs/FileInput.js +476 -0
  185. package/dist/inputs/Input.d.ts +148 -187
  186. package/dist/inputs/Input.js +339 -259
  187. package/dist/inputs/KeyValueInput.d.ts +120 -0
  188. package/dist/inputs/KeyValueInput.js +383 -0
  189. package/dist/inputs/MultiSelectInput.d.ts +165 -54
  190. package/dist/inputs/MultiSelectInput.js +175 -559
  191. package/dist/inputs/NumberInput.d.ts +65 -9
  192. package/dist/inputs/NumberInput.js +197 -40
  193. package/dist/inputs/PasswordInput.d.ts +17 -12
  194. package/dist/inputs/PasswordInput.js +33 -33
  195. package/dist/inputs/PinInput.d.ts +117 -0
  196. package/dist/inputs/PinInput.js +364 -0
  197. package/dist/inputs/RadioGroup.d.ts +115 -0
  198. package/dist/inputs/RadioGroup.js +179 -0
  199. package/dist/inputs/RadioInput.d.ts +87 -24
  200. package/dist/inputs/RadioInput.js +182 -95
  201. package/dist/inputs/SearchInput.d.ts +66 -0
  202. package/dist/inputs/SearchInput.js +156 -0
  203. package/dist/inputs/SelectInput.d.ts +195 -55
  204. package/dist/inputs/SelectInput.js +1308 -446
  205. package/dist/inputs/SliderInput.d.ts +150 -30
  206. package/dist/inputs/SliderInput.js +441 -186
  207. package/dist/inputs/SwitchInput.d.ts +109 -0
  208. package/dist/inputs/SwitchInput.js +248 -0
  209. package/dist/inputs/TagInput.d.ts +117 -0
  210. package/dist/inputs/TagInput.js +408 -0
  211. package/dist/inputs/TextAreaInput.d.ts +146 -44
  212. package/dist/inputs/TextAreaInput.js +298 -198
  213. package/dist/inputs/TextInput.d.ts +4 -13
  214. package/dist/inputs/TextInput.js +13 -48
  215. package/dist/inputs/ToggleInput.d.ts +120 -22
  216. package/dist/inputs/ToggleInput.js +262 -116
  217. package/dist/inputs/internal/bareField.d.ts +18 -0
  218. package/dist/inputs/internal/bareField.js +38 -0
  219. package/dist/inputs/internal/devWarn.d.ts +7 -0
  220. package/dist/inputs/internal/devWarn.js +30 -0
  221. package/dist/inputs/internal/fieldFrame.d.ts +34 -0
  222. package/dist/inputs/internal/fieldFrame.js +64 -0
  223. package/dist/inputs/internal/fieldWiring.d.ts +50 -0
  224. package/dist/inputs/internal/fieldWiring.js +38 -0
  225. package/dist/inputs/internal/innerButton.d.ts +2 -0
  226. package/dist/inputs/internal/innerButton.js +24 -0
  227. package/dist/inputs/internal/ownField.d.ts +45 -0
  228. package/dist/inputs/internal/ownField.js +58 -0
  229. package/dist/inputs/internal/predicates.d.ts +9 -0
  230. package/dist/inputs/internal/predicates.js +11 -0
  231. package/dist/inputs/internal/useComboboxPopover.d.ts +46 -0
  232. package/dist/inputs/internal/useComboboxPopover.js +92 -0
  233. package/dist/json/JsonViewer.d.ts +62 -0
  234. package/dist/json/JsonViewer.js +483 -0
  235. package/dist/layout/Box.d.ts +87 -0
  236. package/dist/layout/Box.js +109 -0
  237. package/dist/layout/Divider.d.ts +25 -0
  238. package/dist/layout/Divider.js +70 -0
  239. package/dist/layout/Flex.d.ts +139 -0
  240. package/dist/layout/Flex.js +165 -0
  241. package/dist/layout/FlexItem.d.ts +72 -0
  242. package/dist/layout/FlexItem.js +84 -0
  243. package/dist/layout/Grid.d.ts +140 -0
  244. package/dist/layout/Grid.js +178 -0
  245. package/dist/layout/Portal.d.ts +29 -0
  246. package/dist/layout/Portal.js +27 -0
  247. package/dist/layout/ResizablePanels.d.ts +88 -0
  248. package/dist/layout/ResizablePanels.js +198 -0
  249. package/dist/layout/ResizeHandle.d.ts +48 -0
  250. package/dist/layout/ResizeHandle.js +143 -0
  251. package/dist/layout/ScrollArea.d.ts +30 -0
  252. package/dist/layout/ScrollArea.js +138 -0
  253. package/dist/links/Link.d.ts +101 -1
  254. package/dist/links/Link.js +166 -4
  255. package/dist/lists/BulletedList.d.ts +25 -7
  256. package/dist/lists/BulletedList.js +72 -27
  257. package/dist/lists/DescriptionList.d.ts +91 -0
  258. package/dist/lists/DescriptionList.js +147 -0
  259. package/dist/menu/ContextMenu.d.ts +64 -0
  260. package/dist/menu/ContextMenu.js +34 -0
  261. package/dist/menu/Menu.d.ts +280 -0
  262. package/dist/menu/Menu.js +1003 -0
  263. package/dist/modal/ConfirmDialog.d.ts +55 -0
  264. package/dist/modal/ConfirmDialog.js +151 -0
  265. package/dist/modal/Modal.d.ts +64 -14
  266. package/dist/modal/Modal.js +189 -48
  267. package/dist/navigation/Breadcrumbs.d.ts +65 -0
  268. package/dist/navigation/Breadcrumbs.js +243 -0
  269. package/dist/navigation/CommandPalette.d.ts +83 -0
  270. package/dist/navigation/CommandPalette.js +509 -0
  271. package/dist/navigation/Pagination.d.ts +87 -0
  272. package/dist/navigation/Pagination.js +300 -0
  273. package/dist/navigation/SidebarNav.d.ts +107 -0
  274. package/dist/navigation/SidebarNav.js +341 -0
  275. package/dist/navigation/Stepper.d.ts +52 -0
  276. package/dist/navigation/Stepper.js +207 -0
  277. package/dist/navigation/Tabs.d.ts +113 -0
  278. package/dist/navigation/Tabs.js +543 -0
  279. package/dist/navigation/Topbar.d.ts +20 -0
  280. package/dist/navigation/Topbar.js +62 -0
  281. package/dist/overlay/OverlayProvider.d.ts +28 -32
  282. package/dist/overlay/OverlayProvider.js +42 -93
  283. package/dist/overlay/useOverlay.d.ts +88 -12
  284. package/dist/overlay/useOverlay.js +220 -43
  285. package/dist/overlays/Popover.d.ts +114 -0
  286. package/dist/overlays/Popover.js +389 -0
  287. package/dist/shapes/Circle.d.ts +84 -8
  288. package/dist/shapes/Circle.js +122 -20
  289. package/dist/shapes/Square.d.ts +84 -8
  290. package/dist/shapes/Square.js +123 -20
  291. package/dist/styles/mixins.d.ts +35 -0
  292. package/dist/styles/mixins.js +60 -0
  293. package/dist/styles.css +1 -202
  294. package/dist/table/InfiniteSpreadsheet.d.ts +140 -10
  295. package/dist/table/InfiniteSpreadsheet.js +762 -225
  296. package/dist/table/InfiniteTable.d.ts +116 -14
  297. package/dist/table/InfiniteTable.js +287 -429
  298. package/dist/table/SpreadsheetCellEditor.d.ts +54 -6
  299. package/dist/table/SpreadsheetCellEditor.js +163 -84
  300. package/dist/table/TableCore.d.ts +252 -0
  301. package/dist/table/TableCore.js +1082 -0
  302. package/dist/table/VirtualizedInfiniteTable.d.ts +104 -14
  303. package/dist/table/VirtualizedInfiniteTable.js +280 -219
  304. package/dist/table/types.d.ts +66 -244
  305. package/dist/table/types.js +0 -51
  306. package/dist/table/useInfiniteScrollSentinel.d.ts +25 -21
  307. package/dist/table/useInfiniteScrollSentinel.js +38 -30
  308. package/dist/table/useSpreadsheetCellNavigation.d.ts +44 -0
  309. package/dist/table/useSpreadsheetCellNavigation.js +141 -0
  310. package/dist/table/useTableColumnLayout.d.ts +90 -25
  311. package/dist/table/useTableColumnLayout.js +255 -50
  312. package/dist/table/useTableKeyboardNavigation.d.ts +32 -21
  313. package/dist/table/useTableKeyboardNavigation.js +95 -71
  314. package/dist/table/useTableRowSelection.d.ts +24 -25
  315. package/dist/table/useTableRowSelection.js +57 -84
  316. package/dist/table/useTableVirtualizer.d.ts +20 -0
  317. package/dist/table/useTableVirtualizer.js +48 -0
  318. package/dist/text/Bold.d.ts +5 -6
  319. package/dist/text/Bold.js +16 -15
  320. package/dist/text/Code.d.ts +5 -6
  321. package/dist/text/Code.js +16 -25
  322. package/dist/text/CodeBlock.d.ts +77 -0
  323. package/dist/text/CodeBlock.js +373 -0
  324. package/dist/text/EditableText.d.ts +55 -15
  325. package/dist/text/EditableText.js +153 -135
  326. package/dist/text/Ellipsis.d.ts +34 -8
  327. package/dist/text/Ellipsis.js +55 -23
  328. package/dist/text/Kbd.d.ts +72 -0
  329. package/dist/text/Kbd.js +284 -0
  330. package/dist/text/MarkdownText.d.ts +27 -10
  331. package/dist/text/MarkdownText.js +317 -300
  332. package/dist/text/RequiredMarker.d.ts +17 -5
  333. package/dist/text/RequiredMarker.js +34 -36
  334. package/dist/text/Selectable.d.ts +5 -6
  335. package/dist/text/Selectable.js +16 -13
  336. package/dist/text/Span.d.ts +82 -0
  337. package/dist/text/Span.js +115 -0
  338. package/dist/text/Text.d.ts +128 -41
  339. package/dist/text/Text.js +209 -76
  340. package/dist/theme/GalaxyProvider.d.ts +75 -0
  341. package/dist/theme/GalaxyProvider.js +223 -0
  342. package/dist/theme/ThemeSwitcher.d.ts +52 -0
  343. package/dist/theme/ThemeSwitcher.js +94 -0
  344. package/dist/theme/enums.d.ts +118 -0
  345. package/dist/theme/enums.js +144 -0
  346. package/dist/theme/tokens/dark.d.ts +2 -0
  347. package/dist/theme/tokens/dark.js +275 -0
  348. package/dist/theme/tokens/generate.d.ts +15 -0
  349. package/dist/theme/tokens/generate.js +47 -0
  350. package/dist/theme/tokens/light.d.ts +2 -0
  351. package/dist/theme/tokens/light.js +274 -0
  352. package/dist/theme/tokens/palette.d.ts +14 -0
  353. package/dist/theme/tokens/palette.js +153 -0
  354. package/dist/theme/tokens/scales.d.ts +26 -0
  355. package/dist/theme/tokens/scales.js +154 -0
  356. package/dist/theme/tokens/t.d.ts +3 -0
  357. package/dist/theme/tokens/t.js +25 -0
  358. package/dist/theme/tokens/types.d.ts +189 -0
  359. package/dist/theme/tokens/types.js +0 -0
  360. package/dist/theme/useGalaxyTheme.d.ts +46 -0
  361. package/dist/theme/useGalaxyTheme.js +36 -0
  362. package/dist/theme/useInverseScope.d.ts +18 -0
  363. package/dist/theme/useInverseScope.js +33 -0
  364. package/dist/three/GalaxyLogomark3D.d.ts +46 -0
  365. package/dist/three/GalaxyLogomark3D.js +134 -0
  366. package/dist/three/assets/galaxy-logomark.js +4 -0
  367. package/dist/three/galaxyLogomark3DScene.d.ts +27 -0
  368. package/dist/three/galaxyLogomark3DScene.js +165 -0
  369. package/dist/timeline/Timeline.d.ts +120 -0
  370. package/dist/timeline/Timeline.js +301 -0
  371. package/dist/toast/Toast.d.ts +43 -19
  372. package/dist/toast/Toast.js +130 -89
  373. package/dist/toast/ToastProvider.d.ts +23 -23
  374. package/dist/toast/ToastProvider.js +298 -101
  375. package/dist/toast/ToastViewport.d.ts +12 -0
  376. package/dist/toast/ToastViewport.js +210 -0
  377. package/dist/toast/useToast.d.ts +139 -5
  378. package/dist/toast/useToast.js +15 -13
  379. package/dist/tokens.css +654 -0
  380. package/dist/tooltip/Tooltip.d.ts +64 -44
  381. package/dist/tooltip/Tooltip.js +280 -73
  382. package/dist/tooltip/internal/LazyTooltip.d.ts +7 -0
  383. package/dist/tooltip/internal/LazyTooltip.js +53 -0
  384. package/dist/transform/Fade.d.ts +33 -11
  385. package/dist/transform/Fade.js +71 -19
  386. package/dist/transform/Flasher.d.ts +25 -0
  387. package/dist/transform/Flasher.js +39 -0
  388. package/dist/transform/Rotate.d.ts +24 -12
  389. package/dist/transform/Rotate.js +36 -22
  390. package/dist/transform/ScaleFade.d.ts +36 -11
  391. package/dist/transform/ScaleFade.js +86 -28
  392. package/dist/transform/internal/CollapseMotion.d.ts +10 -0
  393. package/dist/transform/internal/CollapseMotion.js +65 -0
  394. package/dist/tree/Tree.d.ts +85 -0
  395. package/dist/tree/Tree.js +387 -0
  396. package/dist/tree/treeRow.d.ts +39 -0
  397. package/dist/tree/treeRow.js +75 -0
  398. package/dist/utils/colors.d.ts +46 -13
  399. package/dist/utils/colors.js +92 -34
  400. package/dist/utils/css.d.ts +23 -0
  401. package/dist/utils/css.js +30 -0
  402. package/dist/utils/format.d.ts +58 -0
  403. package/dist/utils/format.js +220 -0
  404. package/dist/vite/index.d.ts +16 -0
  405. package/dist/vite/index.js +52 -0
  406. package/dist/widget/Widget.d.ts +164 -48
  407. package/dist/widget/Widget.js +335 -96
  408. package/dist/widget/WidgetGroup.d.ts +36 -0
  409. package/dist/widget/WidgetGroup.js +103 -0
  410. package/package.json +855 -157
  411. package/dist/accordion/Accordion.d.ts +0 -54
  412. package/dist/accordion/Accordion.js +0 -183
  413. package/dist/assets/components/GalaxyFilamentWordmarkDark.d.ts +0 -3
  414. package/dist/assets/components/GalaxyFilamentWordmarkDark.js +0 -14
  415. package/dist/assets/components/GalaxyFilamentWordmarkLight.d.ts +0 -3
  416. package/dist/assets/components/GalaxyFilamentWordmarkLight.js +0 -14
  417. package/dist/assets/components/GalaxyLogomarkDark.d.ts +0 -3
  418. package/dist/assets/components/GalaxyLogomarkDark.js +0 -11
  419. package/dist/assets/components/GalaxyLogomarkLight.d.ts +0 -3
  420. package/dist/assets/components/GalaxyLogomarkLight.js +0 -17
  421. package/dist/assets/components/GalaxyWordmarkDark.d.ts +0 -3
  422. package/dist/assets/components/GalaxyWordmarkDark.js +0 -15
  423. package/dist/assets/components/GalaxyWordmarkLight.d.ts +0 -3
  424. package/dist/assets/components/GalaxyWordmarkLight.js +0 -28
  425. package/dist/assets/models/galaxy-animation.js +0 -136666
  426. package/dist/assets/models/galaxy-logomark.js +0 -4
  427. package/dist/avatar/AvatarShimmer.d.ts +0 -30
  428. package/dist/avatar/AvatarShimmer.js +0 -22
  429. package/dist/backgrounds/CellGridBackground.d.ts +0 -24
  430. package/dist/backgrounds/CellGridBackground.js +0 -44
  431. package/dist/backgrounds/CrossGridBackground.d.ts +0 -26
  432. package/dist/backgrounds/CrossGridBackground.js +0 -49
  433. package/dist/backgrounds/DotGridBackground.d.ts +0 -24
  434. package/dist/backgrounds/DotGridBackground.js +0 -47
  435. package/dist/badge/Badge.d.ts +0 -42
  436. package/dist/badge/Badge.js +0 -99
  437. package/dist/charts/ChartEmptyState.d.ts +0 -17
  438. package/dist/charts/ChartEmptyState.js +0 -29
  439. package/dist/charts/ProgressBar.d.ts +0 -29
  440. package/dist/charts/ProgressBar.js +0 -65
  441. package/dist/charts/chartTheme.d.ts +0 -18
  442. package/dist/charts/chartTheme.js +0 -26
  443. package/dist/containers/FlexItem.d.ts +0 -50
  444. package/dist/containers/FlexItem.js +0 -91
  445. package/dist/containers/FlexWrapper.d.ts +0 -96
  446. package/dist/containers/FlexWrapper.js +0 -143
  447. package/dist/containers/GridWrapper.d.ts +0 -79
  448. package/dist/containers/GridWrapper.js +0 -125
  449. package/dist/containers/Spacing.d.ts +0 -23
  450. package/dist/containers/Spacing.js +0 -59
  451. package/dist/containers/Wrapper.d.ts +0 -26
  452. package/dist/containers/Wrapper.js +0 -54
  453. package/dist/dividers/HorizontalDivider.d.ts +0 -7
  454. package/dist/dividers/HorizontalDivider.js +0 -39
  455. package/dist/dividers/VerticalDivider.d.ts +0 -6
  456. package/dist/dividers/VerticalDivider.js +0 -21
  457. package/dist/icons/GalaxyFilamentWordmark.d.ts +0 -11
  458. package/dist/icons/GalaxyFilamentWordmark.js +0 -25
  459. package/dist/icons/GalaxyLogomark.d.ts +0 -13
  460. package/dist/icons/GalaxyLogomark.js +0 -27
  461. package/dist/icons/GalaxyLogomark3D.d.ts +0 -56
  462. package/dist/icons/GalaxyLogomark3D.js +0 -319
  463. package/dist/icons/GalaxyLogomarkAnimation.d.ts +0 -18
  464. package/dist/icons/GalaxyLogomarkAnimation.js +0 -48
  465. package/dist/icons/GalaxyWordmark.d.ts +0 -11
  466. package/dist/icons/GalaxyWordmark.js +0 -25
  467. package/dist/inputs/MultiTextInput.d.ts +0 -32
  468. package/dist/inputs/MultiTextInput.js +0 -180
  469. package/dist/inputs/SwitcherInput.d.ts +0 -30
  470. package/dist/inputs/SwitcherInput.js +0 -81
  471. package/dist/inputs/hooks.d.ts +0 -10
  472. package/dist/inputs/hooks.js +0 -22
  473. package/dist/overlay/constants.d.ts +0 -28
  474. package/dist/overlay/constants.js +0 -37
  475. package/dist/resizable/HorizontalResizeHandle.d.ts +0 -17
  476. package/dist/resizable/HorizontalResizeHandle.js +0 -38
  477. package/dist/resizable/VerticalResizeHandle.d.ts +0 -18
  478. package/dist/resizable/VerticalResizeHandle.js +0 -39
  479. package/dist/table/SpreadsheetCell.d.ts +0 -21
  480. package/dist/table/SpreadsheetCell.js +0 -71
  481. package/dist/table/SpreadsheetHeaderCell.d.ts +0 -23
  482. package/dist/table/SpreadsheetHeaderCell.js +0 -91
  483. package/dist/table/SpreadsheetMenuItem.d.ts +0 -14
  484. package/dist/table/SpreadsheetMenuItem.js +0 -33
  485. package/dist/table/SpreadsheetPrimitives.d.ts +0 -172
  486. package/dist/table/SpreadsheetPrimitives.js +0 -105
  487. package/dist/table/SpreadsheetRow.d.ts +0 -33
  488. package/dist/table/SpreadsheetRow.js +0 -73
  489. package/dist/table/SpreadsheetRowActionCell.d.ts +0 -14
  490. package/dist/table/SpreadsheetRowActionCell.js +0 -51
  491. package/dist/table/TableExpandCell.d.ts +0 -11
  492. package/dist/table/TableExpandCell.js +0 -24
  493. package/dist/table/TableExpandedRow.d.ts +0 -16
  494. package/dist/table/TableExpandedRow.js +0 -77
  495. package/dist/table/TableHeaderCellContent.d.ts +0 -30
  496. package/dist/table/TableHeaderCellContent.js +0 -48
  497. package/dist/table/TablePrimitives.d.ts +0 -313
  498. package/dist/table/TablePrimitives.js +0 -302
  499. package/dist/table/TableSelectCell.d.ts +0 -18
  500. package/dist/table/TableSelectCell.js +0 -27
  501. package/dist/table/TableStatusRow.d.ts +0 -18
  502. package/dist/table/TableStatusRow.js +0 -50
  503. package/dist/table/useSpreadsheetEditing.d.ts +0 -13
  504. package/dist/table/useSpreadsheetEditing.js +0 -41
  505. package/dist/table/useTableColumnResize.d.ts +0 -38
  506. package/dist/table/useTableColumnResize.js +0 -155
  507. package/dist/table/useTableRowExpansion.d.ts +0 -24
  508. package/dist/table/useTableRowExpansion.js +0 -62
  509. package/dist/table/utils.d.ts +0 -50
  510. package/dist/table/utils.js +0 -78
  511. package/dist/text/HotKeys.d.ts +0 -30
  512. package/dist/text/HotKeys.js +0 -74
  513. package/dist/text/Paragraph.d.ts +0 -33
  514. package/dist/text/Paragraph.js +0 -83
  515. package/dist/text/TextShimmer.d.ts +0 -14
  516. package/dist/text/TextShimmer.js +0 -34
  517. package/dist/theme/GalaxyTheme.d.ts +0 -67
  518. package/dist/theme/GalaxyTheme.js +0 -119
  519. package/dist/theme/constants.d.ts +0 -8
  520. package/dist/theme/constants.js +0 -38
  521. package/dist/theme/index.d.ts +0 -6
  522. package/dist/theme/index.js +0 -7
  523. package/dist/theme/types.d.ts +0 -195
  524. package/dist/theme/types.js +0 -10
  525. package/dist/theme/typography.d.ts +0 -2
  526. package/dist/theme/typography.js +0 -73
  527. package/dist/theme/variants/dark.d.ts +0 -2
  528. package/dist/theme/variants/dark.js +0 -125
  529. package/dist/theme/variants/light.d.ts +0 -2
  530. package/dist/theme/variants/light.js +0 -125
  531. package/dist/toast/ToastContainer.d.ts +0 -10
  532. package/dist/toast/ToastContainer.js +0 -31
  533. package/dist/toast/ToastWrapper.d.ts +0 -6
  534. package/dist/toast/ToastWrapper.js +0 -27
  535. package/dist/transform/Flash.d.ts +0 -7
  536. package/dist/transform/Flash.js +0 -18
  537. package/dist/transform/Spin.d.ts +0 -14
  538. package/dist/transform/Spin.js +0 -25
  539. package/dist/utils/linaria.d.ts +0 -1
  540. package/dist/utils/linaria.js +0 -8
@@ -0,0 +1,1082 @@
1
+ import { useIsomorphicLayoutEffect } from "../hooks/useIsomorphicLayoutEffect.js";
2
+ import VisuallyHidden from "../a11y/VisuallyHidden.js";
3
+ import Skeleton, { SkeletonSize, SkeletonVariant } from "../feedback/Skeleton.js";
4
+ import { FontFamily, Orientation, Placement, Side } from "../theme/enums.js";
5
+ import Text, { TextSize, TextVariant, TextWeight } from "../text/Text.js";
6
+ import { CONTROL_SIZE, SPACE } from "../theme/tokens/scales.js";
7
+ import { t } from "../theme/tokens/t.js";
8
+ import Icon, { IconVariant } from "../icons/Icon.js";
9
+ import Rotate from "../transform/Rotate.js";
10
+ import Button, { ButtonSize, ButtonVariant } from "../buttons/Button.js";
11
+ import EmptyState, { EmptyStateSize } from "../feedback/EmptyState.js";
12
+ import { useElementClientSize } from "../hooks/useElementClientSize.js";
13
+ import { formatNumber } from "../utils/format.js";
14
+ import ResizeHandle from "../layout/ResizeHandle.js";
15
+ import CheckboxInput, { CheckboxInputSize } from "../inputs/CheckboxInput.js";
16
+ import Menu, { MenuCheckboxItem, MenuGroup, MenuItem, MenuSeparator, MenuSize } from "../menu/Menu.js";
17
+ import { useInfiniteScrollSentinel } from "./useInfiniteScrollSentinel.js";
18
+ /* empty css */
19
+ import { styled } from "@linaria/react";
20
+ import { memo, useCallback, useEffect, useRef, useState } from "react";
21
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
22
+ import { cx } from "@linaria/core";
23
+ import { useMergeRefs } from "@floating-ui/react";
24
+ import { ArrowDownIcon, ArrowUpIcon, ArrowsDownUpIcon, CaretRightIcon, DotsThreeIcon, DotsThreeVerticalIcon, SlidersHorizontalIcon, WarningCircleIcon } from "@phosphor-icons/react";
25
+ //#region src/table/TableCore.tsx
26
+ /**
27
+ * @internal Shared by the table components; apps use InfiniteTable, VirtualizedInfiniteTable or
28
+ * InfiniteSpreadsheet.
29
+ *
30
+ * The table core: size metrics, the styled parts (root → scroll container → `<table>` → header,
31
+ * body, footer and status row groups → sentinel → live region), the header cell (sort, column
32
+ * actions, resize handle, drag to reorder), the body row and its synthetic cells (select, expand,
33
+ * row actions), skeleton, status and expanded rows, the Columns menu and the default cell text.
34
+ * Nothing here imports an optional peer (`@tanstack/react-table`, `@tanstack/react-virtual`).
35
+ *
36
+ * The `<table>` parts are laid out with flex (1.x), which strips their implicit roles: every
37
+ * part sets its `role`. Column widths reach cells only through custom properties on the root, so
38
+ * resizing a column re-renders no row.
39
+ */
40
+ /** `onEndReached` fires when the last row comes within this many pixels of view. */
41
+ var TABLE_END_REACHED_MARGIN_PX = 500;
42
+ /** Skeleton rows shown in place of an empty body while the first page loads. */
43
+ var TABLE_LOADING_ROW_COUNT = 5;
44
+ /** Skeleton rows shown after the last row while more rows load. */
45
+ var TABLE_LOADING_MORE_ROW_COUNT = 3;
46
+ /** Smallest column width when a column sets none (1.x). */
47
+ var TABLE_DEFAULT_MIN_COLUMN_WIDTH = 60;
48
+ /** Largest resize width when a column sets none (1.x). */
49
+ var TABLE_DEFAULT_MAX_COLUMN_WIDTH = 800;
50
+ /** Width of a pinned column that sets no `width` (1.x); a dev warning asks for one. */
51
+ var TABLE_PINNED_FALLBACK_WIDTH = 150;
52
+ /** Horizontal pointer travel before a header press becomes a column drag: `space[4]`. */
53
+ var TABLE_DRAG_THRESHOLD_PX = Number.parseFloat(SPACE[4]);
54
+ /** Rows rendered above and below the visible window of a virtual body. */
55
+ var VIRTUAL_OVERSCAN = 10;
56
+ /** Local stacking inside the root's `isolation: isolate`; never competes with `t.z` layers. */
57
+ /** @internal Stacking of pinned cells (and the spreadsheet's editing cell). */
58
+ var TABLE_Z_PINNED = 1;
59
+ /** @internal True outside production builds (read through `process.env.NODE_ENV`). */
60
+ function isDevelopment() {
61
+ try {
62
+ return process.env.NODE_ENV !== "production";
63
+ } catch {
64
+ return false;
65
+ }
66
+ }
67
+ var px = (value) => Number.parseFloat(value);
68
+ /** @internal 32px rows, 32px header, body_sm. */
69
+ var TABLE_SMALL_METRICS = {
70
+ css: "gx-TableCore-css-c13wyidj",
71
+ rowHeightPx: px(CONTROL_SIZE.small) + 2 * px(SPACE[4]),
72
+ headerHeightPx: px(CONTROL_SIZE.small) + 2 * px(SPACE[4]),
73
+ textSize: TextSize.BODY_SM,
74
+ headerIconPx: 12,
75
+ caretPx: 10,
76
+ checkboxSize: CheckboxInputSize.SMALL,
77
+ buttonSize: ButtonSize.X_SMALL,
78
+ skeletonSize: SkeletonSize.SMALL,
79
+ menuSize: MenuSize.SMALL,
80
+ emptyStateSize: EmptyStateSize.SMALL
81
+ };
82
+ /** @internal 48px rows, 40px header, body_md. */
83
+ var TABLE_MEDIUM_METRICS = {
84
+ css: "gx-TableCore-css-c1bvr8n5",
85
+ rowHeightPx: px(CONTROL_SIZE.medium) + 2 * px(SPACE[8]),
86
+ headerHeightPx: px(CONTROL_SIZE.medium) + 2 * px(SPACE[4]),
87
+ textSize: TextSize.BODY_MD,
88
+ headerIconPx: 14,
89
+ caretPx: 10,
90
+ checkboxSize: CheckboxInputSize.MEDIUM,
91
+ buttonSize: ButtonSize.SMALL,
92
+ skeletonSize: SkeletonSize.MEDIUM,
93
+ menuSize: MenuSize.SMALL,
94
+ emptyStateSize: EmptyStateSize.MEDIUM
95
+ };
96
+ /** @internal 52px rows, 44px header, body_lg. */
97
+ var TABLE_LARGE_METRICS = {
98
+ css: "gx-TableCore-css-c9bne0h",
99
+ rowHeightPx: px(CONTROL_SIZE.large) + 2 * px(SPACE[8]),
100
+ headerHeightPx: px(CONTROL_SIZE.large) + 2 * px(SPACE[4]),
101
+ textSize: TextSize.BODY_LG,
102
+ headerIconPx: 14,
103
+ caretPx: 12,
104
+ checkboxSize: CheckboxInputSize.LARGE,
105
+ buttonSize: ButtonSize.MEDIUM,
106
+ skeletonSize: SkeletonSize.LARGE,
107
+ menuSize: MenuSize.MEDIUM,
108
+ emptyStateSize: EmptyStateSize.MEDIUM
109
+ };
110
+ /** Fills a bounded parent and scrolls inside it; in an unbounded parent it grows with its rows. */
111
+ var Root = /*#__PURE__*/ styled("div")({
112
+ name: "Root",
113
+ class: "gx-TableCore-rbflrbk",
114
+ propsAsIs: false
115
+ });
116
+ /** The scrollport. Not focusable: its rows and controls are. */
117
+ var Scroll = /*#__PURE__*/ styled("div")({
118
+ name: "Scroll",
119
+ class: "gx-TableCore-Scroll-szfxg1j",
120
+ propsAsIs: false
121
+ });
122
+ /** A flex column, so the status row group can fill a bounded scrollport. */
123
+ var TableElement = /*#__PURE__*/ styled("table")({
124
+ name: "TableElement",
125
+ class: "gx-TableCore-TableElement-t10fh5j2",
126
+ propsAsIs: false
127
+ });
128
+ var Head = /*#__PURE__*/ styled("thead")({
129
+ name: "Head",
130
+ class: "gx-TableCore-Head-hij68rq",
131
+ propsAsIs: false
132
+ });
133
+ var Body = /*#__PURE__*/ styled("tbody")({
134
+ name: "Body",
135
+ class: "gx-TableCore-Body-b1seyvh2",
136
+ propsAsIs: false
137
+ });
138
+ /** Skeleton, empty, error and end-error rows; grows to fill a bounded scrollport. */
139
+ var StatusBody = /*#__PURE__*/ styled("tbody")({
140
+ name: "StatusBody",
141
+ class: "gx-TableCore-StatusBody-sf09csv",
142
+ propsAsIs: false
143
+ });
144
+ var Foot = /*#__PURE__*/ styled("tfoot")({
145
+ name: "Foot",
146
+ class: "gx-TableCore-Foot-f1loheb3",
147
+ propsAsIs: false
148
+ });
149
+ var HeaderRow = /*#__PURE__*/ styled("tr")({
150
+ name: "HeaderRow",
151
+ class: "gx-TableCore-HeaderRow-h1650vjz",
152
+ propsAsIs: false
153
+ });
154
+ var FooterRow = /*#__PURE__*/ styled("tr")({
155
+ name: "FooterRow",
156
+ class: "gx-TableCore-FooterRow-f3prmx7",
157
+ propsAsIs: false
158
+ });
159
+ /** @internal A body row. States are classes (`ROW_*_CSS`). */
160
+ var TableRow = /*#__PURE__*/ styled("tr")({
161
+ name: "TableRow",
162
+ class: "gx-TableCore-TableRow-t18zsjxh",
163
+ propsAsIs: false
164
+ });
165
+ /** @internal A body or footer cell. */
166
+ var TableCell = /*#__PURE__*/ styled("td")({
167
+ name: "TableCell",
168
+ class: "gx-TableCore-TableCell-t1f7xxie",
169
+ propsAsIs: false
170
+ });
171
+ /** A header cell: not clipped, so the resize handle can straddle the column edge. */
172
+ var HeaderCell = /*#__PURE__*/ styled("th")({
173
+ name: "HeaderCell",
174
+ class: "gx-TableCore-HeaderCell-h1n0v2ch",
175
+ propsAsIs: false
176
+ });
177
+ /** The press target of a sortable or movable column: label and sort icon. */
178
+ var HeaderButton = /*#__PURE__*/ styled("button")({
179
+ name: "HeaderButton",
180
+ class: "gx-TableCore-HeaderButton-h1nswbdd",
181
+ propsAsIs: false
182
+ });
183
+ /** The label of a column that cannot be pressed. */
184
+ var HeaderLabel = /*#__PURE__*/ styled("span")({
185
+ name: "HeaderLabel",
186
+ class: "gx-TableCore-HeaderLabel-hc3y207",
187
+ propsAsIs: false
188
+ });
189
+ /** Marks the gap a dragged column would land in. */
190
+ var DropIndicator = /*#__PURE__*/ styled("span")({
191
+ name: "DropIndicator",
192
+ class: "gx-TableCore-DropIndicator-d1po1i5a",
193
+ propsAsIs: false
194
+ });
195
+ /**
196
+ * Follows the table, inside the scroll container; observed for `onEndReached`. Zero height: a 1px
197
+ * sentinel made every table overflow its scroll box by a pixel, so the wheel scrolled that pixel
198
+ * and a trackpad gesture latched onto the table instead of scrolling the page.
199
+ * `IntersectionObserver` reports a zero-area target that touches the root's edge.
200
+ */
201
+ var Sentinel = /*#__PURE__*/ styled("div")({
202
+ name: "Sentinel",
203
+ class: "gx-TableCore-Sentinel-scxvgum",
204
+ propsAsIs: false
205
+ });
206
+ /** The visible width of an empty or error body, pinned while the table scrolls sideways. */
207
+ var StatusViewport = /*#__PURE__*/ styled("div")({
208
+ name: "StatusViewport",
209
+ class: "gx-TableCore-StatusViewport-s7ul01a",
210
+ propsAsIs: false
211
+ });
212
+ /** The end error row's content: icon and message, sticky like the status viewport. */
213
+ var EndErrorViewport = /*#__PURE__*/ styled("div")({
214
+ name: "EndErrorViewport",
215
+ class: "gx-TableCore-EndErrorViewport-e1qemn2d",
216
+ propsAsIs: false
217
+ });
218
+ var StatusRowElement = /*#__PURE__*/ styled("tr")({
219
+ name: "StatusRowElement",
220
+ class: "gx-TableCore-StatusRowElement-sjip7oh",
221
+ propsAsIs: false
222
+ });
223
+ var StatusCell = /*#__PURE__*/ styled("td")({
224
+ name: "StatusCell",
225
+ class: "gx-TableCore-StatusCell-s1cfdxs6",
226
+ propsAsIs: false
227
+ });
228
+ var EndErrorRow = /*#__PURE__*/ styled("tr")({
229
+ name: "EndErrorRow",
230
+ class: "gx-TableCore-EndErrorRow-elttqlf",
231
+ propsAsIs: false
232
+ });
233
+ var ExpandedRowElement = /*#__PURE__*/ styled("tr")({
234
+ name: "ExpandedRowElement",
235
+ class: "gx-TableCore-ExpandedRowElement-e60f67l",
236
+ propsAsIs: false
237
+ });
238
+ var ExpandedCell = /*#__PURE__*/ styled("td")({
239
+ name: "ExpandedCell",
240
+ class: "gx-TableCore-ExpandedCell-e1xg4fvx",
241
+ propsAsIs: false
242
+ });
243
+ /** Pinned to the visible width while the table scrolls sideways; the gutter lines up with the expand column. */
244
+ var ExpandedViewport = /*#__PURE__*/ styled("div")({
245
+ name: "ExpandedViewport",
246
+ class: "gx-TableCore-ExpandedViewport-e13bd0ox",
247
+ propsAsIs: false
248
+ });
249
+ var ExpandedGutter = /*#__PURE__*/ styled("div")({
250
+ name: "ExpandedGutter",
251
+ class: "gx-TableCore-ExpandedGutter-enk7ldu",
252
+ propsAsIs: false
253
+ });
254
+ var ExpandedBody = /*#__PURE__*/ styled("div")({
255
+ name: "ExpandedBody",
256
+ class: "gx-TableCore-ExpandedBody-e1yoeixn",
257
+ propsAsIs: false
258
+ });
259
+ /**
260
+ * The parent paints nothing: the table paints the surface found further up (`--gx-table-surface`,
261
+ * set by `useTableSurface`) so its sticky parts stay opaque.
262
+ */
263
+ var SURFACE_ANCESTOR_CSS = "gx-TableCore-SURFACE_ANCESTOR_CSS-s18ghmlo";
264
+ /** @internal Select, expand and row-actions columns: a square of the row height, content centered. */
265
+ var SYNTHETIC_CELL_CSS = "gx-TableCore-SYNTHETIC_CELL_CSS-s1g01kh5";
266
+ /** @internal Alignment of a column's header and cells. */
267
+ var COLUMN_ALIGN_TO_CSS_MAP = {
268
+ left: "gx-TableCore-left-l1qwxx34",
269
+ center: "gx-TableCore-center-c152j0h",
270
+ right: "gx-TableCore-right-r1y0un5j"
271
+ };
272
+ /** @internal Sticky to an edge while the table scrolls sideways. */
273
+ var PIN_TO_CSS_MAP = {
274
+ [Side.LEFT]: "gx-TableCore-Side_LEFT-s1dzycrm",
275
+ [Side.RIGHT]: "gx-TableCore-Side_RIGHT-s6wh2p6"
276
+ };
277
+ /** @internal The edge hairline of the last left-pinned / first right-pinned data column. */
278
+ var PIN_TO_EDGE_CSS_MAP = {
279
+ [Side.LEFT]: "gx-TableCore-Side_LEFT-s1imw0tm",
280
+ [Side.RIGHT]: "gx-TableCore-Side_RIGHT-s1swk4bm"
281
+ };
282
+ /** Pinned header cells stack above pinned body cells and the sticky header. */
283
+ var PINNED_HEADER_CSS = "gx-TableCore-PINNED_HEADER_CSS-p14t0x1z";
284
+ /** The row does something: pointer and a hover fill. */
285
+ var ROW_INTERACTIVE_CSS = "gx-TableCore-ROW_INTERACTIVE_CSS-r1nurjwh";
286
+ /** A selected row: `background.selected`. Declared after the interactive state so it holds on hover. */
287
+ var ROW_SELECTED_CSS = "gx-TableCore-ROW_SELECTED_CSS-r1g7lrfg";
288
+ /** The current row (`activeRowId`): a fill and the `text.primary` bar of active navigation. */
289
+ var ROW_ACTIVE_CSS = "gx-TableCore-ROW_ACTIVE_CSS-r10dstoh";
290
+ /** @internal The last row, or a row whose panel is open: no bottom hairline. */
291
+ var ROW_NO_BORDER_CSS = "gx-TableCore-ROW_NO_BORDER_CSS-rpsswqs";
292
+ /** The last expanded panel: no bottom hairline. */
293
+ var EXPANDED_LAST_CSS = "gx-TableCore-EXPANDED_LAST_CSS-ewbqwrq";
294
+ /** The dragged header while reordering. 0.5 is a state, not a color token. */
295
+ var HEADER_DRAGGING_CSS = "gx-TableCore-HEADER_DRAGGING_CSS-h1jxalmm";
296
+ /** The label wrapper grows when a trailing control (column actions) follows it. */
297
+ var LABEL_GROW_CSS = "gx-TableCore-LABEL_GROW_CSS-l1fx3qlj";
298
+ var DROP_START_CSS = "gx-TableCore-DROP_START_CSS-d2nd1ne";
299
+ var DROP_END_CSS = "gx-TableCore-DROP_END_CSS-darqcf0";
300
+ /** Shows on hover, while dragged and on keyboard focus; straddles the column edge. */
301
+ var COLUMN_RESIZE_HANDLE_CSS = "gx-TableCore-COLUMN_RESIZE_HANDLE_CSS-c132cb1v";
302
+ /** Hovering a header cell reveals its resize handle. */
303
+ var HEADER_HOVER_CSS = "gx-TableCore-HEADER_HOVER_CSS-h1vn45v6";
304
+ /** The expand caret button: a square of its rung. */
305
+ var EXPAND_BUTTON_CSS = "gx-TableCore-EXPAND_BUTTON_CSS-e14za3v2";
306
+ /** @internal A virtual body: as tall as every row, which are positioned inside it. */
307
+ var VIRTUAL_BODY_CSS = "gx-TableCore-VIRTUAL_BODY_CSS-v1w0t3ir";
308
+ /** @internal A virtual row, placed at `--gx-table-row-start`. */
309
+ var VIRTUAL_ROW_CSS = "gx-TableCore-VIRTUAL_ROW_CSS-vb9km4t";
310
+ /** @internal Default cells and footer strings: shrink to truncate. */
311
+ var CELL_TEXT_CSS = "gx-TableCore-CELL_TEXT_CSS-c1emgwoo";
312
+ /** "Oct 3, 2026": the DateInput default. */
313
+ var DATE_FORMAT_OPTIONS = { dateStyle: "medium" };
314
+ /** @internal The default cell renderer: one truncating line of formatted text. */
315
+ function TableCellText({ value, textSize }) {
316
+ if (value === null || value === void 0 || value === "") return /* @__PURE__ */ jsx(Text, {
317
+ as: "span",
318
+ size: textSize,
319
+ variant: TextVariant.TERTIARY,
320
+ children: "—"
321
+ });
322
+ const isNumeric = typeof value === "number" || typeof value === "bigint";
323
+ let text;
324
+ if (typeof value === "number") text = formatNumber(value);
325
+ else if (typeof value === "bigint") text = value.toLocaleString();
326
+ else if (typeof value === "boolean") text = value ? "Yes" : "No";
327
+ else if (value instanceof Date) text = new Intl.DateTimeFormat(void 0, DATE_FORMAT_OPTIONS).format(value);
328
+ else text = String(value);
329
+ return /* @__PURE__ */ jsx(Text, {
330
+ as: "span",
331
+ size: textSize,
332
+ lineClamp: 1,
333
+ shouldTooltipOnOverflow: true,
334
+ className: CELL_TEXT_CSS,
335
+ ...isNumeric ? { family: FontFamily.MONO } : {},
336
+ children: text
337
+ });
338
+ }
339
+ /** @internal One column header: label (sort / drag button), sort icon, column actions, resize handle. */
340
+ function TableHeaderCell({ resolved, metrics, sortState, isCustomizable, width, dropEdge, isDragged, colIndex, onSortPress, onResize, onLabelKeyDown, onLabelPointerDown, onLabelPointerMove, onLabelPointerUp, onLabelPointerCancel, onLabelClickCapture, registerCell, registerButton }) {
341
+ const { column, pin, isPinEdge, canResize, minWidth, maxWidth, cellStyle } = resolved;
342
+ const align = column.align ?? "left";
343
+ const canSort = column.canSort === true;
344
+ const isButton = canSort || isCustomizable;
345
+ const hasActions = column.actions !== void 0 && column.actions !== null;
346
+ const id = column.id;
347
+ const cellRef = useCallback((element) => registerCell(id, element), [id, registerCell]);
348
+ const buttonRef = useCallback((element) => registerButton(id, element), [id, registerButton]);
349
+ const sortIcon = sortState === void 0 ? null : /* @__PURE__ */ jsx(Icon, {
350
+ component: sortState === "ascending" ? ArrowUpIcon : sortState === "descending" ? ArrowDownIcon : ArrowsDownUpIcon,
351
+ size: metrics.headerIconPx,
352
+ variant: sortState === "none" ? IconVariant.TERTIARY : IconVariant.SECONDARY,
353
+ "aria-hidden": true
354
+ });
355
+ const label = /* @__PURE__ */ jsx(Text, {
356
+ as: "span",
357
+ size: metrics.textSize,
358
+ weight: TextWeight.MEDIUM,
359
+ variant: TextVariant.TERTIARY,
360
+ lineClamp: 1,
361
+ shouldTooltipOnOverflow: true,
362
+ className: CELL_TEXT_CSS,
363
+ children: column.header
364
+ });
365
+ const labelClassName = cx(COLUMN_ALIGN_TO_CSS_MAP[align], hasActions && LABEL_GROW_CSS);
366
+ return /* @__PURE__ */ jsxs(HeaderCell, {
367
+ ref: cellRef,
368
+ role: "columnheader",
369
+ ...sortState === void 0 ? {} : { "aria-sort": sortState },
370
+ ...colIndex === void 0 ? {} : { "aria-colindex": colIndex },
371
+ className: cx(COLUMN_ALIGN_TO_CSS_MAP[align], pin !== void 0 && PIN_TO_CSS_MAP[pin], pin !== void 0 && PINNED_HEADER_CSS, pin !== void 0 && isPinEdge && PIN_TO_EDGE_CSS_MAP[pin], canResize && HEADER_HOVER_CSS, isDragged && HEADER_DRAGGING_CSS),
372
+ style: cellStyle,
373
+ children: [
374
+ isButton ? /* @__PURE__ */ jsxs(HeaderButton, {
375
+ ref: buttonRef,
376
+ type: "button",
377
+ className: labelClassName,
378
+ onClick: canSort ? () => onSortPress(id) : void 0,
379
+ onClickCapture: onLabelClickCapture,
380
+ onKeyDown: (event) => onLabelKeyDown(id, event),
381
+ ...isCustomizable && pin === void 0 ? {
382
+ onPointerDown: (event) => onLabelPointerDown(id, event),
383
+ onPointerMove: onLabelPointerMove,
384
+ onPointerUp: onLabelPointerUp,
385
+ onPointerCancel: onLabelPointerCancel
386
+ } : {},
387
+ children: [label, sortIcon]
388
+ }) : /* @__PURE__ */ jsxs(HeaderLabel, {
389
+ className: labelClassName,
390
+ children: [label, sortIcon]
391
+ }),
392
+ hasActions && /* @__PURE__ */ jsx(Menu, {
393
+ trigger: /* @__PURE__ */ jsx(Button, {
394
+ icon: DotsThreeVerticalIcon,
395
+ variant: ButtonVariant.TERTIARY,
396
+ size: metrics.buttonSize,
397
+ ariaLabel: `${column.header} column actions`
398
+ }),
399
+ size: metrics.menuSize,
400
+ placement: Placement.BOTTOM_END,
401
+ children: column.actions
402
+ }),
403
+ canResize && /* @__PURE__ */ jsx(ResizeHandle, {
404
+ orientation: Orientation.VERTICAL,
405
+ value: width,
406
+ min: minWidth,
407
+ max: maxWidth,
408
+ onChange: (next) => onResize(id, next),
409
+ ariaLabel: `Resize ${column.header} column`,
410
+ className: COLUMN_RESIZE_HANDLE_CSS
411
+ }),
412
+ dropEdge !== null && /* @__PURE__ */ jsx(DropIndicator, {
413
+ "aria-hidden": true,
414
+ className: dropEdge === "start" ? DROP_START_CSS : DROP_END_CSS
415
+ })
416
+ ]
417
+ });
418
+ }
419
+ /** @internal The trailing corner's Columns menu: show / hide each column, reset the layout. */
420
+ function TableColumnsMenu({ entries, metrics, onToggle, onReset }) {
421
+ return /* @__PURE__ */ jsxs(Menu, {
422
+ trigger: /* @__PURE__ */ jsx(Button, {
423
+ icon: SlidersHorizontalIcon,
424
+ variant: ButtonVariant.TERTIARY,
425
+ size: metrics.buttonSize,
426
+ ariaLabel: "Columns"
427
+ }),
428
+ size: metrics.menuSize,
429
+ placement: Placement.BOTTOM_END,
430
+ children: [
431
+ /* @__PURE__ */ jsx(MenuGroup, {
432
+ label: "Columns",
433
+ children: entries.map((entry) => /* @__PURE__ */ jsx(MenuCheckboxItem, {
434
+ label: entry.header,
435
+ isChecked: entry.isVisible,
436
+ onChange: (isChecked) => onToggle(entry.id, isChecked),
437
+ isDisabled: entry.disabledReason !== void 0,
438
+ ...entry.disabledReason === void 0 ? {} : { disabledReason: entry.disabledReason }
439
+ }, entry.id))
440
+ }),
441
+ /* @__PURE__ */ jsx(MenuSeparator, {}),
442
+ /* @__PURE__ */ jsx(MenuItem, {
443
+ label: "Reset columns",
444
+ onSelect: onReset
445
+ })
446
+ ]
447
+ });
448
+ }
449
+ /** Spread on a built-in control outside the roving row: reachable by pointer, not by Tab. */
450
+ var UNTABBABLE = { tabIndex: -1 };
451
+ /** Clicks on these, inside a row, never activate the row. */
452
+ var INTERACTIVE_SELECTOR = "a[href], button, input, select, textarea, [role=\"button\"], [role=\"link\"], [role=\"checkbox\"]";
453
+ /** @internal One body row with its synthetic and data cells. Memoized: every prop is stable or primitive. */
454
+ var TableBodyRow = memo(function TableBodyRow({ row, rowIndex, rowId, columns, metrics, callbacks, cellRole, isFocusable, isTabStop, isClickable, isBorderless, isActive, isSelected, hasExpandColumn, isExpanded, panelId, hasTrailingColumn, isActionsOpen, ariaRowIndex, hasColIndex, className, style }) {
455
+ const shiftRef = useRef(false);
456
+ const rowRef = useCallback((element) => callbacks.registerRow(rowIndex, element), [callbacks, rowIndex]);
457
+ const isSelectable = isSelected !== void 0;
458
+ const controlProps = isTabStop ? {} : UNTABBABLE;
459
+ const rowName = callbacks.getRowName(row, rowIndex);
460
+ const actions = hasTrailingColumn && callbacks.getRowActions ? callbacks.getRowActions(row, rowIndex) : null;
461
+ let colIndex = 0;
462
+ const nextColIndex = () => {
463
+ colIndex += 1;
464
+ return hasColIndex ? { "aria-colindex": colIndex } : {};
465
+ };
466
+ const handleClick = (event) => {
467
+ if (!isClickable || callbacks.onRowClick === void 0) return;
468
+ const target = event.target;
469
+ if (!event.currentTarget.contains(target)) return;
470
+ const control = target.closest(INTERACTIVE_SELECTOR);
471
+ if (control !== null && event.currentTarget.contains(control) && control !== event.currentTarget) return;
472
+ callbacks.onRowClick(row, event);
473
+ };
474
+ const handleFocus = (event) => {
475
+ if (!event.currentTarget.contains(event.target)) return;
476
+ callbacks.onRowFocus(rowIndex);
477
+ };
478
+ const handleKeyDown = (event) => {
479
+ if (event.target !== event.currentTarget) return;
480
+ callbacks.onRowKeyDown(rowIndex, event);
481
+ };
482
+ return /* @__PURE__ */ jsxs(TableRow, {
483
+ ref: rowRef,
484
+ role: "row",
485
+ ...isFocusable ? { tabIndex: isTabStop ? 0 : -1 } : {},
486
+ ...isSelectable ? { "aria-selected": isSelected } : {},
487
+ ...isExpanded === void 0 ? {} : { "aria-expanded": isExpanded },
488
+ ...isActive ? { "aria-current": true } : {},
489
+ ...ariaRowIndex === void 0 ? {} : { "aria-rowindex": ariaRowIndex },
490
+ className: cx(isClickable && ROW_INTERACTIVE_CSS, isSelected === true && ROW_SELECTED_CSS, isActive && ROW_ACTIVE_CSS, isBorderless && "gx-TableCore-ROW_NO_BORDER_CSS-rpsswqs", className),
491
+ style,
492
+ onClick: handleClick,
493
+ onKeyDown: handleKeyDown,
494
+ onFocus: handleFocus,
495
+ children: [
496
+ isSelectable && /* @__PURE__ */ jsx(TableCell, {
497
+ role: cellRole,
498
+ ...nextColIndex(),
499
+ className: cx("gx-TableCore-SYNTHETIC_CELL_CSS-s1g01kh5", PIN_TO_CSS_MAP[Side.LEFT]),
500
+ style: syntheticOffset(0, metrics),
501
+ onClickCapture: (event) => {
502
+ shiftRef.current = event.shiftKey;
503
+ },
504
+ onClick: (event) => event.stopPropagation(),
505
+ children: /* @__PURE__ */ jsx(CheckboxInput, {
506
+ size: metrics.checkboxSize,
507
+ isChecked: isSelected,
508
+ onChange: () => {
509
+ callbacks.onToggleSelect(rowId, shiftRef.current);
510
+ shiftRef.current = false;
511
+ },
512
+ ariaLabel: `Select ${rowName}`,
513
+ ...controlProps
514
+ })
515
+ }),
516
+ hasExpandColumn && /* @__PURE__ */ jsx(TableCell, {
517
+ role: cellRole,
518
+ ...nextColIndex(),
519
+ className: cx("gx-TableCore-SYNTHETIC_CELL_CSS-s1g01kh5", PIN_TO_CSS_MAP[Side.LEFT]),
520
+ style: syntheticOffset(isSelectable ? 1 : 0, metrics),
521
+ onClick: (event) => event.stopPropagation(),
522
+ children: isExpanded !== void 0 && /* @__PURE__ */ jsx(Button, {
523
+ variant: ButtonVariant.TERTIARY,
524
+ size: metrics.buttonSize,
525
+ leading: /* @__PURE__ */ jsx(Rotate, {
526
+ isRotated: isExpanded,
527
+ deg: 90,
528
+ children: /* @__PURE__ */ jsx(Icon, {
529
+ component: CaretRightIcon,
530
+ size: metrics.caretPx,
531
+ variant: IconVariant.INHERIT
532
+ })
533
+ }),
534
+ ariaLabel: isExpanded ? "Collapse row" : "Expand row",
535
+ "aria-expanded": isExpanded,
536
+ ...isExpanded && panelId !== void 0 ? { "aria-controls": panelId } : {},
537
+ onClick: () => callbacks.onToggleExpand(rowId),
538
+ className: EXPAND_BUTTON_CSS,
539
+ ...controlProps
540
+ })
541
+ }),
542
+ columns.map((resolved) => {
543
+ const { column, pin, isPinEdge, cellStyle } = resolved;
544
+ const value = column.accessor?.(row);
545
+ const content = column.cell ? column.cell({
546
+ value,
547
+ row,
548
+ rowIndex,
549
+ rowId
550
+ }) : /* @__PURE__ */ jsx(TableCellText, {
551
+ value,
552
+ textSize: metrics.textSize
553
+ });
554
+ return /* @__PURE__ */ jsx(TableCell, {
555
+ role: column.isRowHeader === true ? "rowheader" : cellRole,
556
+ ...nextColIndex(),
557
+ className: cx(COLUMN_ALIGN_TO_CSS_MAP[column.align ?? "left"], pin !== void 0 && PIN_TO_CSS_MAP[pin], pin !== void 0 && isPinEdge && PIN_TO_EDGE_CSS_MAP[pin]),
558
+ style: cellStyle,
559
+ children: content
560
+ }, column.id);
561
+ }),
562
+ hasTrailingColumn && /* @__PURE__ */ jsx(TableCell, {
563
+ role: cellRole,
564
+ ...nextColIndex(),
565
+ className: cx("gx-TableCore-SYNTHETIC_CELL_CSS-s1g01kh5", PIN_TO_CSS_MAP[Side.RIGHT]),
566
+ style: syntheticOffset(0, metrics),
567
+ children: actions !== null && actions !== void 0 && /* @__PURE__ */ jsx(Menu, {
568
+ isOpen: isActionsOpen,
569
+ onOpenChange: (isOpen) => callbacks.onActionsOpenChange(rowId, isOpen),
570
+ trigger: /* @__PURE__ */ jsx(Button, {
571
+ icon: DotsThreeIcon,
572
+ variant: ButtonVariant.TERTIARY,
573
+ size: metrics.buttonSize,
574
+ ariaLabel: `Actions for ${rowName}`,
575
+ ...controlProps
576
+ }),
577
+ size: metrics.menuSize,
578
+ placement: Placement.BOTTOM_END,
579
+ children: actions
580
+ })
581
+ })
582
+ ]
583
+ });
584
+ });
585
+ /** The pinned offset of the k-th synthetic column from its edge. */
586
+ function syntheticOffset(index, metrics) {
587
+ return { "--gx-table-cell-offset": `${index * metrics.rowHeightPx}px` };
588
+ }
589
+ /** @internal A placeholder row: a text skeleton in each data cell, synthetic cells empty. */
590
+ function TableSkeletonRow({ columns, metrics, leadingCount, hasTrailingColumn, isBorderless, ariaRowIndex, pending, className, style }) {
591
+ return /* @__PURE__ */ jsxs(TableRow, {
592
+ role: "row",
593
+ ...pending === void 0 ? { "aria-hidden": true } : {
594
+ ref: pending.rowRef,
595
+ "aria-busy": true,
596
+ tabIndex: pending.isTabStop ? 0 : -1,
597
+ onKeyDown: (event) => {
598
+ if (event.target === event.currentTarget) pending.onKeyDown(event);
599
+ },
600
+ onFocus: pending.onFocus
601
+ },
602
+ ...ariaRowIndex === void 0 ? {} : { "aria-rowindex": ariaRowIndex },
603
+ className: cx(isBorderless && "gx-TableCore-ROW_NO_BORDER_CSS-rpsswqs", className),
604
+ style,
605
+ children: [
606
+ Array.from({ length: leadingCount }, (_, index) => /* @__PURE__ */ jsx(TableCell, {
607
+ role: "cell",
608
+ className: cx(SYNTHETIC_CELL_CSS, PIN_TO_CSS_MAP[Side.LEFT]),
609
+ style: syntheticOffset(index, metrics)
610
+ }, `leading-${index}`)),
611
+ columns.map(({ column, pin, isPinEdge, cellStyle }) => /* @__PURE__ */ jsx(TableCell, {
612
+ role: "cell",
613
+ className: cx(pin !== void 0 && PIN_TO_CSS_MAP[pin], pin !== void 0 && isPinEdge && PIN_TO_EDGE_CSS_MAP[pin]),
614
+ style: cellStyle,
615
+ children: /* @__PURE__ */ jsx(Skeleton, {
616
+ variant: SkeletonVariant.TEXT,
617
+ size: metrics.skeletonSize
618
+ })
619
+ }, column.id)),
620
+ hasTrailingColumn && /* @__PURE__ */ jsx(TableCell, {
621
+ role: "cell",
622
+ className: cx("gx-TableCore-SYNTHETIC_CELL_CSS-s1g01kh5", PIN_TO_CSS_MAP[Side.RIGHT]),
623
+ style: syntheticOffset(0, metrics)
624
+ })
625
+ ]
626
+ });
627
+ }
628
+ /** @internal An expanded row's panel, under its row, as wide as the visible area. */
629
+ function TableExpandedRow({ panelId, colSpan, gutterPx, isLast, children }) {
630
+ const variables = { "--gx-table-expanded-gutter": `${gutterPx}px` };
631
+ return /* @__PURE__ */ jsx(ExpandedRowElement, {
632
+ role: "row",
633
+ className: cx(isLast && EXPANDED_LAST_CSS),
634
+ children: /* @__PURE__ */ jsx(ExpandedCell, {
635
+ role: "cell",
636
+ colSpan,
637
+ children: /* @__PURE__ */ jsxs(ExpandedViewport, {
638
+ style: variables,
639
+ children: [/* @__PURE__ */ jsx(ExpandedGutter, {}), /* @__PURE__ */ jsx(ExpandedBody, {
640
+ id: panelId,
641
+ children
642
+ })]
643
+ })
644
+ })
645
+ });
646
+ }
647
+ /** The panel surfaces an ancestor may paint, matched by color so the table follows theme switches. */
648
+ var SURFACE_TOKENS = [
649
+ t.color.background.base,
650
+ t.color.background.primary,
651
+ t.color.background.secondary,
652
+ t.color.background.tertiary,
653
+ t.color.text.primary
654
+ ];
655
+ var isTransparentColor = (color) => color === "" || color === "transparent" || /^rgba\(.*,\s*0\)$/.test(color);
656
+ /**
657
+ * `null` when the parent paints a surface (the root inherits it); otherwise the value for
658
+ * `--gx-table-surface`: the nearest painted ancestor below the theme root, as its background token
659
+ * when its color matches one (so a theme switch needs no re-measure), else its computed color;
660
+ * `background.base` when nothing below the theme root paints.
661
+ *
662
+ * Measured in a passive effect, after every layout effect of the commit: the unscoped
663
+ * GalaxyProvider writes `data-gx-theme` on <html> in its own layout effect, which runs after its
664
+ * children's, so a layout-effect measurement on the first commit would see unthemed surfaces.
665
+ * Re-measured when a theme attribute changes anywhere, when an ancestor's `class` or
666
+ * `style` changes, and when an ancestor's background transition ends.
667
+ */
668
+ function useTableSurface(rootRef) {
669
+ const [surface, setSurface] = useState(null);
670
+ useEffect(() => {
671
+ const root = rootRef.current;
672
+ if (root === null || typeof window === "undefined") return;
673
+ let normalizer;
674
+ const normalize = (color) => {
675
+ if (normalizer === void 0) try {
676
+ normalizer = document.createElement("canvas").getContext("2d");
677
+ } catch {
678
+ normalizer = null;
679
+ }
680
+ if (normalizer === null) return null;
681
+ normalizer.fillStyle = "transparent";
682
+ normalizer.fillStyle = color;
683
+ return normalizer.fillStyle;
684
+ };
685
+ const ancestors = () => {
686
+ const list = [];
687
+ const themeRoot = root.parentElement?.closest("[data-gx-theme]") ?? null;
688
+ for (let node = root.parentElement; node !== null && node !== themeRoot;) {
689
+ list.push(node);
690
+ node = node.parentElement;
691
+ }
692
+ return list;
693
+ };
694
+ const measure = () => {
695
+ const painted = ancestors().find((element) => !isTransparentColor(getComputedStyle(element).backgroundColor));
696
+ if (painted !== void 0 && painted === root.parentElement) {
697
+ setSurface(null);
698
+ return;
699
+ }
700
+ if (painted === void 0) {
701
+ setSurface(t.color.background.base);
702
+ return;
703
+ }
704
+ const styles = getComputedStyle(painted);
705
+ const color = normalize(styles.backgroundColor);
706
+ setSurface(SURFACE_TOKENS.find((candidate) => {
707
+ const name = /^var\((--[\w-]+)\)$/.exec(candidate)?.[1];
708
+ if (name === void 0 || color === null) return false;
709
+ const value = styles.getPropertyValue(name).trim();
710
+ return value !== "" && normalize(value) === color;
711
+ }) ?? styles.backgroundColor);
712
+ };
713
+ measure();
714
+ if (typeof MutationObserver === "undefined") return;
715
+ const observer = new MutationObserver(measure);
716
+ observer.observe(document.documentElement, {
717
+ attributes: true,
718
+ attributeFilter: ["data-gx-theme"],
719
+ subtree: true
720
+ });
721
+ for (const element of ancestors()) observer.observe(element, {
722
+ attributes: true,
723
+ attributeFilter: ["class", "style"]
724
+ });
725
+ const onTransitionEnd = (event) => {
726
+ const target = event.target;
727
+ if (target instanceof Node && target !== root && target.contains(root) && event.propertyName.startsWith("background")) measure();
728
+ };
729
+ document.addEventListener("transitionend", onTransitionEnd);
730
+ return () => {
731
+ observer.disconnect();
732
+ document.removeEventListener("transitionend", onTransitionEnd);
733
+ };
734
+ }, [rootRef]);
735
+ return surface;
736
+ }
737
+ /** Root → scroll container → table (header, body, status, footer) → sentinel → live region. */
738
+ function TableFrame({ metrics, columnLayout, leadingHeaders, trailingHeader, hasTrailingColumn, sort, onSortPress, canCustomizeColumns, rowCount, isLoading, error, emptyState, onEndReached, role, ariaLabel, tableAria, isMultiselectable, ariaRowCount, rootRef, scrollRef, rootProps, className, style, bodyClassName, bodyStyle, announcement, trailingClassName, children }) {
739
+ const { visibleColumns } = columnLayout;
740
+ const ownRootRef = useRef(null);
741
+ const mergedRootRef = useMergeRefs([ownRootRef, rootRef]);
742
+ const hasColIndex = ariaRowCount !== void 0;
743
+ const leadingCount = leadingHeaders.length;
744
+ const colCount = leadingCount + visibleColumns.length + (hasTrailingColumn ? 1 : 0);
745
+ const surface = useTableSurface(ownRootRef);
746
+ const { width: viewportWidth } = useElementClientSize(scrollRef);
747
+ const sentinelRef = useInfiniteScrollSentinel({
748
+ scrollRef,
749
+ onEndReached,
750
+ isEnabled: !isLoading && error === void 0,
751
+ rowCount,
752
+ marginPx: 500
753
+ });
754
+ const [message, setMessage] = useState("");
755
+ useEffect(() => {
756
+ if (announcement !== void 0 && announcement !== "") setMessage(announcement);
757
+ }, [announcement]);
758
+ const headerCellsRef = useRef(/* @__PURE__ */ new Map());
759
+ const headerButtonsRef = useRef(/* @__PURE__ */ new Map());
760
+ const { registerHeaderCell } = columnLayout;
761
+ const registerCell = useCallback((columnId, element) => {
762
+ if (element === null) headerCellsRef.current.delete(columnId);
763
+ else headerCellsRef.current.set(columnId, element);
764
+ registerHeaderCell(columnId, element);
765
+ }, [registerHeaderCell]);
766
+ const registerButton = useCallback((columnId, element) => {
767
+ if (element === null) headerButtonsRef.current.delete(columnId);
768
+ else headerButtonsRef.current.set(columnId, element);
769
+ }, []);
770
+ const [pendingFocusId, setPendingFocusId] = useState(null);
771
+ useIsomorphicLayoutEffect(() => {
772
+ if (pendingFocusId === null) return;
773
+ headerButtonsRef.current.get(pendingFocusId)?.focus();
774
+ setPendingFocusId(null);
775
+ }, [pendingFocusId]);
776
+ const dragRef = useRef(null);
777
+ const suppressClickRef = useRef(false);
778
+ const [drag, setDrag] = useState(null);
779
+ const unpinnedIds = visibleColumns.filter((entry) => entry.pin === void 0).map((entry) => entry.column.id);
780
+ const unpinnedRef = useRef(unpinnedIds);
781
+ unpinnedRef.current = unpinnedIds;
782
+ const cancelDrag = useCallback(() => {
783
+ dragRef.current = null;
784
+ setDrag(null);
785
+ }, []);
786
+ useEffect(() => {
787
+ if (drag === null) return;
788
+ const handleKey = (event) => {
789
+ if (event.key !== "Escape") return;
790
+ event.preventDefault();
791
+ event.stopPropagation();
792
+ suppressClickRef.current = true;
793
+ cancelDrag();
794
+ };
795
+ window.addEventListener("keydown", handleKey, true);
796
+ return () => window.removeEventListener("keydown", handleKey, true);
797
+ }, [drag, cancelDrag]);
798
+ /** The unpinned column the pointer would drop before (`null`: after the last). */
799
+ const hitTest = (clientX) => {
800
+ for (const columnId of unpinnedRef.current) {
801
+ const rect = headerCellsRef.current.get(columnId)?.getBoundingClientRect();
802
+ if (rect !== void 0 && clientX < rect.left + rect.width / 2) return columnId;
803
+ }
804
+ return null;
805
+ };
806
+ const onLabelPointerDown = (columnId, event) => {
807
+ if (event.pointerType === "mouse" && event.button !== 0) return;
808
+ dragRef.current = {
809
+ pointerId: event.pointerId,
810
+ columnId,
811
+ startX: event.clientX,
812
+ isDragging: false,
813
+ beforeId: void 0
814
+ };
815
+ };
816
+ const onLabelPointerMove = (event) => {
817
+ const current = dragRef.current;
818
+ if (current === null || current.pointerId !== event.pointerId) return;
819
+ if (!current.isDragging) {
820
+ if (Math.abs(event.clientX - current.startX) <= TABLE_DRAG_THRESHOLD_PX) return;
821
+ current.isDragging = true;
822
+ event.currentTarget.setPointerCapture(event.pointerId);
823
+ }
824
+ const beforeId = hitTest(event.clientX);
825
+ if (beforeId !== current.beforeId) {
826
+ current.beforeId = beforeId;
827
+ setDrag({
828
+ columnId: current.columnId,
829
+ beforeId
830
+ });
831
+ }
832
+ };
833
+ const onLabelPointerUp = (event) => {
834
+ const current = dragRef.current;
835
+ if (current !== null && current.pointerId === event.pointerId) {
836
+ if (current.isDragging) {
837
+ suppressClickRef.current = true;
838
+ if (current.beforeId !== void 0) columnLayout.moveColumnBefore(current.columnId, current.beforeId);
839
+ }
840
+ cancelDrag();
841
+ }
842
+ if (suppressClickRef.current) window.setTimeout(() => {
843
+ suppressClickRef.current = false;
844
+ }, 0);
845
+ };
846
+ const onLabelPointerCancel = (event) => {
847
+ if (dragRef.current?.pointerId === event.pointerId) cancelDrag();
848
+ };
849
+ const onLabelClickCapture = (event) => {
850
+ if (!suppressClickRef.current) return;
851
+ suppressClickRef.current = false;
852
+ event.preventDefault();
853
+ event.stopPropagation();
854
+ };
855
+ const onLabelKeyDown = (columnId, event) => {
856
+ if (!canCustomizeColumns || !event.altKey) return;
857
+ if (event.key !== "ArrowLeft" && event.key !== "ArrowRight") return;
858
+ event.preventDefault();
859
+ const position = columnLayout.moveColumnBy(columnId, event.key === "ArrowLeft" ? -1 : 1);
860
+ if (position === null) return;
861
+ setMessage(`Moved ${visibleColumns.find((entry) => entry.column.id === columnId)?.column.header ?? ""} to column ${position} of ${visibleColumns.length}`);
862
+ setPendingFocusId(columnId);
863
+ };
864
+ /** Drop indicator edge for each column while dragging. */
865
+ const dropEdgeFor = (columnId) => {
866
+ if (drag === null || drag.columnId === columnId) return null;
867
+ const ids = unpinnedIds;
868
+ const fromIndex = ids.indexOf(drag.columnId);
869
+ const toIndex = drag.beforeId === null ? ids.length : ids.indexOf(drag.beforeId);
870
+ if (toIndex === fromIndex || toIndex === fromIndex + 1) return null;
871
+ if (drag.beforeId === columnId) return "start";
872
+ if (drag.beforeId === null && ids.at(-1) === columnId) return "end";
873
+ return null;
874
+ };
875
+ const hasFooter = visibleColumns.some(({ column }) => column.footer !== void 0 && column.footer !== null);
876
+ const footerRowIndex = ariaRowCount;
877
+ const variables = { ...columnLayout.variables };
878
+ if (viewportWidth !== void 0) variables["--gx-table-viewport-width"] = `${viewportWidth}px`;
879
+ if (hasFooter) variables["--gx-table-footer-height"] = "var(--gx-table-header-height)";
880
+ if (surface !== null) variables["--gx-table-surface"] = surface;
881
+ let status = null;
882
+ if (rowCount === 0 && isLoading) status = Array.from({ length: 5 }, (_, index) => /* @__PURE__ */ jsx(TableSkeletonRow, {
883
+ columns: visibleColumns,
884
+ metrics,
885
+ leadingCount,
886
+ hasTrailingColumn,
887
+ isBorderless: index === 4
888
+ }, `skeleton-${index}`));
889
+ else if (rowCount === 0) status = /* @__PURE__ */ jsx(StatusRowElement, {
890
+ role: "row",
891
+ children: /* @__PURE__ */ jsx(StatusCell, {
892
+ role: "cell",
893
+ colSpan: colCount,
894
+ children: /* @__PURE__ */ jsx(StatusViewport, { children: error !== void 0 ? /* @__PURE__ */ jsx("div", {
895
+ role: "alert",
896
+ children: /* @__PURE__ */ jsx(EmptyState, {
897
+ icon: WarningCircleIcon,
898
+ header: "Couldn't load data",
899
+ description: error,
900
+ size: metrics.emptyStateSize
901
+ })
902
+ }) : emptyState ?? /* @__PURE__ */ jsx(EmptyState, {
903
+ header: "No results",
904
+ size: metrics.emptyStateSize,
905
+ role: "status"
906
+ }) })
907
+ })
908
+ });
909
+ else status = /* @__PURE__ */ jsxs(Fragment$1, { children: [isLoading && Array.from({ length: 3 }, (_, index) => /* @__PURE__ */ jsx(TableSkeletonRow, {
910
+ columns: visibleColumns,
911
+ metrics,
912
+ leadingCount,
913
+ hasTrailingColumn,
914
+ isBorderless: index === 2 && error === void 0
915
+ }, `more-${index}`)), error !== void 0 && /* @__PURE__ */ jsx(EndErrorRow, {
916
+ role: "row",
917
+ children: /* @__PURE__ */ jsx(StatusCell, {
918
+ role: "cell",
919
+ colSpan: colCount,
920
+ children: /* @__PURE__ */ jsxs(EndErrorViewport, {
921
+ role: "alert",
922
+ children: [/* @__PURE__ */ jsx(Icon, {
923
+ component: WarningCircleIcon,
924
+ size: metrics.headerIconPx,
925
+ variant: IconVariant.ERROR
926
+ }), /* @__PURE__ */ jsx(Text, {
927
+ as: "span",
928
+ variant: TextVariant.ERROR,
929
+ size: metrics.textSize,
930
+ children: error
931
+ })]
932
+ })
933
+ })
934
+ })] });
935
+ let headerColIndex = 0;
936
+ const nextHeaderColIndex = () => {
937
+ headerColIndex += 1;
938
+ return hasColIndex ? headerColIndex : void 0;
939
+ };
940
+ return /* @__PURE__ */ jsxs(Root, {
941
+ ...rootProps,
942
+ ref: mergedRootRef,
943
+ className: cx(metrics.css, surface !== null && SURFACE_ANCESTOR_CSS, className),
944
+ style: {
945
+ ...variables,
946
+ ...style
947
+ },
948
+ children: [/* @__PURE__ */ jsxs(Scroll, {
949
+ ref: scrollRef,
950
+ children: [/* @__PURE__ */ jsxs(TableElement, {
951
+ ...tableAria,
952
+ role,
953
+ ...ariaLabel === void 0 ? {} : { "aria-label": ariaLabel },
954
+ ...isLoading ? { "aria-busy": true } : {},
955
+ ...isMultiselectable ? { "aria-multiselectable": true } : {},
956
+ ...ariaRowCount === void 0 ? {} : {
957
+ "aria-rowcount": ariaRowCount,
958
+ "aria-colcount": colCount
959
+ },
960
+ children: [
961
+ /* @__PURE__ */ jsx(Head, {
962
+ role: "rowgroup",
963
+ children: /* @__PURE__ */ jsxs(HeaderRow, {
964
+ role: "row",
965
+ ...hasColIndex ? { "aria-rowindex": 1 } : {},
966
+ children: [
967
+ leadingHeaders.map((content, index) => {
968
+ const colIndex = nextHeaderColIndex();
969
+ return /* @__PURE__ */ jsx(HeaderCell, {
970
+ role: "columnheader",
971
+ ...colIndex === void 0 ? {} : { "aria-colindex": colIndex },
972
+ className: cx(SYNTHETIC_CELL_CSS, PIN_TO_CSS_MAP[Side.LEFT], PINNED_HEADER_CSS),
973
+ style: syntheticOffset(index, metrics),
974
+ children: content
975
+ }, `leading-${index}`);
976
+ }),
977
+ visibleColumns.map((resolved) => {
978
+ const { column } = resolved;
979
+ const isSorted = sort?.columnId === column.id;
980
+ return /* @__PURE__ */ jsx(TableHeaderCell, {
981
+ resolved,
982
+ metrics,
983
+ sortState: column.canSort === true ? isSorted ? sort?.isDescending ? "descending" : "ascending" : "none" : void 0,
984
+ isCustomizable: canCustomizeColumns,
985
+ width: resolved.canResize ? columnLayout.getColumnWidth(column.id) : 0,
986
+ dropEdge: dropEdgeFor(column.id),
987
+ isDragged: drag?.columnId === column.id && drag.beforeId !== void 0,
988
+ colIndex: nextHeaderColIndex(),
989
+ onSortPress,
990
+ onResize: columnLayout.resizeColumn,
991
+ onLabelKeyDown,
992
+ onLabelPointerDown,
993
+ onLabelPointerMove,
994
+ onLabelPointerUp,
995
+ onLabelPointerCancel,
996
+ onLabelClickCapture,
997
+ registerCell,
998
+ registerButton
999
+ }, column.id);
1000
+ }),
1001
+ hasTrailingColumn && (() => {
1002
+ const colIndex = nextHeaderColIndex();
1003
+ return /* @__PURE__ */ jsx(HeaderCell, {
1004
+ role: "columnheader",
1005
+ ...colIndex === void 0 ? {} : { "aria-colindex": colIndex },
1006
+ className: cx("gx-TableCore-SYNTHETIC_CELL_CSS-s1g01kh5", PIN_TO_CSS_MAP[Side.RIGHT], PINNED_HEADER_CSS, trailingClassName),
1007
+ style: syntheticOffset(0, metrics),
1008
+ children: trailingHeader
1009
+ });
1010
+ })()
1011
+ ]
1012
+ })
1013
+ }),
1014
+ /* @__PURE__ */ jsx(Body, {
1015
+ role: "rowgroup",
1016
+ className: bodyClassName,
1017
+ style: bodyStyle,
1018
+ children
1019
+ }),
1020
+ status !== null && /* @__PURE__ */ jsx(StatusBody, {
1021
+ role: "rowgroup",
1022
+ children: status
1023
+ }),
1024
+ hasFooter && /* @__PURE__ */ jsx(Foot, {
1025
+ role: "rowgroup",
1026
+ children: /* @__PURE__ */ jsxs(FooterRow, {
1027
+ role: "row",
1028
+ ...footerRowIndex === void 0 ? {} : { "aria-rowindex": footerRowIndex },
1029
+ children: [
1030
+ Array.from({ length: leadingCount }, (_, index) => /* @__PURE__ */ jsx(TableCell, {
1031
+ role: "cell",
1032
+ ...hasColIndex ? { "aria-colindex": index + 1 } : {},
1033
+ className: cx("gx-TableCore-SYNTHETIC_CELL_CSS-s1g01kh5", PIN_TO_CSS_MAP[Side.LEFT]),
1034
+ style: syntheticOffset(index, metrics)
1035
+ }, `leading-${index}`)),
1036
+ visibleColumns.map(({ column, pin, isPinEdge, cellStyle, position }) => /* @__PURE__ */ jsx(TableCell, {
1037
+ role: "cell",
1038
+ ...hasColIndex ? { "aria-colindex": leadingCount + position + 1 } : {},
1039
+ className: cx(COLUMN_ALIGN_TO_CSS_MAP[column.align ?? "left"], pin !== void 0 && PIN_TO_CSS_MAP[pin], pin !== void 0 && isPinEdge && PIN_TO_EDGE_CSS_MAP[pin]),
1040
+ style: cellStyle,
1041
+ children: typeof column.footer === "string" ? /* @__PURE__ */ jsx(Text, {
1042
+ as: "span",
1043
+ size: metrics.textSize,
1044
+ weight: TextWeight.MEDIUM,
1045
+ lineClamp: 1,
1046
+ className: "gx-TableCore-CELL_TEXT_CSS-c1emgwoo",
1047
+ children: column.footer
1048
+ }) : column.footer
1049
+ }, column.id)),
1050
+ hasTrailingColumn && /* @__PURE__ */ jsx(TableCell, {
1051
+ role: "cell",
1052
+ ...hasColIndex ? { "aria-colindex": colCount } : {},
1053
+ className: cx("gx-TableCore-SYNTHETIC_CELL_CSS-s1g01kh5", PIN_TO_CSS_MAP[Side.RIGHT], trailingClassName),
1054
+ style: syntheticOffset(0, metrics)
1055
+ })
1056
+ ]
1057
+ })
1058
+ })
1059
+ ]
1060
+ }), /* @__PURE__ */ jsx(Sentinel, {
1061
+ ref: sentinelRef,
1062
+ "aria-hidden": "true"
1063
+ })]
1064
+ }), /* @__PURE__ */ jsx(VisuallyHidden, {
1065
+ "aria-live": "polite",
1066
+ children: message
1067
+ })]
1068
+ });
1069
+ }
1070
+ /** @internal Header content of the select column: the select-all checkbox. */
1071
+ function TableSelectAllCheckbox({ metrics, isChecked, isIndeterminate, isDisabled, onToggle }) {
1072
+ return /* @__PURE__ */ jsx(CheckboxInput, {
1073
+ size: metrics.checkboxSize,
1074
+ isChecked,
1075
+ isIndeterminate,
1076
+ isDisabled,
1077
+ onChange: onToggle,
1078
+ ariaLabel: "Select all rows"
1079
+ });
1080
+ }
1081
+ //#endregion
1082
+ export { CELL_TEXT_CSS, COLUMN_ALIGN_TO_CSS_MAP, PIN_TO_CSS_MAP, PIN_TO_EDGE_CSS_MAP, ROW_NO_BORDER_CSS, SYNTHETIC_CELL_CSS, TABLE_DEFAULT_MAX_COLUMN_WIDTH, TABLE_DEFAULT_MIN_COLUMN_WIDTH, TABLE_DRAG_THRESHOLD_PX, TABLE_END_REACHED_MARGIN_PX, TABLE_LARGE_METRICS, TABLE_LOADING_MORE_ROW_COUNT, TABLE_LOADING_ROW_COUNT, TABLE_MEDIUM_METRICS, TABLE_PINNED_FALLBACK_WIDTH, TABLE_SMALL_METRICS, TABLE_Z_PINNED, TableBodyRow, TableCell, TableCellText, TableColumnsMenu, TableExpandedRow, TableFrame, TableHeaderCell, TableRow, TableSelectAllCheckbox, TableSkeletonRow, VIRTUAL_BODY_CSS, VIRTUAL_OVERSCAN, VIRTUAL_ROW_CSS, isDevelopment, useIsomorphicLayoutEffect };