@astryxdesign/core 0.1.8 → 0.1.9-canary.02ef052

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 (728) hide show
  1. package/CHANGELOG.md +100 -0
  2. package/dist/AppShell/AppShell.d.ts.map +1 -1
  3. package/dist/AppShell/AppShell.js +6 -2
  4. package/dist/AppShell/AppShellMobileContext.d.ts +8 -0
  5. package/dist/AppShell/AppShellMobileContext.d.ts.map +1 -1
  6. package/dist/Avatar/Avatar.d.ts +58 -3
  7. package/dist/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/Avatar/Avatar.js +240 -53
  9. package/dist/Avatar/AvatarStatusDot.d.ts +35 -5
  10. package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
  11. package/dist/Avatar/AvatarStatusDot.js +144 -19
  12. package/dist/AvatarGroup/AvatarGroup.d.ts +7 -1
  13. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  14. package/dist/AvatarGroup/AvatarGroup.js +58 -6
  15. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  16. package/dist/AvatarGroup/AvatarGroupOverflow.js +1 -0
  17. package/dist/Banner/Banner.d.ts +9 -1
  18. package/dist/Banner/Banner.d.ts.map +1 -1
  19. package/dist/Banner/Banner.js +33 -4
  20. package/dist/Breadcrumbs/BreadcrumbItem.d.ts +31 -2
  21. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  22. package/dist/Breadcrumbs/BreadcrumbItem.js +215 -6
  23. package/dist/Breadcrumbs/index.d.ts +6 -0
  24. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  25. package/dist/Breadcrumbs/index.js +10 -1
  26. package/dist/Button/Button.d.ts +8 -2
  27. package/dist/Button/Button.d.ts.map +1 -1
  28. package/dist/Button/Button.js +33 -4
  29. package/dist/ButtonGroup/ButtonGroup.d.ts +9 -1
  30. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  31. package/dist/ButtonGroup/ButtonGroup.js +30 -1
  32. package/dist/Calendar/Calendar.d.ts.map +1 -1
  33. package/dist/Calendar/Calendar.js +80 -11
  34. package/dist/Calendar/dayCellUtils.d.ts +4 -4
  35. package/dist/Calendar/dayCellUtils.js +3 -3
  36. package/dist/Calendar/styles.d.ts +30 -31
  37. package/dist/Calendar/styles.d.ts.map +1 -1
  38. package/dist/Calendar/styles.js +30 -31
  39. package/dist/Card/Card.d.ts +8 -2
  40. package/dist/Card/Card.d.ts.map +1 -1
  41. package/dist/Card/Card.js +28 -2
  42. package/dist/Carousel/Carousel.d.ts +4 -1
  43. package/dist/Carousel/Carousel.d.ts.map +1 -1
  44. package/dist/Carousel/Carousel.js +46 -16
  45. package/dist/Chat/ChatComposer.d.ts +8 -0
  46. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  47. package/dist/Chat/ChatComposer.js +46 -7
  48. package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
  49. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  50. package/dist/Chat/ChatComposerDrawer.js +11 -1
  51. package/dist/Chat/ChatComposerInput.d.ts +20 -3
  52. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  53. package/dist/Chat/ChatComposerInput.js +36 -4
  54. package/dist/Chat/ChatContext.d.ts +33 -0
  55. package/dist/Chat/ChatContext.d.ts.map +1 -1
  56. package/dist/Chat/ChatContext.js +16 -2
  57. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  58. package/dist/Chat/ChatDictationButton.js +4 -2
  59. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  60. package/dist/Chat/ChatLayout.js +4 -4
  61. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  62. package/dist/Chat/ChatLayoutScrollButton.js +4 -4
  63. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  64. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  65. package/dist/Chat/ChatSendButton.js +7 -1
  66. package/dist/Chat/ChatToolCalls.d.ts +5 -1
  67. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  68. package/dist/Chat/ChatToolCalls.js +27 -11
  69. package/dist/Chat/index.d.ts +2 -1
  70. package/dist/Chat/index.d.ts.map +1 -1
  71. package/dist/Chat/index.js +1 -1
  72. package/dist/Chat/useChatStreamScroll.d.ts +2 -1
  73. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  74. package/dist/Chat/useChatStreamScroll.js +22 -8
  75. package/dist/Chat/useSpeechRecognition.d.ts +0 -1
  76. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  77. package/dist/Chat/useSpeechRecognition.js +1 -1
  78. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  79. package/dist/Chat/useTriggerMenu.js +2 -2
  80. package/dist/CheckboxInput/CheckboxInput.js +5 -5
  81. package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
  82. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  83. package/dist/CheckboxList/CheckboxListItem.js +11 -1
  84. package/dist/Citation/Citation.d.ts +22 -1
  85. package/dist/Citation/Citation.d.ts.map +1 -1
  86. package/dist/Citation/Citation.js +20 -6
  87. package/dist/ClickableCard/ClickableCard.d.ts +9 -2
  88. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  89. package/dist/ClickableCard/ClickableCard.js +5 -2
  90. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  91. package/dist/CodeBlock/CodeBlock.js +22 -9
  92. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  93. package/dist/Collapsible/Collapsible.js +3 -1
  94. package/dist/CommandPalette/CommandPalette.d.ts +2 -2
  95. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  96. package/dist/CommandPalette/CommandPalette.js +45 -4
  97. package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
  98. package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
  99. package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
  100. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  101. package/dist/CommandPalette/CommandPaletteInput.js +6 -1
  102. package/dist/CommandPalette/CommandPaletteItem.js +1 -1
  103. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  104. package/dist/ContextMenu/ContextMenu.js +14 -5
  105. package/dist/ContextMenu/index.d.ts +1 -0
  106. package/dist/ContextMenu/index.d.ts.map +1 -1
  107. package/dist/ContextMenu/index.js +3 -1
  108. package/dist/DateInput/DateInput.d.ts +56 -2
  109. package/dist/DateInput/DateInput.d.ts.map +1 -1
  110. package/dist/DateInput/DateInput.js +59 -21
  111. package/dist/DateInput/index.d.ts +1 -1
  112. package/dist/DateInput/index.d.ts.map +1 -1
  113. package/dist/DateRangeInput/DateRangeInput.d.ts +10 -2
  114. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  115. package/dist/DateRangeInput/DateRangeInput.js +23 -20
  116. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  117. package/dist/DateTimeInput/DateTimeInput.js +33 -19
  118. package/dist/Dialog/Dialog.d.ts +3 -0
  119. package/dist/Dialog/Dialog.d.ts.map +1 -1
  120. package/dist/Dialog/Dialog.js +57 -6
  121. package/dist/Dialog/DialogContext.d.ts +7 -0
  122. package/dist/Dialog/DialogContext.d.ts.map +1 -1
  123. package/dist/Dialog/DialogContext.js +2 -2
  124. package/dist/Dialog/DialogHeader.d.ts +5 -2
  125. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  126. package/dist/Dialog/DialogHeader.js +6 -1
  127. package/dist/Divider/Divider.js +1 -1
  128. package/dist/DropdownMenu/DropdownMenu.d.ts +6 -0
  129. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  130. package/dist/DropdownMenu/DropdownMenu.js +22 -5
  131. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
  132. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  133. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +5 -3
  134. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  135. package/dist/DropdownMenu/DropdownMenuItem.js +5 -2
  136. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
  137. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
  138. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
  139. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  140. package/dist/DropdownMenu/DropdownMenuRadioItem.js +4 -1
  141. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +104 -0
  142. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -0
  143. package/dist/DropdownMenu/DropdownMenuSubMenu.js +427 -0
  144. package/dist/DropdownMenu/index.d.ts +10 -0
  145. package/dist/DropdownMenu/index.d.ts.map +1 -1
  146. package/dist/DropdownMenu/index.js +13 -0
  147. package/dist/DropdownMenu/menuItemHover.d.ts +23 -0
  148. package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -0
  149. package/dist/DropdownMenu/menuItemHover.js +33 -0
  150. package/dist/DropdownMenu/menuItemRoles.d.ts +8 -0
  151. package/dist/DropdownMenu/menuItemRoles.d.ts.map +1 -1
  152. package/dist/DropdownMenu/menuItemRoles.js +10 -1
  153. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  154. package/dist/DropdownMenu/renderDropdownItems.js +21 -6
  155. package/dist/Field/Field.d.ts +3 -1
  156. package/dist/Field/Field.d.ts.map +1 -1
  157. package/dist/Field/Field.js +6 -4
  158. package/dist/Field/FieldLabel.d.ts +1 -1
  159. package/dist/Field/FieldLabel.d.ts.map +1 -1
  160. package/dist/Field/FieldLabel.js +43 -16
  161. package/dist/Field/inputStyles.stylex.d.ts +1 -0
  162. package/dist/Field/inputStyles.stylex.d.ts.map +1 -1
  163. package/dist/Field/inputStyles.stylex.js +1 -0
  164. package/dist/FieldStatus/FieldStatus.d.ts +18 -0
  165. package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
  166. package/dist/FieldStatus/FieldStatus.js +60 -6
  167. package/dist/FileInput/FileInput.d.ts +10 -2
  168. package/dist/FileInput/FileInput.d.ts.map +1 -1
  169. package/dist/FileInput/FileInput.js +54 -35
  170. package/dist/HoverCard/HoverCard.d.ts +9 -1
  171. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  172. package/dist/HoverCard/HoverCard.js +2 -0
  173. package/dist/HoverCard/useHoverCard.d.ts +8 -0
  174. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  175. package/dist/HoverCard/useHoverCard.js +17 -6
  176. package/dist/Icon/Icon.d.ts +22 -3
  177. package/dist/Icon/Icon.d.ts.map +1 -1
  178. package/dist/Icon/Icon.js +19 -3
  179. package/dist/Item/Item.d.ts +6 -1
  180. package/dist/Item/Item.d.ts.map +1 -1
  181. package/dist/Item/Item.js +22 -1
  182. package/dist/Layer/useLayer.d.ts +6 -0
  183. package/dist/Layer/useLayer.d.ts.map +1 -1
  184. package/dist/Layer/useLayer.js +2 -0
  185. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  186. package/dist/Lightbox/Lightbox.js +19 -13
  187. package/dist/Markdown/Markdown.d.ts.map +1 -1
  188. package/dist/Markdown/Markdown.js +7 -0
  189. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  190. package/dist/MobileNav/MobileNav.js +6 -1
  191. package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
  192. package/dist/MobileNav/MobileNavToggle.js +4 -0
  193. package/dist/MultiSelector/MultiSelector.d.ts +9 -1
  194. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  195. package/dist/MultiSelector/MultiSelector.js +104 -50
  196. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  197. package/dist/MultiSelector/hooks.js +16 -0
  198. package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
  199. package/dist/NumberInput/NumberInput.d.ts +10 -2
  200. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  201. package/dist/NumberInput/NumberInput.js +22 -17
  202. package/dist/Outline/Outline.d.ts +0 -1
  203. package/dist/Outline/Outline.d.ts.map +1 -1
  204. package/dist/Outline/Outline.js +0 -1
  205. package/dist/OverflowList/OverflowList.d.ts +20 -3
  206. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  207. package/dist/OverflowList/OverflowList.js +29 -4
  208. package/dist/Pagination/Pagination.d.ts.map +1 -1
  209. package/dist/Pagination/Pagination.js +11 -3
  210. package/dist/Popover/Popover.d.ts.map +1 -1
  211. package/dist/Popover/Popover.js +3 -2
  212. package/dist/Popover/usePopover.d.ts.map +1 -1
  213. package/dist/Popover/usePopover.js +3 -9
  214. package/dist/PowerSearch/PowerSearch.d.ts +9 -2
  215. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  216. package/dist/PowerSearch/PowerSearch.js +2 -0
  217. package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
  218. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  219. package/dist/RadioList/RadioList.d.ts +2 -2
  220. package/dist/RadioList/RadioListItem.js +4 -4
  221. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
  222. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  223. package/dist/SegmentedControl/SegmentedControlItem.js +2 -1
  224. package/dist/SelectableCard/SelectableCard.d.ts +9 -2
  225. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  226. package/dist/SelectableCard/SelectableCard.js +16 -13
  227. package/dist/Selector/Selector.d.ts +8 -0
  228. package/dist/Selector/Selector.d.ts.map +1 -1
  229. package/dist/Selector/Selector.js +65 -19
  230. package/dist/Selector/hooks.d.ts.map +1 -1
  231. package/dist/Selector/hooks.js +16 -0
  232. package/dist/SideNav/SideNav.d.ts.map +1 -1
  233. package/dist/SideNav/SideNav.js +5 -5
  234. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  235. package/dist/SideNav/SideNavCollapseButton.js +13 -10
  236. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  237. package/dist/SideNav/SideNavHeading.js +21 -8
  238. package/dist/SideNav/SideNavItem.d.ts +1 -1
  239. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  240. package/dist/SideNav/SideNavItem.js +12 -10
  241. package/dist/Slider/Slider.d.ts.map +1 -1
  242. package/dist/Slider/Slider.js +106 -36
  243. package/dist/Stack/stack.stylex.d.ts +9 -9
  244. package/dist/Switch/Switch.d.ts +8 -1
  245. package/dist/Switch/Switch.d.ts.map +1 -1
  246. package/dist/Switch/Switch.js +160 -91
  247. package/dist/TabList/Tab.js +2 -2
  248. package/dist/TabList/TabMenu.js +1 -1
  249. package/dist/Table/BaseTable.d.ts.map +1 -1
  250. package/dist/Table/BaseTable.js +33 -6
  251. package/dist/Table/TableCell.js +3 -3
  252. package/dist/Table/TableHeaderCell.js +3 -3
  253. package/dist/Table/index.d.ts +2 -0
  254. package/dist/Table/index.d.ts.map +1 -1
  255. package/dist/Table/index.js +1 -0
  256. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  257. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +15 -11
  258. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  259. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +36 -26
  260. package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
  261. package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
  262. package/dist/Table/plugins/rowStatus/index.js +3 -0
  263. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
  264. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
  265. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
  266. package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
  267. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  268. package/dist/Table/plugins/selection/useTableSelection.js +7 -1
  269. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
  270. package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
  271. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  272. package/dist/Table/plugins/tree/useTableTreeData.js +105 -12
  273. package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
  274. package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
  275. package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
  276. package/dist/Table/types.d.ts +32 -0
  277. package/dist/Table/types.d.ts.map +1 -1
  278. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  279. package/dist/Table/useBaseTablePlugins.js +5 -3
  280. package/dist/TextArea/TextArea.d.ts +10 -1
  281. package/dist/TextArea/TextArea.d.ts.map +1 -1
  282. package/dist/TextArea/TextArea.js +18 -19
  283. package/dist/TextInput/TextInput.d.ts +10 -2
  284. package/dist/TextInput/TextInput.d.ts.map +1 -1
  285. package/dist/TextInput/TextInput.js +20 -17
  286. package/dist/Thumbnail/Thumbnail.d.ts +26 -5
  287. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  288. package/dist/Thumbnail/Thumbnail.js +97 -54
  289. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
  290. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
  291. package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
  292. package/dist/TimeInput/TimeInput.d.ts +10 -2
  293. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  294. package/dist/TimeInput/TimeInput.js +32 -21
  295. package/dist/Timestamp/Timestamp.d.ts +3 -1
  296. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  297. package/dist/Timestamp/Timestamp.js +8 -6
  298. package/dist/Toast/useToast.d.ts.map +1 -1
  299. package/dist/Toast/useToast.js +2 -5
  300. package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
  301. package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
  302. package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
  303. package/dist/Token/Token.d.ts +30 -3
  304. package/dist/Token/Token.d.ts.map +1 -1
  305. package/dist/Token/Token.js +17 -2
  306. package/dist/Token/index.d.ts +1 -1
  307. package/dist/Token/index.d.ts.map +1 -1
  308. package/dist/Tokenizer/Tokenizer.d.ts +10 -3
  309. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  310. package/dist/Tokenizer/Tokenizer.js +20 -6
  311. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  312. package/dist/Tooltip/useTooltip.js +17 -1
  313. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  314. package/dist/TopNav/TopNavHeading.js +18 -8
  315. package/dist/TopNav/TopNavMegaMenu.js +10 -4
  316. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
  317. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  318. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
  319. package/dist/TopNav/TopNavMenu.d.ts +2 -1
  320. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  321. package/dist/TopNav/TopNavMenu.js +68 -6
  322. package/dist/TreeList/TreeList.d.ts +12 -3
  323. package/dist/TreeList/TreeList.d.ts.map +1 -1
  324. package/dist/TreeList/TreeList.js +3 -0
  325. package/dist/TreeList/TreeListBranches.d.ts +5 -0
  326. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  327. package/dist/TreeList/TreeListBranches.js +18 -10
  328. package/dist/TreeList/TreeListItem.d.ts +8 -2
  329. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  330. package/dist/TreeList/TreeListItem.js +59 -21
  331. package/dist/TreeList/TreeListTypes.d.ts +25 -1
  332. package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
  333. package/dist/TreeList/index.d.ts +2 -2
  334. package/dist/TreeList/index.d.ts.map +1 -1
  335. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  336. package/dist/Typeahead/BaseTypeahead.js +20 -11
  337. package/dist/Typeahead/Typeahead.d.ts +9 -2
  338. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  339. package/dist/Typeahead/Typeahead.js +3 -1
  340. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  341. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  342. package/dist/Typeahead/TypeaheadItem.js +20 -10
  343. package/dist/astryx.css +61 -39
  344. package/dist/astryx.umd.js +53 -53
  345. package/dist/astryx.umd.js.map +4 -4
  346. package/dist/authoring/doc.d.ts.map +1 -1
  347. package/dist/docs-types.d.ts +8 -0
  348. package/dist/docs-types.d.ts.map +1 -1
  349. package/dist/hooks/computeOverflow.d.ts +47 -0
  350. package/dist/hooks/computeOverflow.d.ts.map +1 -0
  351. package/dist/hooks/computeOverflow.js +213 -0
  352. package/dist/hooks/index.d.ts +3 -0
  353. package/dist/hooks/index.d.ts.map +1 -1
  354. package/dist/hooks/index.js +3 -1
  355. package/dist/hooks/isRtlElement.d.ts +18 -0
  356. package/dist/hooks/isRtlElement.d.ts.map +1 -0
  357. package/dist/hooks/isRtlElement.js +27 -0
  358. package/dist/hooks/useDevWarning.d.ts +18 -0
  359. package/dist/hooks/useDevWarning.d.ts.map +1 -0
  360. package/dist/hooks/useDevWarning.js +49 -0
  361. package/dist/hooks/useGridFocus.d.ts +6 -1
  362. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  363. package/dist/hooks/useGridFocus.js +12 -9
  364. package/dist/hooks/useInputStatusIcon.d.ts +38 -0
  365. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -0
  366. package/dist/hooks/useInputStatusIcon.js +158 -0
  367. package/dist/hooks/useListFocus.d.ts +39 -1
  368. package/dist/hooks/useListFocus.d.ts.map +1 -1
  369. package/dist/hooks/useListFocus.js +54 -9
  370. package/dist/hooks/useOverflow.d.ts +19 -0
  371. package/dist/hooks/useOverflow.d.ts.map +1 -1
  372. package/dist/hooks/useOverflow.js +36 -25
  373. package/dist/i18n/InternationalizationContext.d.ts +1 -0
  374. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  375. package/dist/i18n/InternationalizationContext.js +3 -0
  376. package/dist/i18n/InternationalizationProvider.d.ts +8 -1
  377. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  378. package/dist/i18n/InternationalizationProvider.js +5 -1
  379. package/dist/i18n/getLocaleDirection.d.ts +18 -0
  380. package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
  381. package/dist/i18n/getLocaleDirection.js +29 -0
  382. package/dist/i18n/index.d.ts +6 -0
  383. package/dist/i18n/index.d.ts.map +1 -1
  384. package/dist/i18n/index.js +7 -1
  385. package/dist/i18n/resolve.d.ts.map +1 -1
  386. package/dist/i18n/resolve.js +7 -18
  387. package/dist/i18n/useDirection.d.ts +2 -0
  388. package/dist/i18n/useDirection.d.ts.map +1 -0
  389. package/dist/i18n/useDirection.js +27 -0
  390. package/dist/theme/Theme.d.ts.map +1 -1
  391. package/dist/theme/Theme.js +2 -7
  392. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  393. package/dist/theme/derivedVarRegistry.js +13 -0
  394. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  395. package/dist/theme/generateThemeRules.js +51 -0
  396. package/dist/theme/hct.d.ts +0 -1
  397. package/dist/theme/hct.d.ts.map +1 -1
  398. package/dist/theme/hct.js +1 -1
  399. package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
  400. package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
  401. package/dist/utils/devWarning.d.ts +42 -0
  402. package/dist/utils/devWarning.d.ts.map +1 -0
  403. package/dist/utils/devWarning.js +88 -0
  404. package/dist/utils/index.d.ts +4 -1
  405. package/dist/utils/index.d.ts.map +1 -1
  406. package/dist/utils/index.js +4 -2
  407. package/dist/utils/plainDate.d.ts +30 -0
  408. package/dist/utils/plainDate.d.ts.map +1 -1
  409. package/dist/utils/plainDate.js +65 -3
  410. package/dist/utils/rtlStyles.d.ts +24 -0
  411. package/dist/utils/rtlStyles.d.ts.map +1 -0
  412. package/dist/utils/rtlStyles.js +27 -0
  413. package/dist/utils/types.d.ts +13 -0
  414. package/dist/utils/types.d.ts.map +1 -1
  415. package/locales/en.json +104 -0
  416. package/locales/fr-FR.json +14 -0
  417. package/locales/pseudo.json +78 -0
  418. package/package.json +6 -1
  419. package/src/AppShell/AppShell.tsx +6 -0
  420. package/src/AppShell/AppShellMobileContext.tsx +8 -0
  421. package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
  422. package/src/Avatar/Avatar.doc.mjs +64 -5
  423. package/src/Avatar/Avatar.test.tsx +374 -1
  424. package/src/Avatar/Avatar.tsx +367 -69
  425. package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
  426. package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
  427. package/src/Avatar/AvatarStatusDot.tsx +180 -21
  428. package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
  429. package/src/AvatarGroup/AvatarGroup.test.tsx +141 -1
  430. package/src/AvatarGroup/AvatarGroup.tsx +58 -3
  431. package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
  432. package/src/Banner/Banner.doc.mjs +9 -0
  433. package/src/Banner/Banner.test.tsx +30 -0
  434. package/src/Banner/Banner.tsx +53 -9
  435. package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
  436. package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
  437. package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
  438. package/src/Breadcrumbs/Breadcrumbs.test.tsx +335 -2
  439. package/src/Breadcrumbs/index.ts +31 -0
  440. package/src/Button/Button.doc.mjs +9 -4
  441. package/src/Button/Button.test.tsx +49 -0
  442. package/src/Button/Button.tsx +27 -3
  443. package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
  444. package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
  445. package/src/ButtonGroup/ButtonGroup.tsx +32 -0
  446. package/src/Calendar/Calendar.doc.mjs +12 -1
  447. package/src/Calendar/Calendar.test.tsx +362 -19
  448. package/src/Calendar/Calendar.tsx +111 -32
  449. package/src/Calendar/dayCellUtils.test.ts +23 -18
  450. package/src/Calendar/dayCellUtils.ts +3 -3
  451. package/src/Calendar/styles.ts +33 -39
  452. package/src/Card/Card.doc.mjs +9 -0
  453. package/src/Card/Card.test.tsx +21 -3
  454. package/src/Card/Card.tsx +35 -2
  455. package/src/Carousel/Carousel.doc.mjs +1 -0
  456. package/src/Carousel/Carousel.test.tsx +53 -0
  457. package/src/Carousel/Carousel.tsx +59 -10
  458. package/src/Chat/ChatComposer.doc.mjs +12 -3
  459. package/src/Chat/ChatComposer.test.tsx +115 -0
  460. package/src/Chat/ChatComposer.tsx +73 -9
  461. package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
  462. package/src/Chat/ChatComposerDrawer.tsx +11 -1
  463. package/src/Chat/ChatComposerInput.doc.mjs +7 -0
  464. package/src/Chat/ChatComposerInput.test.tsx +103 -0
  465. package/src/Chat/ChatComposerInput.tsx +51 -5
  466. package/src/Chat/ChatContext.tsx +37 -10
  467. package/src/Chat/ChatDictationButton.tsx +11 -2
  468. package/src/Chat/ChatLayout.tsx +7 -5
  469. package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
  470. package/src/Chat/ChatMessageMetadata.tsx +1 -2
  471. package/src/Chat/ChatSendButton.tsx +11 -1
  472. package/src/Chat/ChatToolCalls.test.tsx +64 -0
  473. package/src/Chat/ChatToolCalls.tsx +33 -5
  474. package/src/Chat/index.ts +5 -1
  475. package/src/Chat/useChatStreamScroll.test.tsx +49 -0
  476. package/src/Chat/useChatStreamScroll.ts +27 -10
  477. package/src/Chat/useSpeechRecognition.ts +1 -1
  478. package/src/Chat/useTriggerMenu.tsx +4 -2
  479. package/src/CheckboxInput/CheckboxInput.doc.mjs +6 -0
  480. package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
  481. package/src/CheckboxInput/CheckboxInput.tsx +5 -5
  482. package/src/CheckboxList/CheckboxList.doc.mjs +6 -0
  483. package/src/CheckboxList/CheckboxList.test.tsx +81 -3
  484. package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
  485. package/src/CheckboxList/CheckboxListItem.tsx +41 -5
  486. package/src/Citation/Citation.doc.mjs +4 -3
  487. package/src/Citation/Citation.test.tsx +97 -0
  488. package/src/Citation/Citation.tsx +43 -11
  489. package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
  490. package/src/ClickableCard/ClickableCard.test.tsx +34 -0
  491. package/src/ClickableCard/ClickableCard.tsx +13 -3
  492. package/src/CodeBlock/CodeBlock.test.tsx +56 -0
  493. package/src/CodeBlock/CodeBlock.tsx +45 -10
  494. package/src/Collapsible/Collapsible.doc.mjs +1 -0
  495. package/src/Collapsible/Collapsible.test.tsx +7 -0
  496. package/src/Collapsible/Collapsible.tsx +16 -6
  497. package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
  498. package/src/CommandPalette/CommandPalette.test.tsx +95 -1
  499. package/src/CommandPalette/CommandPalette.tsx +44 -3
  500. package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
  501. package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
  502. package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
  503. package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
  504. package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
  505. package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
  506. package/src/ContextMenu/ContextMenu.test.tsx +235 -0
  507. package/src/ContextMenu/ContextMenu.tsx +13 -11
  508. package/src/ContextMenu/index.ts +5 -0
  509. package/src/DateInput/DateInput.doc.mjs +41 -0
  510. package/src/DateInput/DateInput.test.tsx +338 -0
  511. package/src/DateInput/DateInput.tsx +119 -32
  512. package/src/DateInput/index.ts +1 -0
  513. package/src/DateRangeInput/DateRangeInput.doc.mjs +16 -0
  514. package/src/DateRangeInput/DateRangeInput.test.tsx +140 -0
  515. package/src/DateRangeInput/DateRangeInput.tsx +42 -30
  516. package/src/DateTimeInput/DateTimeInput.doc.mjs +22 -1
  517. package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
  518. package/src/DateTimeInput/DateTimeInput.tsx +58 -41
  519. package/src/Dialog/Dialog.doc.mjs +2 -2
  520. package/src/Dialog/Dialog.test.tsx +77 -4
  521. package/src/Dialog/Dialog.tsx +89 -5
  522. package/src/Dialog/DialogContext.ts +9 -2
  523. package/src/Dialog/DialogHeader.doc.mjs +2 -2
  524. package/src/Dialog/DialogHeader.tsx +9 -2
  525. package/src/Divider/Divider.tsx +2 -2
  526. package/src/DropdownMenu/DropdownMenu.test.tsx +229 -0
  527. package/src/DropdownMenu/DropdownMenu.tsx +31 -12
  528. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +9 -4
  529. package/src/DropdownMenu/DropdownMenuItem.tsx +9 -3
  530. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
  531. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +8 -2
  532. package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +88 -0
  533. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +635 -0
  534. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +553 -0
  535. package/src/DropdownMenu/index.ts +16 -0
  536. package/src/DropdownMenu/menuItemHover.ts +39 -0
  537. package/src/DropdownMenu/menuItemRoles.ts +9 -0
  538. package/src/DropdownMenu/renderDropdownItems.tsx +29 -15
  539. package/src/Field/Field.test.tsx +57 -12
  540. package/src/Field/Field.tsx +20 -14
  541. package/src/Field/FieldLabel.tsx +9 -1
  542. package/src/Field/inputStyles.stylex.ts +2 -0
  543. package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
  544. package/src/FieldStatus/FieldStatus.test.tsx +150 -40
  545. package/src/FieldStatus/FieldStatus.tsx +69 -5
  546. package/src/FileInput/FileInput.doc.mjs +23 -2
  547. package/src/FileInput/FileInput.test.tsx +135 -12
  548. package/src/FileInput/FileInput.tsx +65 -51
  549. package/src/HoverCard/HoverCard.doc.mjs +13 -0
  550. package/src/HoverCard/HoverCard.test.tsx +21 -2
  551. package/src/HoverCard/HoverCard.tsx +11 -0
  552. package/src/HoverCard/useHoverCard.doc.mjs +2 -0
  553. package/src/HoverCard/useHoverCard.tsx +39 -5
  554. package/src/Icon/Icon.doc.mjs +16 -2
  555. package/src/Icon/Icon.test.tsx +89 -0
  556. package/src/Icon/Icon.tsx +58 -5
  557. package/src/IconButton/IconButton.doc.mjs +8 -0
  558. package/src/IconButton/IconButton.test.tsx +15 -18
  559. package/src/Item/Item.test.tsx +40 -18
  560. package/src/Item/Item.tsx +38 -2
  561. package/src/Layer/useLayer.tsx +8 -0
  562. package/src/Lightbox/Lightbox.tsx +15 -7
  563. package/src/List/List.test.tsx +9 -8
  564. package/src/Markdown/Markdown.test.tsx +21 -0
  565. package/src/Markdown/Markdown.tsx +4 -0
  566. package/src/MobileNav/MobileNav.tsx +12 -1
  567. package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
  568. package/src/MobileNav/MobileNavToggle.tsx +9 -1
  569. package/src/MultiSelector/MultiSelector.doc.mjs +24 -2
  570. package/src/MultiSelector/MultiSelector.test.tsx +498 -3
  571. package/src/MultiSelector/MultiSelector.tsx +149 -65
  572. package/src/MultiSelector/hooks.ts +17 -0
  573. package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
  574. package/src/NumberInput/NumberInput.doc.mjs +21 -0
  575. package/src/NumberInput/NumberInput.test.tsx +82 -7
  576. package/src/NumberInput/NumberInput.tsx +36 -28
  577. package/src/Outline/Outline.tsx +0 -1
  578. package/src/OverflowList/OverflowList.doc.mjs +39 -6
  579. package/src/OverflowList/OverflowList.test.tsx +111 -0
  580. package/src/OverflowList/OverflowList.tsx +48 -8
  581. package/src/Pagination/Pagination.tsx +11 -3
  582. package/src/Popover/Popover.tsx +7 -4
  583. package/src/Popover/usePopover.tsx +9 -13
  584. package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
  585. package/src/PowerSearch/PowerSearch.test.tsx +43 -0
  586. package/src/PowerSearch/PowerSearch.tsx +10 -1
  587. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
  588. package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
  589. package/src/PowerSearch/usePowerSearchSource.ts +1 -2
  590. package/src/RadioList/RadioList.doc.mjs +6 -0
  591. package/src/RadioList/RadioList.tsx +2 -2
  592. package/src/RadioList/RadioListItem.tsx +4 -4
  593. package/src/SegmentedControl/SegmentedControlItem.tsx +2 -0
  594. package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
  595. package/src/SelectableCard/SelectableCard.test.tsx +46 -4
  596. package/src/SelectableCard/SelectableCard.tsx +29 -16
  597. package/src/Selector/Selector.doc.mjs +15 -0
  598. package/src/Selector/Selector.test.tsx +417 -0
  599. package/src/Selector/Selector.tsx +86 -21
  600. package/src/Selector/hooks.ts +17 -0
  601. package/src/SideNav/SideNav.test.tsx +119 -3
  602. package/src/SideNav/SideNav.tsx +1 -8
  603. package/src/SideNav/SideNavCollapseButton.tsx +15 -8
  604. package/src/SideNav/SideNavHeading.tsx +24 -8
  605. package/src/SideNav/SideNavItem.tsx +10 -4
  606. package/src/Slider/Slider.doc.mjs +6 -0
  607. package/src/Slider/Slider.test.tsx +314 -13
  608. package/src/Slider/Slider.tsx +117 -28
  609. package/src/Switch/Switch.doc.mjs +142 -42
  610. package/src/Switch/Switch.test.tsx +54 -1
  611. package/src/Switch/Switch.tsx +90 -33
  612. package/src/TabList/Tab.tsx +2 -2
  613. package/src/TabList/TabMenu.tsx +2 -2
  614. package/src/Table/BaseTable.tsx +37 -7
  615. package/src/Table/Table.doc.mjs +11 -0
  616. package/src/Table/Table.test.tsx +85 -0
  617. package/src/Table/TableCell.tsx +3 -3
  618. package/src/Table/TableHeaderCell.tsx +3 -3
  619. package/src/Table/index.ts +5 -0
  620. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +15 -8
  621. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +24 -17
  622. package/src/Table/plugins/rowStatus/index.ts +7 -0
  623. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
  624. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
  625. package/src/Table/plugins/selection/useTableSelection.test.tsx +77 -3
  626. package/src/Table/plugins/selection/useTableSelection.tsx +22 -1
  627. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
  628. package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
  629. package/src/Table/plugins/tree/useTableTreeData.tsx +139 -8
  630. package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
  631. package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
  632. package/src/Table/types.ts +33 -0
  633. package/src/Table/useBaseTablePlugins.ts +10 -6
  634. package/src/Table/useTableRowStatus.doc.mjs +30 -0
  635. package/src/Table/useTableSelection.doc.mjs +65 -14
  636. package/src/Table/useTableTreeData.doc.mjs +29 -0
  637. package/src/Table/useTableTreeState.doc.mjs +2 -2
  638. package/src/TextArea/TextArea.doc.mjs +21 -0
  639. package/src/TextArea/TextArea.test.tsx +32 -1
  640. package/src/TextArea/TextArea.tsx +27 -26
  641. package/src/TextInput/TextInput.doc.mjs +21 -0
  642. package/src/TextInput/TextInput.test.tsx +150 -0
  643. package/src/TextInput/TextInput.tsx +28 -25
  644. package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
  645. package/src/Thumbnail/Thumbnail.test.tsx +98 -7
  646. package/src/Thumbnail/Thumbnail.tsx +142 -42
  647. package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
  648. package/src/TimeInput/TimeInput.doc.mjs +21 -0
  649. package/src/TimeInput/TimeInput.test.tsx +99 -1
  650. package/src/TimeInput/TimeInput.tsx +43 -31
  651. package/src/Timestamp/Timestamp.doc.mjs +4 -4
  652. package/src/Timestamp/Timestamp.test.tsx +32 -0
  653. package/src/Timestamp/Timestamp.tsx +28 -8
  654. package/src/Toast/useToast.tsx +7 -8
  655. package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
  656. package/src/Token/Token.test.tsx +21 -15
  657. package/src/Token/Token.tsx +31 -14
  658. package/src/Token/index.ts +1 -1
  659. package/src/Tokenizer/Tokenizer.doc.mjs +38 -2
  660. package/src/Tokenizer/Tokenizer.test.tsx +206 -2
  661. package/src/Tokenizer/Tokenizer.tsx +30 -6
  662. package/src/Tooltip/Tooltip.test.tsx +46 -0
  663. package/src/Tooltip/useTooltip.tsx +20 -0
  664. package/src/TopNav/TopNav.test.tsx +125 -1
  665. package/src/TopNav/TopNavHeading.tsx +24 -8
  666. package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
  667. package/src/TopNav/TopNavMegaMenu.tsx +10 -4
  668. package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
  669. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
  670. package/src/TopNav/TopNavMenu.test.tsx +118 -4
  671. package/src/TopNav/TopNavMenu.tsx +83 -5
  672. package/src/TreeList/TreeList.doc.mjs +28 -0
  673. package/src/TreeList/TreeList.test.tsx +272 -0
  674. package/src/TreeList/TreeList.tsx +23 -2
  675. package/src/TreeList/TreeListBranches.tsx +24 -8
  676. package/src/TreeList/TreeListItem.tsx +84 -22
  677. package/src/TreeList/TreeListTypes.ts +27 -1
  678. package/src/TreeList/index.ts +2 -2
  679. package/src/Typeahead/BaseTypeahead.tsx +30 -15
  680. package/src/Typeahead/Typeahead.doc.mjs +13 -0
  681. package/src/Typeahead/Typeahead.test.tsx +50 -0
  682. package/src/Typeahead/Typeahead.tsx +11 -1
  683. package/src/Typeahead/TypeaheadItem.tsx +2 -1
  684. package/src/__tests__/inputWidthContract.test.tsx +62 -0
  685. package/src/authoring/doc.ts +1 -3
  686. package/src/doc-mjs.d.ts +19 -0
  687. package/src/docs-types.ts +5 -0
  688. package/src/hooks/computeOverflow.test.ts +422 -0
  689. package/src/hooks/computeOverflow.ts +290 -0
  690. package/src/hooks/index.ts +8 -0
  691. package/src/hooks/isRtlElement.ts +27 -0
  692. package/src/hooks/useDevWarning.test.tsx +45 -0
  693. package/src/hooks/useDevWarning.ts +54 -0
  694. package/src/hooks/useGridFocus.doc.mjs +3 -3
  695. package/src/hooks/useGridFocus.test.tsx +41 -0
  696. package/src/hooks/useGridFocus.ts +21 -10
  697. package/src/hooks/useInputStatusIcon.test.tsx +162 -0
  698. package/src/hooks/useInputStatusIcon.tsx +224 -0
  699. package/src/hooks/useListFocus.doc.mjs +25 -3
  700. package/src/hooks/useListFocus.test.tsx +153 -1
  701. package/src/hooks/useListFocus.ts +102 -9
  702. package/src/hooks/useOverflow.test.ts +96 -4
  703. package/src/hooks/useOverflow.ts +74 -33
  704. package/src/i18n/InternationalizationContext.ts +4 -0
  705. package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
  706. package/src/i18n/InternationalizationProvider.tsx +12 -2
  707. package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
  708. package/src/i18n/__tests__/useDirection.test.tsx +66 -0
  709. package/src/i18n/getLocaleDirection.ts +29 -0
  710. package/src/i18n/index.ts +6 -0
  711. package/src/i18n/resolve.ts +9 -21
  712. package/src/i18n/useDirection.ts +29 -0
  713. package/src/reset.css +0 -26
  714. package/src/reset.test.ts +60 -0
  715. package/src/theme/Theme.tsx +11 -14
  716. package/src/theme/derivedVarRegistry.test.ts +1 -0
  717. package/src/theme/derivedVarRegistry.ts +6 -0
  718. package/src/theme/generateThemeRules.test.ts +107 -0
  719. package/src/theme/generateThemeRules.ts +56 -0
  720. package/src/theme/hct.ts +1 -1
  721. package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
  722. package/src/utils/devWarning.test.ts +56 -0
  723. package/src/utils/devWarning.ts +102 -0
  724. package/src/utils/index.ts +8 -0
  725. package/src/utils/plainDate.test.ts +46 -6
  726. package/src/utils/plainDate.ts +69 -3
  727. package/src/utils/rtlStyles.ts +27 -0
  728. package/src/utils/types.ts +14 -0
