@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
@@ -155,6 +155,109 @@ describe('ChatComposerInput', () => {
155
155
  });
156
156
  });
157
157
 
158
+ describe('composer focus control', () => {
159
+ it('registers a focus control so a body click focuses the input', () => {
160
+ render(
161
+ <ChatComposer onSubmit={() => {}} input={<ChatComposerInput />} />,
162
+ );
163
+ const editable = screen.getByRole('textbox');
164
+ // Walk to the composer body: editable → input root → inputArea → body.
165
+ const inputRoot = editable.parentElement!;
166
+ const inputArea = inputRoot.parentElement!;
167
+ const body = inputArea.parentElement!;
168
+ // Click empty space in the body → shell drives the registered control.
169
+ fireEvent.click(body);
170
+ expect(document.activeElement).toBe(editable);
171
+ });
172
+ });
173
+
174
+ describe('Enter submit behavior', () => {
175
+ it('does not submit on Enter while IME composition is in progress', () => {
176
+ const onSubmit = vi.fn();
177
+ render(<ChatComposerInput onSubmit={onSubmit} />);
178
+ const textbox = screen.getByRole('textbox');
179
+ textbox.textContent = 'こんにちは';
180
+ fireEvent.input(textbox);
181
+ // isComposing is surfaced on the native event during IME composition.
182
+ fireEvent.keyDown(textbox, {key: 'Enter', isComposing: true});
183
+ expect(onSubmit).not.toHaveBeenCalled();
184
+ });
185
+
186
+ it('does not submit on Enter for the legacy keyCode 229 composing signal', () => {
187
+ const onSubmit = vi.fn();
188
+ render(<ChatComposerInput onSubmit={onSubmit} />);
189
+ const textbox = screen.getByRole('textbox');
190
+ textbox.textContent = 'ㅎ';
191
+ fireEvent.input(textbox);
192
+ fireEvent.keyDown(textbox, {key: 'Enter', keyCode: 229});
193
+ expect(onSubmit).not.toHaveBeenCalled();
194
+ });
195
+
196
+ it('lets onKeyDown suppress the default submit via preventDefault (touch-newline recipe)', () => {
197
+ // The documented "insert a newline instead of sending" pattern: a
198
+ // consumer preventDefaults Enter (e.g. on a coarse pointer).
199
+ const onSubmit = vi.fn();
200
+ const onKeyDown = vi.fn(e => {
201
+ if (e.key === 'Enter' && !e.shiftKey) {
202
+ e.preventDefault();
203
+ }
204
+ });
205
+ render(<ChatComposerInput onSubmit={onSubmit} onKeyDown={onKeyDown} />);
206
+ const textbox = screen.getByRole('textbox');
207
+ textbox.textContent = 'hello';
208
+ fireEvent.input(textbox);
209
+ fireEvent.keyDown(textbox, {key: 'Enter'});
210
+ expect(onKeyDown).toHaveBeenCalled();
211
+ expect(onSubmit).not.toHaveBeenCalled();
212
+ });
213
+
214
+ it('lets onKeyDown add behavior (Cmd/Ctrl+Enter submit) without preventDefault', () => {
215
+ // Adding a submit shortcut is just handling the event yourself; the
216
+ // built-in Enter handling still runs for the plain-Enter case.
217
+ const onSubmit = vi.fn();
218
+ const handle = vi.fn();
219
+ const onKeyDown = vi.fn(e => {
220
+ if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {
221
+ handle();
222
+ }
223
+ });
224
+ render(<ChatComposerInput onSubmit={onSubmit} onKeyDown={onKeyDown} />);
225
+ const textbox = screen.getByRole('textbox');
226
+ textbox.textContent = 'hello';
227
+ fireEvent.input(textbox);
228
+ fireEvent.keyDown(textbox, {key: 'Enter', metaKey: true});
229
+ expect(handle).toHaveBeenCalled();
230
+ // Consumer did not preventDefault, so the built-in submit also fires.
231
+ expect(onSubmit).toHaveBeenCalledWith('hello');
232
+ });
233
+
234
+ it('calls onKeyDown before submit and lets preventDefault take over', () => {
235
+ const onSubmit = vi.fn();
236
+ const onKeyDown = vi.fn(e => {
237
+ e.preventDefault();
238
+ });
239
+ render(<ChatComposerInput onSubmit={onSubmit} onKeyDown={onKeyDown} />);
240
+ const textbox = screen.getByRole('textbox');
241
+ textbox.textContent = 'hello';
242
+ fireEvent.input(textbox);
243
+ fireEvent.keyDown(textbox, {key: 'Enter'});
244
+ expect(onKeyDown).toHaveBeenCalled();
245
+ expect(onSubmit).not.toHaveBeenCalled();
246
+ });
247
+
248
+ it('calls onKeyDown but still submits when the consumer does not preventDefault', () => {
249
+ const onSubmit = vi.fn();
250
+ const onKeyDown = vi.fn();
251
+ render(<ChatComposerInput onSubmit={onSubmit} onKeyDown={onKeyDown} />);
252
+ const textbox = screen.getByRole('textbox');
253
+ textbox.textContent = 'hello';
254
+ fireEvent.input(textbox);
255
+ fireEvent.keyDown(textbox, {key: 'Enter'});
256
+ expect(onKeyDown).toHaveBeenCalled();
257
+ expect(onSubmit).toHaveBeenCalledWith('hello');
258
+ });
259
+ });
260
+
158
261
  // Controlled-value sync used to overwrite `textContent` on every
