@astryxdesign/core 0.3.0 → 0.4.0

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 (551) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/dist/AlertDialog/AlertDialog.d.ts +10 -2
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +22 -3
  5. package/dist/AppShell/AppShell.d.ts +2 -2
  6. package/dist/AppShell/AppShell.d.ts.map +1 -1
  7. package/dist/AppShell/AppShell.js +40 -9
  8. package/dist/AspectRatio/AspectRatio.d.ts +13 -0
  9. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  10. package/dist/AspectRatio/AspectRatio.js +9 -0
  11. package/dist/Avatar/Avatar.d.ts.map +1 -1
  12. package/dist/Avatar/Avatar.js +33 -20
  13. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  14. package/dist/AvatarGroup/AvatarGroupOverflow.js +2 -3
  15. package/dist/Banner/Banner.d.ts.map +1 -1
  16. package/dist/Banner/Banner.js +15 -14
  17. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  18. package/dist/Breadcrumbs/BreadcrumbItem.js +21 -8
  19. package/dist/Breadcrumbs/index.d.ts +2 -1
  20. package/dist/Breadcrumbs/index.d.ts.map +1 -1
  21. package/dist/Breadcrumbs/index.js +1 -0
  22. package/dist/Button/Button.d.ts.map +1 -1
  23. package/dist/Button/Button.js +11 -15
  24. package/dist/Calendar/Calendar.d.ts.map +1 -1
  25. package/dist/Calendar/Calendar.js +2 -1
  26. package/dist/Calendar/styles.d.ts +0 -2
  27. package/dist/Calendar/styles.d.ts.map +1 -1
  28. package/dist/Calendar/styles.js +0 -2
  29. package/dist/Carousel/Carousel.d.ts.map +1 -1
  30. package/dist/Carousel/Carousel.js +8 -12
  31. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  32. package/dist/Chat/ChatDictationButton.js +2 -1
  33. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  34. package/dist/Chat/ChatLayoutScrollButton.js +3 -1
  35. package/dist/Chat/ChatSendButton.d.ts.map +1 -1
  36. package/dist/Chat/ChatSendButton.js +4 -3
  37. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  38. package/dist/Chat/ChatToolCalls.js +17 -17
  39. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  40. package/dist/Chat/useTriggerMenu.js +2 -6
  41. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  42. package/dist/CheckboxInput/CheckboxInput.js +36 -125
  43. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  44. package/dist/ClickableCard/ClickableCard.js +3 -11
  45. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  46. package/dist/CodeBlock/CodeBlock.js +84 -67
  47. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  48. package/dist/Collapsible/Collapsible.js +35 -15
  49. package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
  50. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  51. package/dist/CommandPalette/CommandPaletteItem.js +6 -3
  52. package/dist/CommandPalette/CommandPaletteList.js +1 -1
  53. package/dist/ComplexSelector/ComplexSelector.d.ts +1 -1
  54. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  55. package/dist/ComplexSelector/ComplexSelector.js +35 -33
  56. package/dist/ContextMenu/ContextMenu.d.ts +2 -2
  57. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  58. package/dist/ContextMenu/ContextMenu.js +1 -1
  59. package/dist/ContextMenu/index.d.ts +2 -1
  60. package/dist/ContextMenu/index.d.ts.map +1 -1
  61. package/dist/ContextMenu/index.js +1 -0
  62. package/dist/DateInput/DateInput.d.ts +9 -2
  63. package/dist/DateInput/DateInput.d.ts.map +1 -1
  64. package/dist/DateInput/DateInput.js +24 -23
  65. package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
  66. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  67. package/dist/DateRangeInput/DateRangeInput.js +11 -16
  68. package/dist/DateTimeInput/DateTimeInput.d.ts +9 -1
  69. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  70. package/dist/DateTimeInput/DateTimeInput.js +22 -17
  71. package/dist/Dialog/Dialog.d.ts.map +1 -1
  72. package/dist/Dialog/Dialog.js +4 -4
  73. package/dist/DropdownMenu/DropdownMenu.d.ts +33 -8
  74. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  75. package/dist/DropdownMenu/DropdownMenu.js +62 -20
  76. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +8 -11
  77. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  78. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +32 -31
  79. package/dist/DropdownMenu/DropdownMenuDivider.d.ts +25 -0
  80. package/dist/DropdownMenu/DropdownMenuDivider.d.ts.map +1 -0
  81. package/dist/DropdownMenu/DropdownMenuDivider.js +66 -0
  82. package/dist/DropdownMenu/DropdownMenuItem.d.ts +15 -2
  83. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  84. package/dist/DropdownMenu/DropdownMenuItem.js +20 -8
  85. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +5 -5
  86. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  87. package/dist/DropdownMenu/DropdownMenuRadioItem.js +24 -67
  88. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  89. package/dist/DropdownMenu/DropdownMenuSubMenu.js +2 -8
  90. package/dist/DropdownMenu/index.d.ts +2 -1
  91. package/dist/DropdownMenu/index.d.ts.map +1 -1
  92. package/dist/DropdownMenu/index.js +4 -0
  93. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  94. package/dist/DropdownMenu/renderDropdownItems.js +35 -27
  95. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  96. package/dist/EmptyState/EmptyState.js +9 -5
  97. package/dist/Field/InputClearButton.d.ts +16 -3
  98. package/dist/Field/InputClearButton.d.ts.map +1 -1
  99. package/dist/Field/InputClearButton.js +15 -4
  100. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  101. package/dist/HoverCard/useHoverCard.js +3 -19
  102. package/dist/Indicator/CheckIndicator.d.ts +25 -0
  103. package/dist/Indicator/CheckIndicator.d.ts.map +1 -0
  104. package/dist/Indicator/CheckIndicator.js +155 -0
  105. package/dist/Indicator/CheckboxIndicator.d.ts +22 -0
  106. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -0
  107. package/dist/Indicator/CheckboxIndicator.js +173 -0
  108. package/dist/Indicator/RadioIndicator.d.ts +23 -0
  109. package/dist/Indicator/RadioIndicator.d.ts.map +1 -0
  110. package/dist/Indicator/RadioIndicator.js +137 -0
  111. package/dist/Indicator/index.d.ts +24 -0
  112. package/dist/Indicator/index.d.ts.map +1 -0
  113. package/dist/Indicator/index.js +26 -0
  114. package/dist/Indicator/indicator.markers.stylex.d.ts +16 -0
  115. package/dist/Indicator/indicator.markers.stylex.d.ts.map +1 -0
  116. package/dist/Indicator/indicator.markers.stylex.js +21 -0
  117. package/dist/Indicator/indicatorRegistry.d.ts +71 -0
  118. package/dist/Indicator/indicatorRegistry.d.ts.map +1 -0
  119. package/dist/Indicator/indicatorRegistry.js +93 -0
  120. package/dist/Indicator/types.d.ts +167 -0
  121. package/dist/Indicator/types.d.ts.map +1 -0
  122. package/dist/Indicator/types.js +1 -0
  123. package/dist/Indicator/useIndicator.d.ts +18 -0
  124. package/dist/Indicator/useIndicator.d.ts.map +1 -0
  125. package/dist/Indicator/useIndicator.js +30 -0
  126. package/dist/Item/Item.d.ts.map +1 -1
  127. package/dist/Item/Item.js +4 -8
  128. package/dist/Layer/useLayer.d.ts +14 -0
  129. package/dist/Layer/useLayer.d.ts.map +1 -1
  130. package/dist/Layer/useLayer.js +25 -2
  131. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  132. package/dist/Lightbox/Lightbox.js +56 -53
  133. package/dist/Link/Link.d.ts.map +1 -1
  134. package/dist/Link/Link.js +4 -5
  135. package/dist/MobileNav/MobileNav.js +8 -8
  136. package/dist/MoreMenu/MoreMenu.d.ts +14 -1
  137. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  138. package/dist/MoreMenu/MoreMenu.js +4 -0
  139. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  140. package/dist/MultiSelector/MultiSelector.js +78 -75
  141. package/dist/NumberInput/NumberInput.d.ts +27 -1
  142. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  143. package/dist/NumberInput/NumberInput.js +230 -42
  144. package/dist/Outline/Outline.d.ts.map +1 -1
  145. package/dist/Outline/Outline.js +2 -3
  146. package/dist/Pagination/Pagination.d.ts.map +1 -1
  147. package/dist/Pagination/Pagination.js +61 -63
  148. package/dist/Popover/Popover.d.ts.map +1 -1
  149. package/dist/Popover/Popover.js +6 -8
  150. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  151. package/dist/PowerSearch/PowerSearch.js +1 -1
  152. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  153. package/dist/PowerSearch/PowerSearchEditPopover.js +7 -0
  154. package/dist/ProgressBar/ProgressBar.d.ts +11 -4
  155. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  156. package/dist/ProgressBar/ProgressBar.js +96 -6
  157. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  158. package/dist/RadioList/RadioListItem.js +29 -84
  159. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  160. package/dist/Resizable/ResizeHandle.js +2 -3
  161. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  162. package/dist/SegmentedControl/SegmentedControlItem.js +2 -3
  163. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  164. package/dist/SelectableCard/SelectableCard.js +3 -11
  165. package/dist/Selector/Selector.d.ts +2 -1
  166. package/dist/Selector/Selector.d.ts.map +1 -1
  167. package/dist/Selector/Selector.js +164 -94
  168. package/dist/Selector/hooks.d.ts +18 -6
  169. package/dist/Selector/hooks.d.ts.map +1 -1
  170. package/dist/Selector/hooks.js +57 -40
  171. package/dist/SideNav/SideNav.d.ts.map +1 -1
  172. package/dist/SideNav/SideNav.js +1 -1
  173. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  174. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  175. package/dist/SideNav/SideNavCollapseButton.js +29 -14
  176. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  177. package/dist/SideNav/SideNavHeading.js +56 -20
  178. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  179. package/dist/SideNav/SideNavItem.js +28 -22
  180. package/dist/Stack/stack.stylex.d.ts +3 -3
  181. package/dist/Switch/Switch.js +11 -10
  182. package/dist/TabList/Tab.d.ts.map +1 -1
  183. package/dist/TabList/Tab.js +2 -3
  184. package/dist/TabList/TabMenu.d.ts.map +1 -1
  185. package/dist/TabList/TabMenu.js +41 -19
  186. package/dist/Table/BaseTable.d.ts.map +1 -1
  187. package/dist/Table/BaseTable.js +8 -0
  188. package/dist/Table/index.d.ts +1 -1
  189. package/dist/Table/index.d.ts.map +1 -1
  190. package/dist/Table/index.js +1 -1
  191. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
  192. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  193. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +22 -18
  194. package/dist/Table/plugins/rowExpansion/index.d.ts +1 -1
  195. package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -1
  196. package/dist/Table/plugins/rowExpansion/index.js +1 -1
  197. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +41 -76
  198. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  199. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +94 -345
  200. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  201. package/dist/Table/plugins/sortable/useTableSortable.js +23 -4
  202. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  203. package/dist/Table/plugins/tree/useTableTreeData.js +29 -33
  204. package/dist/Table/tableContextMenu.d.ts.map +1 -1
  205. package/dist/Table/tableContextMenu.js +2 -1
  206. package/dist/Table/types.d.ts +11 -0
  207. package/dist/Table/types.d.ts.map +1 -1
  208. package/dist/TextArea/TextArea.d.ts +10 -1
  209. package/dist/TextArea/TextArea.d.ts.map +1 -1
  210. package/dist/TextArea/TextArea.js +16 -6
  211. package/dist/TextInput/TextInput.d.ts +10 -1
  212. package/dist/TextInput/TextInput.d.ts.map +1 -1
  213. package/dist/TextInput/TextInput.js +13 -19
  214. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  215. package/dist/Thumbnail/Thumbnail.js +32 -26
  216. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  217. package/dist/TimeInput/TimeInput.js +7 -15
  218. package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -1
  219. package/dist/Timestamp/TimestampHoverCard.js +16 -34
  220. package/dist/Token/Token.d.ts.map +1 -1
  221. package/dist/Token/Token.js +20 -11
  222. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  223. package/dist/Tokenizer/Tokenizer.js +4 -2
  224. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  225. package/dist/Tooltip/useTooltip.js +3 -19
  226. package/dist/TopNav/TopNav.d.ts.map +1 -1
  227. package/dist/TopNav/TopNav.js +6 -5
  228. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  229. package/dist/TopNav/TopNavHeading.js +54 -16
  230. package/dist/TopNav/TopNavItem.d.ts.map +1 -1
  231. package/dist/TopNav/TopNavItem.js +3 -9
  232. package/dist/TopNav/TopNavMegaMenu.d.ts +7 -0
  233. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  234. package/dist/TopNav/TopNavMegaMenu.js +146 -60
  235. package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
  236. package/dist/TopNav/TopNavMegaMenuItem.js +22 -3
  237. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  238. package/dist/TopNav/TopNavMenu.js +83 -38
  239. package/dist/TreeList/TreeList.d.ts.map +1 -1
  240. package/dist/TreeList/TreeList.js +13 -0
  241. package/dist/TreeList/TreeListBranches.d.ts +1 -1
  242. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  243. package/dist/TreeList/TreeListBranches.js +14 -4
  244. package/dist/TreeList/TreeListItem.d.ts +11 -1
  245. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  246. package/dist/TreeList/TreeListItem.js +57 -30
  247. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  248. package/dist/Typeahead/BaseTypeahead.js +16 -8
  249. package/dist/astryx.css +74 -85
  250. package/dist/astryx.umd.js +56 -56
  251. package/dist/astryx.umd.js.map +4 -4
  252. package/dist/hooks/containerReveal.stylex.d.ts +61 -0
  253. package/dist/hooks/containerReveal.stylex.d.ts.map +1 -0
  254. package/dist/hooks/containerReveal.stylex.js +63 -0
  255. package/dist/hooks/index.d.ts +3 -0
  256. package/dist/hooks/index.d.ts.map +1 -1
  257. package/dist/hooks/index.js +2 -0
  258. package/dist/hooks/useClipboard.d.ts +59 -0
  259. package/dist/hooks/useClipboard.d.ts.map +1 -0
  260. package/dist/hooks/useClipboard.js +106 -0
  261. package/dist/hooks/useContainerReveal.d.ts +14 -8
  262. package/dist/hooks/useContainerReveal.d.ts.map +1 -1
  263. package/dist/hooks/useContainerReveal.js +28 -69
  264. package/dist/hooks/useIndicatorFocusRing.d.ts +28 -0
  265. package/dist/hooks/useIndicatorFocusRing.d.ts.map +1 -0
  266. package/dist/hooks/useIndicatorFocusRing.js +96 -0
  267. package/dist/hooks/useLongPress.d.ts.map +1 -1
  268. package/dist/hooks/useLongPress.js +12 -2
  269. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  270. package/dist/hooks/useScrollLock.js +33 -18
  271. package/dist/hooks/useStreamingText.d.ts +18 -3
  272. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  273. package/dist/hooks/useStreamingText.js +47 -7
  274. package/dist/hooks/useTreeFocus.d.ts.map +1 -1
  275. package/dist/hooks/useTreeFocus.js +9 -3
  276. package/dist/hooks/useTypeahead.d.ts +3 -2
  277. package/dist/hooks/useTypeahead.d.ts.map +1 -1
  278. package/dist/hooks/useTypeahead.js +19 -7
  279. package/dist/index.d.ts +1 -0
  280. package/dist/index.d.ts.map +1 -1
  281. package/dist/index.js +1 -0
  282. package/dist/theme/defineTheme.d.ts +16 -0
  283. package/dist/theme/defineTheme.d.ts.map +1 -1
  284. package/dist/theme/defineTheme.js +8 -0
  285. package/dist/theme/derivedVarRegistry.d.ts +8 -0
  286. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  287. package/dist/theme/derivedVarRegistry.js +14 -13
  288. package/dist/theme/expandColorScale.d.ts +3 -1
  289. package/dist/theme/expandColorScale.d.ts.map +1 -1
  290. package/dist/theme/expandColorScale.js +17 -7
  291. package/dist/theme/expandTypeScale.d.ts.map +1 -1
  292. package/dist/theme/expandTypeScale.js +17 -0
  293. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  294. package/dist/theme/generateThemeRules.js +11 -0
  295. package/dist/theme/index.d.ts +1 -0
  296. package/dist/theme/index.d.ts.map +1 -1
  297. package/dist/utils/focusOutline.stylex.d.ts +107 -0
  298. package/dist/utils/focusOutline.stylex.d.ts.map +1 -0
  299. package/dist/utils/focusOutline.stylex.js +130 -0
  300. package/dist/utils/focusReturn.d.ts +24 -0
  301. package/dist/utils/focusReturn.d.ts.map +1 -0
  302. package/dist/utils/focusReturn.js +29 -0
  303. package/dist/utils/index.d.ts +1 -0
  304. package/dist/utils/index.d.ts.map +1 -1
  305. package/dist/utils/index.js +1 -0
  306. package/dist/utils/mergeRefs.d.ts.map +1 -1
  307. package/dist/utils/mergeRefs.js +7 -5
  308. package/dist/utils/rtlStyles.d.ts +2 -2
  309. package/dist/utils/rtlStyles.js +2 -2
  310. package/dist/utils/themeProps.d.ts +20 -1
  311. package/dist/utils/themeProps.d.ts.map +1 -1
  312. package/dist/utils/themeProps.js +8 -2
  313. package/locales/en.json +12 -0
  314. package/locales/pseudo.json +9 -0
  315. package/package.json +7 -2
  316. package/src/AlertDialog/AlertDialog.doc.mjs +16 -3
  317. package/src/AlertDialog/AlertDialog.test.tsx +208 -1
  318. package/src/AlertDialog/AlertDialog.tsx +21 -3
  319. package/src/AppShell/AppShell.doc.mjs +11 -0
  320. package/src/AppShell/AppShell.test.tsx +139 -0
  321. package/src/AppShell/AppShell.tsx +32 -22
  322. package/src/AspectRatio/AspectRatio.doc.mjs +27 -3
  323. package/src/AspectRatio/AspectRatio.test.tsx +30 -0
  324. package/src/AspectRatio/AspectRatio.tsx +13 -0
  325. package/src/Avatar/Avatar.doc.mjs +2 -13
  326. package/src/Avatar/Avatar.test.tsx +33 -8
  327. package/src/Avatar/Avatar.tsx +52 -50
  328. package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -9
  329. package/src/Banner/Banner.tsx +9 -6
  330. package/src/Breadcrumbs/BreadcrumbItem.tsx +16 -6
  331. package/src/Breadcrumbs/index.ts +5 -1
  332. package/src/Button/Button.tsx +21 -41
  333. package/src/Calendar/Calendar.tsx +2 -1
  334. package/src/Calendar/styles.ts +0 -8
  335. package/src/Carousel/Carousel.doc.mjs +3 -0
  336. package/src/Carousel/Carousel.tsx +10 -6
  337. package/src/Chat/Chat.doc.mjs +2 -0
  338. package/src/Chat/ChatDictationButton.tsx +7 -1
  339. package/src/Chat/ChatLayoutScrollButton.test.tsx +22 -0
  340. package/src/Chat/ChatLayoutScrollButton.tsx +8 -1
  341. package/src/Chat/ChatSendButton.tsx +2 -3
  342. package/src/Chat/ChatToolCalls.test.tsx +35 -0
  343. package/src/Chat/ChatToolCalls.tsx +36 -16
  344. package/src/Chat/useTriggerMenu.tsx +2 -5
  345. package/src/CheckboxInput/CheckboxInput.doc.mjs +4 -2
  346. package/src/CheckboxInput/CheckboxInput.test.tsx +115 -0
  347. package/src/CheckboxInput/CheckboxInput.tsx +45 -202
  348. package/src/ClickableCard/ClickableCard.tsx +6 -11
  349. package/src/CodeBlock/CodeBlock.doc.mjs +3 -0
  350. package/src/CodeBlock/CodeBlock.test.tsx +91 -0
  351. package/src/CodeBlock/CodeBlock.tsx +57 -80
  352. package/src/Collapsible/Collapsible.tsx +22 -18
  353. package/src/CommandPalette/CommandPalette.test.tsx +29 -0
  354. package/src/CommandPalette/CommandPaletteItem.tsx +7 -4
  355. package/src/CommandPalette/CommandPaletteList.tsx +2 -2
  356. package/src/ComplexSelector/ComplexSelector.doc.mjs +42 -0
  357. package/src/ComplexSelector/ComplexSelector.test.tsx +64 -0
  358. package/src/ComplexSelector/ComplexSelector.tsx +46 -29
  359. package/src/ContextMenu/ContextMenu.doc.mjs +1 -1
  360. package/src/ContextMenu/ContextMenu.test.tsx +41 -0
  361. package/src/ContextMenu/ContextMenu.tsx +3 -3
  362. package/src/ContextMenu/index.ts +5 -1
  363. package/src/DateInput/DateInput.doc.mjs +18 -3
  364. package/src/DateInput/DateInput.test.tsx +93 -11
  365. package/src/DateInput/DateInput.tsx +41 -19
  366. package/src/DateRangeInput/DateRangeInput.doc.mjs +10 -2
  367. package/src/DateRangeInput/DateRangeInput.test.tsx +110 -14
  368. package/src/DateRangeInput/DateRangeInput.tsx +24 -12
  369. package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -2
  370. package/src/DateTimeInput/DateTimeInput.test.tsx +75 -0
  371. package/src/DateTimeInput/DateTimeInput.tsx +35 -8
  372. package/src/Dialog/Dialog.tsx +2 -9
  373. package/src/DropdownMenu/DropdownMenu.doc.mjs +5 -9
  374. package/src/DropdownMenu/DropdownMenu.test.tsx +534 -4
  375. package/src/DropdownMenu/DropdownMenu.tsx +113 -52
  376. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +27 -30
  377. package/src/DropdownMenu/DropdownMenuDivider.doc.mjs +34 -0
  378. package/src/DropdownMenu/DropdownMenuDivider.tsx +81 -0
  379. package/src/DropdownMenu/DropdownMenuItem.doc.mjs +39 -4
  380. package/src/DropdownMenu/DropdownMenuItem.tsx +48 -10
  381. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +30 -76
  382. package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +25 -19
  383. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +44 -14
  384. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +1 -5
  385. package/src/DropdownMenu/index.ts +8 -1
  386. package/src/DropdownMenu/renderDropdownItems.tsx +33 -34
  387. package/src/EmptyState/EmptyState.doc.mjs +4 -0
  388. package/src/EmptyState/EmptyState.test.tsx +62 -0
  389. package/src/EmptyState/EmptyState.tsx +16 -6
  390. package/src/Field/Field.doc.mjs +1 -0
  391. package/src/Field/InputClearButton.test.tsx +117 -0
  392. package/src/Field/InputClearButton.tsx +30 -3
  393. package/src/HoverCard/useHoverCard.tsx +2 -23
  394. package/src/Icon/Icon.doc.mjs +2 -1
  395. package/src/Indicator/CheckIndicator.tsx +174 -0
  396. package/src/Indicator/CheckboxIndicator.tsx +257 -0
  397. package/src/Indicator/Indicator.doc.mjs +344 -0
  398. package/src/Indicator/Indicator.test.tsx +393 -0
  399. package/src/Indicator/RadioIndicator.tsx +206 -0
  400. package/src/Indicator/index.ts +45 -0
  401. package/src/Indicator/indicator.markers.stylex.ts +19 -0
  402. package/src/Indicator/indicatorRegistry.test.tsx +106 -0
  403. package/src/Indicator/indicatorRegistry.ts +120 -0
  404. package/src/Indicator/types.ts +186 -0
  405. package/src/Indicator/useIndicator.ts +39 -0
  406. package/src/Item/Item.doc.mjs +1 -1
  407. package/src/Item/Item.tsx +7 -14
  408. package/src/Layer/useLayer.doc.mjs +2 -2
  409. package/src/Layer/useLayer.test.tsx +85 -0
  410. package/src/Layer/useLayer.tsx +39 -1
  411. package/src/Lightbox/Lightbox.doc.mjs +1 -1
  412. package/src/Lightbox/Lightbox.tsx +43 -38
  413. package/src/Link/Link.tsx +4 -11
  414. package/src/MobileNav/MobileNav.tsx +3 -3
  415. package/src/MoreMenu/MoreMenu.doc.mjs +31 -0
  416. package/src/MoreMenu/MoreMenu.test.tsx +68 -1
  417. package/src/MoreMenu/MoreMenu.tsx +19 -0
  418. package/src/MultiSelector/MultiSelector.doc.mjs +9 -1
  419. package/src/MultiSelector/MultiSelector.test.tsx +255 -16
  420. package/src/MultiSelector/MultiSelector.tsx +103 -99
  421. package/src/NumberInput/NumberInput.doc.mjs +265 -50
  422. package/src/NumberInput/NumberInput.test.tsx +726 -21
  423. package/src/NumberInput/NumberInput.tsx +353 -59
  424. package/src/Outline/Outline.tsx +2 -5
  425. package/src/Pagination/Pagination.doc.mjs +1 -1
  426. package/src/Pagination/Pagination.test.tsx +22 -7
  427. package/src/Pagination/Pagination.tsx +38 -35
  428. package/src/Popover/Popover.tsx +6 -7
  429. package/src/PowerSearch/PowerSearch.tsx +1 -1
  430. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +42 -0
  431. package/src/PowerSearch/PowerSearchEditPopover.tsx +7 -0
  432. package/src/ProgressBar/ProgressBar.doc.mjs +27 -5
  433. package/src/ProgressBar/ProgressBar.test.tsx +224 -1
  434. package/src/ProgressBar/ProgressBar.tsx +124 -22
  435. package/src/RadioList/RadioList.doc.mjs +4 -2
  436. package/src/RadioList/RadioListItem.tsx +31 -130
  437. package/src/Resizable/ResizeHandle.tsx +2 -9
  438. package/src/SegmentedControl/SegmentedControlItem.tsx +2 -9
  439. package/src/SelectableCard/SelectableCard.tsx +4 -9
  440. package/src/Selector/Selector.doc.mjs +7 -4
  441. package/src/Selector/Selector.test.tsx +935 -25
  442. package/src/Selector/Selector.tsx +189 -106
  443. package/src/Selector/hooks.ts +77 -50
  444. package/src/SideNav/SideNav.test.tsx +46 -0
  445. package/src/SideNav/SideNav.tsx +1 -0
  446. package/src/SideNav/SideNavCollapseButton.tsx +15 -10
  447. package/src/SideNav/SideNavHeading.tsx +48 -10
  448. package/src/SideNav/SideNavItem.tsx +20 -12
  449. package/src/Stack/Stack.doc.mjs +110 -0
  450. package/src/StatusDot/StatusDot.doc.mjs +12 -3
  451. package/src/Switch/Switch.test.tsx +32 -0
  452. package/src/Switch/Switch.tsx +8 -8
  453. package/src/TabList/Tab.tsx +2 -9
  454. package/src/TabList/TabMenu.tsx +14 -21
  455. package/src/Table/BaseTable.tsx +11 -0
  456. package/src/Table/index.ts +1 -4
  457. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +30 -14
  458. package/src/Table/plugins/rowExpansion/index.ts +1 -4
  459. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +125 -175
  460. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +115 -458
  461. package/src/Table/plugins/sortable/useTableSortable.tsx +2 -6
  462. package/src/Table/plugins/tree/useTableTreeData.tsx +43 -24
  463. package/src/Table/tableContextMenu.test.tsx +27 -0
  464. package/src/Table/tableContextMenu.tsx +1 -0
  465. package/src/Table/types.ts +11 -0
  466. package/src/Table/useTableGroupedRows.doc.mjs +1 -1
  467. package/src/Table/useTableRowExpansion.doc.mjs +43 -66
  468. package/src/TextArea/TextArea.doc.mjs +42 -2
  469. package/src/TextArea/TextArea.test.tsx +219 -0
  470. package/src/TextArea/TextArea.tsx +34 -7
  471. package/src/TextInput/TextInput.doc.mjs +18 -2
  472. package/src/TextInput/TextInput.test.tsx +189 -0
  473. package/src/TextInput/TextInput.tsx +25 -31
  474. package/src/Thumbnail/Thumbnail.tsx +2 -9
  475. package/src/TimeInput/TimeInput.doc.mjs +2 -2
  476. package/src/TimeInput/TimeInput.test.tsx +30 -3
  477. package/src/TimeInput/TimeInput.tsx +9 -26
  478. package/src/Timestamp/Timestamp.doc.mjs +4 -3
  479. package/src/Timestamp/TimestampHoverCard.tsx +13 -35
  480. package/src/Token/Token.tsx +5 -28
  481. package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
  482. package/src/Tokenizer/Tokenizer.test.tsx +45 -3
  483. package/src/Tokenizer/Tokenizer.tsx +10 -2
  484. package/src/Tooltip/useTooltip.tsx +2 -23
  485. package/src/TopNav/TopNav.tsx +1 -3
  486. package/src/TopNav/TopNavHeading.tsx +42 -13
  487. package/src/TopNav/TopNavItem.tsx +3 -21
  488. package/src/TopNav/TopNavMegaMenu.test.tsx +433 -33
  489. package/src/TopNav/TopNavMegaMenu.tsx +118 -53
  490. package/src/TopNav/TopNavMegaMenuItem.tsx +2 -9
  491. package/src/TopNav/TopNavMenu.tsx +34 -37
  492. package/src/TreeList/TreeList.doc.mjs +5 -0
  493. package/src/TreeList/TreeList.test.tsx +206 -7
  494. package/src/TreeList/TreeList.tsx +22 -0
  495. package/src/TreeList/TreeListBranches.tsx +25 -2
  496. package/src/TreeList/TreeListItem.tsx +89 -52
  497. package/src/Typeahead/BaseTypeahead.tsx +19 -6
  498. package/src/Typeahead/Typeahead.doc.mjs +1 -0
  499. package/src/Typeahead/Typeahead.test.tsx +76 -3
  500. package/src/hooks/containerReveal.stylex.ts +102 -0
  501. package/src/hooks/index.ts +4 -0
  502. package/src/hooks/useClipboard.doc.mjs +87 -0
  503. package/src/hooks/useClipboard.test.tsx +151 -0
  504. package/src/hooks/useClipboard.ts +135 -0
  505. package/src/hooks/useContainerReveal.doc.mjs +7 -7
  506. package/src/hooks/useContainerReveal.test.tsx +42 -62
  507. package/src/hooks/useContainerReveal.ts +36 -91
  508. package/src/hooks/useImageMode.test.ts +1 -1
  509. package/src/hooks/useIndicatorFocusRing.tsx +120 -0
  510. package/src/hooks/useLongPress.test.tsx +18 -0
  511. package/src/hooks/useLongPress.ts +12 -2
  512. package/src/hooks/useScrollLock.test.ts +72 -0
  513. package/src/hooks/useScrollLock.ts +51 -19
  514. package/src/hooks/useStreamingText.test.ts +46 -1
  515. package/src/hooks/useStreamingText.ts +49 -7
  516. package/src/hooks/useTreeFocus.test.tsx +50 -0
  517. package/src/hooks/useTreeFocus.ts +14 -3
  518. package/src/hooks/useTypeahead.test.tsx +150 -0
  519. package/src/hooks/useTypeahead.ts +24 -9
  520. package/src/i18n/InternationalizationProvider.doc.mjs +7 -2
  521. package/src/index.ts +1 -0
  522. package/src/theme/defineTheme.ts +24 -0
  523. package/src/theme/derivedVarRegistry.test.ts +21 -1
  524. package/src/theme/derivedVarRegistry.ts +19 -6
  525. package/src/theme/expandColorScale.test.ts +14 -0
  526. package/src/theme/expandColorScale.ts +24 -9
  527. package/src/theme/expandTypeScale.test.ts +43 -0
  528. package/src/theme/expandTypeScale.ts +17 -0
  529. package/src/theme/generateThemeRules.test.ts +61 -20
  530. package/src/theme/generateThemeRules.ts +11 -0
  531. package/src/theme/index.ts +13 -0
  532. package/src/utils/focusOutline.stylex.ts +163 -0
  533. package/src/utils/focusReturn.test.ts +42 -0
  534. package/src/utils/focusReturn.ts +31 -0
  535. package/src/utils/index.ts +1 -0
  536. package/src/utils/mergeRefs.test.ts +48 -0
  537. package/src/utils/mergeRefs.ts +12 -6
  538. package/src/utils/rtlStyles.ts +2 -2
  539. package/src/utils/themeProps.ts +26 -4
  540. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts +0 -9
  541. package/dist/CheckboxInput/checkbox.markers.stylex.d.ts.map +0 -1
  542. package/dist/CheckboxInput/checkbox.markers.stylex.js +0 -14
  543. package/dist/RadioList/radio.markers.stylex.d.ts +0 -7
  544. package/dist/RadioList/radio.markers.stylex.d.ts.map +0 -1
  545. package/dist/RadioList/radio.markers.stylex.js +0 -12
  546. package/dist/hooks/containerReveal.pool.stylex.d.ts +0 -303
  547. package/dist/hooks/containerReveal.pool.stylex.d.ts.map +0 -1
  548. package/dist/hooks/containerReveal.pool.stylex.js +0 -292
  549. package/src/CheckboxInput/checkbox.markers.stylex.ts +0 -12
  550. package/src/RadioList/radio.markers.stylex.ts +0 -10
  551. package/src/hooks/containerReveal.pool.stylex.ts +0 -571
