@astryxdesign/core 0.1.8 → 0.1.9-canary.09e9ddd

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 (610) 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 +53 -3
  7. package/dist/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/Avatar/Avatar.js +203 -49
  9. package/dist/Avatar/AvatarStatusDot.d.ts +33 -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 +208 -6
  23. package/dist/Breadcrumbs/index.d.ts +5 -0
  24. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  25. package/dist/Breadcrumbs/index.js +9 -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 +30 -2
  34. package/dist/Calendar/dayCellUtils.js +1 -1
  35. package/dist/Card/Card.d.ts +8 -2
  36. package/dist/Card/Card.d.ts.map +1 -1
  37. package/dist/Card/Card.js +28 -2
  38. package/dist/Carousel/Carousel.d.ts +4 -1
  39. package/dist/Carousel/Carousel.d.ts.map +1 -1
  40. package/dist/Carousel/Carousel.js +24 -4
  41. package/dist/Chat/ChatComposer.d.ts +8 -0
  42. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  43. package/dist/Chat/ChatComposer.js +46 -7
  44. package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
  45. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  46. package/dist/Chat/ChatComposerDrawer.js +11 -1
  47. package/dist/Chat/ChatComposerInput.d.ts +20 -3
  48. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  49. package/dist/Chat/ChatComposerInput.js +36 -4
  50. package/dist/Chat/ChatContext.d.ts +33 -0
  51. package/dist/Chat/ChatContext.d.ts.map +1 -1
  52. package/dist/Chat/ChatContext.js +16 -2
  53. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  54. package/dist/Chat/ChatDictationButton.js +1 -1
  55. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  56. package/dist/Chat/ChatLayout.js +4 -4
  57. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  58. package/dist/Chat/ChatLayoutScrollButton.js +4 -4
  59. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  60. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  61. package/dist/Chat/ChatSendButton.js +7 -1
  62. package/dist/Chat/ChatToolCalls.d.ts +5 -1
  63. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  64. package/dist/Chat/ChatToolCalls.js +18 -9
  65. package/dist/Chat/index.d.ts +2 -1
  66. package/dist/Chat/index.d.ts.map +1 -1
  67. package/dist/Chat/index.js +1 -1
  68. package/dist/Chat/useChatStreamScroll.d.ts +2 -1
  69. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  70. package/dist/Chat/useChatStreamScroll.js +22 -8
  71. package/dist/Chat/useSpeechRecognition.d.ts +0 -1
  72. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  73. package/dist/Chat/useSpeechRecognition.js +1 -1
  74. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  75. package/dist/Chat/useTriggerMenu.js +2 -2
  76. package/dist/CheckboxInput/CheckboxInput.js +1 -1
  77. package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
  78. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  79. package/dist/CheckboxList/CheckboxListItem.js +11 -1
  80. package/dist/Citation/Citation.d.ts +22 -1
  81. package/dist/Citation/Citation.d.ts.map +1 -1
  82. package/dist/Citation/Citation.js +20 -6
  83. package/dist/ClickableCard/ClickableCard.d.ts +9 -2
  84. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  85. package/dist/ClickableCard/ClickableCard.js +5 -2
  86. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  87. package/dist/CodeBlock/CodeBlock.js +9 -2
  88. package/dist/CommandPalette/CommandPalette.d.ts +1 -1
  89. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  90. package/dist/CommandPalette/CommandPalette.js +3 -1
  91. package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
  92. package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
  93. package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
  94. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  95. package/dist/CommandPalette/CommandPaletteInput.js +6 -1
  96. package/dist/CommandPalette/CommandPaletteItem.js +1 -1
  97. package/dist/DateInput/DateInput.d.ts +55 -2
  98. package/dist/DateInput/DateInput.d.ts.map +1 -1
  99. package/dist/DateInput/DateInput.js +28 -2
  100. package/dist/DateInput/index.d.ts +1 -1
  101. package/dist/DateInput/index.d.ts.map +1 -1
  102. package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
  103. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  104. package/dist/DateRangeInput/DateRangeInput.js +3 -1
  105. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  106. package/dist/DateTimeInput/DateTimeInput.js +18 -3
  107. package/dist/Dialog/Dialog.d.ts +3 -0
  108. package/dist/Dialog/Dialog.d.ts.map +1 -1
  109. package/dist/Dialog/Dialog.js +57 -6
  110. package/dist/Dialog/DialogContext.d.ts +7 -0
  111. package/dist/Dialog/DialogContext.d.ts.map +1 -1
  112. package/dist/Dialog/DialogContext.js +2 -2
  113. package/dist/Dialog/DialogHeader.d.ts +5 -2
  114. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  115. package/dist/Dialog/DialogHeader.js +6 -1
  116. package/dist/Divider/Divider.js +1 -1
  117. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
  118. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  119. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +1 -2
  120. package/dist/DropdownMenu/DropdownMenuItem.js +1 -1
  121. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
  122. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
  123. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
  124. package/dist/Field/Field.d.ts.map +1 -1
  125. package/dist/Field/Field.js +2 -3
  126. package/dist/Field/FieldLabel.d.ts +1 -1
  127. package/dist/Field/FieldLabel.d.ts.map +1 -1
  128. package/dist/Field/FieldLabel.js +43 -16
  129. package/dist/FieldStatus/FieldStatus.d.ts +15 -0
  130. package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
  131. package/dist/FieldStatus/FieldStatus.js +58 -6
  132. package/dist/FileInput/FileInput.d.ts +9 -2
  133. package/dist/FileInput/FileInput.d.ts.map +1 -1
  134. package/dist/FileInput/FileInput.js +42 -20
  135. package/dist/HoverCard/HoverCard.d.ts +9 -1
  136. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  137. package/dist/HoverCard/HoverCard.js +2 -0
  138. package/dist/HoverCard/useHoverCard.d.ts +8 -0
  139. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  140. package/dist/HoverCard/useHoverCard.js +7 -2
  141. package/dist/Icon/Icon.d.ts +7 -2
  142. package/dist/Icon/Icon.d.ts.map +1 -1
  143. package/dist/Item/Item.d.ts +6 -1
  144. package/dist/Item/Item.d.ts.map +1 -1
  145. package/dist/Item/Item.js +22 -1
  146. package/dist/Layer/useLayer.d.ts +6 -0
  147. package/dist/Layer/useLayer.d.ts.map +1 -1
  148. package/dist/Layer/useLayer.js +2 -0
  149. package/dist/Lightbox/Lightbox.js +4 -4
  150. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  151. package/dist/MobileNav/MobileNav.js +6 -1
  152. package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
  153. package/dist/MobileNav/MobileNavToggle.js +4 -0
  154. package/dist/MultiSelector/MultiSelector.d.ts +9 -1
  155. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  156. package/dist/MultiSelector/MultiSelector.js +41 -12
  157. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  158. package/dist/MultiSelector/hooks.js +16 -0
  159. package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
  160. package/dist/NumberInput/NumberInput.d.ts +9 -2
  161. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  162. package/dist/NumberInput/NumberInput.js +8 -1
  163. package/dist/Outline/Outline.d.ts +0 -1
  164. package/dist/Outline/Outline.d.ts.map +1 -1
  165. package/dist/Outline/Outline.js +0 -1
  166. package/dist/OverflowList/OverflowList.d.ts +20 -3
  167. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  168. package/dist/OverflowList/OverflowList.js +29 -4
  169. package/dist/Pagination/Pagination.d.ts.map +1 -1
  170. package/dist/Pagination/Pagination.js +11 -3
  171. package/dist/Popover/Popover.d.ts.map +1 -1
  172. package/dist/Popover/Popover.js +3 -2
  173. package/dist/Popover/usePopover.d.ts.map +1 -1
  174. package/dist/Popover/usePopover.js +3 -9
  175. package/dist/PowerSearch/PowerSearch.d.ts +9 -2
  176. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  177. package/dist/PowerSearch/PowerSearch.js +2 -0
  178. package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
  179. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  180. package/dist/SelectableCard/SelectableCard.d.ts +9 -2
  181. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  182. package/dist/SelectableCard/SelectableCard.js +16 -13
  183. package/dist/Selector/Selector.d.ts +8 -0
  184. package/dist/Selector/Selector.d.ts.map +1 -1
  185. package/dist/Selector/Selector.js +7 -3
  186. package/dist/Selector/hooks.d.ts.map +1 -1
  187. package/dist/Selector/hooks.js +16 -0
  188. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  189. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  190. package/dist/SideNav/SideNavHeading.js +21 -8
  191. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  192. package/dist/Slider/Slider.d.ts.map +1 -1
  193. package/dist/Slider/Slider.js +19 -2
  194. package/dist/Stack/stack.stylex.d.ts +9 -9
  195. package/dist/TabList/Tab.js +2 -2
  196. package/dist/TabList/TabMenu.js +1 -1
  197. package/dist/Table/BaseTable.d.ts.map +1 -1
  198. package/dist/Table/BaseTable.js +3 -2
  199. package/dist/Table/TableCell.js +3 -3
  200. package/dist/Table/TableHeaderCell.js +3 -3
  201. package/dist/Table/index.d.ts +2 -0
  202. package/dist/Table/index.d.ts.map +1 -1
  203. package/dist/Table/index.js +1 -0
  204. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  205. package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
  206. package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
  207. package/dist/Table/plugins/rowStatus/index.js +3 -0
  208. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
  209. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
  210. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
  211. package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
  212. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  213. package/dist/Table/plugins/selection/useTableSelection.js +4 -1
  214. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
  215. package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
  216. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  217. package/dist/Table/plugins/tree/useTableTreeData.js +87 -0
  218. package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
  219. package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
  220. package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
  221. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  222. package/dist/Table/useBaseTablePlugins.js +5 -3
  223. package/dist/TextArea/TextArea.d.ts +9 -1
  224. package/dist/TextArea/TextArea.d.ts.map +1 -1
  225. package/dist/TextArea/TextArea.js +2 -0
  226. package/dist/TextInput/TextInput.d.ts +9 -2
  227. package/dist/TextInput/TextInput.d.ts.map +1 -1
  228. package/dist/TextInput/TextInput.js +6 -1
  229. package/dist/Thumbnail/Thumbnail.d.ts +26 -5
  230. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  231. package/dist/Thumbnail/Thumbnail.js +97 -54
  232. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
  233. package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
  234. package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
  235. package/dist/TimeInput/TimeInput.d.ts +9 -2
  236. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  237. package/dist/TimeInput/TimeInput.js +17 -4
  238. package/dist/Timestamp/Timestamp.d.ts +3 -1
  239. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  240. package/dist/Timestamp/Timestamp.js +8 -6
  241. package/dist/Toast/useToast.d.ts.map +1 -1
  242. package/dist/Toast/useToast.js +2 -5
  243. package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
  244. package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
  245. package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
  246. package/dist/Tokenizer/Tokenizer.d.ts +10 -3
  247. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  248. package/dist/Tokenizer/Tokenizer.js +18 -4
  249. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  250. package/dist/TopNav/TopNavHeading.js +18 -8
  251. package/dist/TopNav/TopNavMegaMenu.js +10 -4
  252. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
  253. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  254. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
  255. package/dist/TopNav/TopNavMenu.d.ts +2 -1
  256. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  257. package/dist/TopNav/TopNavMenu.js +68 -6
  258. package/dist/TreeList/TreeList.d.ts +12 -3
  259. package/dist/TreeList/TreeList.d.ts.map +1 -1
  260. package/dist/TreeList/TreeList.js +2 -0
  261. package/dist/TreeList/TreeListBranches.d.ts +5 -0
  262. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  263. package/dist/TreeList/TreeListBranches.js +10 -4
  264. package/dist/TreeList/TreeListItem.d.ts +8 -2
  265. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  266. package/dist/TreeList/TreeListItem.js +28 -8
  267. package/dist/TreeList/TreeListTypes.d.ts +25 -1
  268. package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
  269. package/dist/TreeList/index.d.ts +2 -2
  270. package/dist/TreeList/index.d.ts.map +1 -1
  271. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  272. package/dist/Typeahead/BaseTypeahead.js +20 -11
  273. package/dist/Typeahead/Typeahead.d.ts +9 -2
  274. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  275. package/dist/Typeahead/Typeahead.js +2 -0
  276. package/dist/astryx.css +41 -31
  277. package/dist/astryx.umd.js +51 -51
  278. package/dist/astryx.umd.js.map +4 -4
  279. package/dist/authoring/doc.d.ts.map +1 -1
  280. package/dist/docs-types.d.ts +8 -0
  281. package/dist/docs-types.d.ts.map +1 -1
  282. package/dist/hooks/computeOverflow.d.ts +47 -0
  283. package/dist/hooks/computeOverflow.d.ts.map +1 -0
  284. package/dist/hooks/computeOverflow.js +213 -0
  285. package/dist/hooks/index.d.ts +1 -0
  286. package/dist/hooks/index.d.ts.map +1 -1
  287. package/dist/hooks/index.js +2 -1
  288. package/dist/hooks/isRtlElement.d.ts +18 -0
  289. package/dist/hooks/isRtlElement.d.ts.map +1 -0
  290. package/dist/hooks/isRtlElement.js +27 -0
  291. package/dist/hooks/useDevWarning.d.ts +18 -0
  292. package/dist/hooks/useDevWarning.d.ts.map +1 -0
  293. package/dist/hooks/useDevWarning.js +49 -0
  294. package/dist/hooks/useGridFocus.d.ts +6 -1
  295. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  296. package/dist/hooks/useGridFocus.js +12 -9
  297. package/dist/hooks/useListFocus.d.ts +6 -1
  298. package/dist/hooks/useListFocus.d.ts.map +1 -1
  299. package/dist/hooks/useListFocus.js +12 -4
  300. package/dist/hooks/useOverflow.d.ts +19 -0
  301. package/dist/hooks/useOverflow.d.ts.map +1 -1
  302. package/dist/hooks/useOverflow.js +36 -25
  303. package/dist/i18n/InternationalizationContext.d.ts +1 -0
  304. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  305. package/dist/i18n/InternationalizationContext.js +3 -0
  306. package/dist/i18n/InternationalizationProvider.d.ts +8 -1
  307. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  308. package/dist/i18n/InternationalizationProvider.js +5 -1
  309. package/dist/i18n/getLocaleDirection.d.ts +18 -0
  310. package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
  311. package/dist/i18n/getLocaleDirection.js +29 -0
  312. package/dist/i18n/index.d.ts +6 -0
  313. package/dist/i18n/index.d.ts.map +1 -1
  314. package/dist/i18n/index.js +7 -1
  315. package/dist/i18n/resolve.d.ts.map +1 -1
  316. package/dist/i18n/resolve.js +7 -18
  317. package/dist/i18n/useDirection.d.ts +2 -0
  318. package/dist/i18n/useDirection.d.ts.map +1 -0
  319. package/dist/i18n/useDirection.js +27 -0
  320. package/dist/theme/Theme.d.ts.map +1 -1
  321. package/dist/theme/Theme.js +2 -7
  322. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  323. package/dist/theme/derivedVarRegistry.js +13 -0
  324. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  325. package/dist/theme/generateThemeRules.js +51 -0
  326. package/dist/theme/hct.d.ts +0 -1
  327. package/dist/theme/hct.d.ts.map +1 -1
  328. package/dist/theme/hct.js +1 -1
  329. package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
  330. package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
  331. package/dist/utils/devWarning.d.ts +42 -0
  332. package/dist/utils/devWarning.d.ts.map +1 -0
  333. package/dist/utils/devWarning.js +88 -0
  334. package/dist/utils/index.d.ts +3 -1
  335. package/dist/utils/index.d.ts.map +1 -1
  336. package/dist/utils/index.js +3 -2
  337. package/dist/utils/plainDate.d.ts +30 -0
  338. package/dist/utils/plainDate.d.ts.map +1 -1
  339. package/dist/utils/plainDate.js +53 -0
  340. package/dist/utils/types.d.ts +13 -0
  341. package/dist/utils/types.d.ts.map +1 -1
  342. package/locales/en.json +32 -0
  343. package/locales/fr-FR.json +14 -0
  344. package/locales/pseudo.json +24 -0
  345. package/package.json +1 -1
  346. package/src/AppShell/AppShell.tsx +6 -0
  347. package/src/AppShell/AppShellMobileContext.tsx +8 -0
  348. package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
  349. package/src/Avatar/Avatar.doc.mjs +60 -3
  350. package/src/Avatar/Avatar.test.tsx +281 -1
  351. package/src/Avatar/Avatar.tsx +324 -64
  352. package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
  353. package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
  354. package/src/Avatar/AvatarStatusDot.tsx +178 -21
  355. package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
  356. package/src/AvatarGroup/AvatarGroup.test.tsx +125 -0
  357. package/src/AvatarGroup/AvatarGroup.tsx +58 -3
  358. package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
  359. package/src/Banner/Banner.doc.mjs +9 -0
  360. package/src/Banner/Banner.test.tsx +30 -0
  361. package/src/Banner/Banner.tsx +53 -9
  362. package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
  363. package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
  364. package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
  365. package/src/Breadcrumbs/Breadcrumbs.test.tsx +284 -2
  366. package/src/Breadcrumbs/index.ts +27 -0
  367. package/src/Button/Button.doc.mjs +9 -4
  368. package/src/Button/Button.test.tsx +49 -0
  369. package/src/Button/Button.tsx +27 -3
  370. package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
  371. package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
  372. package/src/ButtonGroup/ButtonGroup.tsx +32 -0
  373. package/src/Calendar/Calendar.doc.mjs +12 -1
  374. package/src/Calendar/Calendar.test.tsx +193 -0
  375. package/src/Calendar/Calendar.tsx +38 -16
  376. package/src/Calendar/dayCellUtils.test.ts +5 -0
  377. package/src/Calendar/dayCellUtils.ts +1 -1
  378. package/src/Card/Card.doc.mjs +9 -0
  379. package/src/Card/Card.test.tsx +21 -3
  380. package/src/Card/Card.tsx +35 -2
  381. package/src/Carousel/Carousel.doc.mjs +1 -0
  382. package/src/Carousel/Carousel.test.tsx +53 -0
  383. package/src/Carousel/Carousel.tsx +34 -4
  384. package/src/Chat/ChatComposer.doc.mjs +12 -3
  385. package/src/Chat/ChatComposer.test.tsx +115 -0
  386. package/src/Chat/ChatComposer.tsx +73 -9
  387. package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
  388. package/src/Chat/ChatComposerDrawer.tsx +11 -1
  389. package/src/Chat/ChatComposerInput.doc.mjs +7 -0
  390. package/src/Chat/ChatComposerInput.test.tsx +103 -0
  391. package/src/Chat/ChatComposerInput.tsx +51 -5
  392. package/src/Chat/ChatContext.tsx +37 -10
  393. package/src/Chat/ChatDictationButton.tsx +4 -1
  394. package/src/Chat/ChatLayout.tsx +7 -5
  395. package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
  396. package/src/Chat/ChatMessageMetadata.tsx +1 -2
  397. package/src/Chat/ChatSendButton.tsx +11 -1
  398. package/src/Chat/ChatToolCalls.test.tsx +64 -0
  399. package/src/Chat/ChatToolCalls.tsx +25 -4
  400. package/src/Chat/index.ts +5 -1
  401. package/src/Chat/useChatStreamScroll.test.tsx +49 -0
  402. package/src/Chat/useChatStreamScroll.ts +27 -10
  403. package/src/Chat/useSpeechRecognition.ts +1 -1
  404. package/src/Chat/useTriggerMenu.tsx +4 -2
  405. package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
  406. package/src/CheckboxInput/CheckboxInput.tsx +1 -1
  407. package/src/CheckboxList/CheckboxList.test.tsx +81 -3
  408. package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
  409. package/src/CheckboxList/CheckboxListItem.tsx +41 -5
  410. package/src/Citation/Citation.doc.mjs +4 -3
  411. package/src/Citation/Citation.test.tsx +97 -0
  412. package/src/Citation/Citation.tsx +43 -11
  413. package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
  414. package/src/ClickableCard/ClickableCard.test.tsx +34 -0
  415. package/src/ClickableCard/ClickableCard.tsx +13 -3
  416. package/src/CodeBlock/CodeBlock.test.tsx +56 -0
  417. package/src/CodeBlock/CodeBlock.tsx +10 -2
  418. package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
  419. package/src/CommandPalette/CommandPalette.tsx +3 -1
  420. package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
  421. package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
  422. package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
  423. package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
  424. package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
  425. package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
  426. package/src/ContextMenu/ContextMenu.test.tsx +193 -0
  427. package/src/DateInput/DateInput.doc.mjs +31 -0
  428. package/src/DateInput/DateInput.test.tsx +131 -0
  429. package/src/DateInput/DateInput.tsx +78 -3
  430. package/src/DateInput/index.ts +1 -0
  431. package/src/DateRangeInput/DateRangeInput.doc.mjs +8 -0
  432. package/src/DateRangeInput/DateRangeInput.test.tsx +23 -0
  433. package/src/DateRangeInput/DateRangeInput.tsx +13 -3
  434. package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -1
  435. package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
  436. package/src/DateTimeInput/DateTimeInput.tsx +42 -18
  437. package/src/Dialog/Dialog.doc.mjs +2 -2
  438. package/src/Dialog/Dialog.test.tsx +77 -4
  439. package/src/Dialog/Dialog.tsx +89 -5
  440. package/src/Dialog/DialogContext.ts +9 -2
  441. package/src/Dialog/DialogHeader.doc.mjs +2 -2
  442. package/src/Dialog/DialogHeader.tsx +9 -2
  443. package/src/Divider/Divider.tsx +2 -2
  444. package/src/DropdownMenu/DropdownMenu.test.tsx +169 -0
  445. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +1 -2
  446. package/src/DropdownMenu/DropdownMenuItem.tsx +1 -1
  447. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
  448. package/src/Field/Field.test.tsx +57 -12
  449. package/src/Field/Field.tsx +6 -5
  450. package/src/Field/FieldLabel.tsx +9 -1
  451. package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
  452. package/src/FieldStatus/FieldStatus.test.tsx +150 -40
  453. package/src/FieldStatus/FieldStatus.tsx +63 -5
  454. package/src/FileInput/FileInput.doc.mjs +17 -2
  455. package/src/FileInput/FileInput.test.tsx +135 -12
  456. package/src/FileInput/FileInput.tsx +53 -28
  457. package/src/HoverCard/HoverCard.doc.mjs +13 -0
  458. package/src/HoverCard/HoverCard.test.tsx +21 -2
  459. package/src/HoverCard/HoverCard.tsx +11 -0
  460. package/src/HoverCard/useHoverCard.doc.mjs +2 -0
  461. package/src/HoverCard/useHoverCard.tsx +24 -2
  462. package/src/Icon/Icon.doc.mjs +3 -2
  463. package/src/Icon/Icon.tsx +7 -2
  464. package/src/IconButton/IconButton.doc.mjs +8 -0
  465. package/src/IconButton/IconButton.test.tsx +15 -18
  466. package/src/Item/Item.test.tsx +40 -18
  467. package/src/Item/Item.tsx +38 -2
  468. package/src/Layer/useLayer.tsx +8 -0
  469. package/src/Lightbox/Lightbox.tsx +4 -4
  470. package/src/List/List.test.tsx +9 -8
  471. package/src/MobileNav/MobileNav.tsx +12 -1
  472. package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
  473. package/src/MobileNav/MobileNavToggle.tsx +9 -1
  474. package/src/MultiSelector/MultiSelector.doc.mjs +13 -2
  475. package/src/MultiSelector/MultiSelector.test.tsx +195 -3
  476. package/src/MultiSelector/MultiSelector.tsx +65 -12
  477. package/src/MultiSelector/hooks.ts +17 -0
  478. package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
  479. package/src/NumberInput/NumberInput.doc.mjs +15 -0
  480. package/src/NumberInput/NumberInput.test.tsx +82 -7
  481. package/src/NumberInput/NumberInput.tsx +21 -4
  482. package/src/Outline/Outline.tsx +0 -1
  483. package/src/OverflowList/OverflowList.doc.mjs +39 -6
  484. package/src/OverflowList/OverflowList.test.tsx +111 -0
  485. package/src/OverflowList/OverflowList.tsx +48 -8
  486. package/src/Pagination/Pagination.tsx +11 -3
  487. package/src/Popover/Popover.tsx +7 -4
  488. package/src/Popover/usePopover.tsx +9 -13
  489. package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
  490. package/src/PowerSearch/PowerSearch.test.tsx +43 -0
  491. package/src/PowerSearch/PowerSearch.tsx +10 -1
  492. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
  493. package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
  494. package/src/PowerSearch/usePowerSearchSource.ts +1 -2
  495. package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
  496. package/src/SelectableCard/SelectableCard.test.tsx +46 -4
  497. package/src/SelectableCard/SelectableCard.tsx +29 -16
  498. package/src/Selector/Selector.doc.mjs +7 -0
  499. package/src/Selector/Selector.test.tsx +92 -0
  500. package/src/Selector/Selector.tsx +16 -2
  501. package/src/Selector/hooks.ts +17 -0
  502. package/src/SideNav/SideNav.test.tsx +119 -3
  503. package/src/SideNav/SideNavCollapseButton.tsx +6 -1
  504. package/src/SideNav/SideNavHeading.tsx +24 -8
  505. package/src/SideNav/SideNavItem.tsx +5 -1
  506. package/src/Slider/Slider.test.tsx +75 -2
  507. package/src/Slider/Slider.tsx +21 -5
  508. package/src/Switch/Switch.test.tsx +32 -1
  509. package/src/TabList/Tab.tsx +2 -2
  510. package/src/TabList/TabMenu.tsx +2 -2
  511. package/src/Table/BaseTable.tsx +3 -5
  512. package/src/Table/TableCell.tsx +3 -3
  513. package/src/Table/TableHeaderCell.tsx +3 -3
  514. package/src/Table/index.ts +5 -0
  515. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +6 -2
  516. package/src/Table/plugins/rowStatus/index.ts +7 -0
  517. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
  518. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
  519. package/src/Table/plugins/selection/useTableSelection.test.tsx +16 -0
  520. package/src/Table/plugins/selection/useTableSelection.tsx +19 -1
  521. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
  522. package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
  523. package/src/Table/plugins/tree/useTableTreeData.tsx +128 -1
  524. package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
  525. package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
  526. package/src/Table/useBaseTablePlugins.ts +10 -6
  527. package/src/Table/useTableRowStatus.doc.mjs +30 -0
  528. package/src/Table/useTableSelection.doc.mjs +65 -14
  529. package/src/Table/useTableTreeData.doc.mjs +29 -0
  530. package/src/Table/useTableTreeState.doc.mjs +2 -2
  531. package/src/TextArea/TextArea.doc.mjs +15 -0
  532. package/src/TextArea/TextArea.test.tsx +32 -1
  533. package/src/TextArea/TextArea.tsx +10 -0
  534. package/src/TextInput/TextInput.doc.mjs +15 -0
  535. package/src/TextInput/TextInput.test.tsx +44 -0
  536. package/src/TextInput/TextInput.tsx +13 -1
  537. package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
  538. package/src/Thumbnail/Thumbnail.test.tsx +98 -7
  539. package/src/Thumbnail/Thumbnail.tsx +142 -42
  540. package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
  541. package/src/TimeInput/TimeInput.doc.mjs +15 -0
  542. package/src/TimeInput/TimeInput.test.tsx +99 -1
  543. package/src/TimeInput/TimeInput.tsx +29 -6
  544. package/src/Timestamp/Timestamp.doc.mjs +4 -4
  545. package/src/Timestamp/Timestamp.test.tsx +32 -0
  546. package/src/Timestamp/Timestamp.tsx +28 -8
  547. package/src/Toast/useToast.tsx +7 -8
  548. package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
  549. package/src/Tokenizer/Tokenizer.doc.mjs +30 -1
  550. package/src/Tokenizer/Tokenizer.test.tsx +206 -2
  551. package/src/Tokenizer/Tokenizer.tsx +26 -4
  552. package/src/TopNav/TopNav.test.tsx +125 -1
  553. package/src/TopNav/TopNavHeading.tsx +24 -8
  554. package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
  555. package/src/TopNav/TopNavMegaMenu.tsx +10 -4
  556. package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
  557. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
  558. package/src/TopNav/TopNavMenu.test.tsx +118 -4
  559. package/src/TopNav/TopNavMenu.tsx +83 -5
  560. package/src/TreeList/TreeList.doc.mjs +22 -0
  561. package/src/TreeList/TreeList.test.tsx +232 -0
  562. package/src/TreeList/TreeList.tsx +18 -2
  563. package/src/TreeList/TreeListBranches.tsx +16 -2
  564. package/src/TreeList/TreeListItem.tsx +52 -12
  565. package/src/TreeList/TreeListTypes.ts +27 -1
  566. package/src/TreeList/index.ts +2 -2
  567. package/src/Typeahead/BaseTypeahead.tsx +30 -15
  568. package/src/Typeahead/Typeahead.doc.mjs +7 -0
  569. package/src/Typeahead/Typeahead.test.tsx +50 -0
  570. package/src/Typeahead/Typeahead.tsx +10 -0
  571. package/src/authoring/doc.ts +1 -3
  572. package/src/docs-types.ts +5 -0
  573. package/src/hooks/computeOverflow.test.ts +422 -0
  574. package/src/hooks/computeOverflow.ts +290 -0
  575. package/src/hooks/index.ts +2 -0
  576. package/src/hooks/isRtlElement.ts +27 -0
  577. package/src/hooks/useDevWarning.test.tsx +45 -0
  578. package/src/hooks/useDevWarning.ts +54 -0
  579. package/src/hooks/useGridFocus.doc.mjs +3 -3
  580. package/src/hooks/useGridFocus.test.tsx +41 -0
  581. package/src/hooks/useGridFocus.ts +21 -10
  582. package/src/hooks/useListFocus.doc.mjs +3 -3
  583. package/src/hooks/useListFocus.test.tsx +67 -1
  584. package/src/hooks/useListFocus.ts +21 -5
  585. package/src/hooks/useOverflow.test.ts +96 -4
  586. package/src/hooks/useOverflow.ts +74 -33
  587. package/src/i18n/InternationalizationContext.ts +4 -0
  588. package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
  589. package/src/i18n/InternationalizationProvider.tsx +12 -2
  590. package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
  591. package/src/i18n/__tests__/useDirection.test.tsx +66 -0
  592. package/src/i18n/getLocaleDirection.ts +29 -0
  593. package/src/i18n/index.ts +6 -0
  594. package/src/i18n/resolve.ts +9 -21
  595. package/src/i18n/useDirection.ts +29 -0
  596. package/src/reset.css +0 -26
  597. package/src/reset.test.ts +60 -0
  598. package/src/theme/Theme.tsx +11 -14
  599. package/src/theme/derivedVarRegistry.test.ts +1 -0
  600. package/src/theme/derivedVarRegistry.ts +6 -0
  601. package/src/theme/generateThemeRules.test.ts +107 -0
  602. package/src/theme/generateThemeRules.ts +56 -0
  603. package/src/theme/hct.ts +1 -1
  604. package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
  605. package/src/utils/devWarning.test.ts +56 -0
  606. package/src/utils/devWarning.ts +102 -0
  607. package/src/utils/index.ts +6 -0
  608. package/src/utils/plainDate.test.ts +22 -0
  609. package/src/utils/plainDate.ts +61 -0
  610. package/src/utils/types.ts +14 -0
