@galaxy-io/dls 1.6.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (538) hide show
  1. package/README.md +47 -50
  2. package/biome/index.json +74 -0
  3. package/biome/plugins/no-hex-literal.grit +20 -0
  4. package/biome/plugins/no-inline-style.grit +13 -0
  5. package/biome/plugins/no-margin.grit +9 -0
  6. package/biome/plugins/warn/no-hex-literal.grit +23 -0
  7. package/biome/plugins/warn/no-inline-style.grit +13 -0
  8. package/biome/plugins/warn/no-margin.grit +9 -0
  9. package/dist/a11y/FocusScope.d.ts +44 -0
  10. package/dist/a11y/FocusScope.js +229 -0
  11. package/dist/a11y/VisuallyHidden.d.ts +21 -0
  12. package/dist/a11y/VisuallyHidden.js +30 -0
  13. package/dist/avatar/Avatar.d.ts +56 -14
  14. package/dist/avatar/Avatar.js +250 -96
  15. package/dist/avatar/AvatarGroup.d.ts +43 -0
  16. package/dist/avatar/AvatarGroup.js +153 -0
  17. package/dist/backgrounds/GridBackground.d.ts +48 -0
  18. package/dist/backgrounds/GridBackground.js +146 -0
  19. package/dist/beacons/Beacon.d.ts +86 -22
  20. package/dist/beacons/Beacon.js +170 -47
  21. package/dist/brand/GalaxyFilamentWordmark.d.ts +30 -0
  22. package/dist/brand/GalaxyFilamentWordmark.js +39 -0
  23. package/dist/brand/GalaxyLogomark.d.ts +26 -0
  24. package/dist/brand/GalaxyLogomark.js +41 -0
  25. package/dist/brand/GalaxyLogomarkAnimation.d.ts +36 -0
  26. package/dist/brand/GalaxyLogomarkAnimation.js +107 -0
  27. package/dist/brand/GalaxyWordmark.d.ts +30 -0
  28. package/dist/brand/GalaxyWordmark.js +63 -0
  29. package/dist/brand/assets/galaxy-logomark-animation.js +136678 -0
  30. package/dist/brand/brandMark.d.ts +26 -0
  31. package/dist/brand/brandMark.js +35 -0
  32. package/dist/buttons/Button.d.ts +148 -59
  33. package/dist/buttons/Button.js +437 -227
  34. package/dist/buttons/ButtonGroup.d.ts +38 -0
  35. package/dist/buttons/ButtonGroup.js +68 -0
  36. package/dist/buttons/CopyButton.d.ts +77 -0
  37. package/dist/buttons/CopyButton.js +65 -0
  38. package/dist/charts/AreaChart.d.ts +49 -0
  39. package/dist/charts/AreaChart.js +31 -0
  40. package/dist/charts/BarChart.d.ts +54 -67
  41. package/dist/charts/BarChart.js +136 -116
  42. package/dist/charts/ChartAxis.d.ts +35 -40
  43. package/dist/charts/ChartAxis.js +114 -90
  44. package/dist/charts/ChartCategoryTargets.d.ts +12 -26
  45. package/dist/charts/ChartCategoryTargets.js +32 -20
  46. package/dist/charts/ChartFrame.d.ts +69 -116
  47. package/dist/charts/ChartFrame.js +253 -119
  48. package/dist/charts/ChartGroupProvider.d.ts +30 -41
  49. package/dist/charts/ChartGroupProvider.js +20 -7
  50. package/dist/charts/ChartLegend.d.ts +27 -48
  51. package/dist/charts/ChartLegend.js +206 -125
  52. package/dist/charts/ChartMarkTargets.d.ts +12 -28
  53. package/dist/charts/ChartMarkTargets.js +33 -20
  54. package/dist/charts/ChartPrimitives.d.ts +50 -305
  55. package/dist/charts/ChartPrimitives.js +65 -413
  56. package/dist/charts/ChartTooltip.d.ts +20 -26
  57. package/dist/charts/ChartTooltip.js +77 -40
  58. package/dist/charts/Heatmap.d.ts +35 -0
  59. package/dist/charts/Heatmap.js +295 -0
  60. package/dist/charts/LineChart.d.ts +54 -47
  61. package/dist/charts/LineChart.js +159 -117
  62. package/dist/charts/PieChart.d.ts +32 -53
  63. package/dist/charts/PieChart.js +149 -135
  64. package/dist/charts/Sparkline.d.ts +107 -0
  65. package/dist/charts/Sparkline.js +244 -0
  66. package/dist/charts/StatChart.d.ts +37 -13
  67. package/dist/charts/StatChart.js +82 -35
  68. package/dist/charts/barChartGeometry.d.ts +138 -86
  69. package/dist/charts/barChartGeometry.js +122 -101
  70. package/dist/charts/barChartLegend.d.ts +14 -18
  71. package/dist/charts/barChartLegend.js +18 -13
  72. package/dist/charts/chartFormat.d.ts +12 -18
  73. package/dist/charts/chartFormat.js +20 -52
  74. package/dist/charts/chartPalette.d.ts +33 -0
  75. package/dist/charts/chartPalette.js +68 -0
  76. package/dist/charts/chartScales.d.ts +41 -108
  77. package/dist/charts/chartScales.js +62 -128
  78. package/dist/charts/constants.d.ts +96 -256
  79. package/dist/charts/constants.js +105 -275
  80. package/dist/charts/heatmapGeometry.d.ts +95 -0
  81. package/dist/charts/heatmapGeometry.js +155 -0
  82. package/dist/charts/lineChartGeometry.d.ts +108 -58
  83. package/dist/charts/lineChartGeometry.js +120 -78
  84. package/dist/charts/pieChartGeometry.d.ts +66 -40
  85. package/dist/charts/pieChartGeometry.js +68 -38
  86. package/dist/charts/types.d.ts +197 -466
  87. package/dist/charts/types.js +55 -144
  88. package/dist/charts/useCartesianChartLayout.d.ts +28 -59
  89. package/dist/charts/useCartesianChartLayout.js +47 -32
  90. package/dist/charts/useChartDimensions.d.ts +19 -40
  91. package/dist/charts/useChartDimensions.js +40 -56
  92. package/dist/charts/useChartFormatters.d.ts +6 -15
  93. package/dist/charts/useChartFormatters.js +4 -9
  94. package/dist/charts/useChartInteraction.d.ts +47 -116
  95. package/dist/charts/useChartInteraction.js +95 -71
  96. package/dist/charts/useChartTooltipPosition.d.ts +29 -39
  97. package/dist/charts/useChartTooltipPosition.js +14 -5
  98. package/dist/charts/useSeriesColorResolver.d.ts +11 -33
  99. package/dist/charts/useSeriesColorResolver.js +19 -12
  100. package/dist/chips/Chip.d.ts +155 -44
  101. package/dist/chips/Chip.js +329 -155
  102. package/dist/chips/ChipGroup.d.ts +53 -0
  103. package/dist/chips/ChipGroup.js +98 -0
  104. package/dist/drawer/Drawer.d.ts +81 -17
  105. package/dist/drawer/Drawer.js +370 -65
  106. package/dist/dropdown/Dropdown.d.ts +80 -63
  107. package/dist/dropdown/Dropdown.js +127 -129
  108. package/dist/editor/CodeEditor.d.ts +119 -40
  109. package/dist/editor/CodeEditor.js +490 -400
  110. package/dist/editor/CodeEditorReactWidget.d.ts +20 -17
  111. package/dist/editor/CodeEditorReactWidget.js +28 -21
  112. package/dist/feedback/Alert.d.ts +49 -0
  113. package/dist/feedback/Alert.js +172 -0
  114. package/dist/feedback/EmptyState.d.ts +39 -0
  115. package/dist/feedback/EmptyState.js +109 -0
  116. package/dist/feedback/ProgressBar.d.ts +125 -0
  117. package/dist/feedback/ProgressBar.js +183 -0
  118. package/dist/feedback/ProgressCircle.d.ts +99 -0
  119. package/dist/feedback/ProgressCircle.js +187 -0
  120. package/dist/feedback/Skeleton.d.ts +69 -0
  121. package/dist/feedback/Skeleton.js +130 -0
  122. package/dist/feedback/Spinner.d.ts +63 -0
  123. package/dist/feedback/Spinner.js +141 -0
  124. package/dist/fonts.css +70 -0
  125. package/dist/hooks/internal/useIsClient.d.ts +2 -0
  126. package/dist/hooks/internal/useIsClient.js +14 -0
  127. package/dist/hooks/useClipboard.d.ts +19 -0
  128. package/dist/hooks/useClipboard.js +45 -0
  129. package/dist/hooks/useControlledOpenState.d.ts +21 -0
  130. package/dist/hooks/useControlledOpenState.js +19 -0
  131. package/dist/hooks/useControlledState.d.ts +19 -0
  132. package/dist/hooks/useControlledState.js +22 -0
  133. package/dist/hooks/useDebouncedValue.d.ts +14 -0
  134. package/dist/hooks/useDebouncedValue.js +33 -0
  135. package/dist/hooks/useDisclosure.d.ts +26 -0
  136. package/dist/hooks/useDisclosure.js +36 -0
  137. package/dist/hooks/useDismiss.d.ts +23 -27
  138. package/dist/hooks/useDismiss.js +39 -27
  139. package/dist/hooks/useElementClientSize.d.ts +10 -10
  140. package/dist/hooks/useElementClientSize.js +8 -11
  141. package/dist/hooks/useElementWidth.d.ts +6 -13
  142. package/dist/hooks/useElementWidth.js +6 -14
  143. package/dist/hooks/useField.d.ts +47 -0
  144. package/dist/hooks/useField.js +40 -0
  145. package/dist/hooks/useHotkey.d.ts +77 -0
  146. package/dist/hooks/useHotkey.js +246 -0
  147. package/dist/hooks/useIsMac.d.ts +12 -0
  148. package/dist/hooks/useIsMac.js +27 -0
  149. package/dist/hooks/useIsomorphicLayoutEffect.d.ts +17 -0
  150. package/dist/hooks/useIsomorphicLayoutEffect.js +20 -0
  151. package/dist/hooks/useLocalStorage.d.ts +28 -0
  152. package/dist/hooks/useLocalStorage.js +145 -0
  153. package/dist/hooks/useMediaQuery.d.ts +11 -0
  154. package/dist/hooks/useMediaQuery.js +23 -0
  155. package/dist/hooks/usePrefersReducedMotion.d.ts +12 -0
  156. package/dist/hooks/usePrefersReducedMotion.js +25 -0
  157. package/dist/hooks/useResize.d.ts +42 -62
  158. package/dist/hooks/useResize.js +43 -31
  159. package/dist/icons/Icon.d.ts +64 -37
  160. package/dist/icons/Icon.js +96 -37
  161. package/dist/icons/internal/IconSlot.d.ts +10 -0
  162. package/dist/icons/internal/IconSlot.js +32 -0
  163. package/dist/inputs/CheckboxGroup.d.ts +115 -0
  164. package/dist/inputs/CheckboxGroup.js +183 -0
  165. package/dist/inputs/CheckboxInput.d.ts +98 -28
  166. package/dist/inputs/CheckboxInput.js +218 -88
  167. package/dist/inputs/ColorInput.d.ts +115 -29
  168. package/dist/inputs/ColorInput.js +748 -326
  169. package/dist/inputs/CopyInput.d.ts +49 -20
  170. package/dist/inputs/CopyInput.js +57 -49
  171. package/dist/inputs/CronInput.d.ts +94 -0
  172. package/dist/inputs/CronInput.js +618 -0
  173. package/dist/inputs/DateInput.d.ts +175 -28
  174. package/dist/inputs/DateInput.js +1109 -451
  175. package/dist/inputs/DurationInput.d.ts +101 -0
  176. package/dist/inputs/DurationInput.js +441 -0
  177. package/dist/inputs/Field.d.ts +75 -0
  178. package/dist/inputs/Field.js +247 -0
  179. package/dist/inputs/Fieldset.d.ts +53 -0
  180. package/dist/inputs/Fieldset.js +149 -0
  181. package/dist/inputs/FileInput.d.ts +110 -0
  182. package/dist/inputs/FileInput.js +476 -0
  183. package/dist/inputs/Input.d.ts +148 -187
  184. package/dist/inputs/Input.js +339 -259
  185. package/dist/inputs/KeyValueInput.d.ts +120 -0
  186. package/dist/inputs/KeyValueInput.js +383 -0
  187. package/dist/inputs/MultiSelectInput.d.ts +165 -54
  188. package/dist/inputs/MultiSelectInput.js +175 -559
  189. package/dist/inputs/NumberInput.d.ts +65 -9
  190. package/dist/inputs/NumberInput.js +197 -40
  191. package/dist/inputs/PasswordInput.d.ts +17 -12
  192. package/dist/inputs/PasswordInput.js +33 -33
  193. package/dist/inputs/PinInput.d.ts +117 -0
  194. package/dist/inputs/PinInput.js +364 -0
  195. package/dist/inputs/RadioGroup.d.ts +115 -0
  196. package/dist/inputs/RadioGroup.js +179 -0
  197. package/dist/inputs/RadioInput.d.ts +87 -24
  198. package/dist/inputs/RadioInput.js +182 -95
  199. package/dist/inputs/SearchInput.d.ts +66 -0
  200. package/dist/inputs/SearchInput.js +156 -0
  201. package/dist/inputs/SelectInput.d.ts +195 -55
  202. package/dist/inputs/SelectInput.js +1308 -446
  203. package/dist/inputs/SliderInput.d.ts +150 -30
  204. package/dist/inputs/SliderInput.js +441 -186
  205. package/dist/inputs/SwitchInput.d.ts +109 -0
  206. package/dist/inputs/SwitchInput.js +248 -0
  207. package/dist/inputs/TagInput.d.ts +117 -0
  208. package/dist/inputs/TagInput.js +408 -0
  209. package/dist/inputs/TextAreaInput.d.ts +146 -44
  210. package/dist/inputs/TextAreaInput.js +292 -198
  211. package/dist/inputs/TextInput.d.ts +4 -13
  212. package/dist/inputs/TextInput.js +13 -48
  213. package/dist/inputs/ToggleInput.d.ts +120 -22
  214. package/dist/inputs/ToggleInput.js +262 -116
  215. package/dist/inputs/internal/bareField.d.ts +18 -0
  216. package/dist/inputs/internal/bareField.js +38 -0
  217. package/dist/inputs/internal/devWarn.d.ts +7 -0
  218. package/dist/inputs/internal/devWarn.js +30 -0
  219. package/dist/inputs/internal/fieldFrame.d.ts +34 -0
  220. package/dist/inputs/internal/fieldFrame.js +64 -0
  221. package/dist/inputs/internal/fieldWiring.d.ts +50 -0
  222. package/dist/inputs/internal/fieldWiring.js +38 -0
  223. package/dist/inputs/internal/innerButton.d.ts +2 -0
  224. package/dist/inputs/internal/innerButton.js +24 -0
  225. package/dist/inputs/internal/ownField.d.ts +45 -0
  226. package/dist/inputs/internal/ownField.js +58 -0
  227. package/dist/inputs/internal/predicates.d.ts +9 -0
  228. package/dist/inputs/internal/predicates.js +11 -0
  229. package/dist/inputs/internal/useComboboxPopover.d.ts +46 -0
  230. package/dist/inputs/internal/useComboboxPopover.js +92 -0
  231. package/dist/json/JsonViewer.d.ts +62 -0
  232. package/dist/json/JsonViewer.js +483 -0
  233. package/dist/layout/Box.d.ts +87 -0
  234. package/dist/layout/Box.js +109 -0
  235. package/dist/layout/Divider.d.ts +25 -0
  236. package/dist/layout/Divider.js +70 -0
  237. package/dist/layout/Flex.d.ts +139 -0
  238. package/dist/layout/Flex.js +165 -0
  239. package/dist/layout/FlexItem.d.ts +72 -0
  240. package/dist/layout/FlexItem.js +84 -0
  241. package/dist/layout/Grid.d.ts +140 -0
  242. package/dist/layout/Grid.js +178 -0
  243. package/dist/layout/Portal.d.ts +29 -0
  244. package/dist/layout/Portal.js +27 -0
  245. package/dist/layout/ResizablePanels.d.ts +88 -0
  246. package/dist/layout/ResizablePanels.js +198 -0
  247. package/dist/layout/ResizeHandle.d.ts +48 -0
  248. package/dist/layout/ResizeHandle.js +143 -0
  249. package/dist/layout/ScrollArea.d.ts +30 -0
  250. package/dist/layout/ScrollArea.js +138 -0
  251. package/dist/links/Link.d.ts +101 -1
  252. package/dist/links/Link.js +166 -4
  253. package/dist/lists/BulletedList.d.ts +25 -7
  254. package/dist/lists/BulletedList.js +72 -27
  255. package/dist/lists/DescriptionList.d.ts +91 -0
  256. package/dist/lists/DescriptionList.js +147 -0
  257. package/dist/menu/ContextMenu.d.ts +64 -0
  258. package/dist/menu/ContextMenu.js +34 -0
  259. package/dist/menu/Menu.d.ts +280 -0
  260. package/dist/menu/Menu.js +1003 -0
  261. package/dist/modal/ConfirmDialog.d.ts +55 -0
  262. package/dist/modal/ConfirmDialog.js +151 -0
  263. package/dist/modal/Modal.d.ts +64 -14
  264. package/dist/modal/Modal.js +189 -48
  265. package/dist/navigation/Breadcrumbs.d.ts +65 -0
  266. package/dist/navigation/Breadcrumbs.js +243 -0
  267. package/dist/navigation/CommandPalette.d.ts +83 -0
  268. package/dist/navigation/CommandPalette.js +509 -0
  269. package/dist/navigation/Pagination.d.ts +87 -0
  270. package/dist/navigation/Pagination.js +300 -0
  271. package/dist/navigation/SidebarNav.d.ts +107 -0
  272. package/dist/navigation/SidebarNav.js +341 -0
  273. package/dist/navigation/Stepper.d.ts +52 -0
  274. package/dist/navigation/Stepper.js +207 -0
  275. package/dist/navigation/Tabs.d.ts +113 -0
  276. package/dist/navigation/Tabs.js +543 -0
  277. package/dist/navigation/Topbar.d.ts +20 -0
  278. package/dist/navigation/Topbar.js +62 -0
  279. package/dist/overlay/OverlayProvider.d.ts +28 -32
  280. package/dist/overlay/OverlayProvider.js +42 -93
  281. package/dist/overlay/useOverlay.d.ts +88 -12
  282. package/dist/overlay/useOverlay.js +220 -43
  283. package/dist/overlays/Popover.d.ts +114 -0
  284. package/dist/overlays/Popover.js +389 -0
  285. package/dist/shapes/Circle.d.ts +84 -8
  286. package/dist/shapes/Circle.js +122 -20
  287. package/dist/shapes/Square.d.ts +84 -8
  288. package/dist/shapes/Square.js +123 -20
  289. package/dist/styles/mixins.d.ts +35 -0
  290. package/dist/styles/mixins.js +60 -0
  291. package/dist/styles.css +1 -202
  292. package/dist/table/InfiniteSpreadsheet.d.ts +140 -10
  293. package/dist/table/InfiniteSpreadsheet.js +762 -225
  294. package/dist/table/InfiniteTable.d.ts +116 -14
  295. package/dist/table/InfiniteTable.js +287 -429
  296. package/dist/table/SpreadsheetCellEditor.d.ts +54 -6
  297. package/dist/table/SpreadsheetCellEditor.js +163 -84
  298. package/dist/table/TableCore.d.ts +252 -0
  299. package/dist/table/TableCore.js +1077 -0
  300. package/dist/table/VirtualizedInfiniteTable.d.ts +104 -14
  301. package/dist/table/VirtualizedInfiniteTable.js +280 -219
  302. package/dist/table/types.d.ts +66 -244
  303. package/dist/table/types.js +0 -51
  304. package/dist/table/useInfiniteScrollSentinel.d.ts +25 -21
  305. package/dist/table/useInfiniteScrollSentinel.js +38 -30
  306. package/dist/table/useSpreadsheetCellNavigation.d.ts +44 -0
  307. package/dist/table/useSpreadsheetCellNavigation.js +141 -0
  308. package/dist/table/useTableColumnLayout.d.ts +90 -25
  309. package/dist/table/useTableColumnLayout.js +255 -50
  310. package/dist/table/useTableKeyboardNavigation.d.ts +32 -21
  311. package/dist/table/useTableKeyboardNavigation.js +95 -71
  312. package/dist/table/useTableRowSelection.d.ts +24 -25
  313. package/dist/table/useTableRowSelection.js +57 -84
  314. package/dist/table/useTableVirtualizer.d.ts +20 -0
  315. package/dist/table/useTableVirtualizer.js +48 -0
  316. package/dist/text/Bold.d.ts +5 -6
  317. package/dist/text/Bold.js +16 -15
  318. package/dist/text/Code.d.ts +5 -6
  319. package/dist/text/Code.js +16 -25
  320. package/dist/text/CodeBlock.d.ts +77 -0
  321. package/dist/text/CodeBlock.js +373 -0
  322. package/dist/text/EditableText.d.ts +55 -15
  323. package/dist/text/EditableText.js +153 -135
  324. package/dist/text/Ellipsis.d.ts +34 -8
  325. package/dist/text/Ellipsis.js +55 -23
  326. package/dist/text/Kbd.d.ts +72 -0
  327. package/dist/text/Kbd.js +284 -0
  328. package/dist/text/MarkdownText.d.ts +27 -10
  329. package/dist/text/MarkdownText.js +317 -300
  330. package/dist/text/RequiredMarker.d.ts +17 -5
  331. package/dist/text/RequiredMarker.js +34 -36
  332. package/dist/text/Selectable.d.ts +5 -6
  333. package/dist/text/Selectable.js +16 -13
  334. package/dist/text/Span.d.ts +82 -0
  335. package/dist/text/Span.js +115 -0
  336. package/dist/text/Text.d.ts +128 -41
  337. package/dist/text/Text.js +209 -76
  338. package/dist/theme/GalaxyProvider.d.ts +75 -0
  339. package/dist/theme/GalaxyProvider.js +223 -0
  340. package/dist/theme/ThemeSwitcher.d.ts +52 -0
  341. package/dist/theme/ThemeSwitcher.js +94 -0
  342. package/dist/theme/enums.d.ts +118 -0
  343. package/dist/theme/enums.js +144 -0
  344. package/dist/theme/tokens/dark.d.ts +2 -0
  345. package/dist/theme/tokens/dark.js +275 -0
  346. package/dist/theme/tokens/generate.d.ts +15 -0
  347. package/dist/theme/tokens/generate.js +47 -0
  348. package/dist/theme/tokens/light.d.ts +2 -0
  349. package/dist/theme/tokens/light.js +274 -0
  350. package/dist/theme/tokens/palette.d.ts +14 -0
  351. package/dist/theme/tokens/palette.js +153 -0
  352. package/dist/theme/tokens/scales.d.ts +26 -0
  353. package/dist/theme/tokens/scales.js +154 -0
  354. package/dist/theme/tokens/t.d.ts +3 -0
  355. package/dist/theme/tokens/t.js +25 -0
  356. package/dist/theme/tokens/types.d.ts +189 -0
  357. package/dist/theme/tokens/types.js +0 -0
  358. package/dist/theme/useGalaxyTheme.d.ts +46 -0
  359. package/dist/theme/useGalaxyTheme.js +36 -0
  360. package/dist/theme/useInverseScope.d.ts +18 -0
  361. package/dist/theme/useInverseScope.js +33 -0
  362. package/dist/three/GalaxyLogomark3D.d.ts +46 -0
  363. package/dist/three/GalaxyLogomark3D.js +134 -0
  364. package/dist/three/assets/galaxy-logomark.js +4 -0
  365. package/dist/three/galaxyLogomark3DScene.d.ts +27 -0
  366. package/dist/three/galaxyLogomark3DScene.js +165 -0
  367. package/dist/timeline/Timeline.d.ts +99 -0
  368. package/dist/timeline/Timeline.js +269 -0
  369. package/dist/toast/Toast.d.ts +43 -19
  370. package/dist/toast/Toast.js +130 -89
  371. package/dist/toast/ToastProvider.d.ts +23 -23
  372. package/dist/toast/ToastProvider.js +298 -101
  373. package/dist/toast/ToastViewport.d.ts +12 -0
  374. package/dist/toast/ToastViewport.js +210 -0
  375. package/dist/toast/useToast.d.ts +139 -5
  376. package/dist/toast/useToast.js +15 -13
  377. package/dist/tokens.css +654 -0
  378. package/dist/tooltip/Tooltip.d.ts +64 -44
  379. package/dist/tooltip/Tooltip.js +280 -73
  380. package/dist/tooltip/internal/LazyTooltip.d.ts +7 -0
  381. package/dist/tooltip/internal/LazyTooltip.js +53 -0
  382. package/dist/transform/Fade.d.ts +33 -11
  383. package/dist/transform/Fade.js +71 -19
  384. package/dist/transform/Flasher.d.ts +25 -0
  385. package/dist/transform/Flasher.js +39 -0
  386. package/dist/transform/Rotate.d.ts +24 -12
  387. package/dist/transform/Rotate.js +36 -22
  388. package/dist/transform/ScaleFade.d.ts +36 -11
  389. package/dist/transform/ScaleFade.js +86 -28
  390. package/dist/transform/internal/CollapseMotion.d.ts +10 -0
  391. package/dist/transform/internal/CollapseMotion.js +65 -0
  392. package/dist/tree/Tree.d.ts +85 -0
  393. package/dist/tree/Tree.js +387 -0
  394. package/dist/tree/treeRow.d.ts +39 -0
  395. package/dist/tree/treeRow.js +75 -0
  396. package/dist/utils/colors.d.ts +46 -13
  397. package/dist/utils/colors.js +92 -34
  398. package/dist/utils/css.d.ts +23 -0
  399. package/dist/utils/css.js +30 -0
  400. package/dist/utils/format.d.ts +58 -0
  401. package/dist/utils/format.js +220 -0
  402. package/dist/vite/index.d.ts +16 -0
  403. package/dist/vite/index.js +52 -0
  404. package/dist/widget/Widget.d.ts +164 -48
  405. package/dist/widget/Widget.js +335 -96
  406. package/dist/widget/WidgetGroup.d.ts +36 -0
  407. package/dist/widget/WidgetGroup.js +103 -0
  408. package/package.json +851 -157
  409. package/dist/accordion/Accordion.d.ts +0 -54
  410. package/dist/accordion/Accordion.js +0 -183
  411. package/dist/assets/components/GalaxyFilamentWordmarkDark.d.ts +0 -3
  412. package/dist/assets/components/GalaxyFilamentWordmarkDark.js +0 -14
  413. package/dist/assets/components/GalaxyFilamentWordmarkLight.d.ts +0 -3
  414. package/dist/assets/components/GalaxyFilamentWordmarkLight.js +0 -14
  415. package/dist/assets/components/GalaxyLogomarkDark.d.ts +0 -3
  416. package/dist/assets/components/GalaxyLogomarkDark.js +0 -11
  417. package/dist/assets/components/GalaxyLogomarkLight.d.ts +0 -3
  418. package/dist/assets/components/GalaxyLogomarkLight.js +0 -17
  419. package/dist/assets/components/GalaxyWordmarkDark.d.ts +0 -3
  420. package/dist/assets/components/GalaxyWordmarkDark.js +0 -15
  421. package/dist/assets/components/GalaxyWordmarkLight.d.ts +0 -3
  422. package/dist/assets/components/GalaxyWordmarkLight.js +0 -28
  423. package/dist/assets/models/galaxy-animation.js +0 -136666
  424. package/dist/assets/models/galaxy-logomark.js +0 -4
  425. package/dist/avatar/AvatarShimmer.d.ts +0 -30
  426. package/dist/avatar/AvatarShimmer.js +0 -22
  427. package/dist/backgrounds/CellGridBackground.d.ts +0 -24
  428. package/dist/backgrounds/CellGridBackground.js +0 -44
  429. package/dist/backgrounds/CrossGridBackground.d.ts +0 -26
  430. package/dist/backgrounds/CrossGridBackground.js +0 -49
  431. package/dist/backgrounds/DotGridBackground.d.ts +0 -24
  432. package/dist/backgrounds/DotGridBackground.js +0 -47
  433. package/dist/badge/Badge.d.ts +0 -42
  434. package/dist/badge/Badge.js +0 -99
  435. package/dist/charts/ChartEmptyState.d.ts +0 -17
  436. package/dist/charts/ChartEmptyState.js +0 -29
  437. package/dist/charts/ProgressBar.d.ts +0 -29
  438. package/dist/charts/ProgressBar.js +0 -65
  439. package/dist/charts/chartTheme.d.ts +0 -18
  440. package/dist/charts/chartTheme.js +0 -26
  441. package/dist/containers/FlexItem.d.ts +0 -50
  442. package/dist/containers/FlexItem.js +0 -91
  443. package/dist/containers/FlexWrapper.d.ts +0 -96
  444. package/dist/containers/FlexWrapper.js +0 -143
  445. package/dist/containers/GridWrapper.d.ts +0 -79
  446. package/dist/containers/GridWrapper.js +0 -125
  447. package/dist/containers/Spacing.d.ts +0 -23
  448. package/dist/containers/Spacing.js +0 -59
  449. package/dist/containers/Wrapper.d.ts +0 -26
  450. package/dist/containers/Wrapper.js +0 -54
  451. package/dist/dividers/HorizontalDivider.d.ts +0 -7
  452. package/dist/dividers/HorizontalDivider.js +0 -39
  453. package/dist/dividers/VerticalDivider.d.ts +0 -6
  454. package/dist/dividers/VerticalDivider.js +0 -21
  455. package/dist/icons/GalaxyFilamentWordmark.d.ts +0 -11
  456. package/dist/icons/GalaxyFilamentWordmark.js +0 -25
  457. package/dist/icons/GalaxyLogomark.d.ts +0 -13
  458. package/dist/icons/GalaxyLogomark.js +0 -27
  459. package/dist/icons/GalaxyLogomark3D.d.ts +0 -56
  460. package/dist/icons/GalaxyLogomark3D.js +0 -319
  461. package/dist/icons/GalaxyLogomarkAnimation.d.ts +0 -18
  462. package/dist/icons/GalaxyLogomarkAnimation.js +0 -48
  463. package/dist/icons/GalaxyWordmark.d.ts +0 -11
  464. package/dist/icons/GalaxyWordmark.js +0 -25
  465. package/dist/inputs/MultiTextInput.d.ts +0 -32
  466. package/dist/inputs/MultiTextInput.js +0 -180
  467. package/dist/inputs/SwitcherInput.d.ts +0 -27
  468. package/dist/inputs/SwitcherInput.js +0 -64
  469. package/dist/inputs/hooks.d.ts +0 -10
  470. package/dist/inputs/hooks.js +0 -22
  471. package/dist/overlay/constants.d.ts +0 -28
  472. package/dist/overlay/constants.js +0 -37
  473. package/dist/resizable/HorizontalResizeHandle.d.ts +0 -17
  474. package/dist/resizable/HorizontalResizeHandle.js +0 -38
  475. package/dist/resizable/VerticalResizeHandle.d.ts +0 -18
  476. package/dist/resizable/VerticalResizeHandle.js +0 -39
  477. package/dist/table/SpreadsheetCell.d.ts +0 -21
  478. package/dist/table/SpreadsheetCell.js +0 -71
  479. package/dist/table/SpreadsheetHeaderCell.d.ts +0 -23
  480. package/dist/table/SpreadsheetHeaderCell.js +0 -91
  481. package/dist/table/SpreadsheetMenuItem.d.ts +0 -14
  482. package/dist/table/SpreadsheetMenuItem.js +0 -33
  483. package/dist/table/SpreadsheetPrimitives.d.ts +0 -172
  484. package/dist/table/SpreadsheetPrimitives.js +0 -105
  485. package/dist/table/SpreadsheetRow.d.ts +0 -33
  486. package/dist/table/SpreadsheetRow.js +0 -73
  487. package/dist/table/SpreadsheetRowActionCell.d.ts +0 -14
  488. package/dist/table/SpreadsheetRowActionCell.js +0 -51
  489. package/dist/table/TableExpandCell.d.ts +0 -11
  490. package/dist/table/TableExpandCell.js +0 -24
  491. package/dist/table/TableExpandedRow.d.ts +0 -16
  492. package/dist/table/TableExpandedRow.js +0 -77
  493. package/dist/table/TableHeaderCellContent.d.ts +0 -30
  494. package/dist/table/TableHeaderCellContent.js +0 -48
  495. package/dist/table/TablePrimitives.d.ts +0 -313
  496. package/dist/table/TablePrimitives.js +0 -302
  497. package/dist/table/TableSelectCell.d.ts +0 -18
  498. package/dist/table/TableSelectCell.js +0 -27
  499. package/dist/table/TableStatusRow.d.ts +0 -18
  500. package/dist/table/TableStatusRow.js +0 -50
  501. package/dist/table/useSpreadsheetEditing.d.ts +0 -13
  502. package/dist/table/useSpreadsheetEditing.js +0 -41
  503. package/dist/table/useTableColumnResize.d.ts +0 -38
  504. package/dist/table/useTableColumnResize.js +0 -155
  505. package/dist/table/useTableRowExpansion.d.ts +0 -24
  506. package/dist/table/useTableRowExpansion.js +0 -62
  507. package/dist/table/utils.d.ts +0 -50
  508. package/dist/table/utils.js +0 -78
  509. package/dist/text/HotKeys.d.ts +0 -30
  510. package/dist/text/HotKeys.js +0 -74
  511. package/dist/text/Paragraph.d.ts +0 -33
  512. package/dist/text/Paragraph.js +0 -83
  513. package/dist/text/TextShimmer.d.ts +0 -14
  514. package/dist/text/TextShimmer.js +0 -34
  515. package/dist/theme/GalaxyTheme.d.ts +0 -67
  516. package/dist/theme/GalaxyTheme.js +0 -119
  517. package/dist/theme/constants.d.ts +0 -8
  518. package/dist/theme/constants.js +0 -38
  519. package/dist/theme/index.d.ts +0 -6
  520. package/dist/theme/index.js +0 -7
  521. package/dist/theme/types.d.ts +0 -195
  522. package/dist/theme/types.js +0 -10
  523. package/dist/theme/typography.d.ts +0 -2
  524. package/dist/theme/typography.js +0 -73
  525. package/dist/theme/variants/dark.d.ts +0 -2
  526. package/dist/theme/variants/dark.js +0 -125
  527. package/dist/theme/variants/light.d.ts +0 -2
  528. package/dist/theme/variants/light.js +0 -125
  529. package/dist/toast/ToastContainer.d.ts +0 -10
  530. package/dist/toast/ToastContainer.js +0 -31
  531. package/dist/toast/ToastWrapper.d.ts +0 -6
  532. package/dist/toast/ToastWrapper.js +0 -27
  533. package/dist/transform/Flash.d.ts +0 -7
  534. package/dist/transform/Flash.js +0 -18
  535. package/dist/transform/Spin.d.ts +0 -14
  536. package/dist/transform/Spin.js +0 -25
  537. package/dist/utils/linaria.d.ts +0 -1
  538. package/dist/utils/linaria.js +0 -8