@@ -4,30 +4,30 @@
4
4
 
5
5
  /**
6
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
- * @deprecated Superseded by the tree plugin (useTableTreeData +
11
- * useTableTreeState). Kept for back-compat; new tree tables should use the
12
- * tree plugin. See the migration guide on useTableRowExpansion.
7
+ * @input React, StyleX, Icon, Table types, i18n (useTranslator)
8
+ * @output Exports useTableRowExpansion hook + config type
9
+ * @position Row-expansion plugin (detail panel); consumed by Table via plugins prop
10
+ *
11
+ * Expands a full-width detail panel below a row, rendered by the consumer's
12
+ * `renderExpanded(item)`. For hierarchical/tree tables (child rows that reuse
13
+ * the parent columns) use `useTableTreeData` + `useTableTreeState` instead.
13
14
  *
14
15
  * SYNC: When modified, update these files to stay in sync:
15
16
  * - /packages/core/src/Table/index.ts (exports)
17
+ * - /packages/core/src/Table/useTableRowExpansion.doc.mjs
16
18
  */
17
19
 
18
- import {useCallback, useMemo, useRef, type ReactNode} from 'react';
20
+ import {useMemo, useRef, type ReactNode} from 'react';
19
21
  import * as stylex from '@stylexjs/stylex';
