@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
@@ -12,7 +12,12 @@ import {describe, it, expect, vi, beforeEach} from 'vitest';
12
12
  import {render, screen, fireEvent, act} from '@testing-library/react';
13
13
  import userEvent from '@testing-library/user-event';
14
14
  import {ContextMenu} from './ContextMenu';
15
- import {ContextMenuItem} from './index';
15
+ import {
16
+ ContextMenuItem,
17
+ ContextMenuCheckboxItem,
18
+ ContextMenuRadioGroup,
19
+ ContextMenuRadioItem,
20
+ } from './index';
16
21
  import {DropdownMenuItem} from '../DropdownMenu/DropdownMenuItem';
17
22
  import {Divider} from '../Divider';
18
23
 
@@ -537,3 +542,72 @@ describe('ContextMenu compound mode', () => {
537
542
  });
538
543
  });
539
544
  });
545
+
546
+ describe('ContextMenu selectable items', () => {
547
+ it('renders checkbox and radio items with correct roles and state', () => {
548
+ render(
549
+ <ContextMenu
550
+ menuContent={
551
+ <>
552
+ <ContextMenuRadioGroup
553
+ value="name"
554
+ onChange={() => {}}
555
+ aria-label="Sort by">
556
+ <ContextMenuRadioItem value="name" label="Sort by name" />
557
+ <ContextMenuRadioItem value="date" label="Sort by date" />
558
+ </ContextMenuRadioGroup>
559
+ <ContextMenuCheckboxItem label="Show hidden" value={true} />
560
+ </>
561
+ }>
562
+ <div>Right-click me</div>
563
+ </ContextMenu>,
564
+ );
565
+ expect(
566
+ screen.getByRole('menuitemradio', {name: 'Sort by name', hidden: true}),
567
+ ).toHaveAttribute('aria-checked', 'true');
568
+ expect(
569
+ screen.getByRole('menuitemradio', {name: 'Sort by date', hidden: true}),
570
+ ).toHaveAttribute('aria-checked', 'false');
571
+ expect(
572
+ screen.getByRole('menuitemcheckbox', {name: 'Show hidden', hidden: true}),
573
+ ).toHaveAttribute('aria-checked', 'true');
574
+ expect(
575
+ screen.getByRole('group', {name: 'Sort by', hidden: true}),
576
+ ).toBeInTheDocument();
577
+ });
578
+
579
+ it('fires onChange for radio and checkbox items', async () => {
580
+ const user = userEvent.setup();
581
+ const onSort = vi.fn();
582
+ const onToggle = vi.fn();
583
+ render(
584
+ <ContextMenu
585
+ menuContent={
586
+ <>
587
+ <ContextMenuRadioGroup
588
+ value="name"
589
+ onChange={onSort}
590
+ aria-label="Sort by">
591
+ <ContextMenuRadioItem value="name" label="Sort by name" />
592
+ <ContextMenuRadioItem value="date" label="Sort by date" />
593
+ </ContextMenuRadioGroup>
594
+ <ContextMenuCheckboxItem
595
+ label="Show hidden"
596
+ value={false}
597
+ onChange={onToggle}
598
+ />
599
+ </>
600
+ }>
601
+ <div>Right-click me</div>
602
+ </ContextMenu>,
603
+ );
604
+ await user.click(
605
+ screen.getByRole('menuitemradio', {name: 'Sort by date', hidden: true}),
606
+ );
607
+ expect(onSort).toHaveBeenCalledWith('date');
608
+ await user.click(
609
+ screen.getByRole('menuitemcheckbox', {name: 'Show hidden', hidden: true}),
610
+ );
611
+ expect(onToggle).toHaveBeenCalledWith(true);
612
+ });
613
+ });
@@ -46,6 +46,10 @@ import {
46
46
  DropdownMenuContext,
47
47
  type DropdownMenuContextValue,
48
48
  } from '../DropdownMenu/DropdownMenuContext';
