@astryxdesign/core 0.1.3 → 0.1.4-canary.01e5b29

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 (642) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +20 -18
  5. package/dist/AlertDialog/useImperativeAlertDialog.js +3 -3
  6. package/dist/AppShell/AppShell.d.ts +1 -1
  7. package/dist/AppShell/AppShell.d.ts.map +1 -1
  8. package/dist/AppShell/AppShell.js +55 -53
  9. package/dist/AspectRatio/AspectRatio.js +5 -5
  10. package/dist/Avatar/Avatar.d.ts.map +1 -1
  11. package/dist/Avatar/Avatar.js +27 -25
  12. package/dist/Avatar/AvatarStatusDot.js +5 -5
  13. package/dist/AvatarGroup/AvatarGroup.js +5 -5
  14. package/dist/AvatarGroup/AvatarGroupOverflow.js +5 -5
  15. package/dist/Badge/Badge.js +3 -3
  16. package/dist/Banner/Banner.d.ts.map +1 -1
  17. package/dist/Banner/Banner.js +32 -25
  18. package/dist/Blockquote/Blockquote.js +7 -7
  19. package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
  20. package/dist/Breadcrumbs/Breadcrumbs.js +7 -7
  21. package/dist/Button/Button.d.ts.map +1 -1
  22. package/dist/Button/Button.js +47 -26
  23. package/dist/ButtonGroup/ButtonGroup.js +7 -7
  24. package/dist/Calendar/Calendar.d.ts.map +1 -1
  25. package/dist/Calendar/Calendar.js +108 -64
  26. package/dist/Calendar/dayCellUtils.d.ts +67 -5
  27. package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
  28. package/dist/Calendar/dayCellUtils.js +139 -18
  29. package/dist/Calendar/styles.d.ts +2 -2
  30. package/dist/Calendar/styles.d.ts.map +1 -1
  31. package/dist/Calendar/styles.js +2 -2
  32. package/dist/Card/Card.d.ts +4 -2
  33. package/dist/Card/Card.d.ts.map +1 -1
  34. package/dist/Card/Card.js +18 -10
  35. package/dist/Carousel/Carousel.d.ts.map +1 -1
  36. package/dist/Carousel/Carousel.js +20 -19
  37. package/dist/Center/Center.js +3 -3
  38. package/dist/Chat/ChatComposer.js +23 -23
  39. package/dist/Chat/ChatComposerDrawer.js +14 -14
  40. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  41. package/dist/Chat/ChatComposerInput.js +27 -15
  42. package/dist/Chat/ChatDictationButton.d.ts +1 -1
  43. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  44. package/dist/Chat/ChatDictationButton.js +13 -11
  45. package/dist/Chat/ChatLayout.js +17 -17
  46. package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
  47. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  48. package/dist/Chat/ChatLayoutScrollButton.js +12 -10
  49. package/dist/Chat/ChatMessage.js +12 -12
  50. package/dist/Chat/ChatMessageBubble.js +7 -7
  51. package/dist/Chat/ChatMessageList.js +14 -14
  52. package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
  53. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  54. package/dist/Chat/ChatMessageMetadata.js +14 -12
  55. package/dist/Chat/ChatPastedTextToken.js +13 -13
  56. package/dist/Chat/ChatSendButton.js +3 -3
  57. package/dist/Chat/ChatSystemMessage.d.ts +1 -1
  58. package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
  59. package/dist/Chat/ChatSystemMessage.js +17 -17
  60. package/dist/Chat/ChatTokenizedText.d.ts +1 -1
  61. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  62. package/dist/Chat/ChatTokenizedText.js +24 -15
  63. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  64. package/dist/Chat/ChatToolCalls.js +81 -74
  65. package/dist/Chat/index.d.ts +1 -1
  66. package/dist/Chat/index.d.ts.map +1 -1
  67. package/dist/Chat/useTriggerMenu.js +15 -15
  68. package/dist/CheckboxInput/CheckboxInput.d.ts +6 -1
  69. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  70. package/dist/CheckboxInput/CheckboxInput.js +32 -24
  71. package/dist/CheckboxList/CheckboxList.js +9 -9
  72. package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
  73. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  74. package/dist/CheckboxList/CheckboxListItem.js +8 -6
  75. package/dist/Citation/Citation.js +10 -10
  76. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  77. package/dist/ClickableCard/ClickableCard.js +32 -9
  78. package/dist/Code/Code.d.ts +15 -1
  79. package/dist/Code/Code.d.ts.map +1 -1
  80. package/dist/Code/Code.js +35 -5
  81. package/dist/Code/index.d.ts +1 -1
  82. package/dist/Code/index.d.ts.map +1 -1
  83. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  84. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  85. package/dist/CodeBlock/CodeBlock.js +88 -52
  86. package/dist/CodeBlock/index.d.ts +1 -1
  87. package/dist/CodeBlock/index.d.ts.map +1 -1
  88. package/dist/Collapsible/Collapsible.d.ts +9 -3
  89. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  90. package/dist/Collapsible/Collapsible.js +110 -22
  91. package/dist/Collapsible/CollapsibleGroup.d.ts +39 -7
  92. package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
  93. package/dist/Collapsible/CollapsibleGroup.js +73 -12
  94. package/dist/Collapsible/CollapsibleGroupContext.d.ts +31 -0
  95. package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
  96. package/dist/Collapsible/CollapsibleGroupContext.js +33 -3
  97. package/dist/Collapsible/index.d.ts +1 -0
  98. package/dist/Collapsible/index.d.ts.map +1 -1
  99. package/dist/Collapsible/useCollapsible.d.ts +4 -1
  100. package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
  101. package/dist/Collapsible/useCollapsible.js +20 -6
  102. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  103. package/dist/CommandPalette/CommandPalette.js +36 -34
  104. package/dist/CommandPalette/CommandPaletteEmpty.d.ts +1 -1
  105. package/dist/CommandPalette/CommandPaletteEmpty.d.ts.map +1 -1
  106. package/dist/CommandPalette/CommandPaletteEmpty.js +27 -7
  107. package/dist/CommandPalette/CommandPaletteFooter.js +16 -16
  108. package/dist/CommandPalette/CommandPaletteGroup.js +5 -5
  109. package/dist/CommandPalette/CommandPaletteInput.js +13 -13
  110. package/dist/CommandPalette/CommandPaletteItem.js +3 -3
  111. package/dist/CommandPalette/CommandPaletteList.js +3 -3
  112. package/dist/ContextMenu/ContextMenu.d.ts +9 -1
  113. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  114. package/dist/ContextMenu/ContextMenu.js +16 -11
  115. package/dist/DateInput/DateInput.js +18 -18
  116. package/dist/DateRangeInput/DateRangeInput.js +23 -23
  117. package/dist/DateTimeInput/DateTimeInput.d.ts +5 -7
  118. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  119. package/dist/DateTimeInput/DateTimeInput.js +30 -26
  120. package/dist/DateTimeInput/index.d.ts +1 -1
  121. package/dist/DateTimeInput/index.d.ts.map +1 -1
  122. package/dist/Dialog/Dialog.js +9 -9
  123. package/dist/Dialog/DialogHeader.js +16 -16
  124. package/dist/Dialog/useImperativeDialog.js +3 -3
  125. package/dist/Divider/Divider.d.ts +0 -22
  126. package/dist/Divider/Divider.d.ts.map +1 -1
  127. package/dist/Divider/Divider.js +7 -7
  128. package/dist/DropdownMenu/DropdownMenu.js +10 -10
  129. package/dist/DropdownMenu/DropdownMenuItem.d.ts +2 -17
  130. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  131. package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
  132. package/dist/DropdownMenu/renderDropdownItems.js +10 -10
  133. package/dist/EmptyState/EmptyState.js +9 -9
  134. package/dist/Field/Field.js +17 -17
  135. package/dist/Field/FieldLabel.js +15 -15
  136. package/dist/Field/InputClearButton.js +5 -5
  137. package/dist/FieldStatus/FieldStatus.js +3 -3
  138. package/dist/FileInput/FileInput.js +29 -29
  139. package/dist/FormLayout/FormLayout.js +5 -5
  140. package/dist/Grid/Grid.d.ts +4 -3
  141. package/dist/Grid/Grid.d.ts.map +1 -1
  142. package/dist/Grid/Grid.js +29 -12
  143. package/dist/Grid/GridSpan.js +3 -3
  144. package/dist/HStack/HStack.js +3 -3
  145. package/dist/Heading/Heading.js +10 -10
  146. package/dist/HoverCard/HoverCard.js +9 -9
  147. package/dist/HoverCard/useHoverCard.js +3 -3
  148. package/dist/Icon/Icon.d.ts.map +1 -1
  149. package/dist/Icon/Icon.js +16 -12
  150. package/dist/Icon/defaultIcons.js +116 -116
  151. package/dist/IconButton/IconButton.js +3 -3
  152. package/dist/InputGroup/InputGroup.js +11 -11
  153. package/dist/InputGroup/InputGroupText.js +3 -3
  154. package/dist/Item/Item.js +18 -18
  155. package/dist/Kbd/Kbd.js +5 -5
  156. package/dist/Layer/LayerProvider.js +7 -7
  157. package/dist/Layer/useLayer.js +5 -5
  158. package/dist/Layout/Layout.js +21 -21
  159. package/dist/Layout/LayoutContent.js +3 -3
  160. package/dist/Layout/LayoutFooter.js +5 -5
  161. package/dist/Layout/LayoutHeader.js +5 -5
  162. package/dist/Layout/LayoutPanel.js +3 -3
  163. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  164. package/dist/Lightbox/Lightbox.js +55 -31
  165. package/dist/Lightbox/useLightbox.js +3 -3
  166. package/dist/Link/Link.js +15 -15
  167. package/dist/Link/LinkProvider.js +3 -3
  168. package/dist/Link/useLinkify.js +3 -3
  169. package/dist/List/List.js +11 -11
  170. package/dist/List/ListItem.js +11 -11
  171. package/dist/Markdown/Markdown.d.ts.map +1 -1
  172. package/dist/Markdown/Markdown.js +102 -102
  173. package/dist/Markdown/parser.d.ts +7 -0
  174. package/dist/Markdown/parser.d.ts.map +1 -1
  175. package/dist/Markdown/parser.js +300 -6
  176. package/dist/MetadataList/MetadataList.js +10 -10
  177. package/dist/MetadataList/MetadataListItem.js +15 -15
  178. package/dist/MobileNav/MobileNav.js +15 -15
  179. package/dist/MobileNav/MobileNavToggle.js +5 -5
  180. package/dist/MoreMenu/MoreMenu.js +3 -3
  181. package/dist/MultiSelector/MultiSelector.d.ts +7 -1
  182. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  183. package/dist/MultiSelector/MultiSelector.js +64 -55
  184. package/dist/NavIcon/NavIcon.js +3 -3
  185. package/dist/NavMenu/NavHeadingMenu.js +5 -5
  186. package/dist/NavMenu/NavHeadingMenuItem.js +8 -8
  187. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  188. package/dist/NumberInput/NumberInput.js +48 -32
  189. package/dist/Outline/Outline.js +15 -15
  190. package/dist/OverflowList/OverflowList.js +8 -8
  191. package/dist/Overlay/Overlay.js +3 -3
  192. package/dist/Overlay/OverlayScrim.js +5 -5
  193. package/dist/Overlay/useOverlay.js +3 -3
  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 +125 -72
  197. package/dist/Popover/Popover.js +16 -16
  198. package/dist/Popover/usePopover.js +7 -7
  199. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  200. package/dist/PowerSearch/PowerSearch.js +110 -92
  201. package/dist/PowerSearch/PowerSearchEditPopover.js +84 -84
  202. package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
  203. package/dist/PowerSearch/PowerSearchToken.js +5 -5
  204. package/dist/PowerSearch/PowerSearchValueEditor.js +54 -54
  205. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  206. package/dist/ProgressBar/ProgressBar.js +25 -18
  207. package/dist/RadioList/RadioList.d.ts +7 -1
  208. package/dist/RadioList/RadioList.d.ts.map +1 -1
  209. package/dist/RadioList/RadioList.js +10 -8
  210. package/dist/RadioList/RadioListItem.d.ts +1 -1
  211. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  212. package/dist/RadioList/RadioListItem.js +30 -22
  213. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  214. package/dist/Resizable/ResizeHandle.js +28 -10
  215. package/dist/Section/Section.js +5 -5
  216. package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
  217. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  218. package/dist/SegmentedControl/SegmentedControl.js +32 -10
  219. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
  220. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  221. package/dist/SegmentedControl/SegmentedControlItem.js +18 -12
  222. package/dist/SelectableCard/SelectableCard.js +5 -5
  223. package/dist/Selector/Selector.d.ts +6 -0
  224. package/dist/Selector/Selector.d.ts.map +1 -1
  225. package/dist/Selector/Selector.js +54 -45
  226. package/dist/Selector/SelectorOption.js +3 -3
  227. package/dist/SideNav/SideNav.d.ts.map +1 -1
  228. package/dist/SideNav/SideNav.js +38 -34
  229. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  230. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  231. package/dist/SideNav/SideNavCollapseButton.js +8 -6
  232. package/dist/SideNav/SideNavHeading.js +87 -87
  233. package/dist/SideNav/SideNavItem.js +42 -42
  234. package/dist/SideNav/SideNavSection.d.ts +1 -1
  235. package/dist/SideNav/SideNavSection.d.ts.map +1 -1
  236. package/dist/SideNav/SideNavSection.js +18 -16
  237. package/dist/Skeleton/Skeleton.js +3 -3
  238. package/dist/Slider/Slider.d.ts +6 -0
  239. package/dist/Slider/Slider.d.ts.map +1 -1
  240. package/dist/Slider/Slider.js +31 -22
  241. package/dist/Spinner/Spinner.d.ts.map +1 -1
  242. package/dist/Spinner/Spinner.js +10 -10
  243. package/dist/StatusDot/StatusDot.js +5 -5
  244. package/dist/Switch/Switch.d.ts +13 -4
  245. package/dist/Switch/Switch.d.ts.map +1 -1
  246. package/dist/Switch/Switch.js +41 -30
  247. package/dist/TabList/Tab.js +18 -18
  248. package/dist/TabList/TabList.js +5 -5
  249. package/dist/TabList/TabMenu.d.ts.map +1 -1
  250. package/dist/TabList/TabMenu.js +57 -30
  251. package/dist/TabList/tab.markers.stylex.d.ts +1 -1
  252. package/dist/Table/BaseTable.d.ts.map +1 -1
  253. package/dist/Table/BaseTable.js +51 -39
  254. package/dist/Table/Table.js +7 -7
  255. package/dist/Table/TableBody.d.ts +1 -1
  256. package/dist/Table/TableBody.d.ts.map +1 -1
  257. package/dist/Table/TableBody.js +9 -5
  258. package/dist/Table/TableCell.d.ts.map +1 -1
  259. package/dist/Table/TableCell.js +76 -7
  260. package/dist/Table/TableFooter.d.ts +1 -1
  261. package/dist/Table/TableFooter.d.ts.map +1 -1
  262. package/dist/Table/TableFooter.js +9 -5
  263. package/dist/Table/TableHeader.d.ts +1 -1
  264. package/dist/Table/TableHeader.d.ts.map +1 -1
  265. package/dist/Table/TableHeader.js +9 -5
  266. package/dist/Table/TableHeaderCell.js +3 -3
  267. package/dist/Table/TableRow.js +5 -5
  268. package/dist/Table/index.d.ts +2 -0
  269. package/dist/Table/index.d.ts.map +1 -1
  270. package/dist/Table/index.js +1 -0
  271. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  272. package/dist/Table/plugins/columnResize/useTableColumnResize.js +14 -11
  273. package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
  274. package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
  275. package/dist/Table/plugins/pagination/paginateData.js +5 -1
  276. package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
  277. package/dist/Table/plugins/rowExpansion/index.d.ts +3 -0
  278. package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -0
  279. package/dist/Table/plugins/rowExpansion/index.js +3 -0
  280. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +90 -0
  281. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -0
  282. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +398 -0
  283. package/dist/Table/plugins/selection/useTableSelection.js +18 -18
  284. package/dist/Table/plugins/selection/useTableSelectionState.d.ts.map +1 -1
  285. package/dist/Table/plugins/selection/useTableSelectionState.js +11 -1
  286. package/dist/Table/plugins/sortable/useTableSortable.js +17 -17
  287. package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
  288. package/dist/Table/plugins/sortable/useTableSortableState.js +8 -4
  289. package/dist/Table/tableContextMenu.d.ts +5 -1
  290. package/dist/Table/tableContextMenu.d.ts.map +1 -1
  291. package/dist/Table/tableContextMenu.js +19 -12
  292. package/dist/Text/Text.d.ts +1 -1
  293. package/dist/Text/Text.d.ts.map +1 -1
  294. package/dist/Text/Text.js +14 -13
  295. package/dist/Text/text.stylex.d.ts +35 -0
  296. package/dist/Text/text.stylex.d.ts.map +1 -1
  297. package/dist/Text/text.stylex.js +52 -1
  298. package/dist/TextArea/TextArea.js +14 -14
  299. package/dist/TextInput/TextInput.js +15 -15
  300. package/dist/Thumbnail/Thumbnail.d.ts +3 -2
  301. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  302. package/dist/Thumbnail/Thumbnail.js +30 -29
  303. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  304. package/dist/TimeInput/TimeInput.js +26 -21
  305. package/dist/Timestamp/Timestamp.d.ts +1 -1
  306. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  307. package/dist/Timestamp/Timestamp.js +37 -26
  308. package/dist/Toast/Toast.d.ts.map +1 -1
  309. package/dist/Toast/Toast.js +25 -17
  310. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  311. package/dist/Toast/ToastViewport.js +23 -11
  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.js +21 -21
  316. package/dist/Tokenizer/Tokenizer.d.ts +6 -1
  317. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  318. package/dist/Tokenizer/Tokenizer.js +38 -29
  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.js +32 -32
  323. package/dist/TopNav/TopNavHeading.js +67 -67
  324. package/dist/TopNav/TopNavItem.js +5 -5
  325. package/dist/TopNav/TopNavMegaMenu.js +30 -30
  326. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
  327. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  328. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +25 -14
  329. package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
  330. package/dist/TopNav/TopNavMenu.js +32 -32
  331. package/dist/TreeList/TreeList.js +8 -8
  332. package/dist/TreeList/TreeListBranches.js +11 -11
  333. package/dist/TreeList/TreeListItem.js +30 -30
  334. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  335. package/dist/Typeahead/BaseTypeahead.js +23 -20
  336. package/dist/Typeahead/Typeahead.js +12 -12
  337. package/dist/Typeahead/TypeaheadItem.js +10 -10
  338. package/dist/VStack/VStack.js +3 -3
  339. package/dist/astryx.css +23 -0
  340. package/dist/astryx.umd.js +60 -58
  341. package/dist/astryx.umd.js.map +4 -4
  342. package/dist/docs-types.d.ts +13 -1
  343. package/dist/docs-types.d.ts.map +1 -1
  344. package/dist/hooks/focusableSelector.d.ts +1 -1
  345. package/dist/hooks/focusableSelector.d.ts.map +1 -1
  346. package/dist/hooks/focusableSelector.js +1 -1
  347. package/dist/hooks/index.d.ts +2 -0
  348. package/dist/hooks/index.d.ts.map +1 -1
  349. package/dist/hooks/index.js +1 -0
  350. package/dist/hooks/useFocusTrap.d.ts +3 -0
  351. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  352. package/dist/hooks/useFocusTrap.js +38 -1
  353. package/dist/hooks/useHotkeys.d.ts +51 -0
  354. package/dist/hooks/useHotkeys.d.ts.map +1 -0
  355. package/dist/hooks/useHotkeys.js +160 -0
  356. package/dist/hooks/useInteractiveRole.d.ts +6 -2
  357. package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
  358. package/dist/hooks/useInteractiveRole.js +6 -2
  359. package/dist/hooks/useKeyboardHint.js +9 -9
  360. package/dist/hooks/useStreamingText.d.ts +3 -1
  361. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  362. package/dist/hooks/useStreamingText.js +14 -5
  363. package/dist/theme/MediaTheme.js +3 -3
  364. package/dist/theme/Theme.js +7 -7
  365. package/dist/theme/defineTheme.d.ts +1 -1
  366. package/dist/theme/defineTheme.d.ts.map +1 -1
  367. package/dist/theme/expandColorScale.d.ts.map +1 -1
  368. package/dist/theme/expandColorScale.js +10 -3
  369. package/dist/theme/hct.d.ts +0 -15
  370. package/dist/theme/hct.d.ts.map +1 -1
  371. package/dist/theme/hct.js +9 -9
  372. package/dist/theme/syntax/SyntaxTheme.js +5 -5
  373. package/dist/theme/tokens.d.ts +10 -2
  374. package/dist/theme/tokens.d.ts.map +1 -1
  375. package/dist/theme/tokens.js +220 -4
  376. package/dist/utils/color.d.ts +42 -0
  377. package/dist/utils/color.d.ts.map +1 -0
  378. package/dist/utils/color.js +150 -0
  379. package/dist/utils/composeEventHandlers.d.ts +30 -0
  380. package/dist/utils/composeEventHandlers.d.ts.map +1 -0
  381. package/dist/utils/composeEventHandlers.js +40 -0
  382. package/dist/utils/index.d.ts +3 -0
  383. package/dist/utils/index.d.ts.map +1 -1
  384. package/dist/utils/index.js +3 -1
  385. package/dist/utils/timeParser.d.ts.map +1 -1
  386. package/dist/utils/timeParser.js +8 -5
  387. package/package.json +3 -3
  388. package/src/AlertDialog/AlertDialog.tsx +2 -0
  389. package/src/AppShell/AppShell.tsx +2 -0
  390. package/src/AspectRatio/AspectRatio.doc.mjs +1 -1
  391. package/src/Avatar/Avatar.doc.mjs +13 -2
  392. package/src/Avatar/Avatar.test.tsx +32 -1
  393. package/src/Avatar/Avatar.tsx +12 -20
  394. package/src/Banner/Banner.doc.mjs +8 -0
  395. package/src/Banner/Banner.test.tsx +38 -0
  396. package/src/Banner/Banner.tsx +8 -1
  397. package/src/Button/Button.tsx +39 -6
  398. package/src/ButtonGroup/ButtonGroup.doc.mjs +1 -1
  399. package/src/Calendar/Calendar.doc.mjs +1 -1
  400. package/src/Calendar/Calendar.test.tsx +201 -17
  401. package/src/Calendar/Calendar.tsx +79 -26
  402. package/src/Calendar/dayCellUtils.test.ts +306 -1
  403. package/src/Calendar/dayCellUtils.ts +206 -13
  404. package/src/Calendar/styles.ts +12 -2
  405. package/src/Card/Card.doc.mjs +1 -1
  406. package/src/Card/Card.tsx +16 -6
  407. package/src/Carousel/Carousel.doc.mjs +12 -12
  408. package/src/Carousel/Carousel.test.tsx +13 -0
  409. package/src/Carousel/Carousel.tsx +1 -0
  410. package/src/Chat/Chat.doc.mjs +1 -1
  411. package/src/Chat/ChatComposerInput.test.tsx +24 -0
  412. package/src/Chat/ChatComposerInput.tsx +17 -1
  413. package/src/Chat/ChatDictationButton.test.tsx +43 -0
  414. package/src/Chat/ChatDictationButton.tsx +4 -4
  415. package/src/Chat/ChatLayoutScrollButton.test.tsx +33 -0
  416. package/src/Chat/ChatLayoutScrollButton.tsx +3 -1
  417. package/src/Chat/ChatMessageMetadata.test.tsx +32 -0
  418. package/src/Chat/ChatMessageMetadata.tsx +4 -6
  419. package/src/Chat/ChatSystemMessage.test.tsx +26 -11
  420. package/src/Chat/ChatSystemMessage.tsx +7 -7
  421. package/src/Chat/ChatTokenizedText.test.tsx +29 -16
  422. package/src/Chat/ChatTokenizedText.tsx +15 -8
  423. package/src/Chat/ChatToolCalls.test.tsx +55 -0
  424. package/src/Chat/ChatToolCalls.tsx +10 -12
  425. package/src/Chat/index.ts +1 -4
  426. package/src/Chat/useChatNewMessages.test.tsx +4 -4
  427. package/src/CheckboxInput/CheckboxInput.doc.mjs +12 -4
  428. package/src/CheckboxInput/CheckboxInput.test.tsx +103 -0
  429. package/src/CheckboxInput/CheckboxInput.tsx +13 -0
  430. package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
  431. package/src/CheckboxList/CheckboxList.test.tsx +19 -0
  432. package/src/CheckboxList/CheckboxListItem.tsx +11 -2
  433. package/src/Citation/Citation.doc.mjs +5 -0
  434. package/src/ClickableCard/ClickableCard.tsx +45 -2
  435. package/src/Code/Code.test.tsx +54 -0
  436. package/src/Code/Code.tsx +48 -4
  437. package/src/Code/index.ts +1 -1
  438. package/src/CodeBlock/CodeBlock.doc.mjs +7 -2
  439. package/src/CodeBlock/CodeBlock.test.tsx +122 -3
  440. package/src/CodeBlock/CodeBlock.tsx +62 -4
  441. package/src/CodeBlock/index.ts +1 -1
  442. package/src/Collapsible/Collapsible.doc.mjs +8 -4
  443. package/src/Collapsible/Collapsible.test.tsx +405 -0
  444. package/src/Collapsible/Collapsible.tsx +86 -10
  445. package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
  446. package/src/Collapsible/CollapsibleGroup.test.tsx +318 -0
  447. package/src/Collapsible/CollapsibleGroup.tsx +107 -9
  448. package/src/Collapsible/CollapsibleGroupContext.tsx +42 -2
  449. package/src/Collapsible/index.ts +4 -0
  450. package/src/Collapsible/useCollapsible.ts +20 -6
  451. package/src/CommandPalette/CommandPalette.tsx +5 -3
  452. package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
  453. package/src/CommandPalette/CommandPaletteEmpty.tsx +15 -1
  454. package/src/CommandPalette/CommandPaletteGroup.doc.mjs +10 -0
  455. package/src/CommandPalette/CommandPaletteInput.doc.mjs +6 -0
  456. package/src/CommandPalette/CommandPaletteItem.doc.mjs +6 -0
  457. package/src/CommandPalette/CommandPaletteList.doc.mjs +9 -0
  458. package/src/ContextMenu/ContextMenu.doc.mjs +15 -0
  459. package/src/ContextMenu/ContextMenu.test.tsx +15 -0
  460. package/src/ContextMenu/ContextMenu.tsx +19 -1
  461. package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
  462. package/src/DateInput/DateInput.doc.mjs +6 -1
  463. package/src/DateInput/DateInput.test.tsx +11 -20
  464. package/src/DateRangeInput/DateRangeInput.doc.mjs +1 -1
  465. package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
  466. package/src/DateRangeInput/DateRangeInput.tsx +2 -2
  467. package/src/DateTimeInput/DateTimeInput.doc.mjs +4 -3
  468. package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
  469. package/src/DateTimeInput/DateTimeInput.tsx +9 -8
  470. package/src/DateTimeInput/index.ts +1 -0
  471. package/src/Dialog/DialogHeader.doc.mjs +45 -0
  472. package/src/Divider/Divider.tsx +1 -23
  473. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
  474. package/src/DropdownMenu/DropdownMenu.test.tsx +5 -3
  475. package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
  476. package/src/EmptyState/EmptyState.doc.mjs +1 -1
  477. package/src/Field/Field.doc.mjs +1 -1
  478. package/src/Field/FieldLabel.test.tsx +2 -2
  479. package/src/FieldStatus/FieldStatus.test.tsx +282 -0
  480. package/src/FileInput/FileInput.doc.mjs +1 -1
  481. package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
  482. package/src/Grid/Grid.doc.mjs +3 -3
  483. package/src/Grid/Grid.test.tsx +43 -18
  484. package/src/Grid/Grid.tsx +26 -9
  485. package/src/Icon/Icon.test.tsx +41 -29
  486. package/src/Icon/Icon.tsx +6 -2
  487. package/src/InputGroup/InputGroup.tsx +2 -2
  488. package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
  489. package/src/Item/Item.tsx +1 -1
  490. package/src/Layout/Layout.test.tsx +285 -0
  491. package/src/Layout/LayoutContent.doc.mjs +12 -0
  492. package/src/Layout/LayoutPanel.doc.mjs +40 -0
  493. package/src/Layout/LayoutSlots.test.tsx +364 -0
  494. package/src/Layout/__tests__/edgeCompensation.test.tsx +72 -0
  495. package/src/Lightbox/Lightbox.doc.mjs +5 -0
  496. package/src/Lightbox/Lightbox.test.tsx +123 -2
  497. package/src/Lightbox/Lightbox.tsx +29 -1
  498. package/src/Markdown/Markdown.test.tsx +23 -0
  499. package/src/Markdown/Markdown.tsx +9 -7
  500. package/src/Markdown/incremental.test.ts +36 -0
  501. package/src/Markdown/parser.perf.test.ts +34 -12
  502. package/src/Markdown/parser.test.ts +210 -0
  503. package/src/Markdown/parser.ts +301 -6
  504. package/src/MobileNav/MobileNav.doc.mjs +20 -0
  505. package/src/MultiSelector/MultiSelector.doc.mjs +14 -1
  506. package/src/MultiSelector/MultiSelector.test.tsx +33 -0
  507. package/src/MultiSelector/MultiSelector.tsx +20 -0
  508. package/src/NavMenu/NavMenu.doc.mjs +15 -0
  509. package/src/NumberInput/NumberInput.test.tsx +48 -3
  510. package/src/NumberInput/NumberInput.tsx +32 -15
  511. package/src/Outline/parseOutlineFromMarkdown.test.ts +80 -0
  512. package/src/OverflowList/OverflowList.test.tsx +416 -0
  513. package/src/Overlay/Overlay.doc.mjs +6 -0
  514. package/src/Overlay/Overlay.test.tsx +356 -0
  515. package/src/Pagination/Pagination.test.tsx +162 -0
  516. package/src/Pagination/Pagination.tsx +80 -26
  517. package/src/Popover/Popover.test.tsx +65 -0
  518. package/src/PowerSearch/PowerSearch.doc.mjs +4 -4
  519. package/src/PowerSearch/PowerSearch.test.tsx +109 -1
  520. package/src/PowerSearch/PowerSearch.tsx +37 -16
  521. package/src/ProgressBar/ProgressBar.test.tsx +30 -0
  522. package/src/ProgressBar/ProgressBar.tsx +12 -5
  523. package/src/RadioList/RadioList.doc.mjs +7 -1
  524. package/src/RadioList/RadioList.test.tsx +65 -0
  525. package/src/RadioList/RadioList.tsx +10 -1
  526. package/src/RadioList/RadioListItem.tsx +13 -4
  527. package/src/Resizable/ResizeHandle.test.tsx +218 -0
  528. package/src/Resizable/ResizeHandle.tsx +22 -4
  529. package/src/Section/Section.test.tsx +4 -10
  530. package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
  531. package/src/SegmentedControl/SegmentedControl.test.tsx +192 -0
  532. package/src/SegmentedControl/SegmentedControl.tsx +27 -5
  533. package/src/SegmentedControl/SegmentedControlItem.tsx +9 -4
  534. package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
  535. package/src/Selector/Selector.doc.mjs +12 -1
  536. package/src/Selector/Selector.test.tsx +30 -0
  537. package/src/Selector/Selector.tsx +18 -0
  538. package/src/SideNav/SideNav.doc.mjs +7 -1
  539. package/src/SideNav/SideNav.test.tsx +66 -0
  540. package/src/SideNav/SideNav.tsx +6 -2
  541. package/src/SideNav/SideNavCollapseButton.tsx +4 -3
  542. package/src/SideNav/SideNavSection.tsx +6 -4
  543. package/src/SizeContext/SizeContext.test.tsx +226 -0
  544. package/src/Slider/Slider.doc.mjs +14 -2
  545. package/src/Slider/Slider.test.tsx +30 -0
  546. package/src/Slider/Slider.tsx +20 -0
  547. package/src/Spinner/Spinner.tsx +1 -0
  548. package/src/Switch/Switch.doc.mjs +21 -9
  549. package/src/Switch/Switch.test.tsx +137 -0
  550. package/src/Switch/Switch.tsx +32 -7
  551. package/src/TabList/TabList.doc.mjs +3 -3
  552. package/src/TabList/TabList.test.tsx +185 -1
  553. package/src/TabList/TabMenu.tsx +45 -9
  554. package/src/Table/BaseTable.tsx +16 -3
  555. package/src/Table/Table.test.tsx +87 -0
  556. package/src/Table/TableBody.tsx +15 -2
  557. package/src/Table/TableCell.tsx +87 -8
  558. package/src/Table/TableFooter.tsx +15 -2
  559. package/src/Table/TableHeader.tsx +15 -2
  560. package/src/Table/index.ts +5 -0
  561. package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +13 -0
  562. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +3 -1
  563. package/src/Table/plugins/pagination/paginateData.ts +5 -1
  564. package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
  565. package/src/Table/plugins/rowExpansion/index.ts +7 -0
  566. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +155 -0
  567. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +590 -0
  568. package/src/Table/plugins/selection/useTableSelectionState.test.tsx +23 -0
  569. package/src/Table/plugins/selection/useTableSelectionState.tsx +11 -6
  570. package/src/Table/plugins/sortable/useTableSortableState.test.tsx +35 -1
  571. package/src/Table/plugins/sortable/useTableSortableState.tsx +8 -4
  572. package/src/Table/tableContextMenu.test.tsx +27 -3
  573. package/src/Table/tableContextMenu.tsx +20 -2
  574. package/src/Table/useTablePagination.doc.mjs +4 -1
  575. package/src/Table/useTableRowExpansion.doc.mjs +80 -0
  576. package/src/Table/useTableSortable.doc.mjs +4 -1
  577. package/src/Text/Text.doc.mjs +2 -2
  578. package/src/Text/Text.test.tsx +11 -0
  579. package/src/Text/Text.tsx +4 -2
  580. package/src/Text/text.stylex.ts +41 -0
  581. package/src/TextArea/TextArea.doc.mjs +1 -1
  582. package/src/TextArea/TextArea.test.tsx +3 -3
  583. package/src/TextInput/TextInput.doc.mjs +1 -1
  584. package/src/TextInput/TextInput.test.tsx +3 -3
  585. package/src/Thumbnail/Thumbnail.test.tsx +36 -2
  586. package/src/Thumbnail/Thumbnail.tsx +4 -2
  587. package/src/TimeInput/TimeInput.doc.mjs +11 -6
  588. package/src/TimeInput/TimeInput.test.tsx +37 -0
  589. package/src/TimeInput/TimeInput.tsx +11 -1
  590. package/src/Timestamp/Timestamp.doc.mjs +1 -1
  591. package/src/Timestamp/Timestamp.test.tsx +52 -0
  592. package/src/Timestamp/Timestamp.tsx +30 -16
  593. package/src/Toast/Toast.tsx +11 -3
  594. package/src/Toast/ToastViewport.test.tsx +64 -0
  595. package/src/Toast/ToastViewport.tsx +12 -0
  596. package/src/ToggleButton/ToggleButton.doc.mjs +1 -0
  597. package/src/Tokenizer/Tokenizer.doc.mjs +16 -4
  598. package/src/Tokenizer/Tokenizer.test.tsx +33 -0
  599. package/src/Tokenizer/Tokenizer.tsx +19 -0
  600. package/src/Toolbar/Toolbar.test.tsx +1 -1
  601. package/src/TopNav/TopNav.doc.mjs +1 -1
  602. package/src/TopNav/TopNav.test.tsx +18 -0
  603. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +9 -2
  604. package/src/TreeList/TreeList.doc.mjs +2 -2
  605. package/src/Typeahead/BaseTypeahead.doc.mjs +19 -0
  606. package/src/Typeahead/BaseTypeahead.tsx +5 -2
  607. package/src/Typeahead/Typeahead.doc.mjs +7 -2
  608. package/src/Typeahead/Typeahead.test.tsx +45 -1
  609. package/src/__tests__/TestIcon.tsx +26 -0
  610. package/src/__tests__/fastRoleQueries.ts +66 -0
  611. package/src/docPropReferences.test.ts +178 -0
  612. package/src/docs-types.ts +14 -0
  613. package/src/hooks/focusableSelector.ts +1 -1
  614. package/src/hooks/index.ts +3 -0
  615. package/src/hooks/useFocusTrap.doc.mjs +4 -2
  616. package/src/hooks/useFocusTrap.test.tsx +149 -1
  617. package/src/hooks/useFocusTrap.ts +50 -1
  618. package/src/hooks/useHotkeys.doc.mjs +52 -0
  619. package/src/hooks/useHotkeys.test.ts +245 -0
  620. package/src/hooks/useHotkeys.ts +203 -0
  621. package/src/hooks/useInteractiveRole.ts +12 -4
  622. package/src/hooks/useKeyboardHint.doc.mjs +6 -6
  623. package/src/hooks/useStreamingText.test.ts +54 -19
  624. package/src/hooks/useStreamingText.ts +16 -5
  625. package/src/theme/SyntaxTheme.doc.mjs +4 -4
  626. package/src/theme/defineTheme.ts +4 -13
  627. package/src/theme/derivedVarRegistry.test.ts +2 -2
  628. package/src/theme/expandColorScale.test.ts +29 -0
  629. package/src/theme/expandColorScale.ts +11 -6
  630. package/src/theme/hct.ts +9 -17
  631. package/src/theme/tokens.test.ts +182 -9
  632. package/src/theme/tokens.ts +239 -4
  633. package/src/theme/useTheme.test.tsx +20 -0
  634. package/src/utils/color.test.ts +133 -0
  635. package/src/utils/color.ts +148 -0
  636. package/src/utils/composeEventHandlers.test.ts +71 -0
  637. package/src/utils/composeEventHandlers.ts +44 -0
  638. package/src/utils/index.ts +4 -0
  639. package/src/utils/mergeProps.test.ts +166 -0
  640. package/src/utils/sharedResizeObserver.test.ts +2 -2
  641. package/src/utils/timeParser.test.ts +13 -0
  642. package/src/utils/timeParser.ts +8 -5
