@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,476 @@
1
+ import Text, { TextSize, TextVariant } from "../text/Text.js";
2
+ import { useControlledState } from "../hooks/useControlledState.js";
3
+ import Icon, { IconVariant } from "../icons/Icon.js";
4
+ import Button, { ButtonSize, ButtonVariant } from "../buttons/Button.js";
5
+ import { formatBytes } from "../utils/format.js";
6
+ import { useDevWarning } from "./internal/devWarn.js";
7
+ import { useFieldWiring } from "./internal/fieldWiring.js";
8
+ import Field, { FieldSize } from "./Field.js";
9
+ import { rootStyle, useOwnField } from "./internal/ownField.js";
10
+ /* empty css */
11
+ import { styled } from "@linaria/react";
12
+ import { forwardRef, useEffect, useRef, useState } from "react";
13
+ import { jsx, jsxs } from "react/jsx-runtime";
14
+ import { cx } from "@linaria/core";
15
+ import { FileIcon, UploadSimpleIcon, XIcon } from "@phosphor-icons/react";
16
+ //#region src/inputs/FileInput.tsx
17
+ /**
18
+ * The form control for choosing local files to hand to the app: a CSV to import, documents for a
19
+ * knowledge source, a service-account key. A drop zone accepts files dragged onto it and a
20
+ * "Choose files" button opens the system picker; under it, the chosen files are listed with their
21
+ * name, size and a remove button. The value is the list of `File` objects, with `value` /
22
+ * `defaultValue` / `onChange`. `accept` filters the picker and drops alike; files it did not take
23
+ * (wrong type, extras in single mode, folders) go to `onReject`. `renderFileActions` replaces a
24
+ * row's remove button with the app's content, such as upload progress.
25
+ *
26
+ * Built on native drag-and-drop (no `react-dropzone`). It never uploads, reads or validates files:
27
+ * uploading, size limits and messages are the app's. A standalone FileInput with `label` or
28
+ * `error` renders a `Field` around itself. No 1.x DLS equivalent (the GX app's `react-dropzone`
29
+ * dropzone).
30
+ *
31
+ * SSR: ids come from `useId`; drag state lives in event handlers; nothing touches `window`,
32
+ * `document` or `DataTransfer` at module scope or during render.
33
+ */
34
+ /** Canonical rungs; FileInput exposes three. Sets the button, the file rows, and the zone's padding and text. */
35
+ var FileInputSize = /* @__PURE__ */ function(FileInputSize) {
36
+ /** 24px button and rows, body_sm text, 16px zone padding. */
37
+ FileInputSize["SMALL"] = "SMALL";
38
+ /** 32px button and rows, body_md text, 24px zone padding. The default. */
39
+ FileInputSize["MEDIUM"] = "MEDIUM";
40
+ /** 36px button and rows, body_lg text, 32px zone padding. */
41
+ FileInputSize["LARGE"] = "LARGE";
42
+ return FileInputSize;
43
+ }({});
44
+ /** Resting fill of the drop zone (Constitution V-A surface set; the 1.x `InputVariant` members). */
45
+ var FileInputVariant = /* @__PURE__ */ function(FileInputVariant) {
46
+ /** `background.base` fill. */
47
+ FileInputVariant["BASE"] = "BASE";
48
+ /** `background.primary` fill. The default. */
49
+ FileInputVariant["PRIMARY"] = "PRIMARY";
50
+ /** `background.secondary` fill. */
51
+ FileInputVariant["SECONDARY"] = "SECONDARY";
52
+ /** `background.tertiary` fill. */
53
+ FileInputVariant["TERTIARY"] = "TERTIARY";
54
+ return FileInputVariant;
55
+ }({});
56
+ /** The control's width without `fillWidth` (the SelectInput panel maximum). */
57
+ /** The group: the hidden native input, the zone, the file list and the live region. */
58
+ var Group = /*#__PURE__*/ styled("div")({
59
+ name: "Group",
60
+ class: "gx-FileInput-Group-g1ytda4s",
61
+ propsAsIs: false
62
+ });
63
+ /** The native picker: never seen, focused or announced; the "Choose files" button clicks it. */
64
+ var NativeInput = /*#__PURE__*/ styled("input")({
65
+ name: "NativeInput",
66
+ class: "gx-FileInput-NativeInput-n1u9x4rm",
67
+ propsAsIs: false
68
+ });
69
+ /** The drop zone: a dashed hairline around the icon, the text and the button. Not focusable. */
70
+ var Zone = /*#__PURE__*/ styled("div")({
71
+ name: "Zone",
72
+ class: "gx-FileInput-Zone-z12oqump",
73
+ propsAsIs: false
74
+ });
75
+ /** The chosen files, in a hairline box. `role="list"` keeps list semantics without bullets. */
76
+ var FileList = /*#__PURE__*/ styled("ul")({
77
+ name: "FileList",
78
+ class: "gx-FileInput-FileList-fdf24zr",
79
+ propsAsIs: false
80
+ });
81
+ /**
82
+ * One file: icon, name, size and actions, at the rung's control height. The hairline between rows
83
+ * is drawn by `::before` over the row's top edge, so it takes no height from the row and the icon
84
+ * and buttons stay centered on whole pixels.
85
+ */
86
+ var FileRow = /*#__PURE__*/ styled("li")({
87
+ name: "FileRow",
88
+ class: "gx-FileInput-FileRow-f19fvk9w",
89
+ propsAsIs: false
90
+ });
91
+ /** The file name's slot: it takes the rest of the row and truncates. */
92
+ var FileName = /*#__PURE__*/ styled("span")({
93
+ name: "FileName",
94
+ class: "gx-FileInput-FileName-fufhquj",
95
+ propsAsIs: false
96
+ });
97
+ /** The size and the actions never shrink. */
98
+ var NoShrink = /*#__PURE__*/ styled("span")({
99
+ name: "NoShrink",
100
+ class: "gx-FileInput-NoShrink-nepfpz5",
101
+ propsAsIs: false
102
+ });
103
+ /** The polite live region for added, removed and rejected files (`VisuallyHidden` takes no `role`). */
104
+ var StatusRegion = /*#__PURE__*/ styled("span")({
105
+ name: "StatusRegion",
106
+ class: "gx-FileInput-StatusRegion-sy7l04l",
107
+ propsAsIs: false
108
+ });
109
+ /** Zone padding and gap, file-row height and insets per rung (the canonical rung table). */
110
+ var FILE_INPUT_SIZE_TO_CSS_MAP = {
111
+ ["SMALL"]: "gx-FileInput-SMALL-s1hrapll",
112
+ ["MEDIUM"]: "gx-FileInput-MEDIUM-m3wsxhs",
113
+ ["LARGE"]: "gx-FileInput-LARGE-l1fx5o6"
114
+ };
115
+ /** The zone's rest look: the Input fills, with a dashed `border.primary` hairline on every variant. */
116
+ var FILE_INPUT_VARIANT_TO_CSS_MAP = {
117
+ ["BASE"]: "gx-FileInput-BASE-b1qlrgtm",
118
+ ["PRIMARY"]: "gx-FileInput-PRIMARY-p1onua8y",
119
+ ["SECONDARY"]: "gx-FileInput-SECONDARY-s18e5m84",
120
+ ["TERTIARY"]: "gx-FileInput-TERTIARY-t1arbxdm"
121
+ };
122
+ /** `isGhost`: no fill and no dashed hairline at rest. Declared after the variant map, which it replaces. */
123
+ var GHOST_CSS = "gx-FileInput-GHOST_CSS-g1xwgmj8";
124
+ /** Hover on an editable zone (2026-10-03 field-frame resolution): `border.hovered`. */
125
+ var ZONE_HOVER_CSS = "gx-FileInput-ZONE_HOVER_CSS-z1nts58e";
126
+ /** An editable ghost zone while its button has focus: the dashed frame appears, `border.hovered`. */
127
+ var GHOST_FOCUS_CSS = "gx-FileInput-GHOST_FOCUS_CSS-g1mfv4vb";
128
+ /** Files dragged over an editable zone: `border.focused` and the neutral interaction fill. */
129
+ var DRAG_ACTIVE_CSS = "gx-FileInput-DRAG_ACTIVE_CSS-d5bpp2p";
130
+ /** Error border at rest and on hover (not while drag-active, so the drop target still reads). */
131
+ var ERROR_CSS = "gx-FileInput-ERROR_CSS-esgy3bm";
132
+ /**
133
+ * Disabled: the variant's resting fill and dashed hairline are kept (`border.disabled` is not used
134
+ * on frames); the zone reads as disabled through its text, icon, button and the cursor.
135
+ */
136
+ var DISABLED_CSS = "gx-FileInput-DISABLED_CSS-d194c16g";
137
+ /** Stretch to the parent's width (the group, and the `Field` wrapper when there is one). */
138
+ var FILL_WIDTH_CSS = "gx-FileInput-FILL_WIDTH_CSS-f1l5ttml";
139
+ /** Zone and file-row text per rung. */
140
+ var FILE_INPUT_SIZE_TO_TEXT_SIZE_MAP = {
141
+ ["SMALL"]: TextSize.BODY_SM,
142
+ ["MEDIUM"]: TextSize.BODY_MD,
143
+ ["LARGE"]: TextSize.BODY_LG
144
+ };
145
+ /** The zone's upload icon per rung. */
146
+ var FILE_INPUT_SIZE_TO_ICON_PX_MAP = {
147
+ ["SMALL"]: 16,
148
+ ["MEDIUM"]: 20,
149
+ ["LARGE"]: 24
150
+ };
151
+ /** A file row's icon per rung: the rung icon, one step below III-A.4 (Mitch, 2026-10-04). */
152
+ var FILE_INPUT_SIZE_TO_ROW_ICON_PX_MAP = {
153
+ ["SMALL"]: 12,
154
+ ["MEDIUM"]: 14,
155
+ ["LARGE"]: 14
156
+ };
157
+ /** The "Choose files" button's rung (identity). */
158
+ var FILE_INPUT_SIZE_TO_BUTTON_SIZE_MAP = {
159
+ ["SMALL"]: ButtonSize.SMALL,
160
+ ["MEDIUM"]: ButtonSize.MEDIUM,
161
+ ["LARGE"]: ButtonSize.LARGE
162
+ };
163
+ /** A row's remove button: Input's in-field button rung, centered in the row by the end inset. */
164
+ var FILE_INPUT_SIZE_TO_REMOVE_BUTTON_SIZE_MAP = {
165
+ ["SMALL"]: ButtonSize.X_SMALL,
166
+ ["MEDIUM"]: ButtonSize.X_SMALL,
167
+ ["LARGE"]: ButtonSize.SMALL
168
+ };
169
+ /** The `Field` a FileInput renders for its own `label` / `error` uses the same rung. */
170
+ var FILE_INPUT_SIZE_TO_FIELD_SIZE_MAP = {
171
+ ["SMALL"]: FieldSize.SMALL,
172
+ ["MEDIUM"]: FieldSize.MEDIUM,
173
+ ["LARGE"]: FieldSize.LARGE
174
+ };
175
+ /**
176
+ * Whether `file` matches the native `accept` string: `.ext` by name (case-insensitive), `type/*`
177
+ * by MIME prefix, anything else by exact MIME type. An unset or empty `accept` matches every file.
178
+ */
179
+ function matchesAccept(file, accept) {
180
+ if (accept === void 0) return true;
181
+ const tokens = accept.split(",").map((token) => token.trim().toLowerCase()).filter((token) => token !== "");
182
+ if (tokens.length === 0) return true;
183
+ const name = file.name.toLowerCase();
184
+ const type = file.type.toLowerCase();
185
+ return tokens.some((token) => {
186
+ if (token.startsWith(".")) return name.endsWith(token);
187
+ if (token.endsWith("/*")) return type.startsWith(token.slice(0, -1));
188
+ return type === token;
189
+ });
190
+ }
191
+ /** Two `File`s are the same choice when name, size and modification time match. */
192
+ function fileKey(file) {
193
+ return `${file.name}\u0000${file.size}\u0000${file.lastModified}`;
194
+ }
195
+ /** The files a drop carries, with folders split out (where `webkitGetAsEntry` exists). */
196
+ function readDrop(transfer) {
197
+ const files = [];
198
+ const folders = [];
199
+ const items = Array.from(transfer.items ?? []);
200
+ if (items.length === 0) return {
201
+ files: Array.from(transfer.files),
202
+ folders
203
+ };
204
+ for (const item of items) {
205
+ if (item.kind !== "file") continue;
206
+ const file = item.getAsFile();
207
+ if (file === null) continue;
208
+ if ((typeof item.webkitGetAsEntry === "function" ? item.webkitGetAsEntry() : null)?.isDirectory === true) folders.push(file);
209
+ else files.push(file);
210
+ }
211
+ return {
212
+ files,
213
+ folders
214
+ };
215
+ }
216
+ /** The group, the zone and the file list, wired to the nearest Field (the input's own or the app's). */
217
+ function FileGroup({ fileProps, forwardedRef, isRoot }) {
218
+ const { value, defaultValue = [], onChange, onReject, accept, isMultiple = false, renderFileActions, size = "MEDIUM", variant = "PRIMARY", isGhost = false, label: _label, placeholder, error, isError = false, isDisabled = false, isReadOnly = false, isRequired = false, fillWidth = false, ariaLabel, id, "aria-describedby": ariaDescribedBy, className, style, ...rest } = fileProps;
219
+ const { field, controlId: groupId, describedBy: buttonDescribedBy, isInvalid, hasName } = useFieldWiring({
220
+ id,
221
+ ariaLabel,
222
+ ariaLabelAttribute: rest["aria-label"],
223
+ ariaLabelledBy: rest["aria-labelledby"],
224
+ ariaDescribedBy,
225
+ error,
226
+ isError,
227
+ isRequired
228
+ });
229
+ const [files, setFiles] = useControlledState({
230
+ value,
231
+ defaultValue,
232
+ onChange
233
+ });
234
+ const filesRef = useRef(files);
235
+ filesRef.current = files;
236
+ const [announcement, setAnnouncement] = useState("");
237
+ const [isDragActive, setIsDragActive] = useState(false);
238
+ const dragDepthRef = useRef(0);
239
+ const nativeRef = useRef(null);
240
+ const chooseRef = useRef(null);
241
+ const removeRefs = useRef([]);
242
+ const pendingFocusRef = useRef(null);
243
+ const canEdit = !isDisabled && !isReadOnly;
244
+ const textSize = FILE_INPUT_SIZE_TO_TEXT_SIZE_MAP[size];
245
+ const zoneText = placeholder ?? (isMultiple ? "Drop files here" : "Drop a file here");
246
+ /** Sets the live region; a repeat of the same message is made distinct so it is read again. */
247
+ const announce = (message) => {
248
+ setAnnouncement((previous) => previous === message ? `${message} ` : message);
249
+ };
250
+ /** Sorts incoming files into accepted and rejected, updates the list and reports both once. */
251
+ const addFiles = (incoming, folders = []) => {
252
+ if (!canEdit) return;
253
+ const current = filesRef.current;
254
+ const seen = new Set(current.map(fileKey));
255
+ const rejected = [...folders];
256
+ const accepted = [];
257
+ for (const file of incoming) {
258
+ if (!matchesAccept(file, accept)) {
259
+ rejected.push(file);
260
+ continue;
261
+ }
262
+ const key = fileKey(file);
263
+ if (seen.has(key)) continue;
264
+ seen.add(key);
265
+ if (!isMultiple && accepted.length > 0) {
266
+ rejected.push(file);
267
+ continue;
268
+ }
269
+ accepted.push(file);
270
+ }
271
+ const messages = [];
272
+ if (accepted.length > 0) {
273
+ const next = isMultiple ? [...current, ...accepted] : accepted;
274
+ filesRef.current = next;
275
+ setFiles(next);
276
+ messages.push(accepted.length === 1 ? `${accepted[0]?.name} added` : `${accepted.length} files added`);
277
+ }
278
+ if (rejected.length > 0) {
279
+ onReject?.(rejected);
280
+ messages.push(rejected.length === 1 ? "1 file not added" : `${rejected.length} files not added`);
281
+ }
282
+ if (messages.length > 0) announce(messages.join(". "));
283
+ };
284
+ const remove = (index) => {
285
+ if (!canEdit) return;
286
+ const current = filesRef.current;
287
+ const file = current[index];
288
+ if (file === void 0) return;
289
+ const next = current.filter((_, position) => position !== index);
290
+ pendingFocusRef.current = index < next.length ? {
291
+ kind: "remove",
292
+ index
293
+ } : index > 0 ? {
294
+ kind: "remove",
295
+ index: index - 1
296
+ } : { kind: "choose" };
297
+ filesRef.current = next;
298
+ setFiles(next);
299
+ announce(`${file.name} removed`);
300
+ };
301
+ const openPicker = () => {
302
+ if (!canEdit) return;
303
+ nativeRef.current?.click();
304
+ };
305
+ const handleNativeChange = (event) => {
306
+ const chosen = Array.from(event.target.files ?? []);
307
+ event.target.value = "";
308
+ addFiles(chosen);
309
+ };
310
+ /** A press anywhere on the zone opens the picker; the button opens it itself. */
311
+ const handleZoneClick = (event) => {
312
+ if (event.target.closest("button") !== null) return;
313
+ openPicker();
314
+ };
315
+ const carriesFiles = (event) => Array.from(event.dataTransfer.types).includes("Files");
316
+ const handleDragEnter = (event) => {
317
+ if (!canEdit || !carriesFiles(event)) return;
318
+ event.preventDefault();
319
+ dragDepthRef.current += 1;
320
+ setIsDragActive(true);
321
+ };
322
+ const handleDragLeave = (event) => {
323
+ if (!canEdit || !carriesFiles(event)) return;
324
+ dragDepthRef.current = Math.max(0, dragDepthRef.current - 1);
325
+ if (dragDepthRef.current === 0) setIsDragActive(false);
326
+ };
327
+ const handleDragOver = (event) => {
328
+ if (!canEdit) return;
329
+ event.preventDefault();
330
+ event.dataTransfer.dropEffect = "copy";
331
+ };
332
+ const handleDrop = (event) => {
333
+ if (!canEdit) return;
334
+ event.preventDefault();
335
+ dragDepthRef.current = 0;
336
+ setIsDragActive(false);
337
+ const { files: dropped, folders } = readDrop(event.dataTransfer);
338
+ addFiles(dropped, folders);
339
+ };
340
+ useEffect(() => {
341
+ const target = pendingFocusRef.current;
342
+ if (target === null) return;
343
+ pendingFocusRef.current = null;
344
+ ((target.kind === "choose" ? chooseRef.current : removeRefs.current[target.index]) ?? chooseRef.current)?.focus();
345
+ });
346
+ useDevWarning(!hasName, "[@galaxy-io/dls] FileInput has no accessible name. Pass `label`, wrap it in a labelled `Field`, or set `ariaLabel`.");
347
+ const isDropTarget = isDragActive && canEdit;
348
+ const rowIconPx = FILE_INPUT_SIZE_TO_ROW_ICON_PX_MAP[size];
349
+ const rowTextVariant = isDisabled ? TextVariant.DISABLED : TextVariant.PRIMARY;
350
+ const rowMetaVariant = isDisabled ? TextVariant.DISABLED : TextVariant.TERTIARY;
351
+ const rowIconVariant = isDisabled ? IconVariant.DISABLED : IconVariant.SECONDARY;
352
+ return /* @__PURE__ */ jsxs(Group, {
353
+ ...field?.labelId === void 0 ? {} : { "aria-labelledby": field.labelId },
354
+ ...rest,
355
+ ref: forwardedRef,
356
+ id: groupId,
357
+ role: "group",
358
+ "aria-label": ariaLabel ?? rest["aria-label"],
359
+ className: cx(FILE_INPUT_SIZE_TO_CSS_MAP[size], fillWidth && FILL_WIDTH_CSS, isRoot ? className : void 0),
360
+ ...rootStyle(isRoot, style),
361
+ children: [
362
+ /* @__PURE__ */ jsx(NativeInput, {
363
+ ref: nativeRef,
364
+ type: "file",
365
+ tabIndex: -1,
366
+ "aria-hidden": true,
367
+ ...accept === void 0 ? {} : { accept },
368
+ multiple: isMultiple,
369
+ disabled: isDisabled,
370
+ onChange: handleNativeChange
371
+ }),
372
+ !isReadOnly && /* @__PURE__ */ jsxs(Zone, {
373
+ onClick: handleZoneClick,
374
+ onDragEnter: handleDragEnter,
375
+ onDragLeave: handleDragLeave,
376
+ onDragOver: handleDragOver,
377
+ onDrop: handleDrop,
378
+ className: cx(isGhost ? GHOST_CSS : FILE_INPUT_VARIANT_TO_CSS_MAP[variant], canEdit && !isInvalid && ZONE_HOVER_CSS, isGhost && canEdit && !isInvalid && GHOST_FOCUS_CSS, isInvalid && !isDisabled && !isDropTarget && ERROR_CSS, isDropTarget && DRAG_ACTIVE_CSS, isDisabled && DISABLED_CSS),
379
+ children: [
380
+ /* @__PURE__ */ jsx(Icon, {
381
+ component: UploadSimpleIcon,
382
+ size: FILE_INPUT_SIZE_TO_ICON_PX_MAP[size],
383
+ variant: isDisabled ? IconVariant.DISABLED : IconVariant.SECONDARY
384
+ }),
385
+ /* @__PURE__ */ jsx(Text, {
386
+ as: "span",
387
+ size: textSize,
388
+ variant: isDisabled ? TextVariant.DISABLED : TextVariant.SECONDARY,
389
+ children: zoneText
390
+ }),
391
+ /* @__PURE__ */ jsx(Button, {
392
+ ref: chooseRef,
393
+ variant: ButtonVariant.SECONDARY,
394
+ size: FILE_INPUT_SIZE_TO_BUTTON_SIZE_MAP[size],
395
+ label: isMultiple ? "Choose files" : "Choose file",
396
+ isDisabled,
397
+ onClick: openPicker,
398
+ ...buttonDescribedBy === void 0 ? {} : { "aria-describedby": buttonDescribedBy }
399
+ })
400
+ ]
401
+ }),
402
+ files.length > 0 && /* @__PURE__ */ jsx(FileList, {
403
+ role: "list",
404
+ children: files.map((file, index) => /* @__PURE__ */ jsxs(FileRow, { children: [
405
+ /* @__PURE__ */ jsx(Icon, {
406
+ component: FileIcon,
407
+ size: rowIconPx,
408
+ variant: rowIconVariant
409
+ }),
410
+ /* @__PURE__ */ jsx(FileName, { children: /* @__PURE__ */ jsx(Text, {
411
+ as: "span",
412
+ size: textSize,
413
+ variant: rowTextVariant,
414
+ lineClamp: 1,
415
+ shouldTooltipOnOverflow: true,
416
+ children: file.name
417
+ }) }),
418
+ /* @__PURE__ */ jsx(NoShrink, { children: /* @__PURE__ */ jsx(Text, {
419
+ as: "span",
420
+ size: textSize,
421
+ variant: rowMetaVariant,
422
+ isTabular: true,
423
+ children: formatBytes(file.size)
424
+ }) }),
425
+ renderFileActions !== void 0 ? /* @__PURE__ */ jsx(NoShrink, { children: renderFileActions(file, index) }) : !isReadOnly && /* @__PURE__ */ jsx(NoShrink, { children: /* @__PURE__ */ jsx(Button, {
426
+ ref: (element) => {
427
+ removeRefs.current[index] = element;
428
+ },
429
+ variant: ButtonVariant.TERTIARY,
430
+ size: FILE_INPUT_SIZE_TO_REMOVE_BUTTON_SIZE_MAP[size],
431
+ icon: XIcon,
432
+ ariaLabel: `Remove ${file.name}`,
433
+ isDisabled,
434
+ onClick: () => remove(index)
435
+ }) })
436
+ ] }, fileKey(file)))
437
+ }),
438
+ /* @__PURE__ */ jsx(StatusRegion, {
439
+ role: "status",
440
+ "aria-live": "polite",
441
+ children: announcement
442
+ })
443
+ ]
444
+ });
445
+ }
446
+ /** A drop zone and a "Choose files" button over a hidden native file input, with the chosen files listed. */
447
+ var FileInput = forwardRef(function FileInput(props, ref) {
448
+ const { label, error, isRequired = false, size = "MEDIUM", fillWidth = false, id, className, style } = props;
449
+ const ownField = useOwnField({
450
+ componentName: "FileInput",
451
+ label,
452
+ error,
453
+ isRequired,
454
+ size: FILE_INPUT_SIZE_TO_FIELD_SIZE_MAP[size],
455
+ id,
456
+ className,
457
+ style,
458
+ rootClassName: fillWidth && FILL_WIDTH_CSS
459
+ });
460
+ if (ownField !== null) return /* @__PURE__ */ jsx(Field, {
461
+ ...ownField,
462
+ children: /* @__PURE__ */ jsx(FileGroup, {
463
+ fileProps: props,
464
+ forwardedRef: ref,
465
+ isRoot: false
466
+ })
467
+ });
468
+ return /* @__PURE__ */ jsx(FileGroup, {
469
+ fileProps: props,
470
+ forwardedRef: ref,
471
+ isRoot: true
472
+ });
473
+ });
474
+ FileInput.displayName = "FileInput";
475
+ //#endregion
476
+ export { FileInputSize, FileInputVariant, FileInput as default };