@astryxdesign/core 0.1.1 → 0.1.2-canary.04e71b2

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 (631) hide show
  1. package/CHANGELOG.md +105 -0
  2. package/README.md +131 -13
  3. package/dist/Avatar/Avatar.d.ts.map +1 -1
  4. package/dist/Avatar/Avatar.js +11 -5
  5. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts +1 -1
  6. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  7. package/dist/AvatarGroup/AvatarGroupOverflow.js +4 -1
  8. package/dist/Banner/Banner.d.ts +7 -0
  9. package/dist/Banner/Banner.d.ts.map +1 -1
  10. package/dist/Banner/Banner.js +9 -2
  11. package/dist/Breadcrumbs/BreadcrumbItem.d.ts +1 -1
  12. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  13. package/dist/Breadcrumbs/BreadcrumbItem.js +24 -5
  14. package/dist/Button/Button.d.ts +12 -2
  15. package/dist/Button/Button.d.ts.map +1 -1
  16. package/dist/Button/Button.js +53 -17
  17. package/dist/Calendar/Calendar.d.ts +5 -4
  18. package/dist/Calendar/Calendar.d.ts.map +1 -1
  19. package/dist/Calendar/Calendar.js +82 -43
  20. package/dist/Calendar/hooks/index.d.ts +0 -2
  21. package/dist/Calendar/hooks/index.d.ts.map +1 -1
  22. package/dist/Calendar/hooks/index.js +1 -2
  23. package/dist/Calendar/index.d.ts +3 -3
  24. package/dist/Calendar/index.d.ts.map +1 -1
  25. package/dist/Calendar/index.js +1 -1
  26. package/dist/Calendar/styles.d.ts +3 -9
  27. package/dist/Calendar/styles.d.ts.map +1 -1
  28. package/dist/Calendar/styles.js +3 -11
  29. package/dist/Carousel/Carousel.d.ts.map +1 -1
  30. package/dist/Carousel/Carousel.js +17 -3
  31. package/dist/Center/Center.d.ts +11 -1
  32. package/dist/Center/Center.d.ts.map +1 -1
  33. package/dist/Center/Center.js +9 -3
  34. package/dist/Chat/ChatMessageList.d.ts +14 -1
  35. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  36. package/dist/Chat/ChatMessageList.js +2 -0
  37. package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
  38. package/dist/Chat/useTriggerMenu.js +4 -1
  39. package/dist/CheckboxInput/CheckboxInput.d.ts +23 -2
  40. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  41. package/dist/CheckboxInput/CheckboxInput.js +51 -9
  42. package/dist/CheckboxList/CheckboxList.d.ts +13 -1
  43. package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
  44. package/dist/CheckboxList/CheckboxList.js +39 -9
  45. package/dist/CheckboxList/CheckboxListContext.d.ts +7 -0
  46. package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
  47. package/dist/Citation/Citation.d.ts.map +1 -1
  48. package/dist/Citation/Citation.js +3 -3
  49. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  50. package/dist/CodeBlock/CodeBlock.js +49 -37
  51. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  52. package/dist/CommandPalette/CommandPalette.js +5 -5
  53. package/dist/ContextMenu/ContextMenu.d.ts +4 -5
  54. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  55. package/dist/ContextMenu/ContextMenu.js +93 -11
  56. package/dist/DateInput/DateInput.d.ts +23 -1
  57. package/dist/DateInput/DateInput.d.ts.map +1 -1
  58. package/dist/DateInput/DateInput.js +59 -8
  59. package/dist/DateRangeInput/DateRangeInput.d.ts +23 -1
  60. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  61. package/dist/DateRangeInput/DateRangeInput.js +42 -9
  62. package/dist/DateTimeInput/DateTimeInput.d.ts +35 -2
  63. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  64. package/dist/DateTimeInput/DateTimeInput.js +78 -15
  65. package/dist/Dialog/Dialog.d.ts.map +1 -1
  66. package/dist/Dialog/Dialog.js +12 -0
  67. package/dist/DropdownMenu/DropdownMenu.d.ts +1 -8
  68. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  69. package/dist/DropdownMenu/DropdownMenu.js +42 -14
  70. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  71. package/dist/EmptyState/EmptyState.js +7 -1
  72. package/dist/Field/Field.d.ts +19 -2
  73. package/dist/Field/Field.d.ts.map +1 -1
  74. package/dist/Field/Field.js +4 -0
  75. package/dist/Field/FieldLabel.d.ts +21 -2
  76. package/dist/Field/FieldLabel.d.ts.map +1 -1
  77. package/dist/Field/FieldLabel.js +41 -26
  78. package/dist/FileInput/FileInput.d.ts +22 -1
  79. package/dist/FileInput/FileInput.d.ts.map +1 -1
  80. package/dist/FileInput/FileInput.js +56 -10
  81. package/dist/Grid/Grid.d.ts +11 -1
  82. package/dist/Grid/Grid.d.ts.map +1 -1
  83. package/dist/Grid/Grid.js +8 -0
  84. package/dist/HoverCard/HoverCard.d.ts +2 -2
  85. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  86. package/dist/HoverCard/HoverCard.js +18 -6
  87. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  88. package/dist/HoverCard/useHoverCard.js +7 -3
  89. package/dist/InputGroup/InputGroup.d.ts +2 -2
  90. package/dist/InputGroup/InputGroup.d.ts.map +1 -1
  91. package/dist/InputGroup/InputGroup.js +14 -5
  92. package/dist/InputGroup/InputGroupContext.d.ts +4 -0
  93. package/dist/InputGroup/InputGroupContext.d.ts.map +1 -1
  94. package/dist/InputGroup/InputGroupContext.js +2 -2
  95. package/dist/InputGroup/index.d.ts +1 -0
  96. package/dist/InputGroup/index.d.ts.map +1 -1
  97. package/dist/Kbd/Kbd.d.ts.map +1 -1
  98. package/dist/Kbd/Kbd.js +34 -2
  99. package/dist/Layer/anchorName.d.ts +20 -0
  100. package/dist/Layer/anchorName.d.ts.map +1 -0
  101. package/dist/Layer/anchorName.js +36 -0
  102. package/dist/Layer/layerAnimations.stylex.d.ts +4 -0
  103. package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
  104. package/dist/Layer/layerAnimations.stylex.js +8 -4
  105. package/dist/Layer/useLayer.d.ts +29 -0
  106. package/dist/Layer/useLayer.d.ts.map +1 -1
  107. package/dist/Layer/useLayer.js +55 -11
  108. package/dist/Layout/Layout.d.ts +4 -11
  109. package/dist/Layout/Layout.d.ts.map +1 -1
  110. package/dist/Layout/Layout.js +10 -11
  111. package/dist/Layout/LayoutFooter.d.ts +2 -2
  112. package/dist/Layout/LayoutFooter.d.ts.map +1 -1
  113. package/dist/Layout/LayoutHeader.d.ts +2 -2
  114. package/dist/Layout/LayoutHeader.d.ts.map +1 -1
  115. package/dist/Layout/LayoutPanel.d.ts +2 -2
  116. package/dist/Layout/LayoutPanel.d.ts.map +1 -1
  117. package/dist/Layout/padding.stylex.d.ts +51 -0
  118. package/dist/Layout/padding.stylex.d.ts.map +1 -1
  119. package/dist/Layout/padding.stylex.js +63 -0
  120. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  121. package/dist/Lightbox/Lightbox.js +4 -2
  122. package/dist/Link/Link.d.ts +17 -2
  123. package/dist/Link/Link.d.ts.map +1 -1
  124. package/dist/Link/Link.js +20 -9
  125. package/dist/Link/LinkProvider.d.ts +1 -0
  126. package/dist/Link/LinkProvider.d.ts.map +1 -1
  127. package/dist/Link/LinkProvider.js +1 -0
  128. package/dist/Markdown/Markdown.d.ts.map +1 -1
  129. package/dist/Markdown/Markdown.js +18 -3
  130. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  131. package/dist/MobileNav/MobileNav.js +13 -0
  132. package/dist/MoreMenu/MoreMenu.d.ts +1 -7
  133. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  134. package/dist/MoreMenu/MoreMenu.js +0 -2
  135. package/dist/MultiSelector/MultiSelector.d.ts +25 -2
  136. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  137. package/dist/MultiSelector/MultiSelector.js +103 -22
  138. package/dist/MultiSelector/hooks.d.ts +12 -1
  139. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  140. package/dist/MultiSelector/hooks.js +14 -1
  141. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  142. package/dist/NavMenu/NavHeadingMenu.js +34 -3
  143. package/dist/NumberInput/NumberInput.d.ts +23 -2
  144. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  145. package/dist/NumberInput/NumberInput.js +62 -12
  146. package/dist/Pagination/Pagination.d.ts +1 -1
  147. package/dist/Pagination/Pagination.d.ts.map +1 -1
  148. package/dist/Pagination/Pagination.js +46 -28
  149. package/dist/Popover/usePopover.d.ts +25 -2
  150. package/dist/Popover/usePopover.d.ts.map +1 -1
  151. package/dist/Popover/usePopover.js +18 -6
  152. package/dist/PowerSearch/PowerSearch.d.ts +11 -1
  153. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  154. package/dist/PowerSearch/PowerSearch.js +6 -1
  155. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  156. package/dist/ProgressBar/ProgressBar.js +3 -5
  157. package/dist/RadioList/RadioList.d.ts +20 -2
  158. package/dist/RadioList/RadioList.d.ts.map +1 -1
  159. package/dist/RadioList/RadioList.js +105 -9
  160. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  161. package/dist/RadioList/RadioListItem.js +13 -2
  162. package/dist/SegmentedControl/SegmentedControl.d.ts +13 -2
  163. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  164. package/dist/SegmentedControl/SegmentedControl.js +78 -44
  165. package/dist/SegmentedControl/SegmentedControlContext.d.ts +7 -0
  166. package/dist/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
  167. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  168. package/dist/SegmentedControl/SegmentedControlItem.js +13 -2
  169. package/dist/Selector/Selector.d.ts +22 -1
  170. package/dist/Selector/Selector.d.ts.map +1 -1
  171. package/dist/Selector/Selector.js +84 -23
  172. package/dist/Selector/hooks.d.ts +8 -1
  173. package/dist/Selector/hooks.d.ts.map +1 -1
  174. package/dist/Selector/hooks.js +14 -1
  175. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  176. package/dist/SideNav/SideNavItem.js +1 -1
  177. package/dist/Skeleton/Skeleton.d.ts.map +1 -1
  178. package/dist/Skeleton/Skeleton.js +8 -2
  179. package/dist/Slider/Slider.d.ts +21 -0
  180. package/dist/Slider/Slider.d.ts.map +1 -1
  181. package/dist/Slider/Slider.js +38 -11
  182. package/dist/Spinner/Spinner.d.ts.map +1 -1
  183. package/dist/Spinner/Spinner.js +1 -1
  184. package/dist/Stack/Stack.d.ts +38 -23
  185. package/dist/Stack/Stack.d.ts.map +1 -1
  186. package/dist/Stack/Stack.js +25 -1
  187. package/dist/Stack/StackItem.d.ts +12 -23
  188. package/dist/Stack/StackItem.d.ts.map +1 -1
  189. package/dist/Stack/StackItem.js +8 -1
  190. package/dist/Switch/Switch.d.ts +23 -2
  191. package/dist/Switch/Switch.d.ts.map +1 -1
  192. package/dist/Switch/Switch.js +41 -11
  193. package/dist/TabList/Tab.d.ts.map +1 -1
  194. package/dist/TabList/Tab.js +6 -0
  195. package/dist/TabList/TabList.d.ts +16 -4
  196. package/dist/TabList/TabList.d.ts.map +1 -1
  197. package/dist/TabList/TabList.js +86 -10
  198. package/dist/TabList/TabListContext.d.ts +5 -0
  199. package/dist/TabList/TabListContext.d.ts.map +1 -1
  200. package/dist/TabList/TabListContext.js +5 -0
  201. package/dist/TabList/TabMenu.d.ts.map +1 -1
  202. package/dist/TabList/TabMenu.js +6 -1
  203. package/dist/Table/BaseTable.d.ts.map +1 -1
  204. package/dist/Table/BaseTable.js +38 -16
  205. package/dist/Table/Table.d.ts.map +1 -1
  206. package/dist/Table/Table.js +36 -7
  207. package/dist/Table/TableCell.d.ts +8 -1
  208. package/dist/Table/TableCell.d.ts.map +1 -1
  209. package/dist/Table/TableCell.js +10 -10
  210. package/dist/Table/TableHeaderCell.d.ts +8 -1
  211. package/dist/Table/TableHeaderCell.d.ts.map +1 -1
  212. package/dist/Table/TableHeaderCell.js +16 -16
  213. package/dist/Table/TableRow.d.ts +6 -1
  214. package/dist/Table/TableRow.d.ts.map +1 -1
  215. package/dist/Table/TableRow.js +15 -7
  216. package/dist/Table/index.d.ts +4 -1
  217. package/dist/Table/index.d.ts.map +1 -1
  218. package/dist/Table/index.js +3 -2
  219. package/dist/Table/plugins/pagination/paginateData.d.ts +2 -1
  220. package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
  221. package/dist/Table/plugins/pagination/paginateData.js +8 -3
  222. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  223. package/dist/Table/plugins/pagination/useTablePagination.js +6 -1
  224. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  225. package/dist/Table/plugins/sortable/useTableSortable.js +59 -3
  226. package/dist/Table/plugins/stickyColumns/index.d.ts +3 -0
  227. package/dist/Table/plugins/stickyColumns/index.d.ts.map +1 -0
  228. package/dist/Table/plugins/stickyColumns/index.js +3 -0
  229. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts +25 -0
  230. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -0
  231. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +369 -0
  232. package/dist/Table/tableContextMenu.d.ts +33 -0
  233. package/dist/Table/tableContextMenu.d.ts.map +1 -0
  234. package/dist/Table/tableContextMenu.js +133 -0
  235. package/dist/Table/types.d.ts +161 -5
  236. package/dist/Table/types.d.ts.map +1 -1
  237. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  238. package/dist/Table/useBaseTablePlugins.js +1 -1
  239. package/dist/Text/text.stylex.d.ts +2 -2
  240. package/dist/Text/text.stylex.js +2 -2
  241. package/dist/TextArea/TextArea.d.ts +22 -1
  242. package/dist/TextArea/TextArea.d.ts.map +1 -1
  243. package/dist/TextArea/TextArea.js +41 -9
  244. package/dist/TextInput/TextInput.d.ts +23 -2
  245. package/dist/TextInput/TextInput.d.ts.map +1 -1
  246. package/dist/TextInput/TextInput.js +55 -10
  247. package/dist/TimeInput/TimeInput.d.ts +23 -1
  248. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  249. package/dist/TimeInput/TimeInput.js +53 -10
  250. package/dist/Timestamp/Timestamp.d.ts +1 -1
  251. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  252. package/dist/Timestamp/Timestamp.js +28 -3
  253. package/dist/Toast/Toast.d.ts.map +1 -1
  254. package/dist/Toast/Toast.js +14 -0
  255. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  256. package/dist/Toast/ToastViewport.js +132 -3
  257. package/dist/ToggleButton/ToggleButton.d.ts +7 -9
  258. package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
  259. package/dist/ToggleButton/ToggleButton.js +34 -57
  260. package/dist/Tokenizer/Tokenizer.d.ts +12 -1
  261. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  262. package/dist/Tokenizer/Tokenizer.js +27 -5
  263. package/dist/Toolbar/Toolbar.d.ts +3 -3
  264. package/dist/Toolbar/Toolbar.d.ts.map +1 -1
  265. package/dist/Toolbar/Toolbar.js +51 -7
  266. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  267. package/dist/Tooltip/useTooltip.js +57 -9
  268. package/dist/TreeList/TreeList.d.ts +1 -1
  269. package/dist/TreeList/TreeList.d.ts.map +1 -1
  270. package/dist/TreeList/TreeList.js +72 -2
  271. package/dist/TreeList/TreeListItem.d.ts +11 -1
  272. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  273. package/dist/TreeList/TreeListItem.js +51 -12
  274. package/dist/TreeList/treeListItem.markers.stylex.d.ts +16 -0
  275. package/dist/TreeList/treeListItem.markers.stylex.d.ts.map +1 -0
  276. package/dist/TreeList/treeListItem.markers.stylex.js +22 -0
  277. package/dist/Typeahead/BaseTypeahead.d.ts +9 -0
  278. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  279. package/dist/Typeahead/BaseTypeahead.js +67 -6
  280. package/dist/Typeahead/Typeahead.d.ts +24 -1
  281. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  282. package/dist/Typeahead/Typeahead.js +29 -5
  283. package/dist/VisuallyHidden/VisuallyHidden.d.ts +61 -0
  284. package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -0
  285. package/dist/VisuallyHidden/VisuallyHidden.js +65 -0
  286. package/dist/VisuallyHidden/index.d.ts +11 -0
  287. package/dist/VisuallyHidden/index.d.ts.map +1 -0
  288. package/dist/VisuallyHidden/index.js +13 -0
  289. package/dist/astryx.css +40 -1
  290. package/dist/astryx.umd.js +147 -0
  291. package/dist/astryx.umd.js.map +7 -0
  292. package/dist/hooks/focusableSelector.d.ts +22 -0
  293. package/dist/hooks/focusableSelector.d.ts.map +1 -0
  294. package/dist/hooks/focusableSelector.js +24 -0
  295. package/dist/hooks/index.d.ts +12 -2
  296. package/dist/hooks/index.d.ts.map +1 -1
  297. package/dist/hooks/index.js +7 -2
  298. package/dist/hooks/useAnnounce.d.ts +40 -0
  299. package/dist/hooks/useAnnounce.d.ts.map +1 -0
  300. package/dist/hooks/useAnnounce.js +142 -0
  301. package/dist/hooks/useClickableContainer.d.ts +16 -1
  302. package/dist/hooks/useClickableContainer.d.ts.map +1 -1
  303. package/dist/hooks/useClickableContainer.js +16 -4
  304. package/dist/hooks/useEntryAnimation.d.ts.map +1 -1
  305. package/dist/hooks/useEntryAnimation.js +4 -4
  306. package/dist/hooks/useFocusTrap.d.ts +18 -0
  307. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  308. package/dist/hooks/useFocusTrap.js +87 -3
  309. package/dist/hooks/useGridFocus.d.ts +88 -1
  310. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  311. package/dist/hooks/useGridFocus.js +261 -62
  312. package/dist/hooks/useKeyboardHint.d.ts +82 -0
  313. package/dist/hooks/useKeyboardHint.d.ts.map +1 -0
  314. package/dist/hooks/useKeyboardHint.js +220 -0
  315. package/dist/hooks/useListFocus.d.ts +78 -7
  316. package/dist/hooks/useListFocus.d.ts.map +1 -1
  317. package/dist/hooks/useListFocus.js +305 -52
  318. package/dist/hooks/useLongPress.d.ts +21 -0
  319. package/dist/hooks/useLongPress.d.ts.map +1 -0
  320. package/dist/hooks/useLongPress.js +89 -0
  321. package/dist/hooks/useTreeFocus.d.ts +157 -0
  322. package/dist/hooks/useTreeFocus.d.ts.map +1 -0
  323. package/dist/hooks/useTreeFocus.js +337 -0
  324. package/dist/hooks/useTypeahead.d.ts +63 -0
  325. package/dist/hooks/useTypeahead.d.ts.map +1 -0
  326. package/dist/hooks/useTypeahead.js +117 -0
  327. package/dist/index.d.ts +1 -0
  328. package/dist/index.d.ts.map +1 -1
  329. package/dist/index.js +1 -0
  330. package/dist/theme/generateThemeRules.js +1 -1
  331. package/dist/theme/syntax/SyntaxTheme.d.ts +1 -1
  332. package/dist/theme/syntax/SyntaxTheme.js +1 -1
  333. package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
  334. package/dist/theme/syntax/defineSyntaxTheme.js +2 -2
  335. package/dist/theme/syntax/presets.d.ts +1 -1
  336. package/dist/theme/syntax/presets.d.ts.map +1 -1
  337. package/dist/theme/syntax/presets.js +1 -1
  338. package/dist/theme/syntax/tokens.d.ts +1 -1
  339. package/dist/theme/syntax/tokens.js +1 -1
  340. package/dist/theme/types.d.ts +1 -1
  341. package/dist/utils/dateTypes.d.ts +12 -0
  342. package/dist/utils/dateTypes.d.ts.map +1 -1
  343. package/dist/utils/dateTypes.js +41 -1
  344. package/dist/utils/index.d.ts +4 -0
  345. package/dist/utils/index.d.ts.map +1 -1
  346. package/dist/utils/index.js +3 -1
  347. package/dist/utils/inputAria.d.ts +29 -0
  348. package/dist/utils/inputAria.d.ts.map +1 -0
  349. package/dist/utils/inputAria.js +30 -0
  350. package/dist/utils/timeParser.d.ts.map +1 -1
  351. package/dist/utils/timeParser.js +5 -2
  352. package/package.json +15 -5
  353. package/src/Avatar/Avatar.test.tsx +37 -0
  354. package/src/Avatar/Avatar.tsx +10 -5
  355. package/src/AvatarGroup/AvatarGroupOverflow.tsx +3 -0
  356. package/src/Banner/Banner.doc.mjs +8 -0
  357. package/src/Banner/Banner.test.tsx +16 -7
  358. package/src/Banner/Banner.tsx +9 -2
  359. package/src/Breadcrumbs/BreadcrumbItem.tsx +25 -7
  360. package/src/Breadcrumbs/Breadcrumbs.test.tsx +31 -10
  361. package/src/Button/Button.doc.mjs +6 -0
  362. package/src/Button/Button.test.tsx +105 -11
  363. package/src/Button/Button.tsx +76 -21
  364. package/src/Calendar/Calendar.doc.mjs +4 -4
  365. package/src/Calendar/Calendar.test.tsx +168 -30
  366. package/src/Calendar/Calendar.tsx +121 -66
  367. package/src/Calendar/hooks/index.ts +0 -6
  368. package/src/Calendar/index.ts +1 -3
  369. package/src/Calendar/styles.ts +4 -9
  370. package/src/Carousel/Carousel.doc.mjs +7 -1
  371. package/src/Carousel/Carousel.test.tsx +20 -0
  372. package/src/Carousel/Carousel.tsx +16 -1
  373. package/src/Center/Center.doc.mjs +12 -2
  374. package/src/Center/Center.tsx +28 -3
  375. package/src/Chat/ChatComposer.doc.mjs +3 -0
  376. package/src/Chat/ChatComposerDrawer.doc.mjs +12 -0
  377. package/src/Chat/ChatMessageList.doc.mjs +8 -0
  378. package/src/Chat/ChatMessageList.test.tsx +18 -0
  379. package/src/Chat/ChatMessageList.tsx +16 -0
  380. package/src/Chat/useTriggerMenu.tsx +3 -0
  381. package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
  382. package/src/CheckboxInput/CheckboxInput.test.tsx +172 -27
  383. package/src/CheckboxInput/CheckboxInput.tsx +78 -6
  384. package/src/CheckboxList/CheckboxList.doc.mjs +9 -0
  385. package/src/CheckboxList/CheckboxList.test.tsx +169 -16
  386. package/src/CheckboxList/CheckboxList.tsx +56 -3
  387. package/src/CheckboxList/CheckboxListContext.tsx +7 -0
  388. package/src/Citation/Citation.doc.mjs +10 -0
  389. package/src/Citation/Citation.test.tsx +117 -0
  390. package/src/Citation/Citation.tsx +9 -1
  391. package/src/ClickableCard/ClickableCard.doc.mjs +15 -0
  392. package/src/CodeBlock/CodeBlock.test.tsx +115 -0
  393. package/src/CodeBlock/CodeBlock.tsx +61 -33
  394. package/src/CommandPalette/CommandPalette.test.tsx +47 -1
  395. package/src/CommandPalette/CommandPalette.tsx +9 -21
  396. package/src/ContextMenu/ContextMenu.doc.mjs +4 -4
  397. package/src/ContextMenu/ContextMenu.test.tsx +155 -1
  398. package/src/ContextMenu/ContextMenu.tsx +113 -16
  399. package/src/DateInput/DateInput.doc.mjs +281 -56
  400. package/src/DateInput/DateInput.test.tsx +188 -2
  401. package/src/DateInput/DateInput.tsx +89 -10
  402. package/src/DateRangeInput/DateRangeInput.doc.mjs +251 -46
  403. package/src/DateRangeInput/DateRangeInput.test.tsx +182 -20
  404. package/src/DateRangeInput/DateRangeInput.tsx +63 -5
  405. package/src/DateTimeInput/DateTimeInput.doc.mjs +368 -67
  406. package/src/DateTimeInput/DateTimeInput.test.tsx +279 -11
  407. package/src/DateTimeInput/DateTimeInput.tsx +125 -17
  408. package/src/Dialog/Dialog.doc.mjs +2 -2
  409. package/src/Dialog/Dialog.tsx +12 -0
  410. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -8
  411. package/src/DropdownMenu/DropdownMenu.test.tsx +56 -42
  412. package/src/DropdownMenu/DropdownMenu.tsx +52 -18
  413. package/src/EmptyState/EmptyState.test.tsx +4 -2
  414. package/src/EmptyState/EmptyState.tsx +6 -2
  415. package/src/Field/Field.test.tsx +32 -0
  416. package/src/Field/Field.tsx +23 -5
  417. package/src/Field/FieldLabel.tsx +55 -17
  418. package/src/FileInput/FileInput.doc.mjs +17 -0
  419. package/src/FileInput/FileInput.test.tsx +283 -49
  420. package/src/FileInput/FileInput.tsx +76 -4
  421. package/src/Grid/Grid.doc.mjs +14 -4
  422. package/src/Grid/Grid.tsx +20 -0
  423. package/src/HoverCard/HoverCard.doc.mjs +3 -0
  424. package/src/HoverCard/HoverCard.test.tsx +189 -2
  425. package/src/HoverCard/HoverCard.tsx +20 -16
  426. package/src/HoverCard/useHoverCard.tsx +13 -10
  427. package/src/Icon/Icon.doc.mjs +8 -0
  428. package/src/InputGroup/InputGroup.doc.mjs +2 -2
  429. package/src/InputGroup/InputGroup.test.tsx +98 -60
  430. package/src/InputGroup/InputGroup.tsx +21 -4
  431. package/src/InputGroup/InputGroupContext.ts +9 -4
  432. package/src/InputGroup/index.ts +1 -0
  433. package/src/Kbd/Kbd.test.tsx +22 -4
  434. package/src/Kbd/Kbd.tsx +37 -12
  435. package/src/Layer/anchorName.test.ts +146 -0
  436. package/src/Layer/anchorName.ts +46 -0
  437. package/src/Layer/layerAnimations.stylex.ts +20 -4
  438. package/src/Layer/useLayer.doc.mjs +12 -2
  439. package/src/Layer/useLayer.tsx +100 -15
  440. package/src/Layout/Layout.doc.mjs +1 -1
  441. package/src/Layout/Layout.tsx +8 -16
  442. package/src/Layout/LayoutFooter.doc.mjs +4 -4
  443. package/src/Layout/LayoutFooter.tsx +3 -3
  444. package/src/Layout/LayoutHeader.doc.mjs +4 -4
  445. package/src/Layout/LayoutHeader.tsx +3 -3
  446. package/src/Layout/LayoutPanel.tsx +3 -3
  447. package/src/Layout/padding.stylex.ts +52 -0
  448. package/src/Lightbox/Lightbox.doc.mjs +9 -2
  449. package/src/Lightbox/Lightbox.test.tsx +53 -5
  450. package/src/Lightbox/Lightbox.tsx +9 -4
  451. package/src/Link/Link.doc.mjs +14 -0
  452. package/src/Link/Link.test.tsx +52 -2
  453. package/src/Link/Link.tsx +42 -7
  454. package/src/Link/LinkProvider.tsx +1 -0
  455. package/src/List/List.doc.mjs +7 -0
  456. package/src/Markdown/Markdown.doc.mjs +2 -0
  457. package/src/Markdown/Markdown.test.tsx +28 -26
  458. package/src/Markdown/Markdown.tsx +21 -6
  459. package/src/MetadataList/MetadataListItem.doc.mjs +4 -0
  460. package/src/MobileNav/MobileNav.doc.mjs +8 -8
  461. package/src/MobileNav/MobileNav.tsx +13 -0
  462. package/src/MobileNav/MobileNavReopen.test.tsx +118 -0
  463. package/src/MoreMenu/MoreMenu.doc.mjs +2 -17
  464. package/src/MoreMenu/MoreMenu.tsx +0 -9
  465. package/src/MultiSelector/MultiSelector.doc.mjs +25 -0
  466. package/src/MultiSelector/MultiSelector.test.tsx +375 -8
  467. package/src/MultiSelector/MultiSelector.tsx +145 -21
  468. package/src/MultiSelector/hooks.ts +27 -0
  469. package/src/NavMenu/NavHeadingMenu.test.tsx +77 -1
  470. package/src/NavMenu/NavHeadingMenu.tsx +50 -3
  471. package/src/NumberInput/NumberInput.doc.mjs +17 -0
  472. package/src/NumberInput/NumberInput.test.tsx +242 -40
  473. package/src/NumberInput/NumberInput.tsx +89 -11
  474. package/src/OverflowList/OverflowList.doc.mjs +17 -0
  475. package/src/Pagination/Pagination.doc.mjs +3 -3
  476. package/src/Pagination/Pagination.test.tsx +250 -14
  477. package/src/Pagination/Pagination.tsx +54 -29
  478. package/src/Popover/usePopover.doc.mjs +7 -3
  479. package/src/Popover/usePopover.tsx +49 -6
  480. package/src/PowerSearch/PowerSearch.doc.mjs +15 -0
  481. package/src/PowerSearch/PowerSearch.test.tsx +97 -1
  482. package/src/PowerSearch/PowerSearch.tsx +16 -3
  483. package/src/ProgressBar/ProgressBar.test.tsx +45 -27
  484. package/src/ProgressBar/ProgressBar.tsx +3 -4
  485. package/src/RadioList/RadioList.doc.mjs +9 -0
  486. package/src/RadioList/RadioList.test.tsx +252 -16
  487. package/src/RadioList/RadioList.tsx +166 -10
  488. package/src/RadioList/RadioListItem.tsx +14 -2
  489. package/src/Resizable/Resizable.doc.mjs +1 -1
  490. package/src/Section/Section.doc.mjs +11 -0
  491. package/src/SegmentedControl/SegmentedControl.doc.mjs +9 -0
  492. package/src/SegmentedControl/SegmentedControl.test.tsx +214 -42
  493. package/src/SegmentedControl/SegmentedControl.tsx +102 -54
  494. package/src/SegmentedControl/SegmentedControlContext.ts +7 -0
  495. package/src/SegmentedControl/SegmentedControlItem.tsx +14 -1
  496. package/src/SelectableCard/SelectableCard.doc.mjs +15 -0
  497. package/src/Selector/Selector.doc.mjs +25 -0
  498. package/src/Selector/Selector.test.tsx +322 -15
  499. package/src/Selector/Selector.tsx +126 -40
  500. package/src/Selector/hooks.ts +23 -0
  501. package/src/SideNav/SideNav.test.tsx +16 -0
  502. package/src/SideNav/SideNavItem.tsx +2 -4
  503. package/src/Skeleton/Skeleton.doc.mjs +11 -1
  504. package/src/Skeleton/Skeleton.test.tsx +25 -0
  505. package/src/Skeleton/Skeleton.tsx +11 -1
  506. package/src/Slider/Slider.doc.mjs +19 -0
  507. package/src/Slider/Slider.test.tsx +158 -18
  508. package/src/Slider/Slider.tsx +54 -6
  509. package/src/Spinner/Spinner.tsx +7 -1
  510. package/src/Stack/Stack.doc.mjs +77 -0
  511. package/src/Stack/Stack.test.tsx +55 -5
  512. package/src/Stack/Stack.tsx +73 -24
  513. package/src/Stack/StackItem.test.tsx +23 -0
  514. package/src/Stack/StackItem.tsx +20 -23
  515. package/src/Switch/Switch.doc.mjs +15 -0
  516. package/src/Switch/Switch.test.tsx +162 -27
  517. package/src/Switch/Switch.tsx +61 -21
  518. package/src/TabList/Tab.tsx +6 -0
  519. package/src/TabList/TabList.doc.mjs +12 -0
  520. package/src/TabList/TabList.test.tsx +208 -0
  521. package/src/TabList/TabList.tsx +102 -12
  522. package/src/TabList/TabListContext.ts +7 -3
  523. package/src/TabList/TabMenu.tsx +6 -3
  524. package/src/Table/BaseTable.tsx +72 -41
  525. package/src/Table/Table.doc.mjs +14 -0
  526. package/src/Table/Table.test.tsx +39 -30
  527. package/src/Table/Table.tsx +27 -1
  528. package/src/Table/TableCell.tsx +25 -23
  529. package/src/Table/TableHeaderCell.tsx +28 -29
  530. package/src/Table/TableRow.tsx +37 -7
  531. package/src/Table/index.ts +6 -2
  532. package/src/Table/plugins/pagination/paginateData.ts +10 -3
  533. package/src/Table/plugins/pagination/useTablePagination.test.tsx +16 -0
  534. package/src/Table/plugins/pagination/useTablePagination.tsx +8 -1
  535. package/src/Table/plugins/sortable/useTableSortable.test.tsx +91 -2
  536. package/src/Table/plugins/sortable/useTableSortable.tsx +53 -1
  537. package/src/Table/plugins/stickyColumns/index.ts +4 -0
  538. package/src/Table/plugins/stickyColumns/useTableStickyColumns.test.tsx +163 -0
  539. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +407 -0
  540. package/src/Table/tableContextMenu.test.tsx +157 -0
  541. package/src/Table/tableContextMenu.tsx +142 -0
  542. package/src/Table/types.ts +175 -4
  543. package/src/Table/useBaseTablePlugins.ts +1 -0
  544. package/src/Table/useTableColumnResize.doc.mjs +96 -0
  545. package/src/Table/useTableStickyColumns.doc.mjs +59 -0
  546. package/src/Text/Heading.doc.mjs +15 -2
  547. package/src/Text/Text.doc.mjs +7 -1
  548. package/src/Text/text.stylex.ts +2 -2
  549. package/src/TextArea/TextArea.doc.mjs +17 -0
  550. package/src/TextArea/TextArea.test.tsx +167 -35
  551. package/src/TextArea/TextArea.tsx +62 -15
  552. package/src/TextInput/TextInput.doc.mjs +17 -0
  553. package/src/TextInput/TextInput.test.tsx +168 -34
  554. package/src/TextInput/TextInput.tsx +77 -9
  555. package/src/TimeInput/TimeInput.doc.mjs +335 -60
  556. package/src/TimeInput/TimeInput.test.tsx +144 -7
  557. package/src/TimeInput/TimeInput.tsx +74 -5
  558. package/src/Timestamp/Timestamp.doc.mjs +9 -0
  559. package/src/Timestamp/Timestamp.test.tsx +44 -18
  560. package/src/Timestamp/Timestamp.tsx +30 -10
  561. package/src/Toast/Toast.tsx +14 -0
  562. package/src/Toast/ToastViewport.test.tsx +204 -0
  563. package/src/Toast/ToastViewport.tsx +167 -21
  564. package/src/ToggleButton/ToggleButton.doc.mjs +9 -3
  565. package/src/ToggleButton/ToggleButton.test.tsx +39 -18
  566. package/src/ToggleButton/ToggleButton.tsx +46 -83
  567. package/src/Tokenizer/Tokenizer.doc.mjs +15 -0
  568. package/src/Tokenizer/Tokenizer.test.tsx +105 -1
  569. package/src/Tokenizer/Tokenizer.tsx +41 -2
  570. package/src/Toolbar/Toolbar.doc.mjs +65 -5
  571. package/src/Toolbar/Toolbar.test.tsx +109 -6
  572. package/src/Toolbar/Toolbar.tsx +59 -5
  573. package/src/Tooltip/Tooltip.test.tsx +81 -0
  574. package/src/Tooltip/useTooltip.tsx +57 -11
  575. package/src/TreeList/TreeList.test.tsx +295 -6
  576. package/src/TreeList/TreeList.tsx +73 -1
  577. package/src/TreeList/TreeListItem.tsx +51 -5
  578. package/src/TreeList/treeListItem.markers.stylex.ts +20 -0
  579. package/src/Typeahead/BaseTypeahead.tsx +86 -9
  580. package/src/Typeahead/Typeahead.doc.mjs +136 -30
  581. package/src/Typeahead/Typeahead.test.tsx +331 -1
  582. package/src/Typeahead/Typeahead.tsx +52 -1
  583. package/src/VisuallyHidden/VisuallyHidden.doc.mjs +80 -0
  584. package/src/VisuallyHidden/VisuallyHidden.test.tsx +76 -0
  585. package/src/VisuallyHidden/VisuallyHidden.tsx +113 -0
  586. package/src/VisuallyHidden/index.ts +15 -0
  587. package/src/hooks/focusableSelector.ts +25 -0
  588. package/src/hooks/index.ts +28 -2
  589. package/src/hooks/useAnnounce.test.tsx +101 -0
  590. package/src/hooks/useAnnounce.ts +168 -0
  591. package/src/hooks/useClickableContainer.ts +16 -4
  592. package/src/hooks/useEntryAnimation.ts +16 -4
  593. package/src/hooks/useFocusTrap.test.tsx +132 -0
  594. package/src/hooks/useFocusTrap.ts +98 -4
  595. package/src/hooks/useGridFocus.doc.mjs +40 -2
  596. package/src/hooks/useGridFocus.test.tsx +132 -0
  597. package/src/hooks/useGridFocus.ts +343 -67
  598. package/src/hooks/useImageMode.test.ts +133 -0
  599. package/src/hooks/useKeyboardHint.doc.mjs +101 -0
  600. package/src/hooks/useKeyboardHint.test.tsx +70 -0
  601. package/src/hooks/useKeyboardHint.tsx +332 -0
  602. package/src/hooks/useListFocus.doc.mjs +50 -10
  603. package/src/hooks/useListFocus.test.tsx +375 -0
  604. package/src/hooks/useListFocus.ts +395 -57
  605. package/src/hooks/useLongPress.test.tsx +134 -0
  606. package/src/hooks/useLongPress.ts +119 -0
  607. package/src/hooks/useTreeFocus.doc.mjs +140 -0
  608. package/src/hooks/useTreeFocus.test.tsx +214 -0
  609. package/src/hooks/useTreeFocus.ts +559 -0
  610. package/src/hooks/useTypeahead.test.tsx +109 -0
  611. package/src/hooks/useTypeahead.ts +183 -0
  612. package/src/index.ts +1 -0
  613. package/src/theme/derivedVarRegistry.test.ts +4 -0
  614. package/src/theme/generateThemeRules.test.ts +7 -8
  615. package/src/theme/generateThemeRules.ts +1 -1
  616. package/src/theme/syntax/SyntaxTheme.tsx +1 -1
  617. package/src/theme/syntax/defineSyntaxTheme.ts +20 -11
  618. package/src/theme/syntax/presets.ts +5 -2
  619. package/src/theme/syntax/tokens.ts +1 -1
  620. package/src/theme/types.ts +1 -1
  621. package/src/utils/dateTypes.test.ts +40 -0
  622. package/src/utils/dateTypes.ts +40 -0
  623. package/src/utils/index.ts +9 -0
  624. package/src/utils/inputAria.test.ts +39 -0
  625. package/src/utils/inputAria.ts +58 -0
  626. package/src/utils/timeParser.test.ts +10 -0
  627. package/src/utils/timeParser.ts +5 -2
  628. package/dist/Calendar/hooks/useCalendarRovingTabindex.d.ts +0 -57
  629. package/dist/Calendar/hooks/useCalendarRovingTabindex.d.ts.map +0 -1
  630. package/dist/Calendar/hooks/useCalendarRovingTabindex.js +0 -96
  631. package/src/Calendar/hooks/useCalendarRovingTabindex.ts +0 -118