@@ -226,3 +226,128 @@ describe('AvatarGroupOverflow — hardening', () => {
226
226
  expect(screen.getByLabelText('4912 more')).toBeInTheDocument();
227
227
  });
228
228
  });
229
+
230
+ describe('AvatarGroup — roving focus + keyboard hint', () => {
231
+ it('is a single tab stop over interactive avatars (one tabindex=0, rest -1)', () => {
232
+ render(
233
+ <AvatarGroup>
234
+ <Avatar name="Alice" href="/alice" />
235
+ <Avatar name="Bob" href="/bob" />
236
+ <Avatar name="Charlie" href="/charlie" />
237
+ </AvatarGroup>,
238
+ );
239
+
240
+ const alice = screen.getByRole('link', {name: 'Alice'});
241
+ const bob = screen.getByRole('link', {name: 'Bob'});
242
+ const charlie = screen.getByRole('link', {name: 'Charlie'});
243
+
244
+ expect(alice).toHaveAttribute('tabindex', '0');
245
+ expect(bob).toHaveAttribute('tabindex', '-1');
246
+ expect(charlie).toHaveAttribute('tabindex', '-1');
247
+ });
248
+
249
+ it('roves focus with ArrowRight/ArrowLeft across interactive avatars', async () => {
250
+ const user = userEvent.setup();
251
+ render(
252
+ <AvatarGroup>
253
+ <Avatar name="Alice" href="/alice" />
254
+ <Avatar name="Bob" onClick={() => {}} />
255
+ <Avatar name="Charlie" href="/charlie" />
256
+ </AvatarGroup>,
257
+ );
258
+
259
+ const alice = screen.getByRole('link', {name: 'Alice'});
260
+ const bob = screen.getByRole('button', {name: 'Bob'});
261
+ const charlie = screen.getByRole('link', {name: 'Charlie'});
262
+
263
+ alice.focus();
264
+ expect(alice).toHaveFocus();
265
+
266
+ await user.keyboard('{ArrowRight}');
267
+ expect(bob).toHaveFocus();
268
+ expect(bob).toHaveAttribute('tabindex', '0');
269
+ expect(alice).toHaveAttribute('tabindex', '-1');
270
+
271
+ await user.keyboard('{ArrowRight}');
272
+ expect(charlie).toHaveFocus();
273
+
274
+ await user.keyboard('{ArrowLeft}');
275
+ expect(bob).toHaveFocus();
276
+ });
277
+
278
+ it('includes the overflow button as the last roving item', async () => {
279
+ const user = userEvent.setup();
280
+ render(
281
+ <AvatarGroup>
282
+ <Avatar name="Alice" href="/alice" />
283
+ <AvatarGroupOverflow count={3} onClick={() => {}} />
284
+ </AvatarGroup>,
285
+ );
286
+
287
+ const alice = screen.getByRole('link', {name: 'Alice'});
288
+ const overflow = screen.getByRole('button', {name: '3 more'});
289
+ expect(overflow).toHaveAttribute('data-avatar-item');
290
+
291
+ alice.focus();
292
+ await user.keyboard('{ArrowRight}');
293
+ expect(overflow).toHaveFocus();
294
+ });
295
+
296
+ it('does NOT rove over a non-avatar button in a status slot', async () => {
297
+ const user = userEvent.setup();
298
+ render(
299
+ <AvatarGroup>
300
+ <Avatar
301
+ name="Alice"
302
+ href="/alice"
303
+ status={<button type="button">badge</button>}
304
+ />
305
+ <Avatar name="Bob" href="/bob" />
306
+ </AvatarGroup>,
307
+ );
308
+
309
+ const alice = screen.getByRole('link', {name: 'Alice'});
310
+ const bob = screen.getByRole('link', {name: 'Bob'});
311
+ const statusButton = screen.getByRole('button', {name: 'badge'});
312
+
313
+ // The status button carries no data-avatar-item marker.
314
+ expect(statusButton).not.toHaveAttribute('data-avatar-item');
315
+
316
+ alice.focus();
317
+ await user.keyboard('{ArrowRight}');
318
+ // Arrow moves to the next avatar, skipping the nested status button.
319
+ expect(bob).toHaveFocus();
320
+ expect(statusButton).not.toHaveFocus();
321
+ });
322
+
323
+ it('attaches an aria-describedby keyboard hint when interactive children exist', () => {
324
+ render(
325
+ <AvatarGroup>
326
+ <Avatar name="Alice" href="/alice" />
327
+ <Avatar name="Bob" href="/bob" />
328
+ </AvatarGroup>,
329
+ );
330
+
331
+ const group = screen.getByRole('group');
332
+ const describedBy = group.getAttribute('aria-describedby');
333
+ expect(describedBy).toBeTruthy();
334
+ const hint = document.getElementById(describedBy!);
335
+ expect(hint).not.toBeNull();
336
+ expect(hint).toHaveTextContent('Use arrow keys to move between avatars');
337
+ });
338
+
339
+ it('a purely static group has no tab stop and no keyboard hint', () => {
340
+ render(
341
+ <AvatarGroup>
342
+ <Avatar name="Alice" data-testid="alice" />
343
+ <Avatar name="Bob" data-testid="bob" />
344
+ </AvatarGroup>,
345
+ );
346
+
347
+ const group = screen.getByRole('group');
348
+ expect(group).not.toHaveAttribute('aria-describedby');
349
+ // Static avatars are not focusable — no roving tabindex stamped.
350
+ expect(screen.getByTestId('alice')).not.toHaveAttribute('tabindex');
351
+ expect(screen.getByTestId('bob')).not.toHaveAttribute('tabindex');
352
+ });
353
+ });
@@ -11,6 +11,12 @@
11
11
  * one AvatarGroupOverflow). The group provides overlap styling via
