@astryxdesign/core 0.1.5 → 0.1.6-canary.02f2602

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 (564) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +2 -0
  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 +21 -18
  6. package/dist/AlertDialog/useImperativeAlertDialog.d.ts +0 -2
  7. package/dist/AlertDialog/useImperativeAlertDialog.d.ts.map +1 -1
  8. package/dist/AlertDialog/useImperativeAlertDialog.js +3 -5
  9. package/dist/AppShell/AppShell.d.ts.map +1 -1
  10. package/dist/AppShell/AppShell.js +55 -53
  11. package/dist/AspectRatio/AspectRatio.js +5 -5
  12. package/dist/Avatar/Avatar.js +19 -19
  13. package/dist/Avatar/AvatarStatusDot.js +5 -5
  14. package/dist/AvatarGroup/AvatarGroup.d.ts +1 -1
  15. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  16. package/dist/AvatarGroup/AvatarGroup.js +9 -6
  17. package/dist/AvatarGroup/AvatarGroupOverflow.js +5 -5
  18. package/dist/Badge/Badge.js +3 -3
  19. package/dist/Banner/Banner.d.ts.map +1 -1
  20. package/dist/Banner/Banner.js +32 -30
  21. package/dist/Blockquote/Blockquote.js +7 -7
  22. package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
  23. package/dist/Breadcrumbs/Breadcrumbs.d.ts +1 -1
  24. package/dist/Breadcrumbs/Breadcrumbs.d.ts.map +1 -1
  25. package/dist/Breadcrumbs/Breadcrumbs.js +11 -8
  26. package/dist/Button/Button.d.ts.map +1 -1
  27. package/dist/Button/Button.js +53 -23
  28. package/dist/ButtonGroup/ButtonGroup.d.ts +20 -5
  29. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  30. package/dist/ButtonGroup/ButtonGroup.js +34 -18
  31. package/dist/Calendar/Calendar.d.ts.map +1 -1
  32. package/dist/Calendar/Calendar.js +51 -48
  33. package/dist/Card/Card.js +3 -3
  34. package/dist/Carousel/Carousel.d.ts +1 -1
  35. package/dist/Carousel/Carousel.d.ts.map +1 -1
  36. package/dist/Carousel/Carousel.js +27 -24
  37. package/dist/Center/Center.js +3 -3
  38. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  39. package/dist/Chat/ChatComposer.js +27 -24
  40. package/dist/Chat/ChatComposerDrawer.d.ts +1 -1
  41. package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
  42. package/dist/Chat/ChatComposerDrawer.js +23 -16
  43. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  44. package/dist/Chat/ChatComposerInput.js +20 -16
  45. package/dist/Chat/ChatDictationButton.js +10 -10
  46. package/dist/Chat/ChatLayout.d.ts +1 -11
  47. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  48. package/dist/Chat/ChatLayout.js +23 -21
  49. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  50. package/dist/Chat/ChatLayoutScrollButton.js +13 -11
  51. package/dist/Chat/ChatMessage.d.ts +1 -1
  52. package/dist/Chat/ChatMessage.d.ts.map +1 -1
  53. package/dist/Chat/ChatMessage.js +20 -14
  54. package/dist/Chat/ChatMessageBubble.d.ts +1 -1
  55. package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
  56. package/dist/Chat/ChatMessageBubble.js +10 -8
  57. package/dist/Chat/ChatMessageList.d.ts +1 -1
  58. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  59. package/dist/Chat/ChatMessageList.js +17 -15
  60. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  61. package/dist/Chat/ChatMessageMetadata.js +24 -19
  62. package/dist/Chat/ChatPastedTextToken.d.ts.map +1 -1
  63. package/dist/Chat/ChatPastedTextToken.js +16 -14
  64. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  65. package/dist/Chat/ChatSendButton.js +6 -4
  66. package/dist/Chat/ChatSystemMessage.js +11 -11
  67. package/dist/Chat/ChatTokenizedText.js +8 -8
  68. package/dist/Chat/ChatToolCalls.js +73 -73
  69. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  70. package/dist/Chat/useSpeechRecognition.js +4 -2
  71. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  72. package/dist/Chat/useTriggerMenu.js +19 -17
  73. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  74. package/dist/CheckboxInput/CheckboxInput.js +26 -24
  75. package/dist/CheckboxList/CheckboxList.d.ts +1 -1
  76. package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
  77. package/dist/CheckboxList/CheckboxList.js +12 -10
  78. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  79. package/dist/CheckboxList/CheckboxListItem.js +8 -6
  80. package/dist/Citation/Citation.d.ts.map +1 -1
  81. package/dist/Citation/Citation.js +20 -12
  82. package/dist/ClickableCard/ClickableCard.js +6 -6
  83. package/dist/Code/Code.js +3 -3
  84. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  85. package/dist/CodeBlock/CodeBlock.js +114 -96
  86. package/dist/Collapsible/Collapsible.js +11 -11
  87. package/dist/Collapsible/CollapsibleGroup.js +7 -7
  88. package/dist/CommandPalette/CommandPalette.d.ts +1 -1
  89. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  90. package/dist/CommandPalette/CommandPalette.js +39 -34
  91. package/dist/CommandPalette/CommandPaletteEmpty.js +3 -3
  92. package/dist/CommandPalette/CommandPaletteFooter.js +16 -16
  93. package/dist/CommandPalette/CommandPaletteGroup.js +5 -5
  94. package/dist/CommandPalette/CommandPaletteInput.d.ts +1 -1
  95. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  96. package/dist/CommandPalette/CommandPaletteInput.js +17 -14
  97. package/dist/CommandPalette/CommandPaletteItem.js +3 -3
  98. package/dist/CommandPalette/CommandPaletteList.d.ts +1 -1
  99. package/dist/CommandPalette/CommandPaletteList.d.ts.map +1 -1
  100. package/dist/CommandPalette/CommandPaletteList.js +7 -4
  101. package/dist/ContextMenu/ContextMenu.d.ts +1 -1
  102. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  103. package/dist/ContextMenu/ContextMenu.js +14 -11
  104. package/dist/DateInput/DateInput.d.ts +1 -1
  105. package/dist/DateInput/DateInput.d.ts.map +1 -1
  106. package/dist/DateInput/DateInput.js +28 -23
  107. package/dist/DateRangeInput/DateRangeInput.d.ts +1 -1
  108. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  109. package/dist/DateRangeInput/DateRangeInput.js +32 -27
  110. package/dist/DateTimeInput/DateTimeInput.d.ts +1 -1
  111. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  112. package/dist/DateTimeInput/DateTimeInput.js +41 -33
  113. package/dist/Dialog/Dialog.js +9 -9
  114. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  115. package/dist/Dialog/DialogHeader.js +20 -18
  116. package/dist/Dialog/useImperativeDialog.js +3 -3
  117. package/dist/Divider/Divider.js +7 -7
  118. package/dist/DropdownMenu/DropdownMenu.d.ts +1 -1
  119. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  120. package/dist/DropdownMenu/DropdownMenu.js +21 -15
  121. package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
  122. package/dist/DropdownMenu/renderDropdownItems.js +10 -10
  123. package/dist/EmptyState/EmptyState.d.ts +4 -1
  124. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  125. package/dist/EmptyState/EmptyState.js +9 -9
  126. package/dist/Field/Field.js +17 -17
  127. package/dist/Field/FieldLabel.js +15 -15
  128. package/dist/Field/InputClearButton.js +5 -5
  129. package/dist/FieldStatus/FieldStatus.js +3 -3
  130. package/dist/FileInput/FileInput.d.ts.map +1 -1
  131. package/dist/FileInput/FileInput.js +34 -30
  132. package/dist/FormLayout/FormLayout.js +5 -5
  133. package/dist/Grid/Grid.js +3 -3
  134. package/dist/Grid/GridSpan.js +3 -3
  135. package/dist/HStack/HStack.js +3 -3
  136. package/dist/Heading/Heading.js +10 -10
  137. package/dist/HoverCard/HoverCard.js +9 -9
  138. package/dist/HoverCard/useHoverCard.js +3 -3
  139. package/dist/Icon/Icon.js +11 -11
  140. package/dist/Icon/defaultIcons.js +116 -116
  141. package/dist/IconButton/IconButton.js +3 -3
  142. package/dist/InputGroup/InputGroup.js +9 -9
  143. package/dist/InputGroup/InputGroupText.js +3 -3
  144. package/dist/Item/Item.js +17 -17
  145. package/dist/Kbd/Kbd.js +5 -5
  146. package/dist/Layer/LayerProvider.js +7 -7
  147. package/dist/Layer/useLayer.js +5 -5
  148. package/dist/Layout/Layout.js +21 -21
  149. package/dist/Layout/LayoutContent.js +3 -3
  150. package/dist/Layout/LayoutFooter.js +5 -5
  151. package/dist/Layout/LayoutHeader.js +5 -5
  152. package/dist/Layout/LayoutPanel.js +3 -3
  153. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  154. package/dist/Lightbox/Lightbox.js +35 -33
  155. package/dist/Lightbox/useLightbox.d.ts +0 -1
  156. package/dist/Lightbox/useLightbox.d.ts.map +1 -1
  157. package/dist/Lightbox/useLightbox.js +3 -4
  158. package/dist/Link/Link.d.ts +5 -3
  159. package/dist/Link/Link.d.ts.map +1 -1
  160. package/dist/Link/Link.js +47 -18
  161. package/dist/Link/LinkProvider.js +3 -3
  162. package/dist/Link/useLinkify.js +3 -3
  163. package/dist/List/List.js +11 -11
  164. package/dist/List/ListItem.js +11 -11
  165. package/dist/Markdown/Markdown.d.ts.map +1 -1
  166. package/dist/Markdown/Markdown.js +111 -109
  167. package/dist/MetadataList/MetadataList.js +10 -10
  168. package/dist/MetadataList/MetadataListItem.js +15 -15
  169. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  170. package/dist/MobileNav/MobileNav.js +19 -17
  171. package/dist/MobileNav/MobileNavToggle.d.ts +1 -1
  172. package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
  173. package/dist/MobileNav/MobileNavToggle.js +9 -6
  174. package/dist/MoreMenu/MoreMenu.d.ts +1 -1
  175. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  176. package/dist/MoreMenu/MoreMenu.js +7 -4
  177. package/dist/MultiSelector/MultiSelector.d.ts +1 -1
  178. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  179. package/dist/MultiSelector/MultiSelector.js +69 -62
  180. package/dist/NavIcon/NavIcon.js +3 -3
  181. package/dist/NavMenu/NavHeadingMenu.js +5 -5
  182. package/dist/NavMenu/NavHeadingMenuItem.js +8 -8
  183. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  184. package/dist/NumberInput/NumberInput.js +21 -17
  185. package/dist/Outline/Outline.d.ts +1 -1
  186. package/dist/Outline/Outline.d.ts.map +1 -1
  187. package/dist/Outline/Outline.js +19 -16
  188. package/dist/OverflowList/OverflowList.js +8 -8
  189. package/dist/Overlay/Overlay.js +3 -3
  190. package/dist/Overlay/OverlayScrim.js +5 -5
  191. package/dist/Overlay/useOverlay.d.ts +0 -3
  192. package/dist/Overlay/useOverlay.d.ts.map +1 -1
  193. package/dist/Overlay/useOverlay.js +3 -6
  194. package/dist/Pagination/Pagination.d.ts +1 -1
  195. package/dist/Pagination/Pagination.d.ts.map +1 -1
  196. package/dist/Pagination/Pagination.js +73 -46
  197. package/dist/Popover/Popover.js +16 -16
  198. package/dist/Popover/usePopover.d.ts.map +1 -1
  199. package/dist/Popover/usePopover.js +11 -8
  200. package/dist/PowerSearch/PowerSearch.d.ts +1 -1
  201. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  202. package/dist/PowerSearch/PowerSearch.js +95 -85
  203. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +1 -1
  204. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  205. package/dist/PowerSearch/PowerSearchEditPopover.js +109 -103
  206. package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
  207. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  208. package/dist/PowerSearch/PowerSearchToken.js +12 -8
  209. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  210. package/dist/PowerSearch/PowerSearchValueEditor.js +88 -75
  211. package/dist/PowerSearch/formatFilterValue.d.ts +2 -1
  212. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  213. package/dist/PowerSearch/formatFilterValue.js +19 -9
  214. package/dist/PowerSearch/index.d.ts +2 -1
  215. package/dist/PowerSearch/index.d.ts.map +1 -1
  216. package/dist/PowerSearch/index.js +1 -0
  217. package/dist/PowerSearch/resolveOperatorLabel.d.ts +23 -0
  218. package/dist/PowerSearch/resolveOperatorLabel.d.ts.map +1 -0
  219. package/dist/PowerSearch/resolveOperatorLabel.js +28 -0
  220. package/dist/PowerSearch/types.d.ts +28 -2
  221. package/dist/PowerSearch/types.d.ts.map +1 -1
  222. package/dist/PowerSearch/usePowerSearchConfig.d.ts.map +1 -1
  223. package/dist/PowerSearch/usePowerSearchConfig.js +27 -27
  224. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  225. package/dist/PowerSearch/usePowerSearchSource.js +15 -8
  226. package/dist/ProgressBar/ProgressBar.js +13 -13
  227. package/dist/RadioList/RadioList.js +7 -7
  228. package/dist/RadioList/RadioListItem.js +18 -18
  229. package/dist/Resizable/ResizeHandle.d.ts +1 -1
  230. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  231. package/dist/Resizable/ResizeHandle.js +10 -7
  232. package/dist/Section/Section.js +5 -5
  233. package/dist/SegmentedControl/SegmentedControl.js +5 -5
  234. package/dist/SegmentedControl/SegmentedControlItem.js +7 -7
  235. package/dist/SelectableCard/SelectableCard.js +5 -5
  236. package/dist/Selector/Selector.d.ts.map +1 -1
  237. package/dist/Selector/Selector.js +57 -51
  238. package/dist/Selector/SelectorOption.js +3 -3
  239. package/dist/SideNav/SideNav.d.ts.map +1 -1
  240. package/dist/SideNav/SideNav.js +38 -36
  241. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  242. package/dist/SideNav/SideNavCollapseButton.js +8 -6
  243. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  244. package/dist/SideNav/SideNavHeading.js +92 -90
  245. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  246. package/dist/SideNav/SideNavItem.js +49 -43
  247. package/dist/SideNav/SideNavSection.js +14 -14
  248. package/dist/Skeleton/Skeleton.js +3 -3
  249. package/dist/Slider/Slider.js +23 -23
  250. package/dist/Spinner/Spinner.js +9 -9
  251. package/dist/StatusDot/StatusDot.js +5 -5
  252. package/dist/Switch/Switch.d.ts.map +1 -1
  253. package/dist/Switch/Switch.js +29 -27
  254. package/dist/TabList/Tab.js +18 -18
  255. package/dist/TabList/TabList.d.ts +1 -1
  256. package/dist/TabList/TabList.d.ts.map +1 -1
  257. package/dist/TabList/TabList.js +9 -6
  258. package/dist/TabList/TabMenu.js +23 -23
  259. package/dist/Table/BaseTable.d.ts.map +1 -1
  260. package/dist/Table/BaseTable.js +39 -37
  261. package/dist/Table/Table.d.ts.map +1 -1
  262. package/dist/Table/Table.js +10 -8
  263. package/dist/Table/TableBody.js +3 -3
  264. package/dist/Table/TableCell.js +3 -3
  265. package/dist/Table/TableFooter.js +3 -3
  266. package/dist/Table/TableHeader.js +3 -3
  267. package/dist/Table/TableHeaderCell.js +3 -3
  268. package/dist/Table/TableRow.js +5 -5
  269. package/dist/Table/index.d.ts +4 -0
  270. package/dist/Table/index.d.ts.map +1 -1
  271. package/dist/Table/index.js +2 -0
  272. package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -9
  273. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  274. package/dist/Table/plugins/filtering/useTableFiltering.js +127 -90
  275. package/dist/Table/plugins/groupedRows/index.d.ts +3 -0
  276. package/dist/Table/plugins/groupedRows/index.d.ts.map +1 -0
  277. package/dist/Table/plugins/groupedRows/index.js +3 -0
  278. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +78 -0
  279. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -0
  280. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +257 -0
  281. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  282. package/dist/Table/plugins/pagination/useTablePagination.js +12 -9
  283. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +1 -1
  284. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  285. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +30 -28
  286. package/dist/Table/plugins/rowIndex/index.d.ts +3 -0
  287. package/dist/Table/plugins/rowIndex/index.d.ts.map +1 -0
  288. package/dist/Table/plugins/rowIndex/index.js +3 -0
  289. package/dist/Table/plugins/rowIndex/useTableRowIndex.d.ts +50 -0
  290. package/dist/Table/plugins/rowIndex/useTableRowIndex.d.ts.map +1 -0
  291. package/dist/Table/plugins/rowIndex/useTableRowIndex.js +91 -0
  292. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  293. package/dist/Table/plugins/selection/useTableSelection.js +23 -20
  294. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  295. package/dist/Table/plugins/sortable/useTableSortable.js +23 -21
  296. package/dist/Table/tableContextMenu.js +9 -9
  297. package/dist/Text/Text.js +10 -10
  298. package/dist/TextArea/TextArea.js +14 -14
  299. package/dist/TextInput/TextInput.d.ts.map +1 -1
  300. package/dist/TextInput/TextInput.js +20 -16
  301. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  302. package/dist/Thumbnail/Thumbnail.js +37 -31
  303. package/dist/TimeInput/TimeInput.d.ts +1 -1
  304. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  305. package/dist/TimeInput/TimeInput.js +28 -23
  306. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  307. package/dist/Timestamp/Timestamp.js +29 -14
  308. package/dist/Toast/Toast.d.ts.map +1 -1
  309. package/dist/Toast/Toast.js +17 -15
  310. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  311. package/dist/Toast/ToastViewport.js +14 -12
  312. package/dist/Toast/useToast.js +4 -4
  313. package/dist/ToggleButton/ToggleButton.js +12 -12
  314. package/dist/ToggleButton/ToggleButtonGroup.js +5 -5
  315. package/dist/Token/Token.d.ts.map +1 -1
  316. package/dist/Token/Token.js +29 -23
  317. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  318. package/dist/Tokenizer/Tokenizer.js +33 -31
  319. package/dist/Toolbar/Toolbar.js +18 -18
  320. package/dist/Tooltip/Tooltip.js +11 -11
  321. package/dist/Tooltip/useTooltip.js +3 -3
  322. package/dist/TopNav/TopNav.d.ts +2 -1
  323. package/dist/TopNav/TopNav.d.ts.map +1 -1
  324. package/dist/TopNav/TopNav.js +36 -33
  325. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  326. package/dist/TopNav/TopNavHeading.js +72 -70
  327. package/dist/TopNav/TopNavItem.js +5 -5
  328. package/dist/TopNav/TopNavMegaMenu.js +30 -30
  329. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +10 -10
  330. package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
  331. package/dist/TopNav/TopNavMenu.js +32 -32
  332. package/dist/TreeList/TreeList.d.ts.map +1 -1
  333. package/dist/TreeList/TreeList.js +13 -9
  334. package/dist/TreeList/TreeListBranches.js +11 -11
  335. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  336. package/dist/TreeList/TreeListItem.js +37 -31
  337. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  338. package/dist/Typeahead/BaseTypeahead.js +26 -22
  339. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  340. package/dist/Typeahead/Typeahead.js +15 -13
  341. package/dist/Typeahead/TypeaheadItem.js +10 -10
  342. package/dist/VStack/VStack.js +3 -3
  343. package/dist/VisuallyHidden/VisuallyHidden.d.ts +1 -3
  344. package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
  345. package/dist/VisuallyHidden/VisuallyHidden.js +1 -3
  346. package/dist/astryx.css +20 -2
  347. package/dist/astryx.umd.js +66 -64
  348. package/dist/astryx.umd.js.map +4 -4
  349. package/dist/authoring/doc.d.ts +145 -0
  350. package/dist/authoring/doc.d.ts.map +1 -0
  351. package/dist/authoring/doc.js +100 -0
  352. package/dist/authoring/index.d.ts +29 -0
  353. package/dist/authoring/index.d.ts.map +1 -0
  354. package/dist/authoring/index.js +28 -0
  355. package/dist/authoring/integration.d.ts +35 -0
  356. package/dist/authoring/integration.d.ts.map +1 -0
  357. package/dist/authoring/integration.js +30 -0
  358. package/dist/authoring/template.d.ts +66 -0
  359. package/dist/authoring/template.d.ts.map +1 -0
  360. package/dist/authoring/template.js +55 -0
  361. package/dist/config.d.ts +80 -0
  362. package/dist/config.d.ts.map +1 -0
  363. package/dist/config.js +40 -0
  364. package/dist/hooks/useKeyboardHint.js +9 -9
  365. package/dist/i18n/InternationalizationContext.d.ts +12 -0
  366. package/dist/i18n/InternationalizationContext.d.ts.map +1 -0
  367. package/dist/i18n/InternationalizationContext.js +29 -0
  368. package/dist/i18n/InternationalizationProvider.d.ts +62 -0
  369. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -0
  370. package/dist/i18n/InternationalizationProvider.js +44 -0
  371. package/dist/i18n/index.d.ts +24 -0
  372. package/dist/i18n/index.d.ts.map +1 -0
  373. package/dist/i18n/index.js +21 -0
  374. package/dist/i18n/resolve.d.ts +22 -0
  375. package/dist/i18n/resolve.d.ts.map +1 -0
  376. package/dist/i18n/resolve.js +141 -0
  377. package/dist/i18n/translator.d.ts +25 -0
  378. package/dist/i18n/translator.d.ts.map +1 -0
  379. package/dist/i18n/translator.js +1 -0
  380. package/dist/i18n/types.d.ts +47 -0
  381. package/dist/i18n/types.d.ts.map +1 -0
  382. package/dist/i18n/types.js +1 -0
  383. package/dist/i18n/useTranslator.d.ts +15 -0
  384. package/dist/i18n/useTranslator.d.ts.map +1 -0
  385. package/dist/i18n/useTranslator.js +39 -0
  386. package/dist/index.d.ts +1 -0
  387. package/dist/index.d.ts.map +1 -1
  388. package/dist/index.js +3 -0
  389. package/dist/theme/MediaTheme.js +3 -3
  390. package/dist/theme/Theme.js +7 -7
  391. package/dist/theme/syntax/SyntaxTheme.js +5 -5
  392. package/locales/en.json +746 -0
  393. package/locales/pseudo.json +560 -0
  394. package/package.json +24 -3
  395. package/src/AlertDialog/AlertDialog.doc.mjs +5 -0
  396. package/src/AlertDialog/AlertDialog.tsx +4 -1
  397. package/src/AlertDialog/useImperativeAlertDialog.tsx +0 -2
  398. package/src/AppShell/AppShell.doc.mjs +8 -2
  399. package/src/AppShell/AppShell.tsx +3 -1
  400. package/src/AvatarGroup/AvatarGroup.tsx +4 -1
  401. package/src/Banner/Banner.tsx +10 -5
  402. package/src/Breadcrumbs/Breadcrumbs.tsx +4 -1
  403. package/src/Button/Button.tsx +34 -4
  404. package/src/ButtonGroup/ButtonGroup.test.tsx +386 -2
  405. package/src/ButtonGroup/ButtonGroup.tsx +27 -11
  406. package/src/Calendar/Calendar.tsx +8 -5
  407. package/src/Card/Card.doc.mjs +3 -3
  408. package/src/Carousel/Carousel.tsx +10 -7
  409. package/src/Chat/ChatComposer.tsx +5 -1
  410. package/src/Chat/ChatComposerDrawer.tsx +9 -2
  411. package/src/Chat/ChatComposerInput.tsx +10 -4
  412. package/src/Chat/ChatLayout.tsx +5 -12
  413. package/src/Chat/ChatLayoutScrollButton.tsx +4 -2
  414. package/src/Chat/ChatMessage.tsx +5 -1
  415. package/src/Chat/ChatMessageBubble.tsx +2 -0
  416. package/src/Chat/ChatMessageList.doc.mjs +1 -1
  417. package/src/Chat/ChatMessageList.tsx +2 -0
  418. package/src/Chat/ChatMessageMetadata.tsx +15 -9
  419. package/src/Chat/ChatPastedTextToken.tsx +3 -1
  420. package/src/Chat/ChatSendButton.tsx +3 -1
  421. package/src/Chat/ChatToolCalls.doc.mjs +1 -1
  422. package/src/Chat/useSpeechRecognition.ts +11 -2
  423. package/src/Chat/useTriggerMenu.tsx +4 -2
  424. package/src/CheckboxInput/CheckboxInput.test.tsx +16 -0
  425. package/src/CheckboxInput/CheckboxInput.tsx +4 -2
  426. package/src/CheckboxList/CheckboxList.doc.mjs +6 -1
  427. package/src/CheckboxList/CheckboxList.tsx +2 -0
  428. package/src/CheckboxList/CheckboxListItem.tsx +7 -1
  429. package/src/Citation/Citation.tsx +4 -2
  430. package/src/ClickableCard/ClickableCard.doc.mjs +1 -1
  431. package/src/CodeBlock/CodeBlock.tsx +91 -40
  432. package/src/Collapsible/Collapsible.doc.mjs +3 -3
  433. package/src/CommandPalette/CommandPalette.tsx +10 -3
  434. package/src/CommandPalette/CommandPaletteInput.test.tsx +1 -1
  435. package/src/CommandPalette/CommandPaletteInput.tsx +5 -1
  436. package/src/CommandPalette/CommandPaletteList.tsx +4 -1
  437. package/src/ContextMenu/ContextMenu.tsx +4 -1
  438. package/src/DateInput/DateInput.doc.mjs +2 -2
  439. package/src/DateInput/DateInput.tsx +13 -5
  440. package/src/DateRangeInput/DateRangeInput.doc.mjs +7 -7
  441. package/src/DateRangeInput/DateRangeInput.tsx +14 -6
  442. package/src/DateTimeInput/DateTimeInput.doc.mjs +2 -2
  443. package/src/DateTimeInput/DateTimeInput.tsx +17 -7
  444. package/src/Dialog/DialogHeader.tsx +4 -2
  445. package/src/DropdownMenu/DropdownMenu.tsx +12 -8
  446. package/src/EmptyState/EmptyState.doc.mjs +3 -3
  447. package/src/EmptyState/EmptyState.tsx +4 -1
  448. package/src/Field/Field.doc.mjs +2 -2
  449. package/src/FileInput/FileInput.tsx +3 -1
  450. package/src/Grid/Grid.doc.mjs +5 -5
  451. package/src/InputGroup/InputGroup.doc.mjs +1 -1
  452. package/src/Layer/useLayer.doc.mjs +2 -2
  453. package/src/Lightbox/Lightbox.doc.mjs +7 -2
  454. package/src/Lightbox/Lightbox.tsx +6 -4
  455. package/src/Lightbox/useLightbox.tsx +0 -1
  456. package/src/Link/Link.test.tsx +74 -2
  457. package/src/Link/Link.tsx +48 -3
  458. package/src/Markdown/Markdown.tsx +12 -4
  459. package/src/MobileNav/MobileNav.tsx +4 -2
  460. package/src/MobileNav/MobileNavToggle.tsx +5 -3
  461. package/src/MoreMenu/MoreMenu.tsx +4 -1
  462. package/src/MultiSelector/MultiSelector.tsx +14 -5
  463. package/src/NumberInput/NumberInput.tsx +3 -1
  464. package/src/Outline/Outline.tsx +4 -1
  465. package/src/OverflowList/OverflowList.doc.mjs +2 -2
  466. package/src/Overlay/useOverlay.tsx +0 -3
  467. package/src/Pagination/Pagination.tsx +35 -12
  468. package/src/Popover/usePopover.tsx +6 -1
  469. package/src/PowerSearch/PowerSearch.doc.mjs +9 -4
  470. package/src/PowerSearch/PowerSearch.tsx +22 -10
  471. package/src/PowerSearch/PowerSearchEditPopover.tsx +27 -20
  472. package/src/PowerSearch/PowerSearchToken.tsx +17 -6
  473. package/src/PowerSearch/PowerSearchValueEditor.tsx +34 -21
  474. package/src/PowerSearch/formatFilterValue.test.ts +282 -0
  475. package/src/PowerSearch/formatFilterValue.ts +21 -8
  476. package/src/PowerSearch/index.ts +5 -0
  477. package/src/PowerSearch/resolveOperatorLabel.ts +34 -0
  478. package/src/PowerSearch/types.ts +33 -9
  479. package/src/PowerSearch/usePowerSearchConfig.ts +59 -27
  480. package/src/PowerSearch/usePowerSearchSource.ts +17 -8
  481. package/src/RadioList/RadioList.doc.mjs +1 -1
  482. package/src/Resizable/ResizeHandle.tsx +4 -1
  483. package/src/Section/Section.doc.mjs +4 -4
  484. package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
  485. package/src/Selector/Selector.tsx +11 -6
  486. package/src/SideNav/SideNav.tsx +4 -2
  487. package/src/SideNav/SideNavCollapseButton.tsx +3 -1
  488. package/src/SideNav/SideNavHeading.tsx +5 -3
  489. package/src/SideNav/SideNavItem.tsx +3 -1
  490. package/src/Slider/Slider.doc.mjs +2 -2
  491. package/src/Stack/Stack.doc.mjs +10 -10
  492. package/src/Switch/Switch.doc.mjs +2 -2
  493. package/src/Switch/Switch.test.tsx +16 -0
  494. package/src/Switch/Switch.tsx +4 -2
  495. package/src/TabList/TabList.tsx +4 -1
  496. package/src/Table/BaseTable.tsx +8 -1
  497. package/src/Table/Table.doc.mjs +1 -1
  498. package/src/Table/Table.tsx +3 -1
  499. package/src/Table/index.ts +7 -0
  500. package/src/Table/plugins/filtering/useTableFiltering.tsx +31 -30
  501. package/src/Table/plugins/groupedRows/index.ts +7 -0
  502. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +231 -0
  503. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +351 -0
  504. package/src/Table/plugins/pagination/useTablePagination.tsx +4 -1
  505. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +8 -4
  506. package/src/Table/plugins/rowIndex/index.ts +4 -0
  507. package/src/Table/plugins/rowIndex/useTableRowIndex.test.tsx +132 -0
  508. package/src/Table/plugins/rowIndex/useTableRowIndex.tsx +114 -0
  509. package/src/Table/plugins/selection/useTableSelection.tsx +6 -7
  510. package/src/Table/plugins/sortable/useTableSortable.tsx +8 -5
  511. package/src/Table/useTableFiltering.doc.mjs +2 -2
  512. package/src/Table/useTableGroupedRows.doc.mjs +71 -0
  513. package/src/Table/useTableRowIndex.doc.mjs +50 -0
  514. package/src/Table/useTableSortable.doc.mjs +11 -11
  515. package/src/Text/Text.doc.mjs +2 -2
  516. package/src/TextInput/TextInput.tsx +3 -1
  517. package/src/Thumbnail/Thumbnail.tsx +4 -2
  518. package/src/TimeInput/TimeInput.doc.mjs +2 -2
  519. package/src/TimeInput/TimeInput.tsx +6 -2
  520. package/src/Timestamp/Timestamp.doc.mjs +4 -4
  521. package/src/Timestamp/Timestamp.test.tsx +120 -7
  522. package/src/Timestamp/Timestamp.tsx +21 -1
  523. package/src/Toast/Toast.tsx +3 -1
  524. package/src/Toast/ToastViewport.tsx +3 -1
  525. package/src/Token/Token.tsx +4 -2
  526. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  527. package/src/Tokenizer/Tokenizer.tsx +4 -4
  528. package/src/Toolbar/Toolbar.doc.mjs +1 -1
  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 -3
  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 +902 -0
  547. package/src/hooks/useHotkeys.doc.mjs +5 -5
  548. package/src/i18n/InternationalizationContext.ts +39 -0
  549. package/src/i18n/InternationalizationProvider.doc.mjs +72 -0
  550. package/src/i18n/InternationalizationProvider.tsx +83 -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/dist/NavItem/index.d.ts +0 -9
  562. package/dist/NavItem/index.d.ts.map +0 -1
  563. package/dist/NavItem/index.js +0 -10
  564. package/src/NavItem/index.ts +0 -11
