@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
@@ -4,7 +4,8 @@
4
4
 
5
5
  /**
6
6
  * @file Avatar.tsx
7
- * @input Uses React, HTMLAttributes, ReactNode, useState
7
+ * @input Uses React, HTMLAttributes, ReactNode, useState; useTooltip
8
+ * (Tooltip hook) for the optional name-on-hover tooltip; useTranslator (i18n)
8
9
  * @output Exports Avatar component, AvatarProps, AvatarSize types
9
10
  * @position Core implementation; consumed by index.ts
10
11
  *
@@ -13,9 +14,11 @@
13
14
  * - /packages/core/src/Avatar/index.ts (exports if types change)
14
15
  * - /apps/storybook/stories/Avatar.stories.tsx (storybook stories)
15
16
  * - /packages/cli/templates/blocks/components/Avatar/ (showcase blocks)
17
+ *
18
+ * Last synced props: alt, fallbackSrc, name, size, src, status, href, as, target, rel, onClick
16
19
  */
17
20
 
18
- import {useMemo, useState, type ReactNode} from 'react';
21
+ import {isValidElement, useMemo, useState, type ReactNode} from 'react';
19
22
  import type {BaseProps} from '../BaseProps';
20
23
  import * as stylex from '@stylexjs/stylex';
21
24
  import {
@@ -26,8 +29,12 @@ import {
26
29
  } from '../theme/tokens.stylex';
27
30
  import {AvatarSizeContext} from './AvatarSizeContext';
28
31
  import {useAvatarGroup} from '../AvatarGroup/AvatarGroupContext';
29
- import {mergeProps} from '../utils';
32
+ import {mergeProps, mergeRefs} from '../utils';
30
33
  import {themeProps} from '../utils/themeProps';
34
+ import {useTooltip} from '../Tooltip/useTooltip';
35
+ import {useLinkComponent} from '../Link/useLinkComponent';
36
+ import type {LinkComponentType} from '../Link/types';
37
+ import {useTranslator} from '../i18n';
31
38
 
32
39
  /**
33
40
  * The offset ratio for positioning elements on a circle's edge at 45°.
@@ -59,7 +66,7 @@ const INITIALS_FONT_SIZE_RATIO = 0.4;
59
66
  *
60
67
  * Avatar uses the same abbreviated scale as Icon (`xsm`/`sm`/`md`/`lg`/`xl`),
61
68
  * but the values are larger because avatars align with media rather than
62
- * glyphs. The tiers match EPS's avatar sizes.
69
+ * glyphs. The tiers follow the standard avatar size scale.
63
70
  */
64
71
  type AvatarNamedSize = 'xsm' | 'sm' | 'md' | 'lg' | 'xl';
65
72
 
@@ -104,6 +111,11 @@ const styles = stylex.create({
104
111
  position: 'relative',
105
112
  display: 'inline-flex',
106
113
  flexShrink: 0,
114
+ // The wrapper is not clipped (so the status dot can overflow), so it must be
115
+ // rounded itself: a themed fallback background lands on `.astryx-avatar` (the
116
+ // class-bearing wrapper) as well as the internal var, and an unrounded
117
+ // wrapper would show that fill as square corners behind the circular content.
118
+ borderRadius: radiusVars['--radius-full'],
107
119
  },
108
120
  content: {
109
121
  display: 'flex',
@@ -124,15 +136,65 @@ const styles = stylex.create({
124
136
  justifyContent: 'center',
125
137
  width: '100%',
126
138
  height: '100%',
127
- backgroundColor: colorVars['--color-neutral'],
128
- color: colorVars['--color-text-secondary'],
139
+ // Fallback surface (initials + default icon). Each property reads an
140
+ // Avatar-scoped internal var so a theme can re-scope the fallback wash and
141
+ // initials weight/color without forking; the defaults reproduce today's
142
+ // exact output. See derivedVarRegistry (avatar) + Avatar.doc.mjs theming.
143
+ backgroundColor: `var(--_avatar-fallback-background, ${colorVars['--color-neutral']})`,
144
+ color: `var(--_avatar-fallback-color, ${colorVars['--color-text-secondary']})`,
129
145
  fontFamily: typographyVars['--font-family-body'],
130
- fontWeight: fontWeightVars['--font-weight-medium'],
146
+ fontWeight: `var(--_avatar-fallback-font-weight, ${fontWeightVars['--font-weight-medium']})`,
131
147
  textTransform: 'uppercase',
132
148
  },
133
149
  status: {
134
150
  position: 'absolute',
135
151
  },
152
+ // Visible focus ring for the name-tooltip tab stop, matching the repo-wide
153
+ // focus-visible outline treatment (see Timestamp, Token, Thumbnail). Only
154
+ // applied when a tooltip is active so keyboard users can reveal it.
155
+ focusable: {
156
+ outline: {
157
+ default: null,
158
+ ':focus-visible': `2px solid ${colorVars['--color-accent']}`,
159
+ },
160
+ outlineOffset: {
161
+ default: '0',
162
+ ':focus-visible': '2px',
163
+ },
164
+ },
165
+ // Reset the intrinsic styling of the interactive element (<a>/<button>) so it
166
+ // is a transparent, correctly-sized wrapper around the avatar visuals. The
167
+ // element carries the focus-visible accent ring for keyboard users.
168
+ interactive: {
169
+ appearance: 'none',
170
+ padding: 0,
171
+ margin: 0,
172
+ borderWidth: 0,
173
+ borderStyle: 'none',
174
+ backgroundColor: 'transparent',
175
+ color: 'inherit',
176
+ font: 'inherit',
177
+ textDecoration: 'none',
178
+ cursor: 'pointer',
179
+ // Match the avatar's circular shape so the focus ring hugs it.
180
+ borderRadius: radiusVars['--radius-full'],
181
+ outlineWidth: {
182
+ default: 0,
183
+ ':focus-visible': 2,
184
+ },
185
+ outlineStyle: {
186
+ default: 'none',
187
+ ':focus-visible': 'solid',
188
+ },
189
+ outlineColor: {
190
+ default: null,
191
+ ':focus-visible': colorVars['--color-accent'],
192
+ },
193
+ outlineOffset: {
194
+ default: 0,
195
+ ':focus-visible': 2,
196
+ },
197
+ },
136
198
  });
137
199
 
138
200
  /**
@@ -143,8 +205,13 @@ const dynamicStyles = stylex.create({
143
205
  width: size,
144
206
  height: size,
145
207
  }),
208
+ // Initials font size defaults to the proportional `size × ratio` scale but is
209
+ // reachable via the `--_avatar-fallback-font-size` derived var, so a theme can
210
+ // set a per-size type scale (e.g. `components.avatar['size:sm']`).
146
211
  fontSize: (size: number) => ({
147
- fontSize: size * INITIALS_FONT_SIZE_RATIO,
212
+ fontSize: `var(--_avatar-fallback-font-size, ${
213
+ size * INITIALS_FONT_SIZE_RATIO
214
+ }px)`,
148
215
  }),
149
216
  statusPosition: (size: number) => ({
150
217
  bottom: size * CIRCLE_EDGE_OFFSET_RATIO,
@@ -214,8 +281,55 @@ export interface AvatarProps extends BaseProps<HTMLDivElement> {
214
281
  /**
215
282
  * Content displayed in the corner of the avatar.
216
283
  * Typically used for status indicators or badges.
284
+ *
285
+ * When the element carries a string `label` prop (as `AvatarStatusDot`
286
+ * does), the label is composed into the avatar's accessible name
287
+ * (e.g. "Jane Doe, Online") so assistive tech can reach the status —
288
+ * the `role="img"` root prunes descendant semantics (WCAG 4.1.2).
217
289
  */
218
290
  status?: ReactNode;
291
+ /**
292
+ * Tooltip shown on hover (and keyboard focus).
293
+ * - omitted / `true`: show the avatar's `name`
294
+ * - a string: show that text instead
295
+ * - `false`: no tooltip
296
+ *
297
+ * The avatar owns this tooltip. It is NOT auto-disabled when wrapped in your
298
+ * own Tooltip/HoverCard — set `tooltip={false}` if you provide your own
299
+ * overlay. No tooltip is shown if `tooltip` is `true`/omitted and there is
300
+ * no (non-whitespace) `name`.
301
+ * @default true
302
+ */
303
+ tooltip?: string | boolean;
304
+ /**
305
+ * When provided, the avatar becomes an interactive link (`<a>` or custom
306
+ * link component) pointing at `href`. Follows the same element-swap rules as
307
+ * Button: `href` renders a link, otherwise `onClick` renders a
308
+ * `<button type="button">`, otherwise the avatar stays a static (non-focusable)
309
+ * element. An interactive avatar requires a meaningful accessible name via
310
+ * `alt` or `name`.
311
+ */
312
+ href?: string;
313
+ /**
314
+ * Custom link component to use when `href` is provided. Overrides the
315
+ * provider-level default set by LinkProvider. Useful for Next.js `<Link>` or
316
+ * other router-aware components. Only applies when `href` is provided.
317
+ */
318
+ as?: LinkComponentType;
319
+ /**
320
+ * HTML target attribute for the link. Only applies when `href` is provided.
321
+ */
322
+ target?: string;
323
+ /**
324
+ * HTML rel attribute for the link. Only applies when `href` is provided.
325
+ */
326
+ rel?: string;
327
+ /**
328
+ * Click handler. When provided without `href`, renders the avatar as a
329
+ * focusable `<button type="button">`. An interactive avatar requires a
330
+ * meaningful accessible name via `alt` or `name`.
331
+ */
332
+ onClick?: React.MouseEventHandler<HTMLElement>;
219
333
  }
220
334
 
221
335
  /**
@@ -238,6 +352,24 @@ function getInitials(name: string): string {
238
352
  return (words[0].charAt(0) + words[words.length - 1].charAt(0)).toUpperCase();
239
353
  }
240
354
 
355
+ /**
356
+ * Reads the accessible status label off the `status` element, when it
357
+ * exposes one. `AvatarStatusDot`'s `label` prop is the canonical source,
358
+ * but any custom status element with a string `label` prop participates.
359
+ *
360
+ * The avatar root is `role="img"`, which prunes ALL descendant semantics
361
+ * from the accessibility tree — a label inside the status subtree is never
362
+ * announced on its own. Composing it into the avatar's own accessible name
363
+ * is the only way the status reaches assistive tech (WCAG 4.1.2).
364
+ */
365
+ function getStatusLabel(status: ReactNode): string | undefined {
366
+ if (!isValidElement(status)) {
367
+ return undefined;
368
+ }
369
+ const {label} = status.props as {label?: unknown};
370
+ return typeof label === 'string' && label !== '' ? label : undefined;
371
+ }
372
+
241
373
  /**
242
374
  * Default person icon SVG for when no image or name is provided
243
375
  */
@@ -265,6 +397,10 @@ function DefaultIcon({size}: {size: number}) {
265
397
  * <Avatar src="/user.jpg" name="John Doe" />
266
398
  * <Avatar name="Jane Smith" size="xl" />
267
399
  * <Avatar src="/user.jpg" status={<OnlineIndicator />} />
400
+ * <Avatar name="jsmith" tooltip="Jane Smith, Staff Engineer" />
401
+ * <Avatar name="Jane" tooltip={false} />
402
+ * <Avatar src="/user.jpg" name="John Doe" href="/users/john" />
403
+ * <Avatar src="/user.jpg" name="John Doe" onClick={() => openProfile()} />
268
404
  * ```
269
405
  */
270
406
  export function Avatar({
@@ -275,6 +411,12 @@ export function Avatar({
275
411
  size = 'md',
276
412
  src,
277
413
  status,
414
+ tooltip = true,
415
+ href,
416
+ as,
417
+ target,
418
+ rel,
419
+ onClick,
278
420
  xstyle,
279
421
  className,
280
422
  style,
@@ -294,79 +436,235 @@ export function Avatar({
294
436
  const showInitials = !showImage && !showFallbackImage && name;
295
437
  const showIcon = !showImage && !showFallbackImage && !name;
296
438
 
297
- // A meaningful accessible name comes from `alt` or `name`. With neither, the
298
- // avatar is decorative — expose it as `presentation`/`aria-hidden` rather than
299
- // announcing a meaningless generic "Avatar" (obs-9).
300
- const accessibleName = alt || name;
439
+ // A meaningful accessible name comes from `alt`/`name`, composed with the
440
+ // status element's `label` when one is present ("Jane Doe, Online") — the
441
+ // `role="img"` root prunes descendant semantics, so surfacing the label in
442
+ // the avatar's own name is the only way assistive tech can reach the
443
+ // status (WCAG 4.1.2). A labelled status alone is also meaningful. With
444
+ // neither a name nor a labelled status, the avatar is decorative — expose
445
+ // it as `presentation`/`aria-hidden` rather than announcing a meaningless
446
+ // generic "Avatar" (obs-9).
447
+ const t = useTranslator();
448
+ const nameLabel = alt || name;
449
+ const statusLabel = getStatusLabel(status);
450
+ const accessibleName =
451
+ nameLabel && statusLabel
452
+ ? t('@astryx.avatar.nameWithStatus', {
453
+ name: nameLabel,
454
+ status: statusLabel,
455
+ })
456
+ : nameLabel || statusLabel;
301
457
  const isDecorative = !accessibleName;
302
458
  const avatarGroup = useAvatarGroup();
303
459
  const resolvedSize = avatarGroup?.size ?? size;
304
460
  const numericSize = useMemo(() => resolveSize(resolvedSize), [resolvedSize]);
305
461
 
306
- return (
307
- <AvatarSizeContext value={numericSize}>
462
+ // Resolve the tooltip content:
463
+ // - `false` → no tooltip
464
+ // - a string → that string
465
+ // - `true` / omitted → the `name` (a whitespace-only name yields nothing)
466
+ // Note: the *visible* tooltip prefers `name` (not `alt`); the *accessible
467
+ // name* on the root still uses `alt || name` above, independent of this.
468
+ const tooltipContent =
469
+ tooltip === false
470
+ ? undefined
471
+ : typeof tooltip === 'string'
472
+ ? tooltip
473
+ : name;
474
+ const trimmedTooltip = tooltipContent?.trim();
475
+ const showTooltip = trimmedTooltip != null && trimmedTooltip !== '';
476
+ // Whether the tooltip text is a consumer-authored override (a custom string)
477
+ // rather than the default name. A custom description is worth wiring to
478
+ // `aria-describedby` (it adds information, matching Button); the default name
479
+ // tooltip is visual-only — its text duplicates the root `aria-label`, so
480
+ // describing it too would double-announce the same name (OQ-4).
481
+ const isCustomTooltip = typeof tooltip === 'string';
482
+
483
+ // Own the name tooltip via the Tooltip hook (the Button pattern), which
484
+ // returns `describedBy` as a value we choose whether to apply — the only way
485
+ // to satisfy the per-case aria-describedby rule (default name: none; custom
486
+ // string: describe) without editing Tooltip. `focusTrigger: 'auto'` shows the
487
+ // tooltip on keyboard focus once the root is focusable (natively for the
488
+ // interactive <a>/<button>, or via an explicit tab stop on the static div).
489
+ const tooltipHook = useTooltip({
490
+ placement: 'above',
491
+ isEnabled: showTooltip,
492
+ });
493
+ // The tooltip ref attaches to whichever root element renders (static or
494
+ // interactive), so the tooltip works for link/button avatars too.
495
+ const rootRef = mergeRefs(ref, showTooltip ? tooltipHook.ref : undefined);
496
+ const describedByProp =
497
+ showTooltip && isCustomTooltip
498
+ ? {
499
+ 'aria-describedby':
500
+ [props['aria-describedby'], tooltipHook.describedBy]
501
+ .filter(Boolean)
502
+ .join(' ') || undefined,
503
+ }
504
+ : null;
505
+
506
+ // Element-swap trichotomy, copied from Button: `href` renders a link,
507
+ // otherwise `onClick` renders a `<button>`, otherwise today's static element
508
+ // is unchanged (the non-breaking default).
509
+ const renderAsLink = href != null;
510
+ const renderAsButton = !renderAsLink && onClick != null;
511
+ const isInteractive = renderAsLink || renderAsButton;
512
+ const LinkComponent = useLinkComponent(as);
513
+
514
+ // An interactive control with no accessible name is an unacceptable control
515
+ // name. Warn in the same client-safe way sibling components do (Field,
516
+ // Timestamp, Popover) — a plain `console.warn`, never gated on `process.env`
517
+ // (which is not available on the client in this codebase).
518
+ if (isInteractive && !accessibleName) {
519
+ console.warn(
520
+ 'Avatar: an interactive avatar (with `href` or `onClick`) needs a ' +
521
+ 'meaningful accessible name. Pass `alt` or `name`.',
522
+ );
523
+ }
524
+
525
+ // The inner visuals are identical across the static and interactive variants.
526
+ const visualContent = (
527
+ <>
528
+ <div {...stylex.props(styles.content, dynamicStyles.size(numericSize))}>
529
+ {showImage && (
530
+ <img
531
+ src={src}
532
+ alt=""
533
+ onError={() => setErroredSrc(src)}
534
+ {...stylex.props(styles.image)}
535
+ />
536
+ )}
537
+ {showFallbackImage && (
538
+ <img
539
+ src={fallbackSrc}
540
+ alt=""
541
+ onError={() => setErroredFallbackSrc(fallbackSrc)}
542
+ {...stylex.props(styles.image)}
543
+ />
544
+ )}
545
+ {showInitials && (
546
+ <div
547
+ {...stylex.props(
548
+ styles.fallback,
549
+ dynamicStyles.fontSize(numericSize),
550
+ )}>
551
+ {getInitials(name)}
552
+ </div>
553
+ )}
554
+ {showIcon && (
555
+ <div {...stylex.props(styles.fallback)}>
556
+ <DefaultIcon size={numericSize} />
557
+ </div>
558
+ )}
559
+ </div>
560
+ {status && (
561
+ <div
562
+ {...stylex.props(
563
+ styles.status,
564
+ dynamicStyles.statusPosition(numericSize),
565
+ )}>
566
+ {status}
567
+ </div>
568
+ )}
569
+ </>
570
+ );
571
+
572
+ // Shared StyleX + theme props for the root element in every variant. The
573
+ // group ring/overlap, the interactive focus-visible ring, and the
574
+ // tooltip tab-stop focus ring all live here so the interactive
575
+ // `<a>`/`<button>` and the static `<div>` carry the exact same box.
576
+ const rootStylexProps = mergeProps(
577
+ themeProps('avatar', {size: resolvedSize}),
578
+ stylex.props(
579
+ styles.wrapper,
580
+ isInteractive && styles.interactive,
581
+ !isInteractive && showTooltip && !avatarGroup && styles.focusable,
582
+ avatarGroup && groupStyles.ring,
583
+ avatarGroup && groupStyles.overlap,
584
+ avatarGroup && groupDynamicStyles.overlap(-avatarGroup.overlap),
585
+ xstyle,
586
+ ),
587
+ className,
588
+ style,
589
+ );
590
+
591
+ let rootElement: ReactNode;
592
+
593
+ // `props` is typed for the default `<div>` root (its event handlers are
594
+ // HTMLDivElement-typed). The interactive branches render an `<a>`/`<button>`,
595
+ // so the passthrough props are re-typed to the generic element here — the
596
+ // avatar's own handlers (onClick) are declared on HTMLElement and stay typed.
597
+ const interactivePassthrough = props as React.HTMLAttributes<HTMLElement>;
598
+
599
+ if (renderAsLink) {
600
+ // The rendered link carries the `data-avatar-item` marker so AvatarGroup's
601
+ // roving focus (which selects on `[data-avatar-item]`, not a tag/role) picks
602
+ // it up while ignoring nested buttons in a custom status/badge slot.
603
+ rootElement = (
604
+ <LinkComponent
605
+ {...interactivePassthrough}
606
+ {...describedByProp}
607
+ ref={rootRef as React.Ref<HTMLAnchorElement>}
608
+ href={href}
609
+ target={target}
610
+ rel={rel}
611
+ aria-label={accessibleName}
612
+ data-avatar-item=""
613
+ data-testid={testId}
614
+ onClick={onClick}
615
+ {...rootStylexProps}>
616
+ {visualContent}
617
+ </LinkComponent>
618
+ );
619
+ } else if (renderAsButton) {
620
+ rootElement = (
621
+ <button
622
+ {...interactivePassthrough}
623
+ {...describedByProp}
624
+ ref={rootRef}
625
+ type="button"
626
+ aria-label={accessibleName}
627
+ data-avatar-item=""
628
+ data-testid={testId}
629
+ onClick={onClick}
630
+ {...rootStylexProps}>
631
+ {visualContent}
632
+ </button>
633
+ );
634
+ } else {
635
+ rootElement = (
308
636
  <div
309
637
  {...props}
310
- ref={ref}
638
+ ref={rootRef}
311
639
  role={isDecorative ? 'presentation' : 'img'}
312
640
  aria-label={isDecorative ? undefined : accessibleName}
313
641
  aria-hidden={isDecorative || undefined}
642
+ // The root is a div[role="img"], not natively focusable. When a name
643
+ // tooltip is active, add a tab stop so keyboard users can reveal it
644
+ // (WCAG 1.4.13 / 2.1.1) — matching Timestamp/Button. Suppressed inside
645
+ // an AvatarGroup, which owns a single roving tab stop for its members.
646
+ tabIndex={showTooltip && !avatarGroup ? 0 : undefined}
314
647
  data-testid={testId}
315
- {...mergeProps(
316
- themeProps('avatar', {size: resolvedSize}),
317
- stylex.props(
318
- styles.wrapper,
319
- avatarGroup && groupStyles.ring,
320
- avatarGroup && groupStyles.overlap,
321
- avatarGroup && groupDynamicStyles.overlap(-avatarGroup.overlap),
322
- xstyle,
323
- ),
324
- className,
325
- style,
326
- )}>
327
- <div {...stylex.props(styles.content, dynamicStyles.size(numericSize))}>
328
- {showImage && (
329
- <img
330
- src={src}
331
- alt=""
332
- onError={() => setErroredSrc(src)}
333
- {...stylex.props(styles.image)}
334
- />
335
- )}
336
- {showFallbackImage && (
337
- <img
338
- src={fallbackSrc}
339
- alt=""
340
- onError={() => setErroredFallbackSrc(fallbackSrc)}
341
- {...stylex.props(styles.image)}
342
- />
343
- )}
344
- {showInitials && (
345
- <div
346
- {...stylex.props(
347
- styles.fallback,
348
- dynamicStyles.fontSize(numericSize),
349
- )}>
350
- {getInitials(name)}
351
- </div>
352
- )}
353
- {showIcon && (
354
- <div {...stylex.props(styles.fallback)}>
355
- <DefaultIcon size={numericSize} />
356
- </div>
357
- )}
358
- </div>
359
- {status && (
360
- <div
361
- {...stylex.props(
362
- styles.status,
363
- dynamicStyles.statusPosition(numericSize),
364
- )}>
365
- {status}
366
- </div>
367
- )}
648
+ {...describedByProp}
649
+ {...rootStylexProps}>
650
+ {visualContent}
368
651
  </div>
369
- </AvatarSizeContext>
652
+ );
653
+ }
654
+
655
+ const avatarElement = (
656
+ <AvatarSizeContext value={numericSize}>{rootElement}</AvatarSizeContext>
657
+ );
658
+
659
+ // Always return the same structure so the avatar keeps its position in the
660
+ // React tree regardless of the tooltip flag — toggling it must not remount
661
+ // the avatar subtree (and lose image-load state). The tooltip is a sibling
662
+ // (no wrapper DOM); the hook's ref is already on the root via `rootRef`.
663
+ return (
664
+ <>
665
+ {avatarElement}
666
+ {showTooltip ? tooltipHook.renderTooltip(trimmedTooltip) : null}
667
+ </>
370
668
  );
371
669
  }
372
670
 
@@ -7,23 +7,27 @@ export const docs = {
7
7
  subComponentOf: 'Avatar',
8
8
  displayName: 'Avatar Status Dot',
9
9
  isHiddenFromOverview: true,
10
- description: 'Size-aware status indicator dot that reads avatar size from context and scales proportionally.',
10
+ description:
11
+ 'Size-aware status indicator dot that reads avatar size from context and scales proportionally. Each variant pairs a colour with a distinct built-in shape (filled, ring, minus) so status is never conveyed by colour alone (WCAG 1.4.1).',
11
12
  props: [
12
13
  {
13
14
  name: 'variant',
14
15
  type: "'success' | 'neutral' | 'error'",
15
- description: 'Semantic color variant of the dot.',
16
+ description:
17
+ 'Semantic variant pairing colour with a distinct shape: success = filled green dot, neutral = grey ring, error = red dot with a minus bar.',
16
18
  default: "'success'",
17
19
  },
18
20
  {
19
21
  name: 'label',
20
22
  type: 'string',
21
- description: 'Accessible label for screen readers.',
23
+ description:
24
+ 'Accessible label describing the status. Inside an Avatar it is composed into the avatar\'s accessible name (e.g. "Jane Doe, Online") — the Avatar root is role="img", which prunes child semantics, so the composed name is how the status reaches assistive tech. Standalone dots expose role="img" with this label directly.',
22
25
  },
23
26
  {
24
27
  name: 'icon',
25
28
  type: 'ReactNode',
26
- description: 'Icon centered inside the dot (hidden at tiny sizes).',
29
+ description:
30
+ 'Icon centered inside the dot (hidden at tiny sizes). A rendered icon replaces the built-in shape glyph, so use a different icon per status.',
27
31
  slotElements: [
28
32
  {
29
33
  __element: 'Icon',
@@ -41,23 +45,27 @@ export const docsZh = {
41
45
  name: 'AvatarStatusDot',
42
46
  isHiddenFromOverview: true,
43
47
  displayName: 'Avatar Status Dot',
44
- description: '尺寸感知的状态指示点,从上下文中读取头像尺寸并等比缩放。',
48
+ description:
49
+ '尺寸感知的状态指示点,从上下文中读取头像尺寸并等比缩放。每个变体将颜色与独特形状(实心、圆环、横杠)配对,确保状态不仅靠颜色传达(WCAG 1.4.1)。',
45
50
  props: [
46
51
  {
47
52
  name: 'variant',
48
53
  type: "'success' | 'neutral' | 'error'",
49
- description: '状态点的语义颜色变体。',
54
+ description:
55
+ '语义变体,颜色与形状配对:success = 绿色实心点,neutral = 灰色圆环,error = 带横杠的红色点。',
50
56
  default: "'success'",
51
57
  },
52
58
  {
53
59
  name: 'label',
54
60
  type: 'string',
55
- description: '屏幕阅读器的无障碍标签。',
61
+ description:
62
+ '描述状态的无障碍标签。在 Avatar 内会被合成进头像自身的无障碍名称(如 "Jane Doe, Online")——Avatar 根元素为 role="img",会裁剪子元素语义,因此合成名称是辅助技术获知状态的途径。独立使用时状态点直接以 role="img" 暴露该标签。',
56
63
  },
57
64
  {
58
65
  name: 'icon',
59
66
  type: 'ReactNode',
60
- description: '居中显示在状态点内的图标(tiny 尺寸时隐藏)。',
67
+ description:
68
+ '居中显示在状态点内的图标(tiny 尺寸时隐藏)。渲染的图标会替换内置形状标记,请为每个状态使用不同的图标。',
61
69
  },
62
70
  ],
63
71
  };
@@ -66,10 +74,13 @@ export const docsDense = {
66
74
  name: 'AvatarStatusDot',
67
75
  isHiddenFromOverview: true,
68
76
  displayName: 'Avatar Status Dot',
69
- description: 'size-aware status dot, reads avatar size from context + scales proportionally',
77
+ description:
78
+ 'size-aware status dot, reads avatar size from context + scales proportionally; variants pair colour with shape (filled/ring/minus) per WCAG 1.4.1',
70
79
  propDescriptions: {
71
- variant: 'semantic color variant',
72
- label: 'accessible label for screen readers',
73
- icon: 'icon centered in dot (hidden at tiny sizes)',
80
+ variant:
81
+ 'colour + shape variant: success filled, neutral ring, error minus',
82
+ label:
83
+ 'accessible status label; composed into the Avatar accessible name ("Jane Doe, Online") — standalone dots expose role="img" with it directly',
84
+ icon: 'icon centered in dot (hidden at tiny sizes); replaces the built-in shape glyph, so differ it per status',
74
85
  },
75
86
  };