@astryxdesign/core 0.5.0 → 0.5.1-canary.046f6ea

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 (622) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +45 -20
  5. package/dist/AspectRatio/AspectRatio.d.ts +6 -6
  6. package/dist/Avatar/Avatar.d.ts +25 -1
  7. package/dist/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/Avatar/Avatar.js +43 -9
  9. package/dist/Avatar/index.d.ts +2 -2
  10. package/dist/Avatar/index.d.ts.map +1 -1
  11. package/dist/Avatar/index.js +1 -1
  12. package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
  13. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  14. package/dist/AvatarGroup/AvatarGroup.js +5 -2
  15. package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
  16. package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
  17. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  18. package/dist/AvatarGroup/AvatarGroupOverflow.js +11 -7
  19. package/dist/Badge/Badge.d.ts.map +1 -1
  20. package/dist/Badge/Badge.js +26 -2
  21. package/dist/Banner/Banner.d.ts +10 -1
  22. package/dist/Banner/Banner.d.ts.map +1 -1
  23. package/dist/Banner/Banner.js +11 -2
  24. package/dist/Button/Button.d.ts.map +1 -1
  25. package/dist/Button/Button.js +8 -7
  26. package/dist/Calendar/Calendar.d.ts +4 -2
  27. package/dist/Calendar/Calendar.d.ts.map +1 -1
  28. package/dist/Calendar/Calendar.js +15 -21
  29. package/dist/Calendar/hooks/useCalendarDays.js +4 -6
  30. package/dist/Calendar/hooks/useCalendarNavigation.js +4 -6
  31. package/dist/Calendar/styles.d.ts +5 -20
  32. package/dist/Calendar/styles.d.ts.map +1 -1
  33. package/dist/Calendar/styles.js +15 -17
  34. package/dist/Card/Card.d.ts +12 -12
  35. package/dist/Card/Card.d.ts.map +1 -1
  36. package/dist/Card/Card.js +17 -9
  37. package/dist/Card/index.d.ts +35 -1
  38. package/dist/Card/index.d.ts.map +1 -1
  39. package/dist/Card/index.js +21 -1
  40. package/dist/Carousel/Carousel.d.ts.map +1 -1
  41. package/dist/Carousel/Carousel.js +108 -7
  42. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  43. package/dist/CheckboxInput/CheckboxInput.js +7 -1
  44. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  45. package/dist/CodeBlock/CodeBlock.js +15 -4
  46. package/dist/CodeBlock/highlightRanges.js +1 -1
  47. package/dist/CodeBlock/highlightStyles.js +13 -13
  48. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  49. package/dist/CommandPalette/CommandPaletteItem.js +2 -7
  50. package/dist/ComplexSelector/ComplexSelector.d.ts +10 -2
  51. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  52. package/dist/ComplexSelector/ComplexSelector.js +14 -7
  53. package/dist/DateInput/DateInput.d.ts +43 -0
  54. package/dist/DateInput/DateInput.d.ts.map +1 -1
  55. package/dist/DateInput/DateInput.js +22 -5
  56. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  57. package/dist/DateInput/MonthScroller.js +5 -3
  58. package/dist/DateInput/MonthYearWheels.d.ts.map +1 -1
  59. package/dist/DateInput/MonthYearWheels.js +6 -4
  60. package/dist/DateInput/NativeDateField.d.ts +10 -0
  61. package/dist/DateInput/NativeDateField.d.ts.map +1 -0
  62. package/dist/DateInput/NativeDateField.js +494 -0
  63. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  64. package/dist/DateInput/TouchDateField.js +52 -25
  65. package/dist/DateInput/Wheel.d.ts.map +1 -1
  66. package/dist/DateInput/Wheel.js +1 -0
  67. package/dist/DateInput/index.d.ts +1 -1
  68. package/dist/DateInput/index.d.ts.map +1 -1
  69. package/dist/DateInput/nativeDateSegments.d.ts +22 -0
  70. package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
  71. package/dist/DateInput/nativeDateSegments.js +111 -0
  72. package/dist/DateRangeInput/DateRangeInput.d.ts +4 -2
  73. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  74. package/dist/DateRangeInput/DateRangeInput.js +3 -5
  75. package/dist/DateTimeInput/DateTimeInput.d.ts +23 -24
  76. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  77. package/dist/DateTimeInput/DateTimeInput.js +35 -10
  78. package/dist/DateTimeInput/TouchDateTimeField.d.ts +6 -0
  79. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -0
  80. package/dist/DateTimeInput/TouchDateTimeField.js +1021 -0
  81. package/dist/Dialog/Dialog.d.ts +16 -2
  82. package/dist/Dialog/Dialog.d.ts.map +1 -1
  83. package/dist/Dialog/Dialog.js +28 -7
  84. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  85. package/dist/DropdownMenu/DropdownMenu.js +4 -13
  86. package/dist/Field/FieldLabel.d.ts.map +1 -1
  87. package/dist/Field/FieldLabel.js +9 -1
  88. package/dist/Field/InputClearButton.d.ts +9 -3
  89. package/dist/Field/InputClearButton.d.ts.map +1 -1
  90. package/dist/Field/InputClearButton.js +14 -3
  91. package/dist/Heading/Heading.d.ts.map +1 -1
  92. package/dist/Heading/Heading.js +0 -1
  93. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  94. package/dist/HoverCard/HoverCard.js +104 -3
  95. package/dist/HoverCard/useHoverCard.d.ts +14 -2
  96. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  97. package/dist/HoverCard/useHoverCard.js +7 -1
  98. package/dist/Icon/Icon.d.ts +4 -2
  99. package/dist/Icon/Icon.d.ts.map +1 -1
  100. package/dist/Icon/defaultIcons.d.ts +3 -2
  101. package/dist/Icon/defaultIcons.d.ts.map +1 -1
  102. package/dist/Icon/defaultIcons.js +7 -0
  103. package/dist/Icon/globalIconRegistry.d.ts +13 -0
  104. package/dist/Icon/globalIconRegistry.d.ts.map +1 -1
  105. package/dist/Icon/globalIconRegistry.js +34 -6
  106. package/dist/Icon/index.d.ts +1 -1
  107. package/dist/Icon/index.d.ts.map +1 -1
  108. package/dist/Icon/useIcon.d.ts +5 -2
  109. package/dist/Icon/useIcon.d.ts.map +1 -1
  110. package/dist/Icon/useIcon.js +3 -0
  111. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  112. package/dist/Indicator/CheckboxIndicator.js +6 -2
  113. package/dist/Item/Item.d.ts.map +1 -1
  114. package/dist/Item/Item.js +2 -2
  115. package/dist/Kbd/Kbd.d.ts.map +1 -1
  116. package/dist/Kbd/Kbd.js +2 -26
  117. package/dist/Layer/gestureCounter.d.ts +8 -0
  118. package/dist/Layer/gestureCounter.d.ts.map +1 -0
  119. package/dist/Layer/gestureCounter.js +53 -0
  120. package/dist/Layer/useLayer.d.ts +23 -13
  121. package/dist/Layer/useLayer.d.ts.map +1 -1
  122. package/dist/Layer/useLayer.js +146 -24
  123. package/dist/List/List.d.ts +1 -1
  124. package/dist/List/List.d.ts.map +1 -1
  125. package/dist/List/List.js +15 -4
  126. package/dist/Markdown/Markdown.d.ts +1 -1
  127. package/dist/Markdown/Markdown.d.ts.map +1 -1
  128. package/dist/Markdown/Markdown.js +20 -7
  129. package/dist/Markdown/parser.d.ts.map +1 -1
  130. package/dist/Markdown/parser.js +5 -3
  131. package/dist/MetadataList/MetadataListItem.d.ts +1 -1
  132. package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
  133. package/dist/MetadataList/MetadataListItem.js +4 -1
  134. package/dist/MultiSelector/MultiSelector.d.ts +18 -1
  135. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  136. package/dist/MultiSelector/MultiSelector.js +58 -11
  137. package/dist/MultiSelector/hooks.d.ts +7 -1
  138. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  139. package/dist/MultiSelector/hooks.js +3 -2
  140. package/dist/NavIcon/NavIcon.d.ts.map +1 -1
  141. package/dist/NavIcon/NavIcon.js +5 -1
  142. package/dist/NavItem/navItemStyles.stylex.d.ts +0 -8
  143. package/dist/NavItem/navItemStyles.stylex.d.ts.map +1 -1
  144. package/dist/NavItem/navItemStyles.stylex.js +0 -2
  145. package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
  146. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  147. package/dist/NavMenu/NavHeadingMenu.js +7 -4
  148. package/dist/NumberInput/NumberInput.d.ts +6 -1
  149. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  150. package/dist/NumberInput/NumberInput.js +95 -126
  151. package/dist/NumberInput/numberInputCommit.d.ts +34 -0
  152. package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
  153. package/dist/NumberInput/numberInputCommit.js +71 -0
  154. package/dist/NumberInput/numberParser.d.ts +64 -0
  155. package/dist/NumberInput/numberParser.d.ts.map +1 -0
  156. package/dist/NumberInput/numberParser.js +350 -0
  157. package/dist/Outline/Outline.d.ts.map +1 -1
  158. package/dist/Outline/Outline.js +2 -3
  159. package/dist/OverflowList/OverflowList.d.ts +41 -1
  160. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  161. package/dist/OverflowList/OverflowList.js +43 -2
  162. package/dist/Popover/Popover.d.ts.map +1 -1
  163. package/dist/Popover/Popover.js +8 -14
  164. package/dist/Popover/usePopover.d.ts +15 -41
  165. package/dist/Popover/usePopover.d.ts.map +1 -1
  166. package/dist/Popover/usePopover.js +26 -7
  167. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  168. package/dist/PowerSearch/PowerSearchValueEditor.js +91 -18
  169. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  170. package/dist/PowerSearch/formatFilterValue.js +4 -2
  171. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  172. package/dist/ProgressBar/ProgressBar.js +18 -5
  173. package/dist/Resizable/useResizable.d.ts +19 -1
  174. package/dist/Resizable/useResizable.d.ts.map +1 -1
  175. package/dist/Resizable/useResizable.js +104 -38
  176. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  177. package/dist/SelectableCard/SelectableCard.js +9 -0
  178. package/dist/Selector/Selector.d.ts +18 -1
  179. package/dist/Selector/Selector.d.ts.map +1 -1
  180. package/dist/Selector/Selector.js +92 -21
  181. package/dist/Selector/hooks.d.ts +7 -1
  182. package/dist/Selector/hooks.d.ts.map +1 -1
  183. package/dist/Selector/hooks.js +3 -2
  184. package/dist/SideNav/SideNav.d.ts +6 -1
  185. package/dist/SideNav/SideNav.d.ts.map +1 -1
  186. package/dist/SideNav/SideNav.js +57 -27
  187. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  188. package/dist/SideNav/SideNavHeading.js +5 -4
  189. package/dist/SideNav/SideNavItem.d.ts +29 -4
  190. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  191. package/dist/SideNav/SideNavItem.js +75 -20
  192. package/dist/Slider/Slider.d.ts.map +1 -1
  193. package/dist/Slider/Slider.js +34 -2
  194. package/dist/Spinner/Spinner.d.ts +3 -1
  195. package/dist/Spinner/Spinner.d.ts.map +1 -1
  196. package/dist/Spinner/Spinner.js +199 -20
  197. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  198. package/dist/StatusDot/StatusDot.js +6 -1
  199. package/dist/Stepper/Step.d.ts.map +1 -1
  200. package/dist/Stepper/Step.js +7 -6
  201. package/dist/Switch/Switch.d.ts.map +1 -1
  202. package/dist/Switch/Switch.js +5 -1
  203. package/dist/Table/BaseTable.d.ts.map +1 -1
  204. package/dist/Table/BaseTable.js +6 -1
  205. package/dist/Table/Table.d.ts.map +1 -1
  206. package/dist/Table/Table.js +3 -6
  207. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  208. package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
  209. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +26 -0
  210. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  211. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +34 -3
  212. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  213. package/dist/Table/plugins/selection/useTableSelection.js +25 -1
  214. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  215. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
  216. package/dist/Text/Text.d.ts.map +1 -1
  217. package/dist/Text/Text.js +0 -1
  218. package/dist/TextArea/TextArea.d.ts.map +1 -1
  219. package/dist/TextArea/TextArea.js +13 -8
  220. package/dist/Timestamp/Timestamp.d.ts +1 -1
  221. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  222. package/dist/Timestamp/Timestamp.js +10 -18
  223. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  224. package/dist/Timestamp/formatInstant.js +10 -5
  225. package/dist/Toast/Toast.d.ts +17 -2
  226. package/dist/Toast/Toast.d.ts.map +1 -1
  227. package/dist/Toast/Toast.js +77 -11
  228. package/dist/Toast/ToastViewport.d.ts +1 -0
  229. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  230. package/dist/Toast/ToastViewport.js +76 -21
  231. package/dist/Toast/index.d.ts +1 -1
  232. package/dist/Toast/index.d.ts.map +1 -1
  233. package/dist/Toast/types.d.ts +38 -0
  234. package/dist/Toast/types.d.ts.map +1 -1
  235. package/dist/Toast/useToastGesture.d.ts +26 -0
  236. package/dist/Toast/useToastGesture.d.ts.map +1 -0
  237. package/dist/Toast/useToastGesture.js +223 -0
  238. package/dist/Token/Token.d.ts +1 -1
  239. package/dist/Token/Token.d.ts.map +1 -1
  240. package/dist/Token/Token.js +23 -12
  241. package/dist/Token/TokenLink.d.ts +1 -1
  242. package/dist/Token/TokenLink.d.ts.map +1 -1
  243. package/dist/Token/TokenLink.js +5 -2
  244. package/dist/Tokenizer/Tokenizer.d.ts +12 -1
  245. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  246. package/dist/Tokenizer/Tokenizer.js +31 -21
  247. package/dist/TopNav/TopNavHeading.js +2 -2
  248. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  249. package/dist/TopNav/TopNavItem.js +3 -3
  250. package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
  251. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  252. package/dist/TopNav/TopNavMegaMenu.js +30 -9
  253. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  254. package/dist/TopNav/TopNavMegaMenuItem.js +3 -3
  255. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  256. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  257. package/dist/TopNav/TopNavMenu.js +21 -6
  258. package/dist/TreeList/TreeList.d.ts +1 -1
  259. package/dist/TreeList/TreeList.d.ts.map +1 -1
  260. package/dist/TreeList/TreeList.js +7 -2
  261. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  262. package/dist/TreeList/TreeListItem.js +2 -2
  263. package/dist/Typeahead/BaseTypeahead.d.ts +33 -0
  264. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  265. package/dist/Typeahead/BaseTypeahead.js +51 -8
  266. package/dist/Typeahead/Typeahead.d.ts +8 -1
  267. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  268. package/dist/Typeahead/Typeahead.js +2 -0
  269. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  270. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  271. package/dist/Typeahead/TypeaheadItem.js +7 -2
  272. package/dist/astryx.css +87 -22
  273. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  274. package/dist/hooks/useHotkeys.js +3 -25
  275. package/dist/hooks/useOverflow.d.ts.map +1 -1
  276. package/dist/hooks/useOverflow.js +14 -4
  277. package/dist/i18n/InternationalizationContext.d.ts +2 -0
  278. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  279. package/dist/i18n/InternationalizationContext.js +3 -1
  280. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  281. package/dist/i18n/InternationalizationProvider.js +3 -1
  282. package/dist/i18n/resolve.d.ts +1 -1
  283. package/dist/i18n/resolve.d.ts.map +1 -1
  284. package/dist/i18n/resolve.js +37 -38
  285. package/dist/i18n/useTranslator.d.ts.map +1 -1
  286. package/dist/i18n/useTranslator.js +2 -3
  287. package/dist/index.d.ts +1 -1
  288. package/dist/index.d.ts.map +1 -1
  289. package/dist/theme/Theme.d.ts.map +1 -1
  290. package/dist/theme/Theme.js +46 -10
  291. package/dist/theme/defineTheme.d.ts +9 -3
  292. package/dist/theme/defineTheme.d.ts.map +1 -1
  293. package/dist/theme/defineTheme.js +5 -0
  294. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  295. package/dist/theme/derivedVarRegistry.js +24 -4
  296. package/dist/theme/generateThemeRules.d.ts +21 -0
  297. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  298. package/dist/theme/generateThemeRules.js +26 -0
  299. package/dist/theme/syntax/tokens.d.ts +1 -1
  300. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  301. package/dist/theme/syntax/tokens.js +5 -2
  302. package/dist/theme/useTheme.d.ts.map +1 -1
  303. package/dist/theme/useTheme.js +6 -7
  304. package/dist/utils/dateParser.d.ts +5 -8
  305. package/dist/utils/dateParser.d.ts.map +1 -1
  306. package/dist/utils/dateParser.js +10 -11
  307. package/dist/utils/focusOutline.stylex.d.ts +25 -0
  308. package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
  309. package/dist/utils/focusOutline.stylex.js +15 -0
  310. package/dist/utils/interactionOverlay.stylex.d.ts +26 -0
  311. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -0
  312. package/dist/utils/interactionOverlay.stylex.js +42 -0
  313. package/dist/utils/isApplePlatform.d.ts +18 -0
  314. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  315. package/dist/utils/isApplePlatform.js +37 -0
  316. package/dist/utils/plainDate.d.ts +11 -0
  317. package/dist/utils/plainDate.d.ts.map +1 -1
  318. package/dist/utils/plainDate.js +20 -4
  319. package/locales/af-ZA.json +7 -7
  320. package/locales/ar-SA.json +7 -7
  321. package/locales/ca-ES.json +6 -6
  322. package/locales/cs-CZ.json +7 -7
  323. package/locales/da-DK.json +7 -7
  324. package/locales/de-DE.json +7 -7
  325. package/locales/el-GR.json +7 -7
  326. package/locales/en.json +178 -6
  327. package/locales/es-ES.json +6 -6
  328. package/locales/fi-FI.json +7 -7
  329. package/locales/fr-FR.json +7 -7
  330. package/locales/he-IL.json +7 -7
  331. package/locales/hu-HU.json +7 -7
  332. package/locales/it-IT.json +7 -7
  333. package/locales/ja-JP.json +7 -7
  334. package/locales/ko-KR.json +7 -7
  335. package/locales/nl-NL.json +7 -7
  336. package/locales/no-NO.json +7 -7
  337. package/locales/pl-PL.json +7 -7
  338. package/locales/pseudo.json +130 -1
  339. package/locales/pt-BR.json +7 -7
  340. package/locales/pt-PT.json +7 -7
  341. package/locales/ro-RO.json +7 -7
  342. package/locales/ru-RU.json +7 -7
  343. package/locales/sr-SP.json +7 -7
  344. package/locales/sv-SE.json +7 -7
  345. package/locales/tr-TR.json +7 -7
  346. package/locales/uk-UA.json +7 -7
  347. package/locales/vi-VN.json +7 -7
  348. package/locales/zh-CN.json +7 -7
  349. package/locales/zh-TW.json +7 -7
  350. package/package.json +4 -5
  351. package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
  352. package/src/AlertDialog/AlertDialog.test.tsx +211 -2
  353. package/src/AlertDialog/AlertDialog.tsx +62 -20
  354. package/src/AspectRatio/AspectRatio.doc.mjs +3 -3
  355. package/src/AspectRatio/AspectRatio.tsx +6 -6
  356. package/src/Avatar/Avatar.doc.mjs +12 -2
  357. package/src/Avatar/Avatar.test.tsx +80 -0
  358. package/src/Avatar/Avatar.tsx +64 -14
  359. package/src/Avatar/index.ts +2 -2
  360. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  361. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  362. package/src/AvatarGroup/AvatarGroup.tsx +12 -4
  363. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  364. package/src/AvatarGroup/AvatarGroupOverflow.tsx +12 -12
  365. package/src/Badge/Badge.doc.mjs +3 -2
  366. package/src/Badge/Badge.test.tsx +32 -3
  367. package/src/Badge/Badge.tsx +42 -1
  368. package/src/Banner/Banner.doc.mjs +9 -0
  369. package/src/Banner/Banner.test.tsx +76 -11
  370. package/src/Banner/Banner.tsx +21 -2
  371. package/src/Button/Button.doc.mjs +2 -1
  372. package/src/Button/Button.test.tsx +19 -4
  373. package/src/Button/Button.tsx +9 -29
  374. package/src/ButtonGroup/ButtonGroup.doc.mjs +2 -2
  375. package/src/ButtonGroup/ButtonGroup.test.tsx +13 -0
  376. package/src/Calendar/Calendar.doc.mjs +4 -4
  377. package/src/Calendar/Calendar.test.tsx +112 -0
  378. package/src/Calendar/Calendar.tsx +18 -16
  379. package/src/Calendar/hooks/useCalendarDays.ts +4 -4
  380. package/src/Calendar/hooks/useCalendarNavigation.ts +4 -4
  381. package/src/Calendar/styles.ts +48 -42
  382. package/src/Card/Card.doc.mjs +10 -7
  383. package/src/Card/Card.test.tsx +113 -19
  384. package/src/Card/Card.tsx +67 -89
  385. package/src/Card/index.ts +36 -1
  386. package/src/Carousel/Carousel.doc.mjs +3 -0
  387. package/src/Carousel/Carousel.test.tsx +360 -0
  388. package/src/Carousel/Carousel.tsx +116 -15
  389. package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -1
  390. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  391. package/src/CheckboxInput/CheckboxInput.tsx +5 -0
  392. package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
  393. package/src/CodeBlock/CodeBlock.doc.mjs +10 -4
  394. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  395. package/src/CodeBlock/CodeBlock.tsx +20 -4
  396. package/src/CodeBlock/highlightRanges.ts +1 -1
  397. package/src/CodeBlock/highlightStyles.ts +13 -13
  398. package/src/CommandPalette/CommandPaletteItem.tsx +2 -12
  399. package/src/ComplexSelector/ComplexSelector.doc.mjs +9 -2
  400. package/src/ComplexSelector/ComplexSelector.test.tsx +183 -0
  401. package/src/ComplexSelector/ComplexSelector.tsx +22 -12
  402. package/src/DateInput/DateInput.doc.mjs +17 -1
  403. package/src/DateInput/DateInput.test.tsx +9 -4
  404. package/src/DateInput/DateInput.tsx +54 -3
  405. package/src/DateInput/DateInputTouch.test.tsx +146 -32
  406. package/src/DateInput/MonthScroller.tsx +5 -1
  407. package/src/DateInput/MonthYearWheels.tsx +7 -4
  408. package/src/DateInput/NativeDateField.test.tsx +635 -0
  409. package/src/DateInput/NativeDateField.tsx +641 -0
  410. package/src/DateInput/TouchDateField.tsx +83 -33
  411. package/src/DateInput/Wheel.tsx +1 -0
  412. package/src/DateInput/index.ts +1 -0
  413. package/src/DateInput/nativeDateSegments.ts +127 -0
  414. package/src/DateRangeInput/DateRangeInput.doc.mjs +3 -3
  415. package/src/DateRangeInput/DateRangeInput.test.tsx +46 -0
  416. package/src/DateRangeInput/DateRangeInput.tsx +8 -13
  417. package/src/DateTimeInput/DateTimeInput.doc.mjs +39 -22
  418. package/src/DateTimeInput/DateTimeInput.test.tsx +76 -0
  419. package/src/DateTimeInput/DateTimeInput.tsx +54 -20
  420. package/src/DateTimeInput/DateTimeInputTouch.test.tsx +980 -0
  421. package/src/DateTimeInput/TouchDateTimeField.tsx +1437 -0
  422. package/src/Dialog/Dialog.test.tsx +185 -18
  423. package/src/Dialog/Dialog.tsx +35 -11
  424. package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
  425. package/src/DropdownMenu/DropdownMenu.tsx +4 -13
  426. package/src/Field/Field.doc.mjs +1 -1
  427. package/src/Field/FieldLabel.test.tsx +29 -0
  428. package/src/Field/FieldLabel.tsx +7 -0
  429. package/src/Field/InputClearButton.test.tsx +15 -1
  430. package/src/Field/InputClearButton.tsx +28 -4
  431. package/src/FieldStatus/FieldStatus.doc.mjs +1 -1
  432. package/src/FileInput/FileInput.doc.mjs +1 -1
  433. package/src/Heading/Heading.tsx +0 -1
  434. package/src/HoverCard/HoverCard.doc.mjs +8 -2
  435. package/src/HoverCard/HoverCard.test.tsx +154 -4
  436. package/src/HoverCard/HoverCard.tsx +137 -3
  437. package/src/HoverCard/useHoverCard.tsx +23 -3
  438. package/src/Icon/Icon.test.tsx +55 -1
  439. package/src/Icon/Icon.tsx +5 -3
  440. package/src/Icon/defaultIcons.tsx +11 -2
  441. package/src/Icon/globalIconRegistry.test.tsx +16 -3
  442. package/src/Icon/globalIconRegistry.tsx +37 -6
  443. package/src/Icon/index.ts +1 -0
  444. package/src/Icon/useIcon.ts +9 -2
  445. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  446. package/src/Indicator/Indicator.doc.mjs +3 -1
  447. package/src/InputGroup/InputGroup.doc.mjs +1 -1
  448. package/src/Item/Item.tsx +2 -7
  449. package/src/Kbd/Kbd.test.tsx +0 -17
  450. package/src/Kbd/Kbd.tsx +2 -26
  451. package/src/Layer/gestureCounter.ts +57 -0
  452. package/src/Layer/useLayer.test.tsx +368 -16
  453. package/src/Layer/useLayer.tsx +208 -35
  454. package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
  455. package/src/List/List.test.tsx +38 -0
  456. package/src/List/List.tsx +8 -1
  457. package/src/Markdown/Markdown.test.tsx +37 -0
  458. package/src/Markdown/Markdown.tsx +16 -5
  459. package/src/Markdown/parser.test.ts +33 -0
  460. package/src/Markdown/parser.ts +9 -3
  461. package/src/MetadataList/MetadataList.test.tsx +75 -2
  462. package/src/MetadataList/MetadataListItem.tsx +5 -2
  463. package/src/MultiSelector/MultiSelector.doc.mjs +23 -2
  464. package/src/MultiSelector/MultiSelector.test.tsx +205 -0
  465. package/src/MultiSelector/MultiSelector.tsx +103 -16
  466. package/src/MultiSelector/hooks.ts +9 -2
  467. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  468. package/src/NavIcon/NavIcon.test.tsx +9 -0
  469. package/src/NavIcon/NavIcon.tsx +5 -1
  470. package/src/NavItem/navItemStyles.stylex.ts +0 -8
  471. package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
  472. package/src/NavMenu/NavHeadingMenu.tsx +7 -4
  473. package/src/NumberInput/NumberInput.doc.mjs +27 -8
  474. package/src/NumberInput/NumberInput.test.tsx +563 -8
  475. package/src/NumberInput/NumberInput.tsx +77 -131
  476. package/src/NumberInput/numberInputCommit.test.ts +72 -0
  477. package/src/NumberInput/numberInputCommit.ts +103 -0
  478. package/src/NumberInput/numberParser.docblock.test.ts +234 -0
  479. package/src/NumberInput/numberParser.test.ts +222 -0
  480. package/src/NumberInput/numberParser.ts +403 -0
  481. package/src/Outline/Outline.tsx +2 -4
  482. package/src/OverflowList/OverflowList.doc.mjs +102 -21
  483. package/src/OverflowList/OverflowList.test.tsx +550 -4
  484. package/src/OverflowList/OverflowList.tsx +100 -2
  485. package/src/Pagination/Pagination.test.tsx +3 -2
  486. package/src/Popover/Popover.doc.mjs +2 -2
  487. package/src/Popover/Popover.test.tsx +38 -0
  488. package/src/Popover/Popover.tsx +28 -66
  489. package/src/Popover/usePopover.tsx +44 -5
  490. package/src/PowerSearch/PowerSearch.doc.mjs +1 -1
  491. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +87 -0
  492. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +64 -0
  493. package/src/PowerSearch/PowerSearchValueEditor.tsx +109 -10
  494. package/src/PowerSearch/formatFilterValue.test.ts +16 -1
  495. package/src/PowerSearch/formatFilterValue.ts +2 -0
  496. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  497. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  498. package/src/ProgressBar/ProgressBar.tsx +28 -8
  499. package/src/RadioList/RadioList.doc.mjs +1 -1
  500. package/src/Resizable/Resizable.doc.mjs +2 -2
  501. package/src/Resizable/useResizable.doc.mjs +21 -2
  502. package/src/Resizable/useResizable.test.ts +421 -0
  503. package/src/Resizable/useResizable.ts +133 -48
  504. package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
  505. package/src/SelectableCard/SelectableCard.tsx +16 -0
  506. package/src/Selector/Selector.doc.mjs +15 -1
  507. package/src/Selector/Selector.source-build.test.mjs +65 -0
  508. package/src/Selector/Selector.test.tsx +301 -0
  509. package/src/Selector/Selector.tsx +145 -32
  510. package/src/Selector/hooks.ts +17 -2
  511. package/src/SideNav/SideNav.doc.mjs +2 -2
  512. package/src/SideNav/SideNav.test.tsx +1069 -6
  513. package/src/SideNav/SideNav.tsx +109 -38
  514. package/src/SideNav/SideNavHeading.tsx +5 -2
  515. package/src/SideNav/SideNavItem.doc.mjs +24 -3
  516. package/src/SideNav/SideNavItem.tsx +134 -44
  517. package/src/Slider/Slider.doc.mjs +2 -2
  518. package/src/Slider/Slider.test.tsx +106 -1
  519. package/src/Slider/Slider.tsx +52 -1
  520. package/src/Spinner/Spinner.doc.mjs +17 -5
  521. package/src/Spinner/Spinner.test.tsx +164 -0
  522. package/src/Spinner/Spinner.tsx +252 -22
  523. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  524. package/src/StatusDot/StatusDot.test.tsx +9 -0
  525. package/src/StatusDot/StatusDot.tsx +7 -1
  526. package/src/Stepper/Step.doc.mjs +1 -1
  527. package/src/Stepper/Step.tsx +7 -14
  528. package/src/Switch/Switch.doc.mjs +3 -1
  529. package/src/Switch/Switch.test.tsx +10 -0
  530. package/src/Switch/Switch.tsx +3 -0
  531. package/src/Table/BaseTable.tsx +6 -1
  532. package/src/Table/Table.doc.mjs +5 -3
  533. package/src/Table/Table.tsx +3 -8
  534. package/src/Table/TableBody.doc.mjs +2 -2
  535. package/src/Table/TableFooter.doc.mjs +1 -1
  536. package/src/Table/TableHeader.doc.mjs +1 -1
  537. package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
  538. package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
  539. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +50 -4
  540. package/src/Table/plugins/selection/useTableSelection.test.tsx +62 -0
  541. package/src/Table/plugins/selection/useTableSelection.tsx +25 -2
  542. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  543. package/src/Table/useTableGroupedRows.doc.mjs +3 -3
  544. package/src/Table/useTablePagination.doc.mjs +1 -1
  545. package/src/Table/useTableSelection.doc.mjs +1 -1
  546. package/src/Text/Text.test.tsx +44 -0
  547. package/src/Text/Text.tsx +0 -1
  548. package/src/TextArea/TextArea.doc.mjs +13 -3
  549. package/src/TextArea/TextArea.test.tsx +11 -0
  550. package/src/TextArea/TextArea.tsx +34 -22
  551. package/src/TextInput/TextInput.doc.mjs +1 -1
  552. package/src/TimeInput/TimeInput.doc.mjs +1 -1
  553. package/src/Timestamp/Timestamp.test.tsx +89 -0
  554. package/src/Timestamp/Timestamp.tsx +8 -8
  555. package/src/Timestamp/formatInstant.ts +5 -0
  556. package/src/Toast/Toast.doc.mjs +213 -44
  557. package/src/Toast/Toast.tsx +118 -23
  558. package/src/Toast/ToastViewport.test.tsx +1434 -8
  559. package/src/Toast/ToastViewport.tsx +85 -14
  560. package/src/Toast/index.ts +2 -0
  561. package/src/Toast/types.ts +43 -5
  562. package/src/Toast/useToastGesture.ts +361 -0
  563. package/src/Token/Token.test.tsx +95 -0
  564. package/src/Token/Token.tsx +19 -17
  565. package/src/Token/TokenLink.tsx +12 -3
  566. package/src/Tokenizer/Tokenizer.doc.mjs +17 -4
  567. package/src/Tokenizer/Tokenizer.test.tsx +161 -0
  568. package/src/Tokenizer/Tokenizer.tsx +49 -24
  569. package/src/TopNav/TopNavHeading.tsx +2 -2
  570. package/src/TopNav/TopNavItem.tsx +3 -7
  571. package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
  572. package/src/TopNav/TopNavMegaMenu.tsx +47 -4
  573. package/src/TopNav/TopNavMegaMenuItem.tsx +10 -9
  574. package/src/TopNav/TopNavMenu.test.tsx +133 -1
  575. package/src/TopNav/TopNavMenu.tsx +38 -5
  576. package/src/TreeList/TreeList.test.tsx +49 -0
  577. package/src/TreeList/TreeList.tsx +7 -2
  578. package/src/TreeList/TreeListItem.tsx +2 -7
  579. package/src/Typeahead/BaseTypeahead.doc.mjs +13 -0
  580. package/src/Typeahead/BaseTypeahead.tsx +96 -6
  581. package/src/Typeahead/Typeahead.doc.mjs +7 -1
  582. package/src/Typeahead/Typeahead.test.tsx +154 -0
  583. package/src/Typeahead/Typeahead.tsx +9 -0
  584. package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
  585. package/src/Typeahead/TypeaheadItem.tsx +8 -1
  586. package/src/hooks/useAnnounce.doc.mjs +96 -0
  587. package/src/hooks/useDevWarning.doc.mjs +96 -0
  588. package/src/hooks/useHotkeys.test.ts +0 -18
  589. package/src/hooks/useHotkeys.ts +3 -25
  590. package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
  591. package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
  592. package/src/hooks/useInteractiveRole.doc.mjs +119 -0
  593. package/src/hooks/useLongPress.doc.mjs +123 -0
  594. package/src/hooks/useOverflow.doc.mjs +58 -17
  595. package/src/hooks/useOverflow.ts +16 -4
  596. package/src/hooks/useTypeahead.doc.mjs +153 -0
  597. package/src/i18n/InternationalizationContext.ts +3 -0
  598. package/src/i18n/InternationalizationProvider.tsx +8 -1
  599. package/src/i18n/__tests__/resolve.test.ts +23 -1
  600. package/src/i18n/resolve.ts +46 -49
  601. package/src/i18n/useTranslator.ts +2 -7
  602. package/src/index.ts +2 -0
  603. package/src/raw-import.d.ts +14 -0
  604. package/src/theme/Theme.test.tsx +104 -2
  605. package/src/theme/Theme.tsx +49 -14
  606. package/src/theme/defineTheme.test.ts +23 -0
  607. package/src/theme/defineTheme.ts +12 -3
  608. package/src/theme/derivedVarRegistry.test.ts +87 -3
  609. package/src/theme/derivedVarRegistry.ts +23 -4
  610. package/src/theme/generateThemeRules.test.ts +99 -1
  611. package/src/theme/generateThemeRules.ts +28 -0
  612. package/src/theme/syntax/tokens.ts +5 -2
  613. package/src/theme/useTheme.test.tsx +10 -0
  614. package/src/theme/useTheme.ts +16 -10
  615. package/src/utils/dateParser.test.ts +34 -2
  616. package/src/utils/dateParser.ts +11 -14
  617. package/src/utils/focusOutline.stylex.ts +50 -0
  618. package/src/utils/interactionOverlay.stylex.ts +74 -0
  619. package/src/utils/isApplePlatform.test.ts +61 -0
  620. package/src/utils/isApplePlatform.ts +37 -0
  621. package/src/utils/plainDate.test.ts +46 -0
  622. package/src/utils/plainDate.ts +18 -3