@@ -34,6 +34,11 @@ export interface TableRowProps extends BaseProps<HTMLTableRowElement> {
34
34
  * Must be a `stylex.create()` value — not an inline style object.
35
35
  */
36
36
  xstyle?: StyleXStyles[];
37
+ /**
38
+ * Whether this row is the header row. Header rows skip the striped/hover
39
+ * row styling (which is only meant for body rows).
40
+ */
41
+ isHeaderRow?: boolean;
37
42
  }
38
43
 
39
44
  const stripedRowStyles = stylex.create({
@@ -42,6 +47,13 @@ const stripedRowStyles = stylex.create({
42
47
  default: null,
43
48
  ':nth-child(even)': colorVars['--color-background-muted'],
44
49
  },
50
+ // Publish the row's current overlay color as an inheritable variable so
51
+ // pinned/sticky cells (which paint an opaque background over the otherwise
52
+ // transparent row) can replay the exact same striping. Unset on odd rows.
53
+ '--table-row-overlay': {
54
+ default: null,
55
+ ':nth-child(even)': colorVars['--color-background-muted'],
56
+ },
45
57
  },
46
58
  });
47
59
 
@@ -53,6 +65,12 @@ const hoverRowStyles = stylex.create({
53
65
  '@media (hover: hover)': colorVars['--color-overlay-hover'],
54
66
  },
55
67
  },
