@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
@@ -1,10 +1,17 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
- import {describe, it, expect, vi} from 'vitest';
4
- import {render, screen, waitFor} from '@testing-library/react';
3
+ import {describe, it, expect, vi, beforeEach} from 'vitest';
4
+ import {render, screen, waitFor, fireEvent} from '@testing-library/react';
5
5
  import userEvent from '@testing-library/user-event';
6
6
  import {Breadcrumbs} from './Breadcrumbs';
7
7
  import {BreadcrumbItem} from './BreadcrumbItem';
8
+ import {
9
+ BreadcrumbMenuItem,
10
+ BreadcrumbMenuCheckboxItem,
11
+ BreadcrumbMenuRadioGroup,
12
+ BreadcrumbMenuRadioItem,
13
+ } from './index';
14
+ import type {BreadcrumbMenuOption} from './index';
8
15
  import {LinkProvider} from '../Link/LinkProvider';
9
16
 
10
17
  function CustomLink({
@@ -359,3 +366,329 @@ describe('BreadcrumbItem', () => {
359
366
  expect(current.tagName).toBe('SPAN');
360
367
  });
361
368
  });
369
+
370
+ describe('BreadcrumbItem menu', () => {
371
+ // Mock the native Popover API — jsdom doesn't implement showPopover/
372
+ // hidePopover or the :popover-open match. Mirrors DropdownMenu's test setup.
373
+ beforeEach(() => {
374
+ HTMLElement.prototype.showPopover = vi.fn(function (this: HTMLElement) {
375
+ this.setAttribute('popover-open', '');
376
+ const event = new Event('toggle', {bubbles: false});
377
+ Object.defineProperty(event, 'newState', {value: 'open'});
378
+ this.dispatchEvent(event);
379
+ });
380
+ HTMLElement.prototype.hidePopover = vi.fn(function (this: HTMLElement) {
381
+ this.removeAttribute('popover-open');
382
+ const event = new Event('toggle', {bubbles: false});
383
+ Object.defineProperty(event, 'newState', {value: 'closed'});
384
+ this.dispatchEvent(event);
385
+ });
386
+ const originalMatches = HTMLElement.prototype.matches;
387
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
388
+ (HTMLElement.prototype as any).matches = function (
389
+ selector: string,
390
+ ): boolean {
391
+ if (selector === ':popover-open') {
392
+ return this.hasAttribute('popover-open');
393
+ }
394
+ return originalMatches.call(this, selector);
395
+ };
396
+ });
397
+
398
+ const items: BreadcrumbMenuOption[] = [
399
+ {label: 'Design', onClick: vi.fn()},
400
+ {label: 'Engineering', onClick: vi.fn()},
401
+ {type: 'divider'},
402
+ {label: 'Data', onClick: vi.fn()},
403
+ ];
404
+
405
+ it('renders as a menu trigger button with aria-haspopup="menu"', () => {
406
+ render(
407
+ <Breadcrumbs>
408
+ <BreadcrumbItem href="/">Home</BreadcrumbItem>
409
+ <BreadcrumbItem menu={items}>Teams</BreadcrumbItem>
410
+ <BreadcrumbItem isCurrent>Overview</BreadcrumbItem>
411
+ </Breadcrumbs>,
412
+ );
413
+ const trigger = screen.getByRole('button', {name: 'Teams'});
414
+ expect(trigger).toHaveAttribute('aria-haspopup', 'menu');
415
+ expect(trigger).toHaveAttribute('aria-expanded', 'false');
416
+ });
417
+
418
+ it('portability: a DropdownMenuOption[] renders its items on open', async () => {
419
+ const user = userEvent.setup();
420
+ render(
421
+ <Breadcrumbs>
422
+ <BreadcrumbItem menu={items}>Teams</BreadcrumbItem>
423
+ <BreadcrumbItem isCurrent>Overview</BreadcrumbItem>
424
+ </Breadcrumbs>,
425
+ );
426
+ await user.click(screen.getByRole('button', {name: 'Teams'}));
427
+ const menu = screen.getByRole('menu', {hidden: true});
428
+ expect(menu).toHaveAttribute('aria-label', 'Teams');
429
+ expect(
430
+ screen.getByRole('menuitem', {name: 'Design', hidden: true}),
431
+ ).toBeInTheDocument();
432
+ expect(
433
+ screen.getByRole('menuitem', {name: 'Engineering', hidden: true}),
434
+ ).toBeInTheDocument();
435
+ expect(
436
+ screen.getByRole('menuitem', {name: 'Data', hidden: true}),
437
+ ).toBeInTheDocument();
438
+ });
439
+
440
+ it('fires the item onClick and closes the menu on select', async () => {
441
+ const user = userEvent.setup();
442
+ const onDesign = vi.fn();
443
+ render(
444
+ <Breadcrumbs>
445
+ <BreadcrumbItem menu={[{label: 'Design', onClick: onDesign}]}>
446
+ Teams
447
+ </BreadcrumbItem>
448
+ <BreadcrumbItem isCurrent>Overview</BreadcrumbItem>
449
+ </Breadcrumbs>,
450
+ );
451
+ await user.click(screen.getByRole('button', {name: 'Teams'}));
452
+ await user.click(
453
+ screen.getByRole('menuitem', {name: 'Design', hidden: true}),
454
+ );
455
+ expect(onDesign).toHaveBeenCalledTimes(1);
456
+ expect(HTMLElement.prototype.hidePopover).toHaveBeenCalled();
457
+ });
458
+
459
+ it('supports the composed children form', async () => {
460
+ const user = userEvent.setup();
461
+ const onOverview = vi.fn();
462
+ render(
463
+ <Breadcrumbs>
464
+ <BreadcrumbItem
465
+ menu={
466
+ <>
467
+ <BreadcrumbMenuItem label="Overview" onClick={onOverview} />
468
+ <BreadcrumbMenuItem label="Settings" />
469
+ </>
470
+ }>
471
+ Project
472
+ </BreadcrumbItem>
473
+ <BreadcrumbItem isCurrent>Current</BreadcrumbItem>
474
+ </Breadcrumbs>,
475
+ );
476
+ await user.click(screen.getByRole('button', {name: 'Project'}));
477
+ expect(
478
+ screen.getByRole('menuitem', {name: 'Overview', hidden: true}),
479
+ ).toBeInTheDocument();
480
+ await user.click(
481
+ screen.getByRole('menuitem', {name: 'Overview', hidden: true}),
482
+ );
483
+ expect(onOverview).toHaveBeenCalledTimes(1);
484
+ });
485
+
486
+ it('supports a selectable checkbox item', async () => {
487
+ const user = userEvent.setup();
488
+ const onChange = vi.fn();
489
+ render(
490
+ <Breadcrumbs>
491
+ <BreadcrumbItem
492
+ menu={
493
+ <BreadcrumbMenuCheckboxItem
494
+ label="Show archived"
495
+ value={false}
496
+ onChange={onChange}
497
+ />
498
+ }>
499
+ Filters
500
+ </BreadcrumbItem>
501
+ <BreadcrumbItem isCurrent>Current</BreadcrumbItem>
502
+ </Breadcrumbs>,
503
+ );
504
+ await user.click(screen.getByRole('button', {name: 'Filters'}));
505
+ const checkbox = screen.getByRole('menuitemcheckbox', {
506
+ name: 'Show archived',
507
+ hidden: true,
508
+ });
509
+ expect(checkbox).toHaveAttribute('aria-checked', 'false');
510
+ await user.click(checkbox);
511
+ expect(onChange).toHaveBeenCalledWith(true);
512
+ });
513
+
514
+ it('supports a selectable radio group', async () => {
515
+ const user = userEvent.setup();
516
+ const onChange = vi.fn();
517
+ render(
518
+ <Breadcrumbs>
519
+ <BreadcrumbItem
520
+ menu={
521
+ <BreadcrumbMenuRadioGroup
522
+ aria-label="Sort by"
523
+ value="name"
524
+ onChange={onChange}>
525
+ <BreadcrumbMenuRadioItem value="name" label="Name" />
526
+ <BreadcrumbMenuRadioItem value="date" label="Date" />
527
+ </BreadcrumbMenuRadioGroup>
528
+ }>
529
+ Sort
530
+ </BreadcrumbItem>
531
+ <BreadcrumbItem isCurrent>Current</BreadcrumbItem>
532
+ </Breadcrumbs>,
533
+ );
534
+ await user.click(screen.getByRole('button', {name: 'Sort'}));
535
+ const nameOption = screen.getByRole('menuitemradio', {
536
+ name: 'Name',
537
+ hidden: true,
538
+ });
539
+ expect(nameOption).toHaveAttribute('aria-checked', 'true');
540
+ await user.click(
541
+ screen.getByRole('menuitemradio', {name: 'Date', hidden: true}),
542
+ );
543
+ expect(onChange).toHaveBeenCalledWith('date');
544
+ });
545
+
546
+ it('opens with ArrowDown and closes with Escape, returning focus to trigger', async () => {
547
+ render(
548
+ <Breadcrumbs>
549
+ <BreadcrumbItem menu={items}>Teams</BreadcrumbItem>
550
+ <BreadcrumbItem isCurrent>Overview</BreadcrumbItem>
551
+ </Breadcrumbs>,
552
+ );
553
+ const trigger = screen.getByRole('button', {name: 'Teams'});
554
+ trigger.focus();
555
+ fireEvent.keyDown(trigger, {key: 'ArrowDown'});
556
+ expect(HTMLElement.prototype.showPopover).toHaveBeenCalled();
557
+ const menu = screen.getByRole('menu', {hidden: true});
558
+ await waitFor(() => {
559
+ expect(menu).toContainElement(
560
+ document.activeElement as HTMLElement | null,
561
+ );
562
+ });
563
+ fireEvent.keyDown(menu, {key: 'Escape'});
564
+ expect(HTMLElement.prototype.hidePopover).toHaveBeenCalled();
565
+ await waitFor(() => {
566
+ expect(trigger).toHaveFocus();
567
+ });
568
+ });
569
+
570
+ it('roves focus with ArrowDown across items', async () => {
571
+ render(
572
+ <Breadcrumbs>
573
+ <BreadcrumbItem menu={items}>Teams</BreadcrumbItem>
574
+ <BreadcrumbItem isCurrent>Overview</BreadcrumbItem>
575
+ </Breadcrumbs>,
576
+ );
577
+ const trigger = screen.getByRole('button', {name: 'Teams'});
578
+ trigger.focus();
579
+ fireEvent.keyDown(trigger, {key: 'ArrowDown'});
580
+ const menu = screen.getByRole('menu', {hidden: true});
581
+ await waitFor(() => {
582
+ expect(
583
+ screen.getByRole('menuitem', {name: 'Design', hidden: true}),
584
+ ).toHaveFocus();
585
+ });
586
+ fireEvent.keyDown(menu, {key: 'ArrowDown'});
587
+ expect(
588
+ screen.getByRole('menuitem', {name: 'Engineering', hidden: true}),
589
+ ).toHaveFocus();
590
+ });
591
+
592
+ it('renders a submenu from a nested items array and keyboard-reaches an item after it', async () => {
593
+ // Breadcrumb menus reuse the DropdownMenu item pipeline, so a nested
594
+ // `items` array becomes a submenu. The inline flyout must not pollute the
595
+ // breadcrumb menu's roving order — an item after the submenu row stays
596
+ // keyboard-reachable.
597
+ const onDelete = vi.fn();
598
+ render(
599
+ <Breadcrumbs>
600
+ <BreadcrumbItem
601
+ menu={[
602
+ {label: 'Rename', onClick: vi.fn()},
603
+ {
604
+ label: 'Move to',
605
+ items: [
606
+ {label: 'Folder A', onClick: vi.fn()},
607
+ {label: 'Folder B', onClick: vi.fn()},
608
+ ],
609
+ },
610
+ {type: 'divider'},
611
+ {label: 'Delete', onClick: onDelete},
612
+ ]}>
613
+ Teams
614
+ </BreadcrumbItem>
615
+ <BreadcrumbItem isCurrent>Overview</BreadcrumbItem>
616
+ </Breadcrumbs>,
617
+ );
618
+ const trigger = screen.getByRole('button', {name: 'Teams'});
619
+ trigger.focus();
620
+ fireEvent.keyDown(trigger, {key: 'ArrowDown'});
621
+ // Two role="menu" exist (the breadcrumb menu + the inline submenu flyout);
622
+ // the breadcrumb menu is the first in DOM order.
623
+ const menu = screen.getAllByRole('menu', {hidden: true})[0];
624
+ const submenuTrigger = screen.getByRole('menuitem', {
625
+ name: /Move to/,
626
+ hidden: true,
627
+ });
628
+ expect(submenuTrigger).toHaveAttribute('aria-haspopup', 'menu');
629
+ await waitFor(() => {
630
+ expect(
631
+ screen.getByRole('menuitem', {name: 'Rename', hidden: true}),
632
+ ).toHaveFocus();
633
+ });
634
+ // Rename → Move to → Delete, one step per press.
635
+ fireEvent.keyDown(menu, {key: 'ArrowDown'});
636
+ expect(submenuTrigger).toHaveFocus();
637
+ fireEvent.keyDown(menu, {key: 'ArrowDown'});
638
+ expect(
639
+ screen.getByRole('menuitem', {name: 'Delete', hidden: true}),
640
+ ).toHaveFocus();
641
+ });
642
+
643
+ it('allows menu together with isCurrent (both aria-current and aria-haspopup)', () => {
644
+ render(
645
+ <Breadcrumbs>
646
+ <BreadcrumbItem href="/">Home</BreadcrumbItem>
647
+ <BreadcrumbItem isCurrent menu={items}>
648
+ Teams
649
+ </BreadcrumbItem>
650
+ </Breadcrumbs>,
651
+ );
652
+ const trigger = screen.getByRole('button', {name: 'Teams'});
653
+ expect(trigger).toHaveAttribute('aria-current', 'page');
654
+ expect(trigger).toHaveAttribute('aria-haspopup', 'menu');
655
+ });
656
+
657
+ it('warns and lets menu win when href is also provided', () => {
658
+ const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
659
+ render(
660
+ <Breadcrumbs>
661
+ <BreadcrumbItem href="/teams" menu={items}>
662
+ Teams
663
+ </BreadcrumbItem>
664
+ <BreadcrumbItem isCurrent>Overview</BreadcrumbItem>
665
+ </Breadcrumbs>,
666
+ );
667
+ // menu wins: it's a button trigger, not a link.
668
+ expect(screen.getByRole('button', {name: 'Teams'})).toHaveAttribute(
669
+ 'aria-haspopup',
670
+ 'menu',
671
+ );
672
+ expect(screen.queryByRole('link', {name: 'Teams'})).not.toBeInTheDocument();
673
+ expect(warn).toHaveBeenCalledWith(
674
+ expect.stringContaining('`menu` and `href` are mutually exclusive'),
675
+ );
676
+ warn.mockRestore();
677
+ });
678
+
679
+ it('keeps mid-trail separators intact around a menu crumb', () => {
680
+ const {container} = render(
681
+ <Breadcrumbs>
682
+ <BreadcrumbItem href="/">Home</BreadcrumbItem>
683
+ <BreadcrumbItem menu={items}>Teams</BreadcrumbItem>
684
+ <BreadcrumbItem isCurrent>Overview</BreadcrumbItem>
685
+ </Breadcrumbs>,
686
+ );
687
+ // One separator per item (first hidden via CSS); the menu crumb does not
688
+ // add or drop any.
689
+ const separators = container.querySelectorAll(
690
+ 'ol > li > span[aria-hidden="true"]',
691
+ );
692
+ expect(separators).toHaveLength(3);
693
+ });
694
+ });
@@ -14,3 +14,34 @@ export type {
14
14
  } from './Breadcrumbs';