@@ -1,115 +1,312 @@
1
- import Toast, { ToastVariant } from "./Toast.js";
2
- import ToastContainer from "./ToastContainer.js";
3
- import ToastWrapper from "./ToastWrapper.js";
4
- import { createContext, useCallback, useEffect, useRef, useState } from "react";
1
+ import VisuallyHidden from "../a11y/VisuallyHidden.js";
2
+ import { Placement } from "../theme/enums.js";
3
+ import { DURATION } from "../theme/tokens/scales.js";
4
+ import Portal from "../layout/Portal.js";
5
+ import { ToastContext } from "./useToast.js";
6
+ import { Suspense, lazy, useContext, useEffect, useState, useSyncExternalStore } from "react";
5
7
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
- import { AnimatePresence } from "framer-motion";
7
- import { createPortal } from "react-dom";
8
8
  //#region src/toast/ToastProvider.tsx
9
- var ToastContext = createContext(void 0);
10
- var DEFAULT_TIMEOUT = 3e3;
11
- var toastCounter = 0;
12
- var nextToastId = () => `toast-${++toastCounter}`;
13
- var positionKey = (toast) => JSON.stringify([
14
- toast.top,
15
- toast.right,
16
- toast.bottom,
17
- toast.left
18
- ]);
19
9
  /**
20
- * Owns the toast queue. Mount it once near the root, then call `showToast` from
21
- * `useToast()` anywhere below. Handles stacking, timers and dismissal.
10
+ * The toast root: one queue per React root, the timers, the screen-reader announcements and the
11
+ * placement regions. `GalaxyProvider` mounts it (inside `OverlayProvider`), so apps never do;
12
+ * mount it yourself only in a React root that has no `GalaxyProvider`. A nested `ToastProvider`
13
+ * reuses the outer queue.
14
+ *
15
+ * The regions (`ToastViewport`, the only toast module that imports `ScaleFade` and so
16
+ * `framer-motion`) load lazily with the first toast, so `GalaxyProvider` never requires the
17
+ * optional `framer-motion` peer. The two live regions are static, so they exist before the first
18
+ * toast, as live regions must.
19
+ *
20
+ * It renders no element around `children`. SSR: nothing renders on the server (`Portal`, and no
21
+ * entries); the store is created in render-time state, and timers and listeners start in effects.
22
22
  */