68
+ '--table-row-overlay': {
69
+ default: null,
70
+ ':hover': {
71
+ '@media (hover: hover)': colorVars['--color-overlay-hover'],
72
+ },
73
+ },
56
74
  transitionProperty: 'background-color',
57
75
  transitionDuration: durationVars['--duration-fast'],
58
76
  transitionTimingFunction: easeVars['--ease-standard'],
@@ -68,6 +86,13 @@ const stripedHoverRowStyles = stylex.create({
68
86
  '@media (hover: hover)': colorVars['--color-overlay-hover'],
69
87
  },
70
88
  },
89
+ '--table-row-overlay': {
90
+ default: null,
91
+ ':nth-child(even)': colorVars['--color-background-muted'],
92
+ ':hover': {
93
+ '@media (hover: hover)': colorVars['--color-overlay-hover'],
94
+ },
95
+ },
71
96
  transitionProperty: 'background-color',
72
97
  transitionDuration: durationVars['--duration-fast'],
73
98
  transitionTimingFunction: easeVars['--ease-standard'],
@@ -94,6 +119,7 @@ export function TableRow({
94
119
  children,
95
120
  xstyle,
96
121
  ref,
122
+ isHeaderRow = false,
97
123
  ...props
98
124
  }: TableRowProps) {
99
125
  const ctx = use(TableContext);
@@ -114,13 +140,17 @@ export function TableRow({
114
140
 
115
141
  const rowStyles: StyleXStyles[] = [];
116
142
 
117
- // Handle striped + hover combination to avoid backgroundColor conflicts
118
- if (ctx.isStriped && ctx.hasHover) {
119
- rowStyles.push(stripedHoverRowStyles.row);
120
- } else if (ctx.isStriped) {
121
- rowStyles.push(stripedRowStyles.row);
122
- } else if (ctx.hasHover) {
123
- rowStyles.push(hoverRowStyles.row);
143
+ // Striped + hover styling is for body rows only — the header row must not
144
+ // pick up the hover highlight (or striping) even when hasHover/isStriped.
145
+ if (!isHeaderRow) {
146
+ // Handle striped + hover combination to avoid backgroundColor conflicts
147
+ if (ctx.isStriped && ctx.hasHover) {
148
+ rowStyles.push(stripedHoverRowStyles.row);
149
+ } else if (ctx.isStriped) {
150
+ rowStyles.push(stripedRowStyles.row);
151
+ } else if (ctx.hasHover) {
152
+ rowStyles.push(hoverRowStyles.row);
153
+ }
124
154
  }
125
155
 
126
156
  if (ctx.dividers === 'rows' || ctx.dividers === 'grid') {
@@ -1,7 +1,5 @@
1
1
  // Copyright (c) Meta Platforms, Inc. and affiliates.
2
2
 
3
- 'use client';
4
-
5
3
  /**
6
4
  * @file index.ts
7
5
  * @input Imports from Table component files
@@ -27,6 +25,8 @@ export {useTablePagination, paginateData} from './plugins/pagination';
27
25
  export {useTableColumnSettings} from './plugins/columnSettings';
28
26
  export {useTableColumnSettingsState} from './plugins/columnSettings';
29
27
  export {useTableColumnResize} from './plugins/columnResize';
28
+ export {useTableStickyColumns} from './plugins/stickyColumns';
29
+ export {resolveContextActions} from './tableContextMenu';
30
30
  export {
31
31
  useTableFiltering,
32
32
  useTableFilterState,
@@ -48,11 +48,14 @@ export type {
48
48
  ProportionalWidth,
49
49
  PixelWidth,
50
50
  TablePlugin,
51
+ TableContextAction,
52
+ TableContextActions,
51
53
  TableRenderProps,
52
54
  HeaderRowRenderProps,
53
55
  HeaderCellRenderProps,
54
56
  BodyRowRenderProps,
55
57
  BodyCellRenderProps,
58
+ ScrollWrapperRenderProps,
56
59
  BaseTableProps,
57
60
  } from './types';
58
61
  export type {
@@ -93,6 +96,7 @@ export type {
93
96
  UseTableColumnSettingsStateReturn,
94
97
  } from './plugins/columnSettings';
95
98
  export type {UseTableColumnResizeConfig} from './plugins/columnResize';
99
+ export type {UseTableStickyColumnsConfig} from './plugins/stickyColumns';
96
100
  export type {
97
101
  UseTableFilteringConfig,
98
102
  TableFilterState,
@@ -15,7 +15,8 @@
15
15
  *
16
16
  * @param data - Full data array
17
17
  * @param page - Current page number (1-based)
18
- * @param pageSize - Number of items per page
18
+ * @param pageSize - Number of items per page; coerced to a positive integer,
19
+ * non-finite values fall back to 10
19
20
  * @returns Slice of data for the current page
20
21
  *
21
22
  * @example
@@ -31,6 +32,12 @@ export function paginateData<T>(
31
32
  page: number,
32
33
  pageSize: number,
33
34
  ): T[] {
34
- const start = (page - 1) * pageSize;
35
- return data.slice(start, start + pageSize);
35
+ // Same coercion as Pagination and useTablePagination: a 0/NaN/negative
36
+ // pageSize would slice every page empty while the pagination chrome still
37
+ // renders page buttons.
38
+ const size = Number.isFinite(pageSize)
39
+ ? Math.max(1, Math.floor(pageSize))
40
+ : 10;
41
+ const start = (page - 1) * size;
42
+ return data.slice(start, start + size);
36
43
  }
@@ -184,6 +184,22 @@ describe('useTablePagination', () => {
184
184
  ).toBeTruthy();
185
185
  });
186
186
 
187
+ it('guards pageSize 0 against Infinity page counts', () => {
188
+ render(<PaginatedTable data={generateItems(5)} pageSize={0} />);
189
+ expect(
190
+ screen.getByRole('navigation', {name: 'Table pagination'}),
191
+ ).toBeInTheDocument();
192
+ // pageSize is coerced to 1, so 5 items produce 5 pages, not Infinity,
193
+ // and page 1 shows the first item instead of an empty slice
194
+ expect(
195
+ screen.queryByRole('button', {name: 'Go to page Infinity'}),
196
+ ).toBeNull();
197
+ expect(
198
+ screen.getByRole('button', {name: 'Go to page 5'}),
199
+ ).toBeInTheDocument();
200
+ expect(screen.getByText('Item 1')).toBeInTheDocument();
201
+ });
202
+
187
203
  it('transformTableContext renders Pagination above table', () => {
188
204
  render(
189
205
  <PaginatedTable
@@ -199,7 +199,7 @@ export function useTablePagination<T extends Record<string, unknown>>(
199
199
  totalItems,
200
200
  totalPages: totalPagesProp,
201
201
  hasMore,
202
- pageSize = 10,
202
+ pageSize: pageSizeConfig = 10,
203
203
  onPageSizeChange,
204
204
  pageSizeOptions,
205
205
  variant = 'pages',
@@ -209,6 +209,13 @@ export function useTablePagination<T extends Record<string, unknown>>(
209
209
  label = 'Table pagination',
210
210
  } = config;
211
211
 
212
+ // Same guard as Pagination itself: 0/NaN/negative pageSize would produce an
213
+ // Infinity/NaN totalPages here, which bypasses Pagination's own coercion
214
+ // because it is passed down as the explicit totalPages prop.
215
+ const pageSize = Number.isFinite(pageSizeConfig)
216
+ ? Math.max(1, Math.floor(pageSizeConfig))
217
+ : 10;
218
+
212
219
  const computedTotalPages =
213
220
  totalPagesProp ??
214
221
  (totalItems != null ? Math.ceil(totalItems / pageSize) : undefined);
@@ -7,8 +7,8 @@
7
7
  * @position Testing; validates sortable plugin implementation
8
8
  */
9
9
 
10
- import {describe, it, expect, vi} from 'vitest';
11
- import {render, screen} from '@testing-library/react';
10
+ import {describe, it, expect, vi, beforeEach} from 'vitest';
11
+ import {render, screen, fireEvent} 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';
@@ -620,3 +620,92 @@ describe('useTableSortable', () => {
620
620
  });
621
621
  });
622
622
  });
623
+
624
+ // =============================================================================
625
+ // Context-menu actions (colocated with the sortable plugin)
626
+ // =============================================================================
627
+
628
+ describe('useTableSortable — context menu actions', () => {
629
+ // jsdom doesn't implement the Popover API; mock it so the menu can "open"
630
+ // and its items become queryable (as hidden).
631
+ beforeEach(() => {
632
+ HTMLElement.prototype.showPopover = vi.fn(function (this: HTMLElement) {
633
+ this.setAttribute('popover-open', '');
634
+ const event = new Event('toggle', {bubbles: false});
635
+ Object.defineProperty(event, 'newState', {value: 'open'});
636
+ this.dispatchEvent(event);
637
+ });
638
+ HTMLElement.prototype.hidePopover = vi.fn(function (this: HTMLElement) {
639
+ this.removeAttribute('popover-open');
640
+ const event = new Event('toggle', {bubbles: false});
641
+ Object.defineProperty(event, 'newState', {value: 'closed'});
642
+ this.dispatchEvent(event);
643
+ });
644
+ const originalMatches = HTMLElement.prototype.matches;
645
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
646
+ (HTMLElement.prototype as any).matches = function (
647
+ selector: string,
648
+ ): boolean {
649
+ if (selector === ':popover-open') {
650
+ return this.hasAttribute('popover-open');
651
+ }
652
+ return originalMatches.call(this, selector);
653
+ };
654
+ });
655
+
656
+ it('offers Sort ascending/descending on a sortable header, and Clear sort once sorted', () => {
657
+ render(<SortableTable allowUnsortedState />);
658
+
659
+ // Unsorted: asc + desc, no "Clear sort".
660
+ fireEvent.contextMenu(screen.getByText('Name'));
661
+ expect(
662
+ screen.getAllByRole('menuitem', {name: 'Sort ascending', hidden: true})
663
+ .length,
664
+ ).toBeGreaterThan(0);
665
+ expect(
666
+ screen.getAllByRole('menuitem', {name: 'Sort descending', hidden: true})
667
+ .length,
668
+ ).toBeGreaterThan(0);
669
+ expect(
670
+ screen.queryByRole('menuitem', {name: 'Clear sort', hidden: true}),
671
+ ).not.toBeInTheDocument();
672
+
673
+ // Apply ascending → "Clear sort" now appears.
674
+ fireEvent.click(
675
+ screen.getAllByRole('menuitem', {name: 'Sort ascending', hidden: true})[0],
676
+ );
677
+ fireEvent.contextMenu(screen.getByText('Name'));
678
+ expect(
679
+ screen.getAllByRole('menuitem', {name: 'Clear sort', hidden: true}).length,
680
+ ).toBeGreaterThan(0);
681
+ });
682
+
683
+ it('resolves fresh actions on each open as sort state changes (lazy getter)', () => {
684
+ const onSortChange = vi.fn();
685
+ render(<SortableTable allowUnsortedState onSortChange={onSortChange} />);
686
+
687
+ // Open (unsorted) and pick descending.
688
+ fireEvent.contextMenu(screen.getByText('Name'));
689
+ fireEvent.click(
690
+ screen.getAllByRole('menuitem', {
691
+ name: 'Sort descending',
692
+ hidden: true,
693
+ })[0],
694
+ );
695
+ expect(onSortChange).toHaveBeenLastCalledWith([
696
+ {sortKey: 'name', direction: 'descending'},
697
+ ]);
698
+
699
+ // Re-open: the getter recomputes against the now-descending state, so
700
+ // "Clear sort" is present and clicking it clears — proving the actions are
701
+ // freshly derived on each open, not memoized from the first render.
702
+ fireEvent.contextMenu(screen.getByText('Name'));
703
+ const clear = screen.getAllByRole('menuitem', {
704
+ name: 'Clear sort',
705
+ hidden: true,
706
+ });
707
+ expect(clear.length).toBeGreaterThan(0);
708
+ fireEvent.click(clear[0]);
709
+ expect(onSortChange).toHaveBeenLastCalledWith([]);
710
+ });
711
+ });
@@ -17,10 +17,12 @@ import {useRef, useMemo, type ReactNode} from 'react';
17
17
  import * as stylex from '@stylexjs/stylex';
18
18
  import {colorVars, spacingVars, radiusVars} from '../../../theme/tokens.stylex';
19
19
  import {Icon} from '../../../Icon';
20
+ import {resolveContextActions} from '../../tableContextMenu';
20
21
  import type {
21
22
  TablePlugin,
22
23
  HeaderCellRenderProps,
23
24
  TableColumn,
25
+ TableContextAction,
24
26
  } from '../../types';
25
27
 
26
28
  // =============================================================================
@@ -356,10 +358,56 @@ export function useTableSortable<
356
358
  return props;
357
359
  }