@@ -0,0 +1,590 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file useTableRowExpansion.tsx
7
+ * @input React, StyleX, Icon, Table types
8
+ * @output Exports useTableRowExpansion hook + config/state types
9
+ * @position Row-expansion plugin; consumed by Table via plugins prop
10
+ *
11
+ * SYNC: When modified, update these files to stay in sync:
12
+ * - /packages/core/src/Table/index.ts (exports)
13
+ */
14
+
15
+ import {useCallback, useMemo, useRef, type ReactNode} from 'react';
16
+ import * as stylex from '@stylexjs/stylex';
17
+ import {spacingVars, colorVars, radiusVars} from '../../../theme/tokens.stylex';
18
+ import {Icon} from '../../../Icon';
19
+ import {resolveContextActions} from '../../tableContextMenu';
20
+ import type {
21
+ TablePlugin,
22
+ TableColumn,
23
+ BodyCellRenderProps,
24
+ BodyRowRenderProps,
25
+ HeaderCellRenderProps,
26
+ } from '../../types';
27
+
28
+ // =============================================================================
29
+ // Config
30
+ // =============================================================================
31
+
32
+ /**
33
+ * Configuration for useTableRowExpansion (inherited-columns mode).
34
+ *
35
+ * Child rows use the same columns as their parents, with indentation on the
36
+ * first content column. The consumer provides a **flat** data array (use
37
+ * {@link useTableRowExpansionState} to flatten a tree) and a `getDepth`
38
+ * function so the plugin knows each row's nesting level.
39
+ */
40
+ export interface UseTableRowExpansionConfig<T extends Record<string, unknown>> {
41
+ /** Set of currently-expanded row keys. */
42
+ expandedKeys: Set<string>;
43
+ /** Called when a row's expansion is toggled. */
44
+ onToggle: (key: string) => void;
45
+ /** Derive a stable unique key from a row item. */
46
+ getRowKey: (item: T) => string;
47
+ /** Return the children of a row (used to determine expandability). */
48
+ getChildren: (item: T) => T[];
49
+ /** Return the depth of a row in the hierarchy (0 = top-level). */
50
+ getDepth?: (item: T) => number;
51
+ /** Optionally control which rows are expandable. @default checks getChildren length */
52
+ getIsItemExpandable?: (item: T) => boolean;
53
+ /**
54
+ * When true, clicking anywhere on the row toggles expansion (in addition to
55
+ * the chevron button). @default false — only the chevron triggers expansion.
56
+ */
57
+ hasRowClickExpansion?: boolean;
58
+ /**
59
+ * State of the expand-all toggle in the header. `true` = all expanded,
60
+ * `false` = all collapsed, `'indeterminate'` = mixed. When provided
61
+ * (together with `onToggleExpandAll`), the header cell shows a toggle button.
62
+ */
63
+ isAllExpanded?: boolean | 'indeterminate';
64
+ /** Called when the expand-all header toggle is clicked. */
65
+ onToggleExpandAll?: (expand: boolean) => void;
66
+ }
67
+
68
+ /**
69
+ * Configuration for {@link useTableRowExpansionState}.
70
+ *
71
+ * Mirrors the shape of {@link useTableSelectionState}: you own the
72
+ * `expandedKeys` set (via `useState`), and the hook derives everything the
73
+ * plugin needs — the flattened `data`, per-row depth, expand/collapse
74
+ * handlers, and the expand-all toggle state.
75
+ */
76
+ export interface UseTableRowExpansionStateConfig<
77
+ T extends Record<string, unknown>,
78
+ > {
79
+ /** The full, un-flattened tree. */
80
+ baseData: T[];
81
+ /** Return the children of a row. Leaf rows return an empty array. */
82
+ getChildren: (item: T) => T[];
83
+ /** Derive a stable unique key from a row item. */
84
+ getRowKey: (item: T) => string;
85
+ /**
86
+ * Should this row be expandable? Rows that return `false` never show a
87
+ * chevron and are skipped by expand-all. @default rows with children
88
+ */
89
+ getIsItemExpandable?: (item: T) => boolean;
90
+ /** Controlled set of currently-expanded row keys. */
91
+ expandedKeys: Set<string>;
92
+ /** Setter for the controlled expanded keys. */
93
+ setExpandedKeys: React.Dispatch<React.SetStateAction<Set<string>>>;
94
+ }
95
+
96
+ export interface UseTableRowExpansionStateResult<
97
+ T extends Record<string, unknown>,
98
+ > {
99
+ /** The flattened, currently-visible rows. Pass to `<Table data>`. */
100
+ data: T[];
101
+ /** Ready-to-use config for {@link useTableRowExpansion}. */
102
+ expansionConfig: UseTableRowExpansionConfig<T>;
103
+ }
104
+
105
+ /**
106
+ * Manages row-expansion state and derives the config for
107
+ * {@link useTableRowExpansion}. This is the recommended entry point — it
108
+ * removes the boilerplate of flattening the tree, tracking depth, and
109
+ * computing the expand-all state.
110
+ *
111
+ * @example
112
+ * ```tsx
113
+ * const [expandedKeys, setExpandedKeys] = useState<Set<string>>(new Set());
114
+ * const {data, expansionConfig} = useTableRowExpansionState({
115
+ * baseData: tree,
116
+ * getChildren: item => item.children ?? [],
117
+ * getRowKey: item => item.id,
118
+ * expandedKeys,
119
+ * setExpandedKeys,
120
+ * });
121
+ * const expansion = useTableRowExpansion(expansionConfig);
122
+ * <Table data={data} columns={columns} idKey="id" plugins={{expansion}} />;
123
+ * ```
124
+ */
125
+ export function useTableRowExpansionState<T extends Record<string, unknown>>({
126
+ baseData,
127
+ getChildren,
128
+ getRowKey,
129
+ getIsItemExpandable,
130
+ expandedKeys,
131
+ setExpandedKeys,
132
+ }: UseTableRowExpansionStateConfig<T>): UseTableRowExpansionStateResult<T> {
133
+ const isExpandable = useCallback(
134
+ (item: T): boolean =>
135
+ getIsItemExpandable
136
+ ? getIsItemExpandable(item)
137
+ : getChildren(item).length > 0,
138
+ [getIsItemExpandable, getChildren],
139
+ );
140
+
141
+ const depthMap = useMemo(() => {
142
+ const map = new Map<string, number>();
143
+ function walk(items: T[], depth: number) {
144
+ for (const item of items) {
145
+ const key = getRowKey(item);
146
+ map.set(key, depth);
147
+ if (expandedKeys.has(key)) {
148
+ walk(getChildren(item), depth + 1);
149
+ }
150
+ }
151
+ }
152
+ walk(baseData, 0);
153
+ return map;
154
+ }, [baseData, getChildren, getRowKey, expandedKeys]);
155
+
156
+ const data = useMemo(() => {
157
+ const result: T[] = [];
158
+ function walk(items: T[]) {
159
+ for (const item of items) {
160
+ result.push(item);
161
+ const key = getRowKey(item);
162
+ if (expandedKeys.has(key)) {
163
+ walk(getChildren(item));
164
+ }
165
+ }
166
+ }
167
+ walk(baseData);
168
+ return result;
169
+ }, [baseData, getChildren, getRowKey, expandedKeys]);
170
+
171
+ // Every expandable key across the whole tree (drives expand-all).
172
+ const allExpandableKeys = useMemo(() => {
173
+ const keys: string[] = [];
174
+ function walk(items: T[]) {
175
+ for (const item of items) {
176
+ if (isExpandable(item)) {
177
+ keys.push(getRowKey(item));
178
+ walk(getChildren(item));
179
+ }
180
+ }
181
+ }
182
+ walk(baseData);
183
+ return keys;
184
+ }, [baseData, getChildren, getRowKey, isExpandable]);
185
+
186
+ const getDepth = useCallback(
187
+ (item: T) => depthMap.get(getRowKey(item)) ?? 0,
188
+ [depthMap, getRowKey],
189
+ );
190
+
191
+ const onToggle = useCallback(
192
+ (key: string) => {
193
+ setExpandedKeys(prev => {
194
+ const next = new Set(prev);
195
+ if (next.has(key)) {
196
+ next.delete(key);
197
+ } else {
198
+ next.add(key);
199
+ }
200
+ return next;
201
+ });
202
+ },
203
+ [setExpandedKeys],
204
+ );
205
+
206
+ const isAllExpanded: boolean | 'indeterminate' = useMemo(() => {
207
+ if (allExpandableKeys.length === 0) {
208
+ return false;
209
+ }
210
+ const expandedCount = allExpandableKeys.filter(k =>
211
+ expandedKeys.has(k),
212
+ ).length;
213
+ if (expandedCount === 0) {
214
+ return false;
215
+ }
216
+ if (expandedCount === allExpandableKeys.length) {
217
+ return true;
218
+ }
219
+ return 'indeterminate';
220
+ }, [allExpandableKeys, expandedKeys]);
221
+
222
+ const onToggleExpandAll = useCallback(
223
+ (expand: boolean) => {
224
+ setExpandedKeys(expand ? new Set(allExpandableKeys) : new Set());
225
+ },
226
+ [setExpandedKeys, allExpandableKeys],
227
+ );
228
+
229
+ const expansionConfig = useMemo(
230
+ (): UseTableRowExpansionConfig<T> => ({
231
+ expandedKeys,
232
+ onToggle,
233
+ getRowKey,
234
+ getChildren,
235
+ getDepth,
236
+ getIsItemExpandable,
237
+ isAllExpanded,
238
+ onToggleExpandAll,
239
+ }),
240
+ [
241
+ expandedKeys,
242
+ onToggle,
243
+ getRowKey,
244
+ getChildren,
245
+ getDepth,
246
+ getIsItemExpandable,
247
+ isAllExpanded,
248
+ onToggleExpandAll,
249
+ ],
250
+ );
251
+
252
+ return {data, expansionConfig};
253
+ }
254
+
255
+ // =============================================================================
256
+ // Styles
257
+ // =============================================================================
258
+
259
+ const EXPANSION_COLUMN_WIDTH = {type: 'pixel' as const, value: 40};
260
+
261
+ /** Indentation applied per depth level, in pixels. */
262
+ const INDENT_PER_DEPTH = 24;
263
+
264
+ const expansionStyles = stylex.create({
265
+ chevronButton: {
266
+ display: 'inline-flex',
267
+ alignItems: 'center',
268
+ justifyContent: 'center',
269
+ width: '24px',
270
+ height: '24px',
271
+ background: 'transparent',
272
+ border: 'none',
273
+ borderRadius: radiusVars['--radius-inner'],
274
+ cursor: 'pointer',
275
+ color: colorVars['--color-icon-secondary'],
276
+ transitionProperty: 'transform, color, background-color',
277
+ transitionDuration: '150ms',
278
+ padding: 0,
279
+ flexShrink: '0',
280
+ // Match IconButton ghost hover: subtle overlay background
281
+ backgroundImage: {
282
+ default: null,
283
+ ':hover': {
284
+ '@media (hover: hover)': `linear-gradient(${colorVars['--color-overlay-hover']}, ${colorVars['--color-overlay-hover']})`,
285
+ },
286
+ },
287
+ ':hover': {
288
+ color: colorVars['--color-icon-primary'],
289
+ },
290
+ },
291
+ chevronExpanded: {
292
+ transform: 'rotate(90deg)',
293
+ },
294
+ chevronIcon: {
295
+ display: 'inline-flex',
296
+ transitionProperty: 'transform',
297
+ transitionDuration: '150ms',
298
+ },
299
+ indentedCell: {
300
+ display: 'flex',
301
+ alignItems: 'center',
302
+ gap: spacingVars['--spacing-1'],
303
+ },
304
+ indent: (px: number) => ({
305
+ paddingInlineStart: `${px}px`,
306
+ }),
307
+ placeholder: {
308
+ display: 'inline-block',
309
+ width: '24px',
310
+ height: '24px',
311
+ flexShrink: '0',
312
+ },
313
+ clickableRow: {
314
+ cursor: 'pointer',
315
+ },
316
+ });
317
+
318
+ // =============================================================================
319
+ // Chevron
320
+ // =============================================================================
321
+
322
+ function ExpansionChevron({
323
+ isExpanded,
324
+ onToggle,
325
+ ariaLabel,
326
+ }: {
327
+ isExpanded: boolean;
328
+ onToggle: () => void;
329
+ ariaLabel: string;
330
+ }) {
331
+ return (
332
+ <button
333
+ type="button"
334
+ {...stylex.props(expansionStyles.chevronButton)}
335
+ onClick={e => {
336
+ e.stopPropagation();
337
+ onToggle();
338
+ }}
339
+ aria-label={ariaLabel}
340
+ aria-expanded={isExpanded}>
341
+ <span
342
+ {...stylex.props(
343
+ expansionStyles.chevronIcon,
344
+ isExpanded && expansionStyles.chevronExpanded,
345
+ )}>
346
+ <Icon icon="chevronRight" size="xsm" />
347
+ </span>
348
+ </button>
349
+ );
350
+ }
351
+
352
+ // =============================================================================
353
+ // Hook
354
+ // =============================================================================
355
+
356
+ export function useTableRowExpansion<T extends Record<string, unknown>>(
357
+ config: UseTableRowExpansionConfig<T>,
358
+ ): TablePlugin<T> {
359
+ const {
360
+ expandedKeys,
361
+ onToggle,
362
+ getRowKey,
363
+ getChildren,
364
+ getDepth,
365
+ getIsItemExpandable,
366
+ hasRowClickExpansion = false,
367
+ isAllExpanded,
368
+ onToggleExpandAll,
369
+ } = config;
370
+
371
+ // Track the first non-plugin column key for indentation.
372
+ const firstUserColumnKeyRef = useRef<string | null>(null);
373
+
374
+ const expansionColumn = useMemo(
375
+ (): TableColumn<T> => ({
376
+ key: '__expansion',
377
+ header: '',
378
+ width: EXPANSION_COLUMN_WIDTH,
379
+ resizable: false,
380
+ renderCell: (item: T) => {
381
+ // Child rows (depth > 0) show their chevron inline in the first user
382
+ // column instead — don't double up here.
383
+ const depth = getDepth ? getDepth(item) : 0;
384
+ if (depth > 0) {
385
+ return null;
386
+ }
387
+
388
+ const key = getRowKey(item);
389
+ const expandable = getIsItemExpandable
390
+ ? getIsItemExpandable(item)
391
+ : getChildren(item).length > 0;
392
+ if (!expandable) {
393
+ return null;
394
+ }
395
+ const isExpanded = expandedKeys.has(key);
396
+ return (
397
+ <ExpansionChevron
398
+ isExpanded={isExpanded}
399
+ onToggle={() => onToggle(key)}
400
+ ariaLabel={isExpanded ? 'Collapse row' : 'Expand row'}
401
+ />
402
+ );
403
+ },
404
+ }),
405
+ [
406
+ expandedKeys,
407
+ onToggle,
408
+ getRowKey,
409
+ getChildren,
410
+ getIsItemExpandable,
411
+ getDepth,
412
+ ],
413
+ );
414
+
415
+ return useMemo(
416
+ (): TablePlugin<T> => ({
417
+ transformColumns(columns: TableColumn<T>[]) {
418
+ // Track the first user column for indentation.
419
+ const firstUserCol = columns.find(c => !c.key.startsWith('__'));
420
+ firstUserColumnKeyRef.current = firstUserCol?.key ?? null;
421
+
422
+ // Wrap the first user column's renderCell to add depth indentation +
423
+ // an inline chevron for child rows. This is the inherited-columns
424
+ // pattern: child rows use the same columns but indent their first
425
+ // content cell.
426
+ const wrappedColumns = columns.map(col => {
427
+ if (col.key !== firstUserColumnKeyRef.current) {
428
+ return col;
429
+ }
430
+ const originalRenderCell = col.renderCell;
431
+ return {
432
+ ...col,
433
+ renderCell: (item: T): ReactNode => {
434
+ const depth = getDepth ? getDepth(item) : 0;
435
+ const originalContent = originalRenderCell
436
+ ? originalRenderCell(item)
437
+ : String(
438
+ ((item as Record<string, unknown>)[col.key] as
439
+ | string
440
+ | number
441
+ | null
442
+ | undefined) ?? '',
443
+ );
444
+
445
+ if (depth === 0) {
446
+ return originalContent;
447
+ }
448
+
449
+ const indent = (depth - 1) * INDENT_PER_DEPTH;
450
+ const key = getRowKey(item);
451
+ const isExpanded = expandedKeys.has(key);
452
+ const expandable = getIsItemExpandable
453
+ ? getIsItemExpandable(item)
454
+ : getChildren(item).length > 0;
455
+
456
+ const chevron = expandable ? (
457
+ <ExpansionChevron
458
+ isExpanded={isExpanded}
459
+ onToggle={() => onToggle(key)}
460
+ ariaLabel={isExpanded ? 'Collapse row' : 'Expand row'}
461
+ />
462
+ ) : (
463
+ <span {...stylex.props(expansionStyles.placeholder)} />
464
+ );
465
+
466
+ return (
467
+ <div
468
+ {...stylex.props(
469
+ expansionStyles.indentedCell,
470
+ indent > 0 && expansionStyles.indent(indent),
471
+ )}>
472
+ {chevron}
473
+ {originalContent}
474
+ </div>
475
+ );
476
+ },
477
+ };
478
+ });
479
+
480
+ return [expansionColumn, ...wrappedColumns];
481
+ },
482
+
483
+ transformHeaderCell(
484
+ props: HeaderCellRenderProps,
485
+ column: TableColumn<T>,
486
+ ): HeaderCellRenderProps {
487
+ if (column.key !== '__expansion') {
488
+ return props;
489
+ }
490
+
491
+ // Show expand-all toggle when the consumer provides the state + callback.
492
+ if (isAllExpanded !== undefined && onToggleExpandAll) {
493
+ const allExpanded = isAllExpanded === true;
494
+ return {
495
+ ...props,
496
+ content: (
497
+ <button
498
+ type="button"
499
+ {...stylex.props(expansionStyles.chevronButton)}
500
+ onClick={() => onToggleExpandAll(!allExpanded)}
501
+ aria-label={
502
+ allExpanded ? 'Collapse all rows' : 'Expand all rows'
503
+ }>
504
+ <span
505
+ {...stylex.props(
506
+ expansionStyles.chevronIcon,
507
+ allExpanded && expansionStyles.chevronExpanded,
508
+ )}>
509
+ <Icon icon="chevronRight" size="xsm" />
510
+ </span>
511
+ </button>
512
+ ),
513
+ };
514
+ }
515
+
516
+ return {...props, content: null};
517
+ },
518
+
519
+ transformBodyCell(
520
+ props: BodyCellRenderProps,
521
+ column: TableColumn<T>,
522
+ item: T,
523
+ ): BodyCellRenderProps {
524
+ // Contribute "Expand/Collapse row" context-menu action on every cell
525
+ // so right-clicking anywhere in the row shows the option.
526
+ const expandable = getIsItemExpandable
527
+ ? getIsItemExpandable(item)
528
+ : getChildren(item).length > 0;
529
+ if (!expandable) {
530
+ return props;
531
+ }
532
+
533
+ const key = getRowKey(item);
534
+ const isExpanded = expandedKeys.has(key);
535
+ return {
536
+ ...props,
537
+ contextMenuActions: () => [
538
+ ...resolveContextActions(props.contextMenuActions),
539
+ {
540
+ id: 'row-expansion-toggle',
541
+ group: 'row-expansion',
542
+ label: isExpanded ? 'Collapse row' : 'Expand row',
543
+ icon: (
544
+ <Icon
545
+ icon={isExpanded ? 'chevronDown' : 'chevronRight'}
546
+ size="xsm"
547
+ aria-hidden
548
+ />
549
+ ),
550
+ onSelect: () => onToggle(key),
551
+ },
552
+ ],
553
+ };
554
+ },
555
+
556
+ transformBodyRow(props: BodyRowRenderProps, item: T): BodyRowRenderProps {
557
+ if (!hasRowClickExpansion) {
558
+ return props;
559
+ }
560
+ const expandable = getIsItemExpandable
561
+ ? getIsItemExpandable(item)
562
+ : getChildren(item).length > 0;
563
+ if (!expandable) {
564
+ return props;
565
+ }
566
+ const key = getRowKey(item);
567
+ return {
568
+ ...props,
569
+ htmlProps: {
570
+ ...props.htmlProps,
571
+ onClick: () => onToggle(key),
572
+ },
573
+ styles: [...props.styles, expansionStyles.clickableRow],
574
+ };
575
+ },
576
+ }),
577
+ [
578
+ expandedKeys,
579
+ getRowKey,
580
+ onToggle,
581
+ getChildren,
582
+ getDepth,
583
+ getIsItemExpandable,
584
+ hasRowClickExpansion,
585
+ isAllExpanded,
586
+ onToggleExpandAll,
587
+ expansionColumn,
588
+ ],
589
+ );
590
+ }
@@ -302,6 +302,29 @@ describe('useTableSelectionState with filtered data', () => {
302
302
  expect(screen.getByTestId('selected-keys')).toHaveTextContent('1,3');
303
303
  });
