@astryxdesign/core 0.4.7 → 0.5.0-canary.009bcb3

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 (730) hide show
  1. package/CHANGELOG.md +161 -1
  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/AppShell/AppShell.d.ts.map +1 -1
  6. package/dist/AppShell/AppShell.js +3 -2
  7. package/dist/AspectRatio/AspectRatio.d.ts +24 -0
  8. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  9. package/dist/AspectRatio/AspectRatio.js +23 -4
  10. package/dist/Avatar/Avatar.d.ts +25 -1
  11. package/dist/Avatar/Avatar.d.ts.map +1 -1
  12. package/dist/Avatar/Avatar.js +58 -19
  13. package/dist/Avatar/index.d.ts +2 -2
  14. package/dist/Avatar/index.d.ts.map +1 -1
  15. package/dist/Avatar/index.js +1 -1
  16. package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
  17. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  18. package/dist/AvatarGroup/AvatarGroup.js +8 -4
  19. package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
  20. package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
  21. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  22. package/dist/AvatarGroup/AvatarGroupOverflow.js +10 -6
  23. package/dist/Banner/Banner.d.ts +49 -15
  24. package/dist/Banner/Banner.d.ts.map +1 -1
  25. package/dist/Banner/Banner.js +62 -20
  26. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  27. package/dist/BottomSheet/BottomSheet.js +17 -4
  28. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  29. package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
  30. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  31. package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
  32. package/dist/Button/Button.d.ts.map +1 -1
  33. package/dist/Button/Button.js +11 -6
  34. package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
  35. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  36. package/dist/ButtonGroup/ButtonGroup.js +26 -7
  37. package/dist/Calendar/Calendar.d.ts +7 -3
  38. package/dist/Calendar/Calendar.d.ts.map +1 -1
  39. package/dist/Calendar/Calendar.js +21 -23
  40. package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
  41. package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
  42. package/dist/Calendar/getInitialFocusDate.js +62 -0
  43. package/dist/Calendar/styles.d.ts +5 -14
  44. package/dist/Calendar/styles.d.ts.map +1 -1
  45. package/dist/Calendar/styles.js +15 -15
  46. package/dist/Card/Card.d.ts +12 -12
  47. package/dist/Card/Card.d.ts.map +1 -1
  48. package/dist/Card/Card.js +17 -9
  49. package/dist/Card/index.d.ts +35 -1
  50. package/dist/Card/index.d.ts.map +1 -1
  51. package/dist/Card/index.js +21 -1
  52. package/dist/Carousel/Carousel.d.ts.map +1 -1
  53. package/dist/Carousel/Carousel.js +3 -3
  54. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  55. package/dist/Chat/ChatComposerInput.js +2 -3
  56. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  57. package/dist/Chat/ChatLayout.js +3 -3
  58. package/dist/Chat/ChatMessageList.d.ts +22 -3
  59. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  60. package/dist/Chat/ChatMessageList.js +6 -3
  61. package/dist/Chat/ChatTokenizedText.d.ts +2 -0
  62. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  63. package/dist/Chat/ChatTokenizedText.js +11 -6
  64. package/dist/Chat/useChatComposerTokens.js +1 -1
  65. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  66. package/dist/CheckboxInput/CheckboxInput.js +10 -3
  67. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  68. package/dist/ClickableCard/ClickableCard.js +3 -3
  69. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  70. package/dist/CodeBlock/CodeBlock.js +15 -4
  71. package/dist/CodeBlock/highlightRanges.js +1 -1
  72. package/dist/CodeBlock/highlightStyles.js +13 -13
  73. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  74. package/dist/CommandPalette/CommandPaletteInput.js +3 -2
  75. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  76. package/dist/CommandPalette/CommandPaletteItem.js +3 -2
  77. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  78. package/dist/ComplexSelector/ComplexSelector.js +1 -3
  79. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  80. package/dist/ContextMenu/ContextMenu.js +4 -3
  81. package/dist/DateInput/DateInput.d.ts +43 -0
  82. package/dist/DateInput/DateInput.d.ts.map +1 -1
  83. package/dist/DateInput/DateInput.js +22 -2
  84. package/dist/DateInput/NativeDateField.d.ts +10 -0
  85. package/dist/DateInput/NativeDateField.d.ts.map +1 -0
  86. package/dist/DateInput/NativeDateField.js +494 -0
  87. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  88. package/dist/DateInput/TouchDateField.js +82 -23
  89. package/dist/DateInput/index.d.ts +1 -1
  90. package/dist/DateInput/index.d.ts.map +1 -1
  91. package/dist/DateInput/nativeDateSegments.d.ts +22 -0
  92. package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
  93. package/dist/DateInput/nativeDateSegments.js +111 -0
  94. package/dist/DateRangeInput/DateRangeInput.d.ts +4 -2
  95. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  96. package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
  97. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  98. package/dist/DateTimeInput/DateTimeInput.js +406 -12
  99. package/dist/DateTimeInput/index.d.ts +1 -1
  100. package/dist/DateTimeInput/index.d.ts.map +1 -1
  101. package/dist/Dialog/Dialog.d.ts +21 -1
  102. package/dist/Dialog/Dialog.d.ts.map +1 -1
  103. package/dist/Dialog/Dialog.js +110 -58
  104. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  105. package/dist/DropdownMenu/DropdownMenu.js +4 -13
  106. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  107. package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
  108. package/dist/Field/FieldLabel.d.ts.map +1 -1
  109. package/dist/Field/FieldLabel.js +9 -1
  110. package/dist/Field/InputClearButton.d.ts +9 -3
  111. package/dist/Field/InputClearButton.d.ts.map +1 -1
  112. package/dist/Field/InputClearButton.js +14 -3
  113. package/dist/FileInput/FileInput.d.ts.map +1 -1
  114. package/dist/FileInput/FileInput.js +3 -2
  115. package/dist/Heading/Heading.d.ts.map +1 -1
  116. package/dist/Heading/Heading.js +6 -3
  117. package/dist/HoverCard/HoverCard.d.ts +6 -0
  118. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  119. package/dist/HoverCard/HoverCard.js +104 -3
  120. package/dist/HoverCard/useHoverCard.d.ts +19 -2
  121. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  122. package/dist/HoverCard/useHoverCard.js +74 -26
  123. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  124. package/dist/Indicator/CheckboxIndicator.js +6 -2
  125. package/dist/Item/Item.d.ts.map +1 -1
  126. package/dist/Item/Item.js +4 -2
  127. package/dist/Kbd/Kbd.d.ts.map +1 -1
  128. package/dist/Kbd/Kbd.js +2 -19
  129. package/dist/Layer/LayerDepthContext.d.ts +52 -0
  130. package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
  131. package/dist/Layer/LayerDepthContext.js +66 -0
  132. package/dist/Layer/gestureCounter.d.ts +8 -0
  133. package/dist/Layer/gestureCounter.d.ts.map +1 -0
  134. package/dist/Layer/gestureCounter.js +53 -0
  135. package/dist/Layer/index.d.ts +3 -0
  136. package/dist/Layer/index.d.ts.map +1 -1
  137. package/dist/Layer/index.js +4 -0
  138. package/dist/Layer/layerStack.d.ts +98 -0
  139. package/dist/Layer/layerStack.d.ts.map +1 -0
  140. package/dist/Layer/layerStack.js +306 -0
  141. package/dist/Layer/useLayer.d.ts +23 -13
  142. package/dist/Layer/useLayer.d.ts.map +1 -1
  143. package/dist/Layer/useLayer.js +128 -8
  144. package/dist/Layer/useLayerDismissal.d.ts +93 -0
  145. package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
  146. package/dist/Layer/useLayerDismissal.js +91 -0
  147. package/dist/Lightbox/Lightbox.d.ts +1 -0
  148. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  149. package/dist/Lightbox/Lightbox.js +103 -81
  150. package/dist/List/List.d.ts +1 -1
  151. package/dist/List/List.d.ts.map +1 -1
  152. package/dist/List/List.js +15 -4
  153. package/dist/Markdown/Markdown.d.ts +1 -1
  154. package/dist/Markdown/Markdown.d.ts.map +1 -1
  155. package/dist/Markdown/Markdown.js +20 -7
  156. package/dist/Markdown/index.d.ts +1 -1
  157. package/dist/Markdown/index.d.ts.map +1 -1
  158. package/dist/Markdown/parser.d.ts +38 -1
  159. package/dist/Markdown/parser.d.ts.map +1 -1
  160. package/dist/Markdown/parser.js +182 -32
  161. package/dist/MetadataList/MetadataListItem.d.ts +1 -1
  162. package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
  163. package/dist/MetadataList/MetadataListItem.js +4 -1
  164. package/dist/MobileNav/MobileNav.d.ts +6 -1
  165. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  166. package/dist/MobileNav/MobileNav.js +61 -36
  167. package/dist/MultiSelector/MultiSelector.d.ts +32 -1
  168. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  169. package/dist/MultiSelector/MultiSelector.js +73 -15
  170. package/dist/MultiSelector/hooks.d.ts +7 -1
  171. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  172. package/dist/MultiSelector/hooks.js +3 -2
  173. package/dist/MultiSelector/index.d.ts +1 -1
  174. package/dist/MultiSelector/index.d.ts.map +1 -1
  175. package/dist/NavIcon/NavIcon.d.ts.map +1 -1
  176. package/dist/NavIcon/NavIcon.js +5 -1
  177. package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
  178. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  179. package/dist/NavMenu/NavHeadingMenu.js +9 -5
  180. package/dist/NumberInput/NumberInput.d.ts +6 -1
  181. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  182. package/dist/NumberInput/NumberInput.js +54 -104
  183. package/dist/NumberInput/numberInputCommit.d.ts +34 -0
  184. package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
  185. package/dist/NumberInput/numberInputCommit.js +71 -0
  186. package/dist/NumberInput/numberParser.d.ts +64 -0
  187. package/dist/NumberInput/numberParser.d.ts.map +1 -0
  188. package/dist/NumberInput/numberParser.js +350 -0
  189. package/dist/Outline/Outline.d.ts.map +1 -1
  190. package/dist/Outline/Outline.js +3 -2
  191. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  192. package/dist/OverflowList/OverflowList.js +3 -2
  193. package/dist/Overlay/Overlay.d.ts.map +1 -1
  194. package/dist/Overlay/Overlay.js +3 -2
  195. package/dist/Popover/Popover.d.ts.map +1 -1
  196. package/dist/Popover/Popover.js +1 -9
  197. package/dist/Popover/usePopover.d.ts +7 -41
  198. package/dist/Popover/usePopover.d.ts.map +1 -1
  199. package/dist/Popover/usePopover.js +40 -21
  200. package/dist/PowerSearch/PowerSearch.d.ts +8 -2
  201. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  202. package/dist/PowerSearch/PowerSearch.js +19 -6
  203. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
  204. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  205. package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
  206. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
  207. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  208. package/dist/PowerSearch/PowerSearchValueEditor.js +110 -27
  209. package/dist/PowerSearch/types.d.ts +2 -0
  210. package/dist/PowerSearch/types.d.ts.map +1 -1
  211. package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
  212. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  213. package/dist/PowerSearch/usePowerSearchSource.js +14 -5
  214. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  215. package/dist/ProgressBar/ProgressBar.js +18 -5
  216. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  217. package/dist/Resizable/ResizeHandle.js +3 -2
  218. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  219. package/dist/SegmentedControl/SegmentedControl.js +3 -2
  220. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  221. package/dist/SelectableCard/SelectableCard.js +12 -3
  222. package/dist/Selector/Selector.d.ts +18 -1
  223. package/dist/Selector/Selector.d.ts.map +1 -1
  224. package/dist/Selector/Selector.js +91 -18
  225. package/dist/Selector/hooks.d.ts +7 -1
  226. package/dist/Selector/hooks.d.ts.map +1 -1
  227. package/dist/Selector/hooks.js +3 -2
  228. package/dist/SideNav/SideNav.d.ts.map +1 -1
  229. package/dist/SideNav/SideNav.js +4 -3
  230. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  231. package/dist/SideNav/SideNavHeading.js +8 -7
  232. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  233. package/dist/SideNav/SideNavItem.js +4 -3
  234. package/dist/Slider/Slider.d.ts.map +1 -1
  235. package/dist/Slider/Slider.js +37 -5
  236. package/dist/Spinner/Spinner.d.ts +3 -3
  237. package/dist/Spinner/Spinner.d.ts.map +1 -1
  238. package/dist/Spinner/Spinner.js +130 -78
  239. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  240. package/dist/StatusDot/StatusDot.js +6 -1
  241. package/dist/Stepper/Step.d.ts +140 -0
  242. package/dist/Stepper/Step.d.ts.map +1 -0
  243. package/dist/Stepper/Step.js +1045 -0
  244. package/dist/Stepper/StepStatus.d.ts +24 -0
  245. package/dist/Stepper/StepStatus.d.ts.map +1 -0
  246. package/dist/Stepper/StepStatus.js +1 -0
  247. package/dist/Stepper/Stepper.d.ts +93 -0
  248. package/dist/Stepper/Stepper.d.ts.map +1 -0
  249. package/dist/Stepper/Stepper.js +184 -0
  250. package/dist/Stepper/StepperContext.d.ts +41 -0
  251. package/dist/Stepper/StepperContext.d.ts.map +1 -0
  252. package/dist/Stepper/StepperContext.js +34 -0
  253. package/dist/Stepper/index.d.ts +8 -0
  254. package/dist/Stepper/index.d.ts.map +1 -0
  255. package/dist/Stepper/index.js +7 -0
  256. package/dist/Stepper/stepper.stylex.d.ts +15 -0
  257. package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
  258. package/dist/Stepper/stepper.stylex.js +20 -0
  259. package/dist/Switch/Switch.d.ts.map +1 -1
  260. package/dist/Switch/Switch.js +8 -3
  261. package/dist/TabList/Tab.d.ts +15 -2
  262. package/dist/TabList/Tab.d.ts.map +1 -1
  263. package/dist/TabList/Tab.js +32 -7
  264. package/dist/TabList/TabList.d.ts +46 -7
  265. package/dist/TabList/TabList.d.ts.map +1 -1
  266. package/dist/TabList/TabList.js +353 -23
  267. package/dist/TabList/TabListContext.d.ts +11 -1
  268. package/dist/TabList/TabListContext.d.ts.map +1 -1
  269. package/dist/TabList/TabListContext.js +11 -2
  270. package/dist/TabList/TabMenu.d.ts.map +1 -1
  271. package/dist/TabList/TabMenu.js +3 -2
  272. package/dist/TabList/index.d.ts +2 -2
  273. package/dist/TabList/index.d.ts.map +1 -1
  274. package/dist/Table/BaseTable.d.ts.map +1 -1
  275. package/dist/Table/BaseTable.js +10 -2
  276. package/dist/Table/Table.d.ts.map +1 -1
  277. package/dist/Table/Table.js +3 -6
  278. package/dist/Table/TableRow.d.ts +16 -5
  279. package/dist/Table/TableRow.d.ts.map +1 -1
  280. package/dist/Table/TableRow.js +16 -5
  281. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  282. package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
  283. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +26 -0
  284. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  285. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +54 -11
  286. package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
  287. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  288. package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
  289. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  290. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
  291. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
  292. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
  293. package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
  294. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  295. package/dist/Table/plugins/selection/useTableSelection.js +43 -5
  296. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  297. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
  298. package/dist/Table/types.d.ts +22 -4
  299. package/dist/Table/types.d.ts.map +1 -1
  300. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  301. package/dist/Table/useBaseTablePlugins.js +5 -0
  302. package/dist/Text/Text.d.ts.map +1 -1
  303. package/dist/Text/Text.js +6 -3
  304. package/dist/TextArea/TextArea.d.ts.map +1 -1
  305. package/dist/TextArea/TextArea.js +16 -10
  306. package/dist/TextInput/TextInput.d.ts.map +1 -1
  307. package/dist/TextInput/TextInput.js +3 -2
  308. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  309. package/dist/TimeInput/TimeInput.js +3 -2
  310. package/dist/Timestamp/Timestamp.d.ts +1 -1
  311. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  312. package/dist/Timestamp/Timestamp.js +15 -21
  313. package/dist/Toast/Toast.d.ts.map +1 -1
  314. package/dist/Toast/Toast.js +22 -7
  315. package/dist/Toast/ToastViewport.d.ts +1 -0
  316. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  317. package/dist/Toast/ToastViewport.js +71 -18
  318. package/dist/Token/Token.d.ts +1 -1
  319. package/dist/Token/Token.d.ts.map +1 -1
  320. package/dist/Token/Token.js +20 -9
  321. package/dist/Token/TokenLink.d.ts +1 -1
  322. package/dist/Token/TokenLink.d.ts.map +1 -1
  323. package/dist/Token/TokenLink.js +7 -4
  324. package/dist/Tokenizer/Tokenizer.d.ts +14 -1
  325. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  326. package/dist/Tokenizer/Tokenizer.js +33 -21
  327. package/dist/Tooltip/Tooltip.d.ts +5 -0
  328. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  329. package/dist/Tooltip/useTooltip.d.ts +5 -0
  330. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  331. package/dist/Tooltip/useTooltip.js +39 -24
  332. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  333. package/dist/TopNav/TopNavHeading.js +5 -4
  334. package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
  335. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  336. package/dist/TopNav/TopNavMegaMenu.js +31 -11
  337. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  338. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  339. package/dist/TopNav/TopNavMenu.js +22 -7
  340. package/dist/TreeList/TreeList.d.ts +1 -1
  341. package/dist/TreeList/TreeList.d.ts.map +1 -1
  342. package/dist/TreeList/TreeList.js +7 -2
  343. package/dist/Typeahead/BaseTypeahead.d.ts +35 -0
  344. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  345. package/dist/Typeahead/BaseTypeahead.js +119 -37
  346. package/dist/Typeahead/Typeahead.d.ts +8 -1
  347. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  348. package/dist/Typeahead/Typeahead.js +5 -2
  349. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  350. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  351. package/dist/Typeahead/TypeaheadItem.js +7 -2
  352. package/dist/astryx.css +113 -11
  353. package/dist/hooks/index.d.ts +1 -0
  354. package/dist/hooks/index.d.ts.map +1 -1
  355. package/dist/hooks/index.js +1 -0
  356. package/dist/hooks/useFocusTrap.d.ts +7 -4
  357. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  358. package/dist/hooks/useFocusTrap.js +60 -95
  359. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  360. package/dist/hooks/useHotkeys.js +3 -18
  361. package/dist/hooks/useMergedRefs.d.ts +18 -0
  362. package/dist/hooks/useMergedRefs.d.ts.map +1 -0
  363. package/dist/hooks/useMergedRefs.js +25 -0
  364. package/dist/index.d.ts +1 -0
  365. package/dist/index.d.ts.map +1 -1
  366. package/dist/index.js +1 -0
  367. package/dist/theme/Theme.d.ts.map +1 -1
  368. package/dist/theme/Theme.js +46 -10
  369. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  370. package/dist/theme/derivedVarRegistry.js +24 -4
  371. package/dist/theme/generateThemeRules.d.ts +21 -0
  372. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  373. package/dist/theme/generateThemeRules.js +26 -0
  374. package/dist/theme/syntax/tokens.d.ts +1 -1
  375. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  376. package/dist/theme/syntax/tokens.js +5 -2
  377. package/dist/utils/groupItems.d.ts +5 -1
  378. package/dist/utils/groupItems.d.ts.map +1 -1
  379. package/dist/utils/groupItems.js +9 -9
  380. package/dist/utils/index.d.ts +1 -1
  381. package/dist/utils/index.d.ts.map +1 -1
  382. package/dist/utils/isApplePlatform.d.ts +18 -0
  383. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  384. package/dist/utils/isApplePlatform.js +37 -0
  385. package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
  386. package/dist/utils/sharedResizeObserver.js +10 -1
  387. package/dist/utils/timeParser.d.ts +1 -1
  388. package/dist/utils/timeParser.d.ts.map +1 -1
  389. package/dist/utils/timeParser.js +26 -12
  390. package/locales/af-ZA.json +6 -6
  391. package/locales/ar-SA.json +6 -6
  392. package/locales/ca-ES.json +5 -5
  393. package/locales/cs-CZ.json +6 -6
  394. package/locales/da-DK.json +6 -6
  395. package/locales/de-DE.json +6 -6
  396. package/locales/el-GR.json +6 -6
  397. package/locales/en.json +163 -11
  398. package/locales/es-ES.json +5 -5
  399. package/locales/fi-FI.json +6 -6
  400. package/locales/fr-FR.json +6 -6
  401. package/locales/he-IL.json +6 -6
  402. package/locales/hu-HU.json +6 -6
  403. package/locales/it-IT.json +6 -6
  404. package/locales/ja-JP.json +6 -6
  405. package/locales/ko-KR.json +6 -6
  406. package/locales/nl-NL.json +6 -6
  407. package/locales/no-NO.json +6 -6
  408. package/locales/pl-PL.json +6 -6
  409. package/locales/pseudo.json +114 -0
  410. package/locales/pt-BR.json +6 -6
  411. package/locales/pt-PT.json +6 -6
  412. package/locales/ro-RO.json +6 -6
  413. package/locales/ru-RU.json +6 -6
  414. package/locales/sr-SP.json +6 -6
  415. package/locales/sv-SE.json +6 -6
  416. package/locales/tr-TR.json +6 -6
  417. package/locales/uk-UA.json +6 -6
  418. package/locales/vi-VN.json +6 -6
  419. package/locales/zh-CN.json +6 -6
  420. package/locales/zh-TW.json +6 -6
  421. package/package.json +8 -3
  422. package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
  423. package/src/AlertDialog/AlertDialog.test.tsx +211 -2
  424. package/src/AlertDialog/AlertDialog.tsx +62 -20
  425. package/src/AppShell/AppShell.tsx +3 -2
  426. package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
  427. package/src/AspectRatio/AspectRatio.test.tsx +57 -10
  428. package/src/AspectRatio/AspectRatio.tsx +40 -1
  429. package/src/Avatar/Avatar.doc.mjs +14 -3
  430. package/src/Avatar/Avatar.test.tsx +97 -0
  431. package/src/Avatar/Avatar.tsx +125 -52
  432. package/src/Avatar/index.ts +2 -2
  433. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  434. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  435. package/src/AvatarGroup/AvatarGroup.tsx +15 -6
  436. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  437. package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
  438. package/src/Banner/Banner.doc.mjs +22 -11
  439. package/src/Banner/Banner.test.tsx +177 -25
  440. package/src/Banner/Banner.tsx +93 -27
  441. package/src/BottomSheet/BottomSheet.test.tsx +123 -0
  442. package/src/BottomSheet/BottomSheet.tsx +17 -4
  443. package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
  444. package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
  445. package/src/Button/Button.doc.mjs +24 -1
  446. package/src/Button/Button.test.tsx +32 -4
  447. package/src/Button/Button.tsx +12 -5
  448. package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
  449. package/src/ButtonGroup/ButtonGroup.test.tsx +404 -1
  450. package/src/ButtonGroup/ButtonGroup.tsx +23 -5
  451. package/src/Calendar/Calendar.doc.mjs +7 -6
  452. package/src/Calendar/Calendar.test.tsx +143 -0
  453. package/src/Calendar/Calendar.tsx +30 -26
  454. package/src/Calendar/getInitialFocusDate.test.ts +94 -0
  455. package/src/Calendar/getInitialFocusDate.ts +93 -0
  456. package/src/Calendar/styles.ts +49 -31
  457. package/src/Card/Card.doc.mjs +10 -7
  458. package/src/Card/Card.test.tsx +113 -19
  459. package/src/Card/Card.tsx +67 -89
  460. package/src/Card/index.ts +36 -1
  461. package/src/Carousel/Carousel.tsx +3 -2
  462. package/src/Chat/ChatComposerInput.tsx +5 -1
  463. package/src/Chat/ChatLayout.tsx +3 -2
  464. package/src/Chat/ChatMessageList.doc.mjs +9 -1
  465. package/src/Chat/ChatMessageList.test.tsx +46 -0
  466. package/src/Chat/ChatMessageList.tsx +28 -4
  467. package/src/Chat/ChatTokenizedText.tsx +17 -10
  468. package/src/Chat/useChatComposerTokens.ts +1 -1
  469. package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
  470. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  471. package/src/CheckboxInput/CheckboxInput.tsx +8 -2
  472. package/src/ClickableCard/ClickableCard.tsx +3 -2
  473. package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
  474. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  475. package/src/CodeBlock/CodeBlock.tsx +20 -4
  476. package/src/CodeBlock/highlightRanges.ts +1 -1
  477. package/src/CodeBlock/highlightStyles.ts +13 -13
  478. package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
  479. package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
  480. package/src/ComplexSelector/ComplexSelector.test.tsx +32 -0
  481. package/src/ComplexSelector/ComplexSelector.tsx +1 -3
  482. package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
  483. package/src/ContextMenu/ContextMenu.tsx +4 -3
  484. package/src/DateInput/DateInput.doc.mjs +16 -0
  485. package/src/DateInput/DateInput.tsx +55 -2
  486. package/src/DateInput/DateInputTouch.test.tsx +146 -32
  487. package/src/DateInput/NativeDateField.test.tsx +635 -0
  488. package/src/DateInput/NativeDateField.tsx +641 -0
  489. package/src/DateInput/TouchDateField.tsx +108 -24
  490. package/src/DateInput/index.ts +1 -0
  491. package/src/DateInput/nativeDateSegments.ts +127 -0
  492. package/src/DateRangeInput/DateRangeInput.doc.mjs +2 -2
  493. package/src/DateRangeInput/DateRangeInput.test.tsx +22 -0
  494. package/src/DateRangeInput/DateRangeInput.tsx +4 -2
  495. package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
  496. package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
  497. package/src/DateTimeInput/DateTimeInput.tsx +556 -24
  498. package/src/DateTimeInput/index.ts +1 -0
  499. package/src/Dialog/Dialog.doc.mjs +8 -3
  500. package/src/Dialog/Dialog.test.tsx +429 -2
  501. package/src/Dialog/Dialog.tsx +133 -58
  502. package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
  503. package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
  504. package/src/DropdownMenu/DropdownMenu.tsx +4 -13
  505. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
  506. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
  507. package/src/Field/Field.doc.mjs +13 -2
  508. package/src/Field/FieldLabel.test.tsx +29 -0
  509. package/src/Field/FieldLabel.tsx +7 -0
  510. package/src/Field/InputClearButton.test.tsx +15 -1
  511. package/src/Field/InputClearButton.tsx +28 -4
  512. package/src/FileInput/FileInput.tsx +3 -2
  513. package/src/Heading/Heading.test.tsx +23 -1
  514. package/src/Heading/Heading.tsx +6 -3
  515. package/src/HoverCard/HoverCard.doc.mjs +13 -2
  516. package/src/HoverCard/HoverCard.test.tsx +154 -4
  517. package/src/HoverCard/HoverCard.tsx +143 -3
  518. package/src/HoverCard/useHoverCard.tsx +104 -33
  519. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  520. package/src/Indicator/Indicator.doc.mjs +2 -0
  521. package/src/Item/Item.tsx +5 -4
  522. package/src/Kbd/Kbd.tsx +2 -19
  523. package/src/Layer/LayerDepthContext.tsx +62 -0
  524. package/src/Layer/gestureCounter.ts +57 -0
  525. package/src/Layer/index.ts +9 -0
  526. package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
  527. package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
  528. package/src/Layer/layerStack.ts +362 -0
  529. package/src/Layer/useLayer.test.tsx +324 -15
  530. package/src/Layer/useLayer.tsx +164 -8
  531. package/src/Layer/useLayerDismissal.test.tsx +469 -0
  532. package/src/Layer/useLayerDismissal.ts +173 -0
  533. package/src/Layout/Layout.doc.mjs +2 -2
  534. package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
  535. package/src/Lightbox/Lightbox.doc.mjs +12 -0
  536. package/src/Lightbox/Lightbox.tsx +124 -102
  537. package/src/Link/Link.doc.mjs +39 -0
  538. package/src/List/List.test.tsx +38 -0
  539. package/src/List/List.tsx +8 -1
  540. package/src/Markdown/Markdown.doc.mjs +5 -0
  541. package/src/Markdown/Markdown.test.tsx +37 -0
  542. package/src/Markdown/Markdown.tsx +16 -5
  543. package/src/Markdown/incremental.test.ts +16 -2
  544. package/src/Markdown/index.ts +1 -0
  545. package/src/Markdown/parser.perf.test.ts +96 -1
  546. package/src/Markdown/parser.test.ts +178 -2
  547. package/src/Markdown/parser.ts +253 -32
  548. package/src/MetadataList/MetadataList.test.tsx +75 -2
  549. package/src/MetadataList/MetadataListItem.tsx +5 -2
  550. package/src/MobileNav/MobileNav.tsx +62 -36
  551. package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
  552. package/src/MultiSelector/MultiSelector.doc.mjs +49 -1
  553. package/src/MultiSelector/MultiSelector.test.tsx +311 -0
  554. package/src/MultiSelector/MultiSelector.tsx +151 -15
  555. package/src/MultiSelector/hooks.ts +9 -2
  556. package/src/MultiSelector/index.ts +1 -0
  557. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  558. package/src/NavIcon/NavIcon.test.tsx +9 -0
  559. package/src/NavIcon/NavIcon.tsx +5 -1
  560. package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
  561. package/src/NavMenu/NavHeadingMenu.tsx +9 -5
  562. package/src/NumberInput/NumberInput.doc.mjs +31 -7
  563. package/src/NumberInput/NumberInput.test.tsx +436 -8
  564. package/src/NumberInput/NumberInput.tsx +62 -114
  565. package/src/NumberInput/numberInputCommit.test.ts +72 -0
  566. package/src/NumberInput/numberInputCommit.ts +103 -0
  567. package/src/NumberInput/numberParser.docblock.test.ts +234 -0
  568. package/src/NumberInput/numberParser.test.ts +222 -0
  569. package/src/NumberInput/numberParser.ts +403 -0
  570. package/src/Outline/Outline.tsx +3 -2
  571. package/src/OverflowList/OverflowList.tsx +3 -2
  572. package/src/Overlay/Overlay.tsx +3 -2
  573. package/src/Pagination/Pagination.test.tsx +3 -2
  574. package/src/Popover/Popover.test.tsx +14 -0
  575. package/src/Popover/Popover.tsx +1 -9
  576. package/src/Popover/usePopover.tsx +57 -32
  577. package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
  578. package/src/PowerSearch/PowerSearch.test.tsx +240 -1
  579. package/src/PowerSearch/PowerSearch.tsx +34 -5
  580. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +288 -0
  581. package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
  582. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +111 -1
  583. package/src/PowerSearch/PowerSearchValueEditor.tsx +124 -10
  584. package/src/PowerSearch/types.ts +2 -0
  585. package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
  586. package/src/PowerSearch/usePowerSearchSource.ts +13 -3
  587. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  588. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  589. package/src/ProgressBar/ProgressBar.tsx +28 -8
  590. package/src/Resizable/ResizeHandle.tsx +3 -2
  591. package/src/SegmentedControl/SegmentedControl.tsx +3 -2
  592. package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
  593. package/src/SelectableCard/SelectableCard.tsx +19 -2
  594. package/src/Selector/Selector.doc.mjs +26 -1
  595. package/src/Selector/Selector.test.tsx +346 -1
  596. package/src/Selector/Selector.tsx +148 -21
  597. package/src/Selector/hooks.ts +17 -2
  598. package/src/SideNav/SideNav.doc.mjs +6 -6
  599. package/src/SideNav/SideNav.tsx +4 -2
  600. package/src/SideNav/SideNavHeading.tsx +12 -12
  601. package/src/SideNav/SideNavItem.tsx +4 -2
  602. package/src/Slider/Slider.test.tsx +106 -1
  603. package/src/Slider/Slider.tsx +55 -3
  604. package/src/Spinner/Spinner.test.tsx +147 -1
  605. package/src/Spinner/Spinner.tsx +120 -101
  606. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  607. package/src/StatusDot/StatusDot.test.tsx +9 -0
  608. package/src/StatusDot/StatusDot.tsx +7 -1
  609. package/src/Stepper/Step.doc.mjs +98 -0
  610. package/src/Stepper/Step.tsx +1638 -0
  611. package/src/Stepper/StepStatus.ts +26 -0
  612. package/src/Stepper/Stepper.doc.mjs +370 -0
  613. package/src/Stepper/Stepper.test.tsx +1024 -0
  614. package/src/Stepper/Stepper.tsx +258 -0
  615. package/src/Stepper/StepperContext.ts +71 -0
  616. package/src/Stepper/index.ts +18 -0
  617. package/src/Stepper/stepper.stylex.ts +19 -0
  618. package/src/Switch/Switch.doc.mjs +2 -0
  619. package/src/Switch/Switch.test.tsx +10 -0
  620. package/src/Switch/Switch.tsx +6 -2
  621. package/src/TabList/Tab.doc.mjs +13 -1
  622. package/src/TabList/Tab.tsx +67 -7
  623. package/src/TabList/TabList.doc.mjs +22 -6
  624. package/src/TabList/TabList.test.tsx +559 -0
  625. package/src/TabList/TabList.tsx +490 -22
  626. package/src/TabList/TabListContext.ts +13 -2
  627. package/src/TabList/TabMenu.tsx +3 -2
  628. package/src/TabList/index.ts +6 -2
  629. package/src/Table/BaseTable.tsx +12 -4
  630. package/src/Table/Table.doc.mjs +9 -2
  631. package/src/Table/Table.test.tsx +132 -14
  632. package/src/Table/Table.tsx +3 -8
  633. package/src/Table/TableBody.doc.mjs +40 -0
  634. package/src/Table/TableFooter.doc.mjs +40 -0
  635. package/src/Table/TableHeader.doc.mjs +40 -0
  636. package/src/Table/TableRow.tsx +16 -5
  637. package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
  638. package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
  639. package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
  640. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
  641. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +67 -12
  642. package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
  643. package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
  644. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
  645. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
  646. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
  647. package/src/Table/plugins/selection/useTableSelection.test.tsx +138 -0
  648. package/src/Table/plugins/selection/useTableSelection.tsx +63 -7
  649. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  650. package/src/Table/types.ts +22 -4
  651. package/src/Table/useBaseTablePlugins.ts +5 -0
  652. package/src/Table/useTableGroupedRows.doc.mjs +5 -4
  653. package/src/Table/useTablePagination.doc.mjs +7 -0
  654. package/src/Table/useTableRowStatus.doc.mjs +1 -1
  655. package/src/Table/useTableSelection.doc.mjs +31 -0
  656. package/src/Text/Text.test.tsx +67 -1
  657. package/src/Text/Text.tsx +6 -3
  658. package/src/TextArea/TextArea.doc.mjs +12 -2
  659. package/src/TextArea/TextArea.test.tsx +11 -0
  660. package/src/TextArea/TextArea.tsx +37 -24
  661. package/src/TextInput/TextInput.doc.mjs +10 -0
  662. package/src/TextInput/TextInput.tsx +3 -2
  663. package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
  664. package/src/TimeInput/TimeInput.tsx +2 -2
  665. package/src/Timestamp/Timestamp.test.tsx +58 -0
  666. package/src/Timestamp/Timestamp.tsx +12 -10
  667. package/src/Toast/Toast.doc.mjs +26 -12
  668. package/src/Toast/Toast.tsx +28 -4
  669. package/src/Toast/ToastViewport.test.tsx +536 -8
  670. package/src/Toast/ToastViewport.tsx +81 -12
  671. package/src/Token/Token.test.tsx +95 -0
  672. package/src/Token/Token.tsx +15 -10
  673. package/src/Token/TokenLink.tsx +14 -5
  674. package/src/Tokenizer/Tokenizer.doc.mjs +43 -3
  675. package/src/Tokenizer/Tokenizer.test.tsx +161 -0
  676. package/src/Tokenizer/Tokenizer.tsx +53 -24
  677. package/src/Toolbar/Toolbar.doc.mjs +5 -0
  678. package/src/Tooltip/Tooltip.doc.mjs +5 -0
  679. package/src/Tooltip/Tooltip.test.tsx +32 -0
  680. package/src/Tooltip/Tooltip.tsx +5 -0
  681. package/src/Tooltip/useTooltip.tsx +47 -24
  682. package/src/TopNav/TopNavHeading.tsx +5 -4
  683. package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
  684. package/src/TopNav/TopNavMegaMenu.tsx +47 -5
  685. package/src/TopNav/TopNavMenu.test.tsx +133 -1
  686. package/src/TopNav/TopNavMenu.tsx +38 -7
  687. package/src/TreeList/TreeList.test.tsx +49 -0
  688. package/src/TreeList/TreeList.tsx +7 -2
  689. package/src/Typeahead/BaseTypeahead.doc.mjs +24 -0
  690. package/src/Typeahead/BaseTypeahead.tsx +181 -39
  691. package/src/Typeahead/Typeahead.doc.mjs +11 -0
  692. package/src/Typeahead/Typeahead.test.tsx +203 -0
  693. package/src/Typeahead/Typeahead.tsx +12 -2
  694. package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
  695. package/src/Typeahead/TypeaheadItem.tsx +8 -1
  696. package/src/hooks/index.ts +2 -0
  697. package/src/hooks/useAnnounce.doc.mjs +96 -0
  698. package/src/hooks/useContainerReveal.doc.mjs +2 -2
  699. package/src/hooks/useDevWarning.doc.mjs +96 -0
  700. package/src/hooks/useFocusTrap.test.tsx +14 -0
  701. package/src/hooks/useFocusTrap.ts +62 -111
  702. package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
  703. package/src/hooks/useHotkeys.ts +3 -18
  704. package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
  705. package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
  706. package/src/hooks/useInteractiveRole.doc.mjs +119 -0
  707. package/src/hooks/useLongPress.doc.mjs +123 -0
  708. package/src/hooks/useMergedRefs.doc.mjs +79 -0
  709. package/src/hooks/useMergedRefs.test.tsx +62 -0
  710. package/src/hooks/useMergedRefs.ts +36 -0
  711. package/src/hooks/useTypeahead.doc.mjs +153 -0
  712. package/src/index.ts +1 -0
  713. package/src/raw-import.d.ts +14 -0
  714. package/src/theme/MediaTheme.doc.mjs +5 -5
  715. package/src/theme/Theme.test.tsx +104 -2
  716. package/src/theme/Theme.tsx +49 -14
  717. package/src/theme/defineTheme.test.ts +23 -0
  718. package/src/theme/derivedVarRegistry.test.ts +26 -3
  719. package/src/theme/derivedVarRegistry.ts +23 -4
  720. package/src/theme/generateThemeRules.test.ts +99 -1
  721. package/src/theme/generateThemeRules.ts +28 -0
  722. package/src/theme/syntax/tokens.ts +5 -2
  723. package/src/utils/groupItems.ts +12 -6
  724. package/src/utils/index.ts +1 -1
  725. package/src/utils/isApplePlatform.test.ts +61 -0
  726. package/src/utils/isApplePlatform.ts +37 -0
  727. package/src/utils/sharedResizeObserver.ts +10 -2
  728. package/src/utils/timeParser.test.ts +6 -1
  729. package/src/utils/timeParser.ts +35 -13
  730. package/src/__tests__/inputWidthContract.test.tsx +0 -69
