@astryxdesign/core 0.4.7 → 0.5.0-canary.055e75f

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 (597) 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 +40 -15
  24. package/dist/Banner/Banner.d.ts.map +1 -1
  25. package/dist/Banner/Banner.js +51 -18
  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 +3 -1
  38. package/dist/Calendar/Calendar.d.ts.map +1 -1
  39. package/dist/Calendar/Calendar.js +14 -15
  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 +6 -9
  47. package/dist/Card/Card.d.ts.map +1 -1
  48. package/dist/Card/Card.js +6 -6
  49. package/dist/Carousel/Carousel.d.ts.map +1 -1
  50. package/dist/Carousel/Carousel.js +3 -3
  51. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  52. package/dist/Chat/ChatComposerInput.js +2 -3
  53. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  54. package/dist/Chat/ChatLayout.js +3 -3
  55. package/dist/Chat/ChatMessageList.d.ts +22 -3
  56. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  57. package/dist/Chat/ChatMessageList.js +6 -3
  58. package/dist/Chat/ChatTokenizedText.d.ts +2 -0
  59. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  60. package/dist/Chat/ChatTokenizedText.js +11 -6
  61. package/dist/Chat/useChatComposerTokens.js +1 -1
  62. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  63. package/dist/CheckboxInput/CheckboxInput.js +10 -3
  64. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  65. package/dist/ClickableCard/ClickableCard.js +3 -3
  66. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  67. package/dist/CodeBlock/CodeBlock.js +15 -4
  68. package/dist/CodeBlock/highlightRanges.js +1 -1
  69. package/dist/CodeBlock/highlightStyles.js +13 -13
  70. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  71. package/dist/CommandPalette/CommandPaletteInput.js +3 -2
  72. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  73. package/dist/CommandPalette/CommandPaletteItem.js +3 -2
  74. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  75. package/dist/ContextMenu/ContextMenu.js +4 -3
  76. package/dist/DateInput/DateInput.d.ts +43 -0
  77. package/dist/DateInput/DateInput.d.ts.map +1 -1
  78. package/dist/DateInput/DateInput.js +22 -2
  79. package/dist/DateInput/NativeDateField.d.ts +10 -0
  80. package/dist/DateInput/NativeDateField.d.ts.map +1 -0
  81. package/dist/DateInput/NativeDateField.js +494 -0
  82. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  83. package/dist/DateInput/TouchDateField.js +82 -23
  84. package/dist/DateInput/index.d.ts +1 -1
  85. package/dist/DateInput/index.d.ts.map +1 -1
  86. package/dist/DateInput/nativeDateSegments.d.ts +22 -0
  87. package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
  88. package/dist/DateInput/nativeDateSegments.js +111 -0
  89. package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
  90. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  91. package/dist/DateTimeInput/DateTimeInput.js +406 -12
  92. package/dist/DateTimeInput/index.d.ts +1 -1
  93. package/dist/DateTimeInput/index.d.ts.map +1 -1
  94. package/dist/Dialog/Dialog.d.ts +21 -1
  95. package/dist/Dialog/Dialog.d.ts.map +1 -1
  96. package/dist/Dialog/Dialog.js +110 -58
  97. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  98. package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
  99. package/dist/Field/FieldLabel.d.ts.map +1 -1
  100. package/dist/Field/FieldLabel.js +9 -1
  101. package/dist/FileInput/FileInput.d.ts.map +1 -1
  102. package/dist/FileInput/FileInput.js +3 -2
  103. package/dist/Heading/Heading.d.ts.map +1 -1
  104. package/dist/Heading/Heading.js +6 -2
  105. package/dist/HoverCard/HoverCard.d.ts +6 -0
  106. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  107. package/dist/HoverCard/HoverCard.js +104 -3
  108. package/dist/HoverCard/useHoverCard.d.ts +19 -2
  109. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  110. package/dist/HoverCard/useHoverCard.js +74 -26
  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 +4 -2
  115. package/dist/Kbd/Kbd.d.ts.map +1 -1
  116. package/dist/Kbd/Kbd.js +2 -19
  117. package/dist/Layer/LayerDepthContext.d.ts +52 -0
  118. package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
  119. package/dist/Layer/LayerDepthContext.js +66 -0
  120. package/dist/Layer/index.d.ts +3 -0
  121. package/dist/Layer/index.d.ts.map +1 -1
  122. package/dist/Layer/index.js +4 -0
  123. package/dist/Layer/layerStack.d.ts +98 -0
  124. package/dist/Layer/layerStack.d.ts.map +1 -0
  125. package/dist/Layer/layerStack.js +306 -0
  126. package/dist/Layer/useLayerDismissal.d.ts +93 -0
  127. package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
  128. package/dist/Layer/useLayerDismissal.js +91 -0
  129. package/dist/Lightbox/Lightbox.d.ts +1 -0
  130. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  131. package/dist/Lightbox/Lightbox.js +103 -81
  132. package/dist/Markdown/Markdown.d.ts.map +1 -1
  133. package/dist/Markdown/Markdown.js +9 -4
  134. package/dist/Markdown/index.d.ts +1 -1
  135. package/dist/Markdown/index.d.ts.map +1 -1
  136. package/dist/Markdown/parser.d.ts +38 -1
  137. package/dist/Markdown/parser.d.ts.map +1 -1
  138. package/dist/Markdown/parser.js +182 -32
  139. package/dist/MobileNav/MobileNav.d.ts +6 -1
  140. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  141. package/dist/MobileNav/MobileNav.js +61 -36
  142. package/dist/MultiSelector/MultiSelector.d.ts +32 -1
  143. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  144. package/dist/MultiSelector/MultiSelector.js +63 -11
  145. package/dist/MultiSelector/index.d.ts +1 -1
  146. package/dist/MultiSelector/index.d.ts.map +1 -1
  147. package/dist/NavIcon/NavIcon.d.ts.map +1 -1
  148. package/dist/NavIcon/NavIcon.js +5 -1
  149. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  150. package/dist/NavMenu/NavHeadingMenu.js +3 -2
  151. package/dist/NumberInput/NumberInput.d.ts +6 -1
  152. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  153. package/dist/NumberInput/NumberInput.js +54 -104
  154. package/dist/NumberInput/numberInputCommit.d.ts +34 -0
  155. package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
  156. package/dist/NumberInput/numberInputCommit.js +71 -0
  157. package/dist/NumberInput/numberParser.d.ts +64 -0
  158. package/dist/NumberInput/numberParser.d.ts.map +1 -0
  159. package/dist/NumberInput/numberParser.js +350 -0
  160. package/dist/Outline/Outline.d.ts.map +1 -1
  161. package/dist/Outline/Outline.js +3 -2
  162. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  163. package/dist/OverflowList/OverflowList.js +3 -2
  164. package/dist/Overlay/Overlay.d.ts.map +1 -1
  165. package/dist/Overlay/Overlay.js +3 -2
  166. package/dist/Popover/usePopover.d.ts.map +1 -1
  167. package/dist/Popover/usePopover.js +20 -17
  168. package/dist/PowerSearch/PowerSearch.d.ts +8 -2
  169. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  170. package/dist/PowerSearch/PowerSearch.js +19 -6
  171. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
  172. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  173. package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
  174. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
  175. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  176. package/dist/PowerSearch/PowerSearchValueEditor.js +110 -27
  177. package/dist/PowerSearch/types.d.ts +2 -0
  178. package/dist/PowerSearch/types.d.ts.map +1 -1
  179. package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
  180. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  181. package/dist/PowerSearch/usePowerSearchSource.js +14 -5
  182. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  183. package/dist/ProgressBar/ProgressBar.js +18 -5
  184. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  185. package/dist/Resizable/ResizeHandle.js +3 -2
  186. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  187. package/dist/SegmentedControl/SegmentedControl.js +3 -2
  188. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  189. package/dist/SelectableCard/SelectableCard.js +3 -3
  190. package/dist/Selector/Selector.d.ts +17 -0
  191. package/dist/Selector/Selector.d.ts.map +1 -1
  192. package/dist/Selector/Selector.js +81 -14
  193. package/dist/SideNav/SideNav.d.ts.map +1 -1
  194. package/dist/SideNav/SideNav.js +4 -3
  195. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  196. package/dist/SideNav/SideNavHeading.js +8 -7
  197. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  198. package/dist/SideNav/SideNavItem.js +4 -3
  199. package/dist/Slider/Slider.d.ts.map +1 -1
  200. package/dist/Slider/Slider.js +37 -5
  201. package/dist/Spinner/Spinner.d.ts +3 -3
  202. package/dist/Spinner/Spinner.d.ts.map +1 -1
  203. package/dist/Spinner/Spinner.js +130 -78
  204. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  205. package/dist/StatusDot/StatusDot.js +6 -1
  206. package/dist/Stepper/Step.d.ts +140 -0
  207. package/dist/Stepper/Step.d.ts.map +1 -0
  208. package/dist/Stepper/Step.js +1045 -0
  209. package/dist/Stepper/StepStatus.d.ts +24 -0
  210. package/dist/Stepper/StepStatus.d.ts.map +1 -0
  211. package/dist/Stepper/StepStatus.js +1 -0
  212. package/dist/Stepper/Stepper.d.ts +93 -0
  213. package/dist/Stepper/Stepper.d.ts.map +1 -0
  214. package/dist/Stepper/Stepper.js +184 -0
  215. package/dist/Stepper/StepperContext.d.ts +41 -0
  216. package/dist/Stepper/StepperContext.d.ts.map +1 -0
  217. package/dist/Stepper/StepperContext.js +34 -0
  218. package/dist/Stepper/index.d.ts +8 -0
  219. package/dist/Stepper/index.d.ts.map +1 -0
  220. package/dist/Stepper/index.js +7 -0
  221. package/dist/Stepper/stepper.stylex.d.ts +15 -0
  222. package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
  223. package/dist/Stepper/stepper.stylex.js +20 -0
  224. package/dist/Switch/Switch.d.ts.map +1 -1
  225. package/dist/Switch/Switch.js +8 -3
  226. package/dist/TabList/Tab.d.ts +15 -2
  227. package/dist/TabList/Tab.d.ts.map +1 -1
  228. package/dist/TabList/Tab.js +32 -7
  229. package/dist/TabList/TabList.d.ts +46 -7
  230. package/dist/TabList/TabList.d.ts.map +1 -1
  231. package/dist/TabList/TabList.js +353 -23
  232. package/dist/TabList/TabListContext.d.ts +11 -1
  233. package/dist/TabList/TabListContext.d.ts.map +1 -1
  234. package/dist/TabList/TabListContext.js +11 -2
  235. package/dist/TabList/TabMenu.d.ts.map +1 -1
  236. package/dist/TabList/TabMenu.js +3 -2
  237. package/dist/TabList/index.d.ts +2 -2
  238. package/dist/TabList/index.d.ts.map +1 -1
  239. package/dist/Table/BaseTable.d.ts.map +1 -1
  240. package/dist/Table/BaseTable.js +10 -2
  241. package/dist/Table/Table.d.ts.map +1 -1
  242. package/dist/Table/Table.js +3 -6
  243. package/dist/Table/TableRow.d.ts +16 -5
  244. package/dist/Table/TableRow.d.ts.map +1 -1
  245. package/dist/Table/TableRow.js +16 -5
  246. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  247. package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
  248. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  249. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +20 -8
  250. package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
  251. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  252. package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
  253. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  254. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
  255. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
  256. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
  257. package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
  258. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  259. package/dist/Table/plugins/selection/useTableSelection.js +19 -5
  260. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  261. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
  262. package/dist/Table/types.d.ts +22 -4
  263. package/dist/Table/types.d.ts.map +1 -1
  264. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  265. package/dist/Table/useBaseTablePlugins.js +5 -0
  266. package/dist/Text/Text.d.ts.map +1 -1
  267. package/dist/Text/Text.js +6 -2
  268. package/dist/TextArea/TextArea.d.ts.map +1 -1
  269. package/dist/TextArea/TextArea.js +9 -3
  270. package/dist/TextInput/TextInput.d.ts.map +1 -1
  271. package/dist/TextInput/TextInput.js +3 -2
  272. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  273. package/dist/TimeInput/TimeInput.js +3 -2
  274. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  275. package/dist/Timestamp/Timestamp.js +5 -3
  276. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  277. package/dist/Toast/ToastViewport.js +27 -8
  278. package/dist/Token/TokenLink.d.ts.map +1 -1
  279. package/dist/Token/TokenLink.js +2 -2
  280. package/dist/Tokenizer/Tokenizer.d.ts +3 -1
  281. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  282. package/dist/Tokenizer/Tokenizer.js +2 -0
  283. package/dist/Tooltip/Tooltip.d.ts +5 -0
  284. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  285. package/dist/Tooltip/useTooltip.d.ts +5 -0
  286. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  287. package/dist/Tooltip/useTooltip.js +39 -24
  288. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  289. package/dist/TopNav/TopNavHeading.js +5 -4
  290. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  291. package/dist/TopNav/TopNavMegaMenu.js +3 -3
  292. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  293. package/dist/TopNav/TopNavMenu.js +4 -3
  294. package/dist/Typeahead/BaseTypeahead.d.ts +2 -0
  295. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  296. package/dist/Typeahead/BaseTypeahead.js +68 -29
  297. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  298. package/dist/Typeahead/Typeahead.js +3 -2
  299. package/dist/astryx.css +98 -7
  300. package/dist/hooks/index.d.ts +1 -0
  301. package/dist/hooks/index.d.ts.map +1 -1
  302. package/dist/hooks/index.js +1 -0
  303. package/dist/hooks/useFocusTrap.d.ts +7 -4
  304. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  305. package/dist/hooks/useFocusTrap.js +60 -95
  306. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  307. package/dist/hooks/useHotkeys.js +3 -18
  308. package/dist/hooks/useMergedRefs.d.ts +18 -0
  309. package/dist/hooks/useMergedRefs.d.ts.map +1 -0
  310. package/dist/hooks/useMergedRefs.js +25 -0
  311. package/dist/index.d.ts +1 -0
  312. package/dist/index.d.ts.map +1 -1
  313. package/dist/index.js +1 -0
  314. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  315. package/dist/theme/derivedVarRegistry.js +24 -4
  316. package/dist/theme/syntax/tokens.d.ts +1 -1
  317. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  318. package/dist/theme/syntax/tokens.js +5 -2
  319. package/dist/utils/groupItems.d.ts +5 -1
  320. package/dist/utils/groupItems.d.ts.map +1 -1
  321. package/dist/utils/groupItems.js +9 -9
  322. package/dist/utils/index.d.ts +1 -1
  323. package/dist/utils/index.d.ts.map +1 -1
  324. package/dist/utils/isApplePlatform.d.ts +18 -0
  325. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  326. package/dist/utils/isApplePlatform.js +37 -0
  327. package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
  328. package/dist/utils/sharedResizeObserver.js +10 -1
  329. package/dist/utils/timeParser.d.ts +1 -1
  330. package/dist/utils/timeParser.d.ts.map +1 -1
  331. package/dist/utils/timeParser.js +26 -12
  332. package/locales/en.json +154 -10
  333. package/locales/pseudo.json +108 -0
  334. package/package.json +8 -3
  335. package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
  336. package/src/AlertDialog/AlertDialog.test.tsx +211 -2
  337. package/src/AlertDialog/AlertDialog.tsx +62 -20
  338. package/src/AppShell/AppShell.tsx +3 -2
  339. package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
  340. package/src/AspectRatio/AspectRatio.test.tsx +57 -10
  341. package/src/AspectRatio/AspectRatio.tsx +40 -1
  342. package/src/Avatar/Avatar.doc.mjs +14 -3
  343. package/src/Avatar/Avatar.test.tsx +97 -0
  344. package/src/Avatar/Avatar.tsx +125 -52
  345. package/src/Avatar/index.ts +2 -2
  346. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  347. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  348. package/src/AvatarGroup/AvatarGroup.tsx +15 -6
  349. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  350. package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
  351. package/src/Banner/Banner.doc.mjs +13 -11
  352. package/src/Banner/Banner.test.tsx +102 -15
  353. package/src/Banner/Banner.tsx +72 -25
  354. package/src/BottomSheet/BottomSheet.test.tsx +123 -0
  355. package/src/BottomSheet/BottomSheet.tsx +17 -4
  356. package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
  357. package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
  358. package/src/Button/Button.doc.mjs +24 -1
  359. package/src/Button/Button.test.tsx +32 -4
  360. package/src/Button/Button.tsx +12 -5
  361. package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
  362. package/src/ButtonGroup/ButtonGroup.test.tsx +404 -1
  363. package/src/ButtonGroup/ButtonGroup.tsx +23 -5
  364. package/src/Calendar/Calendar.doc.mjs +4 -3
  365. package/src/Calendar/Calendar.test.tsx +103 -0
  366. package/src/Calendar/Calendar.tsx +19 -16
  367. package/src/Calendar/getInitialFocusDate.test.ts +94 -0
  368. package/src/Calendar/getInitialFocusDate.ts +93 -0
  369. package/src/Calendar/styles.ts +49 -31
  370. package/src/Card/Card.doc.mjs +10 -7
  371. package/src/Card/Card.test.tsx +44 -19
  372. package/src/Card/Card.tsx +12 -32
  373. package/src/Carousel/Carousel.tsx +3 -2
  374. package/src/Chat/ChatComposerInput.tsx +5 -1
  375. package/src/Chat/ChatLayout.tsx +3 -2
  376. package/src/Chat/ChatMessageList.doc.mjs +9 -1
  377. package/src/Chat/ChatMessageList.test.tsx +46 -0
  378. package/src/Chat/ChatMessageList.tsx +28 -4
  379. package/src/Chat/ChatTokenizedText.tsx +17 -10
  380. package/src/Chat/useChatComposerTokens.ts +1 -1
  381. package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
  382. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  383. package/src/CheckboxInput/CheckboxInput.tsx +8 -2
  384. package/src/ClickableCard/ClickableCard.tsx +3 -2
  385. package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
  386. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  387. package/src/CodeBlock/CodeBlock.tsx +20 -4
  388. package/src/CodeBlock/highlightRanges.ts +1 -1
  389. package/src/CodeBlock/highlightStyles.ts +13 -13
  390. package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
  391. package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
  392. package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
  393. package/src/ContextMenu/ContextMenu.tsx +4 -3
  394. package/src/DateInput/DateInput.doc.mjs +16 -0
  395. package/src/DateInput/DateInput.tsx +55 -2
  396. package/src/DateInput/DateInputTouch.test.tsx +146 -32
  397. package/src/DateInput/NativeDateField.test.tsx +635 -0
  398. package/src/DateInput/NativeDateField.tsx +641 -0
  399. package/src/DateInput/TouchDateField.tsx +108 -24
  400. package/src/DateInput/index.ts +1 -0
  401. package/src/DateInput/nativeDateSegments.ts +127 -0
  402. package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
  403. package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
  404. package/src/DateTimeInput/DateTimeInput.tsx +556 -24
  405. package/src/DateTimeInput/index.ts +1 -0
  406. package/src/Dialog/Dialog.doc.mjs +8 -3
  407. package/src/Dialog/Dialog.test.tsx +429 -2
  408. package/src/Dialog/Dialog.tsx +133 -58
  409. package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
  410. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
  411. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
  412. package/src/Field/Field.doc.mjs +13 -2
  413. package/src/Field/FieldLabel.test.tsx +29 -0
  414. package/src/Field/FieldLabel.tsx +7 -0
  415. package/src/FileInput/FileInput.tsx +3 -2
  416. package/src/Heading/Heading.test.tsx +23 -1
  417. package/src/Heading/Heading.tsx +6 -2
  418. package/src/HoverCard/HoverCard.doc.mjs +13 -2
  419. package/src/HoverCard/HoverCard.test.tsx +154 -4
  420. package/src/HoverCard/HoverCard.tsx +143 -3
  421. package/src/HoverCard/useHoverCard.tsx +104 -33
  422. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  423. package/src/Indicator/Indicator.doc.mjs +2 -0
  424. package/src/Item/Item.tsx +5 -4
  425. package/src/Kbd/Kbd.tsx +2 -19
  426. package/src/Layer/LayerDepthContext.tsx +62 -0
  427. package/src/Layer/index.ts +9 -0
  428. package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
  429. package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
  430. package/src/Layer/layerStack.ts +362 -0
  431. package/src/Layer/useLayer.test.tsx +62 -14
  432. package/src/Layer/useLayerDismissal.test.tsx +469 -0
  433. package/src/Layer/useLayerDismissal.ts +173 -0
  434. package/src/Layout/Layout.doc.mjs +2 -2
  435. package/src/Lightbox/Lightbox.doc.mjs +12 -0
  436. package/src/Lightbox/Lightbox.tsx +124 -102
  437. package/src/Link/Link.doc.mjs +39 -0
  438. package/src/Markdown/Markdown.doc.mjs +5 -0
  439. package/src/Markdown/Markdown.tsx +9 -4
  440. package/src/Markdown/incremental.test.ts +16 -2
  441. package/src/Markdown/index.ts +1 -0
  442. package/src/Markdown/parser.perf.test.ts +96 -1
  443. package/src/Markdown/parser.test.ts +178 -2
  444. package/src/Markdown/parser.ts +253 -32
  445. package/src/MobileNav/MobileNav.tsx +62 -36
  446. package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
  447. package/src/MultiSelector/MultiSelector.doc.mjs +49 -1
  448. package/src/MultiSelector/MultiSelector.test.tsx +277 -0
  449. package/src/MultiSelector/MultiSelector.tsx +142 -11
  450. package/src/MultiSelector/index.ts +1 -0
  451. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  452. package/src/NavIcon/NavIcon.test.tsx +9 -0
  453. package/src/NavIcon/NavIcon.tsx +5 -1
  454. package/src/NavMenu/NavHeadingMenu.tsx +3 -2
  455. package/src/NumberInput/NumberInput.doc.mjs +31 -7
  456. package/src/NumberInput/NumberInput.test.tsx +436 -8
  457. package/src/NumberInput/NumberInput.tsx +62 -114
  458. package/src/NumberInput/numberInputCommit.test.ts +72 -0
  459. package/src/NumberInput/numberInputCommit.ts +103 -0
  460. package/src/NumberInput/numberParser.docblock.test.ts +234 -0
  461. package/src/NumberInput/numberParser.test.ts +222 -0
  462. package/src/NumberInput/numberParser.ts +403 -0
  463. package/src/Outline/Outline.tsx +3 -2
  464. package/src/OverflowList/OverflowList.tsx +3 -2
  465. package/src/Overlay/Overlay.tsx +3 -2
  466. package/src/Pagination/Pagination.test.tsx +3 -2
  467. package/src/Popover/usePopover.tsx +31 -28
  468. package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
  469. package/src/PowerSearch/PowerSearch.test.tsx +240 -1
  470. package/src/PowerSearch/PowerSearch.tsx +34 -5
  471. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +288 -0
  472. package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
  473. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +111 -1
  474. package/src/PowerSearch/PowerSearchValueEditor.tsx +124 -10
  475. package/src/PowerSearch/types.ts +2 -0
  476. package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
  477. package/src/PowerSearch/usePowerSearchSource.ts +13 -3
  478. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  479. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  480. package/src/ProgressBar/ProgressBar.tsx +28 -8
  481. package/src/Resizable/ResizeHandle.tsx +3 -2
  482. package/src/SegmentedControl/SegmentedControl.tsx +3 -2
  483. package/src/SelectableCard/SelectableCard.tsx +3 -2
  484. package/src/Selector/Selector.doc.mjs +26 -1
  485. package/src/Selector/Selector.test.tsx +311 -1
  486. package/src/Selector/Selector.tsx +139 -16
  487. package/src/SideNav/SideNav.doc.mjs +6 -6
  488. package/src/SideNav/SideNav.tsx +4 -2
  489. package/src/SideNav/SideNavHeading.tsx +12 -12
  490. package/src/SideNav/SideNavItem.tsx +4 -2
  491. package/src/Slider/Slider.test.tsx +106 -1
  492. package/src/Slider/Slider.tsx +55 -3
  493. package/src/Spinner/Spinner.test.tsx +147 -1
  494. package/src/Spinner/Spinner.tsx +120 -101
  495. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  496. package/src/StatusDot/StatusDot.test.tsx +9 -0
  497. package/src/StatusDot/StatusDot.tsx +7 -1
  498. package/src/Stepper/Step.doc.mjs +98 -0
  499. package/src/Stepper/Step.tsx +1638 -0
  500. package/src/Stepper/StepStatus.ts +26 -0
  501. package/src/Stepper/Stepper.doc.mjs +370 -0
  502. package/src/Stepper/Stepper.test.tsx +1024 -0
  503. package/src/Stepper/Stepper.tsx +258 -0
  504. package/src/Stepper/StepperContext.ts +71 -0
  505. package/src/Stepper/index.ts +18 -0
  506. package/src/Stepper/stepper.stylex.ts +19 -0
  507. package/src/Switch/Switch.doc.mjs +2 -0
  508. package/src/Switch/Switch.test.tsx +10 -0
  509. package/src/Switch/Switch.tsx +6 -2
  510. package/src/TabList/Tab.doc.mjs +13 -1
  511. package/src/TabList/Tab.tsx +67 -7
  512. package/src/TabList/TabList.doc.mjs +22 -6
  513. package/src/TabList/TabList.test.tsx +559 -0
  514. package/src/TabList/TabList.tsx +490 -22
  515. package/src/TabList/TabListContext.ts +13 -2
  516. package/src/TabList/TabMenu.tsx +3 -2
  517. package/src/TabList/index.ts +6 -2
  518. package/src/Table/BaseTable.tsx +12 -4
  519. package/src/Table/Table.doc.mjs +9 -2
  520. package/src/Table/Table.test.tsx +132 -14
  521. package/src/Table/Table.tsx +3 -8
  522. package/src/Table/TableBody.doc.mjs +40 -0
  523. package/src/Table/TableFooter.doc.mjs +40 -0
  524. package/src/Table/TableHeader.doc.mjs +40 -0
  525. package/src/Table/TableRow.tsx +16 -5
  526. package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
  527. package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
  528. package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
  529. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
  530. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +17 -8
  531. package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
  532. package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
  533. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
  534. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
  535. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
  536. package/src/Table/plugins/selection/useTableSelection.test.tsx +76 -0
  537. package/src/Table/plugins/selection/useTableSelection.tsx +40 -7
  538. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  539. package/src/Table/types.ts +22 -4
  540. package/src/Table/useBaseTablePlugins.ts +5 -0
  541. package/src/Table/useTableGroupedRows.doc.mjs +5 -4
  542. package/src/Table/useTablePagination.doc.mjs +7 -0
  543. package/src/Table/useTableRowStatus.doc.mjs +1 -1
  544. package/src/Table/useTableSelection.doc.mjs +31 -0
  545. package/src/Text/Text.test.tsx +23 -1
  546. package/src/Text/Text.tsx +6 -2
  547. package/src/TextArea/TextArea.doc.mjs +8 -2
  548. package/src/TextArea/TextArea.test.tsx +11 -0
  549. package/src/TextArea/TextArea.tsx +15 -8
  550. package/src/TextInput/TextInput.doc.mjs +10 -0
  551. package/src/TextInput/TextInput.tsx +3 -2
  552. package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
  553. package/src/TimeInput/TimeInput.tsx +2 -2
  554. package/src/Timestamp/Timestamp.test.tsx +18 -0
  555. package/src/Timestamp/Timestamp.tsx +4 -2
  556. package/src/Toast/Toast.doc.mjs +6 -0
  557. package/src/Toast/ToastViewport.tsx +17 -1
  558. package/src/Token/TokenLink.tsx +2 -2
  559. package/src/Tokenizer/Tokenizer.doc.mjs +27 -0
  560. package/src/Tokenizer/Tokenizer.tsx +4 -0
  561. package/src/Toolbar/Toolbar.doc.mjs +5 -0
  562. package/src/Tooltip/Tooltip.doc.mjs +5 -0
  563. package/src/Tooltip/Tooltip.test.tsx +32 -0
  564. package/src/Tooltip/Tooltip.tsx +5 -0
  565. package/src/Tooltip/useTooltip.tsx +47 -24
  566. package/src/TopNav/TopNavHeading.tsx +5 -4
  567. package/src/TopNav/TopNavMegaMenu.tsx +3 -2
  568. package/src/TopNav/TopNavMenu.tsx +4 -3
  569. package/src/Typeahead/BaseTypeahead.doc.mjs +11 -0
  570. package/src/Typeahead/BaseTypeahead.tsx +85 -33
  571. package/src/Typeahead/Typeahead.doc.mjs +5 -0
  572. package/src/Typeahead/Typeahead.test.tsx +49 -0
  573. package/src/Typeahead/Typeahead.tsx +3 -2
  574. package/src/hooks/index.ts +2 -0
  575. package/src/hooks/useContainerReveal.doc.mjs +2 -2
  576. package/src/hooks/useFocusTrap.test.tsx +14 -0
  577. package/src/hooks/useFocusTrap.ts +62 -111
  578. package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
  579. package/src/hooks/useHotkeys.ts +3 -18
  580. package/src/hooks/useMergedRefs.doc.mjs +79 -0
  581. package/src/hooks/useMergedRefs.test.tsx +62 -0
  582. package/src/hooks/useMergedRefs.ts +36 -0
  583. package/src/index.ts +1 -0
  584. package/src/raw-import.d.ts +14 -0
  585. package/src/theme/MediaTheme.doc.mjs +5 -5
  586. package/src/theme/derivedVarRegistry.test.ts +19 -3
  587. package/src/theme/derivedVarRegistry.ts +23 -4
  588. package/src/theme/generateThemeRules.test.ts +37 -0
  589. package/src/theme/syntax/tokens.ts +5 -2
  590. package/src/utils/groupItems.ts +12 -6
  591. package/src/utils/index.ts +1 -1
  592. package/src/utils/isApplePlatform.test.ts +61 -0
  593. package/src/utils/isApplePlatform.ts +37 -0
  594. package/src/utils/sharedResizeObserver.ts +10 -2
  595. package/src/utils/timeParser.test.ts +6 -1
  596. package/src/utils/timeParser.ts +35 -13
  597. package/src/__tests__/inputWidthContract.test.tsx +0 -69