304
304
 
305
+ it('select-all is unchecked when the filter matches nothing (#3591)', async () => {
306
+ const user = userEvent.setup();
307
+ render(<FilteredSelectionTable />);
308
+
309
+ // Select Bob, then filter to an empty result set.
310
+ const checkboxes = screen.getAllByLabelText('Select row');
311
+ await user.click(checkboxes[1]);
312
+ expect(screen.getByTestId('selected-keys')).toHaveTextContent('2');
313
+
314
+ const input = screen.getByTestId('filter-input');
315
+ await user.clear(input);
316
+ await user.type(input, 'zzz');
317
+
318
+ // Zero visible rows must not read as "all selected" — previously the
319
+ // header checkbox rendered checked here and deselect-all was a no-op.
320
+ const selectAll = screen.getByLabelText('Select all rows');
321
+ expect(selectAll).not.toBeChecked();
322
+
323
+ // The hidden selection itself is preserved (frozen), as designed.
324
+ await user.clear(input);
325
+ expect(screen.getByTestId('selected-keys')).toHaveTextContent('2');
326
+ });
327
+
305
328
  it('selections persist when filter changes', async () => {
306
329
  const user = userEvent.setup();
307
330
  render(<FilteredSelectionTable />);
@@ -125,12 +125,17 @@ export function useTableSelectionState<T extends Record<string, unknown>>(
125
125
  [selectedKeys, selectableIDs],
126
126
  );
127
127
 
128
- const getAllSelected = useCallback(
129
- () =>
130
- allSelectableIDs.size === selectedKeys.size &&
131
- allSelectableIDs.size !== 0,
132
- [allSelectableIDs, selectedKeys],
133
- );
128
+ const getAllSelected = useCallback(() => {
129
+ // Require at least one actionable row: with zero visible selectable
130
+ // rows (e.g. a filter with no matches while a selection exists), the
131
+ // union-based size comparison would read any non-empty selection as
132
+ // "all selected" — a checked header checkbox over an empty table that
133
+ // deselect-all can't clear, since the invisible keys count as frozen.
134
+ if (selectableIDs.size === 0) {
135
+ return false;
136
+ }
137
+ return allSelectableIDs.size === selectedKeys.size;
138
+ }, [allSelectableIDs, selectableIDs, selectedKeys]);
134
139
 
135
140
  // Use refs to keep onSelectAll stable
136
141
  const frozenSelectedIDsRef = useRef(frozenSelectedIDs);
@@ -8,7 +8,7 @@
8
8
  */
9
9
 
10
10
  import {describe, it, expect, vi} from 'vitest';
11
- import {render, screen, within} from '@testing-library/react';
11
+ import {render, renderHook, screen, within} from '@testing-library/react';
12
12
  import userEvent from '@testing-library/user-event';
13
13
  import {useState} from 'react';
14
14
  import {Table} from '../../Table';
@@ -421,6 +421,40 @@ describe('useTableSortableState', () => {
421
421
  });
422
422
  });