15
15
  export {BreadcrumbItem} from './BreadcrumbItem';
16
16
  export type {BreadcrumbItemProps} from './BreadcrumbItem';
17
+
18
+ // The breadcrumb `menu` prop reuses the DropdownMenu item API, so the item
19
+ // components are re-exported under `Breadcrumb*` aliases for family coherence
20
+ // and discoverability (mirroring ContextMenu). A consumer's existing
21
+ // DropdownMenu item definitions are portable into a breadcrumb menu verbatim.
22
+ export {
23
+ DropdownMenuItem as BreadcrumbMenuItem,
24
+ type DropdownMenuItemProps as BreadcrumbMenuItemProps,
25
+ } from '../DropdownMenu/DropdownMenuItem';
26
+ export {
27
+ DropdownMenuCheckboxItem as BreadcrumbMenuCheckboxItem,
28
+ type DropdownMenuCheckboxItemProps as BreadcrumbMenuCheckboxItemProps,
29
+ } from '../DropdownMenu/DropdownMenuCheckboxItem';
30
+ export {
31
+ DropdownMenuRadioGroup as BreadcrumbMenuRadioGroup,
32
+ type DropdownMenuRadioGroupProps as BreadcrumbMenuRadioGroupProps,
33
+ } from '../DropdownMenu/DropdownMenuRadioGroup';
34
+ export {
35
+ DropdownMenuRadioItem as BreadcrumbMenuRadioItem,
36
+ type DropdownMenuRadioItemProps as BreadcrumbMenuRadioItemProps,
37
+ } from '../DropdownMenu/DropdownMenuRadioItem';
38
+ export {
39
+ DropdownMenuSubMenu as BreadcrumbMenuSubMenu,
40
+ type DropdownMenuSubMenuProps as BreadcrumbMenuSubMenuProps,
41
+ } from '../DropdownMenu/DropdownMenuSubMenu';
42
+ export type {
43
+ DropdownMenuOption as BreadcrumbMenuOption,
44
+ DropdownMenuItemData as BreadcrumbMenuItemData,
45
+ DropdownMenuDivider as BreadcrumbMenuDivider,
46
+ DropdownMenuSection as BreadcrumbMenuSection,
47
+ } from '../DropdownMenu/DropdownMenu';
@@ -51,6 +51,13 @@ export const docs = {
51
51
  description: 'Size variant.',
52
52
  default: "'md'",
53
53
  },
