@astryxdesign/core 0.1.3 → 0.1.4-canary.01e5b29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -0
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +20 -18
- package/dist/AlertDialog/useImperativeAlertDialog.js +3 -3
- package/dist/AppShell/AppShell.d.ts +1 -1
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +55 -53
- package/dist/AspectRatio/AspectRatio.js +5 -5
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +27 -25
- package/dist/Avatar/AvatarStatusDot.js +5 -5
- package/dist/AvatarGroup/AvatarGroup.js +5 -5
- package/dist/AvatarGroup/AvatarGroupOverflow.js +5 -5
- package/dist/Badge/Badge.js +3 -3
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +32 -25
- package/dist/Blockquote/Blockquote.js +7 -7
- package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
- package/dist/Breadcrumbs/Breadcrumbs.js +7 -7
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +47 -26
- package/dist/ButtonGroup/ButtonGroup.js +7 -7
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +108 -64
- package/dist/Calendar/dayCellUtils.d.ts +67 -5
- package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
- package/dist/Calendar/dayCellUtils.js +139 -18
- package/dist/Calendar/styles.d.ts +2 -2
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +2 -2
- package/dist/Card/Card.d.ts +4 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +18 -10
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +20 -19
- package/dist/Center/Center.js +3 -3
- package/dist/Chat/ChatComposer.js +23 -23
- package/dist/Chat/ChatComposerDrawer.js +14 -14
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +27 -15
- package/dist/Chat/ChatDictationButton.d.ts +1 -1
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +13 -11
- package/dist/Chat/ChatLayout.js +17 -17
- package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +12 -10
- package/dist/Chat/ChatMessage.js +12 -12
- package/dist/Chat/ChatMessageBubble.js +7 -7
- package/dist/Chat/ChatMessageList.js +14 -14
- package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatMessageMetadata.js +14 -12
- package/dist/Chat/ChatPastedTextToken.js +13 -13
- package/dist/Chat/ChatSendButton.js +3 -3
- package/dist/Chat/ChatSystemMessage.d.ts +1 -1
- package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
- package/dist/Chat/ChatSystemMessage.js +17 -17
- package/dist/Chat/ChatTokenizedText.d.ts +1 -1
- package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
- package/dist/Chat/ChatTokenizedText.js +24 -15
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +81 -74
- package/dist/Chat/index.d.ts +1 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +15 -15
- package/dist/CheckboxInput/CheckboxInput.d.ts +6 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +32 -24
- package/dist/CheckboxList/CheckboxList.js +9 -9
- package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +8 -6
- package/dist/Citation/Citation.js +10 -10
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +32 -9
- package/dist/Code/Code.d.ts +15 -1
- package/dist/Code/Code.d.ts.map +1 -1
- package/dist/Code/Code.js +35 -5
- package/dist/Code/index.d.ts +1 -1
- package/dist/Code/index.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.d.ts +10 -1
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +88 -52
- package/dist/CodeBlock/index.d.ts +1 -1
- package/dist/CodeBlock/index.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.d.ts +9 -3
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +110 -22
- package/dist/Collapsible/CollapsibleGroup.d.ts +39 -7
- package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroup.js +73 -12
- package/dist/Collapsible/CollapsibleGroupContext.d.ts +31 -0
- package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroupContext.js +33 -3
- package/dist/Collapsible/index.d.ts +1 -0
- package/dist/Collapsible/index.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.d.ts +4 -1
- package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.js +20 -6
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +36 -34
- package/dist/CommandPalette/CommandPaletteEmpty.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteEmpty.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteEmpty.js +27 -7
- package/dist/CommandPalette/CommandPaletteFooter.js +16 -16
- package/dist/CommandPalette/CommandPaletteGroup.js +5 -5
- package/dist/CommandPalette/CommandPaletteInput.js +13 -13
- package/dist/CommandPalette/CommandPaletteItem.js +3 -3
- package/dist/CommandPalette/CommandPaletteList.js +3 -3
- package/dist/ContextMenu/ContextMenu.d.ts +9 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +16 -11
- package/dist/DateInput/DateInput.js +18 -18
- package/dist/DateRangeInput/DateRangeInput.js +23 -23
- package/dist/DateTimeInput/DateTimeInput.d.ts +5 -7
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +30 -26
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +9 -9
- package/dist/Dialog/DialogHeader.js +16 -16
- package/dist/Dialog/useImperativeDialog.js +3 -3
- package/dist/Divider/Divider.d.ts +0 -22
- package/dist/Divider/Divider.d.ts.map +1 -1
- package/dist/Divider/Divider.js +7 -7
- package/dist/DropdownMenu/DropdownMenu.js +10 -10
- package/dist/DropdownMenu/DropdownMenuItem.d.ts +2 -17
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
- package/dist/DropdownMenu/renderDropdownItems.js +10 -10
- package/dist/EmptyState/EmptyState.js +9 -9
- package/dist/Field/Field.js +17 -17
- package/dist/Field/FieldLabel.js +15 -15
- package/dist/Field/InputClearButton.js +5 -5
- package/dist/FieldStatus/FieldStatus.js +3 -3
- package/dist/FileInput/FileInput.js +29 -29
- package/dist/FormLayout/FormLayout.js +5 -5
- package/dist/Grid/Grid.d.ts +4 -3
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +29 -12
- package/dist/Grid/GridSpan.js +3 -3
- package/dist/HStack/HStack.js +3 -3
- package/dist/Heading/Heading.js +10 -10
- package/dist/HoverCard/HoverCard.js +9 -9
- package/dist/HoverCard/useHoverCard.js +3 -3
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +16 -12
- package/dist/Icon/defaultIcons.js +116 -116
- package/dist/IconButton/IconButton.js +3 -3
- package/dist/InputGroup/InputGroup.js +11 -11
- package/dist/InputGroup/InputGroupText.js +3 -3
- package/dist/Item/Item.js +18 -18
- package/dist/Kbd/Kbd.js +5 -5
- package/dist/Layer/LayerProvider.js +7 -7
- package/dist/Layer/useLayer.js +5 -5
- package/dist/Layout/Layout.js +21 -21
- package/dist/Layout/LayoutContent.js +3 -3
- package/dist/Layout/LayoutFooter.js +5 -5
- package/dist/Layout/LayoutHeader.js +5 -5
- package/dist/Layout/LayoutPanel.js +3 -3
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +55 -31
- package/dist/Lightbox/useLightbox.js +3 -3
- package/dist/Link/Link.js +15 -15
- package/dist/Link/LinkProvider.js +3 -3
- package/dist/Link/useLinkify.js +3 -3
- package/dist/List/List.js +11 -11
- package/dist/List/ListItem.js +11 -11
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +102 -102
- package/dist/Markdown/parser.d.ts +7 -0
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +300 -6
- package/dist/MetadataList/MetadataList.js +10 -10
- package/dist/MetadataList/MetadataListItem.js +15 -15
- package/dist/MobileNav/MobileNav.js +15 -15
- package/dist/MobileNav/MobileNavToggle.js +5 -5
- package/dist/MoreMenu/MoreMenu.js +3 -3
- package/dist/MultiSelector/MultiSelector.d.ts +7 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +64 -55
- package/dist/NavIcon/NavIcon.js +3 -3
- package/dist/NavMenu/NavHeadingMenu.js +5 -5
- package/dist/NavMenu/NavHeadingMenuItem.js +8 -8
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +48 -32
- package/dist/Outline/Outline.js +15 -15
- package/dist/OverflowList/OverflowList.js +8 -8
- package/dist/Overlay/Overlay.js +3 -3
- package/dist/Overlay/OverlayScrim.js +5 -5
- package/dist/Overlay/useOverlay.js +3 -3
- package/dist/Pagination/Pagination.d.ts +1 -1
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +125 -72
- package/dist/Popover/Popover.js +16 -16
- package/dist/Popover/usePopover.js +7 -7
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +110 -92
- package/dist/PowerSearch/PowerSearchEditPopover.js +84 -84
- package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
- package/dist/PowerSearch/PowerSearchToken.js +5 -5
- package/dist/PowerSearch/PowerSearchValueEditor.js +54 -54
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +25 -18
- package/dist/RadioList/RadioList.d.ts +7 -1
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +10 -8
- package/dist/RadioList/RadioListItem.d.ts +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +30 -22
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +28 -10
- package/dist/Section/Section.js +5 -5
- package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +32 -10
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +18 -12
- package/dist/SelectableCard/SelectableCard.js +5 -5
- package/dist/Selector/Selector.d.ts +6 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +54 -45
- package/dist/Selector/SelectorOption.js +3 -3
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +38 -34
- package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +8 -6
- package/dist/SideNav/SideNavHeading.js +87 -87
- package/dist/SideNav/SideNavItem.js +42 -42
- package/dist/SideNav/SideNavSection.d.ts +1 -1
- package/dist/SideNav/SideNavSection.d.ts.map +1 -1
- package/dist/SideNav/SideNavSection.js +18 -16
- package/dist/Skeleton/Skeleton.js +3 -3
- package/dist/Slider/Slider.d.ts +6 -0
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +31 -22
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +10 -10
- package/dist/StatusDot/StatusDot.js +5 -5
- package/dist/Switch/Switch.d.ts +13 -4
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +41 -30
- package/dist/TabList/Tab.js +18 -18
- package/dist/TabList/TabList.js +5 -5
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +57 -30
- package/dist/TabList/tab.markers.stylex.d.ts +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +51 -39
- package/dist/Table/Table.js +7 -7
- package/dist/Table/TableBody.d.ts +1 -1
- package/dist/Table/TableBody.d.ts.map +1 -1
- package/dist/Table/TableBody.js +9 -5
- package/dist/Table/TableCell.d.ts.map +1 -1
- package/dist/Table/TableCell.js +76 -7
- package/dist/Table/TableFooter.d.ts +1 -1
- package/dist/Table/TableFooter.d.ts.map +1 -1
- package/dist/Table/TableFooter.js +9 -5
- package/dist/Table/TableHeader.d.ts +1 -1
- package/dist/Table/TableHeader.d.ts.map +1 -1
- package/dist/Table/TableHeader.js +9 -5
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/TableRow.js +5 -5
- package/dist/Table/index.d.ts +2 -0
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -0
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +14 -11
- package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
- package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/paginateData.js +5 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
- package/dist/Table/plugins/rowExpansion/index.d.ts +3 -0
- package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -0
- package/dist/Table/plugins/rowExpansion/index.js +3 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +90 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +398 -0
- package/dist/Table/plugins/selection/useTableSelection.js +18 -18
- package/dist/Table/plugins/selection/useTableSelectionState.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelectionState.js +11 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +17 -17
- package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortableState.js +8 -4
- package/dist/Table/tableContextMenu.d.ts +5 -1
- package/dist/Table/tableContextMenu.d.ts.map +1 -1
- package/dist/Table/tableContextMenu.js +19 -12
- package/dist/Text/Text.d.ts +1 -1
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +14 -13
- package/dist/Text/text.stylex.d.ts +35 -0
- package/dist/Text/text.stylex.d.ts.map +1 -1
- package/dist/Text/text.stylex.js +52 -1
- package/dist/TextArea/TextArea.js +14 -14
- package/dist/TextInput/TextInput.js +15 -15
- package/dist/Thumbnail/Thumbnail.d.ts +3 -2
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +30 -29
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +26 -21
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +37 -26
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +25 -17
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +23 -11
- package/dist/Toast/useToast.js +4 -4
- package/dist/ToggleButton/ToggleButton.js +12 -12
- package/dist/ToggleButton/ToggleButtonGroup.js +5 -5
- package/dist/Token/Token.js +21 -21
- package/dist/Tokenizer/Tokenizer.d.ts +6 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +38 -29
- package/dist/Toolbar/Toolbar.js +18 -18
- package/dist/Tooltip/Tooltip.js +11 -11
- package/dist/Tooltip/useTooltip.js +3 -3
- package/dist/TopNav/TopNav.js +32 -32
- package/dist/TopNav/TopNavHeading.js +67 -67
- package/dist/TopNav/TopNavItem.js +5 -5
- package/dist/TopNav/TopNavMegaMenu.js +30 -30
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +25 -14
- package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
- package/dist/TopNav/TopNavMenu.js +32 -32
- package/dist/TreeList/TreeList.js +8 -8
- package/dist/TreeList/TreeListBranches.js +11 -11
- package/dist/TreeList/TreeListItem.js +30 -30
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +23 -20
- package/dist/Typeahead/Typeahead.js +12 -12
- package/dist/Typeahead/TypeaheadItem.js +10 -10
- package/dist/VStack/VStack.js +3 -3
- package/dist/astryx.css +23 -0
- package/dist/astryx.umd.js +60 -58
- package/dist/astryx.umd.js.map +4 -4
- package/dist/docs-types.d.ts +13 -1
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/hooks/focusableSelector.d.ts +1 -1
- package/dist/hooks/focusableSelector.d.ts.map +1 -1
- package/dist/hooks/focusableSelector.js +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useFocusTrap.d.ts +3 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +38 -1
- package/dist/hooks/useHotkeys.d.ts +51 -0
- package/dist/hooks/useHotkeys.d.ts.map +1 -0
- package/dist/hooks/useHotkeys.js +160 -0
- package/dist/hooks/useInteractiveRole.d.ts +6 -2
- package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
- package/dist/hooks/useInteractiveRole.js +6 -2
- package/dist/hooks/useKeyboardHint.js +9 -9
- package/dist/hooks/useStreamingText.d.ts +3 -1
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +14 -5
- package/dist/theme/MediaTheme.js +3 -3
- package/dist/theme/Theme.js +7 -7
- package/dist/theme/defineTheme.d.ts +1 -1
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/expandColorScale.d.ts.map +1 -1
- package/dist/theme/expandColorScale.js +10 -3
- package/dist/theme/hct.d.ts +0 -15
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +9 -9
- package/dist/theme/syntax/SyntaxTheme.js +5 -5
- package/dist/theme/tokens.d.ts +10 -2
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +220 -4
- package/dist/utils/color.d.ts +42 -0
- package/dist/utils/color.d.ts.map +1 -0
- package/dist/utils/color.js +150 -0
- package/dist/utils/composeEventHandlers.d.ts +30 -0
- package/dist/utils/composeEventHandlers.d.ts.map +1 -0
- package/dist/utils/composeEventHandlers.js +40 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -1
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +8 -5
- package/package.json +3 -3
- package/src/AlertDialog/AlertDialog.tsx +2 -0
- package/src/AppShell/AppShell.tsx +2 -0
- package/src/AspectRatio/AspectRatio.doc.mjs +1 -1
- package/src/Avatar/Avatar.doc.mjs +13 -2
- package/src/Avatar/Avatar.test.tsx +32 -1
- package/src/Avatar/Avatar.tsx +12 -20
- package/src/Banner/Banner.doc.mjs +8 -0
- package/src/Banner/Banner.test.tsx +38 -0
- package/src/Banner/Banner.tsx +8 -1
- package/src/Button/Button.tsx +39 -6
- package/src/ButtonGroup/ButtonGroup.doc.mjs +1 -1
- package/src/Calendar/Calendar.doc.mjs +1 -1
- package/src/Calendar/Calendar.test.tsx +201 -17
- package/src/Calendar/Calendar.tsx +79 -26
- package/src/Calendar/dayCellUtils.test.ts +306 -1
- package/src/Calendar/dayCellUtils.ts +206 -13
- package/src/Calendar/styles.ts +12 -2
- package/src/Card/Card.doc.mjs +1 -1
- package/src/Card/Card.tsx +16 -6
- package/src/Carousel/Carousel.doc.mjs +12 -12
- package/src/Carousel/Carousel.test.tsx +13 -0
- package/src/Carousel/Carousel.tsx +1 -0
- package/src/Chat/Chat.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.test.tsx +24 -0
- package/src/Chat/ChatComposerInput.tsx +17 -1
- package/src/Chat/ChatDictationButton.test.tsx +43 -0
- package/src/Chat/ChatDictationButton.tsx +4 -4
- package/src/Chat/ChatLayoutScrollButton.test.tsx +33 -0
- package/src/Chat/ChatLayoutScrollButton.tsx +3 -1
- package/src/Chat/ChatMessageMetadata.test.tsx +32 -0
- package/src/Chat/ChatMessageMetadata.tsx +4 -6
- package/src/Chat/ChatSystemMessage.test.tsx +26 -11
- package/src/Chat/ChatSystemMessage.tsx +7 -7
- package/src/Chat/ChatTokenizedText.test.tsx +29 -16
- package/src/Chat/ChatTokenizedText.tsx +15 -8
- package/src/Chat/ChatToolCalls.test.tsx +55 -0
- package/src/Chat/ChatToolCalls.tsx +10 -12
- package/src/Chat/index.ts +1 -4
- package/src/Chat/useChatNewMessages.test.tsx +4 -4
- package/src/CheckboxInput/CheckboxInput.doc.mjs +12 -4
- package/src/CheckboxInput/CheckboxInput.test.tsx +103 -0
- package/src/CheckboxInput/CheckboxInput.tsx +13 -0
- package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
- package/src/CheckboxList/CheckboxList.test.tsx +19 -0
- package/src/CheckboxList/CheckboxListItem.tsx +11 -2
- package/src/Citation/Citation.doc.mjs +5 -0
- package/src/ClickableCard/ClickableCard.tsx +45 -2
- package/src/Code/Code.test.tsx +54 -0
- package/src/Code/Code.tsx +48 -4
- package/src/Code/index.ts +1 -1
- package/src/CodeBlock/CodeBlock.doc.mjs +7 -2
- package/src/CodeBlock/CodeBlock.test.tsx +122 -3
- package/src/CodeBlock/CodeBlock.tsx +62 -4
- package/src/CodeBlock/index.ts +1 -1
- package/src/Collapsible/Collapsible.doc.mjs +8 -4
- package/src/Collapsible/Collapsible.test.tsx +405 -0
- package/src/Collapsible/Collapsible.tsx +86 -10
- package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
- package/src/Collapsible/CollapsibleGroup.test.tsx +318 -0
- package/src/Collapsible/CollapsibleGroup.tsx +107 -9
- package/src/Collapsible/CollapsibleGroupContext.tsx +42 -2
- package/src/Collapsible/index.ts +4 -0
- package/src/Collapsible/useCollapsible.ts +20 -6
- package/src/CommandPalette/CommandPalette.tsx +5 -3
- package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
- package/src/CommandPalette/CommandPaletteEmpty.tsx +15 -1
- package/src/CommandPalette/CommandPaletteGroup.doc.mjs +10 -0
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +6 -0
- package/src/CommandPalette/CommandPaletteItem.doc.mjs +6 -0
- package/src/CommandPalette/CommandPaletteList.doc.mjs +9 -0
- package/src/ContextMenu/ContextMenu.doc.mjs +15 -0
- package/src/ContextMenu/ContextMenu.test.tsx +15 -0
- package/src/ContextMenu/ContextMenu.tsx +19 -1
- package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
- package/src/DateInput/DateInput.doc.mjs +6 -1
- package/src/DateInput/DateInput.test.tsx +11 -20
- package/src/DateRangeInput/DateRangeInput.doc.mjs +1 -1
- package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
- package/src/DateRangeInput/DateRangeInput.tsx +2 -2
- package/src/DateTimeInput/DateTimeInput.doc.mjs +4 -3
- package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
- package/src/DateTimeInput/DateTimeInput.tsx +9 -8
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/DialogHeader.doc.mjs +45 -0
- package/src/Divider/Divider.tsx +1 -23
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenu.test.tsx +5 -3
- package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
- package/src/EmptyState/EmptyState.doc.mjs +1 -1
- package/src/Field/Field.doc.mjs +1 -1
- package/src/Field/FieldLabel.test.tsx +2 -2
- package/src/FieldStatus/FieldStatus.test.tsx +282 -0
- package/src/FileInput/FileInput.doc.mjs +1 -1
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
- package/src/Grid/Grid.doc.mjs +3 -3
- package/src/Grid/Grid.test.tsx +43 -18
- package/src/Grid/Grid.tsx +26 -9
- package/src/Icon/Icon.test.tsx +41 -29
- package/src/Icon/Icon.tsx +6 -2
- package/src/InputGroup/InputGroup.tsx +2 -2
- package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
- package/src/Item/Item.tsx +1 -1
- package/src/Layout/Layout.test.tsx +285 -0
- package/src/Layout/LayoutContent.doc.mjs +12 -0
- package/src/Layout/LayoutPanel.doc.mjs +40 -0
- package/src/Layout/LayoutSlots.test.tsx +364 -0
- package/src/Layout/__tests__/edgeCompensation.test.tsx +72 -0
- package/src/Lightbox/Lightbox.doc.mjs +5 -0
- package/src/Lightbox/Lightbox.test.tsx +123 -2
- package/src/Lightbox/Lightbox.tsx +29 -1
- package/src/Markdown/Markdown.test.tsx +23 -0
- package/src/Markdown/Markdown.tsx +9 -7
- package/src/Markdown/incremental.test.ts +36 -0
- package/src/Markdown/parser.perf.test.ts +34 -12
- package/src/Markdown/parser.test.ts +210 -0
- package/src/Markdown/parser.ts +301 -6
- package/src/MobileNav/MobileNav.doc.mjs +20 -0
- package/src/MultiSelector/MultiSelector.doc.mjs +14 -1
- package/src/MultiSelector/MultiSelector.test.tsx +33 -0
- package/src/MultiSelector/MultiSelector.tsx +20 -0
- package/src/NavMenu/NavMenu.doc.mjs +15 -0
- package/src/NumberInput/NumberInput.test.tsx +48 -3
- package/src/NumberInput/NumberInput.tsx +32 -15
- package/src/Outline/parseOutlineFromMarkdown.test.ts +80 -0
- package/src/OverflowList/OverflowList.test.tsx +416 -0
- package/src/Overlay/Overlay.doc.mjs +6 -0
- package/src/Overlay/Overlay.test.tsx +356 -0
- package/src/Pagination/Pagination.test.tsx +162 -0
- package/src/Pagination/Pagination.tsx +80 -26
- package/src/Popover/Popover.test.tsx +65 -0
- package/src/PowerSearch/PowerSearch.doc.mjs +4 -4
- package/src/PowerSearch/PowerSearch.test.tsx +109 -1
- package/src/PowerSearch/PowerSearch.tsx +37 -16
- package/src/ProgressBar/ProgressBar.test.tsx +30 -0
- package/src/ProgressBar/ProgressBar.tsx +12 -5
- package/src/RadioList/RadioList.doc.mjs +7 -1
- package/src/RadioList/RadioList.test.tsx +65 -0
- package/src/RadioList/RadioList.tsx +10 -1
- package/src/RadioList/RadioListItem.tsx +13 -4
- package/src/Resizable/ResizeHandle.test.tsx +218 -0
- package/src/Resizable/ResizeHandle.tsx +22 -4
- package/src/Section/Section.test.tsx +4 -10
- package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
- package/src/SegmentedControl/SegmentedControl.test.tsx +192 -0
- package/src/SegmentedControl/SegmentedControl.tsx +27 -5
- package/src/SegmentedControl/SegmentedControlItem.tsx +9 -4
- package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
- package/src/Selector/Selector.doc.mjs +12 -1
- package/src/Selector/Selector.test.tsx +30 -0
- package/src/Selector/Selector.tsx +18 -0
- package/src/SideNav/SideNav.doc.mjs +7 -1
- package/src/SideNav/SideNav.test.tsx +66 -0
- package/src/SideNav/SideNav.tsx +6 -2
- package/src/SideNav/SideNavCollapseButton.tsx +4 -3
- package/src/SideNav/SideNavSection.tsx +6 -4
- package/src/SizeContext/SizeContext.test.tsx +226 -0
- package/src/Slider/Slider.doc.mjs +14 -2
- package/src/Slider/Slider.test.tsx +30 -0
- package/src/Slider/Slider.tsx +20 -0
- package/src/Spinner/Spinner.tsx +1 -0
- package/src/Switch/Switch.doc.mjs +21 -9
- package/src/Switch/Switch.test.tsx +137 -0
- package/src/Switch/Switch.tsx +32 -7
- package/src/TabList/TabList.doc.mjs +3 -3
- package/src/TabList/TabList.test.tsx +185 -1
- package/src/TabList/TabMenu.tsx +45 -9
- package/src/Table/BaseTable.tsx +16 -3
- package/src/Table/Table.test.tsx +87 -0
- package/src/Table/TableBody.tsx +15 -2
- package/src/Table/TableCell.tsx +87 -8
- package/src/Table/TableFooter.tsx +15 -2
- package/src/Table/TableHeader.tsx +15 -2
- package/src/Table/index.ts +5 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +13 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +3 -1
- package/src/Table/plugins/pagination/paginateData.ts +5 -1
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
- package/src/Table/plugins/rowExpansion/index.ts +7 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +155 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +590 -0
- package/src/Table/plugins/selection/useTableSelectionState.test.tsx +23 -0
- package/src/Table/plugins/selection/useTableSelectionState.tsx +11 -6
- package/src/Table/plugins/sortable/useTableSortableState.test.tsx +35 -1
- package/src/Table/plugins/sortable/useTableSortableState.tsx +8 -4
- package/src/Table/tableContextMenu.test.tsx +27 -3
- package/src/Table/tableContextMenu.tsx +20 -2
- package/src/Table/useTablePagination.doc.mjs +4 -1
- package/src/Table/useTableRowExpansion.doc.mjs +80 -0
- package/src/Table/useTableSortable.doc.mjs +4 -1
- package/src/Text/Text.doc.mjs +2 -2
- package/src/Text/Text.test.tsx +11 -0
- package/src/Text/Text.tsx +4 -2
- package/src/Text/text.stylex.ts +41 -0
- package/src/TextArea/TextArea.doc.mjs +1 -1
- package/src/TextArea/TextArea.test.tsx +3 -3
- package/src/TextInput/TextInput.doc.mjs +1 -1
- package/src/TextInput/TextInput.test.tsx +3 -3
- package/src/Thumbnail/Thumbnail.test.tsx +36 -2
- package/src/Thumbnail/Thumbnail.tsx +4 -2
- package/src/TimeInput/TimeInput.doc.mjs +11 -6
- package/src/TimeInput/TimeInput.test.tsx +37 -0
- package/src/TimeInput/TimeInput.tsx +11 -1
- package/src/Timestamp/Timestamp.doc.mjs +1 -1
- package/src/Timestamp/Timestamp.test.tsx +52 -0
- package/src/Timestamp/Timestamp.tsx +30 -16
- package/src/Toast/Toast.tsx +11 -3
- package/src/Toast/ToastViewport.test.tsx +64 -0
- package/src/Toast/ToastViewport.tsx +12 -0
- package/src/ToggleButton/ToggleButton.doc.mjs +1 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +16 -4
- package/src/Tokenizer/Tokenizer.test.tsx +33 -0
- package/src/Tokenizer/Tokenizer.tsx +19 -0
- package/src/Toolbar/Toolbar.test.tsx +1 -1
- package/src/TopNav/TopNav.doc.mjs +1 -1
- package/src/TopNav/TopNav.test.tsx +18 -0
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +9 -2
- package/src/TreeList/TreeList.doc.mjs +2 -2
- package/src/Typeahead/BaseTypeahead.doc.mjs +19 -0
- package/src/Typeahead/BaseTypeahead.tsx +5 -2
- package/src/Typeahead/Typeahead.doc.mjs +7 -2
- package/src/Typeahead/Typeahead.test.tsx +45 -1
- package/src/__tests__/TestIcon.tsx +26 -0
- package/src/__tests__/fastRoleQueries.ts +66 -0
- package/src/docPropReferences.test.ts +178 -0
- package/src/docs-types.ts +14 -0
- package/src/hooks/focusableSelector.ts +1 -1
- package/src/hooks/index.ts +3 -0
- package/src/hooks/useFocusTrap.doc.mjs +4 -2
- package/src/hooks/useFocusTrap.test.tsx +149 -1
- package/src/hooks/useFocusTrap.ts +50 -1
- package/src/hooks/useHotkeys.doc.mjs +52 -0
- package/src/hooks/useHotkeys.test.ts +245 -0
- package/src/hooks/useHotkeys.ts +203 -0
- package/src/hooks/useInteractiveRole.ts +12 -4
- package/src/hooks/useKeyboardHint.doc.mjs +6 -6
- package/src/hooks/useStreamingText.test.ts +54 -19
- package/src/hooks/useStreamingText.ts +16 -5
- package/src/theme/SyntaxTheme.doc.mjs +4 -4
- package/src/theme/defineTheme.ts +4 -13
- package/src/theme/derivedVarRegistry.test.ts +2 -2
- package/src/theme/expandColorScale.test.ts +29 -0
- package/src/theme/expandColorScale.ts +11 -6
- package/src/theme/hct.ts +9 -17
- package/src/theme/tokens.test.ts +182 -9
- package/src/theme/tokens.ts +239 -4
- package/src/theme/useTheme.test.tsx +20 -0
- package/src/utils/color.test.ts +133 -0
- package/src/utils/color.ts +148 -0
- package/src/utils/composeEventHandlers.test.ts +71 -0
- package/src/utils/composeEventHandlers.ts +44 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/mergeProps.test.ts +166 -0
- package/src/utils/sharedResizeObserver.test.ts +2 -2
- package/src/utils/timeParser.test.ts +13 -0
- package/src/utils/timeParser.ts +8 -5
package/src/Table/BaseTable.tsx
CHANGED
|
@@ -225,7 +225,7 @@ function TableRowInner<T extends Record<string, unknown>>({
|
|
|
225
225
|
rowIndex,
|
|
226
226
|
);
|
|
227
227
|
|
|
228
|
-
|
|
228
|
+
const row = (
|
|
229
229
|
<RowComponent
|
|
230
230
|
key={rowKey}
|
|
231
231
|
ref={rowRenderProps.ref}
|
|
@@ -234,6 +234,8 @@ function TableRowInner<T extends Record<string, unknown>>({
|
|
|
234
234
|
{rowRenderProps.children}
|
|
235
235
|
</RowComponent>
|
|
236
236
|
);
|
|
237
|
+
|
|
238
|
+
return row;
|
|
237
239
|
}
|
|
238
240
|
|
|
239
241
|
/**
|
|
@@ -277,11 +279,18 @@ function areRowPropsEqual<T extends Record<string, unknown>>(
|
|
|
277
279
|
return true;
|
|
278
280
|
}
|
|
279
281
|
|
|
280
|
-
// Different object reference - compare values
|
|
282
|
+
// Different object reference - compare values. This is intentionally a
|
|
283
|
+
// one-level shallow compare: nested fields rely on reference identity.
|
|
281
284
|
const prevItem = prevProps.item;
|
|
282
285
|
const nextItem = nextProps.item;
|
|
283
286
|
const keys = Object.keys(nextItem);
|
|
284
287
|
|
|
288
|
+
// A key deleted from nextItem would never be visited by the loop below,
|
|
289
|
+
// and the row would keep rendering the removed field's stale value.
|
|
290
|
+
if (Object.keys(prevItem).length !== keys.length) {
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
|
|
285
294
|
for (const key of keys) {
|
|
286
295
|
if (prevItem[key] !== nextItem[key]) {
|
|
287
296
|
return false;
|
|
@@ -363,9 +372,13 @@ function BaseTableInner<T extends Record<string, unknown>>({
|
|
|
363
372
|
const headerCells = resolvedColumns.map((col, columnIndex) => {
|
|
364
373
|
const headerContent = col.header ?? col.key;
|
|
365
374
|
|
|
366
|
-
// Build initial htmlProps with column alignment if specified
|
|
375
|
+
// Build initial htmlProps with column alignment if specified.
|
|
376
|
+
// `scope: 'col'` is the default so every column header associates its
|
|
377
|
+
// data cells with the correct column for screen readers; a plugin's
|
|
378
|
+
// transformHeaderCell can override it via htmlProps.scope.
|
|
367
379
|
const initialHeaderHtmlProps: Record<string, unknown> = {
|
|
368
380
|
'data-column-key': col.key,
|
|
381
|
+
scope: 'col',
|
|
369
382
|
};
|
|
370
383
|
if (col.align) {
|
|
371
384
|
initialHeaderHtmlProps.style = {textAlign: col.align};
|
package/src/Table/Table.test.tsx
CHANGED
|
@@ -15,6 +15,9 @@ import {BaseTable} from './BaseTable';
|
|
|
15
15
|
import {Table} from './Table';
|
|
16
16
|
import {TableRow} from './TableRow';
|
|
17
17
|
import {TableCell} from './TableCell';
|
|
18
|
+
import {TableHeader} from './TableHeader';
|
|
19
|
+
import {TableBody} from './TableBody';
|
|
20
|
+
import {TableFooter} from './TableFooter';
|
|
18
21
|
import {
|
|
19
22
|
proportional,
|
|
20
23
|
pixel,
|
|
@@ -229,6 +232,34 @@ describe('BaseTable', () => {
|
|
|
229
232
|
expect(headers[2]).toHaveTextContent('Email');
|
|
230
233
|
});
|
|
231
234
|
|
|
235
|
+
it('renders every column header with scope="col"', () => {
|
|
236
|
+
render(<BaseTable data={users} columns={columns} />);
|
|
237
|
+
const headers = screen.getAllByRole('columnheader');
|
|
238
|
+
expect(headers).toHaveLength(3);
|
|
239
|
+
for (const header of headers) {
|
|
240
|
+
expect(header).toHaveAttribute('scope', 'col');
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
it('lets a consumer override scope via header html props', () => {
|
|
245
|
+
// A `<th scope="row">` maps to the `rowheader` role, so query the DOM
|
|
246
|
+
// directly to assert the attribute regardless of the resolved ARIA role.
|
|
247
|
+
const plugin: TablePlugin<User> = {
|
|
248
|
+
transformHeaderCell: (props, column) =>
|
|
249
|
+
column.key === 'name'
|
|
250
|
+
? {...props, htmlProps: {...props.htmlProps, scope: 'row'}}
|
|
251
|
+
: props,
|
|
252
|
+
};
|
|
253
|
+
const {container} = render(
|
|
254
|
+
<BaseTable data={users} columns={columns} plugins={[plugin]} />,
|
|
255
|
+
);
|
|
256
|
+
const headerCells = container.querySelectorAll('thead th');
|
|
257
|
+
// columns fixture order: name, age, email — plugin overrides name → 'row'
|
|
258
|
+
expect(headerCells[0]).toHaveAttribute('scope', 'row');
|
|
259
|
+
expect(headerCells[1]).toHaveAttribute('scope', 'col');
|
|
260
|
+
expect(headerCells[2]).toHaveAttribute('scope', 'col');
|
|
261
|
+
});
|
|
262
|
+
|
|
232
263
|
it('renders data cells', () => {
|
|
233
264
|
render(<BaseTable data={users} columns={columns} />);
|
|
234
265
|
const cells = screen.getAllByRole('cell');
|
|
@@ -617,6 +648,29 @@ describe('BaseTable', () => {
|
|
|
617
648
|
// =============================================================================
|
|
618
649
|
|
|
619
650
|
describe('Table', () => {
|
|
651
|
+
it('clears a cell when the field is removed from the row object (#3595)', () => {
|
|
652
|
+
const cols: TableColumn<Record<string, unknown>>[] = [
|
|
653
|
+
{key: 'name', header: 'Name'},
|
|
654
|
+
{key: 'status', header: 'Status'},
|
|
655
|
+
];
|
|
656
|
+
const {rerender} = render(
|
|
657
|
+
<Table
|
|
658
|
+
data={[{id: '1', name: 'Alice', status: 'active'}]}
|
|
659
|
+
columns={cols}
|
|
660
|
+
idKey="id"
|
|
661
|
+
/>,
|
|
662
|
+
);
|
|
663
|
+
expect(screen.getByText('active')).toBeInTheDocument();
|
|
664
|
+
|
|
665
|
+
// Clearing a field by omitting it (optimistic update / server response)
|
|
666
|
+
// must re-render the row — the memo previously only compared the keys of
|
|
667
|
+
// the NEW item, so the deleted field's stale value kept rendering.
|
|
668
|
+
rerender(
|
|
669
|
+
<Table data={[{id: '1', name: 'Alice'}]} columns={cols} idKey="id" />,
|
|
670
|
+
);
|
|
671
|
+
expect(screen.queryByText('active')).not.toBeInTheDocument();
|
|
672
|
+
});
|
|
673
|
+
|
|
620
674
|
it('renders a table with correct structure', () => {
|
|
621
675
|
render(<Table data={users} columns={columns} />);
|
|
622
676
|
expect(screen.getByRole('table')).toBeInTheDocument();
|
|
@@ -1232,4 +1286,37 @@ describe('emptyState', () => {
|
|
|
1232
1286
|
expect(screen.getByText('Name')).toBeInTheDocument();
|
|
1233
1287
|
expect(screen.getByText('Age')).toBeInTheDocument();
|
|
1234
1288
|
});
|
|
1289
|
+
|
|
1290
|
+
describe('table section rest forwarding', () => {
|
|
1291
|
+
it('forwards data-testid and id to the tbody, thead, and tfoot', () => {
|
|
1292
|
+
const {container} = render(
|
|
1293
|
+
<table>
|
|
1294
|
+
<TableHeader data-testid="thead" id="head-1">
|
|
1295
|
+
<tr>
|
|
1296
|
+
<th>H</th>
|
|
1297
|
+
</tr>
|
|
1298
|
+
</TableHeader>
|
|
1299
|
+
<TableBody data-testid="tbody" id="body-1">
|
|
1300
|
+
<tr>
|
|
1301
|
+
<td>B</td>
|
|
1302
|
+
</tr>
|
|
1303
|
+
</TableBody>
|
|
1304
|
+
<TableFooter data-testid="tfoot" id="foot-1">
|
|
1305
|
+
<tr>
|
|
1306
|
+
<td>F</td>
|
|
1307
|
+
</tr>
|
|
1308
|
+
</TableFooter>
|
|
1309
|
+
</table>,
|
|
1310
|
+
);
|
|
1311
|
+
const thead = container.querySelector('thead')!;
|
|
1312
|
+
const tbody = container.querySelector('tbody')!;
|
|
1313
|
+
const tfoot = container.querySelector('tfoot')!;
|
|
1314
|
+
expect(thead).toHaveAttribute('data-testid', 'thead');
|
|
1315
|
+
expect(thead).toHaveAttribute('id', 'head-1');
|
|
1316
|
+
expect(tbody).toHaveAttribute('data-testid', 'tbody');
|
|
1317
|
+
expect(tbody).toHaveAttribute('id', 'body-1');
|
|
1318
|
+
expect(tfoot).toHaveAttribute('data-testid', 'tfoot');
|
|
1319
|
+
expect(tfoot).toHaveAttribute('id', 'foot-1');
|
|
1320
|
+
});
|
|
1321
|
+
});
|
|
1235
1322
|
});
|
package/src/Table/TableBody.tsx
CHANGED
|
@@ -13,11 +13,24 @@ export interface TableBodyProps extends BaseProps<HTMLTableSectionElement> {
|
|
|
13
13
|
children: ReactNode;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
export function TableBody({
|
|
16
|
+
export function TableBody({
|
|
17
|
+
ref,
|
|
18
|
+
children,
|
|
19
|
+
xstyle,
|
|
20
|
+
className,
|
|
21
|
+
style,
|
|
22
|
+
...rest
|
|
23
|
+
}: TableBodyProps) {
|
|
17
24
|
return (
|
|
18
25
|
<tbody
|
|
19
26
|
ref={ref}
|
|
20
|
-
{...mergeProps(
|
|
27
|
+
{...mergeProps(
|
|
28
|
+
themeProps('table-body'),
|
|
29
|
+
stylex.props(xstyle),
|
|
30
|
+
className,
|
|
31
|
+
style,
|
|
32
|
+
)}
|
|
33
|
+
{...rest}>
|
|
21
34
|
{children}
|
|
22
35
|
</tbody>
|
|
23
36
|
);
|
package/src/Table/TableCell.tsx
CHANGED
|
@@ -87,6 +87,62 @@ const densityStyles = stylex.create({
|
|
|
87
87
|
},
|
|
88
88
|
});
|
|
89
89
|
|
|
90
|
+
// When a cell owns a context menu, its padding moves from the `<td>` onto the
|
|
91
|
+
// right-click trigger wrapper so the *entire* cell (padding included) opens the
|
|
92
|
+
// menu. Without this, right-clicking the padding ring near a cell edge falls
|
|
93
|
+
// through to the browser's native menu. Paired with `contextMenuCellStyles` on
|
|
94
|
+
// the `<td>` (font/box-sizing only — no padding).
|
|
95
|
+
const densityTextStyles = stylex.create({
|
|
96
|
+
compact: {
|
|
97
|
+
fontSize: typeScaleVars['--text-body-size'],
|
|
98
|
+
boxSizing: 'border-box',
|
|
99
|
+
},
|
|
100
|
+
balanced: {
|
|
101
|
+
fontSize: typeScaleVars['--text-body-size'],
|
|
102
|
+
boxSizing: 'border-box',
|
|
103
|
+
},
|
|
104
|
+
spacious: {
|
|
105
|
+
fontSize: typeScaleVars['--text-body-size'],
|
|
106
|
+
boxSizing: 'border-box',
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
const densityPaddingStyles = stylex.create({
|
|
111
|
+
compact: {
|
|
112
|
+
paddingBlock: spacingVars['--spacing-1'],
|
|
113
|
+
paddingInline: spacingVars['--spacing-2'],
|
|
114
|
+
},
|
|
115
|
+
balanced: {
|
|
116
|
+
paddingBlock: spacingVars['--spacing-2'],
|
|
117
|
+
paddingInline: spacingVars['--spacing-3'],
|
|
118
|
+
},
|
|
119
|
+
spacious: {
|
|
120
|
+
paddingBlock: spacingVars['--spacing-3'],
|
|
121
|
+
paddingInline: spacingVars['--spacing-4'],
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// The trigger wrapper fills the whole cell (a `<td>` child with height:100%
|
|
126
|
+
// stretches to the row height) so a right-click anywhere in the cell opens the
|
|
127
|
+
// menu. It carries the density padding relocated off the `<td>`.
|
|
128
|
+
const triggerFillStyles = stylex.create({
|
|
129
|
+
fill: {
|
|
130
|
+
display: 'block',
|
|
131
|
+
boxSizing: 'border-box',
|
|
132
|
+
blockSize: '100%',
|
|
133
|
+
inlineSize: '100%',
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
// `height:100%` on the `<td>` is the CSS trick that lets a block child resolve
|
|
138
|
+
// its own `height:100%` against the row height — so the trigger fills the cell
|
|
139
|
+
// vertically (top/bottom padding included) and is fully right-clickable.
|
|
140
|
+
const contextMenuCellStyles = stylex.create({
|
|
141
|
+
cell: {
|
|
142
|
+
blockSize: '100%',
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
|
|
90
146
|
const dividerRowStyles = stylex.create({
|
|
91
147
|
cell: {
|
|
92
148
|
borderBottomWidth: {
|
|
@@ -151,22 +207,45 @@ export function TableCell({
|
|
|
151
207
|
}: TableCellProps) {
|
|
152
208
|
const ctx = useTableContext();
|
|
153
209
|
|
|
154
|
-
|
|
210
|
+
const hasContextMenu =
|
|
211
|
+
typeof contextMenuActions === 'function' ||
|
|
212
|
+
(Array.isArray(contextMenuActions) && contextMenuActions.length > 0);
|
|
213
|
+
|
|
214
|
+
// When the cell owns a context menu, its density padding is relocated onto
|
|
215
|
+
// the right-click trigger wrapper (see `content` below) so the entire cell —
|
|
216
|
+
// padding included — opens the menu. Otherwise padding lives on the `<td>`.
|
|
155
217
|
const cellStyles: StyleXStyles[] = ctx
|
|
156
218
|
? [
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
219
|
+
hasContextMenu
|
|
220
|
+
? densityTextStyles[ctx.density]
|
|
221
|
+
: densityStyles[ctx.density],
|
|
222
|
+
ctx.textOverflow === 'truncate' ? overflowStyles.cell : wrapStyles.cell,
|
|
161
223
|
containerEdgeStyles[ctx.density],
|
|
162
224
|
verticalAlignStyles[ctx.verticalAlign],
|
|
163
|
-
...buildDividerStyles(
|
|
225
|
+
...buildDividerStyles(
|
|
226
|
+
ctx,
|
|
227
|
+
dividerRowStyles.cell,
|
|
228
|
+
dividerColumnStyles.cell,
|
|
229
|
+
),
|
|
230
|
+
...(hasContextMenu ? [contextMenuCellStyles.cell] : []),
|
|
164
231
|
]
|
|
165
232
|
: [];
|
|
166
233
|
|
|
167
234
|
// The cell owns the context-menu wrapper so it controls how the menu
|
|
168
|
-
// interacts with its padding / content. No-op when no actions.
|
|
169
|
-
|
|
235
|
+
// interacts with its padding / content. No-op when no actions. When actions
|
|
236
|
+
// exist we make the trigger fill the cell and carry the density padding so a
|
|
237
|
+
// right-click anywhere in the cell (including the padding ring) opens it.
|
|
238
|
+
const triggerXstyle =
|
|
239
|
+
hasContextMenu && ctx
|
|
240
|
+
? [triggerFillStyles.fill, densityPaddingStyles[ctx.density]]
|
|
241
|
+
: hasContextMenu
|
|
242
|
+
? triggerFillStyles.fill
|
|
243
|
+
: undefined;
|
|
244
|
+
const content = wrapInTableContextMenu(
|
|
245
|
+
children,
|
|
246
|
+
contextMenuActions,
|
|
247
|
+
triggerXstyle,
|
|
248
|
+
);
|
|
170
249
|
|
|
171
250
|
return (
|
|
172
251
|
<td
|
|
@@ -13,11 +13,24 @@ export interface TableFooterProps extends BaseProps<HTMLTableSectionElement> {
|
|
|
13
13
|
children: ReactNode;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
export function TableFooter({
|
|
16
|
+
export function TableFooter({
|
|
17
|
+
ref,
|
|
18
|
+
children,
|
|
19
|
+
xstyle,
|
|
20
|
+
className,
|
|
21
|
+
style,
|
|
22
|
+
...rest
|
|
23
|
+
}: TableFooterProps) {
|
|
17
24
|
return (
|
|
18
25
|
<tfoot
|
|
19
26
|
ref={ref}
|
|
20
|
-
{...mergeProps(
|
|
27
|
+
{...mergeProps(
|
|
28
|
+
themeProps('table-footer'),
|
|
29
|
+
stylex.props(xstyle),
|
|
30
|
+
className,
|
|
31
|
+
style,
|
|
32
|
+
)}
|
|
33
|
+
{...rest}>
|
|
21
34
|
{children}
|
|
22
35
|
</tfoot>
|
|
23
36
|
);
|
|
@@ -13,11 +13,24 @@ export interface TableHeaderProps extends BaseProps<HTMLTableSectionElement> {
|
|
|
13
13
|
children: ReactNode;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
export function TableHeader({
|
|
16
|
+
export function TableHeader({
|
|
17
|
+
ref,
|
|
18
|
+
children,
|
|
19
|
+
xstyle,
|
|
20
|
+
className,
|
|
21
|
+
style,
|
|
22
|
+
...rest
|
|
23
|
+
}: TableHeaderProps) {
|
|
17
24
|
return (
|
|
18
25
|
<thead
|
|
19
26
|
ref={ref}
|
|
20
|
-
{...mergeProps(
|
|
27
|
+
{...mergeProps(
|
|
28
|
+
themeProps('table-header'),
|
|
29
|
+
stylex.props(xstyle),
|
|
30
|
+
className,
|
|
31
|
+
style,
|
|
32
|
+
)}
|
|
33
|
+
{...rest}>
|
|
21
34
|
{children}
|
|
22
35
|
</thead>
|
|
23
36
|
);
|
package/src/Table/index.ts
CHANGED
|
@@ -26,6 +26,10 @@ export {useTableColumnSettings} from './plugins/columnSettings';
|
|
|
26
26
|
export {useTableColumnSettingsState} from './plugins/columnSettings';
|
|
27
27
|
export {useTableColumnResize} from './plugins/columnResize';
|
|
28
28
|
export {useTableStickyColumns} from './plugins/stickyColumns';
|
|
29
|
+
export {
|
|
30
|
+
useTableRowExpansion,
|
|
31
|
+
useTableRowExpansionState,
|
|
32
|
+
} from './plugins/rowExpansion';
|
|
29
33
|
export {resolveContextActions} from './tableContextMenu';
|
|
30
34
|
export {
|
|
31
35
|
useTableFiltering,
|
|
@@ -97,6 +101,7 @@ export type {
|
|
|
97
101
|
} from './plugins/columnSettings';
|
|
98
102
|
export type {UseTableColumnResizeConfig} from './plugins/columnResize';
|
|
99
103
|
export type {UseTableStickyColumnsConfig} from './plugins/stickyColumns';
|
|
104
|
+
export type {UseTableRowExpansionConfig} from './plugins/rowExpansion';
|
|
100
105
|
export type {
|
|
101
106
|
UseTableFilteringConfig,
|
|
102
107
|
TableFilterState,
|
|
@@ -551,6 +551,19 @@ describe('useTableColumnResize', () => {
|
|
|
551
551
|
expect(handle).toHaveAttribute('aria-valuenow', '200');
|
|
552
552
|
});
|
|
553
553
|
|
|
554
|
+
it('handle has a numeric aria-valuenow on initial render (before any width is measured)', () => {
|
|
555
|
+
// A focusable role="separator" requires aria-valuenow per the ARIA spec.
|
|
556
|
+
// Before the column width has been measured there is no override width, so
|
|
557
|
+
// the handle must fall back to a defined numeric value (the column
|
|
558
|
+
// minWidth) rather than omitting the attribute.
|
|
559
|
+
render(<ResizeTable minWidth={80} />);
|
|
560
|
+
const handle = getResizeHandles()[0];
|
|
561
|
+
const valueNow = handle.getAttribute('aria-valuenow');
|
|
562
|
+
expect(valueNow).not.toBeNull();
|
|
563
|
+
expect(Number.isNaN(Number(valueNow))).toBe(false);
|
|
564
|
+
expect(valueNow).toBe('80');
|
|
565
|
+
});
|
|
566
|
+
|
|
554
567
|
it('handle has aria-label with column header text', () => {
|
|
555
568
|
render(<ResizeTable />);
|
|
556
569
|
const handle = getResizeHandles()[0];
|
|
@@ -676,7 +676,9 @@ function ResizeHandle({
|
|
|
676
676
|
<div
|
|
677
677
|
role="separator"
|
|
678
678
|
aria-orientation="vertical"
|
|
679
|
-
aria-valuenow
|
|
679
|
+
// A focusable role="separator" requires a numeric aria-valuenow, so fall
|
|
680
|
+
// back to the column's minWidth before the width has been measured.
|
|
681
|
+
aria-valuenow={currentWidth ?? minWidth}
|
|
680
682
|
aria-valuemin={minWidth}
|
|
681
683
|
aria-valuemax={maxWidth === Infinity ? undefined : maxWidth}
|
|
682
684
|
aria-label={ariaLabel}
|
|
@@ -38,6 +38,10 @@ export function paginateData<T>(
|
|
|
38
38
|
const size = Number.isFinite(pageSize)
|
|
39
39
|
? Math.max(1, Math.floor(pageSize))
|
|
40
40
|
: 10;
|
|
41
|
-
|
|
41
|
+
// page needs the same coercion: a negative start index makes Array.slice
|
|
42
|
+
// count from the END of the data (page -1 returns the tail dressed up as a
|
|
43
|
+
// page), and a fractional page returns a slice straddling two pages.
|
|
44
|
+
const p = Number.isFinite(page) ? Math.max(1, Math.floor(page)) : 1;
|
|
45
|
+
const start = (p - 1) * size;
|
|
42
46
|
return data.slice(start, start + size);
|
|
43
47
|
}
|
|
@@ -132,6 +132,19 @@ describe('paginateData', () => {
|
|
|
132
132
|
expect(paginateData([], 1, 10)).toEqual([]);
|
|
133
133
|
});
|
|
134
134
|
|
|
135
|
+
it('clamps invalid page numbers to the first page (#3593)', () => {
|
|
136
|
+
const data = generateItems(30);
|
|
137
|
+
// Negative pages previously fed a negative index to Array.slice, which
|
|
138
|
+
// counts from the END of the data — the tail dressed up as a page.
|
|
139
|
+
expect(paginateData(data, -1, 10)[0].id).toBe('1');
|
|
140
|
+
expect(paginateData(data, 0, 10)[0].id).toBe('1');
|
|
141
|
+
expect(paginateData(data, NaN, 10)[0].id).toBe('1');
|
|
142
|
+
// Fractional pages floor to the containing page instead of straddling two.
|
|
143
|
+
expect(paginateData(data, 1.5, 10).map(i => i.id)).toEqual(
|
|
144
|
+
paginateData(data, 1, 10).map(i => i.id),
|
|
145
|
+
);
|
|
146
|
+
});
|
|
147
|
+
|
|
135
148
|
it('returns empty array when page exceeds data', () => {
|
|
136
149
|
const data = generateItems(10);
|
|
137
150
|
expect(paginateData(data, 5, 10)).toEqual([]);
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {describe, it, expect, vi, beforeEach} from 'vitest';
|
|
4
|
+
import {render, screen, fireEvent} from '@testing-library/react';
|
|
5
|
+
import {useState} from 'react';
|
|
6
|
+
import {Table} from '../../Table';
|
|
7
|
+
import type {TableColumn} from '../../types';
|
|
8
|
+
import {
|
|
9
|
+
useTableRowExpansion,
|
|
10
|
+
useTableRowExpansionState,
|
|
11
|
+
} from './useTableRowExpansion';
|
|
12
|
+
|
|
13
|
+
// popover mock for context-menu tests
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
HTMLElement.prototype.showPopover = vi.fn(function (this: HTMLElement) {
|
|
16
|
+
this.setAttribute('popover-open', '');
|
|
17
|
+
const event = new Event('toggle', {bubbles: false});
|
|
18
|
+
Object.defineProperty(event, 'newState', {value: 'open'});
|
|
19
|
+
this.dispatchEvent(event);
|
|
20
|
+
});
|
|
21
|
+
HTMLElement.prototype.hidePopover = vi.fn(function (this: HTMLElement) {
|
|
22
|
+
this.removeAttribute('popover-open');
|
|
23
|
+
const event = new Event('toggle', {bubbles: false});
|
|
24
|
+
Object.defineProperty(event, 'newState', {value: 'closed'});
|
|
25
|
+
this.dispatchEvent(event);
|
|
26
|
+
});
|
|
27
|
+
const originalMatches = HTMLElement.prototype.matches;
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
29
|
+
(HTMLElement.prototype as any).matches = function (
|
|
30
|
+
selector: string,
|
|
31
|
+
): boolean {
|
|
32
|
+
if (selector === ':popover-open') {
|
|
33
|
+
return this.hasAttribute('popover-open');
|
|
34
|
+
}
|
|
35
|
+
return originalMatches.call(this, selector);
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
interface TreeItem extends Record<string, unknown> {
|
|
40
|
+
id: string;
|
|
41
|
+
name: string;
|
|
42
|
+
children: TreeItem[];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const treeData: TreeItem[] = [
|
|
46
|
+
{
|
|
47
|
+
id: 'a',
|
|
48
|
+
name: 'Folder A',
|
|
49
|
+
children: [
|
|
50
|
+
{id: 'a1', name: 'File A1', children: []},
|
|
51
|
+
{id: 'a2', name: 'File A2', children: []},
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: 'b',
|
|
56
|
+
name: 'Folder B',
|
|
57
|
+
children: [{id: 'b1', name: 'File B1', children: []}],
|
|
58
|
+
},
|
|
59
|
+
{id: 'c', name: 'Leaf C', children: []},
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
const columns: TableColumn<TreeItem>[] = [{key: 'name', header: 'Name'}];
|
|
63
|
+
|
|
64
|
+
const EMPTY_KEYS = new Set<string>();
|
|
65
|
+
|
|
66
|
+
function Harness({
|
|
67
|
+
initialExpanded = EMPTY_KEYS,
|
|
68
|
+
}: {
|
|
69
|
+
initialExpanded?: Set<string>;
|
|
70
|
+
}) {
|
|
71
|
+
const [expandedKeys, setExpandedKeys] = useState(initialExpanded);
|
|
72
|
+
const {data, expansionConfig} = useTableRowExpansionState<TreeItem>({
|
|
73
|
+
baseData: treeData,
|
|
74
|
+
getChildren: item => item.children,
|
|
75
|
+
getRowKey: item => item.id,
|
|
76
|
+
expandedKeys,
|
|
77
|
+
setExpandedKeys,
|
|
78
|
+
});
|
|
79
|
+
const expansion = useTableRowExpansion(expansionConfig);
|
|
80
|
+
return (
|
|
81
|
+
<Table data={data} columns={columns} idKey="id" plugins={{expansion}} />
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
describe('useTableRowExpansion', () => {
|
|
86
|
+
it('renders a chevron button for expandable rows', () => {
|
|
87
|
+
render(<Harness />);
|
|
88
|
+
const buttons = screen.getAllByRole('button', {name: /expand row/i});
|
|
89
|
+
// Folder A and Folder B are expandable (top-level with children)
|
|
90
|
+
expect(buttons.length).toBe(2);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('shows child rows when expanded', () => {
|
|
94
|
+
render(<Harness initialExpanded={new Set(['a'])} />);
|
|
95
|
+
expect(screen.getByText('File A1')).toBeInTheDocument();
|
|
96
|
+
expect(screen.getByText('File A2')).toBeInTheDocument();
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('hides child rows when collapsed', () => {
|
|
100
|
+
render(<Harness />);
|
|
101
|
+
expect(screen.queryByText('File A1')).not.toBeInTheDocument();
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('toggles expansion on chevron click', () => {
|
|
105
|
+
render(<Harness />);
|
|
106
|
+
expect(screen.queryByText('File A1')).not.toBeInTheDocument();
|
|
107
|
+
fireEvent.click(screen.getAllByRole('button', {name: /expand row/i})[0]);
|
|
108
|
+
expect(screen.getByText('File A1')).toBeInTheDocument();
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('contributes a context-menu action on expandable rows', () => {
|
|
112
|
+
render(<Harness />);
|
|
113
|
+
fireEvent.contextMenu(screen.getByText('Folder A'));
|
|
114
|
+
const items = screen.getAllByRole('menuitem', {
|
|
115
|
+
name: /expand row/i,
|
|
116
|
+
hidden: true,
|
|
117
|
+
});
|
|
118
|
+
expect(items.length).toBeGreaterThan(0);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('does not show chevron for leaf nodes', () => {
|
|
122
|
+
render(<Harness />);
|
|
123
|
+
// Leaf C has no children
|
|
124
|
+
expect(screen.getByText('Leaf C')).toBeInTheDocument();
|
|
125
|
+
// only 2 expand buttons (Folder A, Folder B), not 3
|
|
126
|
+
expect(
|
|
127
|
+
screen.getAllByRole('button', {name: /expand row|collapse row/i}).length,
|
|
128
|
+
).toBe(2);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('renders an expand-all toggle in the header', () => {
|
|
132
|
+
render(<Harness />);
|
|
133
|
+
expect(
|
|
134
|
+
screen.getByRole('button', {name: /expand all rows/i}),
|
|
135
|
+
).toBeInTheDocument();
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it('expand-all toggle expands every expandable row', () => {
|
|
139
|
+
render(<Harness />);
|
|
140
|
+
expect(screen.queryByText('File A1')).not.toBeInTheDocument();
|
|
141
|
+
fireEvent.click(screen.getByRole('button', {name: /expand all rows/i}));
|
|
142
|
+
// Both folders' children become visible.
|
|
143
|
+
expect(screen.getByText('File A1')).toBeInTheDocument();
|
|
144
|
+
expect(screen.getByText('File A2')).toBeInTheDocument();
|
|
145
|
+
expect(screen.getByText('File B1')).toBeInTheDocument();
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it('collapse-all toggle collapses every row', () => {
|
|
149
|
+
render(<Harness initialExpanded={new Set(['a', 'b'])} />);
|
|
150
|
+
expect(screen.getByText('File A1')).toBeInTheDocument();
|
|
151
|
+
fireEvent.click(screen.getByRole('button', {name: /collapse all rows/i}));
|
|
152
|
+
expect(screen.queryByText('File A1')).not.toBeInTheDocument();
|
|
153
|
+
expect(screen.queryByText('File B1')).not.toBeInTheDocument();
|
|
154
|
+
});
|
|
155
|
+
});
|