20
22
  import {spacingVars, colorVars, radiusVars} from '../../../theme/tokens.stylex';
21
23
  import {Icon} from '../../../Icon';
22
- import {rtlStyles} from '../../../utils';
23
24
  import {resolveContextActions} from '../../tableContextMenu';
24
25
  import {useTranslator} from '../../../i18n';
25
26
  import type {
26
27
  TablePlugin,
27
28
  TableColumn,
28
- BodyCellRenderProps,
29
29
  BodyRowRenderProps,
30
- HeaderCellRenderProps,
30
+ BodyCellRenderProps,
31
31
  } from '../../types';
32
32
 
33
33
  // =============================================================================
@@ -35,253 +35,29 @@ import type {
35
35
  // =============================================================================
36
36
 
37
37
  /**
38
- * Configuration for useTableRowExpansion (inherited-columns mode).
38
+ * Configuration for useTableRowExpansion (detail-panel mode).
39
39
  *
40
- * Child rows use the same columns as their parents, with indentation on the
41
- * first content column. The consumer provides a **flat** data array (use
42
- * {@link useTableRowExpansionState} to flatten a tree) and a `getDepth`
43
- * function so the plugin knows each row's nesting level.
40
+ * The consumer owns expansion state; the plugin provides the chevron UI, the
41
+ * full-width detail panel rendered below an expanded row, and a right-click
42
+ * "Expand/Collapse row" action.
44
43
  */
45
44
  export interface UseTableRowExpansionConfig<T extends Record<string, unknown>> {
46
45
  /** Set of currently-expanded row keys. */
47
46
  expandedKeys: Set<string>;
48
- /** Called when a row's expansion is toggled. */
47
+ /** Called with a row key when its expansion is toggled. */
49
48
  onToggle: (key: string) => void;
50
49
  /** Derive a stable unique key from a row item. */
51
50
  getRowKey: (item: T) => string;
52
- /** Return the children of a row (used to determine expandability). */
53
- getChildren: (item: T) => T[];
54
- /** Return the depth of a row in the hierarchy (0 = top-level). */
55
- getDepth?: (item: T) => number;
56
- /** Optionally control which rows are expandable. @default checks getChildren length */
57
- getIsItemExpandable?: (item: T) => boolean;
58
51
  /**
59
- * When true, clicking anywhere on the row toggles expansion (in addition to
60
- * the chevron button). @default false — only the chevron triggers expansion.
52
+ * Render the detail content shown in a full-width panel below the row when
53
+ * it is expanded. Receives the row's item.
61
54
  */
62
- hasRowClickExpansion?: boolean;
55
+ renderExpanded: (item: T) => ReactNode;
63
56
  /**
64
- * State of the expand-all toggle in the header. `true` = all expanded,
65
- * `false` = all collapsed, `'indeterminate'` = mixed. When provided
66
- * (together with `onToggleExpandAll`), the header cell shows a toggle button.
67
- */
68
- isAllExpanded?: boolean | 'indeterminate';
69
- /** Called when the expand-all header toggle is clicked. */
70
- onToggleExpandAll?: (expand: boolean) => void;
71
- }
72
-
73
- /**
74
- * Configuration for {@link useTableRowExpansionState}.
75
- *
76
- * Mirrors the shape of {@link useTableSelectionState}: you own the
77
- * `expandedKeys` set (via `useState`), and the hook derives everything the
78
- * plugin needs — the flattened `data`, per-row depth, expand/collapse
79
- * handlers, and the expand-all toggle state.
80
- */
81
- export interface UseTableRowExpansionStateConfig<
82
- T extends Record<string, unknown>,
83
- > {
84
- /** The full, un-flattened tree. */
85
- baseData: T[];
86
- /** Return the children of a row. Leaf rows return an empty array. */
87
- getChildren: (item: T) => T[];
88
- /** Derive a stable unique key from a row item. */
89
- getRowKey: (item: T) => string;
90
- /**
91
- * Should this row be expandable? Rows that return `false` never show a
92
- * chevron and are skipped by expand-all. @default rows with children
57
+ * Control which rows are expandable. Non-expandable rows show no chevron, no
58
+ * context-menu action, and never render a panel. @default all rows expandable
93
59
  */
94
60
  getIsItemExpandable?: (item: T) => boolean;
95
- /** Controlled set of currently-expanded row keys. */
96
- expandedKeys: Set<string>;
97
- /** Setter for the controlled expanded keys. */
98
- setExpandedKeys: React.Dispatch<React.SetStateAction<Set<string>>>;
99
- }
100
-
101
- export interface UseTableRowExpansionStateResult<
102
- T extends Record<string, unknown>,
103
- > {
104
- /** The flattened, currently-visible rows. Pass to `<Table data>`. */
105
- data: T[];
106
- /** Ready-to-use config for {@link useTableRowExpansion}. */
107
- expansionConfig: UseTableRowExpansionConfig<T>;
108
- }
109
-
110
- /**
111
- * Manages row-expansion state and derives the config for
112
- * {@link useTableRowExpansion}.
113
- *
114
- * @deprecated Use `useTableTreeState` (with `useTableTreeData`) instead. The
115
- * tree plugin covers the same affordances (expand-all header control,
116
- * whole-row click) with a cycle guard and per-row fine-grained re-render. See
117
- * the migration guide on `useTableRowExpansion` (`astryx component
118
- * useTableRowExpansion --detail full`) for the before/after and config
119
- * mapping.
120
- *
121
- * @example
122
- * ```
123
- * const [expandedKeys, setExpandedKeys] = useState<Set<string>>(new Set());
124
- * const {data, expansionConfig} = useTableRowExpansionState({
125
- * baseData: tree,
126
- * getChildren: item => item.children ?? [],
127
- * getRowKey: item => item.id,
128
- * expandedKeys,
129
- * setExpandedKeys,
130
- * });
131
- * const expansion = useTableRowExpansion(expansionConfig);
132
- * <Table data={data} columns={columns} idKey="id" plugins={{expansion}} />;
133
- * ```
134
- */
135
- export function useTableRowExpansionState<T extends Record<string, unknown>>({
136
- baseData,
137
- getChildren,
138
- getRowKey,
139
- getIsItemExpandable,
140
- expandedKeys,
141
- setExpandedKeys,
142
- }: UseTableRowExpansionStateConfig<T>): UseTableRowExpansionStateResult<T> {
143
- const isExpandable = useCallback(
144
- (item: T): boolean =>
145
- getIsItemExpandable
146
- ? getIsItemExpandable(item)
147
- : getChildren(item).length > 0,
148
- [getIsItemExpandable, getChildren],
149
- );
150
-
151
- const depthMap = useMemo(() => {
152
- const map = new Map<string, number>();
153
- // Ancestor keys on the current walk path — guards against cyclic data.
154
- const path = new Set<string>();
155
- function walk(items: T[], depth: number) {
156
- for (const item of items) {
157
- const key = getRowKey(item);
158
- if (path.has(key)) {
159
- continue; // cyclic edge — skip
160
- }
161
- map.set(key, depth);
162
- if (expandedKeys.has(key)) {
163
- path.add(key);
164
- walk(getChildren(item), depth + 1);
165
- path.delete(key);
166
- }
167
- }
168
- }
169
- walk(baseData, 0);
170
- return map;
171
- }, [baseData, getChildren, getRowKey, expandedKeys]);
172
-
173
- const data = useMemo(() => {
174
- const result: T[] = [];
175
- // Ancestor keys on the current walk path — guards against cyclic data.
176
- const path = new Set<string>();
177
- function walk(items: T[]) {
178
- for (const item of items) {
179
- const key = getRowKey(item);
180
- if (path.has(key)) {
181
- continue; // cyclic edge — skip
182
- }
183
- result.push(item);
184
- if (expandedKeys.has(key)) {
185
- path.add(key);
186
- walk(getChildren(item));
187
- path.delete(key);
188
- }
189
- }
190
- }
191
- walk(baseData);
192
- return result;
193
- }, [baseData, getChildren, getRowKey, expandedKeys]);
194
-
195
- // Every expandable key across the whole tree (drives expand-all).
196
- const allExpandableKeys = useMemo(() => {
197
- const keys: string[] = [];
198
- // Ancestor keys on the current walk path — guards against cyclic data.
199
- const path = new Set<string>();
200
- function walk(items: T[]) {
201
- for (const item of items) {
202
- const key = getRowKey(item);
203
- if (path.has(key)) {
204
- continue; // cyclic edge — skip
205
- }
206
- if (isExpandable(item)) {
207
- keys.push(key);
208
- path.add(key);
209
- walk(getChildren(item));
210
- path.delete(key);
211
- }
212
- }
213
- }
214
- walk(baseData);
215
- return keys;
216
- }, [baseData, getChildren, getRowKey, isExpandable]);
217
-
218
- const getDepth = useCallback(
219
- (item: T) => depthMap.get(getRowKey(item)) ?? 0,
220
- [depthMap, getRowKey],
221
- );
222
-
223
- const onToggle = useCallback(
224
- (key: string) => {
225
- setExpandedKeys(prev => {
226
- const next = new Set(prev);
227
- if (next.has(key)) {
228
- next.delete(key);
229
- } else {
230
- next.add(key);
231
- }
232
- return next;
233
- });
234
- },
235
- [setExpandedKeys],
236
- );
237
-
238
- const isAllExpanded: boolean | 'indeterminate' = useMemo(() => {
239
- if (allExpandableKeys.length === 0) {
240
- return false;
241
- }
242
- const expandedCount = allExpandableKeys.filter(k =>
243
- expandedKeys.has(k),
244
- ).length;
245
- if (expandedCount === 0) {
246
- return false;
247
- }
248
- if (expandedCount === allExpandableKeys.length) {
249
- return true;
250
- }
251
- return 'indeterminate';
252
- }, [allExpandableKeys, expandedKeys]);
253
-
254
- const onToggleExpandAll = useCallback(
255
- (expand: boolean) => {
256
- setExpandedKeys(expand ? new Set(allExpandableKeys) : new Set());
257
- },
258
- [setExpandedKeys, allExpandableKeys],
259
- );
260
-
261
- const expansionConfig = useMemo(
262
- (): UseTableRowExpansionConfig<T> => ({
263
- expandedKeys,
264
- onToggle,
265
- getRowKey,
266
- getChildren,
267
- getDepth,
268
- getIsItemExpandable,
269
- isAllExpanded,
270
- onToggleExpandAll,
271
- }),
272
- [
273
- expandedKeys,
274
- onToggle,
275
- getRowKey,
276
- getChildren,
277
- getDepth,
278
- getIsItemExpandable,
279
- isAllExpanded,
280
- onToggleExpandAll,
281
- ],
282
- );
283
-
284
- return {data, expansionConfig};
285
61
  }
286
62
 
287
63
  // =============================================================================
@@ -290,26 +66,22 @@ export function useTableRowExpansionState<T extends Record<string, unknown>>({
290
66
 
291
67
  const EXPANSION_COLUMN_WIDTH = {type: 'pixel' as const, value: 40};
292
68
 
293
- /** Indentation applied per depth level, in pixels. */
294
- const INDENT_PER_DEPTH = 24;
295
-
296
69
  const expansionStyles = stylex.create({
297
70
  chevronButton: {
298
71
  display: 'inline-flex',
299
72
  alignItems: 'center',
300
73
  justifyContent: 'center',
301
- width: '24px',
302
- height: '24px',
74
+ width: spacingVars['--spacing-6'],
75
+ height: spacingVars['--spacing-6'],
303
76
  background: 'transparent',
304
77
  border: 'none',
305
78
  borderRadius: radiusVars['--radius-inner'],
306
79
  cursor: 'pointer',
307
80
  color: colorVars['--color-icon-secondary'],
308
- transitionProperty: 'transform, color, background-color',
81
+ transitionProperty: 'transform, color',
309
82
  transitionDuration: '150ms',
310
83
  padding: 0,
311
- flexShrink: '0',
312
- // Match IconButton ghost hover: subtle overlay background
84
+ // Match IconButton ghost hover: subtle overlay background.
313
85
  backgroundImage: {
314
86
  default: null,
315
87
  ':hover': {
@@ -323,62 +95,45 @@ const expansionStyles = stylex.create({
323
95
  chevronExpanded: {
324
96
  transform: 'rotate(90deg)',
325
97
  },
326
- chevronIcon: {
327
- display: 'inline-flex',
328
- transitionProperty: 'transform',
329
- transitionDuration: '150ms',
330
- },
331
- indentedCell: {
332
- display: 'flex',
333
- alignItems: 'center',
334
- gap: spacingVars['--spacing-1'],
98
+ expandedRow: {
99
+ backgroundColor: colorVars['--color-background-muted'],
335
100
  },
336
- indent: (px: number) => ({
337
- paddingInlineStart: `${px}px`,
338
- }),
339
- placeholder: {
340
- display: 'inline-block',
341
- width: '24px',
342
- height: '24px',
343
- flexShrink: '0',
344
- },
345
- clickableRow: {
346
- cursor: 'pointer',
101
+ expandedCell: {
102
+ paddingBlock: spacingVars['--spacing-4'],
103
+ paddingInline: spacingVars['--spacing-5'],
347
104
  },
348
105
  });
349
106
 
350
107
  // =============================================================================
351
- // Chevron
108
+ // Chevron Cell
352
109
  // =============================================================================
353
110
 
354
111
  function ExpansionChevron({
355
112
  isExpanded,
356
113
  onToggle,
357
- ariaLabel,
358
114
  }: {
359
115
  isExpanded: boolean;
360
116
  onToggle: () => void;
361
- ariaLabel: string;
362
117
  }) {
118
+ const t = useTranslator();
363
119
  return (
364
120
  <button
365
121
  type="button"
366
- {...stylex.props(expansionStyles.chevronButton)}
122
+ {...stylex.props(
123
+ expansionStyles.chevronButton,
124
+ isExpanded && expansionStyles.chevronExpanded,
125
+ )}
367
126
  onClick={e => {
368
127
  e.stopPropagation();
369
128
  onToggle();
370
129
  }}
371
- aria-label={ariaLabel}
130
+ aria-label={
131
+ isExpanded
132
+ ? t('@astryx.tableRowExpansion.collapseRow')
133
+ : t('@astryx.tableRowExpansion.expandRow')
134
+ }
372
135
  aria-expanded={isExpanded}>
373
- <span {...stylex.props(rtlStyles.mirror)}>
374
- <span
375
- {...stylex.props(
376
- expansionStyles.chevronIcon,
377
- isExpanded && expansionStyles.chevronExpanded,
378
- )}>
379
- <Icon icon="chevronRight" size="xsm" />
380
- </span>
381
- </span>
136
+ <Icon icon="chevronRight" size="xsm" />
382
137
  </button>
383
138
  );
384
139
  }
@@ -388,33 +143,48 @@ function ExpansionChevron({
388
143
  // =============================================================================
389
144
 
390
145
  /**
391
- * Returns a TablePlugin implementing expandable rows with inherited columns.
146
+ * Returns a TablePlugin that expands a full-width detail panel below a row.
147
+ *
148
+ * The consumer owns the `expandedKeys` set (via `useState`); the plugin adds
149
+ * a leading chevron column, a right-click expand/collapse action, and renders
150
+ * `renderExpanded(item)` in a full-width panel below each expanded row.
392
151
  *
393
- * @deprecated Use `useTableTreeData` (with `useTableTreeState`) instead. The
394
- * tree plugin covers the same affordances (expand-all header control,
395
- * whole-row click) with a cycle guard and per-row fine-grained re-render. See
396
- * the migration guide on this hook's docs (`astryx component
397
- * useTableRowExpansion --detail full`) for the before/after and config
398
- * mapping.
152
+ * For hierarchical data (child rows sharing the parent columns) use
153
+ * `useTableTreeData` + `useTableTreeState` instead.
154
+ *
155
+ * @example
156
+ * ```
157
+ * const [expandedKeys, setExpandedKeys] = useState<Set<string>>(new Set());
158
+ * const expansion = useTableRowExpansion({
159
+ * expandedKeys,
160
+ * onToggle: key =>
161
+ * setExpandedKeys(prev => {
162
+ * const next = new Set(prev);
163
+ * next.has(key) ? next.delete(key) : next.add(key);
164
+ * return next;
165
+ * }),
166
+ * getRowKey: item => item.id,
167
+ * renderExpanded: item => <OrderDetails order={item} />,
168
+ * });
169
+ * <Table data={data} columns={columns} idKey="id" plugins={{expansion}} />;
170
+ * ```
399
171
  */
400
172
  export function useTableRowExpansion<T extends Record<string, unknown>>(
401
173
  config: UseTableRowExpansionConfig<T>,
402
174
  ): TablePlugin<T> {
403
- const t = useTranslator();
404
175
  const {
405
176
  expandedKeys,
406
177
  onToggle,
407
178
  getRowKey,
408
- getChildren,
409
- getDepth,
179
+ renderExpanded,
410
180
  getIsItemExpandable,
411
- hasRowClickExpansion = false,
412
- isAllExpanded,
413
- onToggleExpandAll,
414
181
  } = config;
415
182
 
416
- // Track the first non-plugin column key for indentation.
417
- const firstUserColumnKeyRef = useRef<string | null>(null);
183
+ const t = useTranslator();
184
+
185
+ // Final rendered column count, captured in transformColumns (pipeline step
186
+ // 1) and read in transformBodyRow for the detail panel's colSpan.
187
+ const columnCountRef = useRef(1);
418
188
 
419
189
  const expansionColumn = useMemo(
420
190
  (): TableColumn<T> => ({
@@ -423,168 +193,45 @@ export function useTableRowExpansion<T extends Record<string, unknown>>(
423
193
  width: EXPANSION_COLUMN_WIDTH,
424
194
  resizable: false,
425
195
  renderCell: (item: T) => {
426
- // Child rows (depth > 0) show their chevron inline in the first user
427
- // column instead — don't double up here.
428
- const depth = getDepth ? getDepth(item) : 0;
429
- if (depth > 0) {
430
- return null;
431
- }
432
-
433
- const key = getRowKey(item);
434
196
  const expandable = getIsItemExpandable
435
197
  ? getIsItemExpandable(item)
436
- : getChildren(item).length > 0;
198
+ : true;
437
199
  if (!expandable) {
438
200
  return null;
439
201
  }
440
- const isExpanded = expandedKeys.has(key);
202
+ const key = getRowKey(item);
441
203
  return (
442
204
  <ExpansionChevron
443
- isExpanded={isExpanded}
205
+ isExpanded={expandedKeys.has(key)}
444
206
  onToggle={() => onToggle(key)}
445
- ariaLabel={
446
- isExpanded
447
- ? t('@astryx.tableRowExpansion.collapseRow')
448
- : t('@astryx.tableRowExpansion.expandRow')
449
- }
450
207
  />
451
208
  );
452
209
  },
453
210
  }),
454
- [
455
- expandedKeys,
456
- onToggle,
457
- getRowKey,
458
- getChildren,
459
- getIsItemExpandable,
460
- getDepth,
461
- t,
462
- ],
211
+ [expandedKeys, onToggle, getRowKey, getIsItemExpandable],
463
212
  );
464
213
 
465
214
  return useMemo(
466
215
  (): TablePlugin<T> => ({
467
216
  transformColumns(columns: TableColumn<T>[]) {
468
- // Track the first user column for indentation.
469
- const firstUserCol = columns.find(c => !c.key.startsWith('__'));
470
- firstUserColumnKeyRef.current = firstUserCol?.key ?? null;
471
-
472
- // Wrap the first user column's renderCell to add depth indentation +
473
- // an inline chevron for child rows. This is the inherited-columns
474
- // pattern: child rows use the same columns but indent their first
475
- // content cell.
476
- const wrappedColumns = columns.map(col => {
477
- if (col.key !== firstUserColumnKeyRef.current) {
478
- return col;
479
- }
480
- const originalRenderCell = col.renderCell;
481
- return {
482
- ...col,
483
- renderCell: (item: T): ReactNode => {
484
- const depth = getDepth ? getDepth(item) : 0;
485
- const originalContent = originalRenderCell
486
- ? originalRenderCell(item)
487
- : String(
488
- ((item as Record<string, unknown>)[col.key] as
489
- string | number | null | undefined) ?? '',
490
- );
491
-
492
- if (depth === 0) {
493
- return originalContent;
494
- }
495
-
496
- const indent = (depth - 1) * INDENT_PER_DEPTH;
497
- const key = getRowKey(item);
498
- const isExpanded = expandedKeys.has(key);
499
- const expandable = getIsItemExpandable
500
- ? getIsItemExpandable(item)
501
- : getChildren(item).length > 0;
502
-
503
- const chevron = expandable ? (
504
- <ExpansionChevron
505
- isExpanded={isExpanded}
506
- onToggle={() => onToggle(key)}
507
- ariaLabel={
508
- isExpanded
509
- ? t('@astryx.tableRowExpansion.collapseRow')
510
- : t('@astryx.tableRowExpansion.expandRow')
511
- }
512
- />
513
- ) : (
514
- <span {...stylex.props(expansionStyles.placeholder)} />
515
- );
516
-
517
- return (
518
- <div
519
- {...stylex.props(
520
- expansionStyles.indentedCell,
521
- indent > 0 && expansionStyles.indent(indent),
522
- )}>
523
- {chevron}
524
- {originalContent}
525
- </div>
526
- );
527
- },
528
- };
529
- });
530
-
531
- return [expansionColumn, ...wrappedColumns];
532
- },
533
-
534
- transformHeaderCell(
535
- props: HeaderCellRenderProps,
536
- column: TableColumn<T>,
537
- ): HeaderCellRenderProps {
538
- if (column.key !== '__expansion') {
539
- return props;
540
- }
541
-
542
- // Show expand-all toggle when the consumer provides the state + callback.
543
- if (isAllExpanded !== undefined && onToggleExpandAll) {
544
- const allExpanded = isAllExpanded === true;
545
- return {
546
- ...props,
547
- content: (
548
- <button
549
- type="button"
550
- {...stylex.props(expansionStyles.chevronButton)}
551
- onClick={() => onToggleExpandAll(!allExpanded)}
552
- aria-label={
553
- allExpanded
554
- ? t('@astryx.tableRowExpansion.collapseAllRows')
555
- : t('@astryx.tableRowExpansion.expandAllRows')
556
- }>
557
- <span {...stylex.props(rtlStyles.mirror)}>
558
- <span
559
- {...stylex.props(
560
- expansionStyles.chevronIcon,
561
- allExpanded && expansionStyles.chevronExpanded,
562
- )}>
563
- <Icon icon="chevronRight" size="xsm" />
564
- </span>
565
- </span>
566
- </button>
567
- ),
568
- };
569
- }
570
-
571
- return {...props, content: null};
217
+ const withExpansion = [expansionColumn, ...columns];
218
+ columnCountRef.current = withExpansion.length;
219
+ return withExpansion;
572
220
  },
573
221
 
574
222
  transformBodyCell(
575
223
  props: BodyCellRenderProps,
576
- column: TableColumn<T>,
224
+ _column: TableColumn<T>,
577
225
  item: T,
578
226
  ): BodyCellRenderProps {
579
- // Contribute "Expand/Collapse row" context-menu action on every cell
580
- // so right-clicking anywhere in the row shows the option.
227
+ // Contribute the expand/collapse action on every cell; BaseTable
228
+ // aggregates them into one menu per row. Skip non-expandable rows.
581
229
  const expandable = getIsItemExpandable
582
230
  ? getIsItemExpandable(item)
583
- : getChildren(item).length > 0;
231
+ : true;
584
232
  if (!expandable) {
585
233
  return props;
586
234
  }
587
-
588
235
  const key = getRowKey(item);
589
236
  const isExpanded = expandedKeys.has(key);
590
237
  return {
@@ -598,13 +245,11 @@ export function useTableRowExpansion<T extends Record<string, unknown>>(
598
245
  ? t('@astryx.tableRowExpansion.collapseRow')
599
246
  : t('@astryx.tableRowExpansion.expandRow'),
600
247
  icon: (
601
- <span {...stylex.props(rtlStyles.mirror)}>
602
- <Icon
603
- icon={isExpanded ? 'chevronDown' : 'chevronRight'}
604
- size="xsm"
605
- aria-hidden
606
- />
607
- </span>
248
+ <Icon
249
+ icon={isExpanded ? 'chevronDown' : 'chevronRight'}
250
+ size="xsm"
251
+ aria-hidden
252
+ />
608
253
  ),
609
254
  onSelect: () => onToggle(key),
610
255
  },
@@ -613,38 +258,50 @@ export function useTableRowExpansion<T extends Record<string, unknown>>(
613
258
  },
614
259
 
615
260
  transformBodyRow(props: BodyRowRenderProps, item: T): BodyRowRenderProps {
616
- if (!hasRowClickExpansion) {
617
- return props;
618
- }
619
261
  const expandable = getIsItemExpandable
620
262
  ? getIsItemExpandable(item)
621
- : getChildren(item).length > 0;
263
+ : true;
622
264
  if (!expandable) {
623
265
  return props;
624
266
  }
625
267
  const key = getRowKey(item);
268
+ if (!expandedKeys.has(key)) {
269
+ return props;
270
+ }
271
+
272
+ const panel = (
273
+ <tr
274
+ key={`${key}-expanded`}
275
+ {...stylex.props(expansionStyles.expandedRow)}>
276
+ <td
277
+ colSpan={columnCountRef.current}
278
+ {...stylex.props(expansionStyles.expandedCell)}>
279
+ {renderExpanded(item)}
280
+ </td>
281
+ </tr>
282
+ );
283
+
626
284
  return {
627
285
  ...props,
628
- htmlProps: {
629
- ...props.htmlProps,
630
- onClick: () => onToggle(key),
631
- },
632
- xstyle: [...props.xstyle, expansionStyles.clickableRow],
286
+ afterRow: props.afterRow ? (
287
+ <>
288
+ {props.afterRow}
289
+ {panel}
290
+ </>
291
+ ) : (
292
+ panel
293
+ ),
633
294
  };
634
295
  },
635
296
  }),
636
297
  [
637
298
  expandedKeys,
638
299
  getRowKey,
639
- onToggle,
640
- getChildren,
641
- getDepth,
300
+ renderExpanded,
642
301
  getIsItemExpandable,
643
- hasRowClickExpansion,
644
- isAllExpanded,
645
- onToggleExpandAll,
646
- expansionColumn,
302
+ onToggle,
647
303
  t,
304
+ expansionColumn,
648
305
  ],
649
306
  );
650
307
  }