49
+ import {
50
+ MENU_ITEM_ROLES,
51
+ MENU_ITEM_SELECTOR,
52
+ } from '../DropdownMenu/menuItemRoles';
49
53
  import {useListFocus} from '../hooks/useListFocus';
50
54
  import {useTypeahead} from '../hooks/useTypeahead';
51
55
  import {useLongPress} from '../hooks/useLongPress';
@@ -62,6 +66,7 @@ import {mergeProps, mergeRefs} from '../utils';
62
66
  import type {BaseProps} from '../BaseProps';
63
67
  import type {StyleXStyles} from '../theme/types';
64
68
  import {themeProps} from '../utils/themeProps';
69
+ import {useTranslator} from '../i18n';
65
70
  import type {
66
71
  DropdownMenuOption,
67
72
  DropdownMenuItemData,
@@ -205,7 +210,7 @@ export function ContextMenu({
205
210
  children,
206
211
  menuWidth,
207
212
  size = 'md',
208
- label = 'Context menu',
213
+ label: labelFromProps,
209
214
  isDisabled = false,
210
215
  onOpenChange,
211
216
  ref,
@@ -216,6 +221,8 @@ export function ContextMenu({
216
221
  'data-testid': testId,
217
222
  ...props
218
223
  }: ContextMenuProps) {
224
+ const t = useTranslator();
225
+ const label = labelFromProps ?? t('@astryx.contextMenu.label');
219
226
  const items = ('items' in props ? props.items : undefined) ?? [];
220
227
  const menuContent = 'menuContent' in props ? props.menuContent : undefined;
221
228
 
@@ -262,7 +269,7 @@ export function ContextMenu({
262
269
  focusFirst,
263
270
  focusItem,
264
271
  } = useListFocus<HTMLDivElement>({
265
- itemSelector: '[role="menuitem"]:not([aria-disabled="true"])',
272
+ itemSelector: MENU_ITEM_SELECTOR,
266
273
  wrap: false,
267
274
  onEscape: closeMenu,
268
275
  });
@@ -272,9 +279,7 @@ export function ContextMenu({
272
279
  (): HTMLElement[] =>
273
280
  listRef.current
274
281
  ? Array.from(
275
- listRef.current.querySelectorAll<HTMLElement>(
276
- '[role="menuitem"]:not([aria-disabled="true"])',
277
- ),
282
+ listRef.current.querySelectorAll<HTMLElement>(MENU_ITEM_SELECTOR),
278
283
  )
279
284
  : [],
280
285
  [listRef],
@@ -338,7 +343,10 @@ export function ContextMenu({
338
343
  if (e.key === 'Enter' || e.key === ' ') {
339
344
  e.preventDefault();
340
345
  const focused = document.activeElement as HTMLElement | null;
341
- if (focused?.getAttribute('role') === 'menuitem') {
346
+ if (
347
+ focused &&
348
+ MENU_ITEM_ROLES.has(focused.getAttribute('role') ?? '')
349
+ ) {
342
350
  focused.click();
343
351
  }
344
352
  return;
@@ -20,3 +20,18 @@ export {
20
20
  DropdownMenuItem as ContextMenuItem,
21
21
  type DropdownMenuItemProps as ContextMenuItemProps,
22
22
  } from '../DropdownMenu/DropdownMenuItem';
23
+
24
+ // Selectable items work inside a ContextMenu too — re-exported under the
25
+ // ContextMenu name for a coherent API.
26
+ export {
27
+ DropdownMenuCheckboxItem as ContextMenuCheckboxItem,
28
+ type DropdownMenuCheckboxItemProps as ContextMenuCheckboxItemProps,
29
+ } from '../DropdownMenu/DropdownMenuCheckboxItem';
30
+ export {
31
+ DropdownMenuRadioGroup as ContextMenuRadioGroup,
32
+ type DropdownMenuRadioGroupProps as ContextMenuRadioGroupProps,
33
+ } from '../DropdownMenu/DropdownMenuRadioGroup';
34
+ export {
35
+ DropdownMenuRadioItem as ContextMenuRadioItem,
36
+ type DropdownMenuRadioItemProps as ContextMenuRadioItemProps,
37
+ } from '../DropdownMenu/DropdownMenuRadioItem';
@@ -111,7 +111,7 @@ export const docs = {
111
111
  },
112
112
  {
113
113
  name: 'status',
114
- type: 'InputStatus',
114
+ type: "{type: 'warning' | 'error' | 'success', message?: string}",
115
115
  description:
116
116
  'Status indicator object for error, warning, or success states with a message.',
117
117
  },
@@ -374,7 +374,7 @@ export const docsZh = {
374
374
  },
375
375
  {
376
376
  name: 'status',
377
- type: 'InputStatus',
377
+ type: "{type: 'warning' | 'error' | 'success', message?: string}",
378
378
  description: '错误、警告或成功状态的状态指示对象,附带消息。',
379
379
  },
380
380
  {
@@ -10,7 +10,13 @@
10
10
  */
11
11
 
12
12
  import {describe, it, expect, vi, beforeEach} from 'vitest';
13
- import {render, screen, fireEvent, waitFor} from '@testing-library/react';
13
+ import {
14
+ render,
15
+ screen,
16
+ fireEvent,
17
+ waitFor,
18
+ within,
19
+ } from '@testing-library/react';
14
20
  import userEvent from '@testing-library/user-event';
15
21
  import {getButton, queryButton} from '../__tests__/fastRoleQueries';
16
22
  import {DateInput} from './DateInput';
@@ -133,21 +139,27 @@ describe('DateInput', () => {
133
139
  });
134
140
 
135
141
  it('announces an alert message when typed input is invalid', () => {
136
- render(<DateInput label="Date" onChange={() => {}} />);
142
+ // Scope to the component's own container: the embedded Calendar uses the
143
+ // shared `useAnnounce` hook, whose global polite/assertive live-region pair
144
+ // (both mounted on document.body by any announce) would otherwise make a
145
+ // document-wide `getByRole('alert')` ambiguous.
146
+ const {container} = render(<DateInput label="Date" onChange={() => {}} />);
137
147
 
138
148
  const input = screen.getByRole('combobox');
139
149
  fireEvent.change(input, {target: {value: '13/45/2024'}});
140
150
 
141
- expect(screen.getByRole('alert')).toHaveTextContent('Invalid date');
151
+ expect(within(container).getByRole('alert')).toHaveTextContent(
152
+ 'Invalid date',
153
+ );
142
154
  });
143
155
 
144
156
  it('does not announce an alert message when input is valid', () => {
145
- render(<DateInput label="Date" onChange={() => {}} />);
157
+ const {container} = render(<DateInput label="Date" onChange={() => {}} />);
146
158
 
147
159
  const input = screen.getByRole('combobox');
148
160
  fireEvent.change(input, {target: {value: '03/15/2026'}});
149
161
 
150
- expect(screen.getByRole('alert')).toHaveTextContent('');
162
+ expect(within(container).getByRole('alert')).toHaveTextContent('');
151
163
  expect(screen.queryByText('Invalid date')).not.toBeInTheDocument();
152
164
  });
153
165
 
@@ -137,6 +137,7 @@ import {mergeProps, mergeRefs} from '../utils';
137
137
  import type {BaseProps} from '../BaseProps';
138
138
  import type {SizeValue} from '../utils/types';
139
139
  import {themeProps} from '../utils/themeProps';
140
+ import {useTranslator} from '../i18n';
140
141
 
141
142
  export interface DateInputProps extends Omit<
142
143
  BaseProps,
@@ -311,7 +312,7 @@ export function DateInput({
311
312
  min,
312
313
  max,
313
314
  dateConstraints,
314
- placeholder = 'Select a date',
315
+ placeholder: placeholderFromProps,
315
316
  size: sizeProp,
316
317
  status,
317
318
  labelTooltip,
@@ -324,6 +325,9 @@ export function DateInput({
324
325
  ref,
325
326
  ...rest
326
327
  }: DateInputProps) {
328
+ const t = useTranslator();
329
+ const placeholder =
330
+ placeholderFromProps ?? t('@astryx.dateInput.placeholder');
327
331
  const size = useSize(sizeProp, 'md');
328
332
  const id = useId();
329
333
  const inputLabelID = useId();
@@ -415,8 +419,8 @@ export function DateInput({
415
419
  : parseDateInput(pendingInput) !== null;
416
420
 
417
421
  const popover = usePopover({
418
- dialogLabel: 'Choose date',
419
- closeButtonLabel: 'Close calendar',
422
+ dialogLabel: t('@astryx.dateInput.dialogLabel'),
423
+ closeButtonLabel: t('@astryx.dateInput.closeCalendar'),
420
424
  onHide: () => inputRef.current?.focus(),
421
425
  });
422
426
 
@@ -582,7 +586,11 @@ export function DateInput({
582
586
  type="button"
583
587
  onClick={handleToggle}
584
588
  disabled={isEffectivelyDisabled}
585
- aria-label={popover.isOpen ? 'Close calendar' : 'Open calendar'}
589
+ aria-label={
590
+ popover.isOpen
591
+ ? t('@astryx.dateInput.toggleCalendarClose')
592
+ : t('@astryx.dateInput.openCalendar')
593
+ }
586
594
  {...stylex.props(
587
595
  styles.iconButton,
588
596
  isEffectivelyDisabled && styles.iconButtonDisabled,
@@ -637,7 +645,7 @@ export function DateInput({
637
645
  <button
638
646
  type="button"
639
647
  onClick={handleClear}
640
- aria-label={`Clear ${label}`}
648
+ aria-label={t('@astryx.dateInput.clear', {label})}
641
649
  {...stylex.props(styles.iconButton)}>
642
650
  <Icon icon="close" size="sm" color="secondary" />
643
651
  </button>
@@ -124,7 +124,7 @@ export const docs = {
124
124
  },
125
125
  {
126
126
  name: 'status',
127
- type: 'InputStatus',
127
+ type: "{type: 'warning' | 'error' | 'success', message?: string}",
128
128
  description: 'Status indicator for error, warning, or success states.',
129
129
  },
130
130
  {
@@ -54,6 +54,7 @@ import type {BaseProps} from '../BaseProps';
54
54
  import type {SizeValue} from '../utils/types';
55
55
  import {useSize} from '../SizeContext/SizeContext';
56
56
  import {themeProps} from '../utils/themeProps';
57
+ import {useTranslator} from '../i18n';
57
58
 
58
59
  export type {DateRange} from '../Calendar';
59
60
 
@@ -381,7 +382,7 @@ export function DateRangeInput({
381
382
  dateConstraints,
382
383
  presets,
383
384
  hasClear = true,
384
- placeholder = 'Select date range',
385
+ placeholder: placeholderFromProps,
385
386
  size: sizeProp,
386
387
  status,
387
388
  labelTooltip,
@@ -393,6 +394,9 @@ export function DateRangeInput({
393
394
  ref,
394
395
  ...rest
395
396
  }: DateRangeInputProps) {
397
+ const t = useTranslator();
398
+ const placeholder =
399
+ placeholderFromProps ?? t('@astryx.dateRangeInput.placeholder');
396
400
  const size = useSize(sizeProp, 'md');
397
401
  const id = useId();
398
402
  const descriptionID = useId();
@@ -448,8 +452,8 @@ export function DateRangeInput({
448
452
  );
449
453
 
450
454
  const popover = usePopover({
451
- dialogLabel: 'Choose date range',
452
- closeButtonLabel: 'Close calendar',
455
+ dialogLabel: t('@astryx.dateRangeInput.dialogLabel'),
456
+ closeButtonLabel: t('@astryx.dateInput.closeCalendar'),
453
457
  });
454
458
 
455
459
  const fireChange = useCallback(
@@ -557,7 +561,11 @@ export function DateRangeInput({
557
561
  type="button"
558
562
  onClick={handleToggle}
559
563
  disabled={isEffectivelyDisabled}
560
- aria-label={popover.isOpen ? 'Close calendar' : 'Open calendar'}
564
+ aria-label={
565
+ popover.isOpen
566
+ ? t('@astryx.dateInput.toggleCalendarClose')
567
+ : t('@astryx.dateInput.openCalendar')
568
+ }
561
569
  tabIndex={-1}
562
570
  {...stylex.props(
563
571
  styles.iconButton,
@@ -594,7 +602,7 @@ export function DateRangeInput({
594
602
  <button
595
603
  type="button"
596
604
  onClick={handleClear}
597
- aria-label={`Clear ${label}`}
605
+ aria-label={t('@astryx.dateInput.clear', {label})}
598
606
  {...stylex.props(styles.iconButton)}>
599
607
  <Icon icon="close" size="sm" color="secondary" />
600
608
  </button>
@@ -613,7 +621,7 @@ export function DateRangeInput({
613
621
  {presets && presets.length > 0 && (
614
622
  <div
615
623
  role="group"
616
- aria-label="Preset date ranges"
624
+ aria-label={t('@astryx.dateRangeInput.presetDateRanges')}
617
625
  {...stylex.props(styles.presetSidebar)}>
618
626
  {presets.map(preset => {
619
627
  const presetRange = preset.getRange();
@@ -157,7 +157,7 @@ export const docs = {
157
157
  },
158
158
  {
159
159
  name: 'status',
160
- type: 'InputStatus',
160
+ type: "{type: 'warning' | 'error' | 'success', message?: string}",
161
161
  description:
162
162
  'Status indicator object for error, warning, or success states with a message.',
163
163
  },
@@ -449,7 +449,7 @@ export const docsZh = {
449
449
  },
450
450
  {
451
451
  name: 'status',
452
- type: 'InputStatus',
452
+ type: "{type: 'warning' | 'error' | 'success', message?: string}",
453
453
  description: '错误、警告或成功状态的状态指示对象,附带消息。',
454
454
  },
455
455
  {
@@ -77,6 +77,7 @@ import type {BaseProps} from '../BaseProps';
77
77
  import type {SizeValue} from '../utils/types';
78
78
  import {useSize} from '../SizeContext/SizeContext';
79
79
  import {themeProps} from '../utils/themeProps';
80
+ import {useTranslator} from '../i18n';
80
81
 
81
82
  export type ISODateTimeString = string & {
82
83
  readonly __brand: 'ISODateTimeString';
@@ -418,8 +419,8 @@ export function DateTimeInput({
418
419
  hourFormat = '12h',
419
420
  timeIncrement = 1,
420
421
  hasClear = false,
421
- placeholder = 'Select a date',
422
- timePlaceholder = 'Select a time',
422
+ placeholder: placeholderFromProps,
423
+ timePlaceholder: timePlaceholderFromProps,
423
424
  timeLabel,
424
425
  size: sizeProp,
425
426
  status,
@@ -432,6 +433,11 @@ export function DateTimeInput({
432
433
  ref,
433
434
  ...rest
434
435
  }: DateTimeInputProps) {
436
+ const t = useTranslator();
437
+ const placeholder =
438
+ placeholderFromProps ?? t('@astryx.dateTimeInput.placeholder');
439
+ const timePlaceholder =
440
+ timePlaceholderFromProps ?? t('@astryx.dateTimeInput.timePlaceholder');
435
441
  const size = useSize(sizeProp, 'md');
436
442
  const dateInputId = useId();
437
443
  const timeInputId = useId();
@@ -599,8 +605,8 @@ export function DateTimeInput({
599
605
 
600
606
  // --- Popover ---
601
607
  const popover = usePopover({
602
- dialogLabel: 'Choose date',
603
- closeButtonLabel: 'Close calendar',
608
+ dialogLabel: t('@astryx.dateTimeInput.dialogLabel'),
609
+ closeButtonLabel: t('@astryx.dateInput.closeCalendar'),
604
610
  onHide: () => dateInputRef.current?.focus(),
605
611
  });
606
612
 
@@ -887,7 +893,11 @@ export function DateTimeInput({
887
893
  type="button"
888
894
  onClick={handleCalendarToggle}
889
895
  disabled={isEffectivelyDisabled}
890
- aria-label={popover.isOpen ? 'Close calendar' : 'Open calendar'}
896
+ aria-label={
897
+ popover.isOpen
898
+ ? t('@astryx.dateInput.toggleCalendarClose')
899
+ : t('@astryx.dateInput.openCalendar')
900
+ }
891
901
  {...stylex.props(
892
902
  styles.iconButton,
893
903
  isEffectivelyDisabled && styles.iconButtonDisabled,
@@ -942,7 +952,7 @@ export function DateTimeInput({
942
952
  <button
943
953
  type="button"
944
954
  onClick={handleClear}
945
- aria-label={`Clear ${label}`}
955
+ aria-label={t('@astryx.dateInput.clear', {label})}
946
956
  {...stylex.props(styles.iconButton)}>
947
957
  <Icon icon="close" size="sm" color="secondary" />
948
958
  </button>
@@ -990,7 +1000,7 @@ export function DateTimeInput({
990
1000
  disabled={isEffectivelyDisabled && !showsDisabledMessage}
991
1001
  aria-disabled={showsDisabledMessage ? 'true' : undefined}
992
1002
  readOnly={showsDisabledMessage || undefined}
993
- aria-label={timeLabel ?? `${label} time`}
1003
+ aria-label={timeLabel ?? t('@astryx.dateTimeInput.timeSuffix', {label})}
994
1004
  aria-describedby={ariaDescribedBy}
995
1005
  aria-required={isRequired === true ? 'true' : undefined}
996
1006
  aria-invalid={
@@ -508,6 +508,10 @@ export function Dialog({
508
508
  </div>
509
509
  );
510
510
 
511
+ // Filter out native open to prevent InvalidStateError when accidentally passed
512
+ const hasPosition = position != null && !isFullscreen;
513
+ const {open: _open, ...safeProps} = props as Record<string, unknown>;
514
+
511
515
  // --- Inline rendering path (for documentation previews) ---
512
516
  if (isInline) {
513
517
  if (!isOpen) {
@@ -516,6 +520,7 @@ export function Dialog({
516
520
 
517
521
  return (
518
522
  <div
523
+ {...safeProps}
519
524
  {...mergeProps(
520
525
  themeProps('dialog', {variant}),
521
526
  stylex.props(
@@ -526,30 +531,18 @@ export function Dialog({
526
531
  ),
527
532
  className,
528
533
  style,
529
- )}
530
- data-testid={
531
- (props as Record<string, unknown>)['data-testid'] as
532
- | string
533
- | undefined
534
- }>
534
+ )}>
535
535
  {innerContent}
536
536
  </div>
537
537
  );
538
538
  }
539
539
 
540
540
  // --- Standard modal rendering path ---
541
- const hasPosition = position != null && !isFullscreen;
542
-
543
- // Filter out native open to prevent InvalidStateError when accidentally passed
544
- const {open: _open, ...safeProps} = props as Record<string, unknown>;
545
541
 
546
542
  return (
547
543
  <dialog
548
544
  ref={mergeRefs(ref, dialogRef)}
549
- onClick={handleClick}
550
- onCancel={handleCancel}
551
- aria-modal="true"
552
- role={purpose === 'required' ? 'alertdialog' : undefined}
545
+ {...safeProps}
553
546
  {...mergeProps(
554
547
  themeProps('dialog', {variant}),
555
548
  stylex.props(
@@ -570,7 +563,10 @@ export function Dialog({
570
563
  className,
571
564
  style,
572
565
  )}
573
- {...safeProps}>
566
+ onClick={handleClick}
567
+ onCancel={handleCancel}
568
+ aria-modal="true"
569
+ {...(purpose === 'required' ? {role: 'alertdialog'} : undefined)}>
574
570
  {innerContent}
575
571
  </dialog>
576
572
  );
@@ -26,6 +26,7 @@ import {Heading} from '../Heading/Heading';
26
26
  import {Text} from '../Text/Text';
27
27
  import type {BaseProps} from '../BaseProps';
28
28
  import {useDialogContext} from './DialogContext';
29
+ import {useTranslator} from '../i18n';
29
30
 
30
31
  const styles = stylex.create({
31
32
  container: {
@@ -130,7 +131,9 @@ export function DialogHeader({
130
131
  className,
131
132
  style,
132
133
  ref,
134
+ ...rest
133
135
  }: DialogHeaderProps) {
136
+ const t = useTranslator();
134
137
  const titleRef = useRef<HTMLHeadingElement>(null);
135
138
  const dialogContext = useDialogContext();
136
139
  const shouldAutoFocus = dialogContext?.isInline !== true;
@@ -150,7 +153,8 @@ export function DialogHeader({
150
153
  hasDivider={hasDivider}
151
154
  xstyle={xstyle}
152
155
  className={className}
153
- style={style}>
156
+ style={style}
157
+ {...rest}>
154
158
  <div {...stylex.props(styles.container)}>
155
159
  {startContent && (
156
160
  <div {...stylex.props(styles.actions)}>{startContent}</div>
@@ -179,8 +183,8 @@ export function DialogHeader({
179
183
  {onOpenChange && (
180
184
  <Button
181
185
  variant="ghost"
182
- label="Close"
183
- tooltip="Close"
186
+ label={t('@astryx.dialog.close')}
187
+ tooltip={t('@astryx.dialog.close')}
184
188
  icon={<Icon icon="close" color="inherit" />}
185
189
  onClick={() => {
186
190
  onOpenChange?.(false);
@@ -8,10 +8,33 @@ export const docs = {
8
8
  group: 'DropdownMenu',
9
9
  category: 'Action',
10
10
  keywords: ["dropdown","menu","popover","select","actions","contextmenu","overflow","kebab","menubutton"],
11
+ playground: {
12
+ // `items` is required; without seeded entries the properties-tab preview
13
+ // renders an empty trigger button. Provide a few actions so the preview
14
+ // is meaningful.
15
+ defaults: {
16
+ button: {label: 'Actions'},
17
+ items: [
18
+ {label: 'Edit'},
19
+ {label: 'Duplicate'},
20
+ {label: 'Delete'},
21
+ ],
22
+ },
23
+ },
11
24
  theming: {
12
25
  targets: [
13
26
  {className: 'astryx-dropdown-menu'},
14
27
  {className: 'astryx-dropdown-menu-item', visualProps: ['size']},
28
+ {
29
+ className: 'astryx-dropdown-menu-checkbox',
30
+ visualProps: ['size'],
31
+ states: ['checked', 'disabled'],
32
+ },
33
+ {
34
+ className: 'astryx-dropdown-menu-radio',
35
+ visualProps: ['size'],
36
+ states: ['checked', 'disabled'],
37
+ },
15
38
  ],
16
39
  vars: [
17
40
  {name: '--_dropdown-menu-radius', description: 'Border radius of the menu popup', default: 'var(--radius-element)', private: true},