@react-spectrum/s2 1.4.0 → 1.5.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 (419) hide show
  1. package/dist/exports/CenterBaseline.cjs +12 -0
  2. package/dist/exports/CenterBaseline.cjs.map +1 -0
  3. package/dist/exports/CenterBaseline.mjs +7 -0
  4. package/dist/exports/CenterBaseline.mjs.map +1 -0
  5. package/dist/exports/Skeleton.cjs +1 -0
  6. package/dist/exports/Skeleton.cjs.map +1 -1
  7. package/dist/exports/Skeleton.mjs +2 -2
  8. package/dist/exports/Skeleton.mjs.map +1 -1
  9. package/dist/exports/index.cjs +3 -0
  10. package/dist/exports/index.cjs.map +1 -1
  11. package/dist/exports/index.mjs +3 -1
  12. package/dist/exports/index.mjs.map +1 -1
  13. package/dist/private/Accordion.cjs +2 -2
  14. package/dist/private/Accordion.css +2 -2
  15. package/dist/private/Accordion.mjs +2 -2
  16. package/dist/private/ActionBar.cjs +59 -59
  17. package/dist/private/ActionBar.cjs.map +1 -1
  18. package/dist/private/ActionBar.css +58 -58
  19. package/dist/private/ActionBar.css.map +1 -1
  20. package/dist/private/ActionBar.mjs +59 -59
  21. package/dist/private/ActionBar.mjs.map +1 -1
  22. package/dist/private/ActionButton.cjs +247 -247
  23. package/dist/private/ActionButton.cjs.map +1 -1
  24. package/dist/private/ActionButton.css +169 -169
  25. package/dist/private/ActionButton.css.map +1 -1
  26. package/dist/private/ActionButton.mjs +247 -247
  27. package/dist/private/ActionButton.mjs.map +1 -1
  28. package/dist/private/ActionButtonGroup.cjs +15 -15
  29. package/dist/private/ActionButtonGroup.css +9 -9
  30. package/dist/private/ActionButtonGroup.mjs +15 -15
  31. package/dist/private/ActionMenu.cjs.map +1 -1
  32. package/dist/private/ActionMenu.mjs.map +1 -1
  33. package/dist/private/Add.cjs +10 -10
  34. package/dist/private/Add.css +6 -6
  35. package/dist/private/Add.mjs +10 -10
  36. package/dist/private/AlertDialog.cjs +3 -3
  37. package/dist/private/AlertDialog.cjs.map +1 -1
  38. package/dist/private/AlertDialog.css +3 -3
  39. package/dist/private/AlertDialog.css.map +1 -1
  40. package/dist/private/AlertDialog.mjs +3 -3
  41. package/dist/private/AlertDialog.mjs.map +1 -1
  42. package/dist/private/Asterisk.cjs +6 -6
  43. package/dist/private/Asterisk.css +4 -4
  44. package/dist/private/Asterisk.mjs +6 -6
  45. package/dist/private/Avatar.cjs +16 -16
  46. package/dist/private/Avatar.css +16 -16
  47. package/dist/private/Avatar.mjs +16 -16
  48. package/dist/private/AvatarGroup.cjs +120 -120
  49. package/dist/private/AvatarGroup.css +31 -31
  50. package/dist/private/AvatarGroup.mjs +120 -120
  51. package/dist/private/Badge.cjs +197 -197
  52. package/dist/private/Badge.css +125 -125
  53. package/dist/private/Badge.mjs +197 -197
  54. package/dist/private/Breadcrumbs.cjs +234 -234
  55. package/dist/private/Breadcrumbs.cjs.map +1 -1
  56. package/dist/private/Breadcrumbs.css +100 -100
  57. package/dist/private/Breadcrumbs.css.map +1 -1
  58. package/dist/private/Breadcrumbs.mjs +234 -234
  59. package/dist/private/Breadcrumbs.mjs.map +1 -1
  60. package/dist/private/Button.cjs +335 -326
  61. package/dist/private/Button.cjs.map +1 -1
  62. package/dist/private/Button.css +176 -172
  63. package/dist/private/Button.css.map +1 -1
  64. package/dist/private/Button.mjs +335 -326
  65. package/dist/private/Button.mjs.map +1 -1
  66. package/dist/private/ButtonGroup.cjs +23 -20
  67. package/dist/private/ButtonGroup.cjs.map +1 -1
  68. package/dist/private/ButtonGroup.css +19 -15
  69. package/dist/private/ButtonGroup.css.map +1 -1
  70. package/dist/private/ButtonGroup.mjs +23 -20
  71. package/dist/private/ButtonGroup.mjs.map +1 -1
  72. package/dist/private/Calendar.cjs +232 -232
  73. package/dist/private/Calendar.cjs.map +1 -1
  74. package/dist/private/Calendar.css +149 -149
  75. package/dist/private/Calendar.css.map +1 -1
  76. package/dist/private/Calendar.mjs +232 -232
  77. package/dist/private/Calendar.mjs.map +1 -1
  78. package/dist/private/Card.cjs +309 -309
  79. package/dist/private/Card.css +206 -206
  80. package/dist/private/Card.mjs +309 -309
  81. package/dist/private/CardView.cjs +17 -17
  82. package/dist/private/CardView.css +17 -17
  83. package/dist/private/CardView.mjs +17 -17
  84. package/dist/private/CenterBaseline.cjs +1 -1
  85. package/dist/private/CenterBaseline.cjs.map +1 -1
  86. package/dist/private/CenterBaseline.css +2 -2
  87. package/dist/private/CenterBaseline.css.map +1 -1
  88. package/dist/private/CenterBaseline.mjs +1 -1
  89. package/dist/private/CenterBaseline.mjs.map +1 -1
  90. package/dist/private/Checkbox.cjs +188 -188
  91. package/dist/private/Checkbox.css +110 -110
  92. package/dist/private/Checkbox.mjs +188 -188
  93. package/dist/private/CheckboxGroup.cjs +43 -43
  94. package/dist/private/CheckboxGroup.css +37 -37
  95. package/dist/private/CheckboxGroup.mjs +43 -43
  96. package/dist/private/Checkmark.cjs +12 -12
  97. package/dist/private/Checkmark.css +8 -8
  98. package/dist/private/Checkmark.mjs +12 -12
  99. package/dist/private/Chevron.cjs +12 -12
  100. package/dist/private/Chevron.css +10 -10
  101. package/dist/private/Chevron.mjs +12 -12
  102. package/dist/private/ClearButton.cjs +30 -30
  103. package/dist/private/ClearButton.css +30 -30
  104. package/dist/private/ClearButton.mjs +30 -30
  105. package/dist/private/CloseButton.cjs +52 -52
  106. package/dist/private/CloseButton.cjs.map +1 -1
  107. package/dist/private/CloseButton.css +46 -46
  108. package/dist/private/CloseButton.css.map +1 -1
  109. package/dist/private/CloseButton.mjs +52 -52
  110. package/dist/private/CloseButton.mjs.map +1 -1
  111. package/dist/private/ColorArea.cjs +16 -16
  112. package/dist/private/ColorArea.css +16 -16
  113. package/dist/private/ColorArea.mjs +16 -16
  114. package/dist/private/ColorField.cjs +31 -31
  115. package/dist/private/ColorField.css +27 -27
  116. package/dist/private/ColorField.mjs +31 -31
  117. package/dist/private/ColorHandle.cjs +27 -27
  118. package/dist/private/ColorHandle.css +42 -42
  119. package/dist/private/ColorHandle.mjs +27 -27
  120. package/dist/private/ColorSlider.cjs +108 -108
  121. package/dist/private/ColorSlider.css +52 -52
  122. package/dist/private/ColorSlider.mjs +108 -108
  123. package/dist/private/ColorSwatch.cjs +29 -29
  124. package/dist/private/ColorSwatch.css +29 -29
  125. package/dist/private/ColorSwatch.mjs +29 -29
  126. package/dist/private/ColorSwatchPicker.cjs +29 -29
  127. package/dist/private/ColorSwatchPicker.css +48 -48
  128. package/dist/private/ColorSwatchPicker.mjs +29 -29
  129. package/dist/private/ColorWheel.cjs +26 -26
  130. package/dist/private/ColorWheel.css +17 -17
  131. package/dist/private/ColorWheel.mjs +26 -26
  132. package/dist/private/ComboBox.cjs +381 -381
  133. package/dist/private/ComboBox.cjs.map +1 -1
  134. package/dist/private/ComboBox.css +188 -188
  135. package/dist/private/ComboBox.css.map +1 -1
  136. package/dist/private/ComboBox.mjs +381 -381
  137. package/dist/private/ComboBox.mjs.map +1 -1
  138. package/dist/private/ContextualHelp.cjs +5 -5
  139. package/dist/private/ContextualHelp.cjs.map +1 -1
  140. package/dist/private/ContextualHelp.css +50 -50
  141. package/dist/private/ContextualHelp.css.map +1 -1
  142. package/dist/private/ContextualHelp.mjs +5 -5
  143. package/dist/private/ContextualHelp.mjs.map +1 -1
  144. package/dist/private/CornerTriangle.cjs +8 -8
  145. package/dist/private/CornerTriangle.css +6 -6
  146. package/dist/private/CornerTriangle.mjs +8 -8
  147. package/dist/private/Cross.cjs +14 -14
  148. package/dist/private/Cross.css +10 -10
  149. package/dist/private/Cross.mjs +14 -14
  150. package/dist/private/CustomDialog.cjs +25 -25
  151. package/dist/private/CustomDialog.css +25 -25
  152. package/dist/private/CustomDialog.mjs +25 -25
  153. package/dist/private/Dash.cjs +10 -10
  154. package/dist/private/Dash.css +6 -6
  155. package/dist/private/Dash.mjs +10 -10
  156. package/dist/private/DateField.cjs +73 -73
  157. package/dist/private/DateField.css +77 -77
  158. package/dist/private/DateField.mjs +73 -73
  159. package/dist/private/DatePicker.cjs +172 -172
  160. package/dist/private/DatePicker.cjs.map +1 -1
  161. package/dist/private/DatePicker.css +128 -128
  162. package/dist/private/DatePicker.css.map +1 -1
  163. package/dist/private/DatePicker.mjs +172 -172
  164. package/dist/private/DatePicker.mjs.map +1 -1
  165. package/dist/private/DateRangePicker.cjs +55 -55
  166. package/dist/private/DateRangePicker.cjs.map +1 -1
  167. package/dist/private/DateRangePicker.css +59 -59
  168. package/dist/private/DateRangePicker.css.map +1 -1
  169. package/dist/private/DateRangePicker.mjs +55 -55
  170. package/dist/private/DateRangePicker.mjs.map +1 -1
  171. package/dist/private/Dialog.cjs +17 -17
  172. package/dist/private/Dialog.css +70 -70
  173. package/dist/private/Dialog.mjs +17 -17
  174. package/dist/private/Disclosure.cjs +144 -122
  175. package/dist/private/Disclosure.cjs.map +1 -1
  176. package/dist/private/Disclosure.css +112 -112
  177. package/dist/private/Disclosure.css.map +1 -1
  178. package/dist/private/Disclosure.mjs +144 -122
  179. package/dist/private/Disclosure.mjs.map +1 -1
  180. package/dist/private/Divider.cjs +25 -25
  181. package/dist/private/Divider.css +25 -25
  182. package/dist/private/Divider.mjs +25 -25
  183. package/dist/private/DragHandle.cjs +8 -8
  184. package/dist/private/DragHandle.css +6 -6
  185. package/dist/private/DragHandle.mjs +8 -8
  186. package/dist/private/DragPreview.cjs +154 -154
  187. package/dist/private/DragPreview.css +106 -106
  188. package/dist/private/DragPreview.mjs +154 -154
  189. package/dist/private/DropZone.cjs +61 -61
  190. package/dist/private/DropZone.cjs.map +1 -1
  191. package/dist/private/DropZone.css +57 -57
  192. package/dist/private/DropZone.css.map +1 -1
  193. package/dist/private/DropZone.mjs +61 -61
  194. package/dist/private/DropZone.mjs.map +1 -1
  195. package/dist/private/Field.cjs +360 -360
  196. package/dist/private/Field.cjs.map +1 -1
  197. package/dist/private/Field.css +160 -160
  198. package/dist/private/Field.css.map +1 -1
  199. package/dist/private/Field.mjs +360 -360
  200. package/dist/private/Field.mjs.map +1 -1
  201. package/dist/private/Form.cjs +9 -9
  202. package/dist/private/Form.css +9 -9
  203. package/dist/private/Form.mjs +9 -9
  204. package/dist/private/FullscreenDialog.cjs +5 -5
  205. package/dist/private/FullscreenDialog.css +78 -78
  206. package/dist/private/FullscreenDialog.mjs +5 -5
  207. package/dist/private/IllustratedMessage.cjs +228 -228
  208. package/dist/private/IllustratedMessage.css +72 -72
  209. package/dist/private/IllustratedMessage.mjs +228 -228
  210. package/dist/private/Image.cjs +14 -14
  211. package/dist/private/Image.css +14 -14
  212. package/dist/private/Image.mjs +14 -14
  213. package/dist/private/InlineAlert.cjs +100 -100
  214. package/dist/private/InlineAlert.cjs.map +1 -1
  215. package/dist/private/InlineAlert.css +76 -76
  216. package/dist/private/InlineAlert.css.map +1 -1
  217. package/dist/private/InlineAlert.mjs +100 -100
  218. package/dist/private/InlineAlert.mjs.map +1 -1
  219. package/dist/private/LabeledValue.cjs +134 -134
  220. package/dist/private/LabeledValue.css +63 -63
  221. package/dist/private/LabeledValue.mjs +134 -134
  222. package/dist/private/Link.cjs +49 -49
  223. package/dist/private/Link.css +41 -41
  224. package/dist/private/Link.mjs +49 -49
  225. package/dist/private/LinkOut.cjs +8 -8
  226. package/dist/private/LinkOut.css +8 -8
  227. package/dist/private/LinkOut.mjs +8 -8
  228. package/dist/private/ListView.cjs +245 -245
  229. package/dist/private/ListView.cjs.map +1 -1
  230. package/dist/private/ListView.css +177 -177
  231. package/dist/private/ListView.css.map +1 -1
  232. package/dist/private/ListView.mjs +245 -245
  233. package/dist/private/ListView.mjs.map +1 -1
  234. package/dist/private/Menu.cjs +446 -446
  235. package/dist/private/Menu.cjs.map +1 -1
  236. package/dist/private/Menu.css +196 -196
  237. package/dist/private/Menu.css.map +1 -1
  238. package/dist/private/Menu.mjs +446 -446
  239. package/dist/private/Menu.mjs.map +1 -1
  240. package/dist/private/Meter.cjs +153 -153
  241. package/dist/private/Meter.css +91 -91
  242. package/dist/private/Meter.mjs +153 -153
  243. package/dist/private/Modal.cjs +74 -74
  244. package/dist/private/Modal.css +59 -59
  245. package/dist/private/Modal.mjs +74 -74
  246. package/dist/private/NotificationBadge.cjs +56 -56
  247. package/dist/private/NotificationBadge.cjs.map +1 -1
  248. package/dist/private/NotificationBadge.css +49 -49
  249. package/dist/private/NotificationBadge.css.map +1 -1
  250. package/dist/private/NotificationBadge.mjs +56 -56
  251. package/dist/private/NotificationBadge.mjs.map +1 -1
  252. package/dist/private/NumberField.cjs +114 -114
  253. package/dist/private/NumberField.css +99 -99
  254. package/dist/private/NumberField.mjs +114 -114
  255. package/dist/private/Picker.cjs +275 -275
  256. package/dist/private/Picker.cjs.map +1 -1
  257. package/dist/private/Picker.css +173 -173
  258. package/dist/private/Picker.css.map +1 -1
  259. package/dist/private/Picker.mjs +275 -275
  260. package/dist/private/Picker.mjs.map +1 -1
  261. package/dist/private/Popover.cjs +95 -95
  262. package/dist/private/Popover.cjs.map +1 -1
  263. package/dist/private/Popover.css +75 -75
  264. package/dist/private/Popover.css.map +1 -1
  265. package/dist/private/Popover.mjs +95 -95
  266. package/dist/private/Popover.mjs.map +1 -1
  267. package/dist/private/ProgressBar.cjs +163 -163
  268. package/dist/private/ProgressBar.css +99 -99
  269. package/dist/private/ProgressBar.mjs +163 -163
  270. package/dist/private/ProgressCircle.cjs +34 -31
  271. package/dist/private/ProgressCircle.cjs.map +1 -1
  272. package/dist/private/ProgressCircle.css +24 -24
  273. package/dist/private/ProgressCircle.css.map +1 -1
  274. package/dist/private/ProgressCircle.mjs +34 -31
  275. package/dist/private/ProgressCircle.mjs.map +1 -1
  276. package/dist/private/Provider.cjs +19 -19
  277. package/dist/private/Provider.css +15 -15
  278. package/dist/private/Provider.mjs +19 -19
  279. package/dist/private/RadioGroup.cjs +208 -208
  280. package/dist/private/RadioGroup.css +113 -113
  281. package/dist/private/RadioGroup.mjs +208 -208
  282. package/dist/private/RangeCalendar.cjs +16 -16
  283. package/dist/private/RangeCalendar.cjs.map +1 -1
  284. package/dist/private/RangeCalendar.css +17 -17
  285. package/dist/private/RangeCalendar.css.map +1 -1
  286. package/dist/private/RangeCalendar.mjs +16 -16
  287. package/dist/private/RangeCalendar.mjs.map +1 -1
  288. package/dist/private/RangeSlider.cjs.map +1 -1
  289. package/dist/private/RangeSlider.mjs.map +1 -1
  290. package/dist/private/SearchField.cjs +41 -41
  291. package/dist/private/SearchField.css +45 -45
  292. package/dist/private/SearchField.mjs +41 -41
  293. package/dist/private/SegmentedControl.cjs +178 -178
  294. package/dist/private/SegmentedControl.css +123 -123
  295. package/dist/private/SegmentedControl.mjs +178 -178
  296. package/dist/private/SelectBoxGroup.cjs +142 -142
  297. package/dist/private/SelectBoxGroup.css +120 -120
  298. package/dist/private/SelectBoxGroup.mjs +142 -142
  299. package/dist/private/Slider.cjs +292 -292
  300. package/dist/private/Slider.css +159 -159
  301. package/dist/private/Slider.mjs +292 -292
  302. package/dist/private/StatusLight.cjs +115 -115
  303. package/dist/private/StatusLight.css +59 -59
  304. package/dist/private/StatusLight.mjs +115 -115
  305. package/dist/private/Switch.cjs +171 -171
  306. package/dist/private/Switch.css +85 -85
  307. package/dist/private/Switch.mjs +171 -171
  308. package/dist/private/TableView.cjs +551 -534
  309. package/dist/private/TableView.cjs.map +1 -1
  310. package/dist/private/TableView.css +329 -303
  311. package/dist/private/TableView.css.map +1 -1
  312. package/dist/private/TableView.mjs +551 -534
  313. package/dist/private/TableView.mjs.map +1 -1
  314. package/dist/private/Tabs.cjs +131 -125
  315. package/dist/private/Tabs.cjs.map +1 -1
  316. package/dist/private/Tabs.css +105 -105
  317. package/dist/private/Tabs.css.map +1 -1
  318. package/dist/private/Tabs.mjs +131 -125
  319. package/dist/private/Tabs.mjs.map +1 -1
  320. package/dist/private/TabsPicker.cjs +127 -127
  321. package/dist/private/TabsPicker.css +108 -108
  322. package/dist/private/TabsPicker.mjs +127 -127
  323. package/dist/private/TagGroup.cjs +203 -203
  324. package/dist/private/TagGroup.cjs.map +1 -1
  325. package/dist/private/TagGroup.css +146 -146
  326. package/dist/private/TagGroup.css.map +1 -1
  327. package/dist/private/TagGroup.mjs +203 -203
  328. package/dist/private/TagGroup.mjs.map +1 -1
  329. package/dist/private/TextField.cjs +58 -58
  330. package/dist/private/TextField.css +54 -54
  331. package/dist/private/TextField.mjs +58 -58
  332. package/dist/private/TimeField.cjs +51 -51
  333. package/dist/private/TimeField.css +47 -47
  334. package/dist/private/TimeField.mjs +51 -51
  335. package/dist/private/Toast.cjs +120 -120
  336. package/dist/private/Toast.cjs.map +1 -1
  337. package/dist/private/Toast.css +110 -110
  338. package/dist/private/Toast.css.map +1 -1
  339. package/dist/private/Toast.mjs +120 -120
  340. package/dist/private/Toast.mjs.map +1 -1
  341. package/dist/private/ToggleButton.cjs +16 -16
  342. package/dist/private/ToggleButton.css +23 -23
  343. package/dist/private/ToggleButton.mjs +16 -16
  344. package/dist/private/Tooltip.cjs +86 -86
  345. package/dist/private/Tooltip.css +70 -70
  346. package/dist/private/Tooltip.mjs +86 -86
  347. package/dist/private/TreeView.cjs +229 -229
  348. package/dist/private/TreeView.cjs.map +1 -1
  349. package/dist/private/TreeView.css +184 -184
  350. package/dist/private/TreeView.css.map +1 -1
  351. package/dist/private/TreeView.mjs +229 -229
  352. package/dist/private/TreeView.mjs.map +1 -1
  353. package/dist/private/dnd-utils.cjs +42 -42
  354. package/dist/private/dnd-utils.css +39 -39
  355. package/dist/private/dnd-utils.mjs +42 -42
  356. package/dist/types/exports/CenterBaseline.d.ts +1 -0
  357. package/dist/types/exports/Skeleton.d.ts +1 -1
  358. package/dist/types/exports/index.d.ts +1 -0
  359. package/dist/types/src/CenterBaseline.d.ts +17 -0
  360. package/dist/types/src/ContextualHelp.d.ts +1 -1
  361. package/dist/types/src/Disclosure.d.ts +6 -1
  362. package/dist/types/src/ListView.d.ts +1 -1
  363. package/dist/types/src/Menu.d.ts +1 -1
  364. package/dist/types/src/Popover.d.ts +2 -2
  365. package/dist/types/src/style-utils.d.ts +4 -1
  366. package/exports/CenterBaseline.ts +1 -0
  367. package/exports/Skeleton.ts +1 -1
  368. package/exports/index.ts +2 -0
  369. package/icons/Icon.cjs +10 -10
  370. package/icons/Icon.css +9 -9
  371. package/icons/Icon.mjs +10 -10
  372. package/icons/Skeleton.cjs +2 -2
  373. package/icons/Skeleton.css +6 -6
  374. package/icons/Skeleton.mjs +2 -2
  375. package/package.json +6 -6
  376. package/src/ActionBar.tsx +0 -1
  377. package/src/ActionButton.tsx +0 -1
  378. package/src/ActionMenu.tsx +0 -1
  379. package/src/AlertDialog.tsx +0 -1
  380. package/src/Breadcrumbs.tsx +0 -4
  381. package/src/Button.tsx +12 -3
  382. package/src/ButtonGroup.tsx +1 -0
  383. package/src/Calendar.tsx +0 -1
  384. package/src/CenterBaseline.tsx +17 -0
  385. package/src/CloseButton.tsx +0 -1
  386. package/src/ComboBox.tsx +0 -1
  387. package/src/ContextualHelp.tsx +1 -2
  388. package/src/DatePicker.tsx +0 -1
  389. package/src/DateRangePicker.tsx +0 -1
  390. package/src/Disclosure.tsx +92 -79
  391. package/src/DropZone.tsx +0 -1
  392. package/src/Field.tsx +0 -1
  393. package/src/InlineAlert.tsx +0 -1
  394. package/src/ListView.tsx +0 -2
  395. package/src/Menu.tsx +1 -8
  396. package/src/NotificationBadge.tsx +0 -1
  397. package/src/Picker.tsx +0 -1
  398. package/src/Popover.tsx +2 -1
  399. package/src/ProgressCircle.tsx +1 -1
  400. package/src/RangeCalendar.tsx +0 -1
  401. package/src/RangeSlider.tsx +0 -1
  402. package/src/TableView.tsx +75 -37
  403. package/src/Tabs.tsx +9 -2
  404. package/src/TagGroup.tsx +0 -1
  405. package/src/Toast.tsx +0 -3
  406. package/src/TreeView.tsx +0 -1
  407. package/src/style-utils.ts +13 -2
  408. package/style/__tests__/style-macro.test.js +73 -71
  409. package/style/dist/main.cjs +25 -25
  410. package/style/dist/module.mjs +13 -13
  411. package/style/dist/properties.mjs +3 -3
  412. package/style/dist/spectrum-theme.cjs +224 -224
  413. package/style/dist/spectrum-theme.mjs +217 -217
  414. package/style/dist/style-macro.cjs +100 -100
  415. package/style/dist/style-macro.mjs +94 -94
  416. package/style/dist/style-utils.cjs +51 -39
  417. package/style/dist/style-utils.cjs.map +1 -1
  418. package/style/dist/style-utils.mjs +50 -38
  419. package/style/dist/style-utils.mjs.map +1 -1
