@astryxdesign/core 0.1.6 → 0.1.7-canary.04cd8f7

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 (571) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +25 -14
  3. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  4. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  5. package/dist/AlertDialog/AlertDialog.js +4 -1
  6. package/dist/AppShell/AppShell.d.ts.map +1 -1
  7. package/dist/AppShell/AppShell.js +3 -1
  8. package/dist/AvatarGroup/AvatarGroup.d.ts +1 -1
  9. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  10. package/dist/AvatarGroup/AvatarGroup.js +4 -1
  11. package/dist/Banner/Banner.d.ts.map +1 -1
  12. package/dist/Banner/Banner.js +8 -6
  13. package/dist/Breadcrumbs/Breadcrumbs.d.ts +1 -1
  14. package/dist/Breadcrumbs/Breadcrumbs.d.ts.map +1 -1
  15. package/dist/Breadcrumbs/Breadcrumbs.js +4 -1
  16. package/dist/Button/Button.d.ts +10 -2
  17. package/dist/Button/Button.d.ts.map +1 -1
  18. package/dist/Button/Button.js +49 -6
  19. package/dist/ButtonGroup/ButtonGroup.d.ts +20 -5
  20. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  21. package/dist/ButtonGroup/ButtonGroup.js +27 -11
  22. package/dist/Calendar/Calendar.d.ts.map +1 -1
  23. package/dist/Calendar/Calendar.js +29 -7
  24. package/dist/Carousel/Carousel.d.ts +1 -1
  25. package/dist/Carousel/Carousel.d.ts.map +1 -1
  26. package/dist/Carousel/Carousel.js +8 -5
  27. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  28. package/dist/Chat/ChatComposer.js +4 -1
  29. package/dist/Chat/ChatComposerDrawer.d.ts +1 -1
  30. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  31. package/dist/Chat/ChatComposerDrawer.js +9 -2
  32. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  33. package/dist/Chat/ChatComposerInput.js +6 -2
  34. package/dist/Chat/ChatLayout.d.ts +1 -11
  35. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  36. package/dist/Chat/ChatLayout.js +6 -4
  37. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  38. package/dist/Chat/ChatLayoutScrollButton.js +4 -2
  39. package/dist/Chat/ChatMessage.d.ts +1 -1
  40. package/dist/Chat/ChatMessage.d.ts.map +1 -1
  41. package/dist/Chat/ChatMessage.js +8 -2
  42. package/dist/Chat/ChatMessageBubble.d.ts +1 -1
  43. package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
  44. package/dist/Chat/ChatMessageBubble.js +3 -1
  45. package/dist/Chat/ChatMessageList.d.ts +1 -1
  46. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  47. package/dist/Chat/ChatMessageList.js +3 -1
  48. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  49. package/dist/Chat/ChatMessageMetadata.js +13 -8
  50. package/dist/Chat/ChatPastedTextToken.d.ts.map +1 -1
  51. package/dist/Chat/ChatPastedTextToken.js +3 -1
  52. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  53. package/dist/Chat/ChatSendButton.js +3 -1
  54. package/dist/Chat/index.d.ts +1 -1
  55. package/dist/Chat/index.d.ts.map +1 -1
  56. package/dist/Chat/useChatStreamScroll.d.ts +12 -1
  57. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  58. package/dist/Chat/useChatStreamScroll.js +43 -6
  59. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  60. package/dist/Chat/useSpeechRecognition.js +4 -2
  61. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  62. package/dist/Chat/useTriggerMenu.js +4 -2
  63. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  64. package/dist/CheckboxInput/CheckboxInput.js +4 -2
  65. package/dist/CheckboxList/CheckboxList.d.ts +1 -1
  66. package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
  67. package/dist/CheckboxList/CheckboxList.js +3 -1
  68. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  69. package/dist/CheckboxList/CheckboxListItem.js +3 -1
  70. package/dist/Citation/Citation.d.ts.map +1 -1
  71. package/dist/Citation/Citation.js +10 -2
  72. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  73. package/dist/CodeBlock/CodeBlock.js +71 -53
  74. package/dist/Collapsible/Collapsible.d.ts +11 -1
  75. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  76. package/dist/Collapsible/Collapsible.js +36 -4
  77. package/dist/CommandPalette/CommandPalette.d.ts +1 -1
  78. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  79. package/dist/CommandPalette/CommandPalette.js +8 -3
  80. package/dist/CommandPalette/CommandPaletteInput.d.ts +1 -1
  81. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  82. package/dist/CommandPalette/CommandPaletteInput.js +4 -1
  83. package/dist/CommandPalette/CommandPaletteList.d.ts +1 -1
  84. package/dist/CommandPalette/CommandPaletteList.d.ts.map +1 -1
  85. package/dist/CommandPalette/CommandPaletteList.js +4 -1
  86. package/dist/ContextMenu/ContextMenu.d.ts +1 -1
  87. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  88. package/dist/ContextMenu/ContextMenu.js +8 -4
  89. package/dist/ContextMenu/index.d.ts +3 -0
  90. package/dist/ContextMenu/index.d.ts.map +1 -1
  91. package/dist/ContextMenu/index.js +7 -1
  92. package/dist/DateInput/DateInput.d.ts +1 -1
  93. package/dist/DateInput/DateInput.d.ts.map +1 -1
  94. package/dist/DateInput/DateInput.js +10 -5
  95. package/dist/DateRangeInput/DateRangeInput.d.ts +1 -1
  96. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  97. package/dist/DateRangeInput/DateRangeInput.js +11 -6
  98. package/dist/DateTimeInput/DateTimeInput.d.ts +1 -1
  99. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  100. package/dist/DateTimeInput/DateTimeInput.js +15 -7
  101. package/dist/Dialog/Dialog.d.ts.map +1 -1
  102. package/dist/Dialog/Dialog.js +15 -12
  103. package/dist/Dialog/DialogHeader.d.ts +1 -1
  104. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  105. package/dist/Dialog/DialogHeader.js +7 -3
  106. package/dist/DropdownMenu/DropdownMenu.d.ts +1 -1
  107. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  108. package/dist/DropdownMenu/DropdownMenu.js +19 -9
  109. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +89 -0
  110. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -0
  111. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +170 -0
  112. package/dist/DropdownMenu/DropdownMenuContext.d.ts +17 -1
  113. package/dist/DropdownMenu/DropdownMenuContext.d.ts.map +1 -1
  114. package/dist/DropdownMenu/DropdownMenuContext.js +18 -0
  115. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +69 -0
  116. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -0
  117. package/dist/DropdownMenu/DropdownMenuRadioGroup.js +70 -0
  118. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +69 -0
  119. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -0
  120. package/dist/DropdownMenu/DropdownMenuRadioItem.js +178 -0
  121. package/dist/DropdownMenu/index.d.ts +5 -1
  122. package/dist/DropdownMenu/index.d.ts.map +1 -1
  123. package/dist/DropdownMenu/index.js +10 -1
  124. package/dist/DropdownMenu/menuItemRoles.d.ts +13 -0
  125. package/dist/DropdownMenu/menuItemRoles.d.ts.map +1 -0
  126. package/dist/DropdownMenu/menuItemRoles.js +15 -0
  127. package/dist/EmptyState/EmptyState.d.ts +4 -1
  128. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  129. package/dist/FileInput/FileInput.d.ts.map +1 -1
  130. package/dist/FileInput/FileInput.js +11 -1
  131. package/dist/Icon/Icon.d.ts +17 -12
  132. package/dist/Icon/Icon.d.ts.map +1 -1
  133. package/dist/Icon/Icon.js +28 -20
  134. package/dist/Kbd/Kbd.js +1 -1
  135. package/dist/Layer/useLayer.d.ts +10 -0
  136. package/dist/Layer/useLayer.d.ts.map +1 -1
  137. package/dist/Layer/useLayer.js +23 -1
  138. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  139. package/dist/Lightbox/Lightbox.js +6 -4
  140. package/dist/Link/Link.d.ts +5 -1
  141. package/dist/Link/Link.d.ts.map +1 -1
  142. package/dist/Link/Link.js +32 -1
  143. package/dist/Markdown/Markdown.d.ts.map +1 -1
  144. package/dist/Markdown/Markdown.js +10 -8
  145. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  146. package/dist/MobileNav/MobileNav.js +4 -2
  147. package/dist/MobileNav/MobileNavToggle.d.ts +1 -1
  148. package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
  149. package/dist/MobileNav/MobileNavToggle.js +4 -1
  150. package/dist/MoreMenu/MoreMenu.d.ts +1 -1
  151. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  152. package/dist/MoreMenu/MoreMenu.js +4 -1
  153. package/dist/MultiSelector/MultiSelector.d.ts +1 -1
  154. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  155. package/dist/MultiSelector/MultiSelector.js +13 -6
  156. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  157. package/dist/NumberInput/NumberInput.js +5 -1
  158. package/dist/Outline/Outline.d.ts +1 -1
  159. package/dist/Outline/Outline.d.ts.map +1 -1
  160. package/dist/Outline/Outline.js +4 -1
  161. package/dist/Pagination/Pagination.d.ts +1 -1
  162. package/dist/Pagination/Pagination.d.ts.map +1 -1
  163. package/dist/Pagination/Pagination.js +38 -11
  164. package/dist/Popover/usePopover.d.ts.map +1 -1
  165. package/dist/Popover/usePopover.js +4 -1
  166. package/dist/PowerSearch/PowerSearch.d.ts +1 -1
  167. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  168. package/dist/PowerSearch/PowerSearch.js +22 -12
  169. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +1 -1
  170. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  171. package/dist/PowerSearch/PowerSearchEditPopover.js +26 -20
  172. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  173. package/dist/PowerSearch/PowerSearchToken.js +7 -3
  174. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  175. package/dist/PowerSearch/PowerSearchValueEditor.js +34 -21
  176. package/dist/PowerSearch/formatFilterValue.d.ts +2 -1
  177. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  178. package/dist/PowerSearch/formatFilterValue.js +19 -9
  179. package/dist/PowerSearch/index.d.ts +2 -1
  180. package/dist/PowerSearch/index.d.ts.map +1 -1
  181. package/dist/PowerSearch/index.js +1 -0
  182. package/dist/PowerSearch/resolveOperatorLabel.d.ts +23 -0
  183. package/dist/PowerSearch/resolveOperatorLabel.d.ts.map +1 -0
  184. package/dist/PowerSearch/resolveOperatorLabel.js +28 -0
  185. package/dist/PowerSearch/types.d.ts +28 -2
  186. package/dist/PowerSearch/types.d.ts.map +1 -1
  187. package/dist/PowerSearch/usePowerSearchConfig.d.ts.map +1 -1
  188. package/dist/PowerSearch/usePowerSearchConfig.js +27 -27
  189. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  190. package/dist/PowerSearch/usePowerSearchSource.js +15 -8
  191. package/dist/Resizable/ResizeHandle.d.ts +1 -1
  192. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  193. package/dist/Resizable/ResizeHandle.js +4 -1
  194. package/dist/Selector/Selector.d.ts.map +1 -1
  195. package/dist/Selector/Selector.js +52 -14
  196. package/dist/SideNav/SideNav.d.ts.map +1 -1
  197. package/dist/SideNav/SideNav.js +4 -2
  198. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  199. package/dist/SideNav/SideNavCollapseButton.js +3 -1
  200. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  201. package/dist/SideNav/SideNavHeading.js +5 -3
  202. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  203. package/dist/SideNav/SideNavItem.js +7 -1
  204. package/dist/Switch/Switch.d.ts.map +1 -1
  205. package/dist/Switch/Switch.js +4 -2
  206. package/dist/TabList/Tab.d.ts.map +1 -1
  207. package/dist/TabList/Tab.js +2 -2
  208. package/dist/TabList/TabList.d.ts +1 -1
  209. package/dist/TabList/TabList.d.ts.map +1 -1
  210. package/dist/TabList/TabList.js +6 -1
  211. package/dist/TabList/TabMenu.d.ts.map +1 -1
  212. package/dist/TabList/TabMenu.js +1 -1
  213. package/dist/Table/BaseTable.d.ts.map +1 -1
  214. package/dist/Table/BaseTable.js +29 -16
  215. package/dist/Table/Table.d.ts.map +1 -1
  216. package/dist/Table/Table.js +5 -3
  217. package/dist/Table/index.d.ts +2 -0
  218. package/dist/Table/index.d.ts.map +1 -1
  219. package/dist/Table/index.js +1 -0
  220. package/dist/Table/plugins/columnResize/useTableColumnResize.js +1 -1
  221. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  222. package/dist/Table/plugins/filtering/useTableFiltering.js +56 -19
  223. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
  224. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  225. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +12 -5
  226. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  227. package/dist/Table/plugins/pagination/useTablePagination.js +6 -3
  228. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  229. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +8 -6
  230. package/dist/Table/plugins/rowIndex/useTableRowIndex.d.ts +1 -1
  231. package/dist/Table/plugins/rowIndex/useTableRowIndex.js +1 -1
  232. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  233. package/dist/Table/plugins/selection/useTableSelection.js +5 -2
  234. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  235. package/dist/Table/plugins/sortable/useTableSortable.js +6 -4
  236. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -2
  237. package/dist/Table/plugins/tree/index.d.ts +5 -0
  238. package/dist/Table/plugins/tree/index.d.ts.map +1 -0
  239. package/dist/Table/plugins/tree/index.js +4 -0
  240. package/dist/Table/plugins/tree/useTableTreeData.d.ts +38 -0
  241. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -0
  242. package/dist/Table/plugins/tree/useTableTreeData.js +358 -0
  243. package/dist/Table/plugins/tree/useTableTreeState.d.ts +51 -0
  244. package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -0
  245. package/dist/Table/plugins/tree/useTableTreeState.js +175 -0
  246. package/dist/Table/types.d.ts +17 -10
  247. package/dist/Table/types.d.ts.map +1 -1
  248. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  249. package/dist/Table/useBaseTablePlugins.js +6 -3
  250. package/dist/TextInput/TextInput.d.ts.map +1 -1
  251. package/dist/TextInput/TextInput.js +5 -1
  252. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  253. package/dist/Thumbnail/Thumbnail.js +8 -2
  254. package/dist/TimeInput/TimeInput.d.ts +1 -1
  255. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  256. package/dist/TimeInput/TimeInput.js +7 -2
  257. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  258. package/dist/Timestamp/Timestamp.js +18 -3
  259. package/dist/Toast/Toast.d.ts.map +1 -1
  260. package/dist/Toast/Toast.js +3 -1
  261. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  262. package/dist/Toast/ToastViewport.js +3 -1
  263. package/dist/Token/Token.d.ts.map +1 -1
  264. package/dist/Token/Token.js +8 -2
  265. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  266. package/dist/Tokenizer/Tokenizer.js +3 -1
  267. package/dist/Toolbar/Toolbar.d.ts.map +1 -1
  268. package/dist/Toolbar/Toolbar.js +8 -1
  269. package/dist/TopNav/TopNav.d.ts +2 -1
  270. package/dist/TopNav/TopNav.d.ts.map +1 -1
  271. package/dist/TopNav/TopNav.js +4 -1
  272. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  273. package/dist/TopNav/TopNavHeading.js +5 -3
  274. package/dist/TreeList/TreeList.d.ts.map +1 -1
  275. package/dist/TreeList/TreeList.js +5 -1
  276. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  277. package/dist/TreeList/TreeListItem.js +7 -1
  278. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  279. package/dist/Typeahead/BaseTypeahead.js +8 -4
  280. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  281. package/dist/Typeahead/Typeahead.js +3 -1
  282. package/dist/VisuallyHidden/VisuallyHidden.d.ts +1 -0
  283. package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
  284. package/dist/VisuallyHidden/VisuallyHidden.js +1 -0
  285. package/dist/astryx.css +38 -4
  286. package/dist/astryx.umd.js +62 -60
  287. package/dist/astryx.umd.js.map +4 -4
  288. package/dist/authoring/doc.d.ts +145 -0
  289. package/dist/authoring/doc.d.ts.map +1 -0
  290. package/dist/authoring/doc.js +100 -0
  291. package/dist/authoring/index.d.ts +29 -0
  292. package/dist/authoring/index.d.ts.map +1 -0
  293. package/dist/authoring/index.js +28 -0
  294. package/dist/authoring/integration.d.ts +35 -0
  295. package/dist/authoring/integration.d.ts.map +1 -0
  296. package/dist/authoring/integration.js +30 -0
  297. package/dist/authoring/template.d.ts +66 -0
  298. package/dist/authoring/template.d.ts.map +1 -0
  299. package/dist/authoring/template.js +55 -0
  300. package/dist/config.d.ts +80 -0
  301. package/dist/config.d.ts.map +1 -0
  302. package/dist/config.js +40 -0
  303. package/dist/docs-types.d.ts +13 -4
  304. package/dist/docs-types.d.ts.map +1 -1
  305. package/dist/i18n/InternationalizationContext.d.ts +12 -0
  306. package/dist/i18n/InternationalizationContext.d.ts.map +1 -0
  307. package/dist/i18n/InternationalizationContext.js +29 -0
  308. package/dist/i18n/InternationalizationProvider.d.ts +61 -0
  309. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -0
  310. package/dist/i18n/InternationalizationProvider.js +44 -0
  311. package/dist/i18n/index.d.ts +24 -0
  312. package/dist/i18n/index.d.ts.map +1 -0
  313. package/dist/i18n/index.js +21 -0
  314. package/dist/i18n/resolve.d.ts +22 -0
  315. package/dist/i18n/resolve.d.ts.map +1 -0
  316. package/dist/i18n/resolve.js +141 -0
  317. package/dist/i18n/translator.d.ts +25 -0
  318. package/dist/i18n/translator.d.ts.map +1 -0
  319. package/dist/i18n/translator.js +1 -0
  320. package/dist/i18n/types.d.ts +47 -0
  321. package/dist/i18n/types.d.ts.map +1 -0
  322. package/dist/i18n/types.js +1 -0
  323. package/dist/i18n/useTranslator.d.ts +15 -0
  324. package/dist/i18n/useTranslator.d.ts.map +1 -0
  325. package/dist/i18n/useTranslator.js +39 -0
  326. package/dist/index.d.ts +1 -0
  327. package/dist/index.d.ts.map +1 -1
  328. package/dist/index.js +3 -0
  329. package/dist/theme/Theme.js +1 -1
  330. package/dist/theme/defineTheme.d.ts +1 -1
  331. package/dist/theme/defineTheme.js +1 -1
  332. package/dist/theme/hct.d.ts +0 -1
  333. package/dist/theme/hct.d.ts.map +1 -1
  334. package/dist/theme/hct.js +0 -3
  335. package/dist/utils/color.d.ts +13 -1
  336. package/dist/utils/color.d.ts.map +1 -1
  337. package/dist/utils/color.js +23 -1
  338. package/dist/utils/index.d.ts +1 -1
  339. package/dist/utils/index.d.ts.map +1 -1
  340. package/dist/utils/index.js +1 -1
  341. package/locales/en.json +754 -0
  342. package/locales/pseudo.json +566 -0
  343. package/package.json +23 -2
  344. package/src/AlertDialog/AlertDialog.doc.mjs +5 -0
  345. package/src/AlertDialog/AlertDialog.tsx +4 -1
  346. package/src/AppShell/AppShell.doc.mjs +8 -2
  347. package/src/AppShell/AppShell.tsx +3 -1
  348. package/src/AvatarGroup/AvatarGroup.tsx +4 -1
  349. package/src/Banner/Banner.tsx +10 -5
  350. package/src/Breadcrumbs/Breadcrumbs.tsx +4 -1
  351. package/src/Button/Button.doc.mjs +8 -0
  352. package/src/Button/Button.test.tsx +27 -0
  353. package/src/Button/Button.tsx +51 -5
  354. package/src/ButtonGroup/ButtonGroup.test.tsx +386 -2
  355. package/src/ButtonGroup/ButtonGroup.tsx +27 -11
  356. package/src/Calendar/Calendar.test.tsx +103 -2
  357. package/src/Calendar/Calendar.tsx +29 -6
  358. package/src/Card/Card.doc.mjs +3 -3
  359. package/src/Carousel/Carousel.tsx +10 -7
  360. package/src/Chat/ChatComposer.tsx +5 -1
  361. package/src/Chat/ChatComposerDrawer.tsx +9 -2
  362. package/src/Chat/ChatComposerInput.tsx +10 -4
  363. package/src/Chat/ChatLayout.test.tsx +127 -2
  364. package/src/Chat/ChatLayout.tsx +5 -12
  365. package/src/Chat/ChatLayoutScrollButton.tsx +4 -2
  366. package/src/Chat/ChatMessage.tsx +5 -1
  367. package/src/Chat/ChatMessageBubble.tsx +2 -0
  368. package/src/Chat/ChatMessageList.doc.mjs +1 -1
  369. package/src/Chat/ChatMessageList.tsx +2 -0
  370. package/src/Chat/ChatMessageMetadata.tsx +15 -9
  371. package/src/Chat/ChatPastedTextToken.tsx +3 -1
  372. package/src/Chat/ChatSendButton.tsx +3 -1
  373. package/src/Chat/ChatToolCalls.doc.mjs +1 -1
  374. package/src/Chat/index.ts +1 -0
  375. package/src/Chat/useChatStreamScroll.test.tsx +168 -0
  376. package/src/Chat/useChatStreamScroll.ts +67 -11
  377. package/src/Chat/useSpeechRecognition.ts +11 -2
  378. package/src/Chat/useTriggerMenu.tsx +4 -2
  379. package/src/CheckboxInput/CheckboxInput.doc.mjs +1 -1
  380. package/src/CheckboxInput/CheckboxInput.test.tsx +16 -0
  381. package/src/CheckboxInput/CheckboxInput.tsx +4 -2
  382. package/src/CheckboxList/CheckboxList.doc.mjs +6 -1
  383. package/src/CheckboxList/CheckboxList.tsx +2 -0
  384. package/src/CheckboxList/CheckboxListItem.tsx +7 -1
  385. package/src/Citation/Citation.tsx +4 -2
  386. package/src/ClickableCard/ClickableCard.doc.mjs +1 -1
  387. package/src/CodeBlock/CodeBlock.tsx +91 -40
  388. package/src/Collapsible/Collapsible.doc.mjs +7 -0
  389. package/src/Collapsible/Collapsible.test.tsx +80 -0
  390. package/src/Collapsible/Collapsible.tsx +58 -5
  391. package/src/CommandPalette/CommandPalette.tsx +10 -3
  392. package/src/CommandPalette/CommandPaletteInput.test.tsx +1 -1
  393. package/src/CommandPalette/CommandPaletteInput.tsx +5 -1
  394. package/src/CommandPalette/CommandPaletteList.tsx +4 -1
  395. package/src/ContextMenu/ContextMenu.test.tsx +75 -1
  396. package/src/ContextMenu/ContextMenu.tsx +14 -6
  397. package/src/ContextMenu/index.ts +15 -0
  398. package/src/DateInput/DateInput.doc.mjs +2 -2
  399. package/src/DateInput/DateInput.test.tsx +17 -5
  400. package/src/DateInput/DateInput.tsx +13 -5
  401. package/src/DateRangeInput/DateRangeInput.doc.mjs +1 -1
  402. package/src/DateRangeInput/DateRangeInput.tsx +14 -6
  403. package/src/DateTimeInput/DateTimeInput.doc.mjs +2 -2
  404. package/src/DateTimeInput/DateTimeInput.tsx +17 -7
  405. package/src/Dialog/Dialog.tsx +11 -15
  406. package/src/Dialog/DialogHeader.tsx +7 -3
  407. package/src/DropdownMenu/DropdownMenu.doc.mjs +23 -0
  408. package/src/DropdownMenu/DropdownMenu.tsx +23 -14
  409. package/src/DropdownMenu/DropdownMenuCheckboxItem.doc.mjs +95 -0
  410. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +237 -0
  411. package/src/DropdownMenu/DropdownMenuContext.tsx +29 -1
  412. package/src/DropdownMenu/DropdownMenuItem.doc.mjs +7 -1
  413. package/src/DropdownMenu/DropdownMenuRadioGroup.doc.mjs +80 -0
  414. package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +119 -0
  415. package/src/DropdownMenu/DropdownMenuRadioItem.doc.mjs +80 -0
  416. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +232 -0
  417. package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +163 -0
  418. package/src/DropdownMenu/index.ts +23 -3
  419. package/src/DropdownMenu/menuItemRoles.ts +22 -0
  420. package/src/EmptyState/EmptyState.doc.mjs +3 -3
  421. package/src/EmptyState/EmptyState.tsx +4 -1
  422. package/src/Field/Field.doc.mjs +3 -3
  423. package/src/Field/FieldLabel.doc.mjs +1 -1
  424. package/src/FileInput/FileInput.test.tsx +40 -1
  425. package/src/FileInput/FileInput.tsx +12 -1
  426. package/src/Grid/Grid.doc.mjs +5 -5
  427. package/src/Icon/Icon.test.tsx +46 -0
  428. package/src/Icon/Icon.tsx +37 -24
  429. package/src/InputGroup/InputGroup.doc.mjs +1 -1
  430. package/src/Kbd/Kbd.test.tsx +26 -0
  431. package/src/Kbd/Kbd.tsx +1 -1
  432. package/src/Layer/useLayer.doc.mjs +8 -5
  433. package/src/Layer/useLayer.test.tsx +136 -1
  434. package/src/Layer/useLayer.tsx +34 -2
  435. package/src/Lightbox/Lightbox.doc.mjs +7 -2
  436. package/src/Lightbox/Lightbox.tsx +6 -4
  437. package/src/Link/Link.test.tsx +74 -2
  438. package/src/Link/Link.tsx +48 -1
  439. package/src/Markdown/Markdown.tsx +12 -4
  440. package/src/MobileNav/MobileNav.tsx +4 -2
  441. package/src/MobileNav/MobileNavToggle.tsx +5 -3
  442. package/src/MoreMenu/MoreMenu.tsx +4 -1
  443. package/src/MultiSelector/MultiSelector.tsx +14 -5
  444. package/src/NumberInput/NumberInput.doc.mjs +2 -2
  445. package/src/NumberInput/NumberInput.tsx +3 -1
  446. package/src/Outline/Outline.tsx +4 -1
  447. package/src/OverflowList/OverflowList.doc.mjs +2 -2
  448. package/src/Pagination/Pagination.tsx +35 -12
  449. package/src/Popover/usePopover.tsx +6 -1
  450. package/src/PowerSearch/PowerSearch.doc.mjs +9 -4
  451. package/src/PowerSearch/PowerSearch.tsx +22 -10
  452. package/src/PowerSearch/PowerSearchEditPopover.tsx +27 -20
  453. package/src/PowerSearch/PowerSearchToken.tsx +17 -6
  454. package/src/PowerSearch/PowerSearchValueEditor.tsx +34 -21
  455. package/src/PowerSearch/formatFilterValue.test.ts +282 -0
  456. package/src/PowerSearch/formatFilterValue.ts +21 -8
  457. package/src/PowerSearch/index.ts +5 -0
  458. package/src/PowerSearch/resolveOperatorLabel.ts +34 -0
  459. package/src/PowerSearch/types.ts +33 -9
  460. package/src/PowerSearch/usePowerSearchConfig.ts +59 -27
  461. package/src/PowerSearch/usePowerSearchSource.ts +17 -8
  462. package/src/RadioList/RadioList.doc.mjs +1 -1
  463. package/src/Resizable/ResizeHandle.tsx +4 -1
  464. package/src/Section/Section.doc.mjs +4 -4
  465. package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
  466. package/src/Selector/Selector.doc.mjs +6 -3
  467. package/src/Selector/Selector.test.tsx +114 -6
  468. package/src/Selector/Selector.tsx +68 -17
  469. package/src/Selector/SelectorOption.doc.mjs +1 -1
  470. package/src/SideNav/SideNav.tsx +4 -2
  471. package/src/SideNav/SideNavCollapseButton.tsx +3 -1
  472. package/src/SideNav/SideNavHeading.tsx +5 -3
  473. package/src/SideNav/SideNavItem.doc.mjs +2 -2
  474. package/src/SideNav/SideNavItem.tsx +3 -1
  475. package/src/Slider/Slider.doc.mjs +2 -2
  476. package/src/Stack/Stack.doc.mjs +10 -10
  477. package/src/Switch/Switch.doc.mjs +3 -3
  478. package/src/Switch/Switch.test.tsx +16 -0
  479. package/src/Switch/Switch.tsx +4 -2
  480. package/src/TabList/Tab.tsx +5 -1
  481. package/src/TabList/TabList.doc.mjs +3 -3
  482. package/src/TabList/TabList.test.tsx +66 -0
  483. package/src/TabList/TabList.tsx +12 -1
  484. package/src/TabList/TabMenu.tsx +4 -1
  485. package/src/Table/BaseTable.tsx +36 -19
  486. package/src/Table/Table.doc.mjs +2 -0
  487. package/src/Table/Table.test.tsx +132 -1
  488. package/src/Table/Table.tsx +6 -4
  489. package/src/Table/index.ts +7 -0
  490. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +1 -1
  491. package/src/Table/plugins/filtering/useTableFiltering.tsx +31 -30
  492. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +7 -5
  493. package/src/Table/plugins/pagination/useTablePagination.tsx +4 -1
  494. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -8
  495. package/src/Table/plugins/rowIndex/useTableRowIndex.tsx +1 -1
  496. package/src/Table/plugins/selection/useTableSelection.tsx +6 -7
  497. package/src/Table/plugins/sortable/useTableSortable.tsx +8 -5
  498. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +4 -4
  499. package/src/Table/plugins/tree/index.ts +12 -0
  500. package/src/Table/plugins/tree/useTableTreeData-perf.test.tsx +163 -0
  501. package/src/Table/plugins/tree/useTableTreeData.test.tsx +594 -0
  502. package/src/Table/plugins/tree/useTableTreeData.tsx +495 -0
  503. package/src/Table/plugins/tree/useTableTreeState.test.tsx +636 -0
  504. package/src/Table/plugins/tree/useTableTreeState.tsx +253 -0
  505. package/src/Table/types.ts +18 -12
  506. package/src/Table/useBaseTablePlugins.ts +6 -2
  507. package/src/Table/useTableFiltering.doc.mjs +2 -2
  508. package/src/Table/useTableGroupedRows.doc.mjs +3 -3
  509. package/src/Table/useTableSortable.doc.mjs +11 -11
  510. package/src/Table/useTableTreeData.doc.mjs +75 -0
  511. package/src/Table/useTableTreeState.doc.mjs +98 -0
  512. package/src/Text/Text.doc.mjs +2 -2
  513. package/src/TextArea/TextArea.doc.mjs +1 -1
  514. package/src/TextInput/TextInput.doc.mjs +1 -1
  515. package/src/TextInput/TextInput.tsx +3 -1
  516. package/src/Thumbnail/Thumbnail.tsx +4 -2
  517. package/src/TimeInput/TimeInput.doc.mjs +2 -2
  518. package/src/TimeInput/TimeInput.tsx +6 -2
  519. package/src/Timestamp/Timestamp.doc.mjs +4 -4
  520. package/src/Timestamp/Timestamp.test.tsx +120 -7
  521. package/src/Timestamp/Timestamp.tsx +21 -1
  522. package/src/Toast/Toast.tsx +3 -1
  523. package/src/Toast/ToastViewport.tsx +3 -1
  524. package/src/Token/Token.tsx +4 -2
  525. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  526. package/src/Tokenizer/Tokenizer.tsx +4 -4
  527. package/src/Toolbar/Toolbar.doc.mjs +1 -1
  528. package/src/Toolbar/Toolbar.tsx +10 -3
  529. package/src/TopNav/TopNav.doc.mjs +1 -0
  530. package/src/TopNav/TopNav.test.tsx +30 -0
  531. package/src/TopNav/TopNav.tsx +6 -4
  532. package/src/TopNav/TopNavHeading.tsx +5 -3
  533. package/src/TreeList/TreeList.tsx +5 -1
  534. package/src/TreeList/TreeListItem.tsx +6 -1
  535. package/src/Typeahead/BaseTypeahead.tsx +11 -4
  536. package/src/Typeahead/Typeahead.doc.mjs +1 -1
  537. package/src/Typeahead/Typeahead.tsx +3 -1
  538. package/src/VisuallyHidden/VisuallyHidden.tsx +1 -0
  539. package/src/authoring/doc.ts +166 -0
  540. package/src/authoring/index.test.ts +52 -0
  541. package/src/authoring/index.ts +50 -0
  542. package/src/authoring/integration.ts +42 -0
  543. package/src/authoring/template.ts +74 -0
  544. package/src/config.test.ts +16 -0
  545. package/src/config.ts +92 -0
  546. package/src/docPropLiterals.test.ts +938 -0
  547. package/src/docs-types.ts +15 -10
  548. package/src/i18n/InternationalizationContext.ts +39 -0
  549. package/src/i18n/InternationalizationProvider.doc.mjs +72 -0
  550. package/src/i18n/InternationalizationProvider.tsx +82 -0
  551. package/src/i18n/__tests__/e2e-pagination.test.tsx +172 -0
  552. package/src/i18n/__tests__/e2e-powersearch.test.tsx +130 -0
  553. package/src/i18n/__tests__/resolve.test.ts +284 -0
  554. package/src/i18n/index.ts +32 -0
  555. package/src/i18n/resolve.ts +165 -0
  556. package/src/i18n/translator.ts +31 -0
  557. package/src/i18n/types.ts +53 -0
  558. package/src/i18n/useTranslator.doc.mjs +46 -0
  559. package/src/i18n/useTranslator.ts +50 -0
  560. package/src/index.ts +3 -0
  561. package/src/theme/Theme.doc.mjs +4 -4
  562. package/src/theme/Theme.tsx +1 -1
  563. package/src/theme/defineTheme.ts +1 -1
  564. package/src/theme/hct.ts +0 -4
  565. package/src/utils/color.test.ts +101 -1
  566. package/src/utils/color.ts +23 -1
  567. package/src/utils/index.ts +8 -1
  568. package/dist/NavItem/index.d.ts +0 -9
  569. package/dist/NavItem/index.d.ts.map +0 -1
  570. package/dist/NavItem/index.js +0 -10
  571. package/src/NavItem/index.ts +0 -11
