@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
@@ -42,6 +42,7 @@ import {Divider} from '../Divider';
42
42
  import {layerAnimations} from '../Layer/layerAnimations.stylex';
43
43
  import type {LayerPlacement} from '../Layer/useLayer';
44
44
  import {Spinner} from '../Spinner';
45
+ import {useAnnounce} from '../hooks/useAnnounce';
45
46
  import {
46
47
  colorVars,
47
48
  sizeVars,
@@ -72,6 +73,7 @@ import {themeProps} from '../utils/themeProps';
72
73
  import {groupStyles} from '../InputGroup/groupStyles';
73
74
  import {useInputGroup} from '../InputGroup/InputGroupContext';
74
75
  import {VisuallyHidden} from '../VisuallyHidden';
76
+ import {useTranslator} from '../i18n';
75
77
 
76
78
  const styles = stylex.create({
77
79
  // Trigger container — the enhanced click target wrapping the combobox button and clear button as siblings
@@ -524,8 +526,7 @@ type SelectorPropsClearable<T extends SelectorOptionType = SelectorOptionType> =
524
526
  };
525
527
 
526
528
  export type SelectorProps<T extends SelectorOptionType = SelectorOptionType> =
527
- | SelectorPropsNonClearable<T>
528
- | SelectorPropsClearable<T>;
529
+ SelectorPropsNonClearable<T> | SelectorPropsClearable<T>;
529
530
 
530
531
  /**
531
532
  * Default option renderer
@@ -536,6 +537,23 @@ function DefaultOption({option}: {option: SelectorOptionData}) {
536
537
  );
537
538
  }
538
539
 
540
+ // Case-insensitive substring filter over the selectable options. Shared by the
541
+ // `filteredItems` memo (rendering) and the search-change handler, which needs
542
+ // the count for the *next* query synchronously to announce it exactly once per
543
+ // keystroke rather than reacting to state in an effect.
544
+ function filterOptionsByQuery(
545
+ items: SelectorOptionData[],
546
+ query: string,
547
+ ): SelectorOptionData[] {
548
+ if (!query) {
549
+ return items;
550
+ }
551
+ const q = query.toLowerCase();
552
+ return items.filter(item =>
553
+ (item.label ?? item.value).toLowerCase().includes(q),
554
+ );
555
+ }
556
+
539
557
  /**
540
558
  * A selector/dropdown component for choosing from a list of options.
541
559
  *
@@ -553,6 +571,7 @@ function DefaultOption({option}: {option: SelectorOptionData}) {
553
571
  export function Selector<T extends SelectorOptionType>(
554
572
  props: SelectorProps<T>,
555
573
  ) {
574
+ const t = useTranslator();
556
575
  const {
557
576
  label,
558
577
  isLabelHidden = false,
@@ -566,7 +585,7 @@ export function Selector<T extends SelectorOptionType>(
566
585
  onChange,
567
586
  changeAction,
568
587
  isLoading = false,
569
- placeholder = 'Select...',
588
+ placeholder: placeholderFromProps,
570
589
  size: sizeProp,
571
590
  status,
572
591
  labelTooltip,
@@ -574,7 +593,7 @@ export function Selector<T extends SelectorOptionType>(
574
593
  htmlName,
575
594
  renderOption,
576
595
  hasSearch = false,
577
- searchPlaceholder = 'Search...',
596
+ searchPlaceholder: searchPlaceholderFromProps,
578
597
  placement,
579
598
  isDefaultOpen = false,
580
599
  'data-testid': testId,
@@ -585,6 +604,9 @@ export function Selector<T extends SelectorOptionType>(
585
604
  hasClear: hasClearProp,
586
605
  ...rest
587
606
  } = props as SelectorPropsClearable<T>;
607
+ const placeholder = placeholderFromProps ?? t('@astryx.selector.placeholder');
608
+ const searchPlaceholder =
609
+ searchPlaceholderFromProps ?? t('@astryx.selector.searchPlaceholder');
588
610
  const hasClear = hasClearProp === true;
589
611
  const size = useSize(sizeProp, 'md');
590
612
 
@@ -637,15 +659,10 @@ export function Selector<T extends SelectorOptionType>(
637
659
  );
638
660
 
639
661
  // Filter items by search query
640
- const filteredItems = useMemo(() => {
641
- if (!searchQuery) {
642
- return selectableItems;
643
- }
644
- const query = searchQuery.toLowerCase();
645
- return selectableItems.filter(item =>
646
- (item.label ?? item.value).toLowerCase().includes(query),
647
- );
648
- }, [selectableItems, searchQuery]);
662
+ const filteredItems = useMemo(
663
+ () => filterOptionsByQuery(selectableItems, searchQuery),
664
+ [selectableItems, searchQuery],
665
+ );
649
666
 
650
667
  // Find selected item and its index for positioning
651
668
  const selectedItemIndex = useMemo(() => {
@@ -661,11 +678,20 @@ export function Selector<T extends SelectorOptionType>(
661
678
  // Ref for listbox to measure selected item position
662
679
  const listboxRef = useRef<HTMLDivElement>(null);
663
680
 
681
+ // Announce match counts / "No results found" politely as the user types, so
682
+ // screen-reader users hear how many options remain. Filtering was previously
683
+ // silent (comboboxes-7). Mirrors BaseTypeahead, which announces from its
684
+ // query-change callback (not a reactive effect) via the same useAnnounce hook.
685
+ const announce = useAnnounce();
686
+
664
687
  // Layer for dropdown positioning
665
688
  const handleLayerHide = useCallback(() => {
666
689
  setSearchQuery('');
690
+ // Clear any lingering result count when the popover closes so stale status
691
+ // text does not linger in the a11y tree.
692
+ announce('');
667
693
  triggerRef.current?.focus();
668
- }, []);
694
+ }, [announce]);
669
695
 
670
696
  const popover = usePopover({
671
697
  onHide: handleLayerHide,
@@ -685,6 +711,29 @@ export function Selector<T extends SelectorOptionType>(
685
711
  // eslint-disable-next-line @eslint-react/exhaustive-deps -- mount-only: isDefaultOpen is not reactive
686
712
  }, []);
687
713
 
714
+ // Announce the filtered result count from the query-change handler (matching
715
+ // BaseTypeahead) rather than a reactive effect: computing the count for the
716
+ // next query here fires the announcement exactly once per keystroke and does
717
+ // not re-speak on unrelated re-renders.
718
+ const handleSearchChange = useCallback(
719
+ (event: React.ChangeEvent<HTMLInputElement>) => {
720
+ const nextQuery = event.target.value;
721
+ setSearchQuery(nextQuery);
722
+ if (nextQuery.length === 0) {
723
+ // Emptying the query clears the region rather than announcing a count.
724
+ announce('');
725
+ return;
726
+ }
727
+ const count = filterOptionsByQuery(selectableItems, nextQuery).length;
728
+ announce(
729
+ count === 0
730
+ ? 'No results found'
731
+ : `${count} result${count === 1 ? '' : 's'}`,
732
+ );
733
+ },
734
+ [announce, selectableItems],
735
+ );
736
+
688
737
  // Calculate offset to position selected item over trigger. Explicit
689
738
  // placement opts out of the selector-specific overlay behavior and uses the
690
739
  // standard layer positioning API instead.
@@ -803,10 +852,10 @@ export function Selector<T extends SelectorOptionType>(
803
852
  ? getItemId(highlightedIndex)
804
853
  : undefined
805
854
  }
806
- aria-label="Search options"
855
+ aria-label={t('@astryx.selector.searchOptions')}
807
856
  type="text"
808
857
  value={searchQuery}
809
- onChange={e => setSearchQuery(e.target.value)}
858
+ onChange={handleSearchChange}
810
859
  onKeyDown={e => {
811
860
  // Arrow keys navigate options; Enter selects; Escape/Tab close.
812
861
  // Home/End are left to the input for caret movement.
@@ -831,10 +880,12 @@ export function Selector<T extends SelectorOptionType>(
831
880
  listboxId,
832
881
  searchQuery,
833
882
  searchPlaceholder,
883
+ handleSearchChange,
834
884
  onKeyDown,
835
885
  popover.isOpen,
836
886
  highlightedIndex,
837
887
  getItemId,
888
+ t,
838
889
  ]);
839
890
 
840
891
  // Render an individual item
@@ -1014,7 +1065,7 @@ export function Selector<T extends SelectorOptionType>(
1014
1065
  <button
1015
1066
  type="button"
1016
1067
  onClick={handleClear}
1017
- aria-label={`Clear ${label}`}
1068
+ aria-label={t('@astryx.selector.clearLabel', {label})}
1018
1069
  {...stylex.props(styles.clearButton)}>
1019
1070
  <Icon icon="close" size="sm" color="secondary" />
1020
1071
  </button>
@@ -20,7 +20,7 @@ export const docs = {
20
20
  name: 'icon',
21
21
  type: 'IconType',
22
22
  description:
23
- 'Icon displayed before the label. See `npx astryx docs icons` for valid semantic names.',
23
+ 'Icon displayed before the label. See `astryx docs icons` for valid semantic names.',
24
24
  },
25
25
  {
26
26
  name: 'description',
@@ -45,6 +45,7 @@ import {useResizable} from '../Resizable/useResizable';
45
45
  import type {ResizableConfig} from '../Resizable/useResizable';
46
46
  import {ResizeHandle} from '../Resizable/ResizeHandle';
47
47
  import {themeProps} from '../utils/themeProps';
48
+ import {useTranslator} from '../i18n';
48
49
 
49
50
  // =============================================================================
50
51
  // Constants
@@ -330,6 +331,7 @@ export function SideNav({
330
331
  handleRef,
331
332
  ...props
332
333
  }: SideNavProps) {
334
+ const t = useTranslator();
333
335
  // Parse collapsible prop
334
336
  const collapsibleConfig = typeof collapsible === 'object' ? collapsible : {};
335
337
  const isCollapsible = !!collapsible;
@@ -504,7 +506,7 @@ export function SideNav({
504
506
  <nav
505
507
  ref={mergeRefs(ref, navRef)}
506
508
  role="navigation"
507
- aria-label="Side navigation"
509
+ aria-label={t('@astryx.sideNav.label')}
508
510
  data-testid={testId}
509
511
  {...mergeProps(
510
512
  themeProps('side-nav'),
@@ -569,7 +571,7 @@ export function SideNav({
569
571
  pillPlacement="end"
570
572
  isAlwaysVisible={false}
571
573
  resizable={resizableHook.props}
572
- label="Resize sidebar"
574
+ label={t('@astryx.sideNav.resizeSidebar')}
573
575
  />
574
576
  </div>
575
577
  ) : (
@@ -30,6 +30,7 @@ import {
30
30
  type SideNavImperativeCollapseHandle,
31
31
  } from './SideNavCollapseContext';
32
32
  import {useAppShellMobile} from '../AppShell/AppShellMobileContext';
33
+ import {useTranslator} from '../i18n';
33
34
 
34
35
  // =============================================================================
35
36
  // Styles
@@ -105,6 +106,7 @@ export function SideNavCollapseButton({
105
106
  onClick: onClickProp,
106
107
  ...props
107
108
  }: SideNavCollapseButtonProps) {
109
+ const t = useTranslator();
108
110
  const {isCollapsed, toggle, isCollapsible} =
109
111
  useSideNavCollapseState(handleRef);
110
112
  const {isMobile} = useAppShellMobile();
@@ -118,7 +120,7 @@ export function SideNavCollapseButton({
118
120
  return (
119
121
  <Button
120
122
  ref={ref}
121
- label={label ?? (isCollapsed ? 'Expand sidebar' : 'Collapse sidebar')}
123
+ label={label ?? (isCollapsed ? t('@astryx.sideNavCollapseButton.expandSidebar') : t('@astryx.sideNavCollapseButton.collapseSidebar'))}
122
124
  variant="ghost"
123
125
  {...props}
124
126
  onClick={composeEventHandlers(onClickProp, toggle)}
@@ -44,6 +44,7 @@ import type {BaseProps} from '../BaseProps';
44
44
  import {useMenuHover} from '../hooks/useMenuHover';
45
45
  import {NavHeadingCloseContext} from '../NavMenu/NavMenuContext';
46
46
  import {themeProps} from '../utils/themeProps';
47
+ import {useTranslator} from '../i18n';
47
48
 
48
49
  // =============================================================================
49
50
  // Styles
@@ -342,13 +343,14 @@ export function SideNavHeading({
342
343
  ref,
343
344
  ...props
344
345
  }: SideNavHeadingProps) {
346
+ const t = useTranslator();
345
347
  const LinkComponent = useLinkComponent(as);
346
348
  const {isCollapsed} = useSideNavCollapse();
347
349
  const rootRef = useRef<HTMLDivElement>(null);
348
350
  const collapsedItemRef = useRef<HTMLElement>(null);
349
351
 
350
352
  const popover = usePopover({
351
- dialogLabel: 'Navigation menu',
353
+ dialogLabel: t('@astryx.sideNav.heading.dialogLabel'),
352
354
  hasCloseButton: false,
353
355
  });
354
356
 
@@ -603,7 +605,7 @@ export function SideNavHeading({
603
605
  {renderTextContent(
604
606
  <button
605
607
  type="button"
606
- aria-label="Open menu"
608
+ aria-label={t('@astryx.sideNav.heading.openMenu')}
607
609
  onClick={e => {
608
610
  e.stopPropagation();
609
611
  triggerProps.onClick();
@@ -665,7 +667,7 @@ export function SideNavHeading({
665
667
  showChevron ? (
666
668
  <button
667
669
  type="button"
668
- aria-label="Open menu"
670
+ aria-label={t('@astryx.sideNav.heading.openMenu')}
669
671
  onClick={e => {
670
672
  e.stopPropagation();
671
673
  triggerProps.onClick();
@@ -23,12 +23,12 @@ export const docs = {
23
23
  {
24
24
  name: 'icon',
25
25
  type: 'IconType',
26
- description: 'Icon displayed in the outline (unselected) variant. See `npx astryx docs icons` for valid semantic names.',
26
+ description: 'Icon displayed in the outline (unselected) variant. See `astryx docs icons` for valid semantic names.',
27
27
  },
28
28
  {
29
29
  name: 'selectedIcon',
30
30
  type: 'IconType',
31
- description: 'Icon displayed when the item is selected (filled variant). See `npx astryx docs icons` for valid semantic names.',
31
+ description: 'Icon displayed when the item is selected (filled variant). See `astryx docs icons` for valid semantic names.',
32
32
  },
33
33
  {
34
34
  name: 'isSelected',
@@ -54,6 +54,7 @@ import {getIcon} from '../Icon/globalIconRegistry';
54
54
  import {useSideNavRenderMode} from './SideNavRenderContext';
55
55
  import {useAppShellMobile} from '../AppShell/AppShellMobileContext';
56
56
  import {themeProps} from '../utils/themeProps';
57
+ import {useTranslator} from '../i18n';
57
58
 
58
59
  // =============================================================================
59
60
  // Styles
@@ -356,6 +357,7 @@ export function SideNavItem({
356
357
  'data-testid': testId,
357
358
  ref,
358
359
  }: SideNavItemProps) {
360
+ const t = useTranslator();
359
361
  const {isCollapsed} = useSideNavCollapse();
360
362
  const renderMode = useSideNavRenderMode();
361
363
  const {closeMobileNav} = useAppShellMobile();
@@ -626,7 +628,7 @@ export function SideNavItem({
626
628
  <button
627
629
  type="button"
628
630
  onClick={handleToggleClick}
629
- aria-label={isItemCollapsed ? `Expand ${label}` : `Collapse ${label}`}
631
+ aria-label={isItemCollapsed ? t('@astryx.sideNavItem.expand', {label}) : t('@astryx.sideNavItem.collapse', {label})}
630
632
  aria-expanded={!isItemCollapsed}
631
633
  aria-controls={`${id}-children`}
632
634
  {...stylex.props(styles.expandToggle)}>
@@ -132,7 +132,7 @@ export const docs = {
132
132
  },
133
133
  {
134
134
  name: 'status',
135
- type: 'InputStatus',
135
+ type: "{type: 'warning' | 'error' | 'success', message?: string}",
136
136
  description:
137
137
  'Status indicator object (`{ type, message }`) for validation feedback.',
138
138
  },
@@ -286,7 +286,7 @@ export const docsZh = {
286
286
  },
287
287
  {
288
288
  name: 'status',
289
- type: 'InputStatus',
289
+ type: "{type: 'warning' | 'error' | 'success', message?: string}",
290
290
  description:
291
291
  '验证反馈的状态指示器对象(`{ type, message }`)。',
292
292
  },
@@ -24,25 +24,25 @@ export const docs = {
24
24
  props: [
25
25
  {
26
26
  name: 'gap',
27
- type: 'SpacingStep',
27
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
28
28
  description:
29
29
  'Spacing step (number literal): 0, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 8, 10. Pass as a JSX number expression e.g. gap={4}, NOT a string like gap="4".',
30
30
  },
31
31
  {
32
32
  name: 'padding',
33
- type: 'SpacingStep',
33
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
34
34
  description:
35
35
  'Inner padding on all sides, using the spacing scale (0, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 8, 10). Matches the padding prop on Card, LayoutContent, and LayoutPanel. Pass as a JSX number expression e.g. padding={3}.',
36
36
  },
37
37
  {
38
38
  name: 'paddingInline',
39
- type: 'SpacingStep',
39
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
40
40
  description:
41
41
  'Inline (horizontal) padding, using the spacing scale. Overrides padding on the inline axis when both are set.',
42
42
  },
43
43
  {
44
44
  name: 'paddingBlock',
45
- type: 'SpacingStep',
45
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
46
46
  description:
47
47
  'Block (vertical) padding, using the spacing scale. Overrides padding on the block axis when both are set.',
48
48
  },
@@ -127,25 +127,25 @@ export const docs = {
127
127
  props: [
128
128
  {
129
129
  name: 'gap',
130
- type: 'SpacingStep',
130
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
131
131
  description:
132
132
  'Spacing step (number literal): 0, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 8, 10. Pass as a JSX number expression e.g. gap={4}, NOT a string like gap="4".',
133
133
  },
134
134
  {
135
135
  name: 'padding',
136
- type: 'SpacingStep',
136
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
137
137
  description:
138
138
  'Inner padding on all sides, using the spacing scale (0, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 8, 10). Matches the padding prop on Card, LayoutContent, and LayoutPanel. Pass as a JSX number expression e.g. padding={3}.',
139
139
  },
140
140
  {
141
141
  name: 'paddingInline',
142
- type: 'SpacingStep',
142
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
143
143
  description:
144
144
  'Inline (horizontal) padding, using the spacing scale. Overrides padding on the inline axis when both are set.',
145
145
  },
146
146
  {
147
147
  name: 'paddingBlock',
148
- type: 'SpacingStep',
148
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
149
149
  description:
150
150
  'Block (vertical) padding, using the spacing scale. Overrides padding on the block axis when both are set.',
151
151
  },
@@ -289,7 +289,7 @@ export const docsZh = {
289
289
  props: [
290
290
  {
291
291
  name: 'gap',
292
- type: 'SpacingStep',
292
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
293
293
  description:
294
294
  '间距步进(数字字面量):0、0.5、1、1.5、2、3、4、5、6、8、10。在 JSX 中使用数字表达式 e.g. gap={4},不要使用字符串 gap="4"。',
295
295
  },
@@ -358,7 +358,7 @@ export const docsZh = {
358
358
  props: [
359
359
  {
360
360
  name: 'gap',
361
- type: 'SpacingStep',
361
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
362
362
  description:
363
363
  '间距步进(数字字面量):0、0.5、1、1.5、2、3、4、5、6、8、10。在 JSX 中使用数字表达式 e.g. gap={4},不要使用字符串 gap="4"。',
364
364
  },
@@ -90,7 +90,7 @@ export const docs = {
90
90
  },
91
91
  {
92
92
  name: 'status',
93
- type: 'InputStatus',
93
+ type: "{type: 'warning' | 'error' | 'success', message?: string}",
94
94
  description:
95
95
  'Status indicator with type and message. Displays a colored message box below the switch and sets aria-invalid when type is "error".',
96
96
  },
@@ -107,7 +107,7 @@ export const docs = {
107
107
  {
108
108
  name: 'labelIcon',
109
109
  type: 'IconType',
110
- description: 'Icon displayed before the label text. See `npx astryx docs icons` for valid semantic names.',
110
+ description: 'Icon displayed before the label text. See `astryx docs icons` for valid semantic names.',
111
111
  },
112
112
  {
113
113
  name: 'labelTooltip',
@@ -236,7 +236,7 @@ export const docsZh = {
236
236
  },
237
237
  {
238
238
  name: 'status',
239
- type: 'InputStatus',
239
+ type: "{type: 'warning' | 'error' | 'success', message?: string}",
240
240
  description:
241
241
  '带类型和消息的状态指示器。在开关下方显示彩色消息框,当类型为 "error" 时设置 aria-invalid。',
242
242
  },
@@ -197,6 +197,22 @@ describe('Switch', () => {
197
197
  expect(screen.getByLabelText('Toggle row')).toBeInTheDocument();
198
198
  });
199
199
 
200
+ it('keeps description linked via aria-describedby when isLabelHidden', () => {
201
+ render(
202
+ <Switch
203
+ label="Toggle row"
204
+ isLabelHidden
205
+ description="Enables sync for this row"
206
+ value={false}
207
+ onChange={() => {}}
208
+ />,
209
+ );
210
+ const switchEl = screen.getByRole('switch');
211
+ const description = screen.getByText('Enables sync for this row');
212
+ expect(description.id).not.toBe('');
213
+ expect(switchEl.getAttribute('aria-describedby')).toContain(description.id);
214
+ });
215
+
200
216
  it('shows label visually by default', () => {
201
217
  render(
202
218
  <Switch label="Enable notifications" value={false} onChange={() => {}} />,
@@ -393,9 +393,11 @@ export function Switch({
393
393
  });
394
394
 
395
395
  // Build aria-describedby from description and status message
396
- // Only include descriptionID when the element actually renders
396
+ // Only include descriptionID when the element actually renders.
397
+ // FieldLabel renders the description (with descriptionID) even when the
398
+ // label is visually hidden — it's sr-only, so keep it linked.
397
399
  const describedByParts: string[] = [];
398
- if (description && !isLabelHidden) {
400
+ if (description) {
399
401
  describedByParts.push(descriptionID);
400
402
  }
401
403
  if (status?.message) {
@@ -138,7 +138,11 @@ const styles = stylex.create({
138
138
  },
139
139
  indicator: {
140
140
  position: 'absolute',
141
- bottom: '-1px',
141
+ // Sits on the tab's bottom edge by default (-1px). When the tab strip
142
+ // reserves space for a divider rail — TabList `hasDivider` or a Toolbar
143
+ // with a bottom divider — that ancestor sets `--_tab-indicator-bottom`
144
+ // to drop the indicator onto the rail beneath the reserved gap.
145
+ bottom: 'var(--_tab-indicator-bottom, -1px)',
142
146
  left: spacingVars['--spacing-3'],
143
147
  right: spacingVars['--spacing-3'],
144
148
  height: '2px',
@@ -92,7 +92,7 @@ export const docs = {
92
92
  bestPractices: [
93
93
  { guidance: true, description: 'Keep tab labels short and descriptive so users can quickly scan available sections.' },
94
94
  { guidance: true, description: 'Use TabMenu to group overflow items when horizontal space is limited rather than scrolling tabs off-screen.' },
95
- { guidance: true, description: 'When using hasDivider with action buttons alongside tabs, use a smaller button size (sm) so the actions don\'t overpower the tab row.' },
95
+ { guidance: true, description: 'When using hasDivider with action buttons alongside tabs, match the Button size to the TabList size (both md, both sm) — the divided tab strip reserves space so tabs and same-size buttons align to a shared baseline above the rail.' },
96
96
  { guidance: false, description: 'Use tabs for sequential steps or workflows; use a stepper or wizard pattern instead.' },
97
97
  { guidance: false, description: 'Place more than 6–8 visible tabs before the overflow menu; prioritize the most important categories.' },
98
98
  { guidance: false, description: 'Confuse TabList with SegmentedControl or ToggleButton. TabList is for navigation between views. SegmentedControl and ToggleButton are input controls: SegmentedControl always has exactly one selected option, while ToggleButton can be toggled on or off.' },
@@ -113,7 +113,7 @@ export const docsZh = {
113
113
  bestPractices: [
114
114
  { guidance: true, description: 'Keep tab labels short and descriptive so users can quickly scan available sections.' },
115
115
  { guidance: true, description: 'Use TabMenu to group overflow items when horizontal space is limited rather than scrolling tabs off-screen.' },
116
- { guidance: true, description: 'When using hasDivider with action buttons alongside tabs, use a smaller button size (sm) so the actions don\'t overpower the tab row.' },
116
+ { guidance: true, description: 'When using hasDivider with action buttons alongside tabs, match the Button size to the TabList size (both md, both sm) — the divided tab strip reserves space so tabs and same-size buttons align to a shared baseline above the rail.' },
117
117
  { guidance: false, description: 'Use tabs for sequential steps or workflows; use a stepper or wizard pattern instead.' },
118
118
  { guidance: false, description: 'Place more than 6–8 visible tabs before the overflow menu; prioritize the most important categories.' },
119
119
  { guidance: false, description: 'Confuse TabList with SegmentedControl or ToggleButton. TabList is for navigation between views. SegmentedControl and ToggleButton are input controls: SegmentedControl always has exactly one selected option, while ToggleButton can be toggled on or off.' },
@@ -135,7 +135,7 @@ export const docsDense = {
135
135
  bestPractices: [
136
136
  { guidance: true, description: 'Keep tab labels short and descriptive so users can quickly scan available sections.' },
137
137
  { guidance: true, description: 'Use TabMenu to group overflow items when horizontal space is limited rather than scrolling tabs off-screen.' },
138
- { guidance: true, description: 'When using hasDivider with action buttons alongside tabs, use a smaller button size (sm) so the actions don\'t overpower the tab row.' },
138
+ { guidance: true, description: 'When using hasDivider with action buttons alongside tabs, match the Button size to the TabList size (both md, both sm) — the divided tab strip reserves space so tabs and same-size buttons align to a shared baseline above the rail.' },
139
139
  { guidance: false, description: 'Use tabs for sequential steps or workflows; use a stepper or wizard pattern instead.' },
140
140
  { guidance: false, description: 'Place more than 6–8 visible tabs before the overflow menu; prioritize the most important categories.' },
141
141
  { guidance: false, description: 'Confuse TabList with SegmentedControl or ToggleButton. TabList is for navigation between views. SegmentedControl and ToggleButton are input controls: SegmentedControl always has exactly one selected option, while ToggleButton can be toggled on or off.' },
@@ -323,6 +323,72 @@ describe('TabList', () => {
323
323
  });
324
324
  });
325
325
 
326
+ describe('TabList divider gap', () => {
327
+ // The divider adds the reserved gap + indicator offset via a single class
328
+ // (StyleX applies deterministic classes in the test env). Capture that
329
+ // class set once so the assertions describe intent, not opaque hashes.
330
+ function navClasses(hasDivider: boolean): Set<string> {
331
+ const {unmount} = render(
332
+ <TabList value="home" onChange={() => {}} hasDivider={hasDivider}>
333
+ <Tab value="home" label="Home" />
334
+ </TabList>,
335
+ );
336
+ const nav = screen.getByRole('navigation');
337
+ const classes = new Set(nav.className.split(/\s+/).filter(Boolean));
338
+ unmount();
339
+ return classes;
340
+ }
341
+
342
+ it('adds divider-only styling classes when hasDivider is set', () => {
343
+ const withDivider = navClasses(true);
344
+ const withoutDivider = navClasses(false);
345
+
346
+ // Every class the plain nav has must still be present when divided: the
347
+ // divider only adds styling (border + reserved gap + indicator offset),
348
+ // it never removes the base nav styles.
349
+ for (const cls of withoutDivider) {
350
+ expect(withDivider.has(cls)).toBe(true);
351
+ }
352
+
353
+ // And it must add at least one class the undivided nav does not have.
354
+ const added = [...withDivider].filter(c => !withoutDivider.has(c));
355
+ expect(added.length).toBeGreaterThan(0);
356
+ });
357
+
358
+ it('does not add divider styling to an undivided tab list (default)', () => {
359
+ // Default (no hasDivider) and explicit hasDivider={false} are identical:
360
+ // the non-divided path is untouched by the divider gap change.
361
+ expect(navClasses(false)).toEqual(
362
+ (() => {
363
+ const {unmount} = render(
364
+ <TabList value="home" onChange={() => {}}>
365
+ <Tab value="home" label="Home" />
366
+ </TabList>,
367
+ );
368
+ const nav = screen.getByRole('navigation');
369
+ const classes = new Set(nav.className.split(/\s+/).filter(Boolean));
370
+ unmount();
371
+ return classes;
372
+ })(),
373
+ );
374
+ });
375
+
376
+ it('keeps the selected indicator rendered under a divider', () => {
377
+ render(
378
+ <TabList value="home" onChange={() => {}} hasDivider>
379
+ <Tab value="home" label="Home" />
380
+ <Tab value="away" label="Away" />
381
+ </TabList>,
382
+ );
383
+ const selected = screen.getByRole('button', {name: 'Home'});
384
+ // The indicator span carries the selected marker; the divider must not
385
+ // drop it (it is repositioned onto the rail, not removed).
386
+ expect(
387
+ selected.querySelector('[data-selected="selected"]'),
388
+ ).toBeInTheDocument();
389
+ });
390
+ });
391
+
326
392
  describe('TabList keyboard navigation (roving tabindex)', () => {
327
393
  it('exposes the tab strip as a single Tab stop (only selected tab is tabbable)', () => {
328
394
  render(
@@ -29,6 +29,7 @@ import {useListFocus} from '../hooks/useListFocus';
29
29
  import {useKeyboardHint} from '../hooks/useKeyboardHint';
30
30
  import {EDGE_COMP_ATTR} from '../Layout/edgeCompensation.stylex';
31
31
  import {themeProps} from '../utils/themeProps';
32
+ import {useTranslator} from '../i18n';
32
33
 
33
34
  /**
34
35
  * Selector matching the focusable stops in the tab strip: every Tab
@@ -95,6 +96,14 @@ const styles = stylex.create({
95
96
  borderBottomWidth: borderVars['--border-width'],
96
97
  borderBottomStyle: 'solid',
97
98
  borderBottomColor: colorVars['--color-border'],
99
+ // Reserve a gap between the tabs and the divider rail so the hover pill
100
+ // (which fills the tab height) no longer touches the underline, and an
101
+ // adjacent same-size Button aligns to the tabs rather than butting the
102
+ // rail. The tabs keep their element-size height; this padding grows the
103
+ // strip. `--_tab-indicator-bottom` drops the selected indicator through
104
+ // the reserved gap (+ the 1px border) so it still sits on the rail.
105
+ paddingBlockEnd: spacingVars['--spacing-1'],
106
+ '--_tab-indicator-bottom': `calc(-1 * (${spacingVars['--spacing-1']} + ${borderVars['--border-width']}))`,
98
107
  },
99
108
  });
100
109
 
@@ -129,11 +138,13 @@ export function TabList({
129
138
  onKeyDown: onKeyDownProp,
130
139
  onFocus: onFocusProp,
131
140
  onBlur: onBlurProp,
132
- 'aria-label': ariaLabel = 'Tabs',
141
+ 'aria-label': ariaLabelFromProps,
133
142
  'aria-orientation': _ariaOrientation,
134
143
  [EDGE_COMP_ATTR]: _edgeCompAttr,
135
144
  ...restProps
136
145
  }: TabListProps) {
146
+ const t = useTranslator();
147
+ const ariaLabel = ariaLabelFromProps ?? t('@astryx.tabList.label');
137
148
  const size = useSize(sizeProp, 'md');
138
149
 
139
150
  // Roving-tabindex keyboard navigation across the tab strip via the shared