@@ -42,6 +42,7 @@ import type {
42
42
  HeaderCellRenderProps,
43
43
  } from '../../types';
44
44
  import {proportional} from '../../columnUtils';
45
+ import {useTranslator} from '../../../i18n';
45
46
  import type {
46
47
  PowerSearchConfig,
47
48
  PowerSearchField,
@@ -263,10 +264,7 @@ function tableValueToFilterValue(
263
264
  * };
264
265
  * ```
265
266
  */
266
- export type TableFilterState = Record<
267
- string,
268
- TableFilterValue | undefined
269
- >;
267
+ export type TableFilterState = Record<string, TableFilterValue | undefined>;
270
268
 
271
269
  /**
272
270
  * Display variant for the filter UI.
@@ -299,10 +297,7 @@ export interface UseTableFilteringConfig {
299
297
  /** Current filter state — map from column key to filter value. */
300
298
  filters: TableFilterState;
301
299
  /** Called when the user changes a filter value. `null` clears the filter. */
302
- onFilterChange: (
303
- columnKey: string,
304
- value: TableFilterValue | null,
305
- ) => void;
300
+ onFilterChange: (columnKey: string, value: TableFilterValue | null) => void;
306
301
  /**
307
302
  * Display variant for filter controls.
308
303
  *
@@ -424,6 +419,7 @@ function TextFilterControl({
424
419
  size: 'sm' | 'md';
425
420
  hasClear?: boolean;
426
421
  }) {
422
+ const t = useTranslator();
427
423
  const store = useFilterStore();
428
424
  const config = store.getConfig();
429
425
  const value = config.filters[columnKey];
@@ -431,7 +427,7 @@ function TextFilterControl({
431
427
 
432
428
  return (
433
429
  <TextInput
434
- label={`Filter ${header}`}
430
+ label={t('@astryx.tableFiltering.filterByColumn', {header})}
435
431
  isLabelHidden
436
432
  value={strValue}
437
433
  onChange={(newValue: string) => {
@@ -439,7 +435,7 @@ function TextFilterControl({
439
435
  .getConfig()
440
436
  .onFilterChange(columnKey, newValue === '' ? null : newValue);
441
437
  }}
442
- placeholder={`Filter ${header}`}
438
+ placeholder={t('@astryx.tableFiltering.filterByColumn', {header})}
443
439
  size={size}
444
440
  hasClear={hasClear}
445
441
  />
@@ -459,6 +455,7 @@ function NumberFilterControl({
459
455
  size: 'sm' | 'md';
460
456
  hasClear?: boolean;
461
457
  }) {
458
+ const t = useTranslator();
462
459
  const store = useFilterStore();
463
460
  const config = store.getConfig();
464
461
  const value = config.filters[columnKey];
@@ -476,11 +473,11 @@ function NumberFilterControl({
476
473
  if (hasClear) {
477
474
  return (
478
475
  <NumberInput
479
- label={`Filter ${header}`}
476
+ label={t('@astryx.tableFiltering.filterByColumn', {header})}
480
477
  isLabelHidden
481
478
  value={numValue}
482
479
  onChange={handleChange}
483
- placeholder={`Filter ${header}`}
480
+ placeholder={t('@astryx.tableFiltering.filterByColumn', {header})}
484
481
  min={operatorValue.minValue ?? null}
485
482
  max={operatorValue.maxValue ?? null}
486
483
  step={step}
@@ -492,11 +489,11 @@ function NumberFilterControl({
492
489
 
493
490
  return (
494
491
  <NumberInput
495
- label={`Filter ${header}`}
492
+ label={t('@astryx.tableFiltering.filterByColumn', {header})}
496
493
  isLabelHidden
497
494
  value={numValue}
498
495
  onChange={handleChange}
499
- placeholder={`Filter ${header}`}
496
+ placeholder={t('@astryx.tableFiltering.filterByColumn', {header})}
500
497
  min={operatorValue.minValue ?? null}
501
498
  max={operatorValue.maxValue ?? null}
502
499
  step={step}
@@ -518,6 +515,7 @@ function SelectorFilterControl({
518
515
  size: 'sm' | 'md';
519
516
  hasClear?: boolean;
520
517
  }) {
518
+ const t = useTranslator();
521
519
  const store = useFilterStore();
522
520
  const config = store.getConfig();
523
521
  const value = config.filters[columnKey];
@@ -543,12 +541,12 @@ function SelectorFilterControl({
543
541
  if (hasClear) {
544
542
  return (
545
543
  <Selector
546
- label={`Filter ${header}`}
544
+ label={t('@astryx.tableFiltering.filterByColumn', {header})}
547
545
  isLabelHidden
548
546
  options={options}
549
547
  value={strValue || null}
550
548
  onChange={handleChange}
551
- placeholder="All"
549
+ placeholder={t('@astryx.table.filter.allPlaceholder')}
552
550
  size={size}
553
551
  hasClear
554
552
  />
@@ -557,12 +555,12 @@ function SelectorFilterControl({
557
555
 
558
556
  return (
559
557
  <Selector
560
- label={`Filter ${header}`}
558
+ label={t('@astryx.tableFiltering.filterByColumn', {header})}
561
559
  isLabelHidden
562
560
  options={options}
563
561
  value={strValue}
564
562
  onChange={handleChange}
565
- placeholder="All"
563
+ placeholder={t('@astryx.table.filter.allPlaceholder')}
566
564
  size={size}
567
565
  />
568
566
  );
@@ -581,6 +579,7 @@ function MultiSelectorFilterControl({
581
579
  size: 'sm' | 'md';
582
580
  hasClear?: boolean;
583
581
  }) {
582
+ const t = useTranslator();
584
583
  const store = useFilterStore();
585
584
  const config = store.getConfig();
586
585
  const value = config.filters[columnKey];
@@ -593,7 +592,7 @@ function MultiSelectorFilterControl({
593
592
 
594
593
  return (
595
594
  <MultiSelector
596
- label={`Filter ${header}`}
595
+ label={t('@astryx.tableFiltering.filterByColumn', {header})}
597
596
  isLabelHidden
598
597
  options={options}
599
598
  value={arrValue}
@@ -602,7 +601,7 @@ function MultiSelectorFilterControl({
602
601
  .getConfig()
603
602
  .onFilterChange(columnKey, newValue.length === 0 ? null : newValue);
604
603
  }}
605
- placeholder="All"
604
+ placeholder={t('@astryx.table.filter.allPlaceholder')}
606
605
  size={size}
607
606
  hasSelectAll
608
607
  hasSearch={false}
@@ -622,12 +621,13 @@ function DateFilterControl({
622
621
  size: 'sm' | 'md';
623
622
  hasClear?: boolean;
624
623
  }) {
624
+ const t = useTranslator();
625
625
  const store = useFilterStore();
626
626
  const value = store.getConfig().filters[columnKey] as string | undefined;
627
627
 
628
628
  return (
629
629
  <DateInput
630
- label={`Filter ${header}`}
630
+ label={t('@astryx.tableFiltering.filterByColumn', {header})}
631
631
  isLabelHidden
632
632
  value={(value as ISODateString | undefined) ?? undefined}
633
633
  onChange={newValue => {
@@ -650,12 +650,13 @@ function TimeFilterControl({
650
650
  size: 'sm' | 'md';
651
651
  hasClear?: boolean;
652
652
  }) {
653
+ const t = useTranslator();
653
654
  const store = useFilterStore();
654
655
  const value = store.getConfig().filters[columnKey] as string | undefined;
655
656
 
656
657
  return (
657
658
  <TimeInput
658
- label={`Filter ${header}`}
659
+ label={t('@astryx.tableFiltering.filterByColumn', {header})}
659
660
  isLabelHidden
660
661
  value={(value as ISOTimeString | undefined) ?? undefined}
661
662
  onChange={newValue => {
@@ -680,6 +681,7 @@ function StringListFilterControl({
680
681
  size: 'sm' | 'md';
681
682
  hasClear?: boolean;
682
683
  }) {
684
+ const t = useTranslator();
683
685
  const store = useFilterStore();
684
686
  const value =
685
687
  (store.getConfig().filters[columnKey] as string[] | undefined) ?? [];
@@ -699,7 +701,7 @@ function StringListFilterControl({
699
701
 
700
702
  return (
701
703
  <Tokenizer
702
- label={`Filter ${header}`}
704
+ label={t('@astryx.tableFiltering.filterByColumn', {header})}
703
705
  isLabelHidden
704
706
  searchSource={searchSource}
705
707
  value={value.map(v => ({id: v, label: v}))}
@@ -821,6 +823,7 @@ function PopoverFilterTrigger({
821
823
  header: string;
822
824
  operatorValue: OperatorValue;
823
825
  }) {
826
+ const t = useTranslator();
824
827
  const store = useFilterStore();
825
828
  const config = store.getConfig();
826
829
  const value = config.filters[columnKey];
@@ -876,7 +879,7 @@ function PopoverFilterTrigger({
876
879
  <Popover
877
880
  isOpen={isOpen}
878
881
  onOpenChange={handleOpen}
879
- label={`Filter ${header}`}
882
+ label={t('@astryx.tableFiltering.filterByColumn', {header})}
880
883
  placement="below"
881
884
  alignment="start"
882
885
  content={
@@ -890,14 +893,14 @@ function PopoverFilterTrigger({
890
893
  />
891
894
  <div {...stylex.props(filterStyles.popoverActions)}>
892
895
  <Button
893
- label="Reset"
896
+ label={t('@astryx.table.filter.reset')}
894
897
  variant="ghost"
895
898
  size="sm"
896
899
  onClick={handleClear}
897
900
  />
898
901
  <div {...stylex.props(filterStyles.popoverActionsSpacer)} />
899
902
  <Button
900
- label="Apply"
903
+ label={t('@astryx.table.filter.apply')}
901
904
  variant="primary"
902
905
  size="sm"
903
906
  onClick={handleApply}
@@ -908,7 +911,7 @@ function PopoverFilterTrigger({
908
911
  }>
909
912
  <button
910
913
  type="button"
911
- aria-label={`Filter ${header}`}
914
+ aria-label={t('@astryx.tableFiltering.filterByColumn', {header})}
912
915
  aria-haspopup="dialog"
913
916
  {...stylex.props(
914
917
  filterStyles.triggerButton,
@@ -928,9 +931,7 @@ function PopoverFilterTrigger({
928
931
  // Helper
929
932
  // =============================================================================
930
933
 
931
- function getHeaderString(
932
- column: TableColumn<Record<string, unknown>>,
933
- ): string {
934
+ function getHeaderString(column: TableColumn<Record<string, unknown>>): string {
934
935
  if (typeof column.header === 'string') {
935
936
  return column.header;
936
937
  }
@@ -0,0 +1,7 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ export {useTableGroupedRows} from './useTableGroupedRows';
4
+ export type {
5
+ UseTableGroupedRowsConfig,
6
+ UseTableGroupedRowsResult,
7
+ } from './useTableGroupedRows';
@@ -0,0 +1,231 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ import {describe, it, expect} from 'vitest';
4
+ import {render, screen, fireEvent, within} from '@testing-library/react';
5
+ import {useState, useCallback} from 'react';
6
+ import {Table} from '../../Table';
7
+ import type {TableColumn} from '../../types';
8
+ import {useTableGroupedRows} from './useTableGroupedRows';
9
+
10
+ interface Person extends Record<string, unknown> {
11
+ id: string;
12
+ name: string;
13
+ team: string;
14
+ }
15
+
16
+ const people: Person[] = [
17
+ {id: 'a', name: 'Alice', team: 'Core'},
18
+ {id: 'b', name: 'Bob', team: 'Core'},
19
+ {id: 'c', name: 'Carol', team: 'Infra'},
20
+ ];
21
+
22
+ const columns: TableColumn<Person>[] = [{key: 'name', header: 'Name'}];
23
+
24
+ const EMPTY = new Set<string>();
25
+
26
+ function Harness({
27
+ rows = people,
28
+ initialCollapsed = EMPTY,
29
+ renderGroupHeader,
30
+ }: {
31
+ rows?: Person[];
32
+ initialCollapsed?: Set<string>;
33
+ renderGroupHeader?: (
34
+ groupKey: string,
35
+ count: number,
36
+ collapsed: boolean,
37
+ ) => React.ReactNode;
38
+ }) {
39
+ const [collapsedGroups, setCollapsed] = useState(initialCollapsed);
40
+ const onToggleGroup = useCallback((key: string) => {
41
+ setCollapsed(prev => {
42
+ const next = new Set(prev);
43
+ if (next.has(key)) {
44
+ next.delete(key);
45
+ } else {
46
+ next.add(key);
47
+ }
48
+ return next;
49
+ });
50
+ }, []);
51
+ const grouped = useTableGroupedRows<Person>({
52
+ data: rows,
53
+ groupBy: p => p.team,
54
+ collapsedGroups,
55
+ onToggleGroup,
56
+ getRowKey: p => p.id,
57
+ renderGroupHeader,
58
+ });
59
+ return (
60
+ <Table
61
+ data={grouped.data}
62
+ columns={columns}
63
+ idKey={grouped.idKey}
64
+ plugins={{grouped: grouped.plugin}}
65
+ />
66
+ );
67
+ }
68
+
69
+ describe('useTableGroupedRows', () => {
70
+ it('renders a header row per group with label and count', () => {
71
+ render(<Harness />);
72
+ // Two groups: Core (2), Infra (1).
73
+ expect(screen.getByText('Core')).toBeInTheDocument();
74
+ expect(screen.getByText('(2)')).toBeInTheDocument();
75
+ expect(screen.getByText('Infra')).toBeInTheDocument();
76
+ expect(screen.getByText('(1)')).toBeInTheDocument();
77
+ });
78
+
79
+ it('shows group members when expanded', () => {
80
+ render(<Harness />);
81
+ expect(screen.getByText('Alice')).toBeInTheDocument();
82
+ expect(screen.getByText('Bob')).toBeInTheDocument();
83
+ expect(screen.getByText('Carol')).toBeInTheDocument();
84
+ });
85
+
86
+ it('hides members of a collapsed group but keeps the header', () => {
87
+ render(<Harness initialCollapsed={new Set(['Core'])} />);
88
+ expect(screen.getByText('Core')).toBeInTheDocument();
89
+ expect(screen.queryByText('Alice')).not.toBeInTheDocument();
90
+ expect(screen.queryByText('Bob')).not.toBeInTheDocument();
91
+ // Other group unaffected.
92
+ expect(screen.getByText('Carol')).toBeInTheDocument();
93
+ });
94
+
95
+ it('toggles a group via its chevron and back again', () => {
96
+ render(<Harness />);
97
+ expect(screen.getByText('Alice')).toBeInTheDocument();
98
+ // The standalone chevron button toggles the group; its accessible name is
99
+ // qualified with the group key.
100
+ fireEvent.click(screen.getByRole('button', {name: 'Collapse group Core'}));
101
+ expect(screen.queryByText('Alice')).not.toBeInTheDocument();
102
+ expect(screen.queryByText('Bob')).not.toBeInTheDocument();
103
+ expect(screen.getByText('Core')).toBeInTheDocument();
104
+ expect(screen.getByText('Carol')).toBeInTheDocument();
105
+ // Toggle back: the Core chevron now says "Expand group Core".
106
+ fireEvent.click(screen.getByRole('button', {name: 'Expand group Core'}));
107
+ expect(screen.getByText('Alice')).toBeInTheDocument();
108
+ expect(screen.getByText('Bob')).toBeInTheDocument();
109
+ });
110
+
111
+ it('exposes each group toggle as a named, keyboard-operable button', () => {
112
+ render(<Harness />);
113
+ // Native <button>: focusable and operable without a custom key handler.
114
+ const coreToggle = screen.getByRole('button', {
115
+ name: 'Collapse group Core',
116
+ });
117
+ expect(coreToggle.tagName).toBe('BUTTON');
118
+ expect(coreToggle).toHaveAttribute('aria-expanded', 'true');
119
+ });
120
+
121
+ it('sets aria-expanded on the header row reflecting collapse state', () => {
122
+ render(<Harness initialCollapsed={new Set(['Core'])} />);
123
+ const rows = screen.getAllByRole('row');
124
+ // rows[1] = Core header (collapsed), rows[2] = Infra header (expanded).
125
+ expect(rows[1]).toHaveAttribute('aria-expanded', 'false');
126
+ expect(rows[2]).toHaveAttribute('aria-expanded', 'true');
127
+ });
128
+
129
+ it('respects groupOrder in the flattened data', () => {
130
+ function OrderedHarness() {
131
+ const [collapsed, setCollapsed] = useState<Set<string>>(new Set());
132
+ const grouped = useTableGroupedRows<Person>({
133
+ data: people,
134
+ groupBy: p => p.team,
135
+ collapsedGroups: collapsed,
136
+ onToggleGroup: k => setCollapsed(new Set([k])),
137
+ getRowKey: p => p.id,
138
+ groupOrder: ['Infra', 'Core'],
139
+ });
140
+ expect(grouped.data.length).toBeGreaterThan(0);
141
+ return (
142
+ <Table
143
+ data={grouped.data}
144
+ columns={columns}
145
+ idKey={grouped.idKey}
146
+ plugins={{grouped: grouped.plugin}}
147
+ />
148
+ );
149
+ }
150
+ render(<OrderedHarness />);
151
+ const rows = screen.getAllByRole('row');
152
+ // rows[0] = column header; rows[1] = first group header (Infra).
153
+ expect(within(rows[1]).getByText('Infra')).toBeInTheDocument();
154
+ });
155
+
156
+ it('renders custom group header content via renderGroupHeader', () => {
157
+ render(
158
+ <Harness
159
+ renderGroupHeader={(key, count, collapsed) => (
160
+ <span>{`${key}::${count}::${collapsed ? 'closed' : 'open'}`}</span>
161
+ )}
162
+ />,
163
+ );
164
+ expect(screen.getByText('Core::2::open')).toBeInTheDocument();
165
+ expect(screen.getByText('Infra::1::open')).toBeInTheDocument();
166
+ });
167
+
168
+ it('renders nothing (no group headers) for empty data', () => {
169
+ render(<Harness rows={[]} />);
170
+ // Column header row still renders; no group header rows.
171
+ expect(screen.queryByText('Core')).not.toBeInTheDocument();
172
+ expect(screen.queryByText('Infra')).not.toBeInTheDocument();
173
+ expect(
174
+ screen.queryByRole('button', {name: /group/i}),
175
+ ).not.toBeInTheDocument();
176
+ });
177
+
178
+ it('keeps a group collapsed across a data change (state keyed by group)', () => {
179
+ function ChangingHarness() {
180
+ const [collapsed, setCollapsed] = useState<Set<string>>(
181
+ new Set(['Core']),
182
+ );
183
+ const [rows, setRows] = useState(people);
184
+ const onToggleGroup = useCallback((key: string) => {
185
+ setCollapsed(prev => {
186
+ const next = new Set(prev);
187
+ if (next.has(key)) {
188
+ next.delete(key);
189
+ } else {
190
+ next.add(key);
191
+ }
192
+ return next;
193
+ });
194
+ }, []);
195
+ const grouped = useTableGroupedRows<Person>({
196
+ data: rows,
197
+ groupBy: p => p.team,
198
+ collapsedGroups: collapsed,
199
+ onToggleGroup,
200
+ getRowKey: p => p.id,
201
+ });
202
+ return (
203
+ <>
204
+ <button
205
+ type="button"
206
+ onClick={() =>
207
+ setRows([...people, {id: 'd', name: 'Dave', team: 'Core'}])
208
+ }>
209
+ add
210
+ </button>
211
+ <Table
212
+ data={grouped.data}
213
+ columns={columns}
214
+ idKey={grouped.idKey}
215
+ plugins={{grouped: grouped.plugin}}
216
+ />
217
+ </>
218
+ );
219
+ }
220
+ render(<ChangingHarness />);
221
+ // Core collapsed initially: Alice hidden.
222
+ expect(screen.queryByText('Alice')).not.toBeInTheDocument();
223
+ // Add a new Core member; Core must stay collapsed (keyed by group value).
224
+ fireEvent.click(screen.getByText('add'));
225
+ expect(screen.queryByText('Alice')).not.toBeInTheDocument();
226
+ expect(screen.queryByText('Dave')).not.toBeInTheDocument();
227
+ // Count reflects the new member (3), header still present.
228
+ expect(screen.getByText('Core')).toBeInTheDocument();
229
+ expect(screen.getByText('(3)')).toBeInTheDocument();
230
+ });
231
+ });