159
262
  // distinct render, which (a) collapsed the caret to offset 0
160
263
  // (visible after a slash-command pick like
@@ -11,8 +11,10 @@
11
11
  *
12
12
  * ContentEditable-based rich input for the chat composer.
13
13
  * Supports trigger menus (@ mentions, / commands) via SearchSource,
14
- * inline token rendering, serialization, Enter/Shift+Enter, message
15
- * history, paste/drop file handling, and mobile-safe touch typography.
14
+ * inline token rendering, serialization, Enter-to-submit with
15
+ * IME-composition guarding and an onKeyDown seam for platform-specific
16
+ * key handling, message history, paste/drop file handling, and
17
+ * mobile-safe touch typography.
16
18
  *
17
19
  *
18
20
  * SYNC: When modified, update:
@@ -188,6 +190,21 @@ export interface ChatComposerInputProps extends Omit<
188
190
  onFiles?: (files: File[]) => void;
189
191
  /** Submit handler (Enter without Shift) */
190
192
  onSubmit?: (value: string) => void;
193
+ /**
194
+ * Key-down handler invoked before the built-in Enter/history behavior
195
+ * (but after an open trigger menu consumes the event).
196
+ *
197
+ * This is the seam for platform- or app-specific key handling:
198
+ * - Call `event.preventDefault()` to suppress the default submit (e.g.
199
+ * let Enter insert a newline on a touch keyboard).
200
+ * - Add behavior by acting on the event yourself (e.g. submit on
201
+ * Cmd/Ctrl+Enter) without calling `preventDefault()`, so the default
202
+ * handling still runs for other keys.
203
+ *
204
+ * IME composition is always respected regardless of this handler: Enter
205
+ * never submits while a composition is in progress.
206
+ */
207
+ onKeyDown?: (event: KeyboardEvent<HTMLDivElement>) => void;
191
208
  }
192
209
 
193
210
  // =============================================================================