54
+ {
55
+ name: 'elevation',
56
+ type: "'none' | 'low' | 'med' | 'high'",
57
+ description:
58
+ 'Resting shadow depth for floating buttons (e.g. a FAB). `none` is the default flat button; `low`/`med`/`high` map to the shadow token scale. Ignored inside a ButtonGroup, where elevation is owned by the group.',
59
+ default: "'none'",
60
+ },
54
61
  {
55
62
  name: 'type',
56
63
  type: "'button' | 'submit' | 'reset'",
@@ -156,8 +163,6 @@ export const docs = {
156
163
  ],
157
164
  vars: [
158
165
  {name: '--_button-radius', description: 'Border radius', default: 'var(--radius-element)', private: true},
159
- {name: '--button-press-scale', description: 'Active press transform', default: 'scale(0.98)'},
160
- {name: '--button-disabled-opacity', description: 'Opacity when disabled', default: '0.5'},
161
166
  {name: '--button-focus-offset', description: 'Focus ring outline offset', default: '3px'},
162
167
  {name: '--button-icon-only-aspect', description: 'Aspect ratio for icon-only buttons', default: '1 / 1'},
163
168
  ],
@@ -199,6 +204,7 @@ export const docsZh = {
199
204
  default: "'secondary'",
200
205
  },
201
206
  {name: 'size', type: "'sm' | 'md' | 'lg'", description: '尺寸变体。', default: "'md'"},
207
+ {name: 'elevation', type: "'none' | 'low' | 'med' | 'high'", description: '浮动按钮(如 FAB)的静止阴影深度。`none` 为默认扁平按钮;在 ButtonGroup 内忽略。', default: "'none'"},
202
208
  {name: 'type', type: "'button' | 'submit' | 'reset'", description: 'HTML 按钮类型属性。', default: "'button'"},
203
209
  {name: 'name', type: 'string', description: '表单提交的 HTML name 属性。'},
204
210
  {name: 'value', type: 'string | number | readonly string[]', description: '表单提交的 HTML value 属性。'},
@@ -239,8 +245,6 @@ export const docsZh = {
239
245
  ],
240
246
  vars: [
241
247
  {name: '--_button-radius', description: '圆角半径', default: 'var(--radius-element)', private: true},
242
- {name: '--button-press-scale', description: '按下时的变换', default: 'scale(0.98)'},
243
- {name: '--button-disabled-opacity', description: '禁用时的不透明度', default: '0.5'},
244
248
  {name: '--button-focus-offset', description: '焦点环轮廓偏移', default: '3px'},
245
249
  {name: '--button-icon-only-aspect', description: '纯图标按钮的宽高比', default: '1 / 1'},
246
250
  ],
@@ -271,6 +275,7 @@ export const docsDense = {
271
275
  label: 'accessible label; visible text by default, aria-label when isIconOnly',
272
276
  variant: 'visual style variant',
273
277
  size: 'size variant',
278
+ elevation: 'resting shadow depth for floating buttons/FABs: none|low|med|high; ignored inside ButtonGroup',
274
279
  type: 'HTML button type; defaults to "button"',
275
280
  name: 'HTML name for form submission',
276
281
  displayName: 'HTML name for form submission',
@@ -445,4 +445,53 @@ describe('Button', () => {
445
445
  rerender(<Button label="Submit" isLoading />);
446
446
  expect(liveRegion).toHaveTextContent('Loading');
447
447
  });
448
+
449
+ describe('elevation', () => {
450
+ it('renders a distinct class for each elevation level', () => {
451
+ const classFor = (elevation: 'none' | 'low' | 'med' | 'high') => {
452
+ const {container} = render(
453
+ <Button label="Save" elevation={elevation} />,
454
+ );
455
+ return container.querySelector('button')!.className;
456
+ };
457
+ const classes = new Set([
458
+ classFor('none'),
459
+ classFor('low'),
460
+ classFor('med'),
461
+ classFor('high'),
462
+ ]);
463
+ expect(classes.size).toBe(4);
464
+ });
465
+
466
+ it('defaults to flat (elevation none)', () => {
467
+ const {container: def} = render(<Button label="Save" />);
468
+ const {container: none} = render(
469
+ <Button label="Save" elevation="none" />,
470
+ );
471
+ expect(def.querySelector('button')!.className).toBe(
472
+ none.querySelector('button')!.className,
473
+ );
474
+ });
475
+ });
476
+
477
+ it('exposes aria-busy on the link-rendered button while loading', () => {
478
+ // Non-interruptible loading disables the button, which falls back to
479
+ // <button> rendering — so an anchor only shows loading when interruptible.
480
+ render(
481
+ <Button
482
+ label="Docs"
483
+ href="https://example.com"
484
+ isLoading
485
+ isInterruptible
486
+ />,
487
+ );
488
+ const link = screen.getByRole('link');
489
+ expect(link).toHaveAttribute('aria-busy', 'true');
490
+ });
491
+
492
+ it('does not set aria-busy on the link-rendered button when not loading', () => {
493
+ render(<Button label="Docs" href="https://example.com" />);
494
+ const link = screen.getByRole('link');
495
+ expect(link).not.toHaveAttribute('aria-busy');
496
+ });
448
497
  });