358
360
 
359
- // Find sort entry for this column
360
361
  const cfg = configRef.current;
361
362
  const entry = cfg.sort.find(e => e.sortKey === sortKey);
362
363
 
364
+ // Context-menu actions are built lazily (only when the menu opens) via
365
+ // a getter, reading the current sort state at call time — so we don't
366
+ // build an action array for every header on every render, and the
367
+ // checked/clear state always reflects the latest sort.
368
+ const getSortActions = (): TableContextAction[] => {
369
+ const c = configRef.current;
370
+ const dir = c.sort.find(e => e.sortKey === sortKey)?.direction ?? null;
371
+ const actions: TableContextAction[] = [
372
+ {
373
+ id: 'sort-asc',
374
+ group: 'sort',
375
+ label: 'Sort ascending',
376
+ icon: <Icon icon="arrowUp" size="xsm" aria-hidden />,
377
+ checked: dir === 'ascending',
378
+ onSelect: () =>
379
+ c.onSortChange([
380
+ {sortKey: sortKey as TSortKey, direction: 'ascending'},
381
+ ]),
382
+ },
383
+ {
384
+ id: 'sort-desc',
385
+ group: 'sort',
386
+ label: 'Sort descending',
387
+ icon: <Icon icon="arrowDown" size="xsm" aria-hidden />,
388
+ checked: dir === 'descending',
389
+ onSelect: () =>
390
+ c.onSortChange([
391
+ {sortKey: sortKey as TSortKey, direction: 'descending'},
392
+ ]),
393
+ },
394
+ ];
395
+ if (dir != null) {
396
+ actions.push({
397
+ id: 'sort-clear',
398
+ group: 'sort-clear',
399
+ label: 'Clear sort',
400
+ icon: <Icon icon="close" size="xsm" aria-hidden />,
401
+ onSelect: () =>
402
+ c.onSortChange(c.sort.filter(e => e.sortKey !== sortKey)),
403
+ });
404
+ }
405
+ return actions;
406
+ };
407
+
408
+ // Merge with any actions a prior plugin contributed (array or getter),
409
+ // resolving both lazily at open time.
410
+ const priorActions = props.contextMenuActions;
363
411
  return {
364
412
  ...props,
365
413
  htmlProps: {
@@ -375,6 +423,10 @@ export function useTableSortable<
375
423
  {props.content}
376
424
  </SortHeaderButton>
377
425
  ),
426
+ contextMenuActions: () => [
427
+ ...resolveContextActions(priorActions),
428
+ ...getSortActions(),
429
+ ],
378
430
  };
