@galaxy-io/dls 1.6.1 → 2.0.1

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