package/src/Text/Text.tsx CHANGED
@@ -48,7 +48,8 @@ import {
48
48
  } from './text.stylex';
49
49
  import {useTruncation} from './useTruncation';
50
50
  import type {LayerPlacement} from '../Layer';
51
- import {mergeProps, mergeRefs} from '../utils';
51
+ import {mergeProps} from '../utils';
52
+ import {useMergedRefs} from '../hooks/useMergedRefs';
52
53
  import type {BaseProps} from '../BaseProps';
53
54
  import {themeProps} from '../utils/themeProps';
54
55
 
@@ -271,13 +272,16 @@ export function Text({
271
272
  // Ref for the text element (used as tooltip anchor)
272
273
  const textRef = useRef<HTMLElement>(null);
273
274
 
275
+ // Keep the merged ref stable across rerenders.
276
+ const mergedRef = useMergedRefs(ref, truncation.ref, textRef);
277
+
274
278
  // Build inline style for -webkit-line-clamp (dynamic value)
275
279
  const inlineStyle = maxLines > 1 ? {WebkitLineClamp: maxLines} : undefined;
276
280
 
277
281
  return (
278
282
  <>
279
283
  <Component
280
- ref={mergeRefs(ref, truncation.ref, textRef)}
284
+ ref={mergedRef}
281
285
  {...mergeProps(
282
286
  themeProps('text', {type, size, color: resolvedColor}),
283
287
  stylex.props(
@@ -309,7 +313,6 @@ export function Text({
309
313
  className,
310
314
  {...style, ...inlineStyle},
311
315
  )}
312
- title={tooltipEnabled ? truncation.fullText : undefined}
313
316
  {...props}>
314
317
  {children}
315
318
  </Component>
@@ -186,7 +186,12 @@ export const docs = {
186
186
  ],
187
187
  theming: {
188
188
  targets: [
189
- {className: 'astryx-textarea', visualProps: ['size', 'status'], states: ['disabled', 'readonly']},
189
+ {className: 'astryx-text-area', visualProps: ['size', 'status'], states: ['disabled', 'readonly']},
190
+ {className: 'astryx-text-area-control'},
191
+ {className: 'astryx-text-area-counter'},
192
+ // Still emitted beside the names above, so themes written against
193
+ // them keep working. Drop in the next major.
194
+ {className: 'astryx-textarea', visualProps: ['size', 'status'], states: ['disabled', 'readonly'], deprecatedFor: 'text-area'},
190
195
  ],
191
196
  vars: [
192
197
  {
@@ -381,7 +386,12 @@ export const docsZh = {
381
386
  ],
382
387
  theming: {
383
388
  targets: [
384
- {className: 'astryx-textarea', visualProps: ['size', 'status'], states: ['disabled', 'readonly']},
389
+ {className: 'astryx-text-area', visualProps: ['size', 'status'], states: ['disabled', 'readonly']},
390
+ {className: 'astryx-text-area-control'},
391
+ {className: 'astryx-text-area-counter'},
392
+ // Still emitted beside the names above, so themes written against
393
+ // them keep working. Drop in the next major.
394
+ {className: 'astryx-textarea', visualProps: ['size', 'status'], states: ['disabled', 'readonly'], deprecatedFor: 'text-area'},
385
395
  ],
386
396
  vars: [
387
397
  {
@@ -1155,3 +1155,14 @@ describe('TextArea readonly theme state', () => {
1155
1155
  expect(root).not.toHaveAttribute('data-readonly');
1156
1156
  });
1157
1157
  });
1158
+
1159
+ describe('TextArea theme target names', () => {
1160
+ it('renders the deprecated class beside the current one', () => {
1161
+ const {container} = render(
1162
+ <TextArea label="Notes" value="" onChange={() => {}} />,
1163
+ );
1164
+ const root = container.querySelector('.astryx-text-area');
1165
+ expect(root).not.toBeNull();
1166
+ expect(root).toHaveClass('astryx-textarea');
1167
+ });
1168
+ });
@@ -46,7 +46,7 @@ import {
46
46
  import {Icon, renderIconSlot, type IconType} from '../Icon';
47
47
  import {Spinner} from '../Spinner';
48
48
  import {useTooltip} from '../Tooltip';
49
- import {mergeProps, mergeRefs} from '../utils';
49
+ import {mergeProps} from '../utils';
50
50
  import type {BaseProps} from '../BaseProps';
51
51
  import type {SizeValue} from '../utils/types';
52
52
  import {useInputContainer} from '../hooks/useInputContainer';
@@ -58,6 +58,7 @@ import {themeProps} from '../utils/themeProps';
58
58
  import {characterCount} from '../utils/characters';
59
59
  import {useTranslator} from '../i18n';
60
60
 
61
+ import {useMergedRefs} from '../hooks/useMergedRefs';
61
62
  const COUNTER_WARNING_THRESHOLD = 0.8;
62
63
 
63
64
  const styles = stylex.create({
@@ -555,12 +556,18 @@ export function TextArea({
555
556
  onClick={handleWrapperClick}
556
557
  onMouseUp={handleWrapperMouseUp}
557
558
  {...mergeProps(
558
- themeProps('textarea', {
559
- size,
560
- status: status?.type ?? null,
561
- disabled: isDisabled ? 'disabled' : null,
562
- readonly: isReadOnly ? 'readonly' : null,
563
- }),
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
+ ),
564
571
  stylex.props(
565
572
  inputWrapperStyles.base,
566
573
  styles.wrapper,
@@ -580,7 +587,7 @@ export function TextArea({
580
587
  )}
581
588
  <textarea
582
589
  {...rest}
583
- ref={mergeRefs(ref, textareaRef)}
590
+ ref={useMergedRefs(ref, textareaRef)}
584
591
  id={id}
585
592
  name={isDisabled ? undefined : htmlName}
586
593
  value={optimisticValue}
@@ -608,19 +615,22 @@ export function TextArea({
608
615
  : undefined
609
616
  }
610
617
  aria-busy={isBusy || undefined}
611
- {...stylex.props(
612
- styles.textarea,
613
- textareaSizeStyles[size],
614
- isDisabled && styles.textareaDisabled,
615
- Boolean(startIcon) && styles.textareaWithStartIcon,
616
- // Reserve trailing space only when the end slot actually renders
617
- // something (spinner or on-field status icon). The `detached`
618
- // status variant suppresses the on-field icon — its glyph lives in
619
- // the message box below — so reserving here would inset the text
620
- // for an icon that never appears.
621
- (isBusy || statusIcon != null) && styles.textareaWithStatus,
622
- isBusy && statusIcon != null && styles.textareaWithBusyStatus,
623
- 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
+ ),
624
634
  )}
625
635
  />
626
636
  {(isBusy || statusIcon) && (
@@ -632,9 +642,12 @@ export function TextArea({
632
642
  {maxLength != null && (
633
643
  <div
634
644
  id={counterID}
635
- {...stylex.props(
636
- styles.counter,
637
- valueLength > maxLength && styles.counterError,
645
+ {...mergeProps(
646
+ themeProps('text-area-counter'),
647
+ stylex.props(
648
+ styles.counter,
649
+ valueLength > maxLength && styles.counterError,
650
+ ),
638
651
  )}>
639
652
  {valueLength > maxLength && (
640
653
  // Non-color cue so the over-limit state isn't conveyed by the red
@@ -71,6 +71,16 @@ export const docs = {
71
71
  'Displays a "Required" indicator next to the label and sets aria-required. Mutually exclusive with isOptional.',
72
72
  default: 'false',
73
73
  },
74
+ {
75
+ name: 'onEnter',
76
+ type: '() => void',
77
+ description: 'Callback fired when the user presses the Enter key.',
78
+ },
79
+ {
80
+ name: 'onKeyDown',
81
+ type: '(e: KeyboardEvent<HTMLInputElement>) => void',
82
+ description: 'Callback fired on keydown events on the input.',
83
+ },
74
84
  {
75
85
  name: 'isDisabled',
76
86
  type: 'boolean',
@@ -97,7 +97,7 @@ export type {
97
97
  InputStatus as TextInputStatus,
98
98
  InputStatusType as TextInputStatusType,
99
99
  } from '../Field';
100
- import {mergeProps, mergeRefs} from '../utils';
100
+ import {mergeProps} from '../utils';
101
101
  import {useSize} from '../SizeContext/SizeContext';
102
102
  import {useInputContainer} from '../hooks/useInputContainer';
103
103
  import {useInputStatusIcon} from '../hooks/useInputStatusIcon';
@@ -108,6 +108,7 @@ import type {SizeValue} from '../utils/types';
108
108
  import {themeProps} from '../utils/themeProps';
109
109
  import {useTranslator} from '../i18n';
110
110
 
111
+ import {useMergedRefs} from '../hooks/useMergedRefs';
111
112
  export type TextInputType = 'text' | 'password' | 'email';
112
113
 
113
114
  export interface TextInputProps extends Omit<
@@ -421,7 +422,7 @@ export function TextInput({
421
422
  {inputGroup && <VisuallyHidden id={inputLabelID}>{label}</VisuallyHidden>}
422
423
  <input
423
424
  {...rest}
424
- ref={mergeRefs(ref, inputRef)}
425
+ ref={useMergedRefs(ref, inputRef)}
425
426
  id={id}
426
427
  name={isDisabled ? undefined : htmlName}
427
428
  type={type}
@@ -78,7 +78,7 @@ export const docs = {
78
78
  {className: 'astryx-thumbnail'},
79
79
  ],
80
80
  vars: [
81
- {name: '--_thumbnail-hit-inset', description: 'Outset of the remove button\u2019s invisible hit area, applied to a ::after overlay. 0 on a fine pointer; negative on a coarse one, which grows the 20px button to the 24px touch target without changing what is drawn.', default: '0px', private: true},
81
+ {name: '--_thumbnail-hit-inset', description: 'Outset of the remove button\'s invisible hit area, applied to a ::after overlay. 0 on a fine pointer; negative on a coarse one, which grows the 20px button to the 24px touch target without changing what is drawn.', default: '0px', private: true},
82
82
  ],
83
83
  },
84
84
  usage: {
@@ -58,7 +58,6 @@ import {
58
58
  isImeKeyEvent,
59
59
  isTimeInRange,
60
60
  mergeProps,
61
- mergeRefs,
62
61
  getInputARIA,
63
62
  } from '../utils';
64
63
  import type {BaseProps} from '../BaseProps';
@@ -74,6 +73,7 @@ import {useTooltip} from '../Tooltip';
74
73
  import {themeProps} from '../utils/themeProps';
75
74
  import {useTranslator} from '../i18n';
76
75
 
76
+ import {useMergedRefs} from '../hooks/useMergedRefs';
77
77
  const styles = stylex.create({
78
78
  icon: {
79
79
  display: 'flex',
@@ -648,7 +648,7 @@ export function TimeInput({
648
648
  </VisuallyHidden>
649
649
  )}
650
650
  <input
651
- ref={mergeRefs(ref, inputRef)}
651
+ ref={useMergedRefs(ref, inputRef)}
652
652
  id={id}
653
653
  type="text"
654
654
  value={displayValue}
@@ -673,6 +673,24 @@ describe('Timestamp', () => {
673
673
  expect(screen.getByTestId('ts')).toHaveAttribute('tabindex', '0');
674
674
  });
675
675
 
676
+ it('does not put aria-expanded on the role-less hover-card trigger', async () => {
677
+ render(
678
+ <Timestamp
679
+ value={Date.now() / 1000 - 3600}
680
+ format="relative"
681
+ data-testid="ts"
682
+ />,
683
+ );
684
+ const trigger = screen.getByTestId('ts').parentElement;
685
+ // The trigger is Text's <span>, which has no role, so aria-expanded is
686
+ // invalid on it (axe aria-allowed-attr, critical). aria-haspopup is
687
+ // global and still advertises the dialog.
688
+ await waitFor(() => {
689
+ expect(trigger).toHaveAttribute('aria-haspopup', 'dialog');
690
+ });
691
+ expect(trigger).not.toHaveAttribute('aria-expanded');
692
+ });
693
+
676
694
  it('shows the hover card when the timestamp receives keyboard focus', async () => {
677
695
  const user = userEvent.setup();
678
696
  render(
@@ -1305,3 +1323,43 @@ describe('Timestamp', () => {
1305
1323
  });
1306
1324
  });
1307
1325
  });
1326
+
1327
+ describe('Timestamp pass-through props', () => {
1328
+ it('forwards pass-through props to the time element', () => {
1329
+ render(
1330
+ <Timestamp
1331
+ value="2024-01-15T10:30:00Z"
1332
+ format="date_time"
1333
+ aria-label="Published"
1334
+ id="published-at"
1335
+ data-source="cms"
1336
+ data-testid="stamp"
1337
+ />,
1338
+ );
1339
+ const time = screen.getByTestId('stamp');
1340
+ expect(time.tagName).toBe('TIME');
1341
+ expect(time).toHaveAttribute('aria-label', 'Published');
1342
+ expect(time).toHaveAttribute('id', 'published-at');
1343
+ expect(time).toHaveAttribute('data-source', 'cms');
1344
+ });
1345
+
1346
+ it('keeps its own spelled-out label on a relative timestamp', () => {
1347
+ render(
1348
+ <Timestamp
1349
+ value={Date.now()}
1350
+ format="relative"
1351
+ aria-label="Caller label"
1352
+ data-source="cms"
1353
+ data-testid="stamp"
1354
+ />,
1355
+ );
1356
+ const stamp = screen.getByTestId('stamp');
1357
+ expect({
1358
+ ariaLabel: stamp.getAttribute('aria-label'),
1359
+ dataSource: stamp.getAttribute('data-source'),
1360
+ }).toEqual({
1361
+ ariaLabel: expect.not.stringMatching(/^Caller label$/),
1362
+ dataSource: 'cms',
1363
+ });
1364
+ });
1365
+ });
@@ -20,7 +20,7 @@ import {lazy, Suspense, useEffect, useRef, useState} from 'react';
20
20
  import * as stylex from '@stylexjs/stylex';
21
21
  import {Text} from '../Text';
22
22
  import type {TextType, TextSize, TextColor, TextWeight} from '../theme/types';
23
- import {mergeProps, mergeRefs} from '../utils';
23
+ import {mergeProps} from '../utils';
24
24
  import {useDevWarning} from '../hooks/useDevWarning';
25
25
  import {useTranslator} from '../i18n';
26
26
  import {useLocale} from '../i18n/useLocale';
@@ -33,6 +33,7 @@ import type {
33
33
  TimestampTooltipLine,
34
34
  } from './tooltipEntries';
35
35
 
36
+ import {useMergedRefs} from '../hooks/useMergedRefs';
36
37
  // Load the overlay lazily so a card-less Timestamp — the default — never
37
38
  // bundles HoverCard or the copy affordance's Icon/IconButton. Mirrors the code
38
39
  // split the read-only Tooltip path used before it.
@@ -418,10 +419,12 @@ export function Timestamp({
418
419
  style,
419
420
  ref,
420
421
  'data-testid': testId,
422
+ ...rest
421
423
  }: TimestampProps) {
422
424
  const t = useTranslator();
423
425
  const locale = useLocale();
424
426
  const timeRef = useRef<HTMLTimeElement>(null);
427
+ const mergedTimeRef = useMergedRefs(ref, timeRef);
425
428
  const [now, setNow] = useState(() => new Date());
426
429
 
427
430
  const date = parseValue(value);
@@ -526,17 +529,18 @@ export function Timestamp({
526
529
  xstyle={xstyle}
527
530
  {...timestampProps}>
528
531
  <time
529
- ref={mergeRefs(ref, timeRef)}
532
+ ref={mergedTimeRef}
530
533
  dateTime={isoString}
534
+ data-testid={testId}
535
+ {...stylex.props(styles.time)}
536
+ {...rest}
531
537
  // `ariaLabelText` is '' only for an invalid date, which bails out
532
538
  // before rendering — but keep the guard local: an empty aria-label
533
539
  // must be omitted entirely (not rendered as aria-label="") so AT
534
540
  // falls back to reading the visible <time> content.
535
- aria-label={
536
- isRelativeFormat(effectiveFormat) && ariaLabelText !== ''
537
- ? ariaLabelText
538
- : undefined
539
- }
541
+ {...(isRelativeFormat(effectiveFormat) && ariaLabelText !== ''
542
+ ? {'aria-label': ariaLabelText}
543
+ : {})}
540
544
  // The hover card is anchored here with focusTrigger="always", which
541
545
  // attaches focus listeners but does not itself make the anchor
542
546
  // focusable. A bare <time> is not focusable, so without a tab stop
@@ -545,9 +549,7 @@ export function Timestamp({
545
549
  // gratuitous tab stops otherwise. The card carries its own
546
550
  // dashed-underline hover indication as the affordance, so the anchor
547
551
  // needs no separate focus outline.
548
- tabIndex={showTooltip ? 0 : undefined}
549
- data-testid={testId}
550
- {...stylex.props(styles.time)}>
552
+ {...(showTooltip ? {tabIndex: 0} : {})}>
551
553
  {displayText}
552
554
  </time>
553
555
  </Text>
@@ -32,13 +32,13 @@ export const docs = {
32
32
  {
33
33
  name: 'autoHideDuration',
34
34
  type: 'number',
35
- description: 'Duration in ms before auto-dismiss.',
35
+ description: 'Duration in ms before auto-dismiss. Timed content must satisfy WCAG 2.2.1.',
36
36
  default: '5000',
37
37
  },
38
38
  {
39
39
  name: 'endContent',
40
40
  type: 'ReactNode',
41
- description: 'Content rendered at the trailing end (e.g. Undo button, link).',
41
+ description: 'Content rendered at the trailing end (e.g. Undo button, link). Keep action labels short.',
42
42
  slotElements: [
43
43
  {__element: 'Icon', props: {icon: 'chevronDown', size: 'sm'}},
44
44
  {__element: 'Badge', props: {label: '3'}},
@@ -60,18 +60,32 @@ export const docs = {
60
60
  type: '(reason: "auto" | "manual") => void',
61
61
  description: 'Callback fired when the toast is removed.',
62
62
  },
63
+ {
64
+ name: 'onDismiss',
65
+ type: '(reason: "auto" | "manual") => void',
66
+ description: 'Callback fired when the toast is dismissed.',
67
+ required: true,
68
+ },
63
69
  ], theming: {
64
70
  targets: [
65
71
  {className: 'astryx-toast', visualProps: ['type']},
66
72
  ],
73
+ vars: [
74
+ {
75
+ name: '--_toast-slide-y',
76
+ description: 'Private block-axis offset inherited from ToastViewport for entry and exit motion',
77
+ default: 'var(--spacing-2)',
78
+ private: true,
79
+ },
80
+ ],
67
81
  },
68
82
 
69
83
  usage: {
70
84
  description:
71
- '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.',
85
+ '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 or exit toward their configured top or bottom edge. 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.',
72
86
  bestPractices: [
73
87
  {guidance: true, description: 'Keep messages short: only a few words that tell the user what happened, like "Changes saved" or "Message sent".'},
74
- {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.'},
88
+ {guidance: true, description: 'Add a short undo action in the endContent slot for reversible operations. Set isAutoHide to false when the action must remain available.'},
75
89
  {guidance: true, description: 'Use uniqueID to deduplicate toasts that fire from repeated actions, like clicking a save button multiple times.'},
76
90
  {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.'},
77
91
  {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.'},
@@ -98,18 +112,18 @@ export const docsZh = {
98
112
  body: '主要消息内容。',
99
113
  type: 'Toast 类型,控制背景颜色。error toast 持续显示直到关闭。',
100
114
  isAutoHide: '是否自动关闭。info 默认为 true,error 默认为 false。',
101
- autoHideDuration: '自动关闭前的持续时间(毫秒)。',
102
- endContent: '尾部渲染的内容(如撤销按钮、链接)。',
115
+ autoHideDuration: '自动关闭前的持续时间(毫秒)。定时内容必须符合 WCAG 2.2.1。',
116
+ endContent: '尾部渲染的内容(如撤销按钮、链接)。操作标签应保持简短。',
103
117
  uniqueID: '用于去重的唯一标识符。',
104
118
  collisionBehavior: '当已存在相同 uniqueID 的 toast 时的行为。',
105
119
  onHide: '当 toast 被移除时触发的回调。',
106
120
  },
107
121
  usage: {
108
122
  description:
109
- 'Toast 显示简短的非阻塞通知,用于确认操作或呈现临时信息。适用于用户需要反馈但不需要做决定的场景,如保存、删除或状态变更。\n\n生产环境中推荐使用 `useToast()` hook,它通过 `ToastViewport` 处理定位、堆叠、自动关闭和去重。`Toast` 组件以内联方式渲染 toast 视觉元素,适用于预览、文档和静态展示。',
123
+ 'Toast 显示简短的非阻塞通知,用于确认操作或呈现临时信息。适用于用户需要反馈但不需要做决定的场景,如保存、删除或状态变更。\n\n生产环境中推荐使用 `useToast()` hook,它通过 `ToastViewport` 处理定位、堆叠、自动关闭和去重。Toast 会保持在视口和安全区域边距内,较长的消息会换行,并根据配置的顶部或底部边缘进入或退出。当操作或消息必须持续可用时,请显式设置 `isAutoHide: false`。`Toast` 组件以内联方式渲染 toast 视觉元素,适用于不需要视口生命周期的预览、文档和静态展示。',
110
124
  bestPractices: [
111
125
  {guidance: true, description: '保持消息简短,只需几个词告诉用户发生了什么,如"更改已保存"或"消息已发送"。'},
112
- {guidance: true, description: '在 endContent 插槽中添加撤销操作,用于可逆操作如删除项目,让用户无需导航即可恢复。'},
126
+ {guidance: true, description: '在 endContent 插槽中添加简短的撤销操作,用于可逆操作。当操作必须持续可用时,将 isAutoHide 设置为 false。'},
113
127
  {guidance: true, description: '使用 uniqueID 去重重复操作触发的 toast,如多次点击保存按钮。'},
114
128
  {guidance: true, description: '对需要关注但不需要立即操作的错误使用 error 类型,它会持续显示直到关闭。'},
115
129
  {guidance: false, description: '不要对阻塞用户的严重错误使用 toast,使用 Banner 进行持久的上下文消息传递。'},
@@ -130,10 +144,10 @@ export const docsDense = {
130
144
  'toast notification w/ auto-dismiss, stacking, dedup, smooth animations; MediaTheme inverted surface',
131
145
  usage: {
132
146
  description:
133
- '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.',
147
+ '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). Set isAutoHide false explicitly for must-remain actions/messages. Toast renders inline for previews/docs/static showcases.',
134
148
  bestPractices: [
135
149
  {guidance: true, description: 'Short messages, a few words: "Changes saved", "Message sent".'},
136
- {guidance: true, description: 'Undo action in endContent for reversible ops like deletes.'},
150
+ {guidance: true, description: 'Short Undo action in endContent for reversible ops; set isAutoHide false when it must remain available.'},
137
151
  {guidance: true, description: 'uniqueID to dedup repeated action toasts.'},
138
152
  {guidance: true, description: 'Error type for failures needing attention; persists until dismissed.'},
139
153
  {guidance: false, description: 'Don\'t use for critical blocking errors. Use Banner for persistent in-context messaging.'},
@@ -145,8 +159,8 @@ export const docsDense = {
145
159
  body: 'primary message content',
146
160
  type: 'toast type; controls bg color; error persists until dismissed',
147
161
  isAutoHide: 'auto-dismiss; true for info, false for error',
148
- autoHideDuration: 'ms before auto-dismiss',
149
- endContent: 'trailing end content (undo btn, link)',
162
+ autoHideDuration: 'ms before auto-dismiss; timed content must satisfy WCAG 2.2.1',
163
+ endContent: 'trailing end content (undo btn, link); keep action labels short',
150
164
  uniqueID: 'unique id for dedup',
151
165
  collisionBehavior: 'behavior when matching uniqueID exists',
152
166
  onHide: 'callback when toast removed',
@@ -2,6 +2,21 @@
2
2
 
3
3
  'use client';
4
4
 
5
+ /**
6
+ * @file Toast.tsx
7
+ * @input Uses React timers, Toast options, Button/Icon, MediaTheme, tokens, and
8
+ * placement-derived motion variables inherited from ToastViewport
9
+ * @output Exports the rendered Toast surface and its pause/dismiss behavior
10
+ * @position Core implementation; rendered by ToastViewport and documented by Toast.doc.mjs
11
+ *
12
+ * SYNC: When Toast layout, timer pause, media theme, or dismissal behavior changes,
13
+ * update these files to stay in sync:
14
+ * - /packages/core/src/Toast/ToastViewport.test.tsx
15
+ * - /packages/core/src/Toast/Toast.doc.mjs
16
+ * - /apps/storybook/stories/Toast.stories.tsx
17
+ * - /packages/cli/assets/templates/blocks/components/Toast/ (showcase blocks)
18
+ */
19
+
5
20
  import {useCallback, useEffect, useRef} from 'react';
6
21
  import type {ReactNode} from 'react';
7
22
  import * as stylex from '@stylexjs/stylex';
@@ -24,13 +39,15 @@ import type {ToastType, ToastDismissReason} from './types';
24
39
  import {themeProps} from '../utils/themeProps';
25
40
  import {useTranslator} from '../i18n';
26
41
 
42
+ const TOAST_EDGE_DRIFT = spacingVars['--spacing-2'];
27
43
  const styles = stylex.create({
28
44
  root: {
29
45
  paddingBlock: spacingVars['--spacing-4'],
30
46
  paddingInline: spacingVars['--spacing-4'],
31
47
  borderRadius: radiusVars['--radius-container'],
48
+ boxSizing: 'border-box',
32
49
  width: 400,
33
- maxWidth: 'min(100%, calc(100vw - 32px))',
50
+ maxWidth: '100%',
34
51
  boxShadow: shadowVars['--shadow-med'],
35
52
  opacity: 1,
36
53
  fontFamily: typographyVars['--font-family-body'],
@@ -45,15 +62,17 @@ const styles = stylex.create({
45
62
  transitionTimingFunction: easeVars['--ease-standard'],
46
63
  '@starting-style': {
47
64
  opacity: 0,
48
- transform: 'translateY(8px)',
65
+ transform: `translateY(var(--_toast-slide-y, ${TOAST_EDGE_DRIFT}))`,
49
66
  },
50
67
  },
51
68
  variantDefault: {
52
69
  backgroundColor: colorVars['--color-background-inverted'],
53
70
  },
71
+
54
72
  inner: {
55
73
  display: 'flex',
56
74
  alignItems: 'flex-start',
75
+ flexWrap: 'nowrap',
57
76
  gap: spacingVars['--spacing-3'],
58
77
  width: '100%',
59
78
  },
@@ -63,17 +82,22 @@ const styles = stylex.create({
63
82
  content: {
64
83
  flex: 1,
65
84
  minWidth: 0,
85
+ overflowWrap: 'anywhere',
66
86
  },
67
87
  exiting: {
68
88
  opacity: 0,
69
- transform: 'translateY(-8px)',
89
+ transform: `translateY(var(--_toast-slide-y, ${TOAST_EDGE_DRIFT}))`,
70
90
  },
71
91
  endContent: {
72
92
  flexShrink: 0,
73
93
  display: 'flex',
74
94
  alignItems: 'center',
75
95
  gap: spacingVars['--spacing-2'],
76
- marginBlock: `calc(${spacingVars['--spacing-1']} * -1)`,
96
+ // Keep every trailing control centered on the first 20px body line, even
97
+ // when the body wraps or a consumer supplies a control taller than the
98
+ // built-in 28px dismiss button. The action label should still stay short;
99
+ // the wrappers above let it break rather than widen the Toast.
100
+ blockSize: `calc(${typeScaleDefaults['--text-body-size']} * ${typeScaleDefaults['--text-body-leading']})`,
77
101
  marginInlineEnd: `calc(${spacingVars['--spacing-1']} * -1)`,
78
102
  },
79
103
  });