@@ -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.
@@ -422,6 +423,7 @@ export function Timestamp({
422
423
  const t = useTranslator();
423
424
  const locale = useLocale();
424
425
  const timeRef = useRef<HTMLTimeElement>(null);
426
+ const mergedTimeRef = useMergedRefs(ref, timeRef);
425
427
  const [now, setNow] = useState(() => new Date());
426
428
 
427
429
  const date = parseValue(value);
@@ -526,7 +528,7 @@ export function Timestamp({
526
528
  xstyle={xstyle}
527
529
  {...timestampProps}>
528
530
  <time
529
- ref={mergeRefs(ref, timeRef)}
531
+ ref={mergedTimeRef}
530
532
  dateTime={isoString}
531
533
  // `ariaLabelText` is '' only for an invalid date, which bails out
532
534
  // before rendering — but keep the guard local: an empty aria-label
@@ -60,6 +60,12 @@ 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']},
@@ -58,7 +58,6 @@ const styles = stylex.create({
58
58
  pointerEvents: 'auto',
59
59
  display: 'grid',
60
60
  gridTemplateRows: '1fr',
61
- paddingBlockEnd: spacingVars['--spacing-3'],
62
61
  transitionProperty: 'grid-template-rows, padding',
63
62
  transitionDuration: {
64
63
  default: durationVars['--duration-fast'],
@@ -70,6 +69,18 @@ const styles = stylex.create({
70
69
  paddingBlockEnd: 0,
71
70
  },
72
71
  },
72
+ // The inter-toast gap is padding on each toast rather than `gap` on the
73
+ // viewport so it can animate alongside gridTemplateRows on entry and exit.
74
+ // That makes it the toast's own trailing space, so the toast at the visual
75
+ // bottom of the stack has to give it up — otherwise it stacks on top of the
76
+ // viewport's own padding. Which child that is flips with the flex direction
77
+ // the position sets.
78
+ toastWrapperGap: {
79
+ paddingBlockEnd: {default: spacingVars['--spacing-3'], ':last-child': 0},
80
+ },
81
+ toastWrapperGapReversed: {
82
+ paddingBlockEnd: {default: spacingVars['--spacing-3'], ':first-child': 0},
83
+ },
73
84
  toastWrapperExiting: {
74
85
  gridTemplateRows: '0fr',
75
86
  paddingBlockEnd: 0,
@@ -417,6 +428,10 @@ export function ToastViewport({
417
428
  : position === 'bottomStart'
418
429
  ? styles.bottomStart
419
430
  : styles.bottomEnd;
431
+ const isReversed = position === 'topEnd' || position === 'topStart';
432
+ const gapStyle = isReversed
433
+ ? styles.toastWrapperGapReversed
434
+ : styles.toastWrapperGap;
420
435
 
421
436
  return (
422
437
  <ToastContext value={contextValue}>
@@ -444,6 +459,7 @@ export function ToastViewport({
444
459
  data-toast-id={entry.id}
445
460
  {...stylex.props(
446
461
  styles.toastWrapper,
462
+ gapStyle,
447
463
  isExiting && styles.toastWrapperExiting,
448
464
  )}
449
465
  onTransitionEnd={
@@ -27,10 +27,10 @@
27
27
 
28
28
  import type {ReactNode, CSSProperties, Ref, HTMLAttributes} from 'react';
29
29
  import {useRef} from 'react';
30
- import {mergeRefs} from '../utils';
31
30
  import {useClickableContainer} from '../hooks/useClickableContainer';
32
31
  import type {LinkComponentType} from '../Link/types';
33
32
 
33
+ import {useMergedRefs} from '../hooks/useMergedRefs';
34
34
  export interface TokenLinkProps extends HTMLAttributes<HTMLElement> {
35
35
  /** Ref forwarded to the container element. */
36
36
  ref?: Ref<HTMLElement>;
@@ -86,7 +86,7 @@ export function TokenLink({
86
86
 
87
87
  return (
88
88
  <span
89
- ref={mergeRefs(ref, containerRef)}
89
+ ref={useMergedRefs(ref, containerRef)}
90
90
  onClick={isDisabled ? undefined : onClick}
91
91
  onMouseUp={isDisabled ? undefined : onMouseUp}
92
92
  {...containerProps}>
@@ -135,6 +135,11 @@ export const docs = {
135
135
  description: 'Maximum number of dropdown items to display.',
136
136
  default: '10',
137
137
  },
138
+ {
139
+ name: 'menuWidth',
140
+ type: 'number',
141
+ description: 'Fixed dropdown width in pixels. The menu never shrinks below its anchor width.',
142
+ },
138
143
  {
139
144
  name: 'emptySearchResultsText',
140
145
  type: 'string',
@@ -201,6 +206,22 @@ export const docs = {
201
206
  description:
202
207
  'Width of the field (number = pixels, string used as-is, e.g. "100%"). Sizes the whole field (label, control, and status) so they stay aligned.',
203
208
  },
209
+ {
210
+ name: 'tokenOverflowBehavior',
211
+ type: "'none' | 'unfocusedInline' | 'unfocusedLayer'",
212
+ description: 'Controls how tokens overflow when the container is too narrow.',
213
+ default: "'none'",
214
+ },
215
+ {
216
+ name: 'onFocus',
217
+ type: '(e: FocusEvent<HTMLInputElement>) => void',
218
+ description: 'Fires when focus enters the tokenizer input.',
219
+ },
220
+ {
221
+ name: 'onBlur',
222
+ type: '(e: FocusEvent<HTMLInputElement>) => void',
223
+ description: 'Fires when focus leaves the tokenizer input.',
224
+ },
204
225
  {
205
226
  name: 'xstyle',
206
227
  type: 'StyleXStyles',
@@ -368,6 +389,11 @@ export const docsZh = {
368
389
  description: '\u4e0b\u62c9\u5217\u8868\u663e\u793a\u7684\u6700\u5927\u9879\u76ee\u6570\u3002',
369
390
  default: '10',
370
391
  },
392
+ {
393
+ name: 'menuWidth',
394
+ type: 'number',
395
+ description: '下拉菜单的固定像素宽度。菜单不会小于其锚点宽度。',
396
+ },
371
397
  {
372
398
  name: 'emptySearchResultsText',
373
399
  type: 'string',
@@ -490,6 +516,7 @@ export const docsDense = {
490
516
  labelTooltip: 'Tooltip on label.',
491
517
  hasEntriesOnFocus: 'Show bootstrap results on focus before typing.',
492
518
  maxMenuItems: 'Max dropdown items to display.',
519
+ menuWidth: 'Fixed dropdown width in pixels.',
493
520
  emptySearchResultsText: 'Text when search returns no results.',
494
521
  hasAutoFocus: 'Auto-focus input on mount.',
495
522
  size: 'Input+token size.',
@@ -156,6 +156,8 @@ export interface TokenizerProps<T extends SearchableItem> extends Omit<
156
156
  hasEntriesOnFocus?: boolean;
157
157
  /** Max dropdown items. @default 10 */
158
158
  maxMenuItems?: number;
159
+ /** Fixed dropdown width in pixels. Never shrinks below the input width. */
160
+ menuWidth?: number;
159
161
  /** Text shown when no results found. @default 'No results found' */
160
162
  emptySearchResultsText?: string;
161
163
  /** Whether the input is disabled. @default false */
@@ -393,6 +395,7 @@ export function Tokenizer<T extends SearchableItem>({
393
395
  placeholder,
394
396
  hasEntriesOnFocus,
395
397
  maxMenuItems,
398
+ menuWidth,
396
399
  emptySearchResultsText,
397
400
  isDisabled = false,
398
401
  htmlName,
@@ -778,6 +781,7 @@ export function Tokenizer<T extends SearchableItem>({
778
781
  placeholder={value.length === 0 ? placeholder : ''}
779
782
  hasEntriesOnFocus={isAtMax ? false : hasEntriesOnFocus}
780
783
  maxMenuItems={maxMenuItems}
784
+ menuWidth={menuWidth}
781
785
  emptySearchResultsText={emptySearchResultsText}
782
786
  isDisabled={isDisabled}
783
787
  isFocusableDisabled={showsDisabledMessage}
@@ -133,6 +133,11 @@ export const docs = {
133
133
  description: 'Visual variant passed to Section.',
134
134
  default: "'transparent'",
135
135
  },
136
+ {
137
+ name: 'dividers',
138
+ type: "Array<'top' | 'bottom' | 'start' | 'end'>",
139
+ description: 'Borders/dividers rendered around the toolbar.',
140
+ },
136
141
  {
137
142
  name: 'xstyle',
138
143
  type: 'StyleXStyles',
@@ -96,6 +96,11 @@ export const docs = {
96
96
  type: 'boolean',
97
97
  description: 'Whether the tooltip should be shown on mount. Still dismissible.',
98
98
  },
99
+ {
100
+ name: 'isOpen',
101
+ type: 'boolean',
102
+ description: 'Controlled open state for the tooltip.',
103
+ },
99
104
  ],
100
105
  },
101
106
  ],
@@ -276,6 +276,38 @@ describe('Tooltip', () => {
276
276
  expect(onOpenChange).not.toHaveBeenCalledWith(false);
277
277
  });
278
278
  });
279
+
280
+ describe('controlled', () => {
281
+ // Escape asks a controlled tooltip to close by calling this same handler,
282
+ // so a consumer who complies sees the request and then this echo. Pinning
283
+ // the echo here keeps the two straight.
284
+ it('echoes the close through onOpenChange when the consumer flips isOpen', async () => {
285
+ const onOpenChange = vi.fn();
286
+ const {rerender} = render(
287
+ <Tooltip content="Pinned" isOpen onOpenChange={onOpenChange} delay={0}>
288
+ <button type="button">Trigger</button>
289
+ </Tooltip>,
290
+ );
291
+ await waitFor(() => {
292
+ expect(onOpenChange).toHaveBeenCalledWith(true);
293
+ });
294
+ onOpenChange.mockClear();
295
+
296
+ rerender(
297
+ <Tooltip
298
+ content="Pinned"
299
+ isOpen={false}
300
+ onOpenChange={onOpenChange}
301
+ delay={0}>
302
+ <button type="button">Trigger</button>
303
+ </Tooltip>,
304
+ );
305
+
306
+ await waitFor(() => {
307
+ expect(onOpenChange).toHaveBeenCalledWith(false);
308
+ });
309
+ });
310
+ });
279
311
  describe('touch', () => {
280
312
  // The modality is document-global; a tap in one case must not decide the
281
313
  // next one's answer.
@@ -146,6 +146,11 @@ export interface TooltipProps {
146
146
  * - `true`: force-show the tooltip (hover/focus hide is suppressed)
147
147
  * - `false`: force-hide the tooltip
148
148
  * - `undefined`: uncontrolled — hover/focus triggers manage visibility
149
+ *
150
+ * A controlled tooltip still takes Escape when it is the top-most layer, and
151
+ * answers by calling `onOpenChange(false)` without hiding itself — closing is
152
+ * your update's decision, exactly as for a controlled Dialog. Ignore the call
153
+ * and the tip stays, and so does the press: nothing underneath dismisses.
149
154
  */
150
155
  isOpen?: boolean;
151
156
 
@@ -31,8 +31,8 @@ import {
31
31
  type LayerTouchTrigger,
32
32
  } from '../Layer/useTouchTrigger';
33
33
  import {layerAnimations} from '../Layer/layerAnimations.stylex';
34
+ import {useLayerDismissal} from '../Layer/useLayerDismissal';
34
35
  import {themeProps} from '../utils/themeProps';
35
- import {isImeKeyEvent} from '../utils/ime';
36
36
  import {
37
37
  colorVars,
38
38
  radiusVars,
@@ -144,6 +144,11 @@ export interface TooltipOptions {
144
144
  * - `true`: force-show the tooltip (hover/focus hide is suppressed)
145
145
  * - `false`: force-hide the tooltip
146
146
  * - `undefined`: uncontrolled — hover/focus triggers manage visibility
147
+ *
148
+ * A controlled tooltip still takes Escape when it is the top-most layer, and
149
+ * answers by calling `onHide` without hiding itself — closing is your
150
+ * update's decision, exactly as for a controlled Dialog. Ignore the call and
151
+ * the tip stays, and so does the press: nothing underneath dismisses.
147
152
  */
148
153
  isOpen?: boolean;
149
154
 
@@ -518,34 +523,52 @@ export function useTooltip(options: TooltipOptions = {}): TooltipReturn {
518
523
  }
519
524
  }, [isOpen, clearTimeouts, layer]);
520
525
 
521
- // Dismiss on Escape (WCAG 1.4.13 — dismissible). Uncontrolled tooltips only;
522
- // a controlled tooltip's visibility is owned by the consumer. The listener is
523
- // mounted for the lifetime of an uncontrolled tooltip rather than gated on
524
- // `layer.isOpen` (React state, which can lag a frame behind the DOM) —
525
- // `layer.hide()` self-guards and no-ops when the layer is already closed.
526
- // Guarded against IME composition-cancel.
527
- useEffect(() => {
528
- if (isOpen !== undefined) {
529
- return;
530
- }
531
- const handleKeyDown = (e: KeyboardEvent) => {
532
- if (e.key !== 'Escape') {
533
- return;
526
+ // Dismiss on Escape (WCAG 1.4.13 — dismissible) through the shared layer
527
+ // stack. A visible tip is the top-most layer, so it takes the press and
528
+ // consumes it: Escape hides the tip and leaves the dialog underneath open.
529
+ // The user presses Escape again to close that. Consuming (rather than also
530
+ // dismissing what is beneath) keeps one rule with no per-component
531
+ // exceptions, and the failure mode is one extra keystroke instead of a
532
+ // dialog closing under someone who only wanted the tip gone.
533
+ //
534
+ // A controlled tooltip stays on the stack and takes the press like any other
535
+ // layer, but answers it by reporting instead of hiding: `isOpen` is the
536
+ // consumer's value, so only their update may change it. Same contract as a
537
+ // controlled Dialog.
538
+ useLayerDismissal({
539
+ // Registered for the hook's lifetime rather than gated on `layer.isOpen`:
540
+ // that state can lag a frame behind the DOM, so a press arriving right after
541
+ // the layer appears would find nothing registered. Because this layer
542
+ // CONSUMES the press, a stale registration would be worse than a missed one
543
+ // — it would silently eat Escapes meant for the dialog underneath — so
544
+ // presence is answered from the DOM at press time instead of from state.
545
+ isActive: true,
546
+ isPresent: () => {
547
+ const el =
548
+ typeof document === 'undefined'
549
+ ? null
550
+ : document.getElementById(layer.id);
551
+ if (el == null) {
552
+ return false;
534
553
  }
535
- if (isImeKeyEvent(e)) {
536
- // Ignore Escape that is committing/cancelling an IME composition;
537
- // see utils/ime.ts for why.
538
- return;
554
+ try {
555
+ return el.matches(':popover-open');
556
+ } catch {
557
+ // Browsers without the Popover API (and some test environments) cannot
558
+ // answer the selector; fall back to the hook's own state.
559
+ return layer.isOpen;
539
560
  }
561
+ },
562
+ onDismiss: () => {
540
563
  clearTimeouts();
541
564
  clearTapOpen();
565
+ if (isOpen !== undefined) {
566
+ onHide?.();
567
+ return;
568
+ }
542
569
  layer.hide();
543
- };
544
- document.addEventListener('keydown', handleKeyDown);
545
- return () => {
546
- document.removeEventListener('keydown', handleKeyDown);
547
- };
548
- }, [isOpen, layer, clearTimeouts, clearTapOpen]);
570
+ },
571
+ });
549
572
 
550
573
  // Render function that wraps layer.render with tooltip styling
551
574
  const renderTooltip = useCallback(
@@ -34,7 +34,8 @@ import {Link} from '../Link';
34
34
  import {Icon} from '../Icon';
35
35
  import {useLinkComponent} from '../Link/useLinkComponent';
36
36
  import type {LinkComponentType} from '../Link/types';
37
- import {mergeProps, mergeRefs} from '../utils';
37
+ import {mergeProps} from '../utils';
38
+ import {useMergedRefs} from '../hooks/useMergedRefs';
38
39
  import type {BaseProps} from '../BaseProps';
39
40
  import {useMenuHover} from '../hooks/useMenuHover';
40
41
  import {NavHeadingCloseContext} from '../NavMenu/NavMenuContext';
@@ -53,7 +54,7 @@ const styles = stylex.create({
53
54
  minHeight: spacingVars['--spacing-8'],
54
55
  paddingInlineStart: {
55
56
  default: spacingVars['--spacing-2'],
56
- ':has(.astryx-navicon)': 0,
57
+ ':has(.astryx-nav-icon)': 0,
57
58
  },
58
59
  paddingInlineEnd: spacingVars['--spacing-2'],
59
60
  paddingBlock: 0,
@@ -189,7 +190,7 @@ const styles = stylex.create({
189
190
  minHeight: spacingVars['--spacing-8'],
190
191
  paddingInlineStart: {
191
192
  default: spacingVars['--spacing-2'],
192
- ':has(.astryx-navicon)': 0,
193
+ ':has(.astryx-nav-icon)': 0,
193
194
  },
194
195
  paddingInlineEnd: spacingVars['--spacing-2'],
195
196
  paddingBlock: 0,
@@ -363,7 +364,7 @@ export function TopNavHeading({
363
364
  // setTriggerEl belongs on the chevron button, not this root: it is the
364
365
  // focus-restore target and a <div> cannot take focus. triggerRef stays here
365
366
  // because the panel anchors to the whole heading.
366
- const setRef = mergeRefs<HTMLElement>(
367
+ const setRef = useMergedRefs<HTMLElement>(
367
368
  rootRef,
368
369
  ref,
369
370
  menu ? popover.triggerRef : undefined,
@@ -53,7 +53,7 @@ import {usePopover} from '../Popover/usePopover';
53
53
  import {useMenuHover} from '../hooks/useMenuHover';
54
54
  import {Grid} from '../Grid/Grid';
55
55
  import {Icon} from '../Icon';
56
- import {mergeProps, mergeRefs} from '../utils';
56
+ import {mergeProps} from '../utils';
57
57
  import type {BaseProps} from '../BaseProps';
58
58
  import {navItemStyles} from '../NavItem/navItemStyles.stylex';
59
59
  import {useTopNavSlot} from './TopNavContext';
@@ -61,6 +61,7 @@ import {useTopNavRenderMode} from './TopNavRenderContext';
61
61
  import {themeProps} from '../utils/themeProps';
62
62
  import {focusOutlineProps} from '../utils/focusOutline.stylex';
63
63
 
64
+ import {useMergedRefs} from '../hooks/useMergedRefs';
64
65
  // =============================================================================
65
66
  // Styles
66
67
  // =============================================================================
@@ -451,7 +452,7 @@ function DefaultMegaMenu({
451
452
  return (
452
453
  <>
453
454
  <button
454
- ref={mergeRefs(triggerButtonRef, setTriggerEl, ref)}
455
+ ref={useMergedRefs(triggerButtonRef, setTriggerEl, ref)}
455
456
  type="button"
456
457
  {...popover.triggerProps}
457
458
  {...hoverTriggerProps}
@@ -29,7 +29,8 @@ import {useMenuHover} from '../hooks/useMenuHover';
29
29
  import {useListFocus} from '../hooks/useListFocus';
30
30
  import {useTypeahead} from '../hooks/useTypeahead';
31
31
  import {Icon} from '../Icon';
32
- import {mergeProps, mergeRefs} from '../utils';
32
+ import {mergeProps} from '../utils';
33
+ import {useMergedRefs} from '../hooks/useMergedRefs';
33
34
  import type {BaseProps} from '../BaseProps';
34
35
  import {navItemStyles} from '../NavItem/navItemStyles.stylex';
35
36
  import {useTopNavSlot} from './TopNavContext';
@@ -361,7 +362,7 @@ export function TopNavMenu({
361
362
  popoverId: popover.id,
362
363
  });
363
364
 
364
- const setTriggerRef = mergeRefs<HTMLButtonElement>(
365
+ const setTriggerRef = useMergedRefs<HTMLButtonElement>(
365
366
  triggerButtonRef,
366
367
  popover.triggerRef,
367
368
  setTriggerEl,
@@ -426,7 +427,7 @@ export function TopNavMenu({
426
427
 
427
428
  // Menu container carries both the hover hook's ref (for its open/close
428
429
  // focus management) and the list-focus ref (for roving tabindex/typeahead).
429
- const setMenuRef = mergeRefs<HTMLDivElement>(menuRef, listRef);
430
+ const setMenuRef = useMergedRefs<HTMLDivElement>(menuRef, listRef);
430
431
 
431
432
  // Mobile bar: hide menus entirely
432
433
  if (renderMode === 'mobile-bar') {
@@ -60,6 +60,11 @@ export const docs = {
60
60
  description: 'Maximum dropdown items to display.',
61
61
  default: '10',
62
62
  },
63
+ {
64
+ name: 'menuWidth',
65
+ type: 'number',
66
+ description: 'Fixed dropdown width in pixels. The menu never shrinks below its anchor width.',
67
+ },
63
68
  {
64
69
  name: 'emptySearchResultsText',
65
70
  type: 'string',
@@ -169,6 +174,11 @@ export const docsZh = {
169
174
  description: '下拉列表显示的最大项目数。',
170
175
  default: '10',
171
176
  },
177
+ {
178
+ name: 'menuWidth',
179
+ type: 'number',
180
+ description: '下拉菜单的固定像素宽度。菜单不会小于其锚点宽度。',
181
+ },
172
182
  {
173
183
  name: 'emptySearchResultsText',
174
184
  type: 'string',
@@ -253,6 +263,7 @@ export const docsDense = {
253
263
  placeholder: 'Input placeholder.',
254
264
  hasEntriesOnFocus: 'Bootstrap results on focus.',
255
265
  maxMenuItems: 'Max dropdown items.',
266
+ menuWidth: 'Fixed dropdown width in pixels.',
256
267
  emptySearchResultsText: 'Text when no results.',
257
268
  isDisabled: 'Whether input disabled.',
258
269
  hasAutoFocus: 'Auto-focus on mount.',