@@ -65,7 +65,9 @@ export interface DialogHeaderProps extends BaseProps<HTMLDivElement> {
65
65
  ref?: React.Ref<HTMLDivElement>;
66
66
  /**
67
67
  * The title of the dialog.
68
- * This title receives focus when the dialog opens for screen reader accessibility.
68
+ * This title receives focus when the dialog opens for screen reader
69
+ * accessibility, and names the parent Dialog via aria-labelledby unless the
70
+ * consumer passes an explicit aria-label/aria-labelledby to the Dialog.
69
71
  */
70
72
  title: string;
71
73
 
@@ -105,7 +107,8 @@ export interface DialogHeaderProps extends BaseProps<HTMLDivElement> {
105
107
  * Renders a title that receives focus when a modal dialog opens (for screen reader accessibility)
106
108
  * and an optional close button. Inline documentation previews suppress this autofocus.
107
109
  * The title is an h2 element with tabIndex={-1} so it can be programmatically focused but
108
- * doesn't appear in the tab order.
110
+ * doesn't appear in the tab order. The title also names the parent Dialog via
111
+ * aria-labelledby (unless the Dialog receives an explicit aria-label/aria-labelledby).
109
112
  *
110
113
  * Uses LayoutHeader internally for consistent styling with other layout headers.
111
114
  *
@@ -137,10 +140,13 @@ export function DialogHeader({
137
140
  const titleRef = useRef<HTMLHeadingElement>(null);
138
141
  const dialogContext = useDialogContext();
139
142
  const shouldAutoFocus = dialogContext?.isInline !== true;
143
+ const titleId = dialogContext?.titleId;
140
144
 
141
145
  // Auto-focus the title when mounted for screen reader accessibility.
142
146
  // Inline dialogs are documentation/showcase previews, so suppress focus to
143
147
  // avoid stealing scroll position from the surrounding page.
148
+ // The parent Dialog detects this title (by `titleId`) via a callback ref to
149
+ // set its default aria-labelledby — no registration handshake needed here.
144
150
  useEffect(() => {
145
151
  if (shouldAutoFocus && titleRef.current) {
146
152
  titleRef.current.focus();
@@ -162,6 +168,7 @@ export function DialogHeader({
162
168
  <div {...stylex.props(styles.titleWrapper)}>
163
169
  <Heading
164
170
  ref={titleRef}
171
+ id={titleId}
165
172
  level={2}
166
173
  tabIndex={-1}
167
174
  xstyle={styles.titleFocusable}>
@@ -172,6 +172,7 @@ export function Divider({
172
172
  return (
173
173
  <div
174
174
  ref={ref}
175
+ {...props}
175
176
  role="separator"
176
177
  aria-orientation={orientation}
177
178
  {...mergeProps(
@@ -186,8 +187,7 @@ export function Divider({
186
187
  ),
187
188
  className,
188
189
  style,
189
- )}
190
- {...props}>
190
+ )}>
191
191
  <div
192
192
  {...stylex.props(
193
193
  isHorizontal ? lineStyles.horizontalLine : lineStyles.verticalLine,
@@ -613,3 +613,232 @@ describe('DropdownMenu compound mode', () => {
613
613
  ).toBeInTheDocument();
614
614
  });
615
615
  });
616
+
617
+ describe('DropdownMenu keyboard access for menuitemradio/menuitemcheckbox (#3829)', () => {
618
+ it('arrow navigation reaches consumer-rendered menuitemradio and menuitemcheckbox items', async () => {
619
+ const user = userEvent.setup();
620
+ render(
621
+ <DropdownMenu button={{label: 'Sort'}}>
622
+ <DropdownMenuItem label="Edit" onClick={() => {}} />
623
+ <div role="menuitemradio" tabIndex={-1} aria-checked="false">
624
+ Newest
625
+ </div>
626
+ <div role="menuitemcheckbox" tabIndex={-1} aria-checked="false">
627
+ Archived
628
+ </div>
629
+ </DropdownMenu>,
630
+ );
631
+
632
+ await user.click(screen.getByRole('button', {name: /Sort/}));
633
+ const menu = screen.getByRole('menu', {hidden: true});
634
+ screen.getByRole('menuitem', {name: 'Edit', hidden: true}).focus();
635
+
636
+ fireEvent.keyDown(menu, {key: 'ArrowDown'});
637
+ expect(
638
+ screen.getByRole('menuitemradio', {name: 'Newest', hidden: true}),
639
+ ).toHaveFocus();
640
+
641
+ fireEvent.keyDown(menu, {key: 'ArrowDown'});
642
+ expect(
643
+ screen.getByRole('menuitemcheckbox', {name: 'Archived', hidden: true}),
644
+ ).toHaveFocus();
645
+ });
646
+
647
+ it('activates a focused menuitemradio with Enter and a menuitemcheckbox with Space', async () => {
648
+ const user = userEvent.setup();
649
+ const onSelect = vi.fn();
650
+ const onToggle = vi.fn();
651
+ render(
652
+ <DropdownMenu button={{label: 'Sort'}}>
653
+ <DropdownMenuItem label="Edit" onClick={() => {}} />
654
+ <div
655
+ role="menuitemradio"
656
+ tabIndex={-1}
657
+ aria-checked="false"
658
+ onClick={onSelect}>
659
+ Newest
660
+ </div>
661
+ <div
662
+ role="menuitemcheckbox"
663
+ tabIndex={-1}
664
+ aria-checked="false"
665
+ onClick={onToggle}>
666
+ Archived
667
+ </div>
668
+ </DropdownMenu>,
669
+ );
670
+
671
+ await user.click(screen.getByRole('button', {name: /Sort/}));
672
+ const menu = screen.getByRole('menu', {hidden: true});
673
+
674
+ screen.getByRole('menuitemradio', {name: 'Newest', hidden: true}).focus();
675
+ fireEvent.keyDown(menu, {key: 'Enter'});
676
+ expect(onSelect).toHaveBeenCalledTimes(1);
677
+
678
+ screen
679
+ .getByRole('menuitemcheckbox', {name: 'Archived', hidden: true})
680
+ .focus();
681
+ fireEvent.keyDown(menu, {key: ' '});
682
+ expect(onToggle).toHaveBeenCalledTimes(1);
683
+ });
684
+
685
+ it('typeahead matches a menuitemradio label', async () => {
686
+ const user = userEvent.setup();
687
+ render(
688
+ <DropdownMenu button={{label: 'Sort'}}>
689
+ <DropdownMenuItem label="Edit" onClick={() => {}} />
690
+ <div role="menuitemradio" tabIndex={-1} aria-checked="false">
691
+ Newest
692
+ </div>
693
+ <div role="menuitemcheckbox" tabIndex={-1} aria-checked="false">
694
+ Archived
695
+ </div>
696
+ </DropdownMenu>,
697
+ );
698
+
699
+ await user.click(screen.getByRole('button', {name: /Sort/}));
700
+ fireEvent.keyDown(screen.getByRole('menu', {hidden: true}), {key: 'n'});
701
+ expect(
702
+ screen.getByRole('menuitemradio', {name: 'Newest', hidden: true}),
703
+ ).toHaveFocus();
704
+ });
705
+
706
+ it('typeahead matches a menuitemcheckbox label', async () => {
707
+ const user = userEvent.setup();
708
+ render(
709
+ <DropdownMenu button={{label: 'Sort'}}>
710
+ <DropdownMenuItem label="Edit" onClick={() => {}} />
711
+ <div role="menuitemradio" tabIndex={-1} aria-checked="false">
712
+ Newest
713
+ </div>
714
+ <div role="menuitemcheckbox" tabIndex={-1} aria-checked="false">
715
+ Archived
716
+ </div>
717
+ </DropdownMenu>,
718
+ );
719
+
720
+ await user.click(screen.getByRole('button', {name: /Sort/}));
721
+ fireEvent.keyDown(screen.getByRole('menu', {hidden: true}), {key: 'a'});
722
+ expect(
723
+ screen.getByRole('menuitemcheckbox', {name: 'Archived', hidden: true}),
724
+ ).toHaveFocus();
725
+ });
726
+
727
+ it('typeahead skips an aria-disabled item and matches the next enabled label', async () => {
728
+ const user = userEvent.setup();
729
+ render(
730
+ <DropdownMenu button={{label: 'Sort'}}>
731
+ <DropdownMenuItem label="Edit" onClick={() => {}} />
732
+ <div role="menuitemradio" tabIndex={-1} aria-disabled="true">
733
+ Newest
734
+ </div>
735
+ <div role="menuitemcheckbox" tabIndex={-1} aria-checked="false">
736
+ Nightly
737
+ </div>
738
+ </DropdownMenu>,
739
+ );
740
+
741
+ await user.click(screen.getByRole('button', {name: /Sort/}));
742
+ // Anchor the search on 'Edit' so typeahead scans forward and meets the
743
+ // disabled 'Newest' (also an 'n' match) before the enabled 'Nightly'.
744
+ // This pins the `:not([aria-disabled="true"])` in MENU_ITEM_SELECTOR: the
745
+ // menus never pass useTypeahead's `isDisabled` option, so that clause is
746
+ // the only thing keeping disabled rows out of the typeahead list. An
747
+ // arrow-key test cannot cover it — useListFocus re-filters disabled items
748
+ // independently, so arrow navigation is guarded twice over.
749
+ // The disabled row keeps tabIndex={-1} on purpose: it stays focusable, so
750
+ // the selector clause is the sole reason focus skips it.
751
+ screen.getByRole('menuitem', {name: 'Edit', hidden: true}).focus();
752
+ fireEvent.keyDown(screen.getByRole('menu', {hidden: true}), {key: 'n'});
753
+ expect(
754
+ screen.getByRole('menuitemcheckbox', {name: 'Nightly', hidden: true}),
755
+ ).toHaveFocus();
756
+ });
757
+
758
+ it('skips aria-disabled menuitemradio and menuitemcheckbox items during arrow navigation', async () => {
759
+ const user = userEvent.setup();
760
+ render(
761
+ <DropdownMenu button={{label: 'Sort'}}>
762
+ <DropdownMenuItem label="Edit" onClick={() => {}} />
763
+ <div role="menuitemradio" tabIndex={-1} aria-disabled="true">
764
+ Newest
765
+ </div>
766
+ <div role="menuitemcheckbox" tabIndex={-1} aria-disabled="true">
767
+ Archived
768
+ </div>
769
+ <div role="menuitemradio" tabIndex={-1} aria-checked="false">
770
+ Oldest
771
+ </div>
772
+ </DropdownMenu>,
773
+ );
774
+
775
+ await user.click(screen.getByRole('button', {name: /Sort/}));
776
+ const menu = screen.getByRole('menu', {hidden: true});
777
+ screen.getByRole('menuitem', {name: 'Edit', hidden: true}).focus();
778
+
779
+ fireEvent.keyDown(menu, {key: 'ArrowDown'});
780
+ expect(
781
+ screen.getByRole('menuitemradio', {name: 'Oldest', hidden: true}),
782
+ ).toHaveFocus();
783
+ });
784
+
785
+ it('moves focus to the item the mouse hovers, keeping a single highlight', async () => {
786
+ const user = userEvent.setup();
787
+ render(
788
+ <DropdownMenu button={{label: 'Actions'}}>
789
+ <DropdownMenuItem label="Edit" onClick={() => {}} />
790
+ <DropdownMenuItem label="Duplicate" onClick={() => {}} />
791
+ <DropdownMenuItem label="Delete" onClick={() => {}} />
792
+ </DropdownMenu>,
793
+ );
794
+
795
+ await user.click(screen.getByRole('button', {name: /Actions/}));
796
+ // Keyboard focus starts on the first item.
797
+ const edit = screen.getByRole('menuitem', {name: 'Edit', hidden: true});
798
+ const del = screen.getByRole('menuitem', {name: 'Delete', hidden: true});
799
+ edit.focus();
800
+ expect(edit).toHaveFocus();
801
+
802
+ // A mouse hover over another item moves focus to it, so the single
803
+ // focus-driven highlight follows the pointer instead of leaving two.
804
+ fireEvent.pointerMove(del, {pointerType: 'mouse'});
805
+ expect(del).toHaveFocus();
806
+ expect(edit).not.toHaveFocus();
807
+ });
808
+
809
+ it('does not move focus on hover for a disabled item', async () => {
810
+ const user = userEvent.setup();
811
+ render(
812
+ <DropdownMenu button={{label: 'Actions'}}>
813
+ <DropdownMenuItem label="Edit" onClick={() => {}} />
814
+ <DropdownMenuItem label="Delete" isDisabled onClick={() => {}} />
815
+ </DropdownMenu>,
816
+ );
817
+
818
+ await user.click(screen.getByRole('button', {name: /Actions/}));
819
+ const edit = screen.getByRole('menuitem', {name: 'Edit', hidden: true});
820
+ const del = screen.getByRole('menuitem', {name: 'Delete', hidden: true});
821
+ edit.focus();
822
+
823
+ fireEvent.pointerMove(del, {pointerType: 'mouse'});
824
+ expect(edit).toHaveFocus();
825
+ });
826
+
827
+ it('does not move focus for a non-mouse (touch) pointer', async () => {
828
+ const user = userEvent.setup();
829
+ render(
830
+ <DropdownMenu button={{label: 'Actions'}}>
831
+ <DropdownMenuItem label="Edit" onClick={() => {}} />
832
+ <DropdownMenuItem label="Delete" onClick={() => {}} />
833
+ </DropdownMenu>,
834
+ );
835
+
836
+ await user.click(screen.getByRole('button', {name: /Actions/}));
837
+ const edit = screen.getByRole('menuitem', {name: 'Edit', hidden: true});
838
+ const del = screen.getByRole('menuitem', {name: 'Delete', hidden: true});
839
+ edit.focus();
840
+
841
+ fireEvent.pointerMove(del, {pointerType: 'touch'});
842
+ expect(edit).toHaveFocus();
843
+ });
844
+ });
@@ -38,7 +38,11 @@ import {Icon} from '../Icon';
38
38
  import type {IconType} from '../Icon';
39
39
 
40
40
  import {renderDropdownItems} from './renderDropdownItems';
41
- import {MENU_ITEM_ROLES, MENU_ITEM_SELECTOR} from './menuItemRoles';
41
+ import {
42
+ MENU_ITEM_ROLES,
43
+ MENU_ITEM_SELECTOR,
44
+ MENU_BOUNDARY_SELECTOR,
45
+ } from './menuItemRoles';
42
46
  import {
43
47
  DropdownMenuContext,
44
48
  type DropdownMenuContextValue,
@@ -100,6 +104,12 @@ export interface DropdownMenuItemData {
100
104
  onClick?: () => void;
101
105
  isDisabled?: boolean;
102
106
  icon?: ReactNode | IconType;
107
+ /**
108
+ * Nested submenu entries. When present, this row becomes a submenu (a
109
+ * flyout revealing `items`) instead of a leaf action — no separate item
110
+ * "type" is needed. Data-mode parity for the compound DropdownMenuSubMenu API.
111
+ */
112
+ items?: DropdownMenuOption[];
103
113
  }
104
114
 
105
115
  export interface DropdownMenuDivider {
@@ -200,6 +210,14 @@ export function DropdownMenu({
200
210
  const items = ('items' in props ? props.items : undefined) ?? [];
201
211
  const children = props.children;
202
212
 
213
+ // Extract BaseProps pass-throughs (aria-*, id, event handlers) from the
214
+ // discriminated-union rest bag so they can be forwarded to the menu element.
215
+ const {
216
+ items: _items,
217
+ children: _children,
218
+ ...rest
219
+ } = props as Record<string, unknown>;
220
+
203
221
  const menuId = useId();
204
222
  const menuSize = button.size ?? 'md';
205
223
  const buttonRef = useRef<HTMLButtonElement>(null);
@@ -265,23 +283,18 @@ export function DropdownMenu({
265
283
  handleKeyDown: listNavKeyDown,
266
284
  focusFirst,
267
285
  focusItem,
286
+ ownsEvent,
287
+ getItems: getMenuItems,
268
288
  } = useListFocus<HTMLDivElement>({
269
289
  itemSelector: MENU_ITEM_SELECTOR,
290
+ boundarySelector: MENU_BOUNDARY_SELECTOR,
270
291
  wrap: false,
271
292
  onEscape: closeMenu,
272
293
  });
273
294
 
274
295
  // First-character typeahead over the (enabled) menu items — jump to the next
275
- // item whose label starts with the typed text (menus-11).
276
- const getMenuItems = useCallback(
277
- (): HTMLElement[] =>
278
- listRef.current
279
- ? Array.from(
280
- listRef.current.querySelectorAll<HTMLElement>(MENU_ITEM_SELECTOR),
281
- )
282
- : [],
283
- [listRef],
284
- );
296
+ // item whose label starts with the typed text (menus-11). Reuses the hook's
297
+ // scoped item collection so an inline submenu flyout's items aren't swept in.
285
298
  const typeahead = useTypeahead({
286
299
  getItemLabels: () => getMenuItems().map(el => el.textContent),
287
300
  onMatch: focusItem,
@@ -307,6 +320,11 @@ export function DropdownMenu({
307
320
  // Extend useListFocus with Enter/Space activation + typeahead
308
321
  const listKeyDown = useCallback(
309
322
  (e: React.KeyboardEvent) => {
323
+ // A submenu flyout renders inline inside this menu; its key events bubble
324
+ // up here. Let that level own them — only handle events from this level.
325
+ if (!ownsEvent(e)) {
326
+ return;
327
+ }
310
328
  if (e.key === 'Enter' || e.key === ' ') {
311
329
  e.preventDefault();
312
330
  const focused = document.activeElement as HTMLElement | null;
@@ -334,7 +352,7 @@ export function DropdownMenu({
334
352
  }
335
353
  listNavKeyDown(e);
336
354
  },
337
- [listNavKeyDown, closeMenu, typeahead],
355
+ [listNavKeyDown, closeMenu, typeahead, ownsEvent],
338
356
  );
339
357
 
340
358
  const openAndFocus = useCallback(() => {
@@ -435,6 +453,7 @@ export function DropdownMenu({
435
453
 
436
454
  {popover.render(
437
455
  <div
456
+ {...rest}
438
457
  ref={listRef}
439
458
  id={menuId}
440
459
  role="menu"
@@ -23,11 +23,12 @@
23
23
  * checkmark uses the `check` icon from the active theme's icon registry.
24
24
  */
25
25
 
26
- import {useCallback, type ReactNode} from 'react';
26
+ import {useCallback, type PointerEvent, type ReactNode} from 'react';
27
27
  import * as stylex from '@stylexjs/stylex';
28
28
  import {Icon, renderIconSlot, type IconType} from '../Icon';
29
29
  import {Item} from '../Item';
30
30
  import {useDropdownMenuContext} from './DropdownMenuContext';
31
+ import {focusMenuItemOnHover} from './menuItemHover';
31
32
  import {
32
33
  colorVars,
33
34
  spacingVars,
@@ -47,7 +48,6 @@ const styles = stylex.create({
47
48
  backgroundColor: {
48
49
  default: 'transparent',
49
50
  ':focus': colorVars['--color-overlay-hover'],
50
- ':hover': colorVars['--color-overlay-hover'],
51
51
  },
52
52
  cursor: 'pointer',
53
53
  outline: 'none',
@@ -152,8 +152,7 @@ export interface DropdownMenuCheckboxItemProps extends Omit<
152
152
  *
153
153
  * @example
154
154
  * ```
155
- * * import {DropdownMenuCheckboxItem} from '@astryxdesign/core/DropdownMenu';
156
- *
155
+ * import {DropdownMenuCheckboxItem} from '@astryxdesign/core/DropdownMenu';
157
156
  * <DropdownMenu button={{label: 'View'}}>
158
157
  * <DropdownMenuCheckboxItem
159
158
  * label="Show archived"
@@ -191,12 +190,18 @@ export function DropdownMenuCheckboxItem({
191
190
  }
192
191
  }, [isDisabled, onChange, value, hasCloseOnSelect, ctx]);
193
192
 
193
+ const handlePointerMove = useCallback(
194
+ (e: PointerEvent<HTMLElement>) => focusMenuItemOnHover(e, isDisabled),
195
+ [isDisabled],
196
+ );
197
+
194
198
  return (
195
199
  <Item
196
200
  {...rest}
197
201
  role="menuitemcheckbox"
198
202
  aria-checked={value}
199
203
  tabIndex={isDisabled ? undefined : -1}
204
+ onPointerMove={handlePointerMove}
200
205
  marker={
201
206
  <span
202
207
  aria-hidden="true"
@@ -23,7 +23,7 @@
23
23
  * - /packages/cli/templates/blocks/components/DropdownMenu/ (showcase blocks)
24
24
  */
25
25
 
26
- import {useCallback, type ReactNode} from 'react';
26
+ import {useCallback, type PointerEvent, type ReactNode} from 'react';
27
27
  import * as stylex from '@stylexjs/stylex';
28
28
  import {renderIconSlot, type IconType} from '../Icon';
29
29
  import {Item} from '../Item';
@@ -36,6 +36,7 @@ import {
36
36
  import {mergeProps} from '../utils';
37
37
  import type {BaseProps} from '../BaseProps';
38
38
  import {useDropdownMenuContext} from './DropdownMenuContext';
39
+ import {focusMenuItemOnHover} from './menuItemHover';
39
40
  import {themeProps} from '../utils/themeProps';
40
41
 
41
42
  const menuItemStyles = stylex.create({
@@ -51,11 +52,10 @@ const menuItemStyles = stylex.create({
51
52
  backgroundColor: {
52
53
  default: 'transparent',
53
54
  ':focus': colorVars['--color-overlay-hover'],
54
- ':hover': colorVars['--color-overlay-hover'],
55
55
  },
56
56
  border: 'none',
57
57
  cursor: 'pointer',
58
- textAlign: 'left',
58
+ textAlign: 'start',
59
59
  outline: 'none',
60
60
  },
61
61
  disabled: {
@@ -129,10 +129,16 @@ export function DropdownMenuItem({
129
129
  ctx?.closeMenu();
130
130
  }, [isDisabled, onClick, ctx]);
131
131
 
132
+ const handlePointerMove = useCallback(
133
+ (e: PointerEvent<HTMLElement>) => focusMenuItemOnHover(e, isDisabled),
134
+ [isDisabled],
135
+ );
136
+
132
137
  return (
133
138
  <Item
134
139
  role="menuitem"
135
140
  tabIndex={isDisabled ? undefined : -1}
141
+ onPointerMove={handlePointerMove}
136
142
  startContent={
137
143
  icon
138
144
  ? renderIconSlot(icon, {size: 'sm', color: 'secondary'})
@@ -77,11 +77,10 @@ export interface DropdownMenuRadioGroupProps extends Omit<
77
77
  *
78
78
  * @example
79
79
  * ```
80
- * * import {
80
+ * import {
81
81
  * DropdownMenuRadioGroup,
82
82
  * DropdownMenuRadioItem,
83
83
  * } from '@astryxdesign/core/DropdownMenu';
84
- *
85
84
  * <DropdownMenu button={{label: 'Sort'}}>
86
85
  * <DropdownMenuRadioGroup value={sort} onChange={setSort} aria-label="Sort by">
87
86
  * <DropdownMenuRadioItem value="newest" label="Newest" />
@@ -21,11 +21,12 @@
21
21
  * has no registry glyph).
22
22
  */
23
23
 
24
- import {useCallback, type ReactNode} from 'react';
24
+ import {useCallback, type PointerEvent, type ReactNode} from 'react';
25
25
  import * as stylex from '@stylexjs/stylex';
26
26
  import {renderIconSlot, type IconType} from '../Icon';
27
27
  import {Item} from '../Item';
28
28
  import {useDropdownMenuContext} from './DropdownMenuContext';
29
+ import {focusMenuItemOnHover} from './menuItemHover';
29
30
  import {
30
31
  colorVars,
31
32
  spacingVars,
@@ -45,7 +46,6 @@ const styles = stylex.create({
45
46
  backgroundColor: {
46
47
  default: 'transparent',
47
48
  ':focus': colorVars['--color-overlay-hover'],
48
- ':hover': colorVars['--color-overlay-hover'],
49
49
  },
50
50
  cursor: 'pointer',
51
51
  outline: 'none',
@@ -184,12 +184,18 @@ export function DropdownMenuRadioItem({
184
184
  }
185
185
  }, [isDisabled, groupCtx, value, menuCtx]);
186
186
 
187
+ const handlePointerMove = useCallback(
188
+ (e: PointerEvent<HTMLElement>) => focusMenuItemOnHover(e, isDisabled),
189
+ [isDisabled],
190
+ );
191
+
187
192
  return (
188
193
  <Item
189
194
  {...rest}
190
195
  role="menuitemradio"
191
196
  aria-checked={isChecked}
192
197
  tabIndex={isDisabled ? undefined : -1}
198
+ onPointerMove={handlePointerMove}
193
199
  marker={
194
200
  <span
195
201
  aria-hidden="true"
@@ -0,0 +1,88 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /** @type {import('../docs-types').ComponentDoc} */
4
+
5
+ export const docs = {
6
+ name: 'DropdownMenuSubMenu',
7
+ subComponentOf: 'DropdownMenu',
8
+ displayName: 'Dropdown Menu Submenu',
9
+ isHiddenFromOverview: true,
10
+ description:
11
+ 'A single menu row that reveals a nested flyout of its own items. The row adopts DropdownMenuItem semantics (label / icon / description / isDisabled); its children become the flyout content. Opens inline-end with viewport auto-flip; Right/Enter/Space opens and focuses the first item, Left/Escape closes and returns focus to the trigger (Right/Left swap in RTL). For data-driven menus, give a menu item a nested `items` array instead of using this component directly.',
12
+ playground: {
13
+ defaults: {label: 'Move to'},
14
+ },
15
+ props: [
16
+ {
17
+ name: 'label',
18
+ type: 'ReactNode',
19
+ description: 'Primary label text for the trigger row.',
20
+ },
21
+ {
22
+ name: 'icon',
23
+ type: 'IconType',
24
+ description:
25
+ 'Icon to display before the label. See `astryx docs icons` for valid semantic names.',
26
+ },
27
+ {
28
+ name: 'description',
29
+ type: 'ReactNode',
30
+ description: 'Secondary description text displayed below the label.',
31
+ },
32
+ {
33
+ name: 'children',
34
+ type: 'ReactNode',
35
+ description:
36
+ 'The flyout menu items — the same components used at the top level (DropdownMenuItem, nested DropdownMenuSubMenu, selectable items).',
37
+ },
38
+ {
39
+ name: 'isDisabled',
40
+ type: 'boolean',
41
+ default: 'false',
42
+ description:
43
+ 'A disabled submenu renders its trigger row but never opens the flyout.',
44
+ },
45
+ {
46
+ name: 'hasSpinner',
47
+ type: 'boolean',
48
+ default: 'false',
49
+ description:
50
+ 'Show a spinner in place of the caret, e.g. while a lazy submenu’s children are loading.',
51
+ },
52
+ {
53
+ name: 'menuWidth',
54
+ type: 'number | string',
55
+ description: 'Fixed flyout width. Defaults to sizing to its content (min 160px).',
56
+ },
57
+ {
58
+ name: 'onOpenChange',
59
+ type: '(isOpen: boolean) => void',
60
+ description: 'Called when the flyout opens or closes.',
61
+ },
62
+ {
63
+ name: 'xstyle',
64
+ type: 'StyleXStyles',
65
+ description:
66
+ 'StyleX styles for the trigger row. Must be a stylex.create() value: not an inline style object like style={{}}.',
67
+ },
68
+ ],
69
+ };
70
+
71
+ export const docsDense = {
72
+ name: 'DropdownMenuSubMenu',
73
+ isHiddenFromOverview: true,
74
+ displayName: 'Dropdown Menu Submenu',
75
+ description:
76
+ 'menu row that reveals a nested flyout of its own children/items (single component, not Sub/SubTrigger/SubContent)',
77
+ propDescriptions: {
78
+ label: 'primary label text for the trigger row',
79
+ icon: 'icon before label',
80
+ description: 'secondary text below label',
81
+ children: 'flyout menu items (same components as top level)',
82
+ isDisabled: 'renders trigger but never opens',
83
+ hasSpinner: 'spinner instead of caret for async children',
84
+ menuWidth: 'fixed flyout width (default: content, min 160px)',
85
+ onOpenChange: 'called when flyout opens/closes',
86
+ xstyle: 'StyleX styles for the trigger row',
87
+ },
88
+ };