23
- var ToastProvider = ({ children }) => {
24
- const [toasts, setToasts] = useState([]);
25
- const timeoutRefs = useRef(/* @__PURE__ */ new Map());
26
- const showToast = useCallback((options) => {
27
- const id = nextToastId();
28
- const { timeout, top, right, bottom, left, ...props } = options;
29
- const finalTimeout = timeout === void 0 ? DEFAULT_TIMEOUT : timeout;
30
- setToasts((prev) => [...prev, {
31
- id,
32
- props,
33
- timeout: finalTimeout,
34
- top,
35
- right,
36
- bottom,
37
- left
38
- }]);
39
- return id;
40
- }, []);
41
- const hideToast = useCallback((id) => {
42
- if (id) {
43
- const timeoutId = timeoutRefs.current.get(id);
44
- if (timeoutId) {
45
- clearTimeout(timeoutId);
46
- timeoutRefs.current.delete(id);
47
- }
48
- setToasts((prev) => prev.filter((toast) => toast.id !== id));
49
- } else setToasts((prev) => {
50
- const firstToast = prev[0];
51
- if (firstToast) {
52
- const timeoutId = timeoutRefs.current.get(firstToast.id);
53
- if (timeoutId) {
54
- clearTimeout(timeoutId);
55
- timeoutRefs.current.delete(firstToast.id);
56
- }
23
+ var VARIANT_PRIMARY = "PRIMARY";
24
+ var VARIANT_SUCCESS = "SUCCESS";
25
+ var VARIANT_ERROR = "ERROR";
26
+ var TOAST_VARIANT_TO_SEVERITY_LABEL_MAP = {
27
+ PRIMARY: "Note",
28
+ SUCCESS: "Success",
29
+ WARNING: "Warning",
30
+ ERROR: "Error"
31
+ };
32
+ /** Only `ERROR` is announced assertively. */
33
+ var TOAST_VARIANT_TO_POLITENESS_MAP = {
34
+ PRIMARY: "polite",
35
+ SUCCESS: "polite",
36
+ WARNING: "polite",
37
+ ERROR: "assertive"
38
+ };
39
+ /** How long a toast stays, by default. */
40
+ var TOAST_DEFAULT_DURATION_MS = 5e3;
41
+ /** Open toasts per region; a sixth dismisses the oldest. */
42
+ var TOAST_MAX_PER_PLACEMENT = 5;
43
+ /** How long a dismissed toast stays in the queue so its ScaleFade exit can run: `duration.base`. */
44
+ var TOAST_EXIT_MS = Number.parseFloat(DURATION.base);
45
+ /** The regions; loaded with the first toast. Creating a lazy component touches no browser global. */
46
+ var ToastViewportLazy = lazy(() => import("./ToastViewport.js"));
47
+ /** Applies the defaults to `toast()`'s argument. */
48
+ function resolveOptions(input) {
49
+ const { id, variant, isLoading, duration, isPersistent, placement, ...rest } = typeof input === "string" ? { header: input } : input;
50
+ return {
51
+ ...rest,
52
+ ...id === void 0 ? {} : { id },
53
+ variant: variant ?? VARIANT_PRIMARY,
54
+ isLoading: isLoading ?? false,
55
+ duration: duration ?? TOAST_DEFAULT_DURATION_MS,
56
+ isPersistent: isPersistent ?? false,
57
+ placement: placement ?? Placement.BOTTOM_END
58
+ };
59
+ }
60
+ /** Normalizes one phase of `toast.promise` to options. */
61
+ function phaseOptions(phase) {
62
+ return typeof phase === "string" ? { header: phase } : phase;
63
+ }
64
+ /** Creates the per-root store. Called once per root, in render-time state (never at module scope). */
65
+ function createToastStore() {
66
+ let entries = [];
67
+ let counter = 0;
68
+ let sequence = 0;
69
+ let hasHadEntries = false;
70
+ let isRunning = false;
71
+ let isHidden = false;
72
+ const pausedPlacements = /* @__PURE__ */ new Set();
73
+ const timers = /* @__PURE__ */ new Map();
74
+ const removals = /* @__PURE__ */ new Map();
75
+ const listeners = /* @__PURE__ */ new Set();
76
+ const announceListeners = /* @__PURE__ */ new Set();
77
+ const emit = () => {
78
+ for (const listener of listeners) listener();
79
+ };
80
+ const announce = (options) => {
81
+ const announcement = {
82
+ politeness: TOAST_VARIANT_TO_POLITENESS_MAP[options.variant],
83
+ label: TOAST_VARIANT_TO_SEVERITY_LABEL_MAP[options.variant],
84
+ header: options.header,
85
+ ...options.description === void 0 ? {} : { description: options.description }
86
+ };
87
+ for (const listener of announceListeners) listener(announcement);
88
+ };
89
+ const clearTimer = (id) => {
90
+ const timer = timers.get(id);
91
+ if (timer?.handle != null) clearTimeout(timer.handle);
92
+ timers.delete(id);
93
+ };
94
+ /** Starts or pauses every open toast's countdown to match the current conditions. */
95
+ const syncTimers = () => {
96
+ const now = Date.now();
97
+ for (const entry of entries) {
98
+ if (!entry.isOpen) continue;
99
+ const timer = timers.get(entry.id);
100
+ if (timer === void 0) continue;
101
+ const shouldRun = isRunning && !isHidden && !entry.options.isLoading && !entry.options.isPersistent && !pausedPlacements.has(entry.options.placement);
102
+ if (shouldRun && timer.handle === null) {
103
+ timer.startedAt = now;
104
+ const { id } = entry;
105
+ timer.handle = setTimeout(() => dismiss(id), Math.max(timer.remaining, 0));
106
+ } else if (!shouldRun && timer.handle !== null) {
107
+ clearTimeout(timer.handle);
108
+ timer.handle = null;
109
+ timer.remaining -= now - (timer.startedAt ?? now);
110
+ timer.startedAt = null;
57
111
  }
58
- return prev.slice(1);
112
+ }
113
+ };
114
+ /** Removes a closed entry right away (a reused id, or the end of its exit). */
115
+ const removeEntry = (id) => {
116
+ const removal = removals.get(id);
117
+ if (removal !== void 0) clearTimeout(removal);
118
+ removals.delete(id);
119
+ entries = entries.filter((entry) => entry.id !== id || entry.isOpen);
120
+ };
121
+ const closeEntries = (shouldClose) => {
122
+ const closed = [];
123
+ entries = entries.map((entry) => {
124
+ if (!entry.isOpen || !shouldClose(entry)) return entry;
125
+ const next = {
126
+ ...entry,
127
+ isOpen: false
128
+ };
129
+ closed.push(next);
130
+ return next;
59
131
  });
60
- }, []);
61
- useEffect(() => {
62
- const currentToastIds = new Set(toasts.map((toast) => toast.id));
63
- toasts.forEach((toast) => {
64
- if (timeoutRefs.current.has(toast.id)) return;
65
- if (toast.timeout > 0) {
66
- const timeoutId = setTimeout(() => {
67
- setToasts((prev) => prev.filter((t) => t.id !== toast.id));
68
- timeoutRefs.current.delete(toast.id);
69
- }, toast.timeout);
70
- timeoutRefs.current.set(toast.id, timeoutId);
71
- }
132
+ if (closed.length === 0) return;
133
+ for (const entry of closed) {
134
+ clearTimer(entry.id);
135
+ const { id } = entry;
136
+ removals.set(id, setTimeout(() => {
137
+ removeEntry(id);
138
+ emit();
139
+ }, TOAST_EXIT_MS));
140
+ }
141
+ emit();
142
+ for (const entry of closed) entry.options.onDismiss?.();
143
+ };
144
+ const dismiss = (id) => {
145
+ closeEntries((entry) => id === void 0 || entry.id === id);
146
+ };
147
+ const show = (input) => {
148
+ const { id: requestedId, ...options } = resolveOptions(input);
149
+ const existing = requestedId === void 0 ? void 0 : entries.find((entry) => entry.id === requestedId && entry.isOpen);
150
+ let id;
151
+ if (existing !== void 0) {
152
+ id = existing.id;
153
+ entries = entries.map((entry) => entry === existing ? {
154
+ ...entry,
155
+ options
156
+ } : entry);
157
+ clearTimer(id);
158
+ timers.set(id, {
159
+ remaining: options.duration,
160
+ startedAt: null,
161
+ handle: null
162
+ });
163
+ } else {
164
+ counter += 1;
165
+ id = requestedId ?? `toast-${counter}`;
166
+ removeEntry(id);
167
+ sequence += 1;
168
+ entries = [...entries, {
169
+ id,
170
+ options,
171
+ isOpen: true,
172
+ sequence
173
+ }];
174
+ timers.set(id, {
175
+ remaining: options.duration,
176
+ startedAt: null,
177
+ handle: null
178
+ });
179
+ hasHadEntries = true;
180
+ }
181
+ const open = entries.filter((entry) => entry.isOpen && entry.options.placement === options.placement);
182
+ const overflow = open.length - TOAST_MAX_PER_PLACEMENT;
183
+ if (overflow > 0) {
184
+ const oldest = new Set(open.slice(0, overflow).map((entry) => entry.id));
185
+ closeEntries((entry) => oldest.has(entry.id));
186
+ }
187
+ syncTimers();
188
+ emit();
189
+ announce(options);
190
+ return id;
191
+ };
192
+ const isOpenId = (id) => entries.some((entry) => entry.id === id && entry.isOpen);
193
+ const promise = (task, phases) => {
194
+ const id = show({
195
+ variant: VARIANT_PRIMARY,
196
+ ...phaseOptions(phases.loading),
197
+ isLoading: true
72
198
  });
73
- timeoutRefs.current.forEach((timeoutId, toastId) => {
74
- if (!currentToastIds.has(toastId)) {
75
- clearTimeout(timeoutId);
76
- timeoutRefs.current.delete(toastId);
77
- }
199
+ task.then((value) => {
200
+ if (!isOpenId(id)) return;
201
+ show({
202
+ variant: VARIANT_SUCCESS,
203
+ ...phaseOptions(typeof phases.success === "function" ? phases.success(value) : phases.success),
204
+ isLoading: false,
205
+ id
206
+ });
207
+ }, (reason) => {
208
+ if (!isOpenId(id)) return;
209
+ show({
210
+ variant: VARIANT_ERROR,
211
+ ...phaseOptions(typeof phases.error === "function" ? phases.error(reason) : phases.error),
212
+ isLoading: false,
213
+ id
214
+ });
78
215
  });
79
- }, [toasts]);
216
+ return id;
217
+ };
218
+ const toast = Object.assign(show, { promise });
219
+ return {
220
+ api: {
221
+ toast,
222
+ dismiss
223
+ },
224
+ toast,
225
+ dismiss,
226
+ subscribe: (listener) => {
227
+ listeners.add(listener);
228
+ return () => listeners.delete(listener);
229
+ },
230
+ getEntries: () => entries,
231
+ getHasHadEntries: () => hasHadEntries,
232
+ onAnnounce: (listener) => {
233
+ announceListeners.add(listener);
234
+ return () => announceListeners.delete(listener);
235
+ },
236
+ setPlacementPaused: (placement, isPaused) => {
237
+ if (isPaused) pausedPlacements.add(placement);
238
+ else pausedPlacements.delete(placement);
239
+ syncTimers();
240
+ },
241
+ setHidden: (nextIsHidden) => {
242
+ isHidden = nextIsHidden;
243
+ syncTimers();
244
+ },
245
+ start: () => {
246
+ isRunning = true;
247
+ syncTimers();
248
+ },
249
+ stop: () => {
250
+ isRunning = false;
251
+ syncTimers();
252
+ }
253
+ };
254
+ }
255
+ var NO_ENTRIES_SUBSCRIBE = () => () => {};
256
+ var getFalse = () => false;
257
+ /** The two persistent live regions; each new or updated toast is read once in one of them. */
258
+ function Announcer({ store }) {
259
+ const [polite, setPolite] = useState(null);
260
+ const [assertive, setAssertive] = useState(null);
80
261
  useEffect(() => {
81
- const refs = timeoutRefs.current;
262
+ let frame = 0;
263
+ const unsubscribe = store.onAnnounce((announcement) => {
264
+ const set = announcement.politeness === "assertive" ? setAssertive : setPolite;
265
+ set(null);
266
+ cancelAnimationFrame(frame);
267
+ frame = requestAnimationFrame(() => set(announcement));
268
+ });
82
269
  return () => {
83
- refs.forEach((timeoutId) => {
84
- clearTimeout(timeoutId);
85
- });
86
- refs.clear();
270
+ unsubscribe();
271
+ cancelAnimationFrame(frame);
87
272
  };
88
- }, []);
89
- const positionGroups = /* @__PURE__ */ new Map();
90
- toasts.forEach((toast) => {
91
- const key = positionKey(toast);
92
- const group = positionGroups.get(key);
93
- if (group) group.push(toast);
94
- else positionGroups.set(key, [toast]);
95
- });
96
- const toastContent = /* @__PURE__ */ jsx(Fragment$1, { children: [...positionGroups.entries()].map(([key, group]) => /* @__PURE__ */ jsx(ToastContainer, {
97
- top: group[0].top,
98
- right: group[0].right,
99
- bottom: group[0].bottom,
100
- left: group[0].left,
101
- children: /* @__PURE__ */ jsx(AnimatePresence, { children: group.map((toast) => /* @__PURE__ */ jsx(ToastWrapper, { children: /* @__PURE__ */ jsx(Toast, {
102
- ...toast.props,
103
- onClose: () => hideToast(toast.id)
104
- }) }, toast.id)) })
105
- }, key)) });
273
+ }, [store]);
274
+ const render = (announcement) => announcement === null ? null : /* @__PURE__ */ jsxs(Fragment$1, { children: [
275
+ announcement.label,
276
+ ": ",
277
+ announcement.header,
278
+ ".",
279
+ announcement.description === void 0 ? null : /* @__PURE__ */ jsxs(Fragment$1, { children: [" ", announcement.description] })
280
+ ] });
281
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(VisuallyHidden, {
282
+ "aria-live": "polite",
283
+ "aria-atomic": "true",
284
+ children: render(polite)
285
+ }), /* @__PURE__ */ jsx(VisuallyHidden, {
286
+ "aria-live": "assertive",
287
+ "aria-atomic": "true",
288
+ children: render(assertive)
289
+ })] });
290
+ }
291
+ /** Holds the toast queue and renders its regions and live regions. */
292
+ function ToastProvider({ children }) {
293
+ const outerStore = useContext(ToastContext);
294
+ const [ownStore] = useState(() => outerStore === null ? createToastStore() : null);
295
+ const hasHadEntries = useSyncExternalStore(ownStore?.subscribe ?? NO_ENTRIES_SUBSCRIBE, ownStore?.getHasHadEntries ?? getFalse, getFalse);
296
+ useEffect(() => {
297
+ if (ownStore === null) return;
298
+ ownStore.start();
299
+ return () => ownStore.stop();
300
+ }, [ownStore]);
301
+ if (ownStore === null) return /* @__PURE__ */ jsx(Fragment$1, { children });
106
302
  return /* @__PURE__ */ jsxs(ToastContext.Provider, {
107
- value: {
108
- showToast,
109
- hideToast
110
- },
111
- children: [children, typeof document !== "undefined" && createPortal(toastContent, document.body)]
303
+ value: ownStore,
304
+ children: [children, /* @__PURE__ */ jsxs(Portal, { children: [/* @__PURE__ */ jsx(Announcer, { store: ownStore }), hasHadEntries && /* @__PURE__ */ jsx(Suspense, {
305
+ fallback: null,
306
+ children: /* @__PURE__ */ jsx(ToastViewportLazy, { store: ownStore })
307
+ })] })]
112
308
  });
113
- };
309
+ }
310
+ ToastProvider.displayName = "ToastProvider";
114
311
  //#endregion
115
- export { ToastContext, ToastProvider, ToastVariant };
312
+ export { ToastProvider as default };
@@ -0,0 +1,12 @@
1
+ import type { ToastContextValue } from "./useToast.js";
2
+ /** @internal Loaded by ToastProvider; apps use useToast. */
3
+ export interface ToastViewportProps {
4
+ /** The provider's store. */
5
+ store: ToastContextValue;
6
+ }
7
+ /** @internal Loaded by ToastProvider; apps use useToast. Renders the placement regions. */
8
+ declare function ToastViewport({ store }: ToastViewportProps): import("react").JSX.Element;
9
+ declare namespace ToastViewport {
10
+ var displayName: string;
11
+ }
12
+ export default ToastViewport;
@@ -0,0 +1,210 @@
1
+ import { Placement } from "../theme/enums.js";
2
+ import ScaleFade from "../transform/ScaleFade.js";
3
+ import { useHotkey } from "../hooks/useHotkey.js";
4
+ import Toast from "./Toast.js";
5
+ /* empty css */
6
+ import { styled } from "@linaria/react";
7
+ import { useEffect, useRef, useSyncExternalStore } from "react";
8
+ import { Fragment as Fragment$1, jsx } from "react/jsx-runtime";
9
+ import { cx } from "@linaria/core";
10
+ //#region src/toast/ToastViewport.tsx
11
+ /**
12
+ * @internal Loaded by ToastProvider; apps use useToast. The placement regions: one fixed `<ol>`
13
+ * per placement that has toasts, each toast an `<li>` animated in and out by `ScaleFade`. It also
14
+ * pauses a region's timers while the pointer is over it or focus is inside it (and every region
15
+ * while the tab is hidden), binds F8 to reach the newest toasts, and dismisses the focused toast
16
+ * on Escape.
17
+ *
18
+ * `ToastProvider` loads this module with `React.lazy` when the first toast is shown, so
19
+ * `framer-motion` (through `ScaleFade`) is only needed once an app shows a toast.
20
+ */
21
+ /** Placements in DOM order. */
22
+ var TOAST_PLACEMENTS = [
23
+ Placement.TOP_START,
24
+ Placement.TOP,
25
+ Placement.TOP_END,
26
+ Placement.BOTTOM_START,
27
+ Placement.BOTTOM,
28
+ Placement.BOTTOM_END
29
+ ];
30
+ /** The region's accessible name. */
31
+ var REGION_LABEL = "Notifications";
32
+ var NO_ENTRIES = [];
33
+ /**
34
+ * A placement region. Takes no pointer input itself (only its items do). `--gx-toast-inset` is
35
+ * the distance from the screen edges: `space[24]`, or `space[16]` on narrow screens.
36
+ */
37
+ var Region = /*#__PURE__*/ styled("ol")({
38
+ name: "Region",
39
+ class: "gx-ToastViewport-Region-rut9ebb",
40
+ propsAsIs: false
41
+ });
42
+ /** Side, alignment and order per placement: the newest toast is nearest the screen edge. */
43
+ var TOAST_PLACEMENT_TO_CSS_MAP = {
44
+ [Placement.TOP_START]: "gx-ToastViewport-Placement_TOP_START-puv7dc9",
45
+ [Placement.TOP]: "gx-ToastViewport-Placement_TOP-p79888u",
46
+ [Placement.TOP_END]: "gx-ToastViewport-Placement_TOP_END-po8x2as",
47
+ [Placement.BOTTOM_START]: "gx-ToastViewport-Placement_BOTTOM_START-p92b9bh",
48
+ [Placement.BOTTOM]: "gx-ToastViewport-Placement_BOTTOM-p1y493wv",
49
+ [Placement.BOTTOM_END]: "gx-ToastViewport-Placement_BOTTOM_END-pym40ia"
50
+ };
51
+ /** One toast; takes pointer input. */
52
+ var Item = /*#__PURE__*/ styled("li")({
53
+ name: "Item",
54
+ class: "gx-ToastViewport-Item-iktx1uh",
55
+ propsAsIs: false
56
+ });
57
+ /** ScaleFade grows each toast from the screen edge it belongs to. */
58
+ var TOAST_PLACEMENT_TO_TRANSFORM_ORIGIN_MAP = {
59
+ [Placement.TOP_START]: "gx-ToastViewport-Placement_TOP_START-pat4pzx",
60
+ [Placement.TOP]: "gx-ToastViewport-Placement_TOP-p18lapkd",
61
+ [Placement.TOP_END]: "gx-ToastViewport-Placement_TOP_END-p1lcgtv1",
62
+ [Placement.BOTTOM_START]: "gx-ToastViewport-Placement_BOTTOM_START-p1i0hsic",
63
+ [Placement.BOTTOM]: "gx-ToastViewport-Placement_BOTTOM-pim0uhi",
64
+ [Placement.BOTTOM_END]: "gx-ToastViewport-Placement_BOTTOM_END-p18eqp6y"
65
+ };
66
+ /** Whether `element` can take focus back. */
67
+ function isFocusable(element) {
68
+ return (element instanceof HTMLElement || element instanceof SVGElement) && element.isConnected;
69
+ }
70
+ /** One toast in its region; hands focus back when it closes while holding it. */
71
+ function ToastItem({ entry, store, returnFocusRef }) {
72
+ const itemRef = useRef(null);
73
+ const { options, id } = entry;
74
+ useEffect(() => {
75
+ if (entry.isOpen) return;
76
+ const item = itemRef.current;
77
+ const returnTo = returnFocusRef.current;
78
+ if (item?.contains(document.activeElement) && isFocusable(returnTo)) returnTo.focus();
79
+ }, [entry.isOpen, returnFocusRef]);
80
+ const handleKeyDown = (event) => {
81
+ if (event.key !== "Escape" || event.defaultPrevented) return;
82
+ event.preventDefault();
83
+ store.dismiss(id);
84
+ };
85
+ return /* @__PURE__ */ jsx(Item, {
86
+ ref: itemRef,
87
+ onKeyDown: handleKeyDown,
88
+ children: /* @__PURE__ */ jsx(ScaleFade, {
89
+ isOpen: entry.isOpen,
90
+ shouldAnimateOnMount: true,
91
+ className: TOAST_PLACEMENT_TO_TRANSFORM_ORIGIN_MAP[options.placement],
92
+ children: /* @__PURE__ */ jsx(Toast, {
93
+ variant: options.variant,
94
+ header: options.header,
95
+ ...options.description === void 0 ? {} : { description: options.description },
96
+ ...options.icon === void 0 ? {} : { icon: options.icon },
97
+ ...options.action === void 0 ? {} : { action: {
98
+ label: options.action.label,
99
+ onClick: () => {
100
+ options.action?.onClick();
101
+ store.dismiss(id);
102
+ }
103
+ } },
104
+ isLoading: options.isLoading,
105
+ onDismiss: () => store.dismiss(id)
106
+ })
107
+ })
108
+ });
109
+ }
110
+ /** One placement region: pauses its timers while hovered or focused. */
111
+ function ToastRegion({ placement, entries, store, returnFocusRef, regionRefs }) {
112
+ const isPointerInsideRef = useRef(false);
113
+ const isFocusInsideRef = useRef(false);
114
+ const syncPause = () => store.setPlacementPaused(placement, isPointerInsideRef.current || isFocusInsideRef.current);
115
+ useEffect(() => () => store.setPlacementPaused(placement, false), [store, placement]);
116
+ const handleFocus = (event) => {
117
+ event.stopPropagation();
118
+ if (event.currentTarget.contains(event.relatedTarget)) return;
119
+ isFocusInsideRef.current = true;
120
+ syncPause();
121
+ };
122
+ const handleBlur = (event) => {
123
+ if (event.currentTarget.contains(event.relatedTarget)) return;
124
+ isFocusInsideRef.current = false;
125
+ syncPause();
126
+ };
127
+ /**
128
+ * Tab moves through the region's buttons natively (kept from an open modal's trap, as focus
129
+ * is); Escape on the region itself dismisses its newest open toast.
130
+ */
131
+ const handleKeyDown = (event) => {
132
+ if (event.key === "Tab") {
133
+ event.stopPropagation();
134
+ return;
135
+ }
136
+ if (event.key !== "Escape" || event.defaultPrevented) return;
137
+ if (event.target !== event.currentTarget) return;
138
+ const newest = entries.findLast((entry) => entry.isOpen);
139
+ if (newest === void 0) return;
140
+ event.preventDefault();
141
+ store.dismiss(newest.id);
142
+ const returnTo = returnFocusRef.current;
143
+ if (isFocusable(returnTo)) returnTo.focus();
144
+ };
145
+ return /* @__PURE__ */ jsx(Region, {
146
+ ref: (node) => {
147
+ if (node === null) regionRefs.delete(placement);
148
+ else regionRefs.set(placement, node);
149
+ },
150
+ "aria-label": REGION_LABEL,
151
+ tabIndex: -1,
152
+ className: cx(TOAST_PLACEMENT_TO_CSS_MAP[placement]),
153
+ onPointerEnter: () => {
154
+ isPointerInsideRef.current = true;
155
+ syncPause();
156
+ },
157
+ onPointerLeave: () => {
158
+ isPointerInsideRef.current = false;
159
+ syncPause();
160
+ },
161
+ onFocus: handleFocus,
162
+ onBlur: handleBlur,
163
+ onKeyDown: handleKeyDown,
164
+ children: entries.map((entry) => /* @__PURE__ */ jsx(ToastItem, {
165
+ entry,
166
+ store,
167
+ returnFocusRef
168
+ }, `${entry.id}:${entry.sequence}`))
169
+ });
170
+ }
171
+ /** @internal Loaded by ToastProvider; apps use useToast. Renders the placement regions. */
172
+ function ToastViewport({ store }) {
173
+ const entries = useSyncExternalStore(store.subscribe, store.getEntries, () => NO_ENTRIES);
174
+ const returnFocusRef = useRef(null);
175
+ const regionRefs = useRef(/* @__PURE__ */ new Map()).current;
176
+ useEffect(() => {
177
+ const update = () => store.setHidden(document.visibilityState === "hidden");
178
+ update();
179
+ document.addEventListener("visibilitychange", update);
180
+ return () => {
181
+ document.removeEventListener("visibilitychange", update);
182
+ store.setHidden(false);
183
+ };
184
+ }, [store]);
185
+ const newest = entries.filter((entry) => entry.isOpen).reduce((latest, entry) => latest === void 0 || entry.sequence > latest.sequence ? entry : latest, void 0);
186
+ useHotkey("f8", () => {
187
+ if (newest === void 0) return;
188
+ const region = regionRefs.get(newest.options.placement);
189
+ if (region === void 0) return;
190
+ if (!region.contains(document.activeElement)) returnFocusRef.current = document.activeElement;
191
+ region.focus();
192
+ }, {
193
+ shouldPreventDefault: true,
194
+ isEnabled: newest !== void 0
195
+ });
196
+ return /* @__PURE__ */ jsx(Fragment$1, { children: TOAST_PLACEMENTS.map((placement) => {
197
+ const placed = entries.filter((entry) => entry.options.placement === placement);
198
+ if (placed.length === 0) return null;
199
+ return /* @__PURE__ */ jsx(ToastRegion, {
200
+ placement,
201
+ entries: placed,
202
+ store,
203
+ returnFocusRef,
204
+ regionRefs
205
+ }, placement);
206
+ }) });
207
+ }
208
+ ToastViewport.displayName = "ToastViewport";
209
+ //#endregion
210
+ export { ToastViewport as default };