@@ -221,8 +238,8 @@ const styles = stylex.create({
221
238
  placeholder: {
222
239
  position: 'absolute',
223
240
  top: 0,
224
- left: 0,
225
- right: 0,
241
+ insetInlineStart: 0,
242
+ insetInlineEnd: 0,
226
243
  pointerEvents: 'none',
227
244
  color: colorVars['--color-text-secondary'],
228
245
  fontSize: {
@@ -299,6 +316,7 @@ export function ChatComposerInput(props: ChatComposerInputProps) {
299
316
  pasteAsToken: pasteAsTokenProp,
300
317
  onFiles,
301
318
  onSubmit = composerCtx?.onSubmit,
319
+ onKeyDown: onKeyDownProp,
302
320
  xstyle,
303
321
  className,
304
322
  style,
@@ -366,6 +384,20 @@ export function ChatComposerInput(props: ChatComposerInputProps) {
366
384
  selfRef.current = handle;
367
385
  useImperativeHandle(handleRef, () => handle);
368
386
 
387
+ // Register a focus control with the composer shell so body-click-to-focus
388
+ // works without the shell sniffing the input's DOM shape. Cleared on
389
+ // unmount so the shell falls back cleanly if the input goes away.
390
+ const inputControlRef = composerCtx?.inputControlRef;
391
+ useEffect(() => {
392
+ if (!inputControlRef) {
393
+ return;
394
+ }
395
+ inputControlRef.current = {focus: () => editableRef.current?.focus()};
396
+ return () => {
397
+ inputControlRef.current = null;
398
+ };
399
+ }, [inputControlRef]);
400
+
369
401
  useEffect(() => {
370
402
  if (controlledValue === undefined || !editableRef.current) {
371
403
  return;
@@ -477,6 +509,13 @@ export function ChatComposerInput(props: ChatComposerInputProps) {
477
509
  return;
478
510
  }
479
511
 
512
+ // Consumer passthrough — runs before built-in Enter/history handling.
513
+ // A consumer can preventDefault() to fully own the keystroke.
514
+ onKeyDownProp?.(e);
515
+ if (e.defaultPrevented) {
516
+ return;
517
+ }
518
+
480
519
  // Handle Backspace near tokens — prevent browser from creating
481
520
  // stray <br> elements or moving the cursor unexpectedly.
482
521
  if (e.key === 'Backspace') {
@@ -519,6 +558,13 @@ export function ChatComposerInput(props: ChatComposerInputProps) {
519
558
  }
520
559
 
521
560
  if (e.key === 'Enter' && !e.shiftKey) {
561
+ // Never submit mid-composition — an IME uses Enter to commit a
562
+ // candidate (e.g. Japanese/Chinese/Korean input), and browsers may
563
+ // also surface the legacy keyCode 229 for composing keystrokes.
564
+ if (e.nativeEvent.isComposing || e.nativeEvent.keyCode === 229) {
565
+ return;
566
+ }
567
+
522
568
  e.preventDefault();
523
569
  if (!editableRef.current) {
524
570
  return;
@@ -583,7 +629,7 @@ export function ChatComposerInput(props: ChatComposerInputProps) {
583
629
  }
584
630
  }
585
631
  },
586
- [hasHistory, onSubmit, onChange, emitChange, triggerMenu],
632
+ [hasHistory, onSubmit, onChange, emitChange, triggerMenu, onKeyDownProp],
587
633
  );
588
634
 
589
635
  const handlePaste = useCallback(
@@ -5,11 +5,14 @@
5
5
  /**
6
6
  * @file ChatContext.tsx
7
7
  * @input Uses React createContext
8
- * @output Exports ChatMessageContext for sharing sender/density between Chat components
9
- * @position Internal context; consumed by ChatMessage and ChatMessageBubble
8
+ * @output Exports Chat message/list/composer/layout contexts. The composer
9
+ * context (value + input-control registration) is public composition API,
10
+ * re-exported from Chat/index.ts for custom inputs.
11
+ * @position Shared contexts; consumed by ChatMessage, ChatComposer,
12
+ * ChatComposerInput, ChatSendButton, and custom inputs.
10
13
  */
11
14
 
12
- import {createContext, use} from 'react';
15
+ import {createContext, use, type RefObject} from 'react';
13
16
 
14
17
  export type ChatMessageSender = 'user' | 'assistant' | 'system';
15
18
  export type ChatDensity = 'compact' | 'balanced' | 'spacious';
@@ -19,8 +22,9 @@ export interface ChatMessageContextValue {
19
22
  density: ChatDensity;
20
23
  }
21
24
 
22
- export const ChatMessageContext =
23
- createContext<ChatMessageContextValue | null>(null);
25
+ export const ChatMessageContext = createContext<ChatMessageContextValue | null>(
26
+ null,
27
+ );
24
28
  ChatMessageContext.displayName = 'ChatMessageContext';
25
29
 
26
30
  export function useChatMessageContext(): ChatMessageContextValue | null {
@@ -31,9 +35,7 @@ export interface ChatListContextValue {
31
35
  density: ChatDensity;
32
36
  }
33
37
 
34
- export const ChatListContext = createContext<ChatListContextValue | null>(
35
- null,
36
- );
38
+ export const ChatListContext = createContext<ChatListContextValue | null>(null);
37
39
  ChatListContext.displayName = 'ChatListContext';
38
40
 
39
41
  export function useChatListContext(): ChatListContextValue | null {
@@ -44,6 +46,21 @@ export function useChatListContext(): ChatListContextValue | null {
44
46
  // Composer context — shared state between ChatComposer and ChatComposerInput
45
47
  // =============================================================================
46
48
 
49
+ /**
50
+ * Imperative surface the composer shell can invoke on its input slot.
51
+ *
52
+ * The input is one slot inside the composer body — it does not span the whole
53
+ * body — so shell-level interactions like "click empty space to focus the
54
+ * input" must flow shell → input. A custom input registers this control (via
55
+ * `ChatComposerContextValue.inputControlRef`) so the shell can drive it
56
+ * without knowing its DOM shape. Optional methods can be added over time;
57
+ * inputs implement only what they support.
58
+ */
59
+ export interface ChatComposerInputControl {
60
+ /** Move keyboard focus into the input. */
61
+ focus: () => void;
62
+ }
63
+
47
64
  export interface ChatComposerContextValue {
48
65
  value: string;
49
66
  onChange: (value: string) => void;
@@ -53,6 +70,15 @@ export interface ChatComposerContextValue {
53
70
  isStopShown: boolean;
54
71
  canSend: boolean;
55
72
  onStop?: () => void;
73
+ /**
74
+ * Mutable handle the input slot populates with its {@link
75
+ * ChatComposerInputControl}. The shell reads `.current` to drive the input
76
+ * (e.g. focus on body click). A custom input assigns
77
+ * `inputControlRef.current = { focus }` on mount and clears it on unmount.
78
+ * When unset, the shell falls back to focusing a `contenteditable`/`textarea`
79
+ * it finds in the body.
80
+ */
81
+ inputControlRef?: RefObject<ChatComposerInputControl | null>;
56
82
  }
57
83
 
58
84
  export const ChatComposerContext =
@@ -74,8 +100,9 @@ export interface ChatLayoutContextValue {
74
100
  contentRef: (el: HTMLElement | null) => void;
75
101
  }
76
102
 
77
- export const ChatLayoutContext =
78
- createContext<ChatLayoutContextValue | null>(null);
103
+ export const ChatLayoutContext = createContext<ChatLayoutContextValue | null>(
104
+ null,
105
+ );
79
106
  ChatLayoutContext.displayName = 'ChatLayoutContext';
80
107
 
81
108
  export function useChatLayoutContext(): ChatLayoutContextValue | null {
@@ -26,6 +26,7 @@ import {Button} from '../Button';
26
26
  import {Icon} from '../Icon';
27
27
  import {mergeProps} from '../utils';
28
28
  import type {BaseProps} from '../BaseProps';
29
+ import {useTranslator} from '../i18n';
29
30
 
30
31
  // =============================================================================
31
32
  // Types
@@ -66,7 +67,10 @@ const styles = stylex.create({
66
67
  borderRadius: radiusVars['--radius-full'],
67
68
  transformOrigin: 'center',
68
69
  transitionProperty: 'transform, background-color',
69
- transitionDuration: '0.06s',
70
+ transitionDuration: {
71
+ default: '0.06s',
72
+ '@media (prefers-reduced-motion: reduce)': '0s',
73
+ },
70
74
  transitionTimingFunction: 'ease-out',
71
75
  },
72
76
  });
@@ -107,13 +111,18 @@ export function ChatDictationButton({
107
111
  style,
108
112
  ...rest
109
113
  }: ChatDictationButtonProps) {
114
+ const t = useTranslator();
115
+
110
116
  if (isHiddenWhenUnsupported && !dictation.isSupported) {
111
117
  return null;
112
118
  }
113
119
 
114
120
  const {isListening, bands, volume: rawVolume} = dictation;
115
121
  const accessibleLabel =
116
- label ?? (isListening ? 'Stop dictation' : 'Start dictation');
122
+ label ??
123
+ (isListening
124
+ ? t('@astryx.chatDictationButton.stopDictation')
125
+ : t('@astryx.chatDictationButton.startDictation'));
117
126
 
118
127
  // Boost each band for visibility — quiet speech (0-10%) maps to full visual range
119
128
  const boostedBands = bands.map(b => Math.min(Math.pow(b / 0.2, 0.5), 1));
@@ -134,8 +134,8 @@ const styles = stylex.create({
134
134
  // --- Dock container ---
135
135
  dockContainer: {
136
136
  bottom: 0,
137
- left: 0,
138
- right: 0,
137
+ insetInlineStart: 0,
138
+ insetInlineEnd: 0,
139
139
  zIndex: 0,
140
140
  isolation: 'isolate',
141
141
  pointerEvents: 'none',
@@ -150,8 +150,8 @@ const styles = stylex.create({
150
150
  blurLayer: {
151
151
  position: 'absolute',
152
152
  bottom: 0,
153
- left: 0,
154
- right: 0,
153
+ insetInlineStart: 0,
154
+ insetInlineEnd: 0,
155
155
  pointerEvents: 'none',
156
156
  backdropFilter: 'blur(12px)',
157
157
  WebkitBackdropFilter: 'blur(12px)',
@@ -276,7 +276,9 @@ export function ChatLayout({
276
276
  const defaultScrollButton = (
277
277
  <ChatLayoutScrollButton
278
278
  isVisible={scroll.isScrolledUp || newMsgs.hasNewMessages}
279
- label={newMsgs.hasNewMessages ? t('@astryx.chatLayout.newMessages') : undefined}
279
+ label={
280
+ newMsgs.hasNewMessages ? t('@astryx.chatLayout.newMessages') : undefined
281
+ }
280
282
  onClick={() => {
281
283
  newMsgs.dismiss();
282
284
  scroll.scrollToBottom();
@@ -69,7 +69,10 @@ const styles = stylex.create({
69
69
  height: '32px',
70
70
  transitionProperty: 'opacity, transform, max-width',
71
71
  transitionTimingFunction: easeVars['--ease-standard'],
72
- transitionDuration: durationVars['--duration-fast-max'],
72
+ transitionDuration: {
73
+ default: durationVars['--duration-fast-max'],
74
+ '@media (prefers-reduced-motion: reduce)': '0s',
75
+ },
73
76
  },
74
77
  hidden: {
75
78
  opacity: 0,
@@ -135,7 +138,9 @@ export function ChatLayoutScrollButton({
135
138
  )}>
136
139
  <Button
137
140
  label={label ?? t('@astryx.chatLayoutScrollButton.scrollToBottom')}
138
- aria-label={label ?? t('@astryx.chatLayoutScrollButton.scrollToBottom')}
141
+ aria-label={
142
+ label ?? t('@astryx.chatLayoutScrollButton.scrollToBottom')
143
+ }
139
144
  icon={<Icon icon="chevronDown" size="md" />}
140
145
  variant="ghost"
141
146
  size="md"
@@ -122,8 +122,7 @@ export function ChatMessageMetadata({
122
122
  const sender = msgContext?.sender ?? 'assistant';
123
123
 
124
124
  const statusConfig = status != null ? STATUS_CONFIG[status] : null;
125
- const statusLabel =
126
- statusConfig != null ? t(statusConfig.i18nKey) : '';
125
+ const statusLabel = statusConfig != null ? t(statusConfig.i18nKey) : '';
127
126
 
128
127
  const hasContent =
129
128
  timestamp != null || footer != null || statusConfig != null;
@@ -88,7 +88,10 @@ export function ChatSendButton(props: ChatSendButtonProps): ReactNode {
88
88
  stopIcon,
89
89
  size = 'md',
90
90
  xstyle,
91
+ className,
92
+ style,
91
93
  ref,
94
+ ...rest
92
95
  } = props;
93
96
 
94
97
  const handleSend = onSend ?? (() => context?.onSubmit(''));
@@ -96,7 +99,11 @@ export function ChatSendButton(props: ChatSendButtonProps): ReactNode {
96
99
  return (
97
100
  <Button
98
101
  ref={ref}
99
- label={isStopShown ? t('@astryx.chatSendButton.stop') : t('@astryx.chatSendButton.send')}
102
+ label={
103
+ isStopShown
104
+ ? t('@astryx.chatSendButton.stop')
105
+ : t('@astryx.chatSendButton.send')
106
+ }
100
107
  variant={isStopShown ? 'secondary' : 'primary'}
101
108
  size={size}
102
109
  icon={
@@ -107,7 +114,10 @@ export function ChatSendButton(props: ChatSendButtonProps): ReactNode {
107
114
  isIconOnly
108
115
  isDisabled={!isStopShown && isDisabled}
109
116
  onClick={isStopShown ? onStop : handleSend}
117
+ {...rest}
110
118
  {...themeProps('chat-send-button')}
119
+ className={className}
120
+ style={style}
111
121
  xstyle={[styles.root, xstyle]}
112
122
  />
113
123
  );
@@ -133,6 +133,70 @@ describe('ChatToolCalls', () => {
133
133
  expect(panel).toHaveTextContent('file contents here');
134
134
  });
135
135
 
136
+ it('exposes the error message as text without requiring hover', () => {
137
+ render(
138
+ <ChatToolCalls
139
+ calls={[
140
+ {
141
+ name: 'bash',
142
+ status: 'error',
143
+ errorMessage: 'Command exited with code 1',
144
+ },
145
+ ]}
146
+ />,
147
+ );
148
+ // The message must exist as real (screen-reader-visible) text content,
149
+ // not only inside a hover-only title attribute.
150
+ expect(screen.getByText(/Command exited with code 1/)).toBeInTheDocument();
151
+ });
152
+
153
+ it('includes the error message in the accessible name of an expandable error row', () => {
154
+ render(
155
+ <ChatToolCalls
156
+ calls={[
157
+ {
158
+ name: 'bash',
159
+ status: 'error',
160
+ errorMessage: 'Command exited with code 1',
161
+ resultDetail: <div>stderr output</div>,
162
+ },
163
+ ]}
164
+ />,
165
+ );
166
+ expect(
167
+ screen.getByRole('button', {name: /Command exited with code 1/}),
168
+ ).toBeInTheDocument();
169
+ });
170
+
171
+ it('keeps the hover tooltip on the error status icon', () => {
172
+ const {container} = render(
173
+ <ChatToolCalls
174
+ calls={[
175
+ {
176
+ name: 'bash',
177
+ status: 'error',
178
+ errorMessage: 'Command exited with code 1',
179
+ },
180
+ ]}
181
+ />,
182
+ );
183
+ expect(
184
+ container.querySelector('[title="Command exited with code 1"]'),
185
+ ).not.toBeNull();
186
+ });
187
+
188
+ it('renders no error text for non-error calls', () => {
189
+ render(
190
+ <ChatToolCalls
191
+ calls={[
192
+ {name: 'bash', status: 'complete', errorMessage: 'stale message'},
193
+ ]}
194
+ />,
195
+ );
196
+ expect(screen.queryByText(/stale message/)).not.toBeInTheDocument();
197
+ expect(screen.queryByText(/Error:/)).not.toBeInTheDocument();
198
+ });
199
+
136
200
  it('points the group header aria-controls at the content region', () => {
137
201
  render(
138
202
  <ChatToolCalls
@@ -35,7 +35,9 @@ import {getKey, mergeProps} from '../utils';
35
35
  import {Badge} from '../Badge';
36
36
  import {Icon, type IconName} from '../Icon';
37
37
  import {Spinner} from '../Spinner';
38
+ import {VisuallyHidden} from '../VisuallyHidden';
38
39
  import {themeProps} from '../utils/themeProps';
40
+ import {useTranslator} from '../i18n';
39
41
 
40
42
  // =============================================================================
41
43
  // Types
@@ -60,7 +62,11 @@ export interface ChatToolCallItem {
60
62
  deletions?: number;
61
63
  /** Additional info rendered after the label. Free-form ReactNode. */
62
64
  stats?: ReactNode;
63
- /** Error message when status is 'error'. Shown in a tooltip on the status icon. */
65
+ /**
66
+ * Error message when status is 'error'. Rendered as visually hidden text in
67
+ * the row (so screen readers and keyboard users perceive it) and echoed in a
68
+ * hover tooltip on the status icon.
69
+ */
64
70
  errorMessage?: string;
65
71
  /** Unique key for React list rendering. Derived from stable metadata if omitted. */
66
72
  key?: string;
@@ -128,7 +134,10 @@ const styles = stylex.create({
128
134
  width: '14px',
129
135
  height: '14px',
130
136
  color: colorVars['--color-text-disabled'],
131
- transition: `transform ${durationVars['--duration-fast']} ${easeVars['--ease-standard']}`,
137
+ transition: {
138
+ default: `transform ${durationVars['--duration-fast']} ${easeVars['--ease-standard']}`,
139
+ '@media (prefers-reduced-motion: reduce)': 'none',
140
+ },
132
141
  },
133
142
  chevronExpanded: {
134
143
  transform: 'rotate(180deg)',
@@ -136,7 +145,10 @@ const styles = stylex.create({
136
145
  groupContent: {
137
146
  display: 'grid',
138
147
  gridTemplateRows: '0fr',
139
- transition: `grid-template-rows ${durationVars['--duration-medium']} ${easeVars['--ease-standard']}`,
148
+ transition: {
149
+ default: `grid-template-rows ${durationVars['--duration-medium']} ${easeVars['--ease-standard']}`,
150
+ '@media (prefers-reduced-motion: reduce)': 'none',
151
+ },
140
152
  },
141
153
  groupContentExpanded: {
142
154
  gridTemplateRows: '1fr',
@@ -261,7 +273,10 @@ const styles = stylex.create({
261
273
  width: '14px',
262
274
  height: '14px',
263
275
  color: colorVars['--color-text-disabled'],
264
- transition: `transform ${durationVars['--duration-fast']} ${easeVars['--ease-standard']}`,
276
+ transition: {
277
+ default: `transform ${durationVars['--duration-fast']} ${easeVars['--ease-standard']}`,
278
+ '@media (prefers-reduced-motion: reduce)': 'none',
279
+ },
265
280
  marginInlineStart: 'auto',
266
281
  },
267
282
  callDetailContent: {
@@ -349,6 +364,7 @@ function getToolCallKey(call: ChatToolCallItem): string {
349
364
  // =============================================================================
350
365
 
351
366
  function CallRow({call}: {call: ChatToolCallItem}) {
367
+ const t = useTranslator();
352
368
  const status = call.status ?? 'complete';
353
369
  const hasDetail = call.resultDetail != null;
354
370
  const [isDetailOpen, setIsDetailOpen] = useState(false);
@@ -395,6 +411,17 @@ function CallRow({call}: {call: ChatToolCallItem}) {
395
411
  </span>
396
412
  </>
397
413
  )}
414
+ {status === 'error' && call.errorMessage != null && (
415
+ // The title attribute above is hover-only; expose the error detail
416
+ // as real text so it reaches screen readers, keyboard, and touch
417
+ // users. Rendering it inside the row also folds it into the
418
+ // accessible name of expandable (role="button") rows.
419
+ <VisuallyHidden>
420
+ {t('@astryx.chatToolCalls.error', {
421
+ message: call.errorMessage ?? '',
422
+ })}
423
+ </VisuallyHidden>
424
+ )}
398
425
  </span>
399
426
  <span {...stylex.props(styles.callName)}>{call.name}</span>
400
427
  {call.node != null && (
@@ -477,6 +504,7 @@ function CallRow({call}: {call: ChatToolCallItem}) {
477
504
  * ```
478
505
  */
479
506
  export function ChatToolCalls(props: ChatToolCallsProps) {
507
+ const t = useTranslator();
480
508
  const {
481
509
  calls,
482
510
  label: _customLabel,
@@ -559,7 +587,7 @@ export function ChatToolCalls(props: ChatToolCallsProps) {
559
587
  <Icon icon="wrench" size="sm" color="inherit" />
560
588
  </span>
561
589
  <span {...stylex.props(styles.groupLabel)}>
562
- {calls.length} tool calls
590
+ {t('@astryx.chatToolCalls.groupLabel', {count: calls.length})}
563
591
  </span>
564
592
  </>
565
593
  ) : (
package/src/Chat/index.ts CHANGED
@@ -81,7 +81,11 @@ export type {
81
81
  TokenPortal,
82
82
  } from './useChatComposerTokens';
83
83
  export type {ChatMessageSender, ChatDensity} from './ChatContext';
84
- export {useChatLayoutContext} from './ChatContext';
84
+ export {useChatLayoutContext, useChatComposerContext} from './ChatContext';
85
+ export type {
86
+ ChatComposerContextValue,
87
+ ChatComposerInputControl,
88
+ } from './ChatContext';
85
89
 
86
90
  export {ChatToolCalls} from './ChatToolCalls';
87
91
  export type {