423
423
 
424
+ describe('NaN handling', () => {
425
+ it('keeps valid numbers sorted when a NaN cell is present', () => {
426
+ const data: Employee[] = [
427
+ {id: '1', name: 'A', age: 5, department: 'X', salary: 1},
428
+ {id: '2', name: 'B', age: NaN, department: 'X', salary: 1},
429
+ {id: '3', name: 'C', age: 1, department: 'X', salary: 1},
430
+ {id: '4', name: 'D', age: 3, department: 'X', salary: 1},
431
+ ];
432
+ const {result} = renderHook(() =>
433
+ useTableSortableState({
434
+ data,
435
+ defaultSort: [{sortKey: 'age', direction: 'ascending'}],
436
+ }),
437
+ );
438
+ // NaN groups at the end like null; the valid numbers stay ordered.
439
+ expect(result.current.sortedData.map(e => e.age)).toEqual([1, 3, 5, NaN]);
440
+ });
441
+
442
+ it('sorts NaN to the start in descending order, like null', () => {
443
+ const data: Employee[] = [
444
+ {id: '1', name: 'A', age: 5, department: 'X', salary: 1},
445
+ {id: '2', name: 'B', age: NaN, department: 'X', salary: 1},
446
+ {id: '3', name: 'C', age: 1, department: 'X', salary: 1},
447
+ ];
448
+ const {result} = renderHook(() =>
449
+ useTableSortableState({
450
+ data,
451
+ defaultSort: [{sortKey: 'age', direction: 'descending'}],
452
+ }),
453
+ );
454
+ expect(result.current.sortedData.map(e => e.age)).toEqual([NaN, 5, 1]);
455
+ });
456
+ });
457
+
424
458
  describe('null/undefined handling', () => {
425
459
  it('sorts null values to the end', () => {
426
460
  const data: Employee[] = [