@@ -20,7 +20,7 @@
20
20
 
21
21
  import {useRef, useTransition, type ReactNode} from 'react';
22
22
  import type {BaseProps} from '../BaseProps';
23
- import type {SizeValue} from '../utils/types';
23
+ import type {Elevation, SizeValue} from '../utils/types';
24
24
  import * as stylex from '@stylexjs/stylex';
25
25
  import {useTooltip} from '../Tooltip/useTooltip';
26
26
  import {
@@ -33,6 +33,7 @@ import {
33
33
  easeVars,
34
34
  fontWeightVars,
35
35
  typeScaleVars,
36
+ shadowVars,
36
37
  } from '../theme/tokens.stylex';
37
38
  import {Spinner} from '../Spinner';
38
39
  import {VisuallyHidden} from '../VisuallyHidden';
@@ -160,6 +161,18 @@ const iconSizeStyles = stylex.create({
160
161
  lg: {width: 20, height: 20, fontSize: 20},
161
162
  });
162
163
 
164
+ /**
165
+ * Resting elevation for floating buttons (e.g. a FAB). `none` is the default
166
+ * flat button; `low`/`med`/`high` map to the shadow token scale. 'none' stays
167
+ * a literal so it never conflicts with a variant's background layering.
168
+ */
169
+ const elevationStyles = stylex.create({
170
+ none: {boxShadow: 'none'},
171
+ low: {boxShadow: shadowVars['--shadow-low']},
172
+ med: {boxShadow: shadowVars['--shadow-med']},
173
+ high: {boxShadow: shadowVars['--shadow-high']},
174
+ });
175
+
163
176
  /**
164
177
  * Variant styles using backgroundImage for layered colors
165
178
  * Pseudo-classes are nested within properties per StyleX recommendation
@@ -307,6 +320,12 @@ export interface ButtonProps extends BaseProps<HTMLButtonElement> {
307
320
  * @default 'md'
308
321
  */
309
322
  size?: ButtonSize;
323
+ /**
324
+ * Resting elevation — the shadow depth the button sits at. Use for floating
325
+ * buttons (FABs) that hover above content. `none` is the default flat button.
326
+ * @default 'none'
327
+ */
328
+ elevation?: Elevation;
310
329
  /**
311
330
  * Whether the button is disabled.
312
331
  * @default false
@@ -430,8 +449,8 @@ const loadingStyles = stylex.create({
430
449
  spinnerOverlay: {
431
450
  position: 'absolute',
432
451
  top: 0,
433
- left: 0,
434
- right: 0,
452
+ insetInlineStart: 0,
453
+ insetInlineEnd: 0,
435
454
  bottom: 0,
436
455
  display: 'grid',
437
456
  placeItems: 'center',
@@ -578,6 +597,7 @@ export function Button({
578
597
  icon,
579
598
  isIconOnly = false,
580
599
  width,
600
+ elevation = 'none',
581
601
  children,
582
602
  endContent,
583
603
  tooltip,
@@ -691,6 +711,9 @@ export function Button({
691
711
  (buttonGroup.orientation === 'horizontal'
692
712
  ? groupStyles.onSolidHorizontal
693
713
  : groupStyles.onSolidVertical),
714
+ // Standalone floating buttons only — a grouped button's elevation is owned
715
+ // by the ButtonGroup so the shared surface lifts as one unit.
716
+ !buttonGroup && elevationStyles[elevation],
694
717
  width != null && dynamicStyles.width(width),
695
718
  xstyle,
696
719
  );
@@ -786,6 +809,7 @@ export function Button({
786
809
  {...ariaLabelProp}
787
810
  {...describedByProp}
788
811
  {...edgeCompAttr}
812
+ aria-busy={isLoadingState || undefined}
789
813
  onClick={handleClick}>
790
814
  {buttonContent}
791
815
  </LinkComponent>
@@ -29,6 +29,7 @@ export const docs = {
29
29
  {name: 'orientation', type: "'horizontal' | 'vertical'", description: 'Layout direction of the button group.', default: "'horizontal'"},
30
30
  {name: 'size', type: "'sm' | 'md' | 'lg'", description: 'Default size for buttons in the group. Individual buttons can override.', default: "'md'"},
31
31
  {name: 'isDisabled', type: 'boolean', description: 'Whether all buttons in the group are disabled.', default: 'false'},
32
+ {name: 'elevation', type: "'none' | 'low' | 'med' | 'high'", description: 'Resting shadow depth for the whole group. The connected buttons share one surface, so the shadow lifts them as a unit. Use for a group that floats above content.', default: "'none'"},
32
33
  {name: 'ref', type: 'React.Ref<HTMLDivElement>', description: 'Ref forwarded to the root element.'},
33
34
  {name: 'xstyle', type: 'StyleXStyles', description: 'StyleX styles for layout customization. Must be a stylex.create() value.'},
34
35
  {name: 'data-testid', type: 'string', description: 'Test selector for automated testing frameworks.'},
@@ -66,6 +67,7 @@ export const docsZh = {
66
67
  orientation: '按钮组的布局方向。',
67
68
  size: '组内按钮的默认尺寸。单个按钮可覆盖。',
68
69
  isDisabled: '组内所有按钮是否禁用。',
70
+ elevation: '整个组的静止阴影深度。连接的按钮共享一个表面,阴影将它们作为整体抬起。',
69
71
  ref: '转发到根元素的引用。',
70
72
  xstyle: 'StyleX 样式,用于布局自定义。必须是 stylex.create() 的值。',
71
73
  'data-testid': '自动化测试的选择器。',
@@ -116,6 +118,7 @@ export const docsDense = {
116
118
  orientation: 'layout direction',
117
119
  size: 'default btn size; individual btns override',
118
120
  isDisabled: 'all btns disabled',
121
+ elevation: 'resting shadow depth for whole group: none|low|med|high',
119
122
  xstyle: 'StyleX layout styles; must be stylex.create() value',
120
123
  'data-testid': 'test selector',
121
124
  },
@@ -572,4 +572,41 @@ describe('ButtonGroup', () => {
572
572
  expect(hasRoundedTrailingCorners(save)).toBe(false);
573
573
  });
574
574
  });
575
+
576
+ describe('elevation', () => {
577
+ it('renders a distinct class on the group for each elevation level', () => {
578
+ const classFor = (elevation: 'none' | 'low' | 'med' | 'high') => {
579
+ const {container} = render(
580
+ <ButtonGroup label="Actions" elevation={elevation}>
581
+ <Button label="One" />
582
+ <Button label="Two" />
583
+ </ButtonGroup>,
584
+ );
585
+ return container.querySelector('[role="group"]')!.className;
586
+ };
587
+ const classes = new Set([
588
+ classFor('none'),
589
+ classFor('low'),
590
+ classFor('med'),
591
+ classFor('high'),
592
+ ]);
593
+ expect(classes.size).toBe(4);
594
+ });
595
+
596
+ it('defaults to flat (elevation none)', () => {
597
+ const {container: def} = render(
598
+ <ButtonGroup label="Actions">
599
+ <Button label="One" />
600
+ </ButtonGroup>,
601
+ );
602
+ const {container: none} = render(
603
+ <ButtonGroup label="Actions" elevation="none">
604
+ <Button label="One" />
605
+ </ButtonGroup>,
606
+ );
607
+ expect(def.querySelector('[role="group"]')!.className).toBe(
608
+ none.querySelector('[role="group"]')!.className,
609
+ );
610
+ });
611
+ });
575
612
  });