12
12
  * context — no child introspection needed.
13
13
  *
14
+ * When the group contains interactive avatars (rendered as links/buttons) or an
15
+ * interactive AvatarGroupOverflow, it becomes a single Tab stop with roving
16
+ * arrow-key focus (via useListFocus with hasRovingTabIndex) and exposes a
17
+ * screen-reader keyboard hint via aria-describedby. A purely static facepile
18
+ * gets neither — it stays a plain non-focusable group.
19
+ *
14
20
  * SYNC: When modified, update these files to stay in sync:
15
21
  * - /packages/core/src/AvatarGroup/AvatarGroup.doc.mjs (props table, features)
16
22
  * - /packages/core/src/AvatarGroup/index.ts (exports if types change)
@@ -18,14 +24,18 @@
18
24
  * - /packages/cli/templates/blocks/components/AvatarGroup/ (showcase blocks)
19
25
  */
20
26
 
21
- import {useMemo, type ReactNode} from 'react';
27
+ import {useId, useMemo, useState, type ReactNode} from 'react';
22
28
  import type {BaseProps} from '../BaseProps';
23
29
  import {resolveSize, type AvatarSize} from '../Avatar';
24
30
  import * as stylex from '@stylexjs/stylex';
25
- import {mergeProps} from '../utils';
31
+ import {mergeProps, mergeRefs} from '../utils';
32
+ import {composeEventHandlers} from '../utils/composeEventHandlers';
26
33
  import {AvatarGroupContext} from './AvatarGroupContext';