@@ -2,6 +2,18 @@
2
2
 
3
3
  'use client';
4
4
 
5
+ /**
6
+ * @file ToastViewport.tsx
7
+ * @input Uses React state/effects, ToastContext, useAnnounce, viewport tokens,
8
+ * and placement-derived motion variables
9
+ * @output Exports the ToastViewport provider, stack, live announcement dispatch,
10
+ * focus handoff, safe-area-aware edge gutters, and motion context
11
+ * @position Core provider/imperative viewport for useToast()
12
+ *
13
+ * SYNC: When placement, stacking, focus, announcement, or safe-area behavior
14
+ * changes, update ToastViewport.test.tsx, Toast.doc.mjs, and Toast.stories.tsx.
15
+ */
16
+
5
17
  import {
6
18
  isValidElement,
7
19
  useCallback,
@@ -17,18 +29,35 @@ import {spacingVars, durationVars, easeVars} from '../theme/tokens.stylex';
17
29
  import {mergeProps} from '../utils';
18
30
  import {INTERACTIVE_SELECTORS} from '../hooks/useClickableContainer';
19
31
  import {useAnnounce} from '../hooks/useAnnounce';
20
- import {Toast} from './Toast';
32
+ import {ToastSurface} from './Toast';
21
33
  import {ToastContext, type ToastContextValue} from './ToastContext';
22
34
  import type {ToastEntry, ToastPosition, ToastDismissReason} from './types';
23
35
  import {useTranslator} from '../i18n';
24
36
 
37
+ const SAFE_AREA_INLINE_START = `max(${spacingVars['--spacing-4']}, env(safe-area-inset-left, 0px))`;
38
+ const SAFE_AREA_INLINE_END = `max(${spacingVars['--spacing-4']}, env(safe-area-inset-right, 0px))`;
39
+ const SAFE_AREA_BLOCK_START = `max(${spacingVars['--spacing-4']}, env(safe-area-inset-top, 0px))`;
40
+ const SAFE_AREA_BLOCK_END = `max(${spacingVars['--spacing-4']}, env(safe-area-inset-bottom, 0px))`;
41
+ const TOAST_EDGE_DRIFT = spacingVars['--spacing-2'];
42
+ const TOAST_EDGE_DRIFT_NEGATIVE = `calc(-1 * ${TOAST_EDGE_DRIFT})`;
43
+
25
44
  const styles = stylex.create({
26
45
  viewport: {
27
46
  position: 'fixed',
28
47
  zIndex: 500,
29
48
  display: 'flex',
49
+ boxSizing: 'border-box',
30
50
  flexDirection: 'column',
31
- padding: spacingVars['--spacing-4'],
51
+ paddingBlockStart: SAFE_AREA_BLOCK_START,
52
+ paddingBlockEnd: SAFE_AREA_BLOCK_END,
53
+ paddingInlineStart: {
54
+ default: SAFE_AREA_INLINE_START,
55
+ ':is([dir="rtl"] *)': SAFE_AREA_INLINE_END,
56
+ },
57
+ paddingInlineEnd: {
58
+ default: SAFE_AREA_INLINE_END,
59
+ ':is([dir="rtl"] *)': SAFE_AREA_INLINE_START,
60
+ },
32
61
  pointerEvents: 'none',
33
62
  // Reset popover styles — the popover attribute puts us in the top
34
63
  // layer (above dialogs), but we don't want its default styles.
@@ -40,25 +69,29 @@ const styles = stylex.create({
40
69
  backgroundColor: 'transparent',
41
70
  overflow: 'visible',
42
71
  },
43
- bottomEnd: {bottom: 0, insetInlineEnd: 0, alignItems: 'flex-end'},
44
- bottomStart: {bottom: 0, insetInlineStart: 0, alignItems: 'flex-start'},
72
+ viewportInlineSpan: {
73
+ insetInlineStart: 0,
74
+ insetInlineEnd: 0,
75
+ },
76
+ bottomEnd: {bottom: 0, alignItems: 'flex-end'},
77
+ bottomStart: {bottom: 0, alignItems: 'flex-start'},
45
78
  topEnd: {
46
79
  top: 0,
47
- insetInlineEnd: 0,
48
80
  alignItems: 'flex-end',
49
81
  flexDirection: 'column-reverse',
50
82
  },
51
83
  topStart: {
52
84
  top: 0,
53
- insetInlineStart: 0,
54
85
  alignItems: 'flex-start',
55
86
  flexDirection: 'column-reverse',
56
87
  },
57
88
  toastWrapper: {
58
89
  pointerEvents: 'auto',
59
90
  display: 'grid',
91
+ width: '100%',
92
+ maxWidth: 400,
93
+ minWidth: 0,
60
94
  gridTemplateRows: '1fr',
61
- paddingBlockEnd: spacingVars['--spacing-3'],
62
95
  transitionProperty: 'grid-template-rows, padding',
63
96
  transitionDuration: {
64
97
  default: durationVars['--duration-fast'],
@@ -70,11 +103,33 @@ const styles = stylex.create({
70
103
  paddingBlockEnd: 0,
71
104
  },
72
105
  },
106
+ toastWrapperFromBottom: {
107
+ '--_toast-slide-y': TOAST_EDGE_DRIFT,
108
+ },
109
+ toastWrapperFromTop: {
110
+ '--_toast-slide-y': TOAST_EDGE_DRIFT_NEGATIVE,
111
+ },
112
+ // The inter-toast gap is padding on each wrapper so it collapses with the
113
+ // grid track. The wrapper nearest the viewport edge drops that padding; the
114
+ // child flips because top stacks use column-reverse.
115
+ toastWrapperGap: {
116
+ paddingBlockEnd: {default: spacingVars['--spacing-2'], ':last-child': 0},
117
+ },
118
+ toastWrapperGapReversed: {
119
+ paddingBlockEnd: {default: spacingVars['--spacing-2'], ':first-child': 0},
120
+ },
73
121
  toastWrapperExiting: {
74
122
  gridTemplateRows: '0fr',
75
123
  paddingBlockEnd: 0,
76
124
  },
77
125
  toastWrapperInner: {
126
+ width: '100%',
127
+ maxWidth: '100%',
128
+ minWidth: 0,
129
+ minHeight: 0,
130
+ // Required for the 1fr -> 0fr exit collapse to hide the shrinking Toast.
131
+ // This preserves main's paint containment; browser-chrome behavior is not
132
+ // changed or claimed by this responsive-layout fix.
78
133
  overflow: 'hidden',
79
134
  },
80
135
  });
@@ -104,6 +159,7 @@ function getNodeText(node: ReactNode): string {
104
159
 
105
160
  export interface ToastViewportProps {
106
161
  position?: ToastPosition;
162
+ /** Maximum number of visible toasts. @default 5 */
107
163
  maxVisible?: number;
108
164
  inset?: {top?: number; bottom?: number; start?: number; end?: number};
109
165
  /**
@@ -341,6 +397,7 @@ export function ToastViewport({
341
397
  );
342
398
 
343
399
  const visibleToasts = toasts.slice(-maxVisible);
400
+
344
401
  const insetStyle: React.CSSProperties = {};
345
402
  if (inset?.top) {
346
403
  insetStyle.top = inset.top;
@@ -417,21 +474,31 @@ export function ToastViewport({
417
474
  : position === 'bottomStart'
418
475
  ? styles.bottomStart
419
476
  : styles.bottomEnd;
477
+ const isReversed = position === 'topEnd' || position === 'topStart';
478
+ const toastWrapperPositionStyle = isReversed
479
+ ? styles.toastWrapperFromTop
480
+ : styles.toastWrapperFromBottom;
481
+ const gapStyle = isReversed
482
+ ? styles.toastWrapperGapReversed
483
+ : styles.toastWrapperGap;
420
484
 
421
485
  return (
422
486
  <ToastContext value={contextValue}>
423
487
  {children}
424
488
  <div
425
489
  ref={viewportRef}
426
- role="region"
427
- aria-label={t('@astryx.toast.viewport')}
428
- tabIndex={-1}
490
+ role={hasToasts ? 'region' : undefined}
491
+ aria-label={hasToasts ? t('@astryx.toast.viewport') : undefined}
492
+ tabIndex={hasToasts ? -1 : undefined}
429
493
  // popover="manual" promotes to the top layer (above dialogs).
430
494
  // Omitted inside dialogs where the viewport is already in a top layer.
431
495
  popover={isTopLayer ? 'manual' : undefined}
432
- {...mergeProps(stylex.props(styles.viewport, posStyle), {
433
- style: Object.keys(insetStyle).length > 0 ? insetStyle : undefined,
434
- })}>
496
+ {...mergeProps(
497
+ stylex.props(styles.viewport, styles.viewportInlineSpan, posStyle),
498
+ {
499
+ style: Object.keys(insetStyle).length > 0 ? insetStyle : undefined,
500
+ },
501
+ )}>
435
502
  {visibleToasts.map(entry => {
436
503
  const o = entry.options;
437
504
  const type = o.type ?? 'info';
@@ -444,6 +511,8 @@ export function ToastViewport({
444
511
  data-toast-id={entry.id}
445
512
  {...stylex.props(
446
513
  styles.toastWrapper,
514
+ toastWrapperPositionStyle,
515
+ gapStyle,
447
516
  isExiting && styles.toastWrapperExiting,
448
517
  )}
449
518
  onTransitionEnd={
@@ -456,14 +525,16 @@ export function ToastViewport({
456
525
  : undefined
457
526
  }>
458
527
  <div {...stylex.props(styles.toastWrapperInner)}>
459
- <Toast
528
+ <ToastSurface
460
529
  type={type}
461
530
  body={o.body}
462
531
  endContent={o.endContent}
463
532
  isAutoHide={isAutoHide}
464
533
  autoHideDuration={dur}
465
534
  isExiting={isExiting}
535
+ gestureDirection={isReversed ? -1 : 1}
466
536
  onDismiss={reason => removeToast(entry.id, reason)}
537
+ renderContent={o.renderContent}
467
538
  />
468
539
  </div>
469
540
  </div>
@@ -12,6 +12,8 @@ export type {
12
12
  ToastOptions,
13
13
  ToastDismissFn,
14
14
  ShowToastFn,
15
+ ToastContentRenderProps,
16
+ ToastContentRenderFn,
15
17
  } from './types';
16
18
 
17
19
  // Exported for LayerProvider integration
@@ -6,11 +6,7 @@ import type {ReactNode} from 'react';
6
6
  export type ToastType = 'info' | 'error';
7
7
 
8
8
  /** Position for the toast stack relative to the viewport. */
9
- export type ToastPosition =
10
- | 'topEnd'
11
- | 'topStart'
12
- | 'bottomEnd'
13
- | 'bottomStart';
9
+ export type ToastPosition = 'topEnd' | 'topStart' | 'bottomEnd' | 'bottomStart';
14
10
 
15
11
  /** Behavior when a toast with the same uniqueID already exists. */
16
12
  export type ToastCollisionBehavior = 'overwrite' | 'ignore';
@@ -39,6 +35,21 @@ export interface ToastOptions {
39
35
  autoHideDuration?: number;
40
36
  /** Content rendered at the end of the toast (trailing slot). */
41
37
  endContent?: ReactNode;
38
+ /**
39
+ * Replaces the content of this toast's card with your own layout.
40
+ *
41
+ * Astryx keeps the card, live-region role and auto-hide behavior, then hands
42
+ * the renderer this toast's content, resolved settings and `dismiss`
43
+ * callback. The renderer owns every control inside its layout; call
44
+ * `dismiss` from the control that should close the toast. Astryx does not
45
+ * inject a fallback control into custom content.
46
+ *
47
+ * Per-toast rather than app-wide on purpose. An app that wants every one of
48
+ * its toasts to share a layout wraps `useToast()` once and passes this on
49
+ * every call; a toast raised by library code that knows nothing about that
50
+ * wrapper then renders as an ordinary Astryx toast.
51
+ */
52
+ renderContent?: ToastContentRenderFn;
42
53
 
43
54
  /** Unique identifier for deduplication. */
44
55
  uniqueID?: string;
@@ -54,6 +65,33 @@ export interface ToastOptions {
54
65
  /** Function to programmatically dismiss a toast. */
55
66
  export type ToastDismissFn = () => void;
56
67
 
68
+ /** Values passed to a custom toast content renderer. */
69
+ export interface ToastContentRenderProps {
70
+ /** Primary message content, as passed to `showToast`. */
71
+ body: ReactNode;
72
+ /** Trailing content, as passed to `showToast`. Place it in your layout. */
73
+ endContent?: ReactNode;
74
+ /** Resolved toast type — `'error'` also makes the live region assertive. */
75
+ type: ToastType;
76
+ /** Whether this toast will dismiss itself. */
77
+ isAutoHide: boolean;
78
+ /** Milliseconds until auto-dismiss, when `isAutoHide`. */
79
+ autoHideDuration: number;
80
+ /**
81
+ * Dismisses this toast with reason `'manual'`. Pass it through any nested
82
+ * components that need to close the toast.
83
+ */
84
+ dismiss: ToastDismissFn;
85
+ }
86
+
87
+ /**
88
+ * Renders the content of one toast inside Astryx's card — see
89
+ * `ToastOptions.renderContent`.
90
+ */
91
+ export type ToastContentRenderFn = (
92
+ toast: ToastContentRenderProps,
93
+ ) => ReactNode;
94
+
57
95
  /** Function returned by useToast to show toasts. */
58
96
  export type ShowToastFn = (options: ToastOptions) => ToastDismissFn;
59
97
 
@@ -0,0 +1,361 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file useToastGesture.ts
7
+ * @input Uses a resolved Toast edge direction, timer pause/resume hooks,
8
+ * dismissal callback, enabled state, and interactive-descendant policy
9
+ * @output Returns the Toast card root ref and touch/pen gesture bindings
10
+ * @position Internal Toast gesture unit; attached to the Toast card root
11
+ */
12
+
13
+ import {useCallback, useEffect, useRef} from 'react';
14
+ import type {PointerEvent as ReactPointerEvent, RefObject} from 'react';
15
+
16
+ const DRAG_PROMOTION_SLOP = 8;
17
+ const SWIPE_DISMISS_RATIO = 0.4;
18
+ const FLICK_MIN_DISTANCE = 48;
19
+ const FLICK_VELOCITY = 1.2;
20
+ const VERTICAL_INTENT_RATIO = 1.2;
21
+ const SWIPE_EXIT_DISTANCE = '120%';
22
+ const SWIPE_ACTIVE_FADE_MAX = 0.4;
23
+ const SWIPE_ACTIVE_SCALE_MAX = 0.02;
24
+
25
+ export type ToastGestureDirection = 1 | -1;
26
+
27
+ interface GesturePoint {
28
+ pointerId: number;
29
+ clientX: number;
30
+ clientY: number;
31
+ }
32
+
33
+ interface GestureState {
34
+ pointerId: number;
35
+ startX: number;
36
+ startY: number;
37
+ startTime: number;
38
+ direction: ToastGestureDirection;
39
+ intent: 'pending' | 'vertical' | 'opposite';
40
+ pausedTimer: boolean;
41
+ surfaceSize: number;
42
+ dismissThreshold: number;
43
+ }
44
+
45
+ interface UseToastGestureOptions {
46
+ direction: ToastGestureDirection;
47
+ enabled: boolean;
48
+ canPauseTimer: boolean;
49
+ isTimerPaused: () => boolean;
50
+ pauseTimer: () => void;
51
+ resumeTimer: () => void;
52
+ dismiss: () => void;
53
+ shouldIgnoreTarget: (
54
+ target: EventTarget | null,
55
+ root: HTMLElement,
56
+ ) => boolean;
57
+ }
58
+
59
+ interface ToastGestureBindings {
60
+ onPointerDown: (event: ReactPointerEvent<HTMLDivElement>) => void;
61
+ onPointerMove: (event: ReactPointerEvent<HTMLDivElement>) => void;
62
+ onPointerUp: (event: ReactPointerEvent<HTMLDivElement>) => void;
63
+ onPointerCancel: (event: ReactPointerEvent<HTMLDivElement>) => void;
64
+ onLostPointerCapture: (event: ReactPointerEvent<HTMLDivElement>) => void;
65
+ }
66
+
67
+ interface UseToastGestureResult {
68
+ rootRef: RefObject<HTMLDivElement | null>;
69
+ bindings: ToastGestureBindings;
70
+ }
71
+
72
+ function swipeProgressValue(travel: number, surfaceSize: number): number {
73
+ return Math.min(Math.max(travel / surfaceSize, 0), 1);
74
+ }
75
+
76
+ function clearTransientStyles(root: HTMLElement): void {
77
+ root.style.removeProperty('transition-duration');
78
+ root.style.removeProperty('--_toast-swipe-y');
79
+ root.style.removeProperty('--_toast-swipe-exit-y');
80
+ root.style.removeProperty('--_toast-swipe-opacity');
81
+ root.style.removeProperty('--_toast-swipe-scale');
82
+ }
83
+
84
+ export function useToastGesture({
85
+ direction,
86
+ enabled,
87
+ canPauseTimer,
88
+ isTimerPaused,
89
+ pauseTimer,
90
+ resumeTimer,
91
+ dismiss,
92
+ shouldIgnoreTarget,
93
+ }: UseToastGestureOptions): UseToastGestureResult {
94
+ const rootRef = useRef<HTMLDivElement>(null);
95
+ const gestureRef = useRef<GestureState | null>(null);
96
+
97
+ const resetGesture = useCallback(
98
+ (shouldResume: boolean) => {
99
+ const root = rootRef.current;
100
+ const state = gestureRef.current;
101
+ gestureRef.current = null;
102
+ if (root) {
103
+ clearTransientStyles(root);
104
+ }
105
+ if (shouldResume && state?.pausedTimer) {
106
+ resumeTimer();
107
+ }
108
+ },
109
+ [resumeTimer],
110
+ );
111
+
112
+ const beginGesture = useCallback(
113
+ (point: GesturePoint, target: EventTarget | null): boolean => {
114
+ const root = rootRef.current;
115
+ if (
116
+ !root ||
117
+ !enabled ||
118
+ gestureRef.current != null ||
119
+ shouldIgnoreTarget(target, root)
120
+ ) {
121
+ return false;
122
+ }
123
+ const pausedTimer = canPauseTimer && !isTimerPaused();
124
+ if (pausedTimer) {
125
+ pauseTimer();
126
+ }
127
+ const surfaceSize = Math.max(root.getBoundingClientRect().height, 1);
128
+ gestureRef.current = {
129
+ pointerId: point.pointerId,
130
+ startX: point.clientX,
131
+ startY: point.clientY,
132
+ startTime: Date.now(),
133
+ direction,
134
+ intent: 'pending',
135
+ pausedTimer,
136
+ surfaceSize,
137
+ dismissThreshold: Math.max(
138
+ surfaceSize * SWIPE_DISMISS_RATIO,
139
+ FLICK_MIN_DISTANCE,
140
+ ),
141
+ };
142
+ return true;
143
+ },
144
+ [
145
+ canPauseTimer,
146
+ direction,
147
+ enabled,
148
+ isTimerPaused,
149
+ pauseTimer,
150
+ shouldIgnoreTarget,
151
+ ],
152
+ );
153
+
154
+ const moveGesture = useCallback(
155
+ (
156
+ point: GesturePoint,
157
+ preventDefault: () => void,
158
+ releaseCapture?: () => void,
159
+ ) => {
160
+ const state = gestureRef.current;
161
+ const root = rootRef.current;
162
+ if (!state || !root || point.pointerId !== state.pointerId) {
163
+ return;
164
+ }
165
+ const deltaX = point.clientX - state.startX;
166
+ const deltaY = point.clientY - state.startY;
167
+ const absX = Math.abs(deltaX);
168
+ const absY = Math.abs(deltaY);
169
+ if (state.intent === 'pending') {
170
+ if (absX > DRAG_PROMOTION_SLOP && absX > absY) {
171
+ releaseCapture?.();
172
+ resetGesture(true);
173
+ return;
174
+ }
175
+ if (
176
+ absY <= DRAG_PROMOTION_SLOP ||
177
+ absY <= absX * VERTICAL_INTENT_RATIO
178
+ ) {
179
+ return;
180
+ }
181
+ state.intent = deltaY * state.direction > 0 ? 'vertical' : 'opposite';
182
+ if (state.intent === 'opposite') {
183
+ releaseCapture?.();
184
+ resetGesture(true);
185
+ return;
186
+ }
187
+ root.style.setProperty('transition-duration', '0s');
188
+ }
189
+ preventDefault();
190
+ const travel = Math.max(0, deltaY * state.direction);
191
+ const progress = swipeProgressValue(travel, state.surfaceSize);
192
+ root.style.setProperty(
193
+ '--_toast-swipe-y',
194
+ `${travel * state.direction}px`,
195
+ );
196
+ root.style.setProperty(
197
+ '--_toast-swipe-opacity',
198
+ (1 - progress * SWIPE_ACTIVE_FADE_MAX).toFixed(3),
199
+ );
200
+ root.style.setProperty(
201
+ '--_toast-swipe-scale',
202
+ (1 - progress * SWIPE_ACTIVE_SCALE_MAX).toFixed(3),
203
+ );
204
+ },
205
+ [resetGesture],
206
+ );
207
+
208
+ const endGesture = useCallback(
209
+ (point: GesturePoint) => {
210
+ const state = gestureRef.current;
211
+ const root = rootRef.current;
212
+ if (!state || !root || point.pointerId !== state.pointerId) {
213
+ return;
214
+ }
215
+ const travel = Math.max(
216
+ 0,
217
+ (point.clientY - state.startY) * state.direction,
218
+ );
219
+ const elapsed = Math.max(1, Date.now() - state.startTime);
220
+ const isDismissed =
221
+ state.intent === 'vertical' &&
222
+ (travel >= state.dismissThreshold ||
223
+ (travel >= FLICK_MIN_DISTANCE && travel / elapsed > FLICK_VELOCITY));
224
+
225
+ gestureRef.current = null;
226
+ root.style.removeProperty('transition-duration');
227
+ if (isDismissed) {
228
+ root.style.setProperty(
229
+ '--_toast-swipe-exit-y',
230
+ state.direction === 1
231
+ ? SWIPE_EXIT_DISTANCE
232
+ : `calc(-1 * ${SWIPE_EXIT_DISTANCE})`,
233
+ );
234
+ dismiss();
235
+ return;
236
+ }
237
+ clearTransientStyles(root);
238
+ if (state.pausedTimer) {
239
+ resumeTimer();
240
+ }
241
+ },
242
+ [dismiss, resumeTimer],
243
+ );
244
+
245
+ const handlePointerDown = useCallback(
246
+ (event: ReactPointerEvent<HTMLDivElement>) => {
247
+ if (
248
+ event.pointerType === 'pen' &&
249
+ (event.button == null || event.button === 0) &&
250
+ beginGesture(event, event.target)
251
+ ) {
252
+ rootRef.current?.setPointerCapture?.(event.pointerId);
253
+ }
254
+ },
255
+ [beginGesture],
256
+ );
257
+
258
+ const handlePointerMove = useCallback(
259
+ (event: ReactPointerEvent<HTMLDivElement>) => {
260
+ if (event.pointerType !== 'pen') {
261
+ return;
262
+ }
263
+ moveGesture(
264
+ event,
265
+ () => event.preventDefault(),
266
+ () => rootRef.current?.releasePointerCapture?.(event.pointerId),
267
+ );
268
+ },
269
+ [moveGesture],
270
+ );
271
+
272
+ const handlePointerUp = useCallback(
273
+ (event: ReactPointerEvent<HTMLDivElement>) => {
274
+ if (event.pointerType !== 'pen') {
275
+ return;
276
+ }
277
+ rootRef.current?.releasePointerCapture?.(event.pointerId);
278
+ endGesture(event);
279
+ },
280
+ [endGesture],
281
+ );
282
+
283
+ const handlePointerCancel = useCallback(
284
+ (event: ReactPointerEvent<HTMLDivElement>) => {
285
+ if (
286
+ event.pointerType === 'pen' &&
287
+ gestureRef.current?.pointerId === event.pointerId
288
+ ) {
289
+ resetGesture(true);
290
+ }
291
+ },
292
+ [resetGesture],
293
+ );
294
+
295
+ useEffect(() => {
296
+ const root = rootRef.current;
297
+ if (!root || !enabled) {
298
+ return;
299
+ }
300
+ const point = (touch: Touch): GesturePoint => ({
301
+ pointerId: touch.identifier,
302
+ clientX: touch.clientX,
303
+ clientY: touch.clientY,
304
+ });
305
+ const changedTouch = (event: TouchEvent) => {
306
+ const pointerId = gestureRef.current?.pointerId;
307
+ return pointerId == null
308
+ ? undefined
309
+ : [...event.changedTouches].find(
310
+ touch => touch.identifier === pointerId,
311
+ );
312
+ };
313
+ const handleTouchStart = (event: TouchEvent) => {
314
+ const touch = event.touches.length === 1 ? event.changedTouches[0] : null;
315
+ if (touch) {
316
+ beginGesture(point(touch), event.target);
317
+ }
318
+ };
319
+ const handleTouchMove = (event: TouchEvent) => {
320
+ const touch = changedTouch(event);
321
+ if (touch) {
322
+ moveGesture(point(touch), () => {
323
+ if (event.cancelable) {
324
+ event.preventDefault();
325
+ }
326
+ });
327
+ }
328
+ };
329
+ const handleTouchEnd = (event: TouchEvent) => {
330
+ const touch = changedTouch(event);
331
+ if (touch) {
332
+ endGesture(point(touch));
333
+ } else if (event.touches.length === 0) {
334
+ resetGesture(true);
335
+ }
336
+ };
337
+ const handleTouchCancel = () => resetGesture(true);
338
+
339
+ root.addEventListener('touchstart', handleTouchStart, {passive: true});
340
+ root.addEventListener('touchmove', handleTouchMove, {passive: false});
341
+ root.addEventListener('touchend', handleTouchEnd, {passive: true});
342
+ root.addEventListener('touchcancel', handleTouchCancel, {passive: true});
343
+ return () => {
344
+ root.removeEventListener('touchstart', handleTouchStart);
345
+ root.removeEventListener('touchmove', handleTouchMove);
346
+ root.removeEventListener('touchend', handleTouchEnd);
347
+ root.removeEventListener('touchcancel', handleTouchCancel);
348
+ };
349
+ }, [beginGesture, enabled, endGesture, moveGesture, resetGesture]);
350
+
351
+ return {
352
+ rootRef,
353
+ bindings: {
354
+ onPointerDown: handlePointerDown,
355
+ onPointerMove: handlePointerMove,
356
+ onPointerUp: handlePointerUp,
357
+ onPointerCancel: handlePointerCancel,
358
+ onLostPointerCapture: handlePointerCancel,
359
+ },
360
+ };
361
+ }