@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.
- package/CHANGELOG.md +105 -0
- package/README.md +131 -13
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +11 -5
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +4 -1
- package/dist/Banner/Banner.d.ts +7 -0
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +9 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +24 -5
- package/dist/Button/Button.d.ts +12 -2
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +53 -17
- package/dist/Calendar/Calendar.d.ts +5 -4
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +82 -43
- package/dist/Calendar/hooks/index.d.ts +0 -2
- package/dist/Calendar/hooks/index.d.ts.map +1 -1
- package/dist/Calendar/hooks/index.js +1 -2
- package/dist/Calendar/index.d.ts +3 -3
- package/dist/Calendar/index.d.ts.map +1 -1
- package/dist/Calendar/index.js +1 -1
- package/dist/Calendar/styles.d.ts +3 -9
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +3 -11
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +17 -3
- package/dist/Center/Center.d.ts +11 -1
- package/dist/Center/Center.d.ts.map +1 -1
- package/dist/Center/Center.js +9 -3
- package/dist/Chat/ChatMessageList.d.ts +14 -1
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +2 -0
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +4 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts +23 -2
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +51 -9
- package/dist/CheckboxList/CheckboxList.d.ts +13 -1
- package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxList.js +39 -9
- package/dist/CheckboxList/CheckboxListContext.d.ts +7 -0
- package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +3 -3
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +49 -37
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +5 -5
- package/dist/ContextMenu/ContextMenu.d.ts +4 -5
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +93 -11
- package/dist/DateInput/DateInput.d.ts +23 -1
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +59 -8
- package/dist/DateRangeInput/DateRangeInput.d.ts +23 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +42 -9
- package/dist/DateTimeInput/DateTimeInput.d.ts +35 -2
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +78 -15
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +12 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts +1 -8
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +42 -14
- package/dist/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/EmptyState/EmptyState.js +7 -1
- package/dist/Field/Field.d.ts +19 -2
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/Field.js +4 -0
- package/dist/Field/FieldLabel.d.ts +21 -2
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +41 -26
- package/dist/FileInput/FileInput.d.ts +22 -1
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +56 -10
- package/dist/Grid/Grid.d.ts +11 -1
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +8 -0
- package/dist/HoverCard/HoverCard.d.ts +2 -2
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +18 -6
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +7 -3
- package/dist/InputGroup/InputGroup.d.ts +2 -2
- package/dist/InputGroup/InputGroup.d.ts.map +1 -1
- package/dist/InputGroup/InputGroup.js +14 -5
- package/dist/InputGroup/InputGroupContext.d.ts +4 -0
- package/dist/InputGroup/InputGroupContext.d.ts.map +1 -1
- package/dist/InputGroup/InputGroupContext.js +2 -2
- package/dist/InputGroup/index.d.ts +1 -0
- package/dist/InputGroup/index.d.ts.map +1 -1
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +34 -2
- package/dist/Layer/anchorName.d.ts +20 -0
- package/dist/Layer/anchorName.d.ts.map +1 -0
- package/dist/Layer/anchorName.js +36 -0
- package/dist/Layer/layerAnimations.stylex.d.ts +4 -0
- package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
- package/dist/Layer/layerAnimations.stylex.js +8 -4
- package/dist/Layer/useLayer.d.ts +29 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +55 -11
- package/dist/Layout/Layout.d.ts +4 -11
- package/dist/Layout/Layout.d.ts.map +1 -1
- package/dist/Layout/Layout.js +10 -11
- package/dist/Layout/LayoutFooter.d.ts +2 -2
- package/dist/Layout/LayoutFooter.d.ts.map +1 -1
- package/dist/Layout/LayoutHeader.d.ts +2 -2
- package/dist/Layout/LayoutHeader.d.ts.map +1 -1
- package/dist/Layout/LayoutPanel.d.ts +2 -2
- package/dist/Layout/LayoutPanel.d.ts.map +1 -1
- package/dist/Layout/padding.stylex.d.ts +51 -0
- package/dist/Layout/padding.stylex.d.ts.map +1 -1
- package/dist/Layout/padding.stylex.js +63 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +4 -2
- package/dist/Link/Link.d.ts +17 -2
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +20 -9
- package/dist/Link/LinkProvider.d.ts +1 -0
- package/dist/Link/LinkProvider.d.ts.map +1 -1
- package/dist/Link/LinkProvider.js +1 -0
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +18 -3
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +13 -0
- package/dist/MoreMenu/MoreMenu.d.ts +1 -7
- package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
- package/dist/MoreMenu/MoreMenu.js +0 -2
- package/dist/MultiSelector/MultiSelector.d.ts +25 -2
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +103 -22
- package/dist/MultiSelector/hooks.d.ts +12 -1
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +14 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +34 -3
- package/dist/NumberInput/NumberInput.d.ts +23 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +62 -12
- package/dist/Pagination/Pagination.d.ts +1 -1
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +46 -28
- package/dist/Popover/usePopover.d.ts +25 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +18 -6
- package/dist/PowerSearch/PowerSearch.d.ts +11 -1
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +6 -1
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +3 -5
- package/dist/RadioList/RadioList.d.ts +20 -2
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +105 -9
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +13 -2
- package/dist/SegmentedControl/SegmentedControl.d.ts +13 -2
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +78 -44
- package/dist/SegmentedControl/SegmentedControlContext.d.ts +7 -0
- package/dist/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +13 -2
- package/dist/Selector/Selector.d.ts +22 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +84 -23
- package/dist/Selector/hooks.d.ts +8 -1
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +14 -1
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +1 -1
- package/dist/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/Skeleton/Skeleton.js +8 -2
- package/dist/Slider/Slider.d.ts +21 -0
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +38 -11
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +1 -1
- package/dist/Stack/Stack.d.ts +38 -23
- package/dist/Stack/Stack.d.ts.map +1 -1
- package/dist/Stack/Stack.js +25 -1
- package/dist/Stack/StackItem.d.ts +12 -23
- package/dist/Stack/StackItem.d.ts.map +1 -1
- package/dist/Stack/StackItem.js +8 -1
- package/dist/Switch/Switch.d.ts +23 -2
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +41 -11
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +6 -0
- package/dist/TabList/TabList.d.ts +16 -4
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +86 -10
- package/dist/TabList/TabListContext.d.ts +5 -0
- package/dist/TabList/TabListContext.d.ts.map +1 -1
- package/dist/TabList/TabListContext.js +5 -0
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +6 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +38 -16
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +36 -7
- package/dist/Table/TableCell.d.ts +8 -1
- package/dist/Table/TableCell.d.ts.map +1 -1
- package/dist/Table/TableCell.js +10 -10
- package/dist/Table/TableHeaderCell.d.ts +8 -1
- package/dist/Table/TableHeaderCell.d.ts.map +1 -1
- package/dist/Table/TableHeaderCell.js +16 -16
- package/dist/Table/TableRow.d.ts +6 -1
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js +15 -7
- package/dist/Table/index.d.ts +4 -1
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +3 -2
- package/dist/Table/plugins/pagination/paginateData.d.ts +2 -1
- package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/paginateData.js +8 -3
- package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +6 -1
- package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +59 -3
- package/dist/Table/plugins/stickyColumns/index.d.ts +3 -0
- package/dist/Table/plugins/stickyColumns/index.d.ts.map +1 -0
- package/dist/Table/plugins/stickyColumns/index.js +3 -0
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts +25 -0
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -0
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +369 -0
- package/dist/Table/tableContextMenu.d.ts +33 -0
- package/dist/Table/tableContextMenu.d.ts.map +1 -0
- package/dist/Table/tableContextMenu.js +133 -0
- package/dist/Table/types.d.ts +161 -5
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +1 -1
- package/dist/Text/text.stylex.d.ts +2 -2
- package/dist/Text/text.stylex.js +2 -2
- package/dist/TextArea/TextArea.d.ts +22 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +41 -9
- package/dist/TextInput/TextInput.d.ts +23 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +55 -10
- package/dist/TimeInput/TimeInput.d.ts +23 -1
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +53 -10
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +28 -3
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +14 -0
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +132 -3
- package/dist/ToggleButton/ToggleButton.d.ts +7 -9
- package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButton.js +34 -57
- package/dist/Tokenizer/Tokenizer.d.ts +12 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +27 -5
- package/dist/Toolbar/Toolbar.d.ts +3 -3
- package/dist/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/Toolbar/Toolbar.js +51 -7
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +57 -9
- package/dist/TreeList/TreeList.d.ts +1 -1
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +72 -2
- package/dist/TreeList/TreeListItem.d.ts +11 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +51 -12
- package/dist/TreeList/treeListItem.markers.stylex.d.ts +16 -0
- package/dist/TreeList/treeListItem.markers.stylex.d.ts.map +1 -0
- package/dist/TreeList/treeListItem.markers.stylex.js +22 -0
- package/dist/Typeahead/BaseTypeahead.d.ts +9 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +67 -6
- package/dist/Typeahead/Typeahead.d.ts +24 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +29 -5
- package/dist/VisuallyHidden/VisuallyHidden.d.ts +61 -0
- package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -0
- package/dist/VisuallyHidden/VisuallyHidden.js +65 -0
- package/dist/VisuallyHidden/index.d.ts +11 -0
- package/dist/VisuallyHidden/index.d.ts.map +1 -0
- package/dist/VisuallyHidden/index.js +13 -0
- package/dist/astryx.css +40 -1
- package/dist/astryx.umd.js +147 -0
- package/dist/astryx.umd.js.map +7 -0
- package/dist/hooks/focusableSelector.d.ts +22 -0
- package/dist/hooks/focusableSelector.d.ts.map +1 -0
- package/dist/hooks/focusableSelector.js +24 -0
- package/dist/hooks/index.d.ts +12 -2
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +7 -2
- package/dist/hooks/useAnnounce.d.ts +40 -0
- package/dist/hooks/useAnnounce.d.ts.map +1 -0
- package/dist/hooks/useAnnounce.js +142 -0
- package/dist/hooks/useClickableContainer.d.ts +16 -1
- package/dist/hooks/useClickableContainer.d.ts.map +1 -1
- package/dist/hooks/useClickableContainer.js +16 -4
- package/dist/hooks/useEntryAnimation.d.ts.map +1 -1
- package/dist/hooks/useEntryAnimation.js +4 -4
- package/dist/hooks/useFocusTrap.d.ts +18 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +87 -3
- package/dist/hooks/useGridFocus.d.ts +88 -1
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useGridFocus.js +261 -62
- package/dist/hooks/useKeyboardHint.d.ts +82 -0
- package/dist/hooks/useKeyboardHint.d.ts.map +1 -0
- package/dist/hooks/useKeyboardHint.js +220 -0
- package/dist/hooks/useListFocus.d.ts +78 -7
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useListFocus.js +305 -52
- package/dist/hooks/useLongPress.d.ts +21 -0
- package/dist/hooks/useLongPress.d.ts.map +1 -0
- package/dist/hooks/useLongPress.js +89 -0
- package/dist/hooks/useTreeFocus.d.ts +157 -0
- package/dist/hooks/useTreeFocus.d.ts.map +1 -0
- package/dist/hooks/useTreeFocus.js +337 -0
- package/dist/hooks/useTypeahead.d.ts +63 -0
- package/dist/hooks/useTypeahead.d.ts.map +1 -0
- package/dist/hooks/useTypeahead.js +117 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/theme/generateThemeRules.js +1 -1
- package/dist/theme/syntax/SyntaxTheme.d.ts +1 -1
- package/dist/theme/syntax/SyntaxTheme.js +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.js +2 -2
- package/dist/theme/syntax/presets.d.ts +1 -1
- package/dist/theme/syntax/presets.d.ts.map +1 -1
- package/dist/theme/syntax/presets.js +1 -1
- package/dist/theme/syntax/tokens.d.ts +1 -1
- package/dist/theme/syntax/tokens.js +1 -1
- package/dist/theme/types.d.ts +1 -1
- package/dist/utils/dateTypes.d.ts +12 -0
- package/dist/utils/dateTypes.d.ts.map +1 -1
- package/dist/utils/dateTypes.js +41 -1
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -1
- package/dist/utils/inputAria.d.ts +29 -0
- package/dist/utils/inputAria.d.ts.map +1 -0
- package/dist/utils/inputAria.js +30 -0
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +5 -2
- package/package.json +15 -5
- package/src/Avatar/Avatar.test.tsx +37 -0
- package/src/Avatar/Avatar.tsx +10 -5
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +3 -0
- package/src/Banner/Banner.doc.mjs +8 -0
- package/src/Banner/Banner.test.tsx +16 -7
- package/src/Banner/Banner.tsx +9 -2
- package/src/Breadcrumbs/BreadcrumbItem.tsx +25 -7
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +31 -10
- package/src/Button/Button.doc.mjs +6 -0
- package/src/Button/Button.test.tsx +105 -11
- package/src/Button/Button.tsx +76 -21
- package/src/Calendar/Calendar.doc.mjs +4 -4
- package/src/Calendar/Calendar.test.tsx +168 -30
- package/src/Calendar/Calendar.tsx +121 -66
- package/src/Calendar/hooks/index.ts +0 -6
- package/src/Calendar/index.ts +1 -3
- package/src/Calendar/styles.ts +4 -9
- package/src/Carousel/Carousel.doc.mjs +7 -1
- package/src/Carousel/Carousel.test.tsx +20 -0
- package/src/Carousel/Carousel.tsx +16 -1
- package/src/Center/Center.doc.mjs +12 -2
- package/src/Center/Center.tsx +28 -3
- package/src/Chat/ChatComposer.doc.mjs +3 -0
- package/src/Chat/ChatComposerDrawer.doc.mjs +12 -0
- package/src/Chat/ChatMessageList.doc.mjs +8 -0
- package/src/Chat/ChatMessageList.test.tsx +18 -0
- package/src/Chat/ChatMessageList.tsx +16 -0
- package/src/Chat/useTriggerMenu.tsx +3 -0
- package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +172 -27
- package/src/CheckboxInput/CheckboxInput.tsx +78 -6
- package/src/CheckboxList/CheckboxList.doc.mjs +9 -0
- package/src/CheckboxList/CheckboxList.test.tsx +169 -16
- package/src/CheckboxList/CheckboxList.tsx +56 -3
- package/src/CheckboxList/CheckboxListContext.tsx +7 -0
- package/src/Citation/Citation.doc.mjs +10 -0
- package/src/Citation/Citation.test.tsx +117 -0
- package/src/Citation/Citation.tsx +9 -1
- package/src/ClickableCard/ClickableCard.doc.mjs +15 -0
- package/src/CodeBlock/CodeBlock.test.tsx +115 -0
- package/src/CodeBlock/CodeBlock.tsx +61 -33
- package/src/CommandPalette/CommandPalette.test.tsx +47 -1
- package/src/CommandPalette/CommandPalette.tsx +9 -21
- package/src/ContextMenu/ContextMenu.doc.mjs +4 -4
- package/src/ContextMenu/ContextMenu.test.tsx +155 -1
- package/src/ContextMenu/ContextMenu.tsx +113 -16
- package/src/DateInput/DateInput.doc.mjs +281 -56
- package/src/DateInput/DateInput.test.tsx +188 -2
- package/src/DateInput/DateInput.tsx +89 -10
- package/src/DateRangeInput/DateRangeInput.doc.mjs +251 -46
- package/src/DateRangeInput/DateRangeInput.test.tsx +182 -20
- package/src/DateRangeInput/DateRangeInput.tsx +63 -5
- package/src/DateTimeInput/DateTimeInput.doc.mjs +368 -67
- package/src/DateTimeInput/DateTimeInput.test.tsx +279 -11
- package/src/DateTimeInput/DateTimeInput.tsx +125 -17
- package/src/Dialog/Dialog.doc.mjs +2 -2
- package/src/Dialog/Dialog.tsx +12 -0
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -8
- package/src/DropdownMenu/DropdownMenu.test.tsx +56 -42
- package/src/DropdownMenu/DropdownMenu.tsx +52 -18
- package/src/EmptyState/EmptyState.test.tsx +4 -2
- package/src/EmptyState/EmptyState.tsx +6 -2
- package/src/Field/Field.test.tsx +32 -0
- package/src/Field/Field.tsx +23 -5
- package/src/Field/FieldLabel.tsx +55 -17
- package/src/FileInput/FileInput.doc.mjs +17 -0
- package/src/FileInput/FileInput.test.tsx +283 -49
- package/src/FileInput/FileInput.tsx +76 -4
- package/src/Grid/Grid.doc.mjs +14 -4
- package/src/Grid/Grid.tsx +20 -0
- package/src/HoverCard/HoverCard.doc.mjs +3 -0
- package/src/HoverCard/HoverCard.test.tsx +189 -2
- package/src/HoverCard/HoverCard.tsx +20 -16
- package/src/HoverCard/useHoverCard.tsx +13 -10
- package/src/Icon/Icon.doc.mjs +8 -0
- package/src/InputGroup/InputGroup.doc.mjs +2 -2
- package/src/InputGroup/InputGroup.test.tsx +98 -60
- package/src/InputGroup/InputGroup.tsx +21 -4
- package/src/InputGroup/InputGroupContext.ts +9 -4
- package/src/InputGroup/index.ts +1 -0
- package/src/Kbd/Kbd.test.tsx +22 -4
- package/src/Kbd/Kbd.tsx +37 -12
- package/src/Layer/anchorName.test.ts +146 -0
- package/src/Layer/anchorName.ts +46 -0
- package/src/Layer/layerAnimations.stylex.ts +20 -4
- package/src/Layer/useLayer.doc.mjs +12 -2
- package/src/Layer/useLayer.tsx +100 -15
- package/src/Layout/Layout.doc.mjs +1 -1
- package/src/Layout/Layout.tsx +8 -16
- package/src/Layout/LayoutFooter.doc.mjs +4 -4
- package/src/Layout/LayoutFooter.tsx +3 -3
- package/src/Layout/LayoutHeader.doc.mjs +4 -4
- package/src/Layout/LayoutHeader.tsx +3 -3
- package/src/Layout/LayoutPanel.tsx +3 -3
- package/src/Layout/padding.stylex.ts +52 -0
- package/src/Lightbox/Lightbox.doc.mjs +9 -2
- package/src/Lightbox/Lightbox.test.tsx +53 -5
- package/src/Lightbox/Lightbox.tsx +9 -4
- package/src/Link/Link.doc.mjs +14 -0
- package/src/Link/Link.test.tsx +52 -2
- package/src/Link/Link.tsx +42 -7
- package/src/Link/LinkProvider.tsx +1 -0
- package/src/List/List.doc.mjs +7 -0
- package/src/Markdown/Markdown.doc.mjs +2 -0
- package/src/Markdown/Markdown.test.tsx +28 -26
- package/src/Markdown/Markdown.tsx +21 -6
- package/src/MetadataList/MetadataListItem.doc.mjs +4 -0
- package/src/MobileNav/MobileNav.doc.mjs +8 -8
- package/src/MobileNav/MobileNav.tsx +13 -0
- package/src/MobileNav/MobileNavReopen.test.tsx +118 -0
- package/src/MoreMenu/MoreMenu.doc.mjs +2 -17
- package/src/MoreMenu/MoreMenu.tsx +0 -9
- package/src/MultiSelector/MultiSelector.doc.mjs +25 -0
- package/src/MultiSelector/MultiSelector.test.tsx +375 -8
- package/src/MultiSelector/MultiSelector.tsx +145 -21
- package/src/MultiSelector/hooks.ts +27 -0
- package/src/NavMenu/NavHeadingMenu.test.tsx +77 -1
- package/src/NavMenu/NavHeadingMenu.tsx +50 -3
- package/src/NumberInput/NumberInput.doc.mjs +17 -0
- package/src/NumberInput/NumberInput.test.tsx +242 -40
- package/src/NumberInput/NumberInput.tsx +89 -11
- package/src/OverflowList/OverflowList.doc.mjs +17 -0
- package/src/Pagination/Pagination.doc.mjs +3 -3
- package/src/Pagination/Pagination.test.tsx +250 -14
- package/src/Pagination/Pagination.tsx +54 -29
- package/src/Popover/usePopover.doc.mjs +7 -3
- package/src/Popover/usePopover.tsx +49 -6
- package/src/PowerSearch/PowerSearch.doc.mjs +15 -0
- package/src/PowerSearch/PowerSearch.test.tsx +97 -1
- package/src/PowerSearch/PowerSearch.tsx +16 -3
- package/src/ProgressBar/ProgressBar.test.tsx +45 -27
- package/src/ProgressBar/ProgressBar.tsx +3 -4
- package/src/RadioList/RadioList.doc.mjs +9 -0
- package/src/RadioList/RadioList.test.tsx +252 -16
- package/src/RadioList/RadioList.tsx +166 -10
- package/src/RadioList/RadioListItem.tsx +14 -2
- package/src/Resizable/Resizable.doc.mjs +1 -1
- package/src/Section/Section.doc.mjs +11 -0
- package/src/SegmentedControl/SegmentedControl.doc.mjs +9 -0
- package/src/SegmentedControl/SegmentedControl.test.tsx +214 -42
- package/src/SegmentedControl/SegmentedControl.tsx +102 -54
- package/src/SegmentedControl/SegmentedControlContext.ts +7 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +14 -1
- package/src/SelectableCard/SelectableCard.doc.mjs +15 -0
- package/src/Selector/Selector.doc.mjs +25 -0
- package/src/Selector/Selector.test.tsx +322 -15
- package/src/Selector/Selector.tsx +126 -40
- package/src/Selector/hooks.ts +23 -0
- package/src/SideNav/SideNav.test.tsx +16 -0
- package/src/SideNav/SideNavItem.tsx +2 -4
- package/src/Skeleton/Skeleton.doc.mjs +11 -1
- package/src/Skeleton/Skeleton.test.tsx +25 -0
- package/src/Skeleton/Skeleton.tsx +11 -1
- package/src/Slider/Slider.doc.mjs +19 -0
- package/src/Slider/Slider.test.tsx +158 -18
- package/src/Slider/Slider.tsx +54 -6
- package/src/Spinner/Spinner.tsx +7 -1
- package/src/Stack/Stack.doc.mjs +77 -0
- package/src/Stack/Stack.test.tsx +55 -5
- package/src/Stack/Stack.tsx +73 -24
- package/src/Stack/StackItem.test.tsx +23 -0
- package/src/Stack/StackItem.tsx +20 -23
- package/src/Switch/Switch.doc.mjs +15 -0
- package/src/Switch/Switch.test.tsx +162 -27
- package/src/Switch/Switch.tsx +61 -21
- package/src/TabList/Tab.tsx +6 -0
- package/src/TabList/TabList.doc.mjs +12 -0
- package/src/TabList/TabList.test.tsx +208 -0
- package/src/TabList/TabList.tsx +102 -12
- package/src/TabList/TabListContext.ts +7 -3
- package/src/TabList/TabMenu.tsx +6 -3
- package/src/Table/BaseTable.tsx +72 -41
- package/src/Table/Table.doc.mjs +14 -0
- package/src/Table/Table.test.tsx +39 -30
- package/src/Table/Table.tsx +27 -1
- package/src/Table/TableCell.tsx +25 -23
- package/src/Table/TableHeaderCell.tsx +28 -29
- package/src/Table/TableRow.tsx +37 -7
- package/src/Table/index.ts +6 -2
- package/src/Table/plugins/pagination/paginateData.ts +10 -3
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +16 -0
- package/src/Table/plugins/pagination/useTablePagination.tsx +8 -1
- package/src/Table/plugins/sortable/useTableSortable.test.tsx +91 -2
- package/src/Table/plugins/sortable/useTableSortable.tsx +53 -1
- package/src/Table/plugins/stickyColumns/index.ts +4 -0
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.test.tsx +163 -0
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +407 -0
- package/src/Table/tableContextMenu.test.tsx +157 -0
- package/src/Table/tableContextMenu.tsx +142 -0
- package/src/Table/types.ts +175 -4
- package/src/Table/useBaseTablePlugins.ts +1 -0
- package/src/Table/useTableColumnResize.doc.mjs +96 -0
- package/src/Table/useTableStickyColumns.doc.mjs +59 -0
- package/src/Text/Heading.doc.mjs +15 -2
- package/src/Text/Text.doc.mjs +7 -1
- package/src/Text/text.stylex.ts +2 -2
- package/src/TextArea/TextArea.doc.mjs +17 -0
- package/src/TextArea/TextArea.test.tsx +167 -35
- package/src/TextArea/TextArea.tsx +62 -15
- package/src/TextInput/TextInput.doc.mjs +17 -0
- package/src/TextInput/TextInput.test.tsx +168 -34
- package/src/TextInput/TextInput.tsx +77 -9
- package/src/TimeInput/TimeInput.doc.mjs +335 -60
- package/src/TimeInput/TimeInput.test.tsx +144 -7
- package/src/TimeInput/TimeInput.tsx +74 -5
- package/src/Timestamp/Timestamp.doc.mjs +9 -0
- package/src/Timestamp/Timestamp.test.tsx +44 -18
- package/src/Timestamp/Timestamp.tsx +30 -10
- package/src/Toast/Toast.tsx +14 -0
- package/src/Toast/ToastViewport.test.tsx +204 -0
- package/src/Toast/ToastViewport.tsx +167 -21
- package/src/ToggleButton/ToggleButton.doc.mjs +9 -3
- package/src/ToggleButton/ToggleButton.test.tsx +39 -18
- package/src/ToggleButton/ToggleButton.tsx +46 -83
- package/src/Tokenizer/Tokenizer.doc.mjs +15 -0
- package/src/Tokenizer/Tokenizer.test.tsx +105 -1
- package/src/Tokenizer/Tokenizer.tsx +41 -2
- package/src/Toolbar/Toolbar.doc.mjs +65 -5
- package/src/Toolbar/Toolbar.test.tsx +109 -6
- package/src/Toolbar/Toolbar.tsx +59 -5
- package/src/Tooltip/Tooltip.test.tsx +81 -0
- package/src/Tooltip/useTooltip.tsx +57 -11
- package/src/TreeList/TreeList.test.tsx +295 -6
- package/src/TreeList/TreeList.tsx +73 -1
- package/src/TreeList/TreeListItem.tsx +51 -5
- package/src/TreeList/treeListItem.markers.stylex.ts +20 -0
- package/src/Typeahead/BaseTypeahead.tsx +86 -9
- package/src/Typeahead/Typeahead.doc.mjs +136 -30
- package/src/Typeahead/Typeahead.test.tsx +331 -1
- package/src/Typeahead/Typeahead.tsx +52 -1
- package/src/VisuallyHidden/VisuallyHidden.doc.mjs +80 -0
- package/src/VisuallyHidden/VisuallyHidden.test.tsx +76 -0
- package/src/VisuallyHidden/VisuallyHidden.tsx +113 -0
- package/src/VisuallyHidden/index.ts +15 -0
- package/src/hooks/focusableSelector.ts +25 -0
- package/src/hooks/index.ts +28 -2
- package/src/hooks/useAnnounce.test.tsx +101 -0
- package/src/hooks/useAnnounce.ts +168 -0
- package/src/hooks/useClickableContainer.ts +16 -4
- package/src/hooks/useEntryAnimation.ts +16 -4
- package/src/hooks/useFocusTrap.test.tsx +132 -0
- package/src/hooks/useFocusTrap.ts +98 -4
- package/src/hooks/useGridFocus.doc.mjs +40 -2
- package/src/hooks/useGridFocus.test.tsx +132 -0
- package/src/hooks/useGridFocus.ts +343 -67
- package/src/hooks/useImageMode.test.ts +133 -0
- package/src/hooks/useKeyboardHint.doc.mjs +101 -0
- package/src/hooks/useKeyboardHint.test.tsx +70 -0
- package/src/hooks/useKeyboardHint.tsx +332 -0
- package/src/hooks/useListFocus.doc.mjs +50 -10
- package/src/hooks/useListFocus.test.tsx +375 -0
- package/src/hooks/useListFocus.ts +395 -57
- package/src/hooks/useLongPress.test.tsx +134 -0
- package/src/hooks/useLongPress.ts +119 -0
- package/src/hooks/useTreeFocus.doc.mjs +140 -0
- package/src/hooks/useTreeFocus.test.tsx +214 -0
- package/src/hooks/useTreeFocus.ts +559 -0
- package/src/hooks/useTypeahead.test.tsx +109 -0
- package/src/hooks/useTypeahead.ts +183 -0
- package/src/index.ts +1 -0
- package/src/theme/derivedVarRegistry.test.ts +4 -0
- package/src/theme/generateThemeRules.test.ts +7 -8
- package/src/theme/generateThemeRules.ts +1 -1
- package/src/theme/syntax/SyntaxTheme.tsx +1 -1
- package/src/theme/syntax/defineSyntaxTheme.ts +20 -11
- package/src/theme/syntax/presets.ts +5 -2
- package/src/theme/syntax/tokens.ts +1 -1
- package/src/theme/types.ts +1 -1
- package/src/utils/dateTypes.test.ts +40 -0
- package/src/utils/dateTypes.ts +40 -0
- package/src/utils/index.ts +9 -0
- package/src/utils/inputAria.test.ts +39 -0
- package/src/utils/inputAria.ts +58 -0
- package/src/utils/timeParser.test.ts +10 -0
- package/src/utils/timeParser.ts +5 -2
- package/dist/Calendar/hooks/useCalendarRovingTabindex.d.ts +0 -57
- package/dist/Calendar/hooks/useCalendarRovingTabindex.d.ts.map +0 -1
- package/dist/Calendar/hooks/useCalendarRovingTabindex.js +0 -96
- package/src/Calendar/hooks/useCalendarRovingTabindex.ts +0 -118
package/src/Table/TableRow.tsx
CHANGED
|
@@ -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
|
-
//
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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') {
|
package/src/Table/index.ts
CHANGED
|
@@ -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
|
-
|
|
35
|
-
|
|
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,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
|
+
});
|