@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
@@ -256,13 +256,7 @@ export type DateTimeRangePart =
256
256
  readonly type: 'RELATIVE';
257
257
  readonly backValue: number;
258
258
  readonly unit:
259
- | 'second'
260
- | 'minute'
261
- | 'hour'
262
- | 'day'
263
- | 'week'
264
- | 'month'
265
- | 'year';
259
+ 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year';
266
260
  readonly anchorKey?: string;
267
261
  };
268
262
 
@@ -285,12 +279,42 @@ export interface RelativeDateFilterPreset {
285
279
  // Config Types
286
280
  // =============================================================================
287
281
 
288
- export interface PowerSearchOperator {
282
+ export interface PowerSearchOperatorBase {
289
283
  readonly key: string;
290
- readonly label: string;
291
284
  readonly value: OperatorValue;
292
285
  }
293
286
 
287
+ /**
288
+ * Operator variant that provides its label as raw text. The consumer owns
289
+ * translation of that string. Use this for genuinely custom operator labels
290
+ * that don't correspond to an entry in astryx's shipped translation catalog
291
+ * (e.g. `label: 'in my rotations'`).
292
+ */
293
+ export interface PowerSearchOperatorWithLabel extends PowerSearchOperatorBase {
294
+ readonly label: string;
295
+ readonly i18nKey?: never;
296
+ }
297
+
298
+ /**
299
+ * Operator variant that references a translation-catalog key. The library
300
+ * looks the key up against the active InternationalizationProvider locale.
301
+ * Use `@astryx.powersearch.operator.*` for astryx's shipped defaults, or a
302
+ * key from your own catalog registered via InternationalizationProvider
303
+ * `messages` / `overrides` props.
304
+ */
305
+ export interface PowerSearchOperatorWithI18nKey extends PowerSearchOperatorBase {
306
+ readonly i18nKey: string;
307
+ readonly label?: never;
308
+ }
309
+
310
+ /**
311
+ * A discriminated union: an operator must supply EXACTLY ONE of `label`
312
+ * (raw text) or `i18nKey` (catalog lookup). The type system prevents
313
+ * accidental omission — a bare `{key, value}` is a compile error.
314
+ */
315
+ export type PowerSearchOperator =
316
+ PowerSearchOperatorWithLabel | PowerSearchOperatorWithI18nKey;
317
+
294
318
  export interface PowerSearchField {
295
319
  readonly key: string;
296
320
  readonly label: string;
@@ -119,30 +119,46 @@ function stringOperators(): {
119
119
  return {
120
120
  defaultOperator: StringOps.CONTAINS,
121
121
  operators: [
122
- {key: StringOps.CONTAINS, label: 'contains', value: {type: 'string'}},
122
+ {
123
+ key: StringOps.CONTAINS,
124
+ i18nKey: '@astryx.powersearch.operator.contains',
125
+ value: {type: 'string'},
126
+ },
123
127
  {
124
128
  key: StringOps.NOT_CONTAINS,
125
- label: 'does not contain',
129
+ i18nKey: '@astryx.powersearch.operator.notContains',
126
130
  value: {type: 'string'},
127
131
  },
128
132
  {
129
133
  key: StringOps.STARTS_WITH,
130
- label: 'starts with',
134
+ i18nKey: '@astryx.powersearch.operator.startsWith',
131
135
  value: {type: 'string'},
132
136
  },
133
137
  {
134
138
  key: StringOps.NOT_STARTS_WITH,
135
- label: 'does not start with',
139
+ i18nKey: '@astryx.powersearch.operator.notStartsWith',
140
+ value: {type: 'string'},
141
+ },
142
+ {
143
+ key: StringOps.ENDS_WITH,
144
+ i18nKey: '@astryx.powersearch.operator.endsWith',
136
145
  value: {type: 'string'},
137
146
  },
138
- {key: StringOps.ENDS_WITH, label: 'ends with', value: {type: 'string'}},
139
147
  {
140
148
  key: StringOps.NOT_ENDS_WITH,
141
- label: 'does not end with',
149
+ i18nKey: '@astryx.powersearch.operator.notEndsWith',
150
+ value: {type: 'string'},
151
+ },
152
+ {
153
+ key: StringOps.IS,
154
+ i18nKey: '@astryx.powersearch.operator.is',
155
+ value: {type: 'string'},
156
+ },
157
+ {
158
+ key: StringOps.IS_NOT,
159
+ i18nKey: '@astryx.powersearch.operator.isNot',
142
160
  value: {type: 'string'},
143
161
  },
144
- {key: StringOps.IS, label: 'is', value: {type: 'string'}},
145
- {key: StringOps.IS_NOT, label: 'is not', value: {type: 'string'}},
146
162
  ],
147
163
  };
148
164
  }
@@ -156,32 +172,32 @@ function numberOperators(): {
156
172
  operators: [
157
173
  {
158
174
  key: NumberOps.EQUALS,
159
- label: 'is',
175
+ i18nKey: '@astryx.powersearch.operator.equals',
160
176
  value: {type: 'float'},
161
177
  },
162
178
  {
163
179
  key: NumberOps.NOT_EQUALS,
164
- label: 'is not',
180
+ i18nKey: '@astryx.powersearch.operator.notEquals',
165
181
  value: {type: 'float'},
166
182
  },
167
183
  {
168
184
  key: NumberOps.GREATER_THAN,
169
- label: 'is greater than',
185
+ i18nKey: '@astryx.powersearch.operator.greaterThan',
170
186
  value: {type: 'float'},
171
187
  },
172
188
  {
173
189
  key: NumberOps.LESS_THAN,
174
- label: 'is less than',
190
+ i18nKey: '@astryx.powersearch.operator.lessThan',
175
191
  value: {type: 'float'},
176
192
  },
177
193
  {
178
194
  key: NumberOps.GREATER_THAN_OR_EQUAL,
179
- label: 'is greater than or equal to',
195
+ i18nKey: '@astryx.powersearch.operator.greaterThanOrEqual',
180
196
  value: {type: 'float'},
181
197
  },
182
198
  {
183
199
  key: NumberOps.LESS_THAN_OR_EQUAL,
184
- label: 'is less than or equal to',
200
+ i18nKey: '@astryx.powersearch.operator.lessThanOrEqual',
185
201
  value: {type: 'float'},
186
202
  },
187
203
  ],
@@ -197,17 +213,17 @@ function dateOperators(): {
197
213
  operators: [
198
214
  {
199
215
  key: DateOps.BEFORE,
200
- label: 'is before',
216
+ i18nKey: '@astryx.powersearch.operator.before',
201
217
  value: {type: 'date_absolute'},
202
218
  },
203
219
  {
204
220
  key: DateOps.AFTER,
205
- label: 'is after',
221
+ i18nKey: '@astryx.powersearch.operator.after',
206
222
  value: {type: 'date_absolute'},
207
223
  },
208
224
  {
209
225
  key: DateOps.BETWEEN,
210
- label: 'is between',
226
+ i18nKey: '@astryx.powersearch.operator.between',
211
227
  value: {type: 'date_range'},
212
228
  },
213
229
  ],
@@ -221,8 +237,16 @@ function booleanOperators(): {
221
237
  return {
222
238
  defaultOperator: BooleanOps.IS_TRUE,
223
239
  operators: [
224
- {key: BooleanOps.IS_TRUE, label: 'is true', value: {type: 'empty'}},
225
- {key: BooleanOps.IS_FALSE, label: 'is false', value: {type: 'empty'}},
240
+ {
241
+ key: BooleanOps.IS_TRUE,
242
+ i18nKey: '@astryx.powersearch.operator.isTrue',
243
+ value: {type: 'empty'},
244
+ },
245
+ {
246
+ key: BooleanOps.IS_FALSE,
247
+ i18nKey: '@astryx.powersearch.operator.isFalse',
248
+ value: {type: 'empty'},
249
+ },
226
250
  ],
227
251
  };
228
252
  }
@@ -234,16 +258,24 @@ function enumOperators(values: ReadonlyArray<EnumItem>): {
234
258
  return {
235
259
  defaultOperator: EnumOps.IS,
236
260
  operators: [
237
- {key: EnumOps.IS, label: 'is', value: {type: 'enum', values}},
238
- {key: EnumOps.IS_NOT, label: 'is not', value: {type: 'enum', values}},
261
+ {
262
+ key: EnumOps.IS,
263
+ i18nKey: '@astryx.powersearch.operator.is',
264
+ value: {type: 'enum', values},
265
+ },
266
+ {
267
+ key: EnumOps.IS_NOT,
268
+ i18nKey: '@astryx.powersearch.operator.isNot',
269
+ value: {type: 'enum', values},
270
+ },
239
271
  {
240
272
  key: EnumListOps.IS_ANY_OF,
241
- label: 'is any of',
273
+ i18nKey: '@astryx.powersearch.operator.isAnyOf',
242
274
  value: {type: 'enum_list', values},
243
275
  },
244
276
  {
245
277
  key: EnumListOps.IS_NONE_OF,
246
- label: 'is none of',
278
+ i18nKey: '@astryx.powersearch.operator.isNoneOf',
247
279
  value: {type: 'enum_list', values},
248
280
  },
249
281
  ],
@@ -259,12 +291,12 @@ function enumListOperators(values: ReadonlyArray<EnumItem>): {
259
291
  operators: [
260
292
  {
261
293
  key: EnumListOps.IS_ANY_OF,
262
- label: 'is any of',
294
+ i18nKey: '@astryx.powersearch.operator.isAnyOf',
263
295
  value: {type: 'enum_list', values},
264
296
  },
265
297
  {
266
298
  key: EnumListOps.IS_NONE_OF,
267
- label: 'is none of',
299
+ i18nKey: '@astryx.powersearch.operator.isNoneOf',
268
300
  value: {type: 'enum_list', values},
269
301
  },
270
302
  ],
@@ -280,12 +312,12 @@ function stringListOperators(): {
280
312
  operators: [
281
313
  {
282
314
  key: StringListOps.IS_ANY_OF,
283
- label: 'is any of',
315
+ i18nKey: '@astryx.powersearch.operator.isAnyOf',
284
316
  value: {type: 'string_list'},
285
317
  },
286
318
  {
287
319
  key: StringListOps.IS_NONE_OF,
288
- label: 'is none of',
320
+ i18nKey: '@astryx.powersearch.operator.isNoneOf',
289
321
  value: {type: 'string_list'},
290
322
  },
291
323
  ],
@@ -14,14 +14,22 @@
14
14
 
15
15
  import {useMemo} from 'react';
16
16
  import type {SearchSource} from '../Typeahead/types';
17
+ import {useTranslator} from '../i18n';
18
+ import {resolveOperatorLabel} from './resolveOperatorLabel';
17
19
  import type {InternalConfig} from './useInternalConfig';
18
20
  import type {PowerSearchItem, PowerSearchOperator, FilterValue} from './types';
19
21
 
20
22
  export function usePowerSearchSource(
21
23
  config: InternalConfig,
22
24
  ): SearchSource<PowerSearchItem> {
25
+ const t = useTranslator();
23
26
  return useMemo(() => {
24
27
  const allItems = buildFieldItems(config);
28
+ // Resolver stays inline — `t()` internally memoizes both catalog
29
+ // lookups and parsed IntlMessageFormat instances, so calling it
30
+ // per keystroke is already O(1).
31
+ const opLabel = (op: PowerSearchOperator): string =>
32
+ resolveOperatorLabel(op, t);
25
33
 
26
34
  return {
27
35
  search(query: string): PowerSearchItem[] {
@@ -68,14 +76,15 @@ export function usePowerSearchSource(
68
76
 
69
77
  // Check each field+operator combo against the query
70
78
  for (const op of field.operators) {
71
- const combinedLabel = `${field.label} ${op.label}`.toLowerCase();
79
+ const combinedLabel =
80
+ `${field.label} ${opLabel(op)}`.toLowerCase();
72
81
  if (combinedLabel.includes(lower)) {
73
82
  const id = `${field.key}:${op.key}`;
74
83
  if (!seen.has(id)) {
75
84
  seen.add(id);
76
85
  results.push({
77
86
  id,
78
- label: `${field.label} ${op.label}`,
87
+ label: `${field.label} ${opLabel(op)}`,
79
88
  auxiliaryData: {
80
89
  fieldKey: field.key,
81
90
  operatorKey: op.key,
@@ -100,7 +109,7 @@ export function usePowerSearchSource(
100
109
  // Try "<field> <operator> <value>" first (longer match wins)
101
110
  let hasExactOperatorMatch = false;
102
111
  for (const op of field.operators) {
103
- const prefix = `${fieldLabel} ${op.label.toLowerCase()} `;
112
+ const prefix = `${fieldLabel} ${opLabel(op).toLowerCase()} `;
104
113
  if (lower.startsWith(prefix) && lower.length > prefix.length) {
105
114
  const rawValue = query.slice(prefix.length);
106
115
  const matches = resolveValueMatches(op, rawValue);
@@ -113,7 +122,7 @@ export function usePowerSearchSource(
113
122
  seen.add(id);
114
123
  results.push({
115
124
  id,
116
- label: `${field.label} ${op.label} ${match.quoted ? `"${match.displayValue}"` : match.displayValue}`,
125
+ label: `${field.label} ${opLabel(op)} ${match.quoted ? `"${match.displayValue}"` : match.displayValue}`,
117
126
  auxiliaryData: {
118
127
  fieldKey: field.key,
119
128
  operatorKey: op.key,
@@ -136,7 +145,7 @@ export function usePowerSearchSource(
136
145
  // Check the remainder isn't the start of an operator name
137
146
  const remainder = lower.slice(fieldPrefix.length);
138
147
  const isOperatorPrefix = field.operators.some(op =>
139
- op.label.toLowerCase().startsWith(remainder),
148
+ opLabel(op).toLowerCase().startsWith(remainder),
140
149
  );
141
150
  if (!isOperatorPrefix) {
142
151
  const rawValue = query.slice(fieldPrefix.length);
@@ -148,7 +157,7 @@ export function usePowerSearchSource(
148
157
  seen.add(id);
149
158
  results.push({
150
159
  id,
151
- label: `${field.label} ${op.label} ${match.quoted ? `"${match.displayValue}"` : match.displayValue}`,
160
+ label: `${field.label} ${opLabel(op)} ${match.quoted ? `"${match.displayValue}"` : match.displayValue}`,
152
161
  auxiliaryData: {
153
162
  fieldKey: field.key,
154
163
  operatorKey: op.key,
@@ -171,7 +180,7 @@ export function usePowerSearchSource(
171
180
  f =>
172
181
  f.label.toLowerCase() === lower ||
173
182
  f.operators.some(
174
- op => `${f.label} ${op.label}`.toLowerCase() === lower,
183
+ op => `${f.label} ${opLabel(op)}`.toLowerCase() === lower,
175
184
  ),
176
185
  );
177
186
  if (contentFieldKey && !hasExactMatch) {
@@ -197,7 +206,7 @@ export function usePowerSearchSource(
197
206
  return allItems;
198
207
  },
199
208
  };
200
- }, [config]);
209
+ }, [config, t]);
201
210
  }
202
211
 
203
212
  interface ValueMatch {
@@ -100,7 +100,7 @@ export const docs = {
100
100
  },
101
101
  {
102
102
  name: 'status',
103
- type: 'InputStatus',
103
+ type: "{type: 'warning' | 'error' | 'success', message?: string}",
104
104
  description: 'Status indicator ({ type, message }).',
105
105
  },
106
106
  {
@@ -33,6 +33,7 @@ import {
33
33
  import {mergeProps, mergeRefs} from '../utils';
34
34
  import type {ResizableProps} from './useResizable';
35
35
  import {themeProps} from '../utils/themeProps';
36
+ import {useTranslator} from '../i18n';
36
37
 
37
38
  const KEYBOARD_STEP = 10;
38
39
  const KEYBOARD_LARGE_STEP = 50;
@@ -307,7 +308,7 @@ export function ResizeHandle({
307
308
  hasDivider = false,
308
309
  isAlwaysVisible = true,
309
310
  pillPlacement = 'auto',
310
- label = 'Resize handle',
311
+ label: labelFromProps,
311
312
  resizable,
312
313
  children,
313
314
  xstyle,
@@ -315,6 +316,8 @@ export function ResizeHandle({
315
316
  ref,
316
317
  ...props
317
318
  }: ResizeHandleProps) {
319
+ const t = useTranslator();
320
+ const label = labelFromProps ?? t('@astryx.resizable.handle.label');
318
321
  const handleRef = useRef<HTMLDivElement>(null);
319
322
  // Removes the in-flight drag's window listeners (and resets body styles).
320
323
  // Held in a ref so unmount can tear down a drag that never got a pointerup.
@@ -49,13 +49,13 @@ export const docs = {
49
49
  },
50
50
  {
51
51
  name: 'padding',
52
- type: 'SpacingStep',
52
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
53
53
  description: 'Internal padding using the spacing scale (0, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 8, 10). Use padding={0} for edge-to-edge content.',
54
54
  default: '4',
55
55
  },
56
56
  {
57
57
  name: 'paddingBlock',
58
- type: 'SpacingStep',
58
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
59
59
  description: 'Block (vertical) padding override. Overrides only the block-axis padding while preserving inline padding from `padding` or the container theme default. Accepts the spacing scale (0, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 8, 10).',
60
60
  },
61
61
  {
@@ -131,13 +131,13 @@ export const docsZh = {
131
131
  },
132
132
  {
133
133
  name: 'padding',
134
- type: 'SpacingStep',
134
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
135
135
  description: '使用间距比例的内部内边距(0, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 8, 10)。使用 padding={0} 实现全宽内容。',
136
136
  default: '4',
137
137
  },
138
138
  {
139
139
  name: 'paddingBlock',
140
- type: 'SpacingStep',
140
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
141
141
  description: '块(垂直)方向内边距覆盖。仅覆盖块轴内边距,同时保留来自 padding 或容器主题默认值的行内内边距。使用间距比例(0, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 8, 10)。',
142
142
  },
143
143
  {
@@ -25,7 +25,7 @@ export const docs = {
25
25
  {name: 'onChange', type: '(isSelected: boolean) => void', description: 'Called when toggled.', required: true},
26
26
  {name: 'isDisabled', type: 'boolean', description: 'Disables the card.', default: 'false'},
27
27
  {name: 'children', type: 'ReactNode', description: 'Card content.'},
28
- {name: 'padding', type: "SpacingStep", description: 'Inner padding.', default: '4'},
28
+ {name: 'padding', type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10', description: 'Inner padding.', default: '4'},
29
29
  {name: 'variant', type: "'default' | 'transparent' | 'muted' | 'blue' | 'cyan' | 'gray' | 'green' | 'orange' | 'pink' | 'purple' | 'red' | 'teal' | 'yellow'", description: 'Background color variant.', default: "'default'"},
30
30
  {name: 'width', type: 'SizeValue', description: 'Card width.'},
31
31
  {name: 'height', type: 'SizeValue', description: 'Card height.'},
@@ -36,7 +36,8 @@ export const docs = {
36
36
  {
37
37
  name: 'options',
38
38
  type: 'SelectorOption[]',
39
- description: 'Array of items: strings, objects with value/label/icon/disabled, dividers ({type: "divider"}), or sections ({type: "section", title, items}).',
39
+ description:
40
+ 'Array of items: strings, objects with value/label/icon/disabled, dividers ({type: "divider"}), or sections ({type: "section", title, items}).',
40
41
  required: true,
41
42
  },
42
43
  {
@@ -59,7 +60,8 @@ export const docs = {
59
60
  {
60
61
  name: 'hasSearch',
61
62
  type: 'boolean',
62
- description: 'Whether to show a search input for filtering options.',
63
+ description:
64
+ 'Whether to show a search input for filtering options. As the user types, the match count (or "No results found") is announced to screen readers via a polite live region.',
63
65
  default: 'false',
64
66
  },
65
67
  {
@@ -135,7 +137,8 @@ export const docs = {
135
137
  {
136
138
  name: 'xstyle',
137
139
  type: 'StyleXStyles',
138
- description: 'StyleX styles for layout customization (margins, positioning, sizing). Must be a stylex.create() value: not an inline style object like style={{}}.',
140
+ description:
141
+ 'StyleX styles for layout customization (margins, positioning, sizing). Must be a stylex.create() value: not an inline style object like style={{}}.',
139
142
  },
140
143
  ],
141
144
  components: [{name: 'SelectorOption'}],
@@ -9,12 +9,23 @@
9
9
  * SYNC: When Selector.tsx API changes, update these tests.
10
10
  */
11
11
 
12
- import {describe, it, expect, vi, beforeEach} from 'vitest';
13
- import {render, screen, fireEvent, waitFor} from '@testing-library/react';
12
+ import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
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 {Selector} from './Selector';
16
22
  import {SelectorOption} from './SelectorOption';
17
23
  import {InputGroup, InputGroupText} from '../InputGroup';
24
+ import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
25
+
26
+ function politeRegion(): HTMLElement | null {
27
+ return document.querySelector('[data-astryx-live-region="polite"]');
28
+ }
18
29
 
19
30
  // Mock showPopover and hidePopover methods since they're not implemented in jsdom
20
31
  beforeEach(() => {
@@ -42,6 +53,10 @@ beforeEach(() => {
42
53
  };
43
54
  });
44
55
 
56
+ afterEach(() => {
57
+ __resetLiveRegionsForTest();
58
+ });
59
+
45
60
  // Helper: jsdom popover content is in the DOM but may not be
46
61
  // "visible" in the accessibility tree. Use hidden: true to find it.
47
62
  const h = {hidden: true} as const;
@@ -536,7 +551,11 @@ describe('Selector', () => {
536
551
  await user.click(screen.getByRole('button', {name: 'Fruit'}));
537
552
  await user.type(screen.getByRole('combobox', h), 'xyz');
538
553
  expect(screen.queryAllByRole('option', h)).toHaveLength(0);
539
- expect(screen.getByText('No results found')).toBeInTheDocument();
554
+ // Scope to the listbox: the polite live region also announces "No results
555
+ // found", so an unscoped query matches both the visible empty state and
556
+ // the a11y announcement.
557
+ const listbox = screen.getByRole('listbox', h);
558
+ expect(within(listbox).getByText('No results found')).toBeInTheDocument();
540
559
  });
541
560
 
542
561
  it('calls onChange when selecting a filtered option', async () => {
@@ -599,6 +618,82 @@ describe('Selector', () => {
599
618
  screen.getByPlaceholderText('Find a fruit...'),
600
619
  ).toBeInTheDocument();
601
620
  });
621
+
622
+ describe('result announcements', () => {
623
+ it('announces the match count politely while searching', async () => {
624
+ const user = userEvent.setup();
625
+ render(
626
+ <Selector
627
+ label="Fruit"
628
+ options={OPTIONS}
629
+ value="Apple"
630
+ onChange={() => {}}
631
+ hasSearch
632
+ />,
633
+ );
634
+ await user.click(screen.getByRole('button', {name: 'Fruit'}));
635
+ // "a" matches Apple and Banana.
636
+ await user.type(screen.getByRole('combobox', h), 'a');
637
+ await waitFor(() => {
638
+ expect(politeRegion()).toHaveTextContent('2 results');
639
+ });
640
+ });
641
+
642
+ it('announces the singular form when one option matches', async () => {
643
+ const user = userEvent.setup();
644
+ render(
645
+ <Selector
646
+ label="Fruit"
647
+ options={OPTIONS}
648
+ value="Apple"
649
+ onChange={() => {}}
650
+ hasSearch
651
+ />,
652
+ );
653
+ await user.click(screen.getByRole('button', {name: 'Fruit'}));
654
+ // "ban" matches only Banana. Anchored so it cannot pass on "1 results".
655
+ await user.type(screen.getByRole('combobox', h), 'ban');
656
+ await waitFor(() => {
657
+ expect(politeRegion()).toHaveTextContent(/^1 result$/);
658
+ });
659
+ });
660
+
661
+ it('announces "No results found" when nothing matches', async () => {
662
+ const user = userEvent.setup();
663
+ render(
664
+ <Selector
665
+ label="Fruit"
666
+ options={OPTIONS}
667
+ value="Apple"
668
+ onChange={() => {}}
669
+ hasSearch
670
+ />,
671
+ );
672
+ await user.click(screen.getByRole('button', {name: 'Fruit'}));
673
+ await user.type(screen.getByRole('combobox', h), 'xyz');
674
+ await waitFor(() => {
675
+ expect(politeRegion()).toHaveTextContent('No results found');
676
+ });
677
+ });
678
+
679
+ it('does not announce results until the user searches', async () => {
680
+ const user = userEvent.setup();
681
+ render(
682
+ <Selector
683
+ label="Fruit"
684
+ options={OPTIONS}
685
+ value="Apple"
686
+ onChange={() => {}}
687
+ hasSearch
688
+ />,
689
+ );
690
+ // Popover closed: nothing announced.
691
+ expect(politeRegion()?.textContent ?? '').toBe('');
692
+ // Open with an empty query: still nothing announced.
693
+ await user.click(screen.getByRole('button', {name: 'Fruit'}));
694
+ expect(politeRegion()?.textContent ?? '').toBe('');
695
+ });
696
+ });
602
697
  });
603
698
 
604
699
  describe('keyboard accessibility', () => {
@@ -869,7 +964,12 @@ describe('Selector', () => {
869
964
  it('submits the selected value under htmlName', () => {
870
965
  const {container} = render(
871
966
  <form>
872
- <Selector label="Fruit" htmlName="fruit" options={OPTIONS} value="Banana" />
967
+ <Selector
968
+ label="Fruit"
969
+ htmlName="fruit"
970
+ options={OPTIONS}
971
+ value="Banana"
972
+ />
873
973
  </form>,
874
974
  );
875
975
  const data = new FormData(container.querySelector('form')!);
@@ -889,10 +989,18 @@ describe('Selector', () => {
889
989
  it('is excluded from form data when disabled', () => {
890
990
  const {container} = render(
891
991
  <form>
892
- <Selector label="Fruit" htmlName="fruit" options={OPTIONS} value="Banana" isDisabled />
992
+ <Selector
993
+ label="Fruit"
994
+ htmlName="fruit"
995
+ options={OPTIONS}
996
+ value="Banana"
997
+ isDisabled
998
+ />
893
999
  </form>,
894
1000
  );
895
- expect([...new FormData(container.querySelector('form')!).keys()]).toEqual([]);
1001
+ expect([
1002
+ ...new FormData(container.querySelector('form')!).keys(),
1003
+ ]).toEqual([]);
896
1004
  });
897
1005
  });
898
1006
  });