@galaxy-io/dls 1.6.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (538) hide show
  1. package/README.md +47 -50
  2. package/biome/index.json +74 -0
  3. package/biome/plugins/no-hex-literal.grit +20 -0
  4. package/biome/plugins/no-inline-style.grit +13 -0
  5. package/biome/plugins/no-margin.grit +9 -0
  6. package/biome/plugins/warn/no-hex-literal.grit +23 -0
  7. package/biome/plugins/warn/no-inline-style.grit +13 -0
  8. package/biome/plugins/warn/no-margin.grit +9 -0
  9. package/dist/a11y/FocusScope.d.ts +44 -0
  10. package/dist/a11y/FocusScope.js +229 -0
  11. package/dist/a11y/VisuallyHidden.d.ts +21 -0
  12. package/dist/a11y/VisuallyHidden.js +30 -0
  13. package/dist/avatar/Avatar.d.ts +56 -14
  14. package/dist/avatar/Avatar.js +250 -96
  15. package/dist/avatar/AvatarGroup.d.ts +43 -0
  16. package/dist/avatar/AvatarGroup.js +153 -0
  17. package/dist/backgrounds/GridBackground.d.ts +48 -0
  18. package/dist/backgrounds/GridBackground.js +146 -0
  19. package/dist/beacons/Beacon.d.ts +86 -22
  20. package/dist/beacons/Beacon.js +170 -47
  21. package/dist/brand/GalaxyFilamentWordmark.d.ts +30 -0
  22. package/dist/brand/GalaxyFilamentWordmark.js +39 -0
  23. package/dist/brand/GalaxyLogomark.d.ts +26 -0
  24. package/dist/brand/GalaxyLogomark.js +41 -0
  25. package/dist/brand/GalaxyLogomarkAnimation.d.ts +36 -0
  26. package/dist/brand/GalaxyLogomarkAnimation.js +107 -0
  27. package/dist/brand/GalaxyWordmark.d.ts +30 -0
  28. package/dist/brand/GalaxyWordmark.js +63 -0
  29. package/dist/brand/assets/galaxy-logomark-animation.js +136678 -0
  30. package/dist/brand/brandMark.d.ts +26 -0
  31. package/dist/brand/brandMark.js +35 -0
  32. package/dist/buttons/Button.d.ts +148 -59
  33. package/dist/buttons/Button.js +437 -227
  34. package/dist/buttons/ButtonGroup.d.ts +38 -0
  35. package/dist/buttons/ButtonGroup.js +68 -0
  36. package/dist/buttons/CopyButton.d.ts +77 -0
  37. package/dist/buttons/CopyButton.js +65 -0
  38. package/dist/charts/AreaChart.d.ts +49 -0
  39. package/dist/charts/AreaChart.js +31 -0
  40. package/dist/charts/BarChart.d.ts +54 -67
  41. package/dist/charts/BarChart.js +136 -116
  42. package/dist/charts/ChartAxis.d.ts +35 -40
  43. package/dist/charts/ChartAxis.js +114 -90
  44. package/dist/charts/ChartCategoryTargets.d.ts +12 -26
  45. package/dist/charts/ChartCategoryTargets.js +32 -20
  46. package/dist/charts/ChartFrame.d.ts +69 -116
  47. package/dist/charts/ChartFrame.js +253 -119
  48. package/dist/charts/ChartGroupProvider.d.ts +30 -41
  49. package/dist/charts/ChartGroupProvider.js +20 -7
  50. package/dist/charts/ChartLegend.d.ts +27 -48
  51. package/dist/charts/ChartLegend.js +206 -125
  52. package/dist/charts/ChartMarkTargets.d.ts +12 -28
  53. package/dist/charts/ChartMarkTargets.js +33 -20
  54. package/dist/charts/ChartPrimitives.d.ts +50 -305
  55. package/dist/charts/ChartPrimitives.js +65 -413
  56. package/dist/charts/ChartTooltip.d.ts +20 -26
  57. package/dist/charts/ChartTooltip.js +77 -40
  58. package/dist/charts/Heatmap.d.ts +35 -0
  59. package/dist/charts/Heatmap.js +295 -0
  60. package/dist/charts/LineChart.d.ts +54 -47
  61. package/dist/charts/LineChart.js +159 -117
  62. package/dist/charts/PieChart.d.ts +32 -53
  63. package/dist/charts/PieChart.js +149 -135
  64. package/dist/charts/Sparkline.d.ts +107 -0
  65. package/dist/charts/Sparkline.js +244 -0
  66. package/dist/charts/StatChart.d.ts +37 -13
  67. package/dist/charts/StatChart.js +82 -35
  68. package/dist/charts/barChartGeometry.d.ts +138 -86
  69. package/dist/charts/barChartGeometry.js +122 -101
  70. package/dist/charts/barChartLegend.d.ts +14 -18
  71. package/dist/charts/barChartLegend.js +18 -13
  72. package/dist/charts/chartFormat.d.ts +12 -18
  73. package/dist/charts/chartFormat.js +20 -52
  74. package/dist/charts/chartPalette.d.ts +33 -0
  75. package/dist/charts/chartPalette.js +68 -0
  76. package/dist/charts/chartScales.d.ts +41 -108
  77. package/dist/charts/chartScales.js +62 -128
  78. package/dist/charts/constants.d.ts +96 -256
  79. package/dist/charts/constants.js +105 -275
  80. package/dist/charts/heatmapGeometry.d.ts +95 -0
  81. package/dist/charts/heatmapGeometry.js +155 -0
  82. package/dist/charts/lineChartGeometry.d.ts +108 -58
  83. package/dist/charts/lineChartGeometry.js +120 -78
  84. package/dist/charts/pieChartGeometry.d.ts +66 -40
  85. package/dist/charts/pieChartGeometry.js +68 -38
  86. package/dist/charts/types.d.ts +197 -466
  87. package/dist/charts/types.js +55 -144
  88. package/dist/charts/useCartesianChartLayout.d.ts +28 -59
  89. package/dist/charts/useCartesianChartLayout.js +47 -32
  90. package/dist/charts/useChartDimensions.d.ts +19 -40
  91. package/dist/charts/useChartDimensions.js +40 -56
  92. package/dist/charts/useChartFormatters.d.ts +6 -15
  93. package/dist/charts/useChartFormatters.js +4 -9
  94. package/dist/charts/useChartInteraction.d.ts +47 -116
  95. package/dist/charts/useChartInteraction.js +95 -71
  96. package/dist/charts/useChartTooltipPosition.d.ts +29 -39
  97. package/dist/charts/useChartTooltipPosition.js +14 -5
  98. package/dist/charts/useSeriesColorResolver.d.ts +11 -33
  99. package/dist/charts/useSeriesColorResolver.js +19 -12
  100. package/dist/chips/Chip.d.ts +155 -44
  101. package/dist/chips/Chip.js +329 -155
  102. package/dist/chips/ChipGroup.d.ts +53 -0
  103. package/dist/chips/ChipGroup.js +98 -0
  104. package/dist/drawer/Drawer.d.ts +81 -17
  105. package/dist/drawer/Drawer.js +370 -65
  106. package/dist/dropdown/Dropdown.d.ts +80 -63
  107. package/dist/dropdown/Dropdown.js +127 -129
  108. package/dist/editor/CodeEditor.d.ts +119 -40
  109. package/dist/editor/CodeEditor.js +490 -400
  110. package/dist/editor/CodeEditorReactWidget.d.ts +20 -17
  111. package/dist/editor/CodeEditorReactWidget.js +28 -21
  112. package/dist/feedback/Alert.d.ts +49 -0
  113. package/dist/feedback/Alert.js +172 -0
  114. package/dist/feedback/EmptyState.d.ts +39 -0
  115. package/dist/feedback/EmptyState.js +109 -0
  116. package/dist/feedback/ProgressBar.d.ts +125 -0
  117. package/dist/feedback/ProgressBar.js +183 -0
  118. package/dist/feedback/ProgressCircle.d.ts +99 -0
  119. package/dist/feedback/ProgressCircle.js +187 -0
  120. package/dist/feedback/Skeleton.d.ts +69 -0
  121. package/dist/feedback/Skeleton.js +130 -0
  122. package/dist/feedback/Spinner.d.ts +63 -0
  123. package/dist/feedback/Spinner.js +141 -0
  124. package/dist/fonts.css +70 -0
  125. package/dist/hooks/internal/useIsClient.d.ts +2 -0
  126. package/dist/hooks/internal/useIsClient.js +14 -0
  127. package/dist/hooks/useClipboard.d.ts +19 -0
  128. package/dist/hooks/useClipboard.js +45 -0
  129. package/dist/hooks/useControlledOpenState.d.ts +21 -0
  130. package/dist/hooks/useControlledOpenState.js +19 -0
  131. package/dist/hooks/useControlledState.d.ts +19 -0
  132. package/dist/hooks/useControlledState.js +22 -0
  133. package/dist/hooks/useDebouncedValue.d.ts +14 -0
  134. package/dist/hooks/useDebouncedValue.js +33 -0
  135. package/dist/hooks/useDisclosure.d.ts +26 -0
  136. package/dist/hooks/useDisclosure.js +36 -0
  137. package/dist/hooks/useDismiss.d.ts +23 -27
  138. package/dist/hooks/useDismiss.js +39 -27
  139. package/dist/hooks/useElementClientSize.d.ts +10 -10
  140. package/dist/hooks/useElementClientSize.js +8 -11
  141. package/dist/hooks/useElementWidth.d.ts +6 -13
  142. package/dist/hooks/useElementWidth.js +6 -14
  143. package/dist/hooks/useField.d.ts +47 -0
  144. package/dist/hooks/useField.js +40 -0
  145. package/dist/hooks/useHotkey.d.ts +77 -0
  146. package/dist/hooks/useHotkey.js +246 -0
  147. package/dist/hooks/useIsMac.d.ts +12 -0
  148. package/dist/hooks/useIsMac.js +27 -0
  149. package/dist/hooks/useIsomorphicLayoutEffect.d.ts +17 -0
  150. package/dist/hooks/useIsomorphicLayoutEffect.js +20 -0
  151. package/dist/hooks/useLocalStorage.d.ts +28 -0
  152. package/dist/hooks/useLocalStorage.js +145 -0
  153. package/dist/hooks/useMediaQuery.d.ts +11 -0
  154. package/dist/hooks/useMediaQuery.js +23 -0
  155. package/dist/hooks/usePrefersReducedMotion.d.ts +12 -0
  156. package/dist/hooks/usePrefersReducedMotion.js +25 -0
  157. package/dist/hooks/useResize.d.ts +42 -62
  158. package/dist/hooks/useResize.js +43 -31
  159. package/dist/icons/Icon.d.ts +64 -37
  160. package/dist/icons/Icon.js +96 -37
  161. package/dist/icons/internal/IconSlot.d.ts +10 -0
  162. package/dist/icons/internal/IconSlot.js +32 -0
  163. package/dist/inputs/CheckboxGroup.d.ts +115 -0
  164. package/dist/inputs/CheckboxGroup.js +183 -0
  165. package/dist/inputs/CheckboxInput.d.ts +98 -28
  166. package/dist/inputs/CheckboxInput.js +218 -88
  167. package/dist/inputs/ColorInput.d.ts +115 -29
  168. package/dist/inputs/ColorInput.js +748 -326
  169. package/dist/inputs/CopyInput.d.ts +49 -20
  170. package/dist/inputs/CopyInput.js +57 -49
  171. package/dist/inputs/CronInput.d.ts +94 -0
  172. package/dist/inputs/CronInput.js +618 -0
  173. package/dist/inputs/DateInput.d.ts +175 -28
  174. package/dist/inputs/DateInput.js +1109 -451
  175. package/dist/inputs/DurationInput.d.ts +101 -0
  176. package/dist/inputs/DurationInput.js +441 -0
  177. package/dist/inputs/Field.d.ts +75 -0
  178. package/dist/inputs/Field.js +247 -0
  179. package/dist/inputs/Fieldset.d.ts +53 -0
  180. package/dist/inputs/Fieldset.js +149 -0
  181. package/dist/inputs/FileInput.d.ts +110 -0
  182. package/dist/inputs/FileInput.js +476 -0
  183. package/dist/inputs/Input.d.ts +148 -187
  184. package/dist/inputs/Input.js +339 -259
  185. package/dist/inputs/KeyValueInput.d.ts +120 -0
  186. package/dist/inputs/KeyValueInput.js +383 -0
  187. package/dist/inputs/MultiSelectInput.d.ts +165 -54
  188. package/dist/inputs/MultiSelectInput.js +175 -559
  189. package/dist/inputs/NumberInput.d.ts +65 -9
  190. package/dist/inputs/NumberInput.js +197 -40
  191. package/dist/inputs/PasswordInput.d.ts +17 -12
  192. package/dist/inputs/PasswordInput.js +33 -33
  193. package/dist/inputs/PinInput.d.ts +117 -0
  194. package/dist/inputs/PinInput.js +364 -0
  195. package/dist/inputs/RadioGroup.d.ts +115 -0
  196. package/dist/inputs/RadioGroup.js +179 -0
  197. package/dist/inputs/RadioInput.d.ts +87 -24
  198. package/dist/inputs/RadioInput.js +182 -95
  199. package/dist/inputs/SearchInput.d.ts +66 -0
  200. package/dist/inputs/SearchInput.js +156 -0
  201. package/dist/inputs/SelectInput.d.ts +195 -55
  202. package/dist/inputs/SelectInput.js +1308 -446
  203. package/dist/inputs/SliderInput.d.ts +150 -30
  204. package/dist/inputs/SliderInput.js +441 -186
  205. package/dist/inputs/SwitchInput.d.ts +109 -0
  206. package/dist/inputs/SwitchInput.js +248 -0
  207. package/dist/inputs/TagInput.d.ts +117 -0
  208. package/dist/inputs/TagInput.js +408 -0
  209. package/dist/inputs/TextAreaInput.d.ts +146 -44
  210. package/dist/inputs/TextAreaInput.js +292 -198
  211. package/dist/inputs/TextInput.d.ts +4 -13
  212. package/dist/inputs/TextInput.js +13 -48
  213. package/dist/inputs/ToggleInput.d.ts +120 -22
  214. package/dist/inputs/ToggleInput.js +262 -116
  215. package/dist/inputs/internal/bareField.d.ts +18 -0
  216. package/dist/inputs/internal/bareField.js +38 -0
  217. package/dist/inputs/internal/devWarn.d.ts +7 -0
  218. package/dist/inputs/internal/devWarn.js +30 -0
  219. package/dist/inputs/internal/fieldFrame.d.ts +34 -0
  220. package/dist/inputs/internal/fieldFrame.js +64 -0
  221. package/dist/inputs/internal/fieldWiring.d.ts +50 -0
  222. package/dist/inputs/internal/fieldWiring.js +38 -0
  223. package/dist/inputs/internal/innerButton.d.ts +2 -0
  224. package/dist/inputs/internal/innerButton.js +24 -0
  225. package/dist/inputs/internal/ownField.d.ts +45 -0
  226. package/dist/inputs/internal/ownField.js +58 -0
  227. package/dist/inputs/internal/predicates.d.ts +9 -0
  228. package/dist/inputs/internal/predicates.js +11 -0
  229. package/dist/inputs/internal/useComboboxPopover.d.ts +46 -0
  230. package/dist/inputs/internal/useComboboxPopover.js +92 -0
  231. package/dist/json/JsonViewer.d.ts +62 -0
  232. package/dist/json/JsonViewer.js +483 -0
  233. package/dist/layout/Box.d.ts +87 -0
  234. package/dist/layout/Box.js +109 -0
  235. package/dist/layout/Divider.d.ts +25 -0
  236. package/dist/layout/Divider.js +70 -0
  237. package/dist/layout/Flex.d.ts +139 -0
  238. package/dist/layout/Flex.js +165 -0
  239. package/dist/layout/FlexItem.d.ts +72 -0
  240. package/dist/layout/FlexItem.js +84 -0
  241. package/dist/layout/Grid.d.ts +140 -0
  242. package/dist/layout/Grid.js +178 -0
  243. package/dist/layout/Portal.d.ts +29 -0
  244. package/dist/layout/Portal.js +27 -0
  245. package/dist/layout/ResizablePanels.d.ts +88 -0
  246. package/dist/layout/ResizablePanels.js +198 -0
  247. package/dist/layout/ResizeHandle.d.ts +48 -0
  248. package/dist/layout/ResizeHandle.js +143 -0
  249. package/dist/layout/ScrollArea.d.ts +30 -0
  250. package/dist/layout/ScrollArea.js +138 -0
  251. package/dist/links/Link.d.ts +101 -1
  252. package/dist/links/Link.js +166 -4
  253. package/dist/lists/BulletedList.d.ts +25 -7
  254. package/dist/lists/BulletedList.js +72 -27
  255. package/dist/lists/DescriptionList.d.ts +91 -0
  256. package/dist/lists/DescriptionList.js +147 -0
  257. package/dist/menu/ContextMenu.d.ts +64 -0
  258. package/dist/menu/ContextMenu.js +34 -0
  259. package/dist/menu/Menu.d.ts +280 -0
  260. package/dist/menu/Menu.js +1003 -0
  261. package/dist/modal/ConfirmDialog.d.ts +55 -0
  262. package/dist/modal/ConfirmDialog.js +151 -0
  263. package/dist/modal/Modal.d.ts +64 -14
  264. package/dist/modal/Modal.js +189 -48
  265. package/dist/navigation/Breadcrumbs.d.ts +65 -0
  266. package/dist/navigation/Breadcrumbs.js +243 -0
  267. package/dist/navigation/CommandPalette.d.ts +83 -0
  268. package/dist/navigation/CommandPalette.js +509 -0
  269. package/dist/navigation/Pagination.d.ts +87 -0
  270. package/dist/navigation/Pagination.js +300 -0
  271. package/dist/navigation/SidebarNav.d.ts +107 -0
  272. package/dist/navigation/SidebarNav.js +341 -0
  273. package/dist/navigation/Stepper.d.ts +52 -0
  274. package/dist/navigation/Stepper.js +207 -0
  275. package/dist/navigation/Tabs.d.ts +113 -0
  276. package/dist/navigation/Tabs.js +543 -0
  277. package/dist/navigation/Topbar.d.ts +20 -0
  278. package/dist/navigation/Topbar.js +62 -0
  279. package/dist/overlay/OverlayProvider.d.ts +28 -32
  280. package/dist/overlay/OverlayProvider.js +42 -93
  281. package/dist/overlay/useOverlay.d.ts +88 -12
  282. package/dist/overlay/useOverlay.js +220 -43
  283. package/dist/overlays/Popover.d.ts +114 -0
  284. package/dist/overlays/Popover.js +389 -0
  285. package/dist/shapes/Circle.d.ts +84 -8
  286. package/dist/shapes/Circle.js +122 -20
  287. package/dist/shapes/Square.d.ts +84 -8
  288. package/dist/shapes/Square.js +123 -20
  289. package/dist/styles/mixins.d.ts +35 -0
  290. package/dist/styles/mixins.js +60 -0
  291. package/dist/styles.css +1 -202
  292. package/dist/table/InfiniteSpreadsheet.d.ts +140 -10
  293. package/dist/table/InfiniteSpreadsheet.js +762 -225
  294. package/dist/table/InfiniteTable.d.ts +116 -14
  295. package/dist/table/InfiniteTable.js +287 -429
  296. package/dist/table/SpreadsheetCellEditor.d.ts +54 -6
  297. package/dist/table/SpreadsheetCellEditor.js +163 -84
  298. package/dist/table/TableCore.d.ts +252 -0
  299. package/dist/table/TableCore.js +1077 -0
  300. package/dist/table/VirtualizedInfiniteTable.d.ts +104 -14
  301. package/dist/table/VirtualizedInfiniteTable.js +280 -219
  302. package/dist/table/types.d.ts +66 -244
  303. package/dist/table/types.js +0 -51
  304. package/dist/table/useInfiniteScrollSentinel.d.ts +25 -21
  305. package/dist/table/useInfiniteScrollSentinel.js +38 -30
  306. package/dist/table/useSpreadsheetCellNavigation.d.ts +44 -0
  307. package/dist/table/useSpreadsheetCellNavigation.js +141 -0
  308. package/dist/table/useTableColumnLayout.d.ts +90 -25
  309. package/dist/table/useTableColumnLayout.js +255 -50
  310. package/dist/table/useTableKeyboardNavigation.d.ts +32 -21
  311. package/dist/table/useTableKeyboardNavigation.js +95 -71
  312. package/dist/table/useTableRowSelection.d.ts +24 -25
  313. package/dist/table/useTableRowSelection.js +57 -84
  314. package/dist/table/useTableVirtualizer.d.ts +20 -0
  315. package/dist/table/useTableVirtualizer.js +48 -0
  316. package/dist/text/Bold.d.ts +5 -6
  317. package/dist/text/Bold.js +16 -15
  318. package/dist/text/Code.d.ts +5 -6
  319. package/dist/text/Code.js +16 -25
  320. package/dist/text/CodeBlock.d.ts +77 -0
  321. package/dist/text/CodeBlock.js +373 -0
  322. package/dist/text/EditableText.d.ts +55 -15
  323. package/dist/text/EditableText.js +153 -135
  324. package/dist/text/Ellipsis.d.ts +34 -8
  325. package/dist/text/Ellipsis.js +55 -23
  326. package/dist/text/Kbd.d.ts +72 -0
  327. package/dist/text/Kbd.js +284 -0
  328. package/dist/text/MarkdownText.d.ts +27 -10
  329. package/dist/text/MarkdownText.js +317 -300
  330. package/dist/text/RequiredMarker.d.ts +17 -5
  331. package/dist/text/RequiredMarker.js +34 -36
  332. package/dist/text/Selectable.d.ts +5 -6
  333. package/dist/text/Selectable.js +16 -13
  334. package/dist/text/Span.d.ts +82 -0
  335. package/dist/text/Span.js +115 -0
  336. package/dist/text/Text.d.ts +128 -41
  337. package/dist/text/Text.js +209 -76
  338. package/dist/theme/GalaxyProvider.d.ts +75 -0
  339. package/dist/theme/GalaxyProvider.js +223 -0
  340. package/dist/theme/ThemeSwitcher.d.ts +52 -0
  341. package/dist/theme/ThemeSwitcher.js +94 -0
  342. package/dist/theme/enums.d.ts +118 -0
  343. package/dist/theme/enums.js +144 -0
  344. package/dist/theme/tokens/dark.d.ts +2 -0
  345. package/dist/theme/tokens/dark.js +275 -0
  346. package/dist/theme/tokens/generate.d.ts +15 -0
  347. package/dist/theme/tokens/generate.js +47 -0
  348. package/dist/theme/tokens/light.d.ts +2 -0
  349. package/dist/theme/tokens/light.js +274 -0
  350. package/dist/theme/tokens/palette.d.ts +14 -0
  351. package/dist/theme/tokens/palette.js +153 -0
  352. package/dist/theme/tokens/scales.d.ts +26 -0
  353. package/dist/theme/tokens/scales.js +154 -0
  354. package/dist/theme/tokens/t.d.ts +3 -0
  355. package/dist/theme/tokens/t.js +25 -0
  356. package/dist/theme/tokens/types.d.ts +189 -0
  357. package/dist/theme/tokens/types.js +0 -0
  358. package/dist/theme/useGalaxyTheme.d.ts +46 -0
  359. package/dist/theme/useGalaxyTheme.js +36 -0
  360. package/dist/theme/useInverseScope.d.ts +18 -0
  361. package/dist/theme/useInverseScope.js +33 -0
  362. package/dist/three/GalaxyLogomark3D.d.ts +46 -0
  363. package/dist/three/GalaxyLogomark3D.js +134 -0
  364. package/dist/three/assets/galaxy-logomark.js +4 -0
  365. package/dist/three/galaxyLogomark3DScene.d.ts +27 -0
  366. package/dist/three/galaxyLogomark3DScene.js +165 -0
  367. package/dist/timeline/Timeline.d.ts +99 -0
  368. package/dist/timeline/Timeline.js +269 -0
  369. package/dist/toast/Toast.d.ts +43 -19
  370. package/dist/toast/Toast.js +130 -89
  371. package/dist/toast/ToastProvider.d.ts +23 -23
  372. package/dist/toast/ToastProvider.js +298 -101
  373. package/dist/toast/ToastViewport.d.ts +12 -0
  374. package/dist/toast/ToastViewport.js +210 -0
  375. package/dist/toast/useToast.d.ts +139 -5
  376. package/dist/toast/useToast.js +15 -13
  377. package/dist/tokens.css +654 -0
  378. package/dist/tooltip/Tooltip.d.ts +64 -44
  379. package/dist/tooltip/Tooltip.js +280 -73
  380. package/dist/tooltip/internal/LazyTooltip.d.ts +7 -0
  381. package/dist/tooltip/internal/LazyTooltip.js +53 -0
  382. package/dist/transform/Fade.d.ts +33 -11
  383. package/dist/transform/Fade.js +71 -19
  384. package/dist/transform/Flasher.d.ts +25 -0
  385. package/dist/transform/Flasher.js +39 -0
  386. package/dist/transform/Rotate.d.ts +24 -12
  387. package/dist/transform/Rotate.js +36 -22
  388. package/dist/transform/ScaleFade.d.ts +36 -11
  389. package/dist/transform/ScaleFade.js +86 -28
  390. package/dist/transform/internal/CollapseMotion.d.ts +10 -0
  391. package/dist/transform/internal/CollapseMotion.js +65 -0
  392. package/dist/tree/Tree.d.ts +85 -0
  393. package/dist/tree/Tree.js +387 -0
  394. package/dist/tree/treeRow.d.ts +39 -0
  395. package/dist/tree/treeRow.js +75 -0
  396. package/dist/utils/colors.d.ts +46 -13
  397. package/dist/utils/colors.js +92 -34
  398. package/dist/utils/css.d.ts +23 -0
  399. package/dist/utils/css.js +30 -0
  400. package/dist/utils/format.d.ts +58 -0
  401. package/dist/utils/format.js +220 -0
  402. package/dist/vite/index.d.ts +16 -0
  403. package/dist/vite/index.js +52 -0
  404. package/dist/widget/Widget.d.ts +164 -48
  405. package/dist/widget/Widget.js +335 -96
  406. package/dist/widget/WidgetGroup.d.ts +36 -0
  407. package/dist/widget/WidgetGroup.js +103 -0
  408. package/package.json +851 -157
  409. package/dist/accordion/Accordion.d.ts +0 -54
  410. package/dist/accordion/Accordion.js +0 -183
  411. package/dist/assets/components/GalaxyFilamentWordmarkDark.d.ts +0 -3
  412. package/dist/assets/components/GalaxyFilamentWordmarkDark.js +0 -14
  413. package/dist/assets/components/GalaxyFilamentWordmarkLight.d.ts +0 -3
  414. package/dist/assets/components/GalaxyFilamentWordmarkLight.js +0 -14
  415. package/dist/assets/components/GalaxyLogomarkDark.d.ts +0 -3
  416. package/dist/assets/components/GalaxyLogomarkDark.js +0 -11
  417. package/dist/assets/components/GalaxyLogomarkLight.d.ts +0 -3
  418. package/dist/assets/components/GalaxyLogomarkLight.js +0 -17
  419. package/dist/assets/components/GalaxyWordmarkDark.d.ts +0 -3
  420. package/dist/assets/components/GalaxyWordmarkDark.js +0 -15
  421. package/dist/assets/components/GalaxyWordmarkLight.d.ts +0 -3
  422. package/dist/assets/components/GalaxyWordmarkLight.js +0 -28
  423. package/dist/assets/models/galaxy-animation.js +0 -136666
  424. package/dist/assets/models/galaxy-logomark.js +0 -4
  425. package/dist/avatar/AvatarShimmer.d.ts +0 -30
  426. package/dist/avatar/AvatarShimmer.js +0 -22
  427. package/dist/backgrounds/CellGridBackground.d.ts +0 -24
  428. package/dist/backgrounds/CellGridBackground.js +0 -44
  429. package/dist/backgrounds/CrossGridBackground.d.ts +0 -26
  430. package/dist/backgrounds/CrossGridBackground.js +0 -49
  431. package/dist/backgrounds/DotGridBackground.d.ts +0 -24
  432. package/dist/backgrounds/DotGridBackground.js +0 -47
  433. package/dist/badge/Badge.d.ts +0 -42
  434. package/dist/badge/Badge.js +0 -99
  435. package/dist/charts/ChartEmptyState.d.ts +0 -17
  436. package/dist/charts/ChartEmptyState.js +0 -29
  437. package/dist/charts/ProgressBar.d.ts +0 -29
  438. package/dist/charts/ProgressBar.js +0 -65
  439. package/dist/charts/chartTheme.d.ts +0 -18
  440. package/dist/charts/chartTheme.js +0 -26
  441. package/dist/containers/FlexItem.d.ts +0 -50
  442. package/dist/containers/FlexItem.js +0 -91
  443. package/dist/containers/FlexWrapper.d.ts +0 -96
  444. package/dist/containers/FlexWrapper.js +0 -143
  445. package/dist/containers/GridWrapper.d.ts +0 -79
  446. package/dist/containers/GridWrapper.js +0 -125
  447. package/dist/containers/Spacing.d.ts +0 -23
  448. package/dist/containers/Spacing.js +0 -59
  449. package/dist/containers/Wrapper.d.ts +0 -26
  450. package/dist/containers/Wrapper.js +0 -54
  451. package/dist/dividers/HorizontalDivider.d.ts +0 -7
  452. package/dist/dividers/HorizontalDivider.js +0 -39
  453. package/dist/dividers/VerticalDivider.d.ts +0 -6
  454. package/dist/dividers/VerticalDivider.js +0 -21
  455. package/dist/icons/GalaxyFilamentWordmark.d.ts +0 -11
  456. package/dist/icons/GalaxyFilamentWordmark.js +0 -25
  457. package/dist/icons/GalaxyLogomark.d.ts +0 -13
  458. package/dist/icons/GalaxyLogomark.js +0 -27
  459. package/dist/icons/GalaxyLogomark3D.d.ts +0 -56
  460. package/dist/icons/GalaxyLogomark3D.js +0 -319
  461. package/dist/icons/GalaxyLogomarkAnimation.d.ts +0 -18
  462. package/dist/icons/GalaxyLogomarkAnimation.js +0 -48
  463. package/dist/icons/GalaxyWordmark.d.ts +0 -11
  464. package/dist/icons/GalaxyWordmark.js +0 -25
  465. package/dist/inputs/MultiTextInput.d.ts +0 -32
  466. package/dist/inputs/MultiTextInput.js +0 -180
  467. package/dist/inputs/SwitcherInput.d.ts +0 -27
  468. package/dist/inputs/SwitcherInput.js +0 -64
  469. package/dist/inputs/hooks.d.ts +0 -10
  470. package/dist/inputs/hooks.js +0 -22
  471. package/dist/overlay/constants.d.ts +0 -28
  472. package/dist/overlay/constants.js +0 -37
  473. package/dist/resizable/HorizontalResizeHandle.d.ts +0 -17
  474. package/dist/resizable/HorizontalResizeHandle.js +0 -38
  475. package/dist/resizable/VerticalResizeHandle.d.ts +0 -18
  476. package/dist/resizable/VerticalResizeHandle.js +0 -39
  477. package/dist/table/SpreadsheetCell.d.ts +0 -21
  478. package/dist/table/SpreadsheetCell.js +0 -71
  479. package/dist/table/SpreadsheetHeaderCell.d.ts +0 -23
  480. package/dist/table/SpreadsheetHeaderCell.js +0 -91
  481. package/dist/table/SpreadsheetMenuItem.d.ts +0 -14
  482. package/dist/table/SpreadsheetMenuItem.js +0 -33
  483. package/dist/table/SpreadsheetPrimitives.d.ts +0 -172
  484. package/dist/table/SpreadsheetPrimitives.js +0 -105
  485. package/dist/table/SpreadsheetRow.d.ts +0 -33
  486. package/dist/table/SpreadsheetRow.js +0 -73
  487. package/dist/table/SpreadsheetRowActionCell.d.ts +0 -14
  488. package/dist/table/SpreadsheetRowActionCell.js +0 -51
  489. package/dist/table/TableExpandCell.d.ts +0 -11
  490. package/dist/table/TableExpandCell.js +0 -24
  491. package/dist/table/TableExpandedRow.d.ts +0 -16
  492. package/dist/table/TableExpandedRow.js +0 -77
  493. package/dist/table/TableHeaderCellContent.d.ts +0 -30
  494. package/dist/table/TableHeaderCellContent.js +0 -48
  495. package/dist/table/TablePrimitives.d.ts +0 -313
  496. package/dist/table/TablePrimitives.js +0 -302
  497. package/dist/table/TableSelectCell.d.ts +0 -18
  498. package/dist/table/TableSelectCell.js +0 -27
  499. package/dist/table/TableStatusRow.d.ts +0 -18
  500. package/dist/table/TableStatusRow.js +0 -50
  501. package/dist/table/useSpreadsheetEditing.d.ts +0 -13
  502. package/dist/table/useSpreadsheetEditing.js +0 -41
  503. package/dist/table/useTableColumnResize.d.ts +0 -38
  504. package/dist/table/useTableColumnResize.js +0 -155
  505. package/dist/table/useTableRowExpansion.d.ts +0 -24
  506. package/dist/table/useTableRowExpansion.js +0 -62
  507. package/dist/table/utils.d.ts +0 -50
  508. package/dist/table/utils.js +0 -78
  509. package/dist/text/HotKeys.d.ts +0 -30
  510. package/dist/text/HotKeys.js +0 -74
  511. package/dist/text/Paragraph.d.ts +0 -33
  512. package/dist/text/Paragraph.js +0 -83
  513. package/dist/text/TextShimmer.d.ts +0 -14
  514. package/dist/text/TextShimmer.js +0 -34
  515. package/dist/theme/GalaxyTheme.d.ts +0 -67
  516. package/dist/theme/GalaxyTheme.js +0 -119
  517. package/dist/theme/constants.d.ts +0 -8
  518. package/dist/theme/constants.js +0 -38
  519. package/dist/theme/index.d.ts +0 -6
  520. package/dist/theme/index.js +0 -7
  521. package/dist/theme/types.d.ts +0 -195
  522. package/dist/theme/types.js +0 -10
  523. package/dist/theme/typography.d.ts +0 -2
  524. package/dist/theme/typography.js +0 -73
  525. package/dist/theme/variants/dark.d.ts +0 -2
  526. package/dist/theme/variants/dark.js +0 -125
  527. package/dist/theme/variants/light.d.ts +0 -2
  528. package/dist/theme/variants/light.js +0 -125
  529. package/dist/toast/ToastContainer.d.ts +0 -10
  530. package/dist/toast/ToastContainer.js +0 -31
  531. package/dist/toast/ToastWrapper.d.ts +0 -6
  532. package/dist/toast/ToastWrapper.js +0 -27
  533. package/dist/transform/Flash.d.ts +0 -7
  534. package/dist/transform/Flash.js +0 -18
  535. package/dist/transform/Spin.d.ts +0 -14
  536. package/dist/transform/Spin.js +0 -25
  537. package/dist/utils/linaria.d.ts +0 -1
  538. package/dist/utils/linaria.js +0 -8
@@ -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 };