@@ -1,462 +1,462 @@
1
1
  @layer _.a {
2
- .Wu131 {
2
+ .Wu151 {
3
3
  top: 16px;
4
4
  }
5
5
 
6
- ._lu131 {
6
+ ._lu151 {
7
7
  bottom: 16px;
8
8
  }
9
9
 
10
- .IC131 {
10
+ .IC151 {
11
11
  margin-inline-start: 1rem;
12
12
  }
13
13
 
14
- .HM131 {
14
+ .HM151 {
15
15
  margin-inline-end: auto;
16
16
  }
17
17
 
18
- .HC131 {
18
+ .HC151 {
19
19
  margin-inline-end: 1rem;
20
20
  }
21
21
 
22
- .Ka131 {
22
+ .Ka151 {
23
23
  max-height: 100%;
24
24
  }
25
25
 
26
- ._Pc131 {
26
+ ._Pc151 {
27
27
  position: relative;
28
28
  }
29
29
 
30
- ._ta131 {
30
+ ._ta151 {
31
31
  flex-direction: column;
32
32
  }
33
33
 
34
- ._tb131 {
34
+ ._tb151 {
35
35
  flex-direction: column-reverse;
36
36
  }
37
37
 
38
- .Jy131 {
38
+ .Jy151 {
39
39
  margin-top: 0;
40
40
  }
41
41
 
42
- .Gy131 {
42
+ .Gy151 {
43
43
  margin-bottom: 0;
44
44
  }
45
45
 
46
- .Tf131 {
46
+ .Tf151 {
47
47
  padding-top: 16px;
48
48
  }
49
49
 
50
- .Tt131 {
50
+ .Tt151 {
51
51
  padding-top: 8px;
52
52
  }
53
53
 
54
- .Qt131 {
54
+ .Qt151 {
55
55
  padding-bottom: 8px;
56
56
  }
57
57
 
58
- .Qf131 {
58
+ .Qf151 {
59
59
  padding-bottom: 16px;
60
60
  }
61
61
 
62
- .Sd131 {
62
+ .Sd151 {
63
63
  padding-inline-start: 0;
64
64
  }
65
65
 
66
- .St131 {
66
+ .St151 {
67
67
  padding-inline-start: 8px;
68
68
  }
69
69
 
70
- .Rd131 {
70
+ .Rd151 {
71
71
  padding-inline-end: 0;
72
72
  }
73
73
 
74
- .Iy131 {
74
+ .Iy151 {
75
75
  margin-inline-start: 0;
76
76
  }
77
77
 
78
- .Ic131 {
78
+ .Ic151 {
79
79
  margin-inline-start: -.5rem;
80
80
  }
81
81
 
82
- .Hy131 {
82
+ .Hy151 {
83
83
  margin-inline-end: 0;
84
84
  }
85
85
 
86
- .Hc131 {
86
+ .Hc151 {
87
87
  margin-inline-end: -.5rem;
88
88
  }
89
89
 
90
- ._Na131 {
90
+ ._Na151 {
91
91
  overflow-x: auto;
92
92
  }
93
93
 
94
- .Pa131 {
94
+ .Pa151 {
95
95
  overflow-y: auto;
96
96
  }
97
97
 
98
- ._Le131 {
98
+ ._Le151 {
99
99
  outline-style: none;
100
100
  }
101
101
 
102
- ._Lf131 {
102
+ ._Lf151 {
103
103
  outline-style: solid;
104
104
  }
105
105
 
106
- .Oh131 {
106
+ .Oh151 {
107
107
  outline-color: light-dark(#4b75ff, #4069fd);
108
108
  }
109
109
 
110
- .Ok131 {
110
+ .Ok151 {
111
111
  outline-color: #fff;
112
112
  }
113
113
 
114
- ._Mc131 {
114
+ ._Mc151 {
115
115
  outline-width: 2px;
116
116
  }
117
117
 
118
- ._Kd131 {
118
+ ._Kd151 {
119
119
  outline-offset: 2px;
120
120
  }
121
121
 
122
- .Ul131 {
122
+ .Ul151 {
123
123
  row-gap: 1rem;
124
124
  }
125
125
 
126
- .ql131 {
126
+ .ql151 {
127
127
  column-gap: 1rem;
128
128
  }
129
129
 
130
- .Sf131 {
130
+ .Sf151 {
131
131
  padding-inline-start: 16px;
132
132
  }
133
133
 
134
- .Rt131 {
134
+ .Rt151 {
135
135
  padding-inline-end: 8px;
136
136
  }
137
137
 
138
- .Te131 {
138
+ .Te151 {
139
139
  padding-top: 12px;
140
140
  }
141
141
 
142
- .Qe131 {
142
+ .Qe151 {
143
143
  padding-bottom: 12px;
144
144
  }
145
145
 
146
- .oc131 {
146
+ .oc151 {
147
147
  border-start-start-radius: .625rem;
148
148
  }
149
149
 
150
- .nc131 {
150
+ .nc151 {
151
151
  border-start-end-radius: .625rem;
152
152
  }
153
153
 
154
- .kc131 {
154
+ .kc151 {
155
155
  border-end-start-radius: .625rem;
156
156
  }
157
157
 
158
- .jc131 {
158
+ .jc151 {
159
159
  border-end-end-radius: .625rem;
160
160
  }
161
161
 
162
- .Mj131 {
162
+ .Mj151 {
163
163
  min-height: calc(3.5rem * var(--s2-scale));
164
164
  }
165
165
 
166
- .-Zn3gsb-L0uB6Qb131 {
166
+ .-Zn3gsb-L0uB6Qb151 {
167
167
  --maxWidth: calc(21rem * var(--s2-scale));
168
168
  }
169
169
 
170
- .LksArhc131 {
170
+ .LksArhc151 {
171
171
  max-width: min(var(--maxWidth), 90vw);
172
172
  }
173
173
 
174
- ._oa131 {
174
+ ._oa151 {
175
175
  box-sizing: border-box;
176
176
  }
177
177
 
178
- ._va131 {
178
+ ._va151 {
179
179
  flex-shrink: 0;
180
180
  }
181
181
 
182
- .uk131 {
182
+ .uk151 {
183
183
  font-family: var(--s2-font-family-sans, adobe-clean-spectrum-vf), adobe-clean-variable, adobe-clean, ui-sans-serif, system-ui, sans-serif;
184
184
  }
185
185
 
186
- .-_6BNtrc-c131 {
186
+ .-_6BNtrc-c151 {
187
187
  --fs: pow(1.125, 0);
188
188
  }
189
189
 
190
- .vx131 {
190
+ .vx151 {
191
191
  font-size: round(var(--s2-font-size-base, 14) * var(--fs) / 16 * 1rem, 1px);
192
192
  }
193
193
 
194
- .xb131 {
194
+ .xb151 {
195
195
  font-weight: 400;
196
196
  }
197
197
 
198
- ._xa131 {
198
+ ._xa151 {
199
199
  font-synthesis-weight: none;
200
200
  }
201
201
 
202
- ._Fd131 {
202
+ ._Fd151 {
203
203
  line-height: round(1em * (1.15 + (1 - ((min(32, var(--s2-font-size-base, 14) * var(--fs)) - 10)) / 22) * .15), 2px);
204
204
  }
205
205
 
206
- .px131 {
206
+ .px151 {
207
207
  color: #fff;
208
208
  }
209
209
 
210
- .g6131 {
210
+ .g6151 {
211
211
  background-color: light-dark(#505050, #6d6d6d);
212
212
  }
213
213
 
214
- .g2131 {
214
+ .g2151 {
215
215
  background-color: light-dark(#3b63fb, #4069fd);
216
216
  }
217
217
 
218
- .g1131 {
218
+ .g1151 {
219
219
  background-color: light-dark(#05834e, #068850);
220
220
  }
221
221
 
222
- .gB131 {
222
+ .gB151 {
223
223
  background-color: light-dark(#d73220, #df3422);
224
224
  }
225
225
 
226
- .-_8sjo0b-t5ZbAob131 {
226
+ .-_8sjo0b-t5ZbAob151 {
227
227
  --iconPrimary: currentColor;
228
228
  }
229
229
 
230
- ._nLeasBb131 {
230
+ ._nLeasBb151 {
231
231
  box-shadow: 0 4px 12px light-dark(#00000014, #0000003d), 0 2px 6px light-dark(#0000000a, #0000001f), 0 0 2px light-dark(#0000001f, #0000005c);
232
232
  }
233
233
 
234
- ._nd131 {
234
+ ._nd151 {
235
235
  box-shadow: none;
236
236
  }
237
237
 
238
- ._8d131 {
238
+ ._8d151 {
239
239
  will-change: transform;
240
240
  }
241
241
 
242
- .se131 {
242
+ .se151 {
243
243
  display: grid;
244
244
  }
245
245
 
246
- .D4w1sLc131 {
246
+ .D4w1sLc151 {
247
247
  grid-template-columns: auto 1fr auto;
248
248
  }
249
249
 
250
- .CWLL0Xb131 {
250
+ .CWLL0Xb151 {
251
251
  grid-template-areas: "content content content"
252
252
  "expand . action";
253
253
  }
254
254
 
255
- ._ub131 {
255
+ ._ub151 {
256
256
  flex-grow: 1;
257
257
  }
258
258
 
259
- ._wb131 {
259
+ ._wb151 {
260
260
  flex-wrap: wrap;
261
261
  }
262
262
 
263
- .eb131 {
263
+ .eb151 {
264
264
  align-items: center;
265
265
  }
266
266
 
267
- .qj131 {
267
+ .qj151 {
268
268
  column-gap: 1.5rem;
269
269
  }
270
270
 
271
- .ea131 {
271
+ .ea151 {
272
272
  align-items: baseline;
273
273
  }
274
274
 
275
- .zk52g2d131 {
275
+ .zk52g2d151 {
276
276
  grid-column-start: content;
277
277
  }
278
278
 
279
- .yk52g2d131 {
279
+ .yk52g2d151 {
280
280
  grid-column-end: content;
281
281
  }
282
282
 
283
- .Bk52g2d131 {
283
+ .Bk52g2d151 {
284
284
  grid-row-start: content;
285
285
  }
286
286
 
287
- .Ak52g2d131 {
287
+ .Ak52g2d151 {
288
288
  grid-row-end: content;
289
289
  }
290
290
 
291
- .ri131 {
291
+ .ri151 {
292
292
  cursor: default;
293
293
  }
294
294
 
295
- .ZJ131 {
295
+ .ZJ151 {
296
296
  width: fit-content;
297
297
  }
298
298
 
299
- .-nTSCV-LTAEPe131 {
299
+ .-nTSCV-LTAEPe151 {
300
300
  overflow-wrap: break-word;
301
301
  }
302
302
 
303
- .__ZLTAEPe131 {
303
+ .__ZLTAEPe151 {
304
304
  word-break: break-word;
305
305
  }
306
306
 
307
- .Na131 {
307
+ .Na151 {
308
308
  min-width: 0;
309
309
  }
310
310
 
311
- ._pb131 {
311
+ ._pb151 {
312
312
  color-scheme: light;
313
313
  }
314
314
 
315
- .sk131 {
315
+ .sk151 {
316
316
  display: none;
317
317
  }
318
318
 
319
- .sd131 {
319
+ .sd151 {
320
320
  display: flex;
321
321
  }
322
322
 
323
- ._Cb131 {
323
+ ._Cb151 {
324
324
  justify-content: end;
325
325
  }
326
326
 
327
- .Ue131 {
327
+ .Ue151 {
328
328
  row-gap: .5rem;
329
329
  }
330
330
 
331
- .qe131 {
331
+ .qe151 {
332
332
  column-gap: .5rem;
333
333
  }
334
334
 
335
- ._Ia131 {
335
+ ._Ia151 {
336
336
  opacity: 0;
337
337
  }
338
338
 
339
- ._Ib131 {
339
+ ._Ib151 {
340
340
  opacity: 1;
341
341
  }
342
342
 
343
- ._Pb131 {
343
+ ._Pb151 {
344
344
  position: fixed;
345
345
  }
346
346
 
347
- .Wr131 {
347
+ .Wr151 {
348
348
  top: 0;
349
349
  }
350
350
 
351
- ._lr131 {
351
+ ._lr151 {
352
352
  bottom: 0;
353
353
  }
354
354
 
355
- ._Ar131 {
355
+ ._Ar151 {
356
356
  inset-inline-start: 0;
357
357
  }
358
358
 
359
- ._zr131 {
359
+ ._zr151 {
360
360
  inset-inline-end: 0;
361
361
  }
362
362
 
363
- .g8131 {
363
+ .g8151 {
364
364
  background-color: #00000070;
365
365
  }
366
366
 
367
- .zPgKvMe131 {
367
+ .zPgKvMe151 {
368
368
  grid-column-start: expand;
369
369
  }
370
370
 
371
- .yPgKvMe131 {
371
+ .yPgKvMe151 {
372
372
  grid-column-end: expand;
373
373
  }
374
374
 
375
- .BPgKvMe131 {
375
+ .BPgKvMe151 {
376
376
  grid-row-start: expand;
377
377
  }
378
378
 
379
- .APgKvMe131 {
379
+ .APgKvMe151 {
380
380
  grid-row-end: expand;
381
381
  }
382
382
 
383
- .IM131 {
383
+ .IM151 {
384
384
  margin-inline-start: auto;
385
385
  }
386
386
 
387
- .zzz3eAe131 {
387
+ .zzz3eAe151 {
388
388
  grid-column-start: action;
389
389
  }
390
390
 
391
- .yzz3eAe131 {
391
+ .yzz3eAe151 {
392
392
  grid-column-end: action;
393
393
  }
394
394
 
395
- .Bzz3eAe131 {
395
+ .Bzz3eAe151 {
396
396
  grid-row-start: action;
397
397
  }
398
398
 
399
- .Azz3eAe131 {
399
+ .Azz3eAe151 {
400
400
  grid-row-end: action;
401
401
  }
402
402
  }
403
403
 
404
404
  @layer _.b {
405
- .ucJ9TBTb131:lang(ar) {
405
+ .ucJ9TBTb151:lang(ar) {
406
406
  font-family: adobe-clean-arabic, myriad-arabic, ui-sans-serif, system-ui, sans-serif;
407
407
  }
408
408
 
409
- ._FnuYUweb131:is(:lang(ja), :lang(ko), :lang(zh), :lang(zh-Hant), :lang(zh-Hans), :lang(zh-CN), :lang(zh-SG)) {
409
+ ._FnuYUweb151:is(:lang(ja), :lang(ko), :lang(zh), :lang(zh-Hant), :lang(zh-Hans), :lang(zh-CN), :lang(zh-SG)) {
410
410
  line-height: 1.5;
411
411
  }
412
412
  }
413
413
 
414
414
  @layer _.b.l {
415
415
  @media (forced-colors: active) {
416
- .Olc131 {
416
+ .Olc151 {
417
417
  outline-color: highlight;
418
418
  }
419
419
  }
420
420
  }
421
421
 
422
422
  @layer _.c {
423
- .ud3Euai131:lang(he) {
423
+ .ud3Euai151:lang(he) {
424
424
  font-family: adobe-clean-hebrew, myriad-hebrew, ui-sans-serif, system-ui, sans-serif;
425
425
  }
426
426
  }
427
427
 
428
428
  @layer _.d {
429
- .uea131:lang(ja) {
429
+ .uea151:lang(ja) {
430
430
  font-family: adobe-clean-han-japanese, Hiragino Kaku Gothic ProN, ヒラギノ角ゴ ProN W3, Osaka, YuGothic, Yu Gothic, メイリオ, Meiryo, MS Pゴシック, MS PGothic, sans-serif;
431
431
  }
432
432
  }
433
433
 
434
434
  @layer _.e {
435
- .ugb131:lang(ko) {
435
+ .ugb151:lang(ko) {
436
436
  font-family: adobe-clean-han-korean, source-han-korean, Malgun Gothic, Apple Gothic, sans-serif;
437
437
  }
438
438
  }
439
439
 
440
440
  @layer _.f {
441
- .uhd131:lang(zh) {
441
+ .uhd151:lang(zh) {
442
442
  font-family: adobe-clean-han-traditional, source-han-traditional, MingLiu, Heiti TC Light, sans-serif;
443
443
  }
444
444
  }
445
445
 
446
446
  @layer _.g {
447
- .uje131:lang(zh-hant) {
447
+ .uje151:lang(zh-hant) {
448
448
  font-family: adobe-clean-han-traditional, source-han-traditional, MingLiu, Microsoft JhengHei UI, Microsoft JhengHei, Heiti TC Light, sans-serif;
449
449
  }
450
450
  }
451
451
 
452
452
  @layer _.h {
453
- .u2NhKxcl131:lang(zh-HK) {
453
+ .u2NhKxcl151:lang(zh-HK) {
454
454
  font-family: adobe-clean-han-hong-kong, source-han-hong-kong, MingLiu, Microsoft JhengHei UI, Microsoft JhengHei, Heiti TC Light, sans-serif;
455
455
  }
456
456
  }
457
457
 
458
458
  @layer _.i {
459
- .uic131:is(:lang(zh-Hans), :lang(zh-CN), :lang(zh-SG)) {
459
+ .uic151:is(:lang(zh-Hans), :lang(zh-CN), :lang(zh-SG)) {
460
460
  font-family: adobe-clean-han-simplified-c, source-han-simplified-c, SimSun, Heiti SC Light, sans-serif;
461
461
  }
462
462
  }
@@ -1 +1 @@
1
- {"mappings":"ACuKoB;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EA+CF;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EA6CC;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAyCD;;;;EAAA;;;;EAAA;;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAgBG;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAYJ;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAkHD;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EA+JI;;;;EAAA;;;;EAAA;;;;EAAA;;;;EA0BA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;;AA5cA;EA4FD;;;;EAAA;;;;;AA5FC;EAAA;IAAA;;;;;;AA4FD;EAAA;;;;;AAAA;EAAA;;;;;AAAA;EAAA;;;;;AAAA;EAAA;;;;;AAAA;EAAA;;;;;AAAA;EAAA;;;;;AAAA;EAAA","sources":["6dc577186b5a1727","packages/@react-spectrum/s2/src/Toast.tsx"],"sourcesContent":["@import \"a0170cf5756cc69c\";\n@import \"a2ac041fc39dd90c\";\n@import \"edbbbe6b05e0b3b2\";\n@import \"9dfb5fe5fb904d99\";\n@import \"6adef38be65b19a3\";\n@import \"591ce9936d0f37f8\";\n@import \"1be8abfe00176762\";\n@import \"e2df49088a479e17\";\n@import \"e897bf6437583377\";\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {ActionButton} from './ActionButton';\nimport AlertIcon from '../s2wf-icons/S2_Icon_AlertTriangle_20_N.svg';\nimport {Button} from './Button';\nimport {CenterBaseline} from './CenterBaseline';\nimport CheckmarkIcon from '../s2wf-icons/S2_Icon_CheckmarkCircle_20_N.svg';\nimport Chevron from '../s2wf-icons/S2_Icon_ChevronDown_20_N.svg';\nimport {CloseButton} from './CloseButton';\nimport {createContext, ReactNode, useContext, useEffect, useMemo, useRef} from 'react';\nimport {DOMProps} from '@react-types/shared';\nimport {filterDOMProps} from 'react-aria/filterDOMProps';\nimport {flushSync} from 'react-dom';\nimport {focusRing, style} from '../style' with {type: 'macro'};\nimport {FocusScope} from 'react-aria/FocusScope';\nimport {getEventTarget} from 'react-aria/private/utils/shadowdom/DOMFunctions';\nimport InfoIcon from '../s2wf-icons/S2_Icon_InfoCircle_20_N.svg';\nimport intlMessages from '../intl/*.json';\nimport {isWebKit} from 'react-aria/private/utils/platform';\nimport {ToastOptions as RACToastOptions, ToastQueue} from 'react-stately/useToastState';\n// @ts-ignore\nimport {Text} from './Content';\nimport {\n UNSTABLE_Toast as Toast,\n UNSTABLE_ToastContent as ToastContent,\n UNSTABLE_ToastList as ToastList,\n ToastProps,\n UNSTABLE_ToastRegion as ToastRegion,\n ToastRegionProps,\n UNSTABLE_ToastStateContext as ToastStateContext\n} from 'react-aria-components/Toast';\n\nimport toastCss from './Toast.module.css';\n\nimport {useEvent} from 'react-aria/private/utils/useEvent';\nimport {useLocalizedStringFormatter} from 'react-aria/useLocalizedStringFormatter';\nimport {useMediaQuery} from './useMediaQuery';\nimport {useModalOverlay} from 'react-aria/useModalOverlay';\nimport {useOverlayTriggerState} from 'react-stately/useOverlayTriggerState';\n\nexport type ToastPlacement = 'top' | 'top end' | 'bottom' | 'bottom end';\nexport interface ToastContainerProps extends Omit<\n ToastRegionProps<SpectrumToastValue>,\n 'queue' | 'children' | 'style' | 'className' | 'render'\n> {\n /**\n * Placement of the toast container on the page.\n *\n * @default 'bottom'\n */\n placement?: ToastPlacement;\n}\n\nexport interface ToastOptions extends Omit<RACToastOptions, 'priority'>, DOMProps {\n /** A label for the action button within the toast. */\n actionLabel?: string;\n /** Handler that is called when the action button is pressed. */\n onAction?: () => void;\n /** Whether the toast should automatically close when an action is performed. */\n shouldCloseOnAction?: boolean;\n}\n\nexport interface SpectrumToastValue extends DOMProps {\n /** The content of the toast. */\n children: string;\n /** The variant (i.e. color) of the toast. */\n variant: 'positive' | 'negative' | 'info' | 'neutral';\n /** A label for the action button within the toast. */\n actionLabel?: string;\n /** Handler that is called when the action button is pressed. */\n onAction?: () => void;\n /** Whether the toast should automatically close when an action is performed. */\n shouldCloseOnAction?: boolean;\n}\n\nlet globalReduceMotion = false;\nfunction startViewTransition(fn: () => void, type: string) {\n if ('startViewTransition' in document) {\n // Safari doesn't support :active-view-transition-type() yet, so we fall back to a class on the html element.\n document.documentElement.classList.add(toastCss[type]);\n if (globalReduceMotion) {\n document.documentElement.classList.add(toastCss.reduceMotion);\n }\n\n let viewTransition = document.startViewTransition(() => flushSync(fn));\n\n viewTransition.ready.catch(() => {});\n viewTransition.finished.then(() => {\n document.documentElement.classList.remove(toastCss[type], toastCss.reduceMotion);\n });\n } else {\n fn();\n }\n}\n\n// There is a single global toast queue instance for the whole app, initialized lazily.\nlet globalToastQueue: ToastQueue<SpectrumToastValue> | null = null;\nfunction getGlobalToastQueue() {\n if (!globalToastQueue) {\n globalToastQueue = new ToastQueue({\n maxVisibleToasts: Infinity,\n wrapUpdate(fn, action) {\n startViewTransition(fn, `toast-${action}`);\n }\n });\n }\n\n return globalToastQueue;\n}\n\nfunction addToast(\n children: string,\n variant: SpectrumToastValue['variant'],\n options: ToastOptions = {}\n) {\n let value = {\n children,\n variant,\n actionLabel: options.actionLabel,\n onAction: options.onAction,\n shouldCloseOnAction: options.shouldCloseOnAction,\n ...filterDOMProps(options)\n };\n\n // Minimum time of 5s from https://spectrum.adobe.com/page/toast/#Auto-dismissible\n // Actionable toasts cannot be auto dismissed. That would fail WCAG SC 2.2.1.\n // It is debatable whether non-actionable toasts would also fail.\n let timeout =\n options.timeout && !options.actionLabel ? Math.max(options.timeout, 5000) : undefined;\n let queue = getGlobalToastQueue();\n let key = queue.add(value, {timeout, onClose: options.onClose});\n return () => queue.close(key);\n}\n\ntype CloseFunction = () => void;\n\nconst SpectrumToastQueue = {\n /** Queues a neutral toast. */\n neutral(children: string, options: ToastOptions = {}): CloseFunction {\n return addToast(children, 'neutral', options);\n },\n /** Queues a positive toast. */\n positive(children: string, options: ToastOptions = {}): CloseFunction {\n return addToast(children, 'positive', options);\n },\n /** Queues a negative toast. */\n negative(children: string, options: ToastOptions = {}): CloseFunction {\n return addToast(children, 'negative', options);\n },\n /** Queues an informational toast. */\n info(children: string, options: ToastOptions = {}): CloseFunction {\n return addToast(children, 'info', options);\n }\n};\n\nexport {SpectrumToastQueue as ToastQueue};\n\nconst toastRegion = style({\n ...focusRing(),\n display: 'flex',\n flexDirection: {\n placement: {\n top: 'column',\n bottom: 'column-reverse'\n }\n },\n position: 'fixed',\n insetX: 0,\n width: 'fit',\n top: {\n placement: {\n top: {\n default: 16,\n isExpanded: 0\n }\n }\n },\n bottom: {\n placement: {\n bottom: {\n default: 16,\n isExpanded: 0\n }\n }\n },\n marginStart: {\n align: {\n start: 16,\n center: 'auto',\n end: 'auto'\n }\n },\n marginEnd: {\n align: {\n start: 'auto',\n center: 'auto',\n end: 16\n }\n },\n boxSizing: 'border-box',\n maxHeight: 'full',\n borderRadius: 'lg'\n});\n\nconst toastList = style({\n position: 'relative',\n flexGrow: 1,\n display: 'flex',\n gap: 8,\n flexDirection: {\n placement: {\n top: 'column',\n bottom: 'column-reverse'\n }\n },\n boxSizing: 'border-box',\n marginY: 0,\n padding: {\n default: 0,\n // Add padding when expanded to account for focus ring.\n isExpanded: 8\n },\n paddingBottom: {\n isExpanded: {\n placement: {\n top: 8,\n bottom: 16\n }\n }\n },\n paddingTop: {\n isExpanded: {\n placement: {\n top: 16,\n bottom: 8\n }\n }\n },\n margin: 0,\n marginX: {\n default: 0,\n // Undo padding for focus ring.\n isExpanded: -8\n },\n overflow: {\n isExpanded: 'auto'\n }\n});\n\nconst toastStyle = style({\n ...focusRing(),\n outlineColor: {\n default: 'focus-ring',\n isExpanded: 'white'\n },\n display: 'flex',\n gap: 16,\n paddingStart: 16,\n paddingEnd: 8,\n paddingY: 12,\n borderRadius: 'lg',\n minHeight: 56,\n '--maxWidth': {\n type: 'maxWidth',\n value: 336\n },\n maxWidth: 'min(var(--maxWidth), 90vw)',\n boxSizing: 'border-box',\n flexShrink: 0,\n font: 'ui',\n color: 'white',\n backgroundColor: {\n variant: {\n neutral: 'neutral-subdued',\n info: 'informative',\n positive: 'positive',\n negative: 'negative'\n }\n },\n '--iconPrimary': {\n type: 'fill',\n value: 'currentColor'\n },\n boxShadow: {\n default: 'elevated',\n isExpanded: 'none'\n },\n willChange: 'transform'\n});\n\nconst toastBody = style({\n // The top toast in a non-expanded stack has the expand button, so it is rendered as a grid.\n // Otherwise it uses flex so the content can wrap when needed.\n display: {\n default: 'grid',\n isSingle: 'flex'\n },\n gridTemplateColumns: ['auto', '1fr', 'auto'],\n gridTemplateAreas: ['content content content', 'expand . action'],\n flexGrow: 1,\n flexWrap: 'wrap',\n alignItems: 'center',\n columnGap: 24,\n rowGap: 8\n});\n\nconst toastContent = style({\n display: 'flex',\n gap: 8,\n alignItems: 'baseline',\n gridArea: 'content',\n cursor: 'default',\n width: 'fit',\n overflowWrap: 'break-word',\n wordBreak: 'break-word',\n minWidth: 0\n});\n\nconst controls = style({\n colorScheme: 'light',\n display: {\n default: 'none',\n isExpanded: 'flex'\n },\n justifyContent: 'end',\n gap: 8,\n opacity: {\n default: 0,\n isExpanded: 1\n }\n});\n\nconst ICONS = {\n info: InfoIcon,\n negative: AlertIcon,\n positive: CheckmarkIcon\n};\n\ninterface ToastContainerContextValue {\n isExpanded: boolean;\n toggleExpanded: () => void;\n}\n\nconst ToastContainerContext = createContext<ToastContainerContextValue | null>(null);\n\n/**\n * A ToastContainer renders the queued toasts in an application. It should be placed\n * at the root of the app.\n */\nexport function ToastContainer(props: ToastContainerProps): ReactNode {\n let {placement = 'bottom'} = props;\n let queue = getGlobalToastQueue();\n let align = 'center';\n [placement, align = 'center'] = placement.split(' ') as any;\n let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/s2');\n let regionRef = useRef<HTMLDivElement | null>(null);\n\n let state = useOverlayTriggerState({});\n let {isOpen: isExpanded, close, toggle} = state;\n let ctx = useMemo(\n () => ({\n isExpanded,\n toggleExpanded() {\n if (!isExpanded && queue.visibleToasts.length <= 1) {\n return;\n }\n\n startViewTransition(() => toggle(), isExpanded ? 'toast-collapse' : 'toast-expand');\n }\n }),\n [isExpanded, toggle, queue]\n );\n\n // Set the state to collapsed whenever the queue is emptied.\n useEffect(() => {\n return queue.subscribe(() => {\n if (queue.visibleToasts.length === 0 && isExpanded) {\n close();\n }\n });\n }, [queue, isExpanded, close]);\n\n let collapse = () => {\n regionRef.current?.focus();\n ctx.toggleExpanded();\n };\n\n // Prevent scroll, aria hide outside, and contain focus when expanded, since we take over the whole screen.\n // Attach event handler to the ref since ToastRegion doesn't pass through onKeyDown.\n useModalOverlay({}, state, regionRef);\n useEvent(\n regionRef,\n 'keydown',\n isExpanded\n ? e => {\n if (e.key === 'Escape') {\n collapse();\n }\n }\n : undefined\n );\n\n let prefersReducedMotion = useMediaQuery('(prefers-reduced-motion)');\n let reduceMotion = props['PRIVATE_forceReducedMotion'] ?? prefersReducedMotion;\n useEffect(() => {\n let oldGlobalReduceMotion = globalReduceMotion;\n globalReduceMotion = reduceMotion;\n return () => {\n globalReduceMotion = oldGlobalReduceMotion;\n };\n }, [reduceMotion]);\n\n return (\n <ToastRegion\n {...props}\n ref={regionRef}\n queue={queue}\n className={renderProps =>\n toastRegion({\n ...renderProps,\n placement,\n align,\n isExpanded\n })\n }>\n <FocusScope contain={isExpanded}>\n <ToastContainerContext.Provider value={ctx}>\n {isExpanded && (\n // eslint-disable-next-line\n <div\n className={\n toastCss['toast-background'] +\n style({position: 'fixed', inset: 0, backgroundColor: 'transparent-black-500'})\n }\n onClick={collapse}\n />\n )}\n <SpectrumToastList placement={placement} align={align} reduceMotion={reduceMotion} />\n <div className={toastCss['toast-controls'] + controls({isExpanded})}>\n <ActionButton\n size=\"S\"\n onPress={() => queue.clear()}\n // Default focus ring does not have enough contrast against gray background.\n UNSAFE_style={{outlineColor: 'white'}}>\n {stringFormatter.format('toast.clearAll')}\n </ActionButton>\n <ActionButton size=\"S\" onPress={collapse} UNSAFE_style={{outlineColor: 'white'}}>\n {stringFormatter.format('toast.collapse')}\n </ActionButton>\n </div>\n </ToastContainerContext.Provider>\n </FocusScope>\n </ToastRegion>\n );\n}\n\nfunction SpectrumToastList({placement, align, reduceMotion}) {\n let {isExpanded, toggleExpanded} = useContext(ToastContainerContext)!;\n\n // Attach click handler to ref since ToastList doesn't pass through onClick/onPress.\n let toastListRef = useRef(null);\n useEvent(toastListRef, 'click', e => {\n // Have to check if this is a button because stopPropagation in react events doesn't affect native events.\n if (!isExpanded && !(getEventTarget(e) as Element)?.closest('button')) {\n toggleExpanded();\n }\n });\n\n return (\n <ToastList<SpectrumToastValue>\n ref={toastListRef}\n style={({isHovered}) => {\n let origin = isHovered ? 95 : 55;\n return {\n perspective: 80,\n perspectiveOrigin:\n 'center ' + (placement === 'top' ? `calc(100% + ${origin}px)` : `${-origin}px`),\n transition: 'perspective-origin 400ms'\n };\n }}\n className={\n toastCss[isExpanded ? 'toast-list-expanded' : 'toast-list-collapsed'] +\n toastList({placement, align, isExpanded})\n }>\n {({toast}) => (\n <SpectrumToast\n toast={toast}\n placement={placement}\n align={align}\n reduceMotion={reduceMotion}\n />\n )}\n </ToastList>\n );\n}\n\ninterface SpectrumToastProps extends ToastProps<SpectrumToastValue> {\n placement?: 'top' | 'bottom';\n align?: 'start' | 'center' | 'end';\n reduceMotion?: boolean;\n}\n\n// Exported locally for stories.\nexport function SpectrumToast(props: SpectrumToastProps): ReactNode {\n let {toast, placement = 'bottom', align = 'center'} = props;\n let variant = toast.content.variant || 'info';\n let Icon = ICONS[variant];\n let state = useContext(ToastStateContext)!;\n let visibleToasts = state.visibleToasts;\n let index = visibleToasts.indexOf(toast);\n let isMain = index <= 0;\n let ctx = useContext(ToastContainerContext);\n let isExpanded = ctx?.isExpanded || false;\n let toastRef = useRef<HTMLDivElement | null>(null);\n let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/s2');\n\n // When not expanded, use a presentational div for the toasts behind the top one.\n // The content is invisible, all we show is the background color.\n if (!isMain && ctx && !ctx.isExpanded) {\n return (\n <div\n role=\"presentation\"\n style={{\n position: 'absolute',\n [placement === 'top' ? 'bottom' : 'top']: 0,\n left: 0,\n width: '100%',\n translate: `0 0 ${(-12 * index) / 16}rem`,\n // Only 3 toasts are visible in the stack at once, but all toasts are in the DOM.\n // This allows view transitions to smoothly animate them from where they would be\n // in the collapsed stack to their final position in the expanded list.\n opacity: index >= 3 ? 0 : 1,\n zIndex: visibleToasts.length - index - 1,\n // When reduced motion is enabled, use append index to view-transition-name\n // so that adding/removing a toast cross fades instead of transitioning the position.\n // This works because the toasts are seen as separate elements instead of the same one when their index changes.\n viewTransitionName: toast.key + (props.reduceMotion ? '-' + index : ''),\n viewTransitionClass: [toastCss.toast, toastCss['background-toast']]\n .map(c => CSS.escape(c))\n .join(' ')\n }}\n className={\n toastCss.toast + toastStyle({variant: toast.content.variant || 'info', index, isExpanded})\n }\n ref={fixSafariTransform}\n />\n );\n }\n\n return (\n <Toast\n ref={toastRef}\n toast={toast}\n style={{\n zIndex: visibleToasts.length - index - 1,\n viewTransitionName: toast.key,\n viewTransitionClass: [\n toastCss.toast,\n !isMain ? toastCss['background-toast'] : '',\n toastCss[placement],\n toastCss[align]\n ]\n .filter(Boolean)\n .map(c => CSS.escape(c))\n .join(' ')\n }}\n className={renderProps =>\n toastCss.toast +\n toastStyle({\n ...renderProps,\n variant: toast.content.variant || 'info',\n index,\n isExpanded\n })\n }>\n <div\n role=\"presentation\"\n className={toastBody({isSingle: !isMain || visibleToasts.length <= 1 || isExpanded})}>\n <ToastContent\n className={toastContent + (ctx && isMain ? ` ${toastCss['toast-content']}` : null)}>\n {Icon && (\n <CenterBaseline>\n <Icon />\n </CenterBaseline>\n )}\n <Text slot=\"title\">{toast.content.children}</Text>\n </ToastContent>\n {!isExpanded && visibleToasts.length > 1 && (\n <ActionButton\n isQuiet\n staticColor=\"white\"\n styles={style({gridArea: 'expand'})}\n // Make the chevron line up with the toast text, even though there is padding within the button.\n UNSAFE_style={{marginInlineStart: variant === 'neutral' ? -10 : 14}}\n UNSAFE_className={ctx && isMain ? toastCss['toast-expand'] : undefined}\n onPress={() => {\n // This button disappears when clicked, so move focus to the toast.\n toastRef.current?.focus();\n ctx?.toggleExpanded();\n }}>\n <Text>{stringFormatter.format('toast.showAll')}</Text>\n {/* @ts-ignore */}\n <Chevron UNSAFE_style={{rotate: placement === 'bottom' ? '180deg' : undefined}} />\n </ActionButton>\n )}\n {toast.content.actionLabel && (\n <Button\n variant=\"secondary\"\n fillStyle=\"outline\"\n staticColor=\"white\"\n onPress={() => {\n toast.content.onAction?.();\n if (toast.content.shouldCloseOnAction) {\n state.close(toast.key);\n }\n }}\n UNSAFE_className={ctx && isMain ? toastCss['toast-action'] : undefined}\n styles={style({marginStart: 'auto', gridArea: 'action'})}>\n {toast.content.actionLabel}\n </Button>\n )}\n </div>\n <CloseButton\n staticColor=\"white\"\n UNSAFE_className={ctx && isMain ? toastCss['toast-close'] : undefined}\n />\n </Toast>\n );\n}\n\nfunction fixSafariTransform(el: HTMLDivElement | null) {\n // Safari has a bug where the toasts display in the wrong position (CSS transform is not applied correctly).\n // Work around this by removing it, forcing a reflow, and re-applying.\n if (el && isWebKit()) {\n let translate = el.style.translate;\n el.style.translate = '';\n el.offsetHeight;\n el.style.translate = translate;\n }\n}\n"],"names":[],"version":3,"file":"Toast.css.map"}
1
+ {"mappings":"ACoKoB;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EA+CF;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EA6CC;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAyCD;;;;EAAA;;;;EAAA;;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAgBG;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAYJ;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAkHD;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EA+JI;;;;EAAA;;;;EAAA;;;;EAAA;;;;EA0BA;;;;EAAA;;;;EAAA;;;;EAAA;;;;EAAA;;;;;AA5cA;EA4FD;;;;EAAA;;;;;AA5FC;EAAA;IAAA;;;;;;AA4FD;EAAA;;;;;AAAA;EAAA;;;;;AAAA;EAAA;;;;;AAAA;EAAA;;;;;AAAA;EAAA;;;;;AAAA;EAAA;;;;;AAAA;EAAA","sources":["6dc577186b5a1727","packages/@react-spectrum/s2/src/Toast.tsx"],"sourcesContent":["@import \"a0170cf5756cc69c\";\n@import \"a2ac041fc39dd90c\";\n@import \"edbbbe6b05e0b3b2\";\n@import \"9dfb5fe5fb904d99\";\n@import \"6adef38be65b19a3\";\n@import \"591ce9936d0f37f8\";\n@import \"1be8abfe00176762\";\n@import \"e2df49088a479e17\";\n@import \"e897bf6437583377\";\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {ActionButton} from './ActionButton';\nimport AlertIcon from '../s2wf-icons/S2_Icon_AlertTriangle_20_N.svg';\nimport {Button} from './Button';\nimport {CenterBaseline} from './CenterBaseline';\nimport CheckmarkIcon from '../s2wf-icons/S2_Icon_CheckmarkCircle_20_N.svg';\nimport Chevron from '../s2wf-icons/S2_Icon_ChevronDown_20_N.svg';\nimport {CloseButton} from './CloseButton';\nimport {createContext, ReactNode, useContext, useEffect, useMemo, useRef} from 'react';\nimport {DOMProps} from '@react-types/shared';\nimport {filterDOMProps} from 'react-aria/filterDOMProps';\nimport {flushSync} from 'react-dom';\nimport {focusRing, style} from '../style' with {type: 'macro'};\nimport {FocusScope} from 'react-aria/FocusScope';\nimport {getEventTarget} from 'react-aria/private/utils/shadowdom/DOMFunctions';\nimport InfoIcon from '../s2wf-icons/S2_Icon_InfoCircle_20_N.svg';\nimport intlMessages from '../intl/*.json';\nimport {isWebKit} from 'react-aria/private/utils/platform';\nimport {ToastOptions as RACToastOptions, ToastQueue} from 'react-stately/useToastState';\nimport {Text} from './Content';\nimport {\n UNSTABLE_Toast as Toast,\n UNSTABLE_ToastContent as ToastContent,\n UNSTABLE_ToastList as ToastList,\n ToastProps,\n UNSTABLE_ToastRegion as ToastRegion,\n ToastRegionProps,\n UNSTABLE_ToastStateContext as ToastStateContext\n} from 'react-aria-components/Toast';\nimport toastCss from './Toast.module.css';\nimport {useEvent} from 'react-aria/private/utils/useEvent';\nimport {useLocalizedStringFormatter} from 'react-aria/useLocalizedStringFormatter';\nimport {useMediaQuery} from './useMediaQuery';\nimport {useModalOverlay} from 'react-aria/useModalOverlay';\nimport {useOverlayTriggerState} from 'react-stately/useOverlayTriggerState';\n\nexport type ToastPlacement = 'top' | 'top end' | 'bottom' | 'bottom end';\nexport interface ToastContainerProps extends Omit<\n ToastRegionProps<SpectrumToastValue>,\n 'queue' | 'children' | 'style' | 'className' | 'render'\n> {\n /**\n * Placement of the toast container on the page.\n *\n * @default 'bottom'\n */\n placement?: ToastPlacement;\n}\n\nexport interface ToastOptions extends Omit<RACToastOptions, 'priority'>, DOMProps {\n /** A label for the action button within the toast. */\n actionLabel?: string;\n /** Handler that is called when the action button is pressed. */\n onAction?: () => void;\n /** Whether the toast should automatically close when an action is performed. */\n shouldCloseOnAction?: boolean;\n}\n\nexport interface SpectrumToastValue extends DOMProps {\n /** The content of the toast. */\n children: string;\n /** The variant (i.e. color) of the toast. */\n variant: 'positive' | 'negative' | 'info' | 'neutral';\n /** A label for the action button within the toast. */\n actionLabel?: string;\n /** Handler that is called when the action button is pressed. */\n onAction?: () => void;\n /** Whether the toast should automatically close when an action is performed. */\n shouldCloseOnAction?: boolean;\n}\n\nlet globalReduceMotion = false;\nfunction startViewTransition(fn: () => void, type: string) {\n if ('startViewTransition' in document) {\n // Safari doesn't support :active-view-transition-type() yet, so we fall back to a class on the html element.\n document.documentElement.classList.add(toastCss[type]);\n if (globalReduceMotion) {\n document.documentElement.classList.add(toastCss.reduceMotion);\n }\n\n let viewTransition = document.startViewTransition(() => flushSync(fn));\n\n viewTransition.ready.catch(() => {});\n viewTransition.finished.then(() => {\n document.documentElement.classList.remove(toastCss[type], toastCss.reduceMotion);\n });\n } else {\n fn();\n }\n}\n\n// There is a single global toast queue instance for the whole app, initialized lazily.\nlet globalToastQueue: ToastQueue<SpectrumToastValue> | null = null;\nfunction getGlobalToastQueue() {\n if (!globalToastQueue) {\n globalToastQueue = new ToastQueue({\n maxVisibleToasts: Infinity,\n wrapUpdate(fn, action) {\n startViewTransition(fn, `toast-${action}`);\n }\n });\n }\n\n return globalToastQueue;\n}\n\nfunction addToast(\n children: string,\n variant: SpectrumToastValue['variant'],\n options: ToastOptions = {}\n) {\n let value = {\n children,\n variant,\n actionLabel: options.actionLabel,\n onAction: options.onAction,\n shouldCloseOnAction: options.shouldCloseOnAction,\n ...filterDOMProps(options)\n };\n\n // Minimum time of 5s from https://spectrum.adobe.com/page/toast/#Auto-dismissible\n // Actionable toasts cannot be auto dismissed. That would fail WCAG SC 2.2.1.\n // It is debatable whether non-actionable toasts would also fail.\n let timeout =\n options.timeout && !options.actionLabel ? Math.max(options.timeout, 5000) : undefined;\n let queue = getGlobalToastQueue();\n let key = queue.add(value, {timeout, onClose: options.onClose});\n return () => queue.close(key);\n}\n\ntype CloseFunction = () => void;\n\nconst SpectrumToastQueue = {\n /** Queues a neutral toast. */\n neutral(children: string, options: ToastOptions = {}): CloseFunction {\n return addToast(children, 'neutral', options);\n },\n /** Queues a positive toast. */\n positive(children: string, options: ToastOptions = {}): CloseFunction {\n return addToast(children, 'positive', options);\n },\n /** Queues a negative toast. */\n negative(children: string, options: ToastOptions = {}): CloseFunction {\n return addToast(children, 'negative', options);\n },\n /** Queues an informational toast. */\n info(children: string, options: ToastOptions = {}): CloseFunction {\n return addToast(children, 'info', options);\n }\n};\n\nexport {SpectrumToastQueue as ToastQueue};\n\nconst toastRegion = style({\n ...focusRing(),\n display: 'flex',\n flexDirection: {\n placement: {\n top: 'column',\n bottom: 'column-reverse'\n }\n },\n position: 'fixed',\n insetX: 0,\n width: 'fit',\n top: {\n placement: {\n top: {\n default: 16,\n isExpanded: 0\n }\n }\n },\n bottom: {\n placement: {\n bottom: {\n default: 16,\n isExpanded: 0\n }\n }\n },\n marginStart: {\n align: {\n start: 16,\n center: 'auto',\n end: 'auto'\n }\n },\n marginEnd: {\n align: {\n start: 'auto',\n center: 'auto',\n end: 16\n }\n },\n boxSizing: 'border-box',\n maxHeight: 'full',\n borderRadius: 'lg'\n});\n\nconst toastList = style({\n position: 'relative',\n flexGrow: 1,\n display: 'flex',\n gap: 8,\n flexDirection: {\n placement: {\n top: 'column',\n bottom: 'column-reverse'\n }\n },\n boxSizing: 'border-box',\n marginY: 0,\n padding: {\n default: 0,\n // Add padding when expanded to account for focus ring.\n isExpanded: 8\n },\n paddingBottom: {\n isExpanded: {\n placement: {\n top: 8,\n bottom: 16\n }\n }\n },\n paddingTop: {\n isExpanded: {\n placement: {\n top: 16,\n bottom: 8\n }\n }\n },\n margin: 0,\n marginX: {\n default: 0,\n // Undo padding for focus ring.\n isExpanded: -8\n },\n overflow: {\n isExpanded: 'auto'\n }\n});\n\nconst toastStyle = style({\n ...focusRing(),\n outlineColor: {\n default: 'focus-ring',\n isExpanded: 'white'\n },\n display: 'flex',\n gap: 16,\n paddingStart: 16,\n paddingEnd: 8,\n paddingY: 12,\n borderRadius: 'lg',\n minHeight: 56,\n '--maxWidth': {\n type: 'maxWidth',\n value: 336\n },\n maxWidth: 'min(var(--maxWidth), 90vw)',\n boxSizing: 'border-box',\n flexShrink: 0,\n font: 'ui',\n color: 'white',\n backgroundColor: {\n variant: {\n neutral: 'neutral-subdued',\n info: 'informative',\n positive: 'positive',\n negative: 'negative'\n }\n },\n '--iconPrimary': {\n type: 'fill',\n value: 'currentColor'\n },\n boxShadow: {\n default: 'elevated',\n isExpanded: 'none'\n },\n willChange: 'transform'\n});\n\nconst toastBody = style({\n // The top toast in a non-expanded stack has the expand button, so it is rendered as a grid.\n // Otherwise it uses flex so the content can wrap when needed.\n display: {\n default: 'grid',\n isSingle: 'flex'\n },\n gridTemplateColumns: ['auto', '1fr', 'auto'],\n gridTemplateAreas: ['content content content', 'expand . action'],\n flexGrow: 1,\n flexWrap: 'wrap',\n alignItems: 'center',\n columnGap: 24,\n rowGap: 8\n});\n\nconst toastContent = style({\n display: 'flex',\n gap: 8,\n alignItems: 'baseline',\n gridArea: 'content',\n cursor: 'default',\n width: 'fit',\n overflowWrap: 'break-word',\n wordBreak: 'break-word',\n minWidth: 0\n});\n\nconst controls = style({\n colorScheme: 'light',\n display: {\n default: 'none',\n isExpanded: 'flex'\n },\n justifyContent: 'end',\n gap: 8,\n opacity: {\n default: 0,\n isExpanded: 1\n }\n});\n\nconst ICONS = {\n info: InfoIcon,\n negative: AlertIcon,\n positive: CheckmarkIcon\n};\n\ninterface ToastContainerContextValue {\n isExpanded: boolean;\n toggleExpanded: () => void;\n}\n\nconst ToastContainerContext = createContext<ToastContainerContextValue | null>(null);\n\n/**\n * A ToastContainer renders the queued toasts in an application. It should be placed\n * at the root of the app.\n */\nexport function ToastContainer(props: ToastContainerProps): ReactNode {\n let {placement = 'bottom'} = props;\n let queue = getGlobalToastQueue();\n let align = 'center';\n [placement, align = 'center'] = placement.split(' ') as any;\n let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/s2');\n let regionRef = useRef<HTMLDivElement | null>(null);\n\n let state = useOverlayTriggerState({});\n let {isOpen: isExpanded, close, toggle} = state;\n let ctx = useMemo(\n () => ({\n isExpanded,\n toggleExpanded() {\n if (!isExpanded && queue.visibleToasts.length <= 1) {\n return;\n }\n\n startViewTransition(() => toggle(), isExpanded ? 'toast-collapse' : 'toast-expand');\n }\n }),\n [isExpanded, toggle, queue]\n );\n\n // Set the state to collapsed whenever the queue is emptied.\n useEffect(() => {\n return queue.subscribe(() => {\n if (queue.visibleToasts.length === 0 && isExpanded) {\n close();\n }\n });\n }, [queue, isExpanded, close]);\n\n let collapse = () => {\n regionRef.current?.focus();\n ctx.toggleExpanded();\n };\n\n // Prevent scroll, aria hide outside, and contain focus when expanded, since we take over the whole screen.\n // Attach event handler to the ref since ToastRegion doesn't pass through onKeyDown.\n useModalOverlay({}, state, regionRef);\n useEvent(\n regionRef,\n 'keydown',\n isExpanded\n ? e => {\n if (e.key === 'Escape') {\n collapse();\n }\n }\n : undefined\n );\n\n let prefersReducedMotion = useMediaQuery('(prefers-reduced-motion)');\n let reduceMotion = props['PRIVATE_forceReducedMotion'] ?? prefersReducedMotion;\n useEffect(() => {\n let oldGlobalReduceMotion = globalReduceMotion;\n globalReduceMotion = reduceMotion;\n return () => {\n globalReduceMotion = oldGlobalReduceMotion;\n };\n }, [reduceMotion]);\n\n return (\n <ToastRegion\n {...props}\n ref={regionRef}\n queue={queue}\n className={renderProps =>\n toastRegion({\n ...renderProps,\n placement,\n align,\n isExpanded\n })\n }>\n <FocusScope contain={isExpanded}>\n <ToastContainerContext.Provider value={ctx}>\n {isExpanded && (\n // eslint-disable-next-line\n <div\n className={\n toastCss['toast-background'] +\n style({position: 'fixed', inset: 0, backgroundColor: 'transparent-black-500'})\n }\n onClick={collapse}\n />\n )}\n <SpectrumToastList placement={placement} align={align} reduceMotion={reduceMotion} />\n <div className={toastCss['toast-controls'] + controls({isExpanded})}>\n <ActionButton\n size=\"S\"\n onPress={() => queue.clear()}\n // Default focus ring does not have enough contrast against gray background.\n UNSAFE_style={{outlineColor: 'white'}}>\n {stringFormatter.format('toast.clearAll')}\n </ActionButton>\n <ActionButton size=\"S\" onPress={collapse} UNSAFE_style={{outlineColor: 'white'}}>\n {stringFormatter.format('toast.collapse')}\n </ActionButton>\n </div>\n </ToastContainerContext.Provider>\n </FocusScope>\n </ToastRegion>\n );\n}\n\nfunction SpectrumToastList({placement, align, reduceMotion}) {\n let {isExpanded, toggleExpanded} = useContext(ToastContainerContext)!;\n\n // Attach click handler to ref since ToastList doesn't pass through onClick/onPress.\n let toastListRef = useRef(null);\n useEvent(toastListRef, 'click', e => {\n // Have to check if this is a button because stopPropagation in react events doesn't affect native events.\n if (!isExpanded && !(getEventTarget(e) as Element)?.closest('button')) {\n toggleExpanded();\n }\n });\n\n return (\n <ToastList<SpectrumToastValue>\n ref={toastListRef}\n style={({isHovered}) => {\n let origin = isHovered ? 95 : 55;\n return {\n perspective: 80,\n perspectiveOrigin:\n 'center ' + (placement === 'top' ? `calc(100% + ${origin}px)` : `${-origin}px`),\n transition: 'perspective-origin 400ms'\n };\n }}\n className={\n toastCss[isExpanded ? 'toast-list-expanded' : 'toast-list-collapsed'] +\n toastList({placement, align, isExpanded})\n }>\n {({toast}) => (\n <SpectrumToast\n toast={toast}\n placement={placement}\n align={align}\n reduceMotion={reduceMotion}\n />\n )}\n </ToastList>\n );\n}\n\ninterface SpectrumToastProps extends ToastProps<SpectrumToastValue> {\n placement?: 'top' | 'bottom';\n align?: 'start' | 'center' | 'end';\n reduceMotion?: boolean;\n}\n\n// Exported locally for stories.\nexport function SpectrumToast(props: SpectrumToastProps): ReactNode {\n let {toast, placement = 'bottom', align = 'center'} = props;\n let variant = toast.content.variant || 'info';\n let Icon = ICONS[variant];\n let state = useContext(ToastStateContext)!;\n let visibleToasts = state.visibleToasts;\n let index = visibleToasts.indexOf(toast);\n let isMain = index <= 0;\n let ctx = useContext(ToastContainerContext);\n let isExpanded = ctx?.isExpanded || false;\n let toastRef = useRef<HTMLDivElement | null>(null);\n let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/s2');\n\n // When not expanded, use a presentational div for the toasts behind the top one.\n // The content is invisible, all we show is the background color.\n if (!isMain && ctx && !ctx.isExpanded) {\n return (\n <div\n role=\"presentation\"\n style={{\n position: 'absolute',\n [placement === 'top' ? 'bottom' : 'top']: 0,\n left: 0,\n width: '100%',\n translate: `0 0 ${(-12 * index) / 16}rem`,\n // Only 3 toasts are visible in the stack at once, but all toasts are in the DOM.\n // This allows view transitions to smoothly animate them from where they would be\n // in the collapsed stack to their final position in the expanded list.\n opacity: index >= 3 ? 0 : 1,\n zIndex: visibleToasts.length - index - 1,\n // When reduced motion is enabled, use append index to view-transition-name\n // so that adding/removing a toast cross fades instead of transitioning the position.\n // This works because the toasts are seen as separate elements instead of the same one when their index changes.\n viewTransitionName: toast.key + (props.reduceMotion ? '-' + index : ''),\n viewTransitionClass: [toastCss.toast, toastCss['background-toast']]\n .map(c => CSS.escape(c))\n .join(' ')\n }}\n className={\n toastCss.toast + toastStyle({variant: toast.content.variant || 'info', index, isExpanded})\n }\n ref={fixSafariTransform}\n />\n );\n }\n\n return (\n <Toast\n ref={toastRef}\n toast={toast}\n style={{\n zIndex: visibleToasts.length - index - 1,\n viewTransitionName: toast.key,\n viewTransitionClass: [\n toastCss.toast,\n !isMain ? toastCss['background-toast'] : '',\n toastCss[placement],\n toastCss[align]\n ]\n .filter(Boolean)\n .map(c => CSS.escape(c))\n .join(' ')\n }}\n className={renderProps =>\n toastCss.toast +\n toastStyle({\n ...renderProps,\n variant: toast.content.variant || 'info',\n index,\n isExpanded\n })\n }>\n <div\n role=\"presentation\"\n className={toastBody({isSingle: !isMain || visibleToasts.length <= 1 || isExpanded})}>\n <ToastContent\n className={toastContent + (ctx && isMain ? ` ${toastCss['toast-content']}` : null)}>\n {Icon && (\n <CenterBaseline>\n <Icon />\n </CenterBaseline>\n )}\n <Text slot=\"title\">{toast.content.children}</Text>\n </ToastContent>\n {!isExpanded && visibleToasts.length > 1 && (\n <ActionButton\n isQuiet\n staticColor=\"white\"\n styles={style({gridArea: 'expand'})}\n // Make the chevron line up with the toast text, even though there is padding within the button.\n UNSAFE_style={{marginInlineStart: variant === 'neutral' ? -10 : 14}}\n UNSAFE_className={ctx && isMain ? toastCss['toast-expand'] : undefined}\n onPress={() => {\n // This button disappears when clicked, so move focus to the toast.\n toastRef.current?.focus();\n ctx?.toggleExpanded();\n }}>\n <Text>{stringFormatter.format('toast.showAll')}</Text>\n {/* @ts-ignore */}\n <Chevron UNSAFE_style={{rotate: placement === 'bottom' ? '180deg' : undefined}} />\n </ActionButton>\n )}\n {toast.content.actionLabel && (\n <Button\n variant=\"secondary\"\n fillStyle=\"outline\"\n staticColor=\"white\"\n onPress={() => {\n toast.content.onAction?.();\n if (toast.content.shouldCloseOnAction) {\n state.close(toast.key);\n }\n }}\n UNSAFE_className={ctx && isMain ? toastCss['toast-action'] : undefined}\n styles={style({marginStart: 'auto', gridArea: 'action'})}>\n {toast.content.actionLabel}\n </Button>\n )}\n </div>\n <CloseButton\n staticColor=\"white\"\n UNSAFE_className={ctx && isMain ? toastCss['toast-close'] : undefined}\n />\n </Toast>\n );\n}\n\nfunction fixSafariTransform(el: HTMLDivElement | null) {\n // Safari has a bug where the toasts display in the wrong position (CSS transform is not applied correctly).\n // Work around this by removing it, forcing a reflow, and re-applying.\n if (el && isWebKit()) {\n let translate = el.style.translate;\n el.style.translate = '';\n el.offsetHeight;\n el.style.translate = translate;\n }\n}\n"],"names":[],"version":3,"file":"Toast.css.map"}