379
431
  },
380
432
  }),
@@ -0,0 +1,4 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ export {useTableStickyColumns} from './useTableStickyColumns';
4
+ export type {UseTableStickyColumnsConfig} from './useTableStickyColumns';
@@ -0,0 +1,163 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file useTableStickyColumns.test.tsx
5
+ * @input useTableStickyColumns, Table, React testing utilities
6
+ * @output Functional tests for the sticky-columns plugin
7
+ * @position Test file; validates pinning, cumulative offsets, edges, no-op
8
+ *
9
+ * Note: `position: sticky` and the z-index/background are applied via StyleX
10
+ * (compiled to classNames), which jsdom does not resolve to `element.style`.
11
+ * The plugin sets the per-column *offset* (`insetInlineStart`/`insetInlineEnd`)
12
+ * as an inline style, so these tests assert on those inline offsets — the
13
+ * jsdom-visible, plugin-owned signal that a column is pinned and at what offset.
14
+ */
15
+
16
+ import {describe, it, expect} from 'vitest';
17
+ import {render, screen} from '@testing-library/react';
18
+ import {Table} from '../../Table';
19
+ import {useTableStickyColumns} from './useTableStickyColumns';
20
+ import {pixel} from '../../columnUtils';
21
+ import type {TableColumn} from '../../types';
22
+
23
+ // =============================================================================
24
+ // Test Data
25
+ // =============================================================================
26
+
27
+ interface Row extends Record<string, unknown> {
28
+ id: string;
29
+ name: string;
30
+ email: string;
31
+ team: string;
32
+ status: string;
33
+ }
34
+
35
+ const data: Row[] = [
36
+ {id: '1', name: 'Alice', email: 'a@x.com', team: 'DS', status: 'Active'},
37
+ {id: '2', name: 'Bob', email: 'b@x.com', team: 'Plat', status: 'Away'},
38
+ ];
39
+
40
+ const columns: TableColumn<Row>[] = [
41
+ {key: 'name', header: 'Name', width: pixel(180)},
42
+ {key: 'email', header: 'Email', width: pixel(220)},
43
+ {key: 'team', header: 'Team', width: pixel(160)},
44
+ {key: 'status', header: 'Status', width: pixel(140)},
45
+ ];
46
+
47
+ function getHeader(name: string): HTMLElement {
48
+ return screen.getByRole('columnheader', {name});
49
+ }
50
+
51
+ // =============================================================================
52
+ // Tests
53
+ // =============================================================================
54
+
55
+ describe('useTableStickyColumns', () => {
56
+ it('pins a start column at inset-inline-start: 0', () => {
57
+ function Harness() {
58
+ const sticky = useTableStickyColumns<Row>({startKeys: ['name']});
59
+ return (
60
+ <Table
61
+ data={data}
62
+ columns={columns}
63
+ idKey="id"
64
+ plugins={{stickyColumns: sticky}}
65
+ />
66
+ );
67
+ }
68
+ render(<Harness />);
69
+ expect(getHeader('Name').style.insetInlineStart).toBe('0px');
70
+ });
71
+
72
+ it('computes cumulative start offsets for contiguous pinned columns', () => {
73
+ function Harness() {
74
+ const sticky = useTableStickyColumns<Row>({
75
+ startKeys: ['name', 'email'],
76
+ });
77
+ return (
78
+ <Table
79
+ data={data}
80
+ columns={columns}
81
+ idKey="id"
82
+ plugins={{stickyColumns: sticky}}
83
+ />
84
+ );
85
+ }
86
+ render(<Harness />);
87
+ // name is first → offset 0; email follows → offset = name width (180px)
88
+ expect(getHeader('Name').style.insetInlineStart).toBe('0px');
89
+ expect(getHeader('Email').style.insetInlineStart).toBe('180px');
90
+ });
91
+
92
+ it('pins an end column at inset-inline-end: 0', () => {
93
+ function Harness() {
94
+ const sticky = useTableStickyColumns<Row>({endKeys: ['status']});
95
+ return (
96
+ <Table
97
+ data={data}
98
+ columns={columns}
99
+ idKey="id"
100
+ plugins={{stickyColumns: sticky}}
101
+ />
102
+ );
103
+ }
104
+ render(<Harness />);
105
+ expect(getHeader('Status').style.insetInlineEnd).toBe('0px');
106
+ });
107
+
108
+ it('pins body cells, not just headers', () => {
109
+ function Harness() {
110
+ const sticky = useTableStickyColumns<Row>({startKeys: ['name']});
111
+ return (
112
+ <Table
113
+ data={data}
114
+ columns={columns}
115
+ idKey="id"
116
+ plugins={{stickyColumns: sticky}}
117
+ />
118
+ );
119
+ }
120
+ render(<Harness />);
121
+ const firstBodyCell = screen.getByText('Alice').closest('td');
122
+ expect(firstBodyCell).not.toBeNull();
123
+ expect(firstBodyCell!.style.insetInlineStart).toBe('0px');
124
+ });
125
+
126
+ it('is a no-op with an empty config — no cell gets an offset', () => {
127
+ function Harness() {
128
+ const sticky = useTableStickyColumns<Row>({});
129
+ return (
130
+ <Table
131
+ data={data}
132
+ columns={columns}
133
+ idKey="id"
134
+ plugins={{stickyColumns: sticky}}
135
+ />
136
+ );
137
+ }
138
+ render(<Harness />);
139
+ for (const header of ['Name', 'Email', 'Team', 'Status']) {
140
+ const th = getHeader(header);
141
+ expect(th.style.insetInlineStart).toBe('');
142
+ expect(th.style.insetInlineEnd).toBe('');
143
+ }
144
+ });
145
+
146
+ it('only pins configured columns, leaving others unset', () => {
147
+ function Harness() {
148
+ const sticky = useTableStickyColumns<Row>({startKeys: ['name']});
149
+ return (
150
+ <Table
151
+ data={data}
152
+ columns={columns}
153
+ idKey="id"
154
+ plugins={{stickyColumns: sticky}}
155
+ />
156
+ );
157
+ }
158
+ render(<Harness />);
159
+ expect(getHeader('Name').style.insetInlineStart).toBe('0px');
160
+ expect(getHeader('Team').style.insetInlineStart).toBe('');
161
+ expect(getHeader('Team').style.insetInlineEnd).toBe('');
162
+ });
163
+ });