@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
@@ -116,7 +116,7 @@ export const docs = {
116
116
  name: 'startIcon',
117
117
  type: 'IconType',
118
118
  description:
119
- 'Icon component rendered inside the leading edge of the textarea wrapper. See `npx astryx docs icons` for valid semantic names.',
119
+ 'Icon component rendered inside the leading edge of the textarea wrapper. See `astryx docs icons` for valid semantic names.',
120
120
  },
121
121
  {
122
122
  name: 'hasSpellCheck',
@@ -106,7 +106,7 @@ export const docs = {
106
106
  name: 'startIcon',
107
107
  type: 'IconType',
108
108
  description:
109
- 'SVG icon component displayed at the start of the input. See `npx astryx docs icons` for valid semantic names.',
109
+ 'SVG icon component displayed at the start of the input. See `astryx docs icons` for valid semantic names.',
110
110
  },
111
111
  {
112
112
  name: 'status',
@@ -123,6 +123,7 @@ import {useInputGroup} from '../InputGroup/InputGroupContext';
123
123
  import type {BaseProps} from '../BaseProps';
124
124
  import type {SizeValue} from '../utils/types';
125
125
  import {themeProps} from '../utils/themeProps';
126
+ import {useTranslator} from '../i18n';
126
127
 
127
128
  export type TextInputType = 'text' | 'password' | 'email';
128
129
 
@@ -298,6 +299,7 @@ export function TextInput({
298
299
  ref,
299
300
  ...rest
300
301
  }: TextInputProps) {
302
+ const t = useTranslator();
301
303
  const size = useSize(sizeProp, 'md');
302
304
 
303
305
  const id = useId();
@@ -448,7 +450,7 @@ export function TextInput({
448
450
  <button
449
451
  type="button"
450
452
  onClick={handleClear}
451
- aria-label={`Clear ${label}`}
453
+ aria-label={t('@astryx.textInput.clearLabel', {label})}
452
454
  {...stylex.props(styles.clearButton)}>
453
455
  <Icon icon="close" size="sm" color="secondary" />
454
456
  </button>
@@ -40,6 +40,7 @@ import {useImageMode} from '../hooks/useImageMode';
40
40
  import type {BaseProps} from '../BaseProps';
41
41
  import {mergeProps} from '../utils';
42
42
  import {themeProps} from '../utils/themeProps';
43
+ import {useTranslator} from '../i18n';
43
44
 
44
45
  /** Sample the region behind the remove button (20px button, 4px inset, in 64px container). */
45
46
  const BUTTON_REGION = {x: 0.5, y: 0.06, width: 0.44, height: 0.44};
@@ -252,6 +253,7 @@ export function Thumbnail({
252
253
  ref,
253
254
  ...props
254
255
  }: ThumbnailProps) {
256
+ const t = useTranslator();
255
257
  const imageMode = useImageMode(src, {region: BUTTON_REGION, fallback: null});
256
258
 
257
259
  const hasSrc = src != null;
@@ -281,7 +283,7 @@ export function Thumbnail({
281
283
  onRemove != null && !isDisabled ? (
282
284
  <Button
283
285
  icon={<Icon icon="close" size="xsm" />}
284
- label={`Remove ${accessibleName}`}
286
+ label={t('@astryx.thumbnail.remove', {accessibleName})}
285
287
  variant="secondary"
286
288
  size="sm"
287
289
  isIconOnly
@@ -315,7 +317,7 @@ export function Thumbnail({
315
317
  <button
316
318
  type="button"
317
319
  onClick={onClick}
318
- aria-label={`Open ${accessibleName}`}
320
+ aria-label={t('@astryx.thumbnail.open', {accessibleName})}
319
321
  {...stylex.props(styles.interactiveButton)}>
320
322
  {imageContent}
321
323
  </button>
@@ -225,7 +225,7 @@ export const docs = {
225
225
  },
226
226
  {
227
227
  name: 'status',
228
- type: 'InputStatus',
228
+ type: "{type: 'warning' | 'error' | 'success', message?: string}",
229
229
  description:
230
230
  'Status indicator that colors the border and displays an icon. When a message is provided it is rendered below the input.',
231
231
  },
@@ -368,7 +368,7 @@ export const docsZh = {
368
368
  },
369
369
  {
370
370
  name: 'status',
371
- type: 'InputStatus',
371
+ type: "{type: 'warning' | 'error' | 'success', message?: string}",
372
372
  description:
373
373
  '为边框着色并显示图标的状态指示器。当提供消息时,消息渲染在输入框下方。',
374
374
  },
@@ -69,6 +69,7 @@ import {useInputGroup} from '../InputGroup/InputGroupContext';
69
69
  import {groupStyles} from '../InputGroup/groupStyles';
70
70
  import {useTooltip} from '../Tooltip';
71
71
  import {themeProps} from '../utils/themeProps';
72
+ import {useTranslator} from '../i18n';
72
73
 
73
74
  const styles = stylex.create({
74
75
  icon: {
@@ -341,7 +342,7 @@ export function TimeInput({
341
342
  hasAutoFocus = false,
342
343
  hourFormat = '12h',
343
344
  increment = 1,
344
- placeholder = 'Select a time',
345
+ placeholder: placeholderFromProps,
345
346
  size: sizeProp,
346
347
  status,
347
348
  labelTooltip,
@@ -351,6 +352,9 @@ export function TimeInput({
351
352
  style,
352
353
  ref,
353
354
  }: TimeInputProps) {
355
+ const t = useTranslator();
356
+ const placeholder =
357
+ placeholderFromProps ?? t('@astryx.timeInput.placeholder');
354
358
  const size = useSize(sizeProp, 'md');
355
359
 
356
360
  const id = useId();
@@ -659,7 +663,7 @@ export function TimeInput({
659
663
  <button
660
664
  type="button"
661
665
  onClick={handleClear}
662
- aria-label={`Clear ${label}`}
666
+ aria-label={t('@astryx.timeInput.clearLabel', {label})}
663
667
  {...stylex.props(styles.clearButton)}>
664
668
  <Icon icon="close" size="sm" color="secondary" />
665
669
  </button>
@@ -61,24 +61,24 @@ export const docs = {
61
61
  },
62
62
  {
63
63
  name: 'type',
64
- type: 'TextType',
64
+ type: "'body' | 'large' | 'label' | 'supporting' | 'code' | 'display-1' | 'display-2' | 'display-3' | 'inherit'",
65
65
  description: 'Semantic text type from Text. Determines size, weight, and line-height.',
66
66
  default: "'supporting'",
67
67
  },
68
68
  {
69
69
  name: 'size',
70
- type: 'TextSize',
70
+ type: "'4xs' | '3xs' | '2xs' | 'xsm' | 'sm' | 'base' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl'",
71
71
  description: 'Explicit font size override. Overrides the size from type.',
72
72
  },
73
73
  {
74
74
  name: 'color',
75
- type: 'TextColor',
75
+ type: "'primary' | 'secondary' | 'disabled' | 'placeholder' | 'accent' | 'inherit'",
76
76
  description: 'Text color.',
77
77
  default: "'secondary'",
78
78
  },
79
79
  {
80
80
  name: 'weight',
81
- type: 'TextWeight',
81
+ type: "'normal' | 'medium' | 'semibold' | 'bold'",
82
82
  description: 'Font weight override.',
83
83
  },
84
84
  ],
@@ -1,7 +1,8 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
3
  import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
4
- import {render, screen, act} from '@testing-library/react';
4
+ import {render, screen, act, waitFor} from '@testing-library/react';
5
+ import userEvent from '@testing-library/user-event';
5
6
  import {Timestamp} from './Timestamp';
6
7
 
7
8
  describe('Timestamp', () => {
@@ -41,9 +42,7 @@ describe('Timestamp', () => {
41
42
  );
42
43
  expect(screen.getByText('59 minutes ago')).toBeInTheDocument();
43
44
 
44
- rerender(
45
- <Timestamp value={Date.now() / 1000 - 86399} format="relative" />,
46
- );
45
+ rerender(<Timestamp value={Date.now() / 1000 - 86399} format="relative" />);
47
46
  expect(screen.getByText('23 hours ago')).toBeInTheDocument();
48
47
 
49
48
  rerender(
@@ -52,9 +51,7 @@ describe('Timestamp', () => {
52
51
  expect(screen.getByText('29 days ago')).toBeInTheDocument();
53
52
 
54
53
  // Same guarantee on the future side.
55
- rerender(
56
- <Timestamp value={Date.now() / 1000 + 3599} format="relative" />,
57
- );
54
+ rerender(<Timestamp value={Date.now() / 1000 + 3599} format="relative" />);
58
55
  expect(screen.getByText('in 59 minutes')).toBeInTheDocument();
59
56
  });
60
57
 
@@ -342,4 +339,120 @@ describe('Timestamp', () => {
342
339
  warn.mockRestore();
343
340
  }
344
341
  });
342
+
343
+ // --- Tooltip keyboard reachability (WCAG 1.4.13 / 2.1.1) ---
344
+
345
+ describe('tooltip keyboard reachability', () => {
346
+ const originalMatches = HTMLElement.prototype.matches;
347
+ const originalShowPopover = HTMLElement.prototype.showPopover;
348
+ const originalHidePopover = HTMLElement.prototype.hidePopover;
349
+
350
+ beforeEach(() => {
351
+ // The tooltip is lazy-loaded via a dynamic import; real timers let the
352
+ // import promise and RTL's waitFor resolve naturally (the outer
353
+ // beforeEach installs fake timers, which would stall them).
354
+ vi.useRealTimers();
355
+
356
+ // Mock the Popover API, which jsdom does not implement.
357
+ HTMLElement.prototype.showPopover = vi.fn();
358
+ HTMLElement.prototype.hidePopover = vi.fn();
359
+
360
+ // jsdom does not derive :focus-visible from keyboard focus for a <time>
361
+ // element; treat the focused element as focus-visible so the tooltip's
362
+ // keyboard-focus path can be exercised.
363
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
364
+ (HTMLElement.prototype as any).matches = function (
365
+ selector: string,
366
+ ): boolean {
367
+ if (selector === ':focus-visible') {
368
+ return this === document.activeElement;
369
+ }
370
+ return originalMatches.call(this, selector);
371
+ };
372
+ });
373
+
374
+ afterEach(() => {
375
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
376
+ (HTMLElement.prototype as any).matches = originalMatches;
377
+ HTMLElement.prototype.showPopover = originalShowPopover;
378
+ HTMLElement.prototype.hidePopover = originalHidePopover;
379
+ });
380
+
381
+ it('makes the <time> element focusable while the tooltip is attached', () => {
382
+ render(
383
+ <Timestamp
384
+ value={Date.now() / 1000 - 3600}
385
+ format="relative"
386
+ data-testid="ts"
387
+ />,
388
+ );
389
+ expect(screen.getByTestId('ts')).toHaveAttribute('tabindex', '0');
390
+ });
391
+
392
+ it('shows the tooltip when the timestamp receives keyboard focus', async () => {
393
+ const user = userEvent.setup();
394
+ render(
395
+ <Timestamp
396
+ value={Date.now() / 1000 - 3600}
397
+ format="relative"
398
+ data-testid="ts"
399
+ />,
400
+ );
401
+ const el = screen.getByTestId('ts');
402
+
403
+ // Wait for the lazy-loaded tooltip layer to mount and confirm it
404
+ // carries the full absolute time (same string as the aria-label).
405
+ // Compare with normalized whitespace: Intl output can contain narrow
406
+ // no-break spaces that jest-dom's matcher normalization would break on.
407
+ const layer = await screen.findByRole('tooltip', {hidden: true});
408
+ const normalize = (s: string) => s.replace(/\s+/g, ' ');
409
+ expect(normalize(layer.textContent ?? '')).toContain(
410
+ normalize(el.getAttribute('aria-label') ?? '\0'),
411
+ );
412
+
413
+ // Tab onto the timestamp — the only tab stop in the document.
414
+ await user.tab();
415
+ expect(el).toHaveFocus();
416
+ await waitFor(() => {
417
+ expect(HTMLElement.prototype.showPopover).toHaveBeenCalled();
418
+ });
419
+ });
420
+
421
+ it('does not add a tab stop when the tooltip is disabled', () => {
422
+ render(
423
+ <Timestamp
424
+ value={Date.now() / 1000 - 3600}
425
+ format="relative"
426
+ hasTooltip={false}
427
+ data-testid="ts"
428
+ />,
429
+ );
430
+ expect(screen.getByTestId('ts')).not.toHaveAttribute('tabindex');
431
+ });
432
+
433
+ it('does not add a tab stop for absolute formats (no tooltip)', () => {
434
+ render(
435
+ <Timestamp
436
+ value="2026-02-19T17:00:00Z"
437
+ format="date_time"
438
+ data-testid="ts"
439
+ />,
440
+ );
441
+ expect(screen.getByTestId('ts')).not.toHaveAttribute('tabindex');
442
+ });
443
+
444
+ it('keeps the full absolute aria-label while the tooltip is attached', () => {
445
+ render(
446
+ <Timestamp
447
+ value={Date.now() / 1000 - 3600}
448
+ format="relative"
449
+ data-testid="ts"
450
+ />,
451
+ );
452
+ const label = screen.getByTestId('ts').getAttribute('aria-label');
453
+ expect(label).toBeTruthy();
454
+ // The label is the full absolute string, not the relative text.
455
+ expect(label).not.toContain('ago');
456
+ });
457
+ });
345
458
  });
@@ -23,6 +23,7 @@ import type {TextType, TextSize, TextColor, TextWeight} from '../theme/types';
23
23
  import {mergeProps, mergeRefs} from '../utils';
24
24
  import type {BaseProps} from '../BaseProps';
25
25
  import {themeProps} from '../utils/themeProps';
26
+ import {colorVars} from '../theme/tokens.stylex';
26
27
 
27
28
  const LazyXDSTooltip = lazy(async () =>
28
29
  import('../Tooltip/Tooltip').then(mod => ({default: mod.Tooltip})),
@@ -118,6 +119,18 @@ const styles = stylex.create({
118
119
  color: 'inherit',
119
120
  fontWeight: 'inherit',
120
121
  },
122
+ // Visible focus ring for the tooltip tab stop, matching the repo-wide
123
+ // focus-visible outline treatment (see Token, Thumbnail).
124
+ focusable: {
125
+ outline: {
126
+ default: null,
127
+ ':focus-visible': `2px solid ${colorVars['--color-accent']}`,
128
+ },
129
+ outlineOffset: {
130
+ default: '0',
131
+ ':focus-visible': '2px',
132
+ },
133
+ },
121
134
  });
122
135
 
123
136
  // =============================================================================
@@ -431,8 +444,15 @@ export function Timestamp({
431
444
  aria-label={
432
445
  effectiveFormat === 'relative' ? fullAbsoluteText : undefined
433
446
  }
447
+ // The absolute-time tooltip is anchored here with the default 'auto'
448
+ // focus trigger, which only activates on focusable anchors. A bare
449
+ // <time> is not focusable, so without a tab stop sighted keyboard
450
+ // users could never reveal the tooltip (WCAG 1.4.13 / 2.1.1). Only
451
+ // add the tab stop while a tooltip is actually attached — no
452
+ // gratuitous tab stops otherwise.
453
+ tabIndex={showTooltip ? 0 : undefined}
434
454
  data-testid={testId}
435
- {...stylex.props(styles.time)}>
455
+ {...stylex.props(styles.time, showTooltip && styles.focusable)}>
436
456
  {displayText}
437
457
  </time>
438
458
  </Text>
@@ -22,6 +22,7 @@ import {useTheme} from '../theme';
22
22
  import {MediaTheme} from '../theme/MediaTheme';
23
23
  import type {ToastType, ToastDismissReason} from './types';
24
24
  import {themeProps} from '../utils/themeProps';
25
+ import {useTranslator} from '../i18n';
25
26
 
26
27
  const styles = stylex.create({
27
28
  root: {
@@ -115,6 +116,7 @@ export function Toast({
115
116
  isExiting = false,
116
117
  onDismiss,
117
118
  }: ToastProps) {
119
+ const t = useTranslator();
118
120
  const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
119
121
  const isPausedRef = useRef(false);
120
122
  const remainingRef = useRef(autoHideDuration);
@@ -226,7 +228,7 @@ export function Toast({
226
228
  variant="ghost"
227
229
  size="sm"
228
230
  icon={<Icon icon="close" size="sm" color="inherit" />}
229
- label="Dismiss notification"
231
+ label={t('@astryx.toast.dismiss')}
230
232
  onClick={handleDismiss}
231
233
  isIconOnly
232
234
  />
@@ -17,6 +17,7 @@ import {INTERACTIVE_SELECTORS} from '../hooks/useClickableContainer';
17
17
  import {Toast} from './Toast';
18
18
  import {ToastContext, type ToastContextValue} from './ToastContext';
19
19
  import type {ToastEntry, ToastPosition, ToastDismissReason} from './types';
20
+ import {useTranslator} from '../i18n';
20
21
 
21
22
  const styles = stylex.create({
22
23
  viewport: {
@@ -107,6 +108,7 @@ export function ToastViewport({
107
108
  isTopLayer = true,
108
109
  children,
109
110
  }: ToastViewportProps) {
111
+ const t = useTranslator();
110
112
  const [toasts, setToasts] = useState<ToastEntry[]>([]);
111
113
  const [exitingIds, setExitingIds] = useState<Set<string>>(new Set());
112
114
  const toastsRef = useRef(toasts);
@@ -363,7 +365,7 @@ export function ToastViewport({
363
365
  <div
364
366
  ref={viewportRef}
365
367
  role="region"
366
- aria-label="Notifications"
368
+ aria-label={t('@astryx.toast.viewport')}
367
369
  tabIndex={-1}
368
370
  // popover="manual" promotes to the top layer (above dialogs).
369
371
  // Omitted inside dialogs where the viewport is already in a top layer.
@@ -34,6 +34,7 @@ import {useLinkComponent} from '../Link/useLinkComponent';
34
34
  import {useInteractiveRole} from '../hooks/useInteractiveRole';
35
35
  import type {BaseProps} from '../BaseProps';
36
36
  import {themeProps} from '../utils/themeProps';
37
+ import {useTranslator} from '../i18n';
37
38
 
38
39
  // =============================================================================
39
40
  // Types
@@ -324,6 +325,7 @@ export function Token({
324
325
  'data-testid': testId,
325
326
  ref,
326
327
  }: TokenProps) {
328
+ const t = useTranslator();
327
329
  const LinkComponent = useLinkComponent();
328
330
  const role = useInteractiveRole({href, onClick, isDisabled});
329
331
 
@@ -342,7 +344,7 @@ export function Token({
342
344
  {onRemove != null && (
343
345
  <button
344
346
  type="button"
345
- aria-label={`Remove ${label}`}
347
+ aria-label={t('@astryx.token.remove', {label})}
346
348
  onClick={e => {
347
349
  e.stopPropagation();
348
350
  onRemove(e);
@@ -432,7 +434,7 @@ export function Token({
432
434
  {onRemove != null && (
433
435
  <button
434
436
  type="button"
435
- aria-label={`Remove ${label}`}
437
+ aria-label={t('@astryx.token.remove', {label})}
436
438
  onClick={e => {
437
439
  e.stopPropagation();
438
440
  onRemove(e);
@@ -84,7 +84,7 @@ export const docs = {
84
84
  },
85
85
  {
86
86
  name: 'status',
87
- type: 'InputStatus',
87
+ type: "{type: 'warning' | 'error' | 'success', message?: string}",
88
88
  description:
89
89
  'Validation status object with type and message for error/warning/success states.',
90
90
  },
@@ -296,7 +296,7 @@ export const docsZh = {
296
296
  },
297
297
  {
298
298
  name: 'status',
299
- type: 'InputStatus',
299
+ type: "{type: 'warning' | 'error' | 'success', message?: string}",
300
300
  description:
301
301
  '\u9a8c\u8bc1\u72b6\u6001\u5bf9\u8c61\uff0c\u5305\u542b\u7c7b\u578b\u548c\u6d88\u606f\uff0c\u7528\u4e8e\u9519\u8bef/\u8b66\u544a/\u6210\u529f\u72b6\u6001\u3002',
302
302
  },
@@ -52,6 +52,7 @@ import {
52
52
  import type {SearchableItem, SearchSource} from '../Typeahead/types';
53
53
  import {mergeProps} from '../utils';
54
54
  import {themeProps} from '../utils/themeProps';
55
+ import {useTranslator} from '../i18n';
55
56
 
56
57
  // Re-export status types for convenience
57
58
  export type {
@@ -81,9 +82,7 @@ export type TokenizerSize = 'sm' | 'md' | 'lg';
81
82
  * - `'unfocusedLayer'`: Shows a single line with "+ N more" when unfocused, expands as an overlay on focus.
82
83
  */
83
84
  export type TokenizerOverflowBehavior =
84
- | 'none'
85
- | 'unfocusedInline'
86
- | 'unfocusedLayer';
85
+ 'none' | 'unfocusedInline' | 'unfocusedLayer';
87
86
 
88
87
  /**
89
88
  * Imperative handle for Tokenizer handleRef.
@@ -403,6 +402,7 @@ export function Tokenizer<T extends SearchableItem>({
403
402
  ref,
404
403
  handleRef,
405
404
  }: TokenizerProps<T>) {
405
+ const t = useTranslator();
406
406
  const size = useSize(sizeProp, 'md');
407
407
  const inputId = useId();
408
408
  const descriptionId = useId();
@@ -786,7 +786,7 @@ export function Tokenizer<T extends SearchableItem>({
786
786
  {endContent}
787
787
  {hasClear && value.length > 0 && !isDisabled && (
788
788
  <InputClearButton
789
- label="Clear all"
789
+ label={t('@astryx.tokenizer.clearAll')}
790
790
  onClick={e => {
791
791
  e.stopPropagation();
792
792
  handleClearAll();
@@ -116,7 +116,7 @@ export const docs = {
116
116
  },
117
117
  {
118
118
  name: 'gap',
119
- type: 'SpacingStep',
119
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
120
120
  description: 'Gap between items within each slot.',
121
121
  default: '1',
122
122
  },
@@ -239,6 +239,7 @@ export function Toolbar({
239
239
  const hasCenterContent = centerContent != null;
240
240
  const hasStartContent = startContent != null;
241
241
  const hasEndContent = endContent != null;
242
+ const hasBottomDivider = dividers?.includes('bottom') ?? false;
242
243
 
243
244
  const gapVar = spacingVars[spacingStepToVar[gap]] as string;
244
245
 
@@ -316,9 +317,15 @@ export function Toolbar({
316
317
  orientation === 'vertical' && styles.vertical,
317
318
  sizeStyles.base,
318
319
  dynamicStyles.gap(gapVar),
319
- dynamicStyles.tabIndicatorBottom(
320
- `calc(-1 * (${blockPaddingVarForSize[size]}${dividers?.includes('bottom') ? ' + 1px' : ''}))`,
321
- ),
320
+ // Only drop the tab indicator through the toolbar's block padding
321
+ // onto the rail when a bottom divider is actually present.
322
+ // Without a divider, leave `--_tab-indicator-bottom` unset so a
323
+ // nested TabList's indicator keeps its own default (hugging the
324
+ // tab) instead of floating down into the toolbar's padding.
325
+ hasBottomDivider &&
326
+ dynamicStyles.tabIndicatorBottom(
327
+ `calc(-1 * (${blockPaddingVarForSize[size]} + 1px))`,
328
+ ),
322
329
  ),
323
330
  )}
324
331
  {...props}>
@@ -109,6 +109,7 @@ export const docs = {
109
109
  name: 'label',
110
110
  type: 'string',
111
111
  description: 'Accessible label for the navigation landmark, applied as aria-label on the <nav> element.',
112
+ default: "'Top navigation'",
112
113
  },
113
114
  {
114
115
  name: 'xstyle',
@@ -13,6 +13,7 @@ import {describe, it, expect, vi} from 'vitest';
13
13
  import {render, screen} from '@testing-library/react';
14
14
  import userEvent from '@testing-library/user-event';
15
15
  import {TopNav} from './TopNav';
16
+ import {TopNavRenderContext} from './TopNavRenderContext';
16
17
  import {TopNavHeading} from './TopNavHeading';
17
18
  import {NavIcon} from '../NavIcon';
18
19
  import {TopNavItem} from './TopNavItem';
@@ -45,6 +46,35 @@ describe('TopNav', () => {
45
46
  );
46
47
  });
47
48
 
49
+ it('defaults the landmark label to "Top navigation" when label is omitted', () => {
50
+ render(<TopNav />);
51
+ expect(
52
+ screen.getByRole('navigation', {name: 'Top navigation'}),
53
+ ).toBeInTheDocument();
54
+ });
55
+
56
+ it('defaults the landmark label in mobile-bar mode', () => {
57
+ render(
58
+ <TopNavRenderContext value="mobile-bar">
59
+ <TopNav heading={<span>Logo</span>} />
60
+ </TopNavRenderContext>,
61
+ );
62
+ expect(
63
+ screen.getByRole('navigation', {name: 'Top navigation'}),
64
+ ).toBeInTheDocument();
65
+ });
66
+
67
+ it('custom label overrides the default in mobile-bar mode', () => {
68
+ render(
69
+ <TopNavRenderContext value="mobile-bar">
70
+ <TopNav label="Utility navigation" />
71
+ </TopNavRenderContext>,
72
+ );
73
+ expect(
74
+ screen.getByRole('navigation', {name: 'Utility navigation'}),
75
+ ).toBeInTheDocument();
76
+ });
77
+
48
78
  it('renders heading slot content', () => {
49
79
  render(<TopNav heading={<span data-testid="title-content">Logo</span>} />);
50
80
  expect(screen.getByTestId('title-content')).toBeInTheDocument();
@@ -21,6 +21,7 @@ import type {BaseProps} from '../BaseProps';
21
21
  import * as stylex from '@stylexjs/stylex';
22
22
  import {spacingVars} from '../theme/tokens.stylex';
23
23
  import {mergeProps} from '../utils';
24
+ import {useTranslator} from '../i18n';
24
25
  import {TopNavSlotContext} from './TopNavContext';
25
26
  import {useTopNavRenderMode} from './TopNavRenderContext';
26
27
  import {useTopNavMobileContent} from './TopNavMobileContentContext';
@@ -147,6 +148,7 @@ export interface TopNavProps extends BaseProps<HTMLElement> {
147
148
  /**
148
149
  * Accessible label for the navigation landmark.
149
150
  * Helps screen readers identify the navigation area.
151
+ * @default 'Top navigation'
150
152
  */
151
153
  label?: string;
152
154
  }
@@ -176,13 +178,15 @@ export function TopNav({
176
178
  children,
177
179
  centerContent,
178
180
  endContent,
179
- label,
181
+ label: labelFromProps,
180
182
  xstyle,
181
183
  className,
182
184
  style,
183
185
  ref,
184
186
  ...props
185
187
  }: TopNavProps) {
188
+ const t = useTranslator();
189
+ const label = labelFromProps ?? t('@astryx.topNav.landmarkLabel');
186
190
  const renderMode = useTopNavRenderMode();
187
191
  const mobileContent = useTopNavMobileContent();
188
192
  const {hasAutoToggle} = useAppShellMobile();
@@ -294,9 +298,7 @@ export function TopNav({
294
298
  ) : (
295
299
  endContent && (
296
300
  <div {...stylex.props(styles.endContent)}>
297
- <TopNavSlotContext value="end">
298
- {endContent}
299
- </TopNavSlotContext>
301
+ <TopNavSlotContext value="end">{endContent}</TopNavSlotContext>
300
302
  </div>
301
303
  )
302
304
  )}