@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
@@ -556,12 +556,18 @@ export function TextArea({
556
556
  onClick={handleWrapperClick}
557
557
  onMouseUp={handleWrapperMouseUp}
558
558
  {...mergeProps(
559
- themeProps('textarea', {
560
- size,
561
- status: status?.type ?? null,
562
- disabled: isDisabled ? 'disabled' : null,
563
- readonly: isReadOnly ? 'readonly' : null,
564
- }),
559
+ themeProps(
560
+ 'text-area',
561
+ {
562
+ size,
563
+ status: status?.type ?? null,
564
+ disabled: isDisabled ? 'disabled' : null,
565
+ readonly: isReadOnly ? 'readonly' : null,
566
+ },
567
+ // `textarea` ran the compound name together; themes styling it
568
+ // keep working until the next major.
569
+ {legacyNames: ['textarea']},
570
+ ),
565
571
  stylex.props(
566
572
  inputWrapperStyles.base,
567
573
  styles.wrapper,
@@ -609,19 +615,22 @@ export function TextArea({
609
615
  : undefined
610
616
  }
611
617
  aria-busy={isBusy || undefined}
612
- {...stylex.props(
613
- styles.textarea,
614
- textareaSizeStyles[size],
615
- isDisabled && styles.textareaDisabled,
616
- Boolean(startIcon) && styles.textareaWithStartIcon,
617
- // Reserve trailing space only when the end slot actually renders
618
- // something (spinner or on-field status icon). The `detached`
619
- // status variant suppresses the on-field icon — its glyph lives in
620
- // the message box below — so reserving here would inset the text
621
- // for an icon that never appears.
622
- (isBusy || statusIcon != null) && styles.textareaWithStatus,
623
- isBusy && statusIcon != null && styles.textareaWithBusyStatus,
624
- maxLength != null && styles.textareaWithCounter,
618
+ {...mergeProps(
619
+ themeProps('text-area-control'),
620
+ stylex.props(
621
+ styles.textarea,
622
+ textareaSizeStyles[size],
623
+ isDisabled && styles.textareaDisabled,
624
+ Boolean(startIcon) && styles.textareaWithStartIcon,
625
+ // Reserve trailing space only when the end slot actually renders
626
+ // something (spinner or on-field status icon). The `detached`
627
+ // status variant suppresses the on-field icon — its glyph lives
628
+ // in the message box below — so reserving here would inset the
629
+ // text for an icon that never appears.
630
+ (isBusy || statusIcon != null) && styles.textareaWithStatus,
631
+ isBusy && statusIcon != null && styles.textareaWithBusyStatus,
632
+ maxLength != null && styles.textareaWithCounter,
633
+ ),
625
634
  )}
626
635
  />
627
636
  {(isBusy || statusIcon) && (
@@ -633,9 +642,12 @@ export function TextArea({
633
642
  {maxLength != null && (
634
643
  <div
635
644
  id={counterID}
636
- {...stylex.props(
637
- styles.counter,
638
- valueLength > maxLength && styles.counterError,
645
+ {...mergeProps(
646
+ themeProps('text-area-counter'),
647
+ stylex.props(
648
+ styles.counter,
649
+ valueLength > maxLength && styles.counterError,
650
+ ),
639
651
  )}>
640
652
  {valueLength > maxLength && (
641
653
  // Non-color cue so the over-limit state isn't conveyed by the red
@@ -5,7 +5,7 @@
5
5
  export const docs = {
6
6
  name: 'TextInput',
7
7
  displayName: 'Text Input',
8
- category: 'Data Input',
8
+ category: 'Form Controls',
9
9
  keywords: ["textinput","textfield","input","search","clearable","prefix","suffix","adornment","validation"],
10
10
  props: [
11
11
  {
@@ -5,7 +5,7 @@
5
5
  export const docs = {
6
6
  name: 'TimeInput',
7
7
  displayName: 'Time Input',
8
- category: 'Data Input',
8
+ category: 'Form Controls',
9
9
  keywords: [
10
10
  'timeinput',
11
11
  'timepicker',
@@ -12,6 +12,7 @@ import {
12
12
  import {render, screen, act, waitFor, fireEvent} from '@testing-library/react';
13
13
  import userEvent from '@testing-library/user-event';
14
14
  import {Timestamp} from './Timestamp';
15
+ import {formatInstant} from './formatInstant';
15
16
  import {formatTooltipLines} from './tooltipEntries';
16
17
  import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
17
18
  import {InternationalizationProvider} from '../i18n';
@@ -277,6 +278,36 @@ describe('Timestamp', () => {
277
278
  expect(screen.getByTestId('ts')).toHaveTextContent('25. Januar 2026');
278
279
  });
279
280
 
281
+ it.each(['full', 'date', 'date_long', 'date_weekday', 'date_time'] as const)(
282
+ 'keeps Gregorian years for the %s format under a non-Gregorian locale',
283
+ format => {
284
+ const value = formatInstant(
285
+ new Date('2026-08-22T12:00:00Z'),
286
+ format,
287
+ 'th-TH',
288
+ {timeZone: 'UTC'},
289
+ );
290
+ expect(value).toContain('2026');
291
+ expect(value).not.toContain('2569');
292
+ },
293
+ );
294
+
295
+ it('keeps Gregorian years in Timestamp output under a non-Gregorian locale', () => {
296
+ render(
297
+ <InternationalizationProvider locale="th-TH">
298
+ <Timestamp
299
+ value="2026-08-22T12:00:00Z"
300
+ format="date_long"
301
+ hasTooltip={false}
302
+ data-testid="ts"
303
+ />
304
+ </InternationalizationProvider>,
305
+ );
306
+
307
+ expect(screen.getByTestId('ts')).toHaveTextContent('2026');
308
+ expect(screen.getByTestId('ts')).not.toHaveTextContent('2569');
309
+ });
310
+
280
311
  it('renders date format', () => {
281
312
  render(
282
313
  <Timestamp value="2026-02-19T17:00:00Z" format="date" data-testid="ts" />,
@@ -673,6 +704,24 @@ describe('Timestamp', () => {
673
704
  expect(screen.getByTestId('ts')).toHaveAttribute('tabindex', '0');
674
705
  });
675
706
 
707
+ it('does not put aria-expanded on the role-less hover-card trigger', async () => {
708
+ render(
709
+ <Timestamp
710
+ value={Date.now() / 1000 - 3600}
711
+ format="relative"
712
+ data-testid="ts"
713
+ />,
714
+ );
715
+ const trigger = screen.getByTestId('ts').parentElement;
716
+ // The trigger is Text's <span>, which has no role, so aria-expanded is
717
+ // invalid on it (axe aria-allowed-attr, critical). aria-haspopup is
718
+ // global and still advertises the dialog.
719
+ await waitFor(() => {
720
+ expect(trigger).toHaveAttribute('aria-haspopup', 'dialog');
721
+ });
722
+ expect(trigger).not.toHaveAttribute('aria-expanded');
723
+ });
724
+
676
725
  it('shows the hover card when the timestamp receives keyboard focus', async () => {
677
726
  const user = userEvent.setup();
678
727
  render(
@@ -1305,3 +1354,43 @@ describe('Timestamp', () => {
1305
1354
  });
1306
1355
  });
1307
1356
  });
1357
+
1358
+ describe('Timestamp pass-through props', () => {
1359
+ it('forwards pass-through props to the time element', () => {
1360
+ render(
1361
+ <Timestamp
1362
+ value="2024-01-15T10:30:00Z"
1363
+ format="date_time"
1364
+ aria-label="Published"
1365
+ id="published-at"
1366
+ data-source="cms"
1367
+ data-testid="stamp"
1368
+ />,
1369
+ );
1370
+ const time = screen.getByTestId('stamp');
1371
+ expect(time.tagName).toBe('TIME');
1372
+ expect(time).toHaveAttribute('aria-label', 'Published');
1373
+ expect(time).toHaveAttribute('id', 'published-at');
1374
+ expect(time).toHaveAttribute('data-source', 'cms');
1375
+ });
1376
+
1377
+ it('keeps its own spelled-out label on a relative timestamp', () => {
1378
+ render(
1379
+ <Timestamp
1380
+ value={Date.now()}
1381
+ format="relative"
1382
+ aria-label="Caller label"
1383
+ data-source="cms"
1384
+ data-testid="stamp"
1385
+ />,
1386
+ );
1387
+ const stamp = screen.getByTestId('stamp');
1388
+ expect({
1389
+ ariaLabel: stamp.getAttribute('aria-label'),
1390
+ dataSource: stamp.getAttribute('data-source'),
1391
+ }).toEqual({
1392
+ ariaLabel: expect.not.stringMatching(/^Caller label$/),
1393
+ dataSource: 'cms',
1394
+ });
1395
+ });
1396
+ });
@@ -419,6 +419,7 @@ export function Timestamp({
419
419
  style,
420
420
  ref,
421
421
  'data-testid': testId,
422
+ ...rest
422
423
  }: TimestampProps) {
423
424
  const t = useTranslator();
424
425
  const locale = useLocale();
@@ -530,15 +531,16 @@ export function Timestamp({
530
531
  <time
531
532
  ref={mergedTimeRef}
532
533
  dateTime={isoString}
534
+ data-testid={testId}
535
+ {...stylex.props(styles.time)}
536
+ {...rest}
533
537
  // `ariaLabelText` is '' only for an invalid date, which bails out
534
538
  // before rendering — but keep the guard local: an empty aria-label
535
539
  // must be omitted entirely (not rendered as aria-label="") so AT
536
540
  // falls back to reading the visible <time> content.
537
- aria-label={
538
- isRelativeFormat(effectiveFormat) && ariaLabelText !== ''
539
- ? ariaLabelText
540
- : undefined
541
- }
541
+ {...(isRelativeFormat(effectiveFormat) && ariaLabelText !== ''
542
+ ? {'aria-label': ariaLabelText}
543
+ : {})}
542
544
  // The hover card is anchored here with focusTrigger="always", which
543
545
  // attaches focus listeners but does not itself make the anchor
544
546
  // focusable. A bare <time> is not focusable, so without a tab stop
@@ -547,9 +549,7 @@ export function Timestamp({
547
549
  // gratuitous tab stops otherwise. The card carries its own
548
550
  // dashed-underline hover indication as the affordance, so the anchor
549
551
  // needs no separate focus outline.
550
- tabIndex={showTooltip ? 0 : undefined}
551
- data-testid={testId}
552
- {...stylex.props(styles.time)}>
552
+ {...(showTooltip ? {tabIndex: 0} : {})}>
553
553
  {displayText}
554
554
  </time>
555
555
  </Text>
@@ -182,24 +182,28 @@ export function formatInstant(
182
182
  ...FULL_OPTIONS,
183
183
  timeZoneName: timeZoneNameStyle,
184
184
  ...zone,
185
+ calendar: 'gregory',
185
186
  }).format(date);
186
187
 
187
188
  case 'date':
188
189
  return new Intl.DateTimeFormat(locale, {
189
190
  ...SHARED_DATE_FORMAT_OPTIONS.date,
190
191
  ...zone,
192
+ calendar: 'gregory',
191
193
  }).format(date);
192
194
 
193
195
  case 'date_long':
194
196
  return new Intl.DateTimeFormat(locale, {
195
197
  ...SHARED_DATE_FORMAT_OPTIONS.date_long,
196
198
  ...zone,
199
+ calendar: 'gregory',
197
200
  }).format(date);
198
201
 
199
202
  case 'date_weekday':
200
203
  return new Intl.DateTimeFormat(locale, {
201
204
  ...SHARED_DATE_FORMAT_OPTIONS.date_weekday,
202
205
  ...zone,
206
+ calendar: 'gregory',
203
207
  }).format(date);
204
208
 
205
209
  case 'date_time':
@@ -207,6 +211,7 @@ export function formatInstant(
207
211
  ...DATE_TIME_OPTIONS,
208
212
  ...zoneName,
209
213
  ...zone,
214
+ calendar: 'gregory',
210
215
  }).format(date);
211
216
 
212
217
  case 'time':
@@ -8,7 +8,15 @@ export const docs = {
8
8
  group: 'Toast',
9
9
  category: 'Overlay',
10
10
  hiddenComponents: ['ToastViewport'],
11
- keywords: ["toast","notification","snackbar","alert","message","feedback","status"],
11
+ keywords: [
12
+ 'toast',
13
+ 'notification',
14
+ 'snackbar',
15
+ 'alert',
16
+ 'message',
17
+ 'feedback',
18
+ 'status',
19
+ ],
12
20
 
13
21
  props: [
14
22
  {
@@ -16,29 +24,35 @@ export const docs = {
16
24
  type: 'ReactNode',
17
25
  description: 'Primary message content.',
18
26
  required: true,
19
- slotElements: [{__element: 'Text', props: {type: 'body'}, children: 'Toast message'}],
27
+ slotElements: [
28
+ {__element: 'Text', props: {type: 'body'}, children: 'Toast message'},
29
+ ],
20
30
  },
21
31
  {
22
32
  name: 'type',
23
33
  type: "'info' | 'error'",
24
- description: 'Toast type controlling background color. Error toasts persist until dismissed.',
34
+ description:
35
+ 'Toast type controlling background color. Error toasts persist until dismissed.',
25
36
  default: "'info'",
26
37
  },
27
38
  {
28
39
  name: 'isAutoHide',
29
40
  type: 'boolean',
30
- description: 'Whether the toast auto-dismisses. Defaults to true for info, false for error.',
41
+ description:
42
+ 'Whether the toast auto-dismisses. Defaults to true for info, false for error.',
31
43
  },
32
44
  {
33
45
  name: 'autoHideDuration',
34
46
  type: 'number',
35
- description: 'Duration in ms before auto-dismiss.',
47
+ description:
48
+ 'Duration in ms before auto-dismiss. Timed content must satisfy WCAG 2.2.1.',
36
49
  default: '5000',
37
50
  },
38
51
  {
39
52
  name: 'endContent',
40
53
  type: 'ReactNode',
41
- description: 'Content rendered at the trailing end (e.g. Undo button, link).',
54
+ description:
55
+ 'Content rendered at the trailing end (e.g. Undo button, link). Keep action labels short.',
42
56
  slotElements: [
43
57
  {__element: 'Icon', props: {icon: 'chevronDown', size: 'sm'}},
44
58
  {__element: 'Badge', props: {label: '3'}},
@@ -52,7 +66,8 @@ export const docs = {
52
66
  {
53
67
  name: 'collisionBehavior',
54
68
  type: "'overwrite' | 'ignore'",
55
- description: 'Behavior when a toast with matching uniqueID already exists.',
69
+ description:
70
+ 'Behavior when a toast with matching uniqueID already exists.',
56
71
  default: "'overwrite'",
57
72
  },
58
73
  {
@@ -66,28 +81,109 @@ export const docs = {
66
81
  description: 'Callback fired when the toast is dismissed.',
67
82
  required: true,
68
83
  },
69
- ], theming: {
70
- targets: [
71
- {className: 'astryx-toast', visualProps: ['type']},
84
+ {
85
+ name: 'renderContent',
86
+ type: '(toast: ToastContentRenderProps) => ReactNode',
87
+ description:
88
+ "Replaces the content of this toast's card with your own layout. Astryx keeps the card, its astryx-toast theme target, the live-region role and auto-hide behavior, then hands the renderer the message, endContent, resolved toast settings and a dismiss callback. The custom renderer owns every control in its layout: compose the control you want and call dismiss from it. Astryx does not inject a fallback close into custom content. Per-toast: an app shares one layout by wrapping useToast and passing it on every call, while a toast raised by library code that never passes it renders as an ordinary Astryx toast. The argument is {body, endContent, type, isAutoHide, autoHideDuration, dismiss}, where type is 'info' | 'error'.",
89
+ },
90
+ ],
91
+ theming: {
92
+ targets: [{className: 'astryx-toast', visualProps: ['type']}],
93
+ vars: [
94
+ {
95
+ name: '--_toast-slide-y',
96
+ description:
97
+ 'Private block-axis offset inherited from ToastViewport for entry and exit motion',
98
+ default: 'var(--spacing-2)',
99
+ private: true,
100
+ },
101
+ {
102
+ name: '--_toast-swipe-y',
103
+ description: 'Private active swipe offset along the block axis',
104
+ default: '0px',
105
+ private: true,
106
+ },
107
+ {
108
+ name: '--_toast-swipe-exit-y',
109
+ description: 'Private completed-swipe exit offset',
110
+ default: 'var(--_toast-swipe-y)',
111
+ private: true,
112
+ },
113
+ {
114
+ name: '--_toast-swipe-opacity',
115
+ description: 'Private opacity feedback during an accepted swipe',
116
+ default: '1',
117
+ private: true,
118
+ },
119
+ {
120
+ name: '--_toast-swipe-scale',
121
+ description: 'Private scale feedback during an accepted swipe',
122
+ default: '1',
123
+ private: true,
124
+ },
72
125
  ],
73
126
  },
74
127
 
75
128
  usage: {
76
129
  description:
77
- 'Toast shows a brief, non-blocking notification to confirm an action or present temporary information. Use it for scenarios where the user needs feedback but not a decision, such as saving, deleting, or changing a status.\n\nFor production use, prefer the `useToast()` hook; it handles positioning, stacking, auto-dismiss, and deduplication via `ToastViewport`. The `Toast` component renders the visual toast element inline and is useful for previews, documentation, and static showcases where the viewport lifecycle is not needed.',
130
+ 'Toast shows a brief, non-blocking notification to confirm an action or present temporary information. Use it for scenarios where the user needs feedback but not a decision, such as saving, deleting, or changing a status.\n\nFor production use, prefer the `useToast()` hook; it handles positioning, stacking, auto-dismiss, and deduplication via `ToastViewport`. Toasts stay within viewport and safe-area gutters, wrap long message content, and enter, exit, or swipe-dismiss toward their configured top or bottom edge. The vertical swipe uses the same spatial model as placement motion: top Toasts leave upward and bottom Toasts leave downward. Swipe waits for dominant edge-directed intent before cancelling native touch movement and reports the existing manual dismissal reason. Pen is supported as direct-contact input; mouse drag is excluded to avoid conflicting with desktop text selection, where the visible close control remains available. Set `isAutoHide: false` explicitly when an action or message must remain available. The `Toast` component renders the visual toast element inline and is useful for previews, documentation, and static showcases where the viewport lifecycle is not needed.',
78
131
  bestPractices: [
79
- {guidance: true, description: 'Keep messages short: only a few words that tell the user what happened, like "Changes saved" or "Message sent".'},
80
- {guidance: true, description: 'Add an undo action in the endContent slot for reversible operations like deleting an item, so the user can recover without navigating away.'},
81
- {guidance: true, description: 'Use uniqueID to deduplicate toasts that fire from repeated actions, like clicking a save button multiple times.'},
82
- {guidance: true, description: 'Use error type for failures that need attention but not immediate action; it persists until dismissed so the user won\'t miss it.'},
83
- {guidance: false, description: 'Don\'t use a toast for critical errors that block the user. Use Banner for persistent, in-context messaging that requires acknowledgment.'},
84
- {guidance: false, description: 'Don\'t put long or multi-line content in a toast; it disappears after 5 seconds and the user may not finish reading.'},
85
- {guidance: false, description: 'Don\'t show form validation errors as toasts. Use inline field validation so the user can see exactly which field needs fixing.'},
132
+ {
133
+ guidance: true,
134
+ description:
135
+ 'Keep messages short: only a few words that tell the user what happened, like "Changes saved" or "Message sent".',
136
+ },
137
+ {
138
+ guidance: true,
139
+ description:
140
+ 'Add a short undo action in the endContent slot for reversible operations. Set isAutoHide to false when the action must remain available.',
141
+ },
142
+ {
143
+ guidance: true,
144
+ description:
145
+ 'Use uniqueID to deduplicate toasts that fire from repeated actions, like clicking a save button multiple times.',
146
+ },
147
+ {
148
+ guidance: true,
149
+ description:
150
+ "Use error type for failures that need attention but not immediate action; it persists until dismissed so the user won't miss it.",
151
+ },
152
+ {
153
+ guidance: false,
154
+ description:
155
+ "Don't use a toast for critical errors that block the user. Use Banner for persistent, in-context messaging that requires acknowledgment.",
156
+ },
157
+ {
158
+ guidance: false,
159
+ description:
160
+ "Don't put long or multi-line content in a toast; it disappears after 5 seconds and the user may not finish reading.",
161
+ },
162
+ {
163
+ guidance: false,
164
+ description:
165
+ "Don't show form validation errors as toasts. Use inline field validation so the user can see exactly which field needs fixing.",
166
+ },
86
167
  ],
87
168
  anatomy: [
88
- {name: 'Body', required: true, description: 'The primary message text describing what happened or what the user should know.'},
89
- {name: 'End content', required: false, description: 'A trailing action like an Undo button or a link, placed after the body text.'},
90
- {name: 'Dismiss button', required: true, description: 'A close button that lets the user manually dismiss the toast before auto-hide.'},
169
+ {
170
+ name: 'Body',
171
+ required: true,
172
+ description:
173
+ 'The primary message text describing what happened or what the user should know.',
174
+ },
175
+ {
176
+ name: 'End content',
177
+ required: false,
178
+ description:
179
+ 'A trailing action like an Undo button or a link, placed after the body text.',
180
+ },
181
+ {
182
+ name: 'Dismiss button',
183
+ required: true,
184
+ description:
185
+ 'A close button that lets the user manually dismiss the toast before auto-hide.',
186
+ },
91
187
  ],
92
188
  },
93
189
  };
@@ -104,28 +200,71 @@ export const docsZh = {
104
200
  body: '主要消息内容。',
105
201
  type: 'Toast 类型,控制背景颜色。error toast 持续显示直到关闭。',
106
202
  isAutoHide: '是否自动关闭。info 默认为 true,error 默认为 false。',
107
- autoHideDuration: '自动关闭前的持续时间(毫秒)。',
108
- endContent: '尾部渲染的内容(如撤销按钮、链接)。',
203
+ autoHideDuration:
204
+ '自动关闭前的持续时间(毫秒)。定时内容必须符合 WCAG 2.2.1。',
205
+ endContent: '尾部渲染的内容(如撤销按钮、链接)。操作标签应保持简短。',
109
206
  uniqueID: '用于去重的唯一标识符。',
110
207
  collisionBehavior: '当已存在相同 uniqueID 的 toast 时的行为。',
111
208
  onHide: '当 toast 被移除时触发的回调。',
209
+ renderContent:
210
+ "用你自己的布局替换该 toast 卡片内部的内容。Astryx 保留卡片本身、astryx-toast 主题目标、实时区域角色和自动关闭行为,并把消息、endContent、解析后的 toast 设置和 dismiss 回调交给渲染函数。自定义渲染函数完全拥有布局中的控件:请组合所需的控件并通过它调用 dismiss。Astryx 不会向自定义内容注入后备关闭按钮。按 toast 单独设置:应用可通过封装 useToast 并在每次调用时传入来共享同一套布局;而由库代码发起、从不传入该参数的 toast 会渲染为普通的 Astryx toast。传入参数为 {body, endContent, type, isAutoHide, autoHideDuration, dismiss},其中 type 为 'info' | 'error'。",
112
211
  },
113
212
  usage: {
114
213
  description:
115
- 'Toast 显示简短的非阻塞通知,用于确认操作或呈现临时信息。适用于用户需要反馈但不需要做决定的场景,如保存、删除或状态变更。\n\n生产环境中推荐使用 `useToast()` hook,它通过 `ToastViewport` 处理定位、堆叠、自动关闭和去重。`Toast` 组件以内联方式渲染 toast 视觉元素,适用于预览、文档和静态展示。',
214
+ 'Toast 显示简短的非阻塞通知,用于确认操作或呈现临时信息。适用于用户需要反馈但不需要做决定的场景,如保存、删除或状态变更。\n\n生产环境中推荐使用 `useToast()` hook,它通过 `ToastViewport` 处理定位、堆叠、自动关闭和去重。Toast 会保持在视口和安全区域边距内,较长的消息会换行,并根据配置的顶部或底部边缘进入、退出或滑动关闭。垂直滑动与位置动效使用同一空间模型:顶部 Toast 向上离开,底部 Toast 向下离开。只有在动作明确朝向关闭边缘时才会接管原生触摸移动,滑动关闭继续报告现有的 manual 原因。触控笔属于直接接触输入,因此支持相同手势;鼠标拖动会与桌面文本选择冲突,所以不启用,关闭按钮始终可用。当操作或消息必须持续可用时,请显式设置 `isAutoHide: false`。`Toast` 组件以内联方式渲染 toast 视觉元素,适用于不需要视口生命周期的预览、文档和静态展示。',
116
215
  bestPractices: [
117
- {guidance: true, description: '保持消息简短,只需几个词告诉用户发生了什么,如"更改已保存"或"消息已发送"。'},
118
- {guidance: true, description: '在 endContent 插槽中添加撤销操作,用于可逆操作如删除项目,让用户无需导航即可恢复。'},
119
- {guidance: true, description: '使用 uniqueID 去重重复操作触发的 toast,如多次点击保存按钮。'},
120
- {guidance: true, description: '对需要关注但不需要立即操作的错误使用 error 类型,它会持续显示直到关闭。'},
121
- {guidance: false, description: '不要对阻塞用户的严重错误使用 toast,使用 Banner 进行持久的上下文消息传递。'},
122
- {guidance: false, description: '不要在 toast 中放置长内容或多行内容,它会在5秒后消失,用户可能来不及阅读。'},
123
- {guidance: false, description: '不要将表单验证错误显示为 toast,使用内联字段验证让用户看到具体哪个字段需要修复。'},
216
+ {
217
+ guidance: true,
218
+ description:
219
+ '保持消息简短,只需几个词告诉用户发生了什么,如"更改已保存"或"消息已发送"。',
220
+ },
221
+ {
222
+ guidance: true,
223
+ description:
224
+ '在 endContent 插槽中添加简短的撤销操作,用于可逆操作。当操作必须持续可用时,将 isAutoHide 设置为 false。',
225
+ },
226
+ {
227
+ guidance: true,
228
+ description:
229
+ '使用 uniqueID 去重重复操作触发的 toast,如多次点击保存按钮。',
230
+ },
231
+ {
232
+ guidance: true,
233
+ description:
234
+ '对需要关注但不需要立即操作的错误使用 error 类型,它会持续显示直到关闭。',
235
+ },
236
+ {
237
+ guidance: false,
238
+ description:
239
+ '不要对阻塞用户的严重错误使用 toast,使用 Banner 进行持久的上下文消息传递。',
240
+ },
241
+ {
242
+ guidance: false,
243
+ description:
244
+ '不要在 toast 中放置长内容或多行内容,它会在5秒后消失,用户可能来不及阅读。',
245
+ },
246
+ {
247
+ guidance: false,
248
+ description:
249
+ '不要将表单验证错误显示为 toast,使用内联字段验证让用户看到具体哪个字段需要修复。',
250
+ },
124
251
  ],
125
252
  anatomy: [
126
- {name: '正文', required: true, description: '描述发生了什么或用户应该知道什么的主要消息文本。'},
127
- {name: '尾部内容', required: false, description: '正文后的尾随操作,如撤销按钮或链接。'},
128
- {name: '关闭按钮', required: true, description: '让用户在自动隐藏前手动关闭 toast 的关闭按钮。'},
253
+ {
254
+ name: '正文',
255
+ required: true,
256
+ description: '描述发生了什么或用户应该知道什么的主要消息文本。',
257
+ },
258
+ {
259
+ name: '尾部内容',
260
+ required: false,
261
+ description: '正文后的尾随操作,如撤销按钮或链接。',
262
+ },
263
+ {
264
+ name: '关闭按钮',
265
+ required: true,
266
+ description: '让用户在自动隐藏前手动关闭 toast 的关闭按钮。',
267
+ },
129
268
  ],
130
269
  },
131
270
  };
@@ -136,25 +275,55 @@ export const docsDense = {
136
275
  'toast notification w/ auto-dismiss, stacking, dedup, smooth animations; MediaTheme inverted surface',
137
276
  usage: {
138
277
  description:
139
- 'Brief non-blocking notification for action confirmations and temporary info. Use where user needs feedback not decisions: saves, deletes, status changes. useToast() hook for production (positioning, stacking, auto-dismiss, dedup via ToastViewport). Toast renders inline for previews/docs/static showcases.',
278
+ 'Brief non-blocking notification for action confirmations and temporary info. Use where user needs feedback not decisions: saves, deletes, status changes. useToast() hook for production (safe-area positioning, responsive message wrapping, stacking, auto-dismiss, dedup via ToastViewport). Enters, exits, or swipe-dismisses toward configured edge; touch is claimed only after dominant edge-directed intent; swipe reports manual. Pen uses the direct-contact gesture; mouse drag stays off to preserve text selection and the close control remains available. Set isAutoHide false explicitly for must-remain actions/messages. Toast renders inline for previews/docs/static showcases.',
140
279
  bestPractices: [
141
- {guidance: true, description: 'Short messages, a few words: "Changes saved", "Message sent".'},
142
- {guidance: true, description: 'Undo action in endContent for reversible ops like deletes.'},
143
- {guidance: true, description: 'uniqueID to dedup repeated action toasts.'},
144
- {guidance: true, description: 'Error type for failures needing attention; persists until dismissed.'},
145
- {guidance: false, description: 'Don\'t use for critical blocking errors. Use Banner for persistent in-context messaging.'},
146
- {guidance: false, description: 'Don\'t put long/multi-line content; disappears in 5s, user may not finish reading.'},
147
- {guidance: false, description: 'Don\'t show form validation errors. Use inline field validation instead.'},
280
+ {
281
+ guidance: true,
282
+ description:
283
+ 'Short messages, a few words: "Changes saved", "Message sent".',
284
+ },
285
+ {
286
+ guidance: true,
287
+ description:
288
+ 'Short Undo action in endContent for reversible ops; set isAutoHide false when it must remain available.',
289
+ },
290
+ {
291
+ guidance: true,
292
+ description: 'uniqueID to dedup repeated action toasts.',
293
+ },
294
+ {
295
+ guidance: true,
296
+ description:
297
+ 'Error type for failures needing attention; persists until dismissed.',
298
+ },
299
+ {
300
+ guidance: false,
301
+ description:
302
+ "Don't use for critical blocking errors. Use Banner for persistent in-context messaging.",
303
+ },
304
+ {
305
+ guidance: false,
306
+ description:
307
+ "Don't put long/multi-line content; disappears in 5s, user may not finish reading.",
308
+ },
309
+ {
310
+ guidance: false,
311
+ description:
312
+ "Don't show form validation errors. Use inline field validation instead.",
313
+ },
148
314
  ],
149
315
  },
150
316
  propDescriptions: {
151
317
  body: 'primary message content',
152
318
  type: 'toast type; controls bg color; error persists until dismissed',
153
319
  isAutoHide: 'auto-dismiss; true for info, false for error',
154
- autoHideDuration: 'ms before auto-dismiss',
155
- endContent: 'trailing end content (undo btn, link)',
320
+ autoHideDuration:
321
+ 'ms before auto-dismiss; timed content must satisfy WCAG 2.2.1',
322
+ endContent:
323
+ 'trailing end content (undo btn, link); keep action labels short',
156
324
  uniqueID: 'unique id for dedup',
157
325
  collisionBehavior: 'behavior when matching uniqueID exists',
158
326
  onHide: 'callback when toast removed',
327
+ renderContent: 'custom inner layout; receives content, resolved settings + dismiss callback; no injected fallback control',
159
328
  },
160
329
  };