27
34
  import {themeProps} from '../utils/themeProps';
28
35
  import {useTranslator} from '../i18n';
36
+ import {useListFocus} from '../hooks/useListFocus';
37
+ import {useIsomorphicLayoutEffect} from '../hooks/useIsomorphicLayoutEffect';
38
+ import {VisuallyHidden} from '../VisuallyHidden';
29
39
 
30
40
  const OVERLAP_RATIO = 0.25;
31
41
 
@@ -78,6 +88,9 @@ export function AvatarGroup({
78
88
  size = 'md',
79
89
  'data-testid': testId,
80
90
  'aria-label': ariaLabelFromProps,
91
+ 'aria-describedby': ariaDescribedByFromProps,
92
+ onKeyDown,
93
+ onFocus,
81
94
  xstyle,
82
95
  className,
83
96
  style,
@@ -94,14 +107,51 @@ export function AvatarGroup({
94
107
  [size, overlap, numericSize],
95
108
  );
96
109
 
110
+ // The keyboard hint and roving tab stop only make sense once the group has
111
+ // interactive children. Detect their presence (and the writing direction for
112
+ // RTL-correct arrow navigation) from the rendered DOM after commit, matching
113
+ // how the codebase reads direction elsewhere (`getComputedStyle(el).direction`).
114
+ const [hasInteractiveItems, setHasInteractiveItems] = useState(false);
115
+ const [isRtl, setIsRtl] = useState(false);
116
+
117
+ // Single tab stop + roving arrow focus over the group's interactive items.
118
+ // `itemSelector` targets the shared `[data-avatar-item]` marker stamped on
119
+ // interactive avatars (their rendered <a>/<button>) and on the overflow
120
+ // button — NOT a tag/role selector — so roving never catches a nested button
121
+ // inside a custom status/badge slot (O5).
122
+ const {listRef, handleKeyDown, handleFocus} = useListFocus<HTMLDivElement>({
123
+ itemSelector: '[data-avatar-item]',
124
+ orientation: 'horizontal',
125
+ hasRovingTabIndex: true,
126
+ isRtl,
127
+ });
128
+
129
+ useIsomorphicLayoutEffect(() => {
130
+ const root = listRef.current;
131
+ if (!root) {
132
+ return;
133
+ }
134
+ setHasInteractiveItems(root.querySelector('[data-avatar-item]') != null);
135
+ setIsRtl(getComputedStyle(root).direction === 'rtl');
136
+ });
137
+
138
+ const hintId = useId();
139
+ const describedBy =
140
+ [ariaDescribedByFromProps, hasInteractiveItems ? hintId : null]
141
+ .filter(Boolean)
142
+ .join(' ') || undefined;
143
+
97
144
  return (
98
145
  <AvatarGroupContext value={contextValue}>
99
146
  <div
100
147
  {...props}
101
- ref={ref}
148
+ ref={mergeRefs(ref, listRef)}
102
149
  role="group"
103
150
  aria-label={ariaLabel}
151
+ aria-describedby={describedBy}
104
152
  data-testid={testId}
153
+ onKeyDown={composeEventHandlers(onKeyDown, handleKeyDown)}
154
+ onFocus={composeEventHandlers(onFocus, handleFocus)}
105
155
  {...mergeProps(
106
156
  themeProps('avatar-group', {size}),
107
157
  stylex.props(styles.root, xstyle),
@@ -109,6 +159,11 @@ export function AvatarGroup({
109
159
  style,
110
160
  )}>
111
161
  {children}
162
+ {hasInteractiveItems && (
163
+ <VisuallyHidden id={hintId}>
164
+ {t('@astryx.avatarGroup.keyboardHint')}
165
+ </VisuallyHidden>
166
+ )}
112
167
  </div>
113
168
  </AvatarGroupContext>
114
169
  );
@@ -165,6 +165,7 @@ export function AvatarGroupOverflow({
165
165
  onClick={onClick}
166
166
  {...rest}
167
167
  aria-label={label}
168
+ data-avatar-item=""
168
169
  {...mergeProps(
169
170
  themeProps('avatar-group-overflow'),
170
171
  stylex.props(
@@ -81,6 +81,13 @@ export const docs = {
81
81
  'Container type: card has border-radius; section is full-width with no border-radius for page-level use.',
82
82
  default: "'card'",
83
83
  },
84
+ {
85
+ name: 'elevation',
86
+ type: "'none' | 'low' | 'med' | 'high'",
87
+ description:
88
+ 'Resting shadow depth. Use for a floating banner that hovers above content; `none` is the default inline banner. A `card`-container banner rounds its shadow to match.',
89
+ default: "'none'",
90
+ },
84
91
  {
85
92
  name: 'children',
86
93
  type: 'ReactNode',
@@ -157,6 +164,7 @@ export const docsZh = {
157
164
  {name: 'onDismiss', type: '() => void', description: '点击关闭按钮时调用;无论是否提供此回调,横幅都会自动隐藏。'},
158
165
  {name: 'endContent', type: 'ReactNode', description: '渲染在头部区域末端对齐的操作内容,通常是按钮或链接。'},
159
166
  {name: 'container', type: "'card' | 'section'", description: '视觉变体:card 带圆角;section 无圆角全宽,适用于页面级场景。', default: "'card'"},
167
+ {name: 'elevation', type: "'none' | 'low' | 'med' | 'high'", description: '静止阴影深度。用于悬浮于内容之上的浮动横幅;none 为默认内联横幅。', default: "'none'"},
160
168
  {name: 'children', type: 'ReactNode', description: '渲染在彩色头部下方卡片背景区域的内容。'},
161
169
  {name: 'defaultIsExpanded', type: 'boolean', description: '内容区域(children)是否初始展开。仅在提供 children 时相关。', default: 'false'},
162
170
  {
@@ -230,6 +238,7 @@ export const docsDense = {
230
238
  onDismiss: 'dismiss callback; banner self-hides regardless',
231
239
  endContent: 'end-aligned action in header, typically button/link',
232
240
  container: 'card=border-radius; section=full-width no radius for page-level',
241
+ elevation: 'resting shadow depth: none|low|med|high; raise for a floating banner',
233
242
  children: 'content in card-bg area below colored header',
234
243
  xstyle: 'StyleX layout customization via stylex.create()',
235
244
  },
@@ -368,4 +368,34 @@ describe('Banner', () => {
368
368
  );
369
369
  expect(screen.getByTestId('custom-chevron')).toBeInTheDocument();
370
370
  });
371
+
372
+ describe('elevation', () => {
373
+ it('renders a distinct root class for each elevation level', () => {
374
+ const classFor = (elevation: 'none' | 'low' | 'med' | 'high') => {
375
+ const {container} = render(
376
+ <Banner status="info" title="Heads up" elevation={elevation} />,
377
+ );
378
+ return container.firstElementChild!.className;
379
+ };
380
+ const classes = new Set([
381
+ classFor('none'),
382
+ classFor('low'),
383
+ classFor('med'),
384
+ classFor('high'),
385
+ ]);
386
+ expect(classes.size).toBe(4);
387
+ });
388
+
389
+ it('defaults to flat (elevation none)', () => {
390
+ const {container: def} = render(
391
+ <Banner status="info" title="Heads up" />,
392
+ );
393
+ const {container: none} = render(
394
+ <Banner status="info" title="Heads up" elevation="none" />,
395
+ );
396
+ expect(def.firstElementChild!.className).toBe(
397
+ none.firstElementChild!.className,
398
+ );
399
+ });
400
+ });
371
401
  });
@@ -46,8 +46,10 @@ import {
46
46
  borderVars,
47
47
  durationVars,
48
48
  easeVars,
49
+ shadowVars,
49
50
  } from '../theme/tokens.stylex';
50
51
  import {mergeProps} from '../utils';
52
+ import type {Elevation} from '../utils/types';
51
53
  import {edgeCompSlot} from '../Layout/edgeCompensation.stylex';
52
54
  import {themeProps} from '../utils/themeProps';
53
55
  import {useTranslator} from '../i18n';
@@ -157,6 +159,13 @@ export interface BannerProps extends BaseProps<HTMLDivElement> {
157
159
  * @default 'card'
158
160
  */
159
161
  container?: BannerContainer;
162
+ /**
163
+ * Resting elevation — the shadow depth the banner sits at. Use for a
164
+ * floating banner that hovers above content. `none` is the default inline
165
+ * banner.
166
+ * @default 'none'
167
+ */
168
+ elevation?: Elevation;
160
169
  /**
161
170
  * Whether the content area (children) starts expanded.
162
171
  * Only relevant when children are provided.
@@ -215,6 +224,11 @@ const styles = stylex.create({
215
224
  flexDirection: 'column',
216
225
  fontFamily: 'inherit',
217
226
  },
227
+ // When elevated, a card-container banner rounds its root so the shadow
228
+ // follows the same silhouette as the header/content border-radius.
229
+ rootElevatedCard: {
230
+ borderRadius: radiusVars['--radius-container'],
231
+ },
218
232
  // Header area — colored status background with icon, title, description, actions
219
233
  // This is the primary theme target ('banner')
220
234
  header: {
@@ -280,14 +294,14 @@ const styles = stylex.create({
280
294
  backgroundColor: colorVars['--color-background-card'],
281
295
  paddingBlock: spacingVars['--spacing-3'],
282
296
  paddingInline: spacingVars['--spacing-4'],
283
- borderLeftWidth: borderVars['--border-width'],
284
- borderRightWidth: borderVars['--border-width'],
297
+ borderInlineStartWidth: borderVars['--border-width'],
298
+ borderInlineEndWidth: borderVars['--border-width'],
285
299
  borderBottomWidth: borderVars['--border-width'],
286
- borderLeftStyle: 'solid',
287
- borderRightStyle: 'solid',
300
+ borderInlineStartStyle: 'solid',
301
+ borderInlineEndStyle: 'solid',
288
302
  borderBottomStyle: 'solid',
289
- borderLeftColor: colorVars['--color-border'],
290
- borderRightColor: colorVars['--color-border'],
303
+ borderInlineStartColor: colorVars['--color-border'],
304
+ borderInlineEndColor: colorVars['--color-border'],
291
305
  borderBottomColor: colorVars['--color-border'],
292
306
  },
293
307
  contentAreaCard: {
@@ -323,6 +337,18 @@ const statusStyles = stylex.create({
323
337
  },
324
338
  });
325
339
 
340
+ // Resting elevation for the banner. Applied to the root so the shadow wraps
341
+ // the whole banner (header + optional content). 'none' is the default and
342
+ // leaves the layout-only root untouched. For the `card` container the root is
343
+ // rounded (rootElevatedCard) so the shadow follows the card silhouette; the
344
+ // full-width `section` container stays square.
345
+ const elevationStyles = stylex.create({
346
+ none: {boxShadow: 'none'},
347
+ low: {boxShadow: shadowVars['--shadow-low']},
348
+ med: {boxShadow: shadowVars['--shadow-med']},
349
+ high: {boxShadow: shadowVars['--shadow-high']},
350
+ });
351
+
326
352
  // =============================================================================
327
353
  // Component
328
354
  // =============================================================================
@@ -381,6 +407,7 @@ export function Banner({
381
407
  onDismiss,
382
408
  endContent,
383
409
  container = 'card',
410
+ elevation = 'none',
384
411
  defaultIsExpanded = false,
385
412
  children,
386
413
  xstyle,
@@ -429,7 +456,16 @@ export function Banner({
429
456
  <div
430
457
  ref={ref}
431
458
  role={role}
432
- {...mergeProps(stylex.props(styles.root, xstyle), className, style)}
459
+ {...mergeProps(
460
+ stylex.props(
461
+ styles.root,
462
+ elevationStyles[elevation],
463
+ isCard && elevation !== 'none' && styles.rootElevatedCard,
464
+ xstyle,
465
+ ),
466
+ className,
467
+ style,
468
+ )}
433
469
  {...rest}>
434
470
  {/* Header: colored status background — primary theme target ('banner') */}
435
471
  <div
@@ -474,8 +510,16 @@ export function Banner({
474
510
  <Button
475
511
  variant="ghost"
476
512
  size="sm"
477
- label={isExpanded ? t('@astryx.banner.collapse') : t('@astryx.banner.expand')}
478
- tooltip={isExpanded ? t('@astryx.banner.collapse') : t('@astryx.banner.expand')}
513
+ label={
514
+ isExpanded
515
+ ? t('@astryx.banner.collapse')
516
+ : t('@astryx.banner.expand')
517
+ }
518
+ tooltip={
519
+ isExpanded
520
+ ? t('@astryx.banner.collapse')
521
+ : t('@astryx.banner.expand')
522
+ }
479
523
  icon={
480
524
  <span
481
525
  {...stylex.props(
@@ -45,6 +45,18 @@ export const docs = {
45
45
  },
46
46
  ],
47
47
  },
48
+ {
49
+ name: 'menu',
50
+ type: 'DropdownMenuOption[] | ReactNode',
51
+ description:
52
+ 'Menu opened when the item is activated, using the same item API as DropdownMenu/MoreMenu/ContextMenu (a DropdownMenuOption[] array or composed DropdownMenuItem children). Renders a link-styled menu trigger with a chevron and aria-haspopup="menu". Takes precedence over href/onClick.',
53
+ },
54
+ {
55
+ name: 'menuSize',
56
+ type: "'sm' | 'md' | 'lg'",
57
+ description:
58
+ "Size passed to the menu items. Defaults from the breadcrumb variant ('supporting' → 'sm', otherwise 'md').",
59
+ },
48
60
  {
49
61
  name: 'as',
50
62
  type: 'LinkComponentType',
@@ -86,6 +98,18 @@ export const docsZh = {
86
98
  type: 'ReactNode',
87
99
  description: '在项目标签前渲染的图标。',
88
100
  },
101
+ {
102
+ name: 'menu',
103
+ type: 'DropdownMenuOption[] | ReactNode',
104
+ description:
105
+ '激活项目时打开的菜单,使用与 DropdownMenu/MoreMenu/ContextMenu 相同的项目 API(DropdownMenuOption[] 数组或组合的 DropdownMenuItem 子元素)。渲染为带 chevron 和 aria-haspopup="menu" 的链接样式触发器。优先于 href/onClick。',
106
+ },
107
+ {
108
+ name: 'menuSize',
109
+ type: "'sm' | 'md' | 'lg'",
110
+ description:
111
+ "传递给菜单项的尺寸。默认根据面包屑变体推断('supporting' → 'sm',否则 'md')。",
112
+ },
89
113
  {
90
114
  name: 'as',
91
115
  type: 'LinkComponentType',
@@ -105,6 +129,8 @@ export const docsDense = {
105
129
  onClick: 'click handler',
106
130
  isCurrent: 'marks current page w/ aria-current="page"',
107
131
  startIcon: 'icon before label',
132
+ menu: 'DropdownMenuOption[] | children; opens a menu trigger (aria-haspopup="menu"); reuses the DropdownMenu item API',
133
+ menuSize: "menu item size; defaults from variant (supporting→sm, else md)",
108
134
  as: 'custom link component; overrides LinkProvider default',
109
135
  },
110
136
  };