@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
@@ -92,6 +92,59 @@ describe('Carousel', () => {
92
92
  expect(screen.getByLabelText('Scroll right')).toBeInTheDocument();
93
93
  });
94
94
 
95
+ describe('slide semantics', () => {
96
+ it('exposes each slide as a group with aria-roledescription="slide" and a positional name', () => {
97
+ render(
98
+ <Carousel aria-label="Photos">
99
+ <div>One</div>
100
+ <div>Two</div>
101
+ <div>Three</div>
102
+ </Carousel>,
103
+ );
104
+ // APG carousel pattern: each slide container is role=group with
105
+ // aria-roledescription="slide" and an "N of M" accessible name.
106
+ const slides = screen.getAllByRole('group');
107
+ expect(slides).toHaveLength(3);
108
+ slides.forEach((slide, i) => {
109
+ expect(slide).toHaveAttribute('aria-roledescription', 'slide');
110
+ expect(slide).toHaveAccessibleName(`Slide ${i + 1} of 3`);
111
+ });
112
+ });
113
+
114
+ it('reflects the rendered child count, skipping null and boolean children', () => {
115
+ render(
116
+ <Carousel aria-label="Photos">
117
+ <div>One</div>
118
+ {null}
119
+ {false}
120
+ <div>Two</div>
121
+ </Carousel>,
122
+ );
123
+ const slides = screen.getAllByRole('group');
124
+ expect(slides).toHaveLength(2);
125
+ expect(
126
+ screen.getByRole('group', {name: 'Slide 1 of 2'}),
127
+ ).toBeInTheDocument();
128
+ expect(
129
+ screen.getByRole('group', {name: 'Slide 2 of 2'}),
130
+ ).toBeInTheDocument();
131
+ });
132
+
133
+ it('keeps the container region semantics unchanged around labelled slides', () => {
134
+ render(
135
+ <Carousel aria-label="Gallery">
136
+ <div>One</div>
137
+ <div>Two</div>
138
+ </Carousel>,
139
+ );
140
+ const region = screen.getByRole('region', {name: 'Gallery'});
141
+ expect(region).toHaveAttribute('aria-roledescription', 'carousel');
142
+ const slides = screen.getAllByRole('group');
143
+ expect(slides).toHaveLength(2);
144
+ slides.forEach(slide => expect(region).toContainElement(slide));
145
+ });
146
+ });
147
+
95
148
  it('disables edge scroll buttons instead of removing them from the tab order', () => {
96
149
  // In jsdom there is no measurable overflow, so both edges are at rest and
97
150
  // the scroll buttons are in their hidden/inert state. They must stay
@@ -9,7 +9,10 @@
9
9
  * @position Horizontal scroll container with fade-edge overflow indication,
10
10
  * optional prev/next buttons on the top layer, scroll-snap, a 1px
11
11
  * visual bleed allowance for child selection indicators, and Shift + wheel
12
- * mapping so mouse users can scroll horizontally.
12
+ * mapping so mouse users can scroll horizontally. Exposes APG
13
+ * carousel semantics: the root is a labelled region with
14
+ * aria-roledescription="carousel" and each item wrapper is a group with
15
+ * aria-roledescription="slide" named "Slide N of M".
13
16
  *
14
17
  * SYNC: When modified, update:
15
18
  * - /packages/core/src/Carousel/index.ts (exports)
@@ -17,7 +20,14 @@
17
20
  * - /packages/cli/templates/blocks/components/Carousel/ (showcase blocks)
18
21
  */
19
22
 
20
- import {type ReactNode, useRef, useCallback, useEffect, Children} from 'react';
23
+ import {
24
+ type ReactNode,
25
+ useRef,
26
+ useCallback,
27
+ useEffect,
28
+ Children,
29
+ isValidElement,
30
+ } from 'react';
21
31
  import * as stylex from '@stylexjs/stylex';
22
32
  import {
23
33
  spacingVars,
@@ -31,8 +41,9 @@ import {Button} from '../Button';
31
41
  import {Icon} from '../Icon';
32
42
  import {useLayer} from '../Layer';
33
43
  import {useScrollOverflow} from '../hooks/useScrollOverflow';
44
+ import {isRtlElement} from '../hooks/isRtlElement';
34
45
  import type {BaseProps} from '../BaseProps';
35
- import {mergeProps, mergeRefs} from '../utils';
46
+ import {mergeProps, mergeRefs, rtlStyles} from '../utils';
36
47
  import type {SpacingStep} from '../utils/types';
37
48
  import {themeProps} from '../utils/themeProps';
38
49
  import {useTranslator} from '../i18n';
@@ -156,10 +167,16 @@ const styles = stylex.create({
156
167
  transitionTimingFunction: easeVars['--ease-standard'],
157
168
  },
158
169
  buttonPillStart: {
159
- transform: 'translateX(-50%)',
170
+ transform: {
171
+ default: 'translateX(-50%)',
172
+ ':is([dir="rtl"] *)': 'translateX(50%)',
173
+ },
160
174
  },
161
175
  buttonPillEnd: {
162
- transform: 'translateX(50%)',
176
+ transform: {
177
+ default: 'translateX(50%)',
178
+ ':is([dir="rtl"] *)': 'translateX(-50%)',
179
+ },
163
180
  },
164
181
  buttonHidden: {
165
182
  opacity: 0,
@@ -270,6 +287,11 @@ export function Carousel({
270
287
  const scrollElRef = useRef<HTMLElement | null>(null);
271
288
  const {scrollRef, overflowStart, overflowEnd} = useScrollOverflow();
272
289
 
290
+ // Children.toArray drops null/undefined/boolean children and assigns
291
+ // stable keys, so slide numbering ("Slide N of M") matches what actually
292
+ // renders even when some children are conditionally omitted.
293
+ const slides = Children.toArray(children);
294
+
273
295
  const layer = useLayer({
274
296
  mode: 'context',
275
297
  lightDismiss: false,
@@ -332,7 +354,11 @@ export function Carousel({
332
354
  typeof window.matchMedia === 'function' &&
333
355
  window.matchMedia('(prefers-reduced-motion: reduce)').matches;
334
356
  el.scrollBy({
335
- left: direction * Math.max(amount, itemWidth),
357
+ // `direction` is the logical intent (-1 = toward content start, +1 =
358
+ // toward content end). Under RTL the scroll axis is inverted (start is
359
+ // scrollLeft 0, the end is negative), so flip the physical delta sign.
360
+ left:
361
+ (isRtlElement(el) ? -1 : 1) * direction * Math.max(amount, itemWidth),
336
362
  behavior: prefersReducedMotion ? 'auto' : 'smooth',
337
363
  });
338
364
  }, []);
@@ -380,8 +406,23 @@ export function Carousel({
380
406
  hasSnap && styles.snap,
381
407
  fadeStyle,
382
408
  )}>
383
- {Children.map(children, child => (
384
- <div {...stylex.props(styles.item)}>{child}</div>
409
+ {slides.map((child, index) => (
410
+ // APG carousel pattern: each slide container is a group with
411
+ // aria-roledescription="slide" and an "N of M" accessible name so
412
+ // ATs announce slide boundaries and position instead of anonymous
413
+ // generics.
414
+ <div
415
+ // eslint-disable-next-line @eslint-react/no-array-index-key -- index fallback only applies to text/number children, which are positional by definition; elements keep their Children.toArray keys
416
+ key={isValidElement(child) ? child.key : index}
417
+ role="group"
418
+ aria-roledescription="slide"
419
+ aria-label={t('@astryx.carousel.slideLabel', {
420
+ current: index + 1,
421
+ total: slides.length,
422
+ })}
423
+ {...stylex.props(styles.item)}>
424
+ {child}
425
+ </div>
385
426
  ))}
386
427
  </div>
387
428
 
@@ -395,7 +436,11 @@ export function Carousel({
395
436
  !overflowStart && styles.buttonHidden,
396
437
  )}>
397
438
  <Button
398
- icon={<Icon icon="chevronLeft" size="xsm" />}
439
+ icon={
440
+ <span {...stylex.props(rtlStyles.mirror)}>
441
+ <Icon icon="chevronLeft" size="xsm" />
442
+ </span>
443
+ }
399
444
  label={t('@astryx.carousel.scrollLeft')}
400
445
  variant="ghost"
401
446
  size="sm"
@@ -416,7 +461,11 @@ export function Carousel({
416
461
  !overflowEnd && styles.buttonHidden,
417
462
  )}>
418
463
  <Button
419
- icon={<Icon icon="chevronRight" size="xsm" />}
464
+ icon={
465
+ <span {...stylex.props(rtlStyles.mirror)}>
466
+ <Icon icon="chevronRight" size="xsm" />
467
+ </span>
468
+ }
420
469
  label={t('@astryx.carousel.scrollRight')}
421
470
  variant="ghost"
422
471
  size="sm"
@@ -56,6 +56,13 @@ export const docs = {
56
56
  description: 'Visual density.',
57
57
  default: "'balanced'",
58
58
  },
59
+ {
60
+ name: 'elevation',
61
+ type: "'none' | 'low'",
62
+ description:
63
+ "Resting elevation of the composer body. `low` (the default) keeps today's raised look: low at rest, bumping to med on hover / focus. `none` flattens it and draws a border with the same rest / hover / focus treatment as a text input (emphasized border → accent on focus, matching inset rings).",
64
+ default: "'low'",
65
+ },
59
66
  {
60
67
  name: 'drawer',
61
68
  type: 'ReactNode',
@@ -102,7 +109,7 @@ export const docs = {
102
109
  {
103
110
  name: 'input',
104
111
  type: 'ReactNode',
105
- description: 'Slot: custom input element. Replaces the default textarea. Use ChatComposerInput for trigger menus.',
112
+ description: 'Slot: custom input element. Replaces the default input. Use ChatComposerInput for trigger menus/tokens, or wire any input (plain textarea, rich editor) to the composition contract via useChatComposerContext(): read value/onChange/onSubmit/canSend and register a focus control on inputControlRef so body-click-to-focus works.',
106
113
  slotElements: [
107
114
  {
108
115
  __element: 'TextInput',
@@ -185,10 +192,11 @@ export const docsZh = {
185
192
  placeholder: '输入为空时显示的占位文本。',
186
193
  isDisabled: '禁用编写器。',
187
194
  density: '视觉密度。',
195
+ elevation: "编写器主体的静止高度。low(默认)保持当前的抬起外观——静止时 low,悬停/聚焦时升至 med。none 则扁平化。",
188
196
  drawer: '插槽:输入上方的可折叠抽屉——附件、上下文标签等。使用 ChatComposerDrawer。',
189
197
  headerActions: '插槽:标题左侧操作按钮(附件、提及按钮)。使用仅图标 size="sm" 按钮。',
190
198
  headerContext: '插槽:标题右侧上下文信息(上下文窗口使用情况、ProgressBar、辅助文本)。',
191
- input: '插槽:自定义输入元素。替换默认文本区域。使用 ChatComposerInput 实现触发菜单。',
199
+ input: '插槽:自定义输入元素。替换默认输入。使用 ChatComposerInput 实现触发菜单/标记,或通过 useChatComposerContext() 将任意输入(纯 textarea、富文本编辑器)接入组合契约——读取 value/onChange/onSubmit/canSend,并在 inputControlRef 上注册聚焦控制,使点击空白处聚焦生效。',
192
200
  footerActions: '插槽:左对齐的页脚操作(模型选择器等)。',
193
201
  sendActions: '插槽:发送按钮左侧的操作。',
194
202
  sendButton: '插槽:自定义发送按钮。替换默认的发送/停止按钮。',
@@ -210,10 +218,11 @@ export const docsDense = {
210
218
  placeholder: 'placeholder when empty',
211
219
  isDisabled: 'disabled; use during streaming or unmet prereqs',
212
220
  density: 'visual density',
221
+ elevation: "resting elevation of composer body: low (default; low→med on hover/focus) | none (flat)",
213
222
  drawer: 'slot: collapsible drawer above input: attachments, context chips, etc.; use ChatComposerDrawer',
214
223
  headerActions: 'slot: left header actions (attach, mention); icon-only sm buttons',
215
224
  headerContext: 'slot: right header context info (window usage, ProgressBar, text)',
216
- input: 'slot: custom input; replaces default textarea; use ChatComposerInput for triggers',
225
+ input: 'slot: custom input; replaces default. use ChatComposerInput for triggers/tokens, or wire any input via useChatComposerContext() (value/onChange/onSubmit/canSend + register focus on inputControlRef)',
217
226
  footerActions: 'slot: left footer actions (model selector etc)',
218
227
  sendActions: 'slot: actions left of send btn',
219
228
  sendButton: 'slot: custom send btn; replaces default',
@@ -0,0 +1,115 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {describe, it, expect, vi} from 'vitest';
4
+ import {render, fireEvent} from '@testing-library/react';
5
+ import {useEffect, useRef} from 'react';
6
+ import {ChatComposer} from './ChatComposer';
7
+ import {useChatComposerContext} from './ChatContext';
8
+
9
+ // The composer body — the elevated surface — is the div that wraps the input
10
+ // area (styles.body). A custom `input` slot renders inside the inputArea div,
11
+ // so the body is two ancestors up from the slot marker. Walking from a known
12
+ // marker keeps this independent of StyleX's generated class names.
13
+ function renderBodyClass(elevation?: 'none' | 'low'): string {
14
+ const {container} = render(
15
+ <ChatComposer
16
+ onSubmit={() => {}}
17
+ elevation={elevation}
18
+ input={<div data-testid="composer-input-marker" />}
19
+ />,
20
+ );
21
+ const marker = container.querySelector(
22
+ '[data-testid="composer-input-marker"]',
23
+ )!;
24
+ const inputArea = marker.parentElement!;
25
+ const body = inputArea.parentElement!;
26
+ return body.className;
27
+ }
28
+
29
+ describe('ChatComposer elevation', () => {
30
+ it('applies a distinct body class for each supported level', () => {
31
+ expect(renderBodyClass('none')).not.toBe(renderBodyClass('low'));
32
+ });
33
+
34
+ it("defaults to 'low' (preserves the raised look)", () => {
35
+ expect(renderBodyClass(undefined)).toBe(renderBodyClass('low'));
36
+ });
37
+ });
38
+
39
+ // A custom input that participates in the composer's composition contract:
40
+ // reads value/submit from the exported context, and registers a focus control
41
+ // so the shell can drive body-click-to-focus without knowing its DOM shape.
42
+ function CustomContextInput({focusSpy}: {focusSpy: () => void}) {
43
+ const ctx = useChatComposerContext();
44
+ const ref = useRef<HTMLInputElement>(null);
45
+ const controlRef = ctx?.inputControlRef;
46
+ useEffect(() => {
47
+ if (!controlRef) {
48
+ return;
49
+ }
50
+ controlRef.current = {
51
+ focus: () => {
52
+ focusSpy();
53
+ ref.current?.focus();
54
+ },
55
+ };
56
+ return () => {
57
+ controlRef.current = null;
58
+ };
59
+ }, [controlRef, focusSpy]);
60
+ return (
61
+ <input
62
+ ref={ref}
63
+ data-testid="custom-input"
64
+ value={ctx?.value ?? ''}
65
+ placeholder={ctx?.placeholder}
66
+ disabled={ctx?.isDisabled}
67
+ onChange={e => ctx?.onChange(e.target.value)}
68
+ />
69
+ );
70
+ }
71
+
72
+ describe('ChatComposer input composition contract', () => {
73
+ it('exposes value/onChange/placeholder/isDisabled to a custom input via context', () => {
74
+ const {getByTestId} = render(
75
+ <ChatComposer
76
+ onSubmit={() => {}}
77
+ value="hello"
78
+ placeholder="Say something"
79
+ isDisabled
80
+ input={<CustomContextInput focusSpy={() => {}} />}
81
+ />,
82
+ );
83
+ const input = getByTestId('custom-input') as HTMLInputElement;
84
+ expect(input.value).toBe('hello');
85
+ expect(input.placeholder).toBe('Say something');
86
+ expect(input.disabled).toBe(true);
87
+ });
88
+
89
+ it('focuses a custom input via its registered control on body click', () => {
90
+ const focusSpy = vi.fn();
91
+ const {getByTestId} = render(
92
+ <ChatComposer
93
+ onSubmit={() => {}}
94
+ input={<CustomContextInput focusSpy={focusSpy} />}
95
+ />,
96
+ );
97
+ const marker = getByTestId('custom-input');
98
+ const body = marker.parentElement!.parentElement!;
99
+ fireEvent.click(body);
100
+ expect(focusSpy).toHaveBeenCalled();
101
+ });
102
+
103
+ it('falls back to focusing a bare textarea when no control is registered', () => {
104
+ const {getByTestId} = render(
105
+ <ChatComposer
106
+ onSubmit={() => {}}
107
+ input={<textarea data-testid="bare-textarea" />}
108
+ />,
109
+ );
110
+ const textarea = getByTestId('bare-textarea') as HTMLTextAreaElement;
111
+ const body = textarea.parentElement!.parentElement!;
112
+ fireEvent.click(body);
113
+ expect(document.activeElement).toBe(textarea);
114
+ });
115
+ });
@@ -40,6 +40,7 @@ import {
40
40
  shadowVars,
41
41
  durationVars,
42
42
  easeVars,
43
+ borderVars,
43
44
  typeScaleVars,
44
45
  typographyVars,
45
46
  } from '../theme/tokens.stylex';
@@ -47,6 +48,7 @@ import {mergeProps} from '../utils';
47
48
  import {Icon} from '../Icon';
48
49
  import {ChatComposerInput} from './ChatComposerInput';
49
50
  import {ChatComposerContext} from './ChatContext';
51
+ import type {ChatComposerInputControl} from './ChatContext';
50
52
  import {ChatSendButton} from './ChatSendButton';
51
53
  import {themeProps} from '../utils/themeProps';
52
54
  import {useTranslator} from '../i18n';
@@ -83,6 +85,14 @@ export interface ChatComposerProps extends Omit<
83
85
  isDisabled?: boolean;
84
86
  /** Density variant */
85
87
  density?: ChatComposerDensity;
88
+ /**
89
+ * Resting elevation of the composer body. `low` (the default) keeps today's
90
+ * raised look — low at rest, bumping to med on hover / focus. `none` flattens
91
+ * it and draws a border with the same rest / hover / focus treatment as a
92
+ * text input (emphasized border → accent on focus, with matching inset rings).
93
+ * @default 'low'
94
+ */
95
+ elevation?: 'none' | 'low';
86
96
 
87
97
  // --- Slot props ---
88
98
 
@@ -143,14 +153,7 @@ const styles = stylex.create({
143
153
  borderRadius: 'var(--_chat-composer-radius)',
144
154
  backgroundColor: colorVars['--color-background-popover'],
145
155
  cursor: 'text',
146
- boxShadow: {
147
- default: shadowVars['--shadow-low'],
148
- ':hover': {'@media (hover: hover)': shadowVars['--shadow-med']},
149
- },
150
- transition: `box-shadow ${durationVars['--duration-fast']} ${easeVars['--ease-standard']}`,
151
- ':focus-within': {
152
- boxShadow: shadowVars['--shadow-med'],
153
- },
156
+ transition: `box-shadow ${durationVars['--duration-fast']} ${easeVars['--ease-standard']}, border-color ${durationVars['--duration-fast']} ${easeVars['--ease-standard']}`,
154
157
  },
155
158
  header: {
156
159
  display: 'flex',
@@ -247,11 +250,56 @@ const styles = stylex.create({
247
250
  color: colorVars['--color-text-yellow'],
248
251
  },
249
252
  compact: {
250
- padding: spacingVars['--spacing-2'],
253
+ // Override the padding var (not the `padding` property) so both the base
254
+ // body padding and the border-inset calc in elevationStyles.none pick up
255
+ // the compact value. Scoped to the body element, so the status bar (which
256
+ // reads the var from root) keeps its own padding.
257
+ '--_chat-composer-padding': spacingVars['--spacing-2'],
251
258
  gap: spacingVars['--spacing-1'],
252
259
  },
253
260
  });
254
261
 
262
+ // Resting elevation for the composer body, narrowed to two steps.
263
+ // - `low` (default) preserves today's look: low at rest, bumping to med on
264
+ // hover / focus-within (a CSS-only interaction state the component owns).
265
+ // - `none` is flat; depth comes from a border + inset rings instead. The
266
+ // border is drawn *inside* the padding — its width is subtracted from every
267
+ // side (like Card) so total inset (border + padding) equals the elevated
268
+ // case and content geometry is unchanged. Border color, hover, and focus
269
+ // states mirror TextInput (shared `inputWrapperStyles.base` treatment):
270
+ // emphasized border at rest → accent on focus-within, with the same inset
271
+ // shadow rings on hover and focus.
272
+ const elevationStyles = stylex.create({
273
+ low: {
274
+ boxShadow: {
275
+ default: shadowVars['--shadow-low'],
276
+ ':hover': {'@media (hover: hover)': shadowVars['--shadow-med']},
277
+ },
278
+ ':focus-within': {
279
+ boxShadow: shadowVars['--shadow-med'],
280
+ },
281
+ },
282
+ none: {
283
+ borderWidth: borderVars['--border-width'],
284
+ borderStyle: 'solid',
285
+ borderColor: {
286
+ default: colorVars['--color-border-emphasized'],
287
+ ':focus-within': colorVars['--color-accent'],
288
+ },
289
+ // Draw the border *inside* the padding — subtract its width from the body
290
+ // padding (like Card's withBorder) so total inset (border + padding) equals
291
+ // the elevated case and content geometry is unchanged.
292
+ padding: `calc(var(--_chat-composer-padding) - ${borderVars['--border-width']})`,
293
+ boxShadow: {
294
+ default: 'none',
295
+ ':hover:not(:focus-within)': {
296
+ '@media (hover: hover)': `inset 0px 0px 0px 2px color-mix(in srgb, ${colorVars['--color-border-emphasized']} 30%, transparent)`,
297
+ },
298
+ ':focus-within': `inset 0px 0px 0px 2px ${colorVars['--color-accent-muted']}`,
299
+ },
300
+ },
301
+ });
302
+
255
303
  // =============================================================================
256
304
  // Component
257
305
  // =============================================================================
@@ -280,6 +328,7 @@ export function ChatComposer(props: ChatComposerProps) {
280
328
  placeholder: placeholderFromProps,
281
329
  isDisabled = false,
282
330
  density = 'balanced',
331
+ elevation = 'low',
283
332
  drawer,
284
333
  headerActions,
285
334
  headerContext,
@@ -325,6 +374,11 @@ export function ChatComposer(props: ChatComposerProps) {
325
374
 
326
375
  const bodyRef = useRef<HTMLDivElement>(null);
327
376
 
377
+ // Input slot registers its focus (and future) control here so the shell can
378
+ // drive it without knowing its DOM shape. Stable ref — safe in the memoized
379
+ // context value.
380
+ const inputControlRef = useRef<ChatComposerInputControl | null>(null);
381
+
328
382
  const handleBodyClick = useCallback((e: MouseEvent<HTMLDivElement>) => {
329
383
  // Focus the input when clicking empty space in the body.
330
384
  // Skip if the click target is a button, link, or interactive element.
@@ -336,6 +390,14 @@ export function ChatComposer(props: ChatComposerProps) {
336
390
  ) {
337
391
  return;
338
392
  }
393
+ // Prefer the input's registered control (works for any input shape,
394
+ // including editors whose focusable node isn't a bare
395
+ // contenteditable/textarea). Fall back to a DOM query so uninstrumented
396
+ // custom inputs still get click-to-focus.
397
+ if (inputControlRef.current) {
398
+ inputControlRef.current.focus();
399
+ return;
400
+ }
339
401
  const editable = bodyRef.current?.querySelector<HTMLElement>(
340
402
  '[contenteditable="true"], textarea',
341
403
  );
@@ -370,6 +432,7 @@ export function ChatComposer(props: ChatComposerProps) {
370
432
  isStopShown,
371
433
  canSend,
372
434
  onStop,
435
+ inputControlRef,
373
436
  }),
374
437
  [
375
438
  currentValue,
@@ -402,6 +465,7 @@ export function ChatComposer(props: ChatComposerProps) {
402
465
  onClick={handleBodyClick}
403
466
  {...stylex.props(
404
467
  styles.body,
468
+ elevationStyles[elevation],
405
469
  density === 'compact' && styles.compact,
406
470
  xstyle,
407
471
  )}>
@@ -0,0 +1,61 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {describe, it, expect} from 'vitest';
4
+ import {render, screen, fireEvent} from '@testing-library/react';
5
+ import {ChatComposerDrawer} from './ChatComposerDrawer';
6
+
7
+ describe('ChatComposerDrawer', () => {
8
+ it('links the toggle to the drawer content via aria-controls', () => {
9
+ render(
10
+ <ChatComposerDrawer count={2} label="Attachments">
11
+ <span>Drawer content</span>
12
+ </ChatComposerDrawer>,
13
+ );
14
+
15
+ const toggle = screen.getByRole('button', {name: /Attachments/});
16
+ const controlsId = toggle.getAttribute('aria-controls');
17
+ // aria-controls must be present and point at the real content region.
18
+ expect(controlsId).toBeTruthy();
19
+ const region = document.getElementById(controlsId as string);
20
+ expect(region).not.toBeNull();
21
+ expect(region).toContainElement(screen.getByText('Drawer content'));
22
+ });
23
+
24
+ it('keeps aria-controls resolvable while collapsed (content stays mounted)', () => {
25
+ render(
26
+ <ChatComposerDrawer count={2} label="Attachments" defaultIsCollapsed>
27
+ <span>Drawer content</span>
28
+ </ChatComposerDrawer>,
29
+ );
30
+
31
+ const toggle = screen.getByRole('button', {name: /Attachments/});
32
+ const controlsId = toggle.getAttribute('aria-controls');
33
+ expect(controlsId).toBeTruthy();
34
+ const region = document.getElementById(controlsId as string);
35
+ expect(region).not.toBeNull();
36
+ expect(region).toContainElement(screen.getByText('Drawer content'));
37
+ });
38
+
39
+ it('toggles aria-expanded when the toggle is activated', () => {
40
+ render(
41
+ <ChatComposerDrawer count={2} label="Attachments">
42
+ <span>Drawer content</span>
43
+ </ChatComposerDrawer>,
44
+ );
45
+
46
+ const toggle = screen.getByRole('button', {name: /Attachments/});
47
+ expect(toggle).toHaveAttribute('aria-expanded', 'true');
48
+
49
+ fireEvent.click(toggle);
50
+ expect(screen.getByRole('button', {name: /Attachments/})).toHaveAttribute(
51
+ 'aria-expanded',
52
+ 'false',
53
+ );
54
+
55
+ fireEvent.click(screen.getByRole('button', {name: /Attachments/}));
56
+ expect(screen.getByRole('button', {name: /Attachments/})).toHaveAttribute(
57
+ 'aria-expanded',
58
+ 'true',
59
+ );
60
+ });
61
+ });
@@ -9,13 +9,15 @@
9
9
  * @position Collapsible drawer panel for ChatComposer.
10
10
  * Supports expanded (full content) and collapsed (count + label) states
11
11
  * with fade animation and grid-template-rows height transition.
12
+ * The collapse toggle exposes aria-expanded + aria-controls linking it to
13
+ * the content region (disclosure pattern).
12
14
  *
13
15
  * SYNC: When modified, update:
14
16
  * - /packages/core/src/Chat/index.ts (exports)
15
17
  * - /packages/cli/templates/blocks/components/ChatComposerDrawer/ (block examples)
16
18
  */
17
19
 
18
- import {useState, type ReactNode} from 'react';
20
+ import {useId, useState, type ReactNode} from 'react';
19
21
  import type {StyleXStyles} from '@stylexjs/stylex';
20
22
  import * as stylex from '@stylexjs/stylex';
21
23
  import {
@@ -240,6 +242,12 @@ export function ChatComposerDrawer({
240
242
 
241
243
  const canCollapse = count != null;
242
244
 
245
+ // Links the toggle to the region it shows/hides so assistive tech can move
246
+ // from the button to its controlled content (disclosure pattern). The
247
+ // content stays mounted while collapsed (hidden via the grid-row collapse),
248
+ // so the reference always resolves.
249
+ const contentId = useId();
250
+
243
251
  const toggle = () => {
244
252
  const next = !isCollapsed;
245
253
  if (!isControlled) {
@@ -271,6 +279,7 @@ export function ChatComposerDrawer({
271
279
  role="button"
272
280
  tabIndex={0}
273
281
  aria-expanded={!isCollapsed}
282
+ aria-controls={contentId}
274
283
  aria-label={
275
284
  isCollapsed
276
285
  ? t('@astryx.chatComposerDrawer.expand', {label})
@@ -301,6 +310,7 @@ export function ChatComposerDrawer({
301
310
  )}
302
311
 
303
312
  <div
313
+ id={contentId}
304
314
  {...stylex.props(
305
315
  styles.contentGrid,
306
316
  canCollapse && isCollapsed && styles.contentGridCollapsed,
@@ -80,6 +80,11 @@ export const docs = {
80
80
  type: '(value: string) => void',
81
81
  description: 'Called when the user presses Enter without Shift. The serialized value includes token placeholders.',
82
82
  },
83
+ {
84
+ name: 'onKeyDown',
85
+ type: '(event) => void',
86
+ description: 'Key-down handler invoked before the built-in Enter/history behavior (after any open trigger menu). The seam for platform-specific keys: call event.preventDefault() to suppress the default submit (e.g. newline on a touch keyboard), or act on the event yourself to add behavior (e.g. submit on Cmd/Ctrl+Enter). IME composition is always respected; Enter never submits mid-composition.',
87
+ },
83
88
  ],
84
89
  };
85
90
 
@@ -102,6 +107,7 @@ export const docsZh = {
102
107
  onPaste: '粘贴文本时调用。用于拦截或转换粘贴内容。',
103
108
  onFiles: '粘贴或拖放文件到输入时调用。用于处理附件。',
104
109
  onSubmit: '用户不按 Shift 按 Enter 时调用。序列化值包含标记占位符。',
110
+ onKeyDown: '在内置 Enter/历史处理之前(在打开的触发菜单之后)调用的按键处理器。平台特定按键的接缝:调用 event.preventDefault() 可抑制默认提交(例如触控键盘上插入换行),或自行处理事件以添加行为(例如 Cmd/Ctrl+Enter 提交)。始终尊重输入法组字状态——组字过程中 Enter 永不提交。',
105
111
  },
106
112
  };
107
113
 
@@ -124,5 +130,6 @@ export const docsDense = {
124
130
  onPaste: 'paste handler; intercept/transform pasted content',
125
131
  onFiles: 'file paste/drop handler; use for attachments',
126
132
  onSubmit: 'Enter w/o Shift handler; serialized value includes token placeholders',
133
+ onKeyDown: 'keydown handler before built-in Enter/history (after trigger menu); preventDefault() to suppress default submit (touch newline) or act on event to add behavior (Cmd/Ctrl+Enter). IME composition always respected',
127
134
  },
128
135
  };