@@ -23,12 +23,13 @@ import {
23
23
  useCallback,
24
24
  useEffect,
25
25
  useImperativeHandle,
26
+ useRef,
26
27
  } from 'react';
27
28
  import type {BaseProps} from '../BaseProps';
28
29
  import * as stylex from '@stylexjs/stylex';
29
30
  import {Button} from '../Button';
30
31
  import {Icon} from '../Icon';
31
- import {useGridFocus} from '../hooks';
32
+ import {useAnnounce, useGridFocus} from '../hooks';
32
33
  import {
33
34
  useCalendarDays,
34
35
  useCalendarConstraints,
@@ -56,7 +57,7 @@ import {
56
57
  DATE_FORMAT_WITH_WEEKDAY,
57
58
  DATE_FORMAT_MONTH_YEAR,
58
59
  } from '../utils/plainDate';
59
- import {mergeProps} from '../utils';
60
+ import {mergeProps, composeEventHandlers} from '../utils';
60
61
  import {
61
62
  computeDayCellState,
62
63
  computeRangeRounding,
@@ -84,6 +85,7 @@ import type {
84
85
  } from '../utils/dateTypes';
85
86
  import {normalizeDayOfWeek} from '../utils/dateTypes';
86
87
  import {themeProps} from '../utils/themeProps';
88
+ import {useTranslator} from '../i18n';
87
89
 
88
90
  /** Imperative handle for Calendar handleRef */
89
91
 
@@ -197,6 +199,7 @@ export type CalendarProps = CalendarSingleProps | CalendarRangeProps;
197
199
  * ```
198
200
  */
199
201
  export function Calendar({ref, ...props}: CalendarProps) {
202
+ const t = useTranslator();
200
203
  const {
201
204
  handleRef,
202
205
  mode = 'single',
@@ -216,6 +219,7 @@ export function Calendar({ref, ...props}: CalendarProps) {
216
219
  xstyle,
217
220
  className,
218
221
  style,
222
+ onKeyDown,
219
223
  ...rest
220
224
  } = props;
221
225
 
@@ -308,6 +312,25 @@ export function Calendar({ref, ...props}: CalendarProps) {
308
312
  .join(' – ');
309
313
  }, [visibleMonths, numberOfMonths]);
310
314
 
315
+ // Announce the newly visible month to screen readers whenever it changes.
316
+ // The visible month label (`<span>`) carries no live semantics, so paging the
317
+ // grid — via the header prev/next buttons, keyboard grid paging (arrow keys
318
+ // across a month boundary, PageUp/PageDown), the `navigateTo` handle, or a
319
+ // controlled `focusDate` change — otherwise updates the grid silently. Keying
320
+ // off `monthYearLabel` reuses the existing single-/multi-month formatting and
321
+ // only fires when the visible month actually changes (so selecting a date,
322
+ // which does not move the grid, stays silent). The first-render guard avoids
323
+ // announcing the initial month on mount.
324
+ const announce = useAnnounce();
325
+ const isInitialRenderRef = useRef(true);
326
+ useEffect(() => {
327
+ if (isInitialRenderRef.current) {
328
+ isInitialRenderRef.current = false;
329
+ return;
330
+ }
331
+ announce(monthYearLabel);
332
+ }, [monthYearLabel, announce]);
333
+
311
334
  // Determine if prev/next navigation is possible based on min/max
312
335
  const canNavigatePrevious = useMemo(() => {
313
336
  if (!min) {
@@ -418,18 +441,18 @@ export function Calendar({ref, ...props}: CalendarProps) {
418
441
  return (
419
442
  <div
420
443
  ref={ref}
444
+ {...rest}
421
445
  {...mergeProps(
422
446
  themeProps('calendar', {mode}),
423
447
  stylex.props(calendarStyles.calendar, xstyle),
424
448
  className,
425
449
  style,
426
450
  )}
427
- onKeyDown={handleCalendarKeyDown}
428
- {...rest}>
451
+ onKeyDown={composeEventHandlers(onKeyDown, handleCalendarKeyDown)}>
429
452
  {/* Header with navigation */}
430
453
  <div {...stylex.props(calendarStyles.header)}>
431
454
  <Button
432
- label="Previous month"
455
+ label={t('@astryx.calendar.previousMonth')}
433
456
  variant="ghost"
434
457
  icon={
435
458
  // Wrapper span (not Icon props): Icon's string mode clobbers
@@ -449,7 +472,7 @@ export function Calendar({ref, ...props}: CalendarProps) {
449
472
  </span>
450
473
 
451
474
  <Button
452
- label="Next month"
475
+ label={t('@astryx.calendar.nextMonth')}
453
476
  variant="ghost"
454
477
  icon={
455
478
  <span {...stylex.props(calendarStyles.navIcon)}>
@@ -62,9 +62,9 @@ export const docs = {
62
62
  },
63
63
  {
64
64
  name: 'variant',
65
- type: "'default' | 'muted' | 'blue' | 'cyan' | 'gray' | 'green' | 'orange' | 'pink' | 'purple' | 'red' | 'teal' | 'yellow'",
65
+ type: "'default' | 'transparent' | 'muted' | 'blue' | 'cyan' | 'gray' | 'green' | 'orange' | 'pink' | 'purple' | 'red' | 'teal' | 'yellow'",
66
66
  description:
67
- 'Background color variant. `default` uses the standard card background. `muted` uses the muted background for de-emphasised cards. The non-semantic variants use the corresponding `--color-<name>-background` token.',
67
+ 'Background color variant. `default` uses the standard card background. `transparent` drops the background entirely. `muted` uses the muted background for de-emphasised cards. The non-semantic variants use the corresponding `--color-background-<name>` token.',
68
68
  default: "'default'",
69
69
  },
70
70
  ],
@@ -169,6 +169,6 @@ export const docsDense = {
169
169
  minHeight: 'min card height',
170
170
  children: 'content inside card',
171
171
  padding: 'internal padding via spacing scale',
172
- variant: 'background color variant; `default` = standard card bg, `muted` = muted bg for de-emphasised cards; non-semantic variants use the corresponding `--color-<name>-background` token',
172
+ variant: 'background color variant; `default` = standard card bg, `transparent` = no background at all, `muted` = muted bg for de-emphasised cards; non-semantic variants use the corresponding `--color-background-<name>` token',
173
173
  },
174
174
  };
@@ -34,6 +34,7 @@ import type {BaseProps} from '../BaseProps';
34
34
  import {mergeProps, mergeRefs} from '../utils';
35
35
  import type {SpacingStep} from '../utils/types';
36
36
  import {themeProps} from '../utils/themeProps';
37
+ import {useTranslator} from '../i18n';
37
38
 
38
39
  export interface CarouselProps extends BaseProps<HTMLDivElement> {
39
40
  ref?: React.Ref<HTMLDivElement>;
@@ -256,13 +257,15 @@ export function Carousel({
256
257
  hasEdgeFade = true,
257
258
  hasSnap = false,
258
259
  padding,
259
- 'aria-label': ariaLabel = 'Carousel',
260
+ 'aria-label': ariaLabelFromProps,
260
261
  xstyle,
261
262
  className,
262
263
  style,
263
264
  'data-testid': testId,
264
265
  ...htmlProps
265
266
  }: CarouselProps) {
267
+ const t = useTranslator();
268
+ const ariaLabel = ariaLabelFromProps ?? t('@astryx.carousel.label');
266
269
  const scrollElRef = useRef<HTMLElement | null>(null);
267
270
  const {scrollRef, overflowStart, overflowEnd} = useScrollOverflow();
268
271
 
@@ -330,16 +333,16 @@ export function Carousel({
330
333
  <div
331
334
  ref={mergeRefs(ref, layer.ref as React.Ref<HTMLDivElement>)}
332
335
  data-testid={testId}
333
- role="region"
334
- aria-label={ariaLabel}
335
- aria-roledescription="carousel"
336
+ {...htmlProps}
336
337
  {...mergeProps(
337
338
  themeProps('carousel'),
338
339
  stylex.props(styles.root, xstyle),
339
340
  className,
340
341
  style,
341
342
  )}
342
- {...htmlProps}>
343
+ role="region"
344
+ aria-label={ariaLabel}
345
+ aria-roledescription="carousel">
343
346
  <div
344
347
  ref={composedRef}
345
348
  tabIndex={0}
@@ -366,7 +369,7 @@ export function Carousel({
366
369
  )}>
367
370
  <Button
368
371
  icon={<Icon icon="chevronLeft" size="xsm" />}
369
- label="Scroll left"
372
+ label={t('@astryx.carousel.scrollLeft')}
370
373
  variant="ghost"
371
374
  size="sm"
372
375
  isIconOnly
@@ -387,7 +390,7 @@ export function Carousel({
387
390
  )}>
388
391
  <Button
389
392
  icon={<Icon icon="chevronRight" size="xsm" />}
390
- label="Scroll right"
393
+ label={t('@astryx.carousel.scrollRight')}
391
394
  variant="ghost"
392
395
  size="sm"
393
396
  isIconOnly
@@ -49,6 +49,7 @@ import {ChatComposerInput} from './ChatComposerInput';
49
49
  import {ChatComposerContext} from './ChatContext';
50
50
  import {ChatSendButton} from './ChatSendButton';
51
51
  import {themeProps} from '../utils/themeProps';
52
+ import {useTranslator} from '../i18n';
52
53
 
53
54
  // =============================================================================
54
55
  // Types
@@ -268,6 +269,7 @@ const styles = stylex.create({
268
269
  * ```
269
270
  */
270
271
  export function ChatComposer(props: ChatComposerProps) {
272
+ const t = useTranslator();
271
273
  const {
272
274
  ref,
273
275
  onSubmit,
@@ -275,7 +277,7 @@ export function ChatComposer(props: ChatComposerProps) {
275
277
  isStopShown = false,
276
278
  value: controlledValue,
277
279
  onChange,
278
- placeholder = 'Type a message\u2026',
280
+ placeholder: placeholderFromProps,
279
281
  isDisabled = false,
280
282
  density = 'balanced',
281
283
  drawer,
@@ -292,6 +294,8 @@ export function ChatComposer(props: ChatComposerProps) {
292
294
  style,
293
295
  ...rest
294
296
  } = props;
297
+ const placeholder =
298
+ placeholderFromProps ?? t('@astryx.chat.composer.placeholder');
295
299
 
296
300
  const [internalValue, setInternalValue] = useState('');
297
301
 
@@ -30,6 +30,7 @@ import {Badge} from '../Badge';
30
30
  import {mergeProps} from '../utils';
31
31
  import type {BaseProps} from '../BaseProps';
32
32
  import {themeProps} from '../utils/themeProps';
33
+ import {useTranslator} from '../i18n';
33
34
 
34
35
  export interface ChatComposerDrawerProps extends BaseProps<HTMLDivElement> {
35
36
  ref?: React.Ref<HTMLDivElement>;
@@ -220,7 +221,7 @@ export function ChatComposerDrawer({
220
221
  ref,
221
222
  children,
222
223
  count,
223
- label = 'Items',
224
+ label: labelFromProps,
224
225
  isCollapsed: controlledCollapsed,
225
226
  defaultIsCollapsed = false,
226
227
  onCollapsedChange,
@@ -230,6 +231,8 @@ export function ChatComposerDrawer({
230
231
  'data-testid': testId,
231
232
  ...htmlProps
232
233
  }: ChatComposerDrawerProps): React.ReactElement {
234
+ const t = useTranslator();
235
+ const label = labelFromProps ?? t('@astryx.chat.composerDrawer.label');
233
236
  const [internalCollapsed, setInternalCollapsed] =
234
237
  useState(defaultIsCollapsed);
235
238
  const isControlled = controlledCollapsed !== undefined;
@@ -268,7 +271,11 @@ export function ChatComposerDrawer({
268
271
  role="button"
269
272
  tabIndex={0}
270
273
  aria-expanded={!isCollapsed}
271
- aria-label={isCollapsed ? `Expand ${label}` : `Collapse ${label}`}
274
+ aria-label={
275
+ isCollapsed
276
+ ? t('@astryx.chatComposerDrawer.expand', {label})
277
+ : t('@astryx.chatComposerDrawer.collapse', {label})
278
+ }
272
279
  onClick={toggle}
273
280
  onKeyDown={e => {
274
281
  if (e.key === 'Enter' || e.key === ' ') {
@@ -53,6 +53,7 @@ import {
53
53
  import {Badge, type BadgeProps} from '../Badge';
54
54
  import {useChatComposerContext} from './ChatContext';
55
55
  import {themeProps} from '../utils/themeProps';
56
+ import {useTranslator} from '../i18n';
56
57
 
57
58
  // =============================================================================
58
59
  // Types
@@ -96,8 +97,7 @@ export type ChatComposerTokenCustom = {
96
97
  * Use for tooltips, hovercards, or any content beyond a badge.
97
98
  */
98
99
  export type ChatComposerToken =
99
- | ChatComposerTokenBadge
100
- | ChatComposerTokenCustom;
100
+ ChatComposerTokenBadge | ChatComposerTokenCustom;
101
101
 
102
102
  export type ChatComposerTriggerItem = SearchableItem;
103
103
 
@@ -279,6 +279,7 @@ function serialize(node: Node): string {
279
279
  // =============================================================================
280
280
 
281
281
  export function ChatComposerInput(props: ChatComposerInputProps) {
282
+ const t = useTranslator();
282
283
  const composerCtx = useChatComposerContext();
283
284
  const hasControlledValueProp = props.value !== undefined;
284
285
 
@@ -287,12 +288,12 @@ export function ChatComposerInput(props: ChatComposerInputProps) {
287
288
  handleRef,
288
289
  value: controlledValue = composerCtx?.value,
289
290
  onChange: onChangeProp,
290
- placeholder = composerCtx?.placeholder ?? 'Type a message\u2026',
291
+ placeholder: placeholderFromProps,
291
292
  maxRows = 8,
292
293
  triggers,
293
294
  debounceMs = 150,
294
295
  hasHistory = true,
295
- label = 'Message input',
296
+ label: labelFromProps,
296
297
  isDisabled = composerCtx?.isDisabled ?? false,
297
298
  onPaste: onPasteProp,
298
299
  pasteAsToken: pasteAsTokenProp,
@@ -303,6 +304,11 @@ export function ChatComposerInput(props: ChatComposerInputProps) {
303
304
  style,
304
305
  ...rest
305
306
  } = props;
307
+ const label = labelFromProps ?? t('@astryx.chat.composerInput.label');
308
+ const placeholder =
309
+ placeholderFromProps ??
310
+ composerCtx?.placeholder ??
311
+ t('@astryx.chat.composer.placeholder');
306
312
 
307
313
  const composerOnChange = composerCtx?.onChange;
308
314
  const onChange = useCallback(
@@ -1,8 +1,11 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
- import {describe, it, expect} from 'vitest';
4
- import {render, screen} from '@testing-library/react';
3
+ import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
4
+ import {act, render, screen} from '@testing-library/react';
5
5
  import {ChatLayout} from './ChatLayout';
6
+ import {ChatMessageList} from './ChatMessageList';
7
+ import {ChatMessage} from './ChatMessage';
8
+ import {ChatMessageBubble} from './ChatMessageBubble';
6
9
 
7
10
  describe('ChatLayout', () => {
8
11
  it('renders children in the message area', () => {
@@ -99,3 +102,125 @@ describe('ChatLayout', () => {
99
102
  expect(screen.queryByRole('button')).toBeNull();
100
103
  });
101
104
  });
105
+
106
+ // ---------------------------------------------------------------------------
107
+ // First-fill scroll positioning
108
+ //
109
+ // jsdom has no layout, so geometry is stubbed and only the synchronous
110
+ // paths are asserted (see useChatStreamScroll.test.tsx for the rationale).
111
+ // The ResizeObserver stub mirrors useChatNewMessages.test.tsx.
112
+ // ---------------------------------------------------------------------------
113
+
114
+ type ObserverEntry = {element: Element; callback: ResizeObserverCallback};
115
+ let activeObservations: ObserverEntry[] = [];
116
+
117
+ class FakeResizeObserver {
118
+ callback: ResizeObserverCallback;
119
+ observed = new Set<Element>();
120
+
121
+ constructor(cb: ResizeObserverCallback) {
122
+ this.callback = cb;
123
+ }
124
+
125
+ observe(el: Element) {
126
+ this.observed.add(el);
127
+ activeObservations.push({element: el, callback: this.callback});
128
+ this.callback([{target: el} as ResizeObserverEntry], this);
129
+ }
130
+
131
+ unobserve(el: Element) {
132
+ this.observed.delete(el);
133
+ activeObservations = activeObservations.filter(o => o.element !== el);
134
+ }
135
+
136
+ disconnect() {
137
+ for (const el of this.observed) {
138
+ activeObservations = activeObservations.filter(o => o.element !== el);
139
+ }
140
+ this.observed.clear();
141
+ }
142
+ }
143
+
144
+ describe('ChatLayout — first-fill scroll positioning', () => {
145
+ let rafQueue: FrameRequestCallback[] = [];
146
+
147
+ beforeEach(() => {
148
+ activeObservations = [];
149
+ rafQueue = [];
150
+ vi.stubGlobal('ResizeObserver', FakeResizeObserver);
151
+ vi.stubGlobal('requestAnimationFrame', (cb: FrameRequestCallback) => {
152
+ rafQueue.push(cb);
153
+ return rafQueue.length;
154
+ });
155
+ vi.stubGlobal('cancelAnimationFrame', () => {});
156
+ });
157
+
158
+ afterEach(() => {
159
+ vi.unstubAllGlobals();
160
+ });
161
+
162
+ function setGeometry(el: HTMLElement, scrollHeight: number) {
163
+ Object.defineProperty(el, 'scrollHeight', {
164
+ value: scrollHeight,
165
+ configurable: true,
166
+ });
167
+ Object.defineProperty(el, 'clientHeight', {value: 400, configurable: true});
168
+ Object.defineProperty(el, 'offsetHeight', {
169
+ value: 400,
170
+ configurable: true,
171
+ });
172
+ }
173
+
174
+ function fireContentResize() {
175
+ act(() => {
176
+ for (const {element, callback} of [...activeObservations]) {
177
+ callback([{target: element} as ResizeObserverEntry], null!);
178
+ }
179
+ });
180
+ }
181
+
182
+ function renderLayout() {
183
+ render(
184
+ <ChatLayout composer={<div>composer</div>} data-testid="layout">
185
+ <ChatMessageList>
186
+ <ChatMessage sender="assistant">
187
+ <ChatMessageBubble>Hello</ChatMessageBubble>
188
+ </ChatMessage>
189
+ </ChatMessageList>
190
+ </ChatLayout>,
191
+ );
192
+ return screen.getByTestId('layout');
193
+ }
194
+
195
+ it('positions async-loaded content synchronously on the first fill', () => {
196
+ const root = renderLayout();
197
+ // Mounted while content is short (loading) — not scrollable.
198
+ setGeometry(root, 400);
199
+ act(() => rafQueue.splice(0).forEach(cb => cb(0)));
200
+ expect(root.scrollTop).toBe(0);
201
+
202
+ // Content lands: the message list's ResizeObserver fires.
203
+ setGeometry(root, 1400);
204
+ fireContentResize();
205
+ // Positioned in the same synchronous step — no animation frames.
206
+ expect(root.scrollTop).toBe(1000);
207
+ });
208
+
209
+ it('springs on growth after the first fill — animation owns it', () => {
210
+ const root = renderLayout();
211
+ setGeometry(root, 400);
212
+ act(() => rafQueue.splice(0).forEach(cb => cb(0)));
213
+
214
+ // First fill: instant.
215
+ setGeometry(root, 1400);
216
+ fireContentResize();
217
+ expect(root.scrollTop).toBe(1000);
218
+
219
+ // Streaming growth: nothing moves until animation frames run.
220
+ rafQueue.length = 0;
221
+ setGeometry(root, 1800);
222
+ fireContentResize();
223
+ expect(root.scrollTop).toBe(1000);
224
+ expect(rafQueue.length).toBeGreaterThan(0);
225
+ });
226
+ });
@@ -32,6 +32,7 @@ import {useChatNewMessages} from './useChatNewMessages';
32
32
  import {ChatLayoutScrollButton} from './ChatLayoutScrollButton';
33
33
  import {ChatLayoutContext} from './ChatContext';
34
34
  import {themeProps} from '../utils/themeProps';
35
+ import {useTranslator} from '../i18n';
35
36
 
36
37
  // =============================================================================
37
38
  // Types
@@ -39,17 +40,6 @@ import {themeProps} from '../utils/themeProps';
39
40
 
40
41
  type Density = 'compact' | 'balanced' | 'spacious';
41
42
 
42
- /** Imperative handle for ChatLayout scroll controls. */
43
- export interface ChatLayoutHandle {
44
- /** Scroll a message to the top and unlock for stream-in. */
45
- /** Scroll to bottom and re-lock. */
46
- scrollToBottom: () => void;
47
- /** Navigate to a message, no lock change. */
48
- scrollToMessage: (el: HTMLElement) => void;
49
- /** Scroll to the last message. */
50
- scrollToLastMessage: () => void;
51
- }
52
-
53
43
  export interface ChatLayoutProps extends BaseProps<HTMLDivElement> {
54
44
  /** Ref forwarded to the root element. */
55
45
  ref?: React.Ref<HTMLDivElement>;
@@ -268,7 +258,9 @@ export function ChatLayout({
268
258
  style,
269
259
  'data-testid': testId,
270
260
  ref,
261
+ ...rest
271
262
  }: ChatLayoutProps) {
263
+ const t = useTranslator();
272
264
  const rootRef = useRef<HTMLDivElement>(null);
273
265
 
274
266
  const scrollContainerRef = externalScrollRef ?? rootRef;
@@ -284,7 +276,7 @@ export function ChatLayout({
284
276
  const defaultScrollButton = (
285
277
  <ChatLayoutScrollButton
286
278
  isVisible={scroll.isScrolledUp || newMsgs.hasNewMessages}
287
- label={newMsgs.hasNewMessages ? 'New messages' : undefined}
279
+ label={newMsgs.hasNewMessages ? t('@astryx.chatLayout.newMessages') : undefined}
288
280
  onClick={() => {
289
281
  newMsgs.dismiss();
290
282
  scroll.scrollToBottom();
@@ -327,6 +319,7 @@ export function ChatLayout({
327
319
  return (
328
320
  <ChatLayoutContext value={layoutContext}>
329
321
  <div
322
+ {...rest}
330
323
  ref={mergeRefs(ref, rootRef)}
331
324
  data-testid={testId}
332
325
  {...mergeProps(
@@ -30,6 +30,7 @@ import {Icon} from '../Icon';
30
30
  import {Button} from '../Button';
31
31
  import type {BaseProps} from '../BaseProps';
32
32
  import {mergeProps} from '../utils';
33
+ import {useTranslator} from '../i18n';
33
34
 
34
35
  // =============================================================================
35
36
  // Types
@@ -120,6 +121,7 @@ export function ChatLayoutScrollButton({
120
121
  style,
121
122
  ...rest
122
123
  }: ChatLayoutScrollButtonProps) {
124
+ const t = useTranslator();
123
125
  return (
124
126
  <div
125
127
  ref={ref}
@@ -132,8 +134,8 @@ export function ChatLayoutScrollButton({
132
134
  label ? styles.expanded : styles.collapsed,
133
135
  )}>
134
136
  <Button
135
- label={label ?? 'Scroll to bottom'}
136
- aria-label={label ?? 'Scroll to bottom'}
137
+ label={label ?? t('@astryx.chatLayoutScrollButton.scrollToBottom')}
138
+ aria-label={label ?? t('@astryx.chatLayoutScrollButton.scrollToBottom')}
137
139
  icon={<Icon icon="chevronDown" size="md" />}
138
140
  variant="ghost"
139
141
  size="md"
@@ -36,6 +36,7 @@ import {
36
36
  import {mergeProps} from '../utils';
37
37
  import type {BaseProps} from '../BaseProps';
38
38
  import {themeProps} from '../utils/themeProps';
39
+ import {useTranslator} from '../i18n';
39
40
 
40
41
  export interface ChatMessageProps extends BaseProps<HTMLElement> {
41
42
  ref?: React.Ref<HTMLElement>;
@@ -167,7 +168,9 @@ export function ChatMessage({
167
168
  style: styleProp,
168
169
  'data-testid': testId,
169
170
  ref,
171
+ ...rest
170
172
  }: ChatMessageProps) {
173
+ const t = useTranslator();
171
174
  const listContext = useChatListContext();
172
175
  const density = densityProp ?? listContext?.density ?? 'balanced';
173
176
 
@@ -216,9 +219,10 @@ export function ChatMessage({
216
219
  return (
217
220
  <ChatMessageContext value={contextValue}>
218
221
  <article
222
+ {...rest}
219
223
  ref={ref}
220
224
  data-testid={testId}
221
- aria-label={!hasName ? `Message from ${sender}` : undefined}
225
+ aria-label={!hasName ? t('@astryx.chatMessage.messageFrom', {sender}) : undefined}
222
226
  aria-labelledby={hasName ? nameId : undefined}
223
227
  {...mergeProps(
224
228
  themeProps('chat-message', {sender, density}),
@@ -216,6 +216,7 @@ export function ChatMessageBubble({
216
216
  style: styleProp,
217
217
  'data-testid': testId,
218
218
  ref,
219
+ ...rest
219
220
  }: ChatMessageBubbleProps) {
220
221
  const msgContext = useChatMessageContext();
221
222
  const sender = msgContext?.sender ?? 'assistant';
@@ -274,6 +275,7 @@ export function ChatMessageBubble({
274
275
  </div>
275
276
  )}
276
277
  <div
278
+ {...rest}
277
279
  ref={ref}
278
280
  data-testid={testId}
279
281
  {...mergeProps(
@@ -42,7 +42,7 @@ export const docs = {
42
42
  },
43
43
  {
44
44
  name: 'gap',
45
- type: 'SpacingStep',
45
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
46
46
  description: 'Gap between top-level message rows. Defaults to the selected density; override for LLM event streams or independent rows that need different spacing from density.',
47
47
  },
48
48
  {
@@ -210,6 +210,7 @@ export function ChatMessageList({
210
210
  style,
211
211
  'data-testid': testId,
212
212
  ref,
213
+ ...rest
213
214
  }: ChatMessageListProps) {
214
215
  const layoutContext = useChatLayoutContext();
215
216
  const sentinelRef = useRef<HTMLDivElement>(null);
@@ -264,6 +265,7 @@ export function ChatMessageList({
264
265
  return (
265
266
  <ChatListContext value={contextValue}>
266
267
  <div
268
+ {...rest}
267
269
  ref={ref}
268
270
  role="log"
269
271
  aria-live="polite"
@@ -26,19 +26,20 @@ import type {IconName} from '../Icon/globalIconRegistry';
26
26
  import {mergeProps} from '../utils';
27
27
  import type {BaseProps} from '../BaseProps';
28
28
  import {themeProps} from '../utils/themeProps';
29
+ import {useTranslator} from '../i18n';
29
30
 
30
31
  export type ChatMessageStatus =
31
32
  'sending' | 'sent' | 'delivered' | 'read' | 'error';
32
33
 
33
34
  const STATUS_CONFIG: Record<
34
35
  ChatMessageStatus,
35
- {icon: IconName; label: string}
36
+ {icon: IconName; i18nKey: string}
36
37
  > = {
37
- sending: {icon: 'clock', label: 'Sending'},
38
- sent: {icon: 'check', label: 'Sent'},
39
- delivered: {icon: 'checkDouble', label: 'Delivered'},
40
- read: {icon: 'checkDouble', label: 'Read'},
41
- error: {icon: 'error', label: 'Failed'},
38
+ sending: {icon: 'clock', i18nKey: '@astryx.chat.status.sending'},
39
+ sent: {icon: 'check', i18nKey: '@astryx.chat.status.sent'},
40
+ delivered: {icon: 'checkDouble', i18nKey: '@astryx.chat.status.delivered'},
41
+ read: {icon: 'checkDouble', i18nKey: '@astryx.chat.status.read'},
42
+ error: {icon: 'error', i18nKey: '@astryx.chat.status.failed'},
42
43
  };
43
44
 
44
45
  const pulseKeyframes = stylex.keyframes({
@@ -116,10 +117,13 @@ export function ChatMessageMetadata({
116
117
  style,
117
118
  ...rest
118
119
  }: ChatMessageMetadataProps) {
120
+ const t = useTranslator();
119
121
  const msgContext = useChatMessageContext();
120
122
  const sender = msgContext?.sender ?? 'assistant';
121
123
 
122
124
  const statusConfig = status != null ? STATUS_CONFIG[status] : null;
125
+ const statusLabel =
126
+ statusConfig != null ? t(statusConfig.i18nKey) : '';
123
127
 
124
128
  const hasContent =
125
129
  timestamp != null || footer != null || statusConfig != null;
@@ -149,15 +153,17 @@ export function ChatMessageMetadata({
149
153
  {footer != null && statusConfig != null && <span>·</span>}
150
154
  {statusConfig != null && (
151
155
  <span
152
- title={statusConfig.label}
153
- aria-label={'Message ' + statusConfig.label.toLowerCase()}
156
+ title={statusLabel}
157
+ aria-label={t('@astryx.chat.messageAriaLabel', {
158
+ status: statusLabel.toLowerCase(),
159
+ })}
154
160
  {...stylex.props(
155
161
  styles.statusRow,
156
162
  status === 'error' && styles.statusError,
157
163
  status === 'sending' && styles.statusPulse,
158
164
  )}>
159
165
  <Icon icon={statusConfig.icon} size="xsm" color="inherit" />
160
- <span>{statusConfig.label}</span>
166
+ <span>{statusLabel}</span>
161
167
  </span>
162
168
  )}
163
169
  </div>