@astryxdesign/core 0.1.4 → 0.1.5-canary.76e6697
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 +141 -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.d.ts +0 -2
- package/dist/AlertDialog/useImperativeAlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/useImperativeAlertDialog.js +3 -5
- 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.d.ts +48 -10
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +33 -12
- package/dist/AspectRatio/index.d.ts +1 -1
- package/dist/AspectRatio/index.d.ts.map +1 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +28 -26
- package/dist/Avatar/AvatarStatusDot.js +6 -6
- package/dist/AvatarGroup/AvatarGroup.js +6 -6
- package/dist/AvatarGroup/AvatarGroupOverflow.js +7 -7
- 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.js +19 -19
- package/dist/ButtonGroup/ButtonGroup.js +7 -7
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +68 -48
- package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
- 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 +24 -21
- 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 +1 -1
- 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.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +15 -15
- package/dist/CheckboxInput/CheckboxInput.d.ts +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +25 -23
- 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.js +3 -3
- 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/Collapsible/Collapsible.d.ts +9 -3
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +109 -22
- package/dist/Collapsible/CollapsibleGroup.d.ts +37 -7
- package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroup.js +64 -12
- package/dist/Collapsible/CollapsibleGroupContext.d.ts +24 -0
- package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroupContext.js +26 -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.js +3 -3
- 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 +7 -2
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +76 -43
- package/dist/DateInput/DateInput.js +18 -18
- package/dist/DateRangeInput/DateRangeInput.js +21 -21
- package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
- 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.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.d.ts +5 -1
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- 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.d.ts +29 -2
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +44 -31
- 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.d.ts +0 -1
- package/dist/Lightbox/useLightbox.d.ts.map +1 -1
- package/dist/Lightbox/useLightbox.js +3 -4
- package/dist/Link/Link.d.ts +0 -2
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +15 -17
- 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/MetadataList/MetadataList.js +10 -10
- package/dist/MetadataList/MetadataListItem.js +15 -15
- package/dist/MobileNav/MobileNav.d.ts +1 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +26 -23
- package/dist/MobileNav/MobileNavToggle.js +5 -5
- package/dist/MoreMenu/MoreMenu.js +3 -3
- package/dist/MultiSelector/MultiSelector.js +56 -56
- 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.d.ts +0 -3
- package/dist/Overlay/useOverlay.d.ts.map +1 -1
- package/dist/Overlay/useOverlay.js +3 -6
- 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.js +7 -7
- package/dist/RadioList/RadioListItem.d.ts +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +24 -21
- 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.js +46 -46
- 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.js +23 -23
- package/dist/Spinner/Spinner.js +9 -9
- package/dist/StatusDot/StatusDot.js +5 -5
- package/dist/Switch/Switch.d.ts +8 -4
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +34 -29
- 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 +50 -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.js +3 -3
- 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/groupedRows/index.d.ts +3 -0
- package/dist/Table/plugins/groupedRows/index.d.ts.map +1 -0
- package/dist/Table/plugins/groupedRows/index.js +3 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +78 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +250 -0
- 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/useTableRowExpansion.d.ts +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +23 -23
- 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.js +9 -9
- package/dist/Text/Text.js +10 -10
- 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.d.ts.map +1 -1
- package/dist/Toast/useToast.js +44 -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.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +36 -34
- package/dist/Toolbar/Toolbar.js +18 -18
- package/dist/Tooltip/Tooltip.js +11 -11
- package/dist/Tooltip/useTooltip.d.ts +5 -1
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- 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/VisuallyHidden/VisuallyHidden.d.ts +0 -3
- package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
- package/dist/VisuallyHidden/VisuallyHidden.js +0 -3
- package/dist/astryx.css +7 -0
- package/dist/astryx.umd.js +63 -63
- package/dist/astryx.umd.js.map +4 -4
- package/dist/docs-types.d.ts +8 -2
- 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/theme/useTheme.d.ts +3 -2
- package/dist/theme/useTheme.d.ts.map +1 -1
- package/dist/theme/useTheme.js +73 -6
- 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 +4 -4
- package/src/AlertDialog/AlertDialog.doc.mjs +4 -0
- package/src/AlertDialog/AlertDialog.tsx +2 -0
- package/src/AlertDialog/useImperativeAlertDialog.tsx +0 -2
- package/src/AppShell/AppShell.tsx +2 -0
- package/src/AspectRatio/AspectRatio.doc.mjs +28 -1
- package/src/AspectRatio/AspectRatio.test.tsx +142 -1
- package/src/AspectRatio/AspectRatio.tsx +70 -10
- package/src/AspectRatio/index.ts +5 -1
- package/src/Avatar/Avatar.doc.mjs +11 -0
- package/src/Avatar/Avatar.test.tsx +32 -1
- package/src/Avatar/Avatar.tsx +14 -22
- package/src/Avatar/AvatarStatusDot.tsx +2 -2
- package/src/AvatarGroup/AvatarGroup.doc.mjs +1 -0
- package/src/AvatarGroup/AvatarGroup.tsx +2 -2
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -2
- 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/Calendar/Calendar.doc.mjs +1 -1
- package/src/Calendar/Calendar.test.tsx +122 -17
- package/src/Calendar/Calendar.tsx +26 -5
- package/src/Calendar/dayCellUtils.ts +3 -1
- 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 +4 -2
- package/src/Chat/Chat.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.test.tsx +27 -1
- package/src/Chat/ChatComposerInput.tsx +20 -15
- 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/useTriggerMenu.tsx +1 -4
- package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -3
- package/src/CheckboxInput/CheckboxInput.test.tsx +71 -4
- package/src/CheckboxInput/CheckboxInput.tsx +2 -0
- 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/CodeBlock/CodeBlock.doc.mjs +7 -2
- package/src/CodeBlock/CodeBlock.test.tsx +122 -3
- package/src/CodeBlock/CodeBlock.tsx +62 -4
- package/src/Collapsible/Collapsible.doc.mjs +8 -4
- package/src/Collapsible/Collapsible.test.tsx +403 -0
- package/src/Collapsible/Collapsible.tsx +85 -10
- package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
- package/src/Collapsible/CollapsibleGroup.test.tsx +314 -0
- package/src/Collapsible/CollapsibleGroup.tsx +97 -9
- package/src/Collapsible/CollapsibleGroupContext.tsx +34 -2
- package/src/Collapsible/index.ts +1 -0
- package/src/Collapsible/useCollapsible.ts +20 -6
- package/src/CommandPalette/CommandPalette.doc.mjs +5 -0
- package/src/CommandPalette/CommandPalette.tsx +5 -3
- package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
- 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 +87 -0
- package/src/ContextMenu/ContextMenu.tsx +87 -28
- package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
- package/src/DateInput/DateInput.test.tsx +11 -20
- package/src/DateRangeInput/DateRangeInput.doc.mjs +9 -6
- package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
- package/src/DateTimeInput/DateTimeInput.doc.mjs +3 -2
- package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
- package/src/DateTimeInput/DateTimeInput.tsx +8 -2
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/Dialog.doc.mjs +4 -0
- package/src/Dialog/DialogHeader.doc.mjs +45 -0
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenu.test.tsx +22 -2
- package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
- package/src/EmptyState/EmptyState.doc.mjs +1 -1
- package/src/Field/Field.test.tsx +1 -4
- package/src/Field/FieldLabel.test.tsx +2 -2
- package/src/FieldStatus/FieldStatus.test.tsx +282 -0
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
- package/src/Grid/Grid.test.tsx +43 -18
- package/src/Grid/Grid.tsx +26 -9
- package/src/HoverCard/HoverCard.doc.mjs +6 -6
- package/src/HoverCard/useHoverCard.doc.mjs +5 -5
- package/src/HoverCard/useHoverCard.tsx +9 -2
- package/src/Icon/Icon.test.tsx +41 -29
- package/src/Icon/Icon.tsx +6 -2
- package/src/InputGroup/InputGroup.doc.mjs +1 -0
- package/src/InputGroup/InputGroup.tsx +2 -2
- package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
- package/src/Item/Item.tsx +1 -1
- package/src/Layer/useLayer.doc.mjs +2 -2
- package/src/Layer/useLayer.test.tsx +221 -2
- package/src/Layer/useLayer.tsx +69 -30
- 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/Lightbox/Lightbox.doc.mjs +5 -0
- package/src/Lightbox/Lightbox.test.tsx +123 -2
- package/src/Lightbox/Lightbox.tsx +29 -1
- package/src/Lightbox/useLightbox.tsx +0 -1
- package/src/Link/Link.tsx +0 -2
- package/src/Markdown/Markdown.tsx +9 -7
- package/src/Markdown/parser.perf.test.ts +34 -12
- package/src/MobileNav/MobileNav.test.tsx +56 -0
- package/src/MobileNav/MobileNav.tsx +13 -8
- 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/Outline.doc.mjs +2 -0
- 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/Overlay/useOverlay.tsx +0 -3
- package/src/Pagination/Pagination.test.tsx +162 -0
- package/src/Pagination/Pagination.tsx +80 -26
- package/src/Popover/Popover.doc.mjs +6 -6
- package/src/Popover/Popover.test.tsx +65 -0
- package/src/Popover/usePopover.doc.mjs +1 -1
- package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
- package/src/PowerSearch/PowerSearch.test.tsx +109 -1
- package/src/PowerSearch/PowerSearch.tsx +37 -16
- package/src/ProgressBar/ProgressBar.doc.mjs +2 -0
- package/src/ProgressBar/ProgressBar.test.tsx +30 -0
- package/src/ProgressBar/ProgressBar.tsx +12 -5
- package/src/RadioList/RadioList.test.tsx +19 -0
- package/src/RadioList/RadioListItem.tsx +9 -4
- package/src/Resizable/ResizeHandle.test.tsx +218 -0
- package/src/Resizable/ResizeHandle.tsx +22 -4
- package/src/SegmentedControl/SegmentedControl.doc.mjs +1 -1
- 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.test.tsx +27 -1
- 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/Switch/Switch.doc.mjs +7 -7
- package/src/Switch/Switch.test.tsx +102 -3
- package/src/Switch/Switch.tsx +20 -7
- package/src/TabList/TabList.test.tsx +185 -1
- package/src/TabList/TabMenu.tsx +45 -9
- package/src/Table/BaseTable.tsx +13 -2
- package/src/Table/Table.doc.mjs +6 -1
- package/src/Table/Table.test.tsx +87 -0
- package/src/Table/TableBody.tsx +15 -2
- 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/groupedRows/index.ts +7 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +231 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +349 -0
- package/src/Table/plugins/pagination/paginateData.ts +5 -1
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +1 -1
- 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/useTableGroupedRows.doc.mjs +71 -0
- package/src/TextArea/TextArea.test.tsx +3 -3
- 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.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/Toast/useToast.test.tsx +258 -0
- package/src/Toast/useToast.tsx +41 -0
- package/src/ToggleButton/ToggleButton.doc.mjs +1 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.test.tsx +54 -0
- package/src/Tokenizer/Tokenizer.tsx +5 -4
- package/src/Tooltip/Tooltip.doc.mjs +6 -6
- package/src/Tooltip/useTooltip.doc.mjs +5 -5
- package/src/Tooltip/useTooltip.tsx +12 -2
- package/src/TopNav/TopNav.doc.mjs +1 -1
- package/src/TopNav/TopNav.test.tsx +23 -7
- 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 +1 -1
- package/src/Typeahead/Typeahead.test.tsx +45 -1
- package/src/VisuallyHidden/VisuallyHidden.tsx +0 -3
- 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 +9 -1
- 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/useStreamingText.test.ts +54 -19
- package/src/hooks/useStreamingText.ts +16 -5
- package/src/hooks/useTreeFocus.test.tsx +1 -3
- package/src/reset.css +29 -0
- 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/themingTargets.test.ts +353 -0
- package/src/theme/tokens.test.ts +182 -9
- package/src/theme/tokens.ts +239 -4
- package/src/theme/useTheme.test.tsx +126 -2
- package/src/theme/useTheme.ts +87 -6
- 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/dist/Carousel/carousel.markers.stylex.d.ts +0 -7
- package/dist/Carousel/carousel.markers.stylex.d.ts.map +0 -1
- package/dist/Carousel/carousel.markers.stylex.js +0 -12
- package/src/Carousel/carousel.markers.stylex.ts +0 -10
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Collapsible.test.tsx
|
|
5
|
+
* @input Uses vitest, @testing-library/react, Collapsible + CollapsibleGroup
|
|
6
|
+
* @output Characterization coverage for Collapsible behavior
|
|
7
|
+
* @position Testing; validates Collapsible.tsx (disclosure primitive)
|
|
8
|
+
*
|
|
9
|
+
* SYNC: When Collapsible.tsx changes, update tests to match new behavior
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import {describe, it, expect, vi} from 'vitest';
|
|
13
|
+
import {render, screen, within} from '@testing-library/react';
|
|
14
|
+
import userEvent from '@testing-library/user-event';
|
|
15
|
+
import {Collapsible} from './Collapsible';
|
|
16
|
+
import {CollapsibleGroup} from './CollapsibleGroup';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Resolves the content region a trigger controls via aria-controls, so tests
|
|
20
|
+
* assert the real disclosure linkage rather than guessing at DOM structure.
|
|
21
|
+
*/
|
|
22
|
+
function contentFor(trigger: HTMLElement): HTMLElement {
|
|
23
|
+
const id = trigger.getAttribute('aria-controls');
|
|
24
|
+
expect(id).toBeTruthy();
|
|
25
|
+
const el = document.getElementById(id as string);
|
|
26
|
+
expect(el).not.toBeNull();
|
|
27
|
+
return el as HTMLElement;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
describe('Collapsible', () => {
|
|
31
|
+
describe('structure and rendering', () => {
|
|
32
|
+
it('renders the trigger content inside a button', () => {
|
|
33
|
+
render(
|
|
34
|
+
<Collapsible trigger="Details">
|
|
35
|
+
<p>Body</p>
|
|
36
|
+
</Collapsible>,
|
|
37
|
+
);
|
|
38
|
+
const button = screen.getByRole('button');
|
|
39
|
+
expect(button).toHaveTextContent('Details');
|
|
40
|
+
expect(button.tagName).toBe('BUTTON');
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('renders the trigger button with an explicit type="button"', () => {
|
|
44
|
+
// Prevents implicit form submission when used inside a <form>.
|
|
45
|
+
render(<Collapsible trigger="T">c</Collapsible>);
|
|
46
|
+
expect(screen.getByRole('button')).toHaveAttribute('type', 'button');
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('renders children inside the controlled content region', () => {
|
|
50
|
+
render(
|
|
51
|
+
<Collapsible trigger="Section">
|
|
52
|
+
<span data-testid="child">Hello</span>
|
|
53
|
+
</Collapsible>,
|
|
54
|
+
);
|
|
55
|
+
const content = contentFor(screen.getByRole('button'));
|
|
56
|
+
expect(within(content).getByTestId('child')).toBeInTheDocument();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('links the trigger to its content via aria-controls', () => {
|
|
60
|
+
render(<Collapsible trigger="T">Body</Collapsible>);
|
|
61
|
+
const button = screen.getByRole('button');
|
|
62
|
+
const content = contentFor(button);
|
|
63
|
+
expect(button.getAttribute('aria-controls')).toBe(content.id);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('renders the stable astryx-collapsible class on the root', () => {
|
|
67
|
+
render(
|
|
68
|
+
<Collapsible trigger="T" data-testid="root">
|
|
69
|
+
c
|
|
70
|
+
</Collapsible>,
|
|
71
|
+
);
|
|
72
|
+
expect(screen.getByTestId('root')).toHaveClass('astryx-collapsible');
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('renders a ReactNode trigger, not just a string', () => {
|
|
76
|
+
render(
|
|
77
|
+
<Collapsible trigger={<span data-testid="rich">Rich</span>}>
|
|
78
|
+
c
|
|
79
|
+
</Collapsible>,
|
|
80
|
+
);
|
|
81
|
+
expect(screen.getByTestId('rich')).toBeInTheDocument();
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
describe('uncontrolled open state', () => {
|
|
86
|
+
it('is open by default (aria-expanded="true")', () => {
|
|
87
|
+
render(<Collapsible trigger="T">Body</Collapsible>);
|
|
88
|
+
expect(screen.getByRole('button')).toHaveAttribute(
|
|
89
|
+
'aria-expanded',
|
|
90
|
+
'true',
|
|
91
|
+
);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('honors defaultIsOpen={false} (starts collapsed)', () => {
|
|
95
|
+
render(
|
|
96
|
+
<Collapsible trigger="T" defaultIsOpen={false}>
|
|
97
|
+
Body
|
|
98
|
+
</Collapsible>,
|
|
99
|
+
);
|
|
100
|
+
expect(screen.getByRole('button')).toHaveAttribute(
|
|
101
|
+
'aria-expanded',
|
|
102
|
+
'false',
|
|
103
|
+
);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('toggles open/closed when the trigger is clicked', async () => {
|
|
107
|
+
const user = userEvent.setup();
|
|
108
|
+
render(<Collapsible trigger="T">Body</Collapsible>);
|
|
109
|
+
const button = screen.getByRole('button');
|
|
110
|
+
|
|
111
|
+
expect(button).toHaveAttribute('aria-expanded', 'true');
|
|
112
|
+
await user.click(button);
|
|
113
|
+
expect(button).toHaveAttribute('aria-expanded', 'false');
|
|
114
|
+
await user.click(button);
|
|
115
|
+
expect(button).toHaveAttribute('aria-expanded', 'true');
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('opens a default-collapsed instance on click', async () => {
|
|
119
|
+
const user = userEvent.setup();
|
|
120
|
+
render(
|
|
121
|
+
<Collapsible trigger="T" defaultIsOpen={false}>
|
|
122
|
+
Body
|
|
123
|
+
</Collapsible>,
|
|
124
|
+
);
|
|
125
|
+
const button = screen.getByRole('button');
|
|
126
|
+
await user.click(button);
|
|
127
|
+
expect(button).toHaveAttribute('aria-expanded', 'true');
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('toggles via keyboard activation (Enter and Space)', async () => {
|
|
131
|
+
const user = userEvent.setup();
|
|
132
|
+
render(<Collapsible trigger="T">Body</Collapsible>);
|
|
133
|
+
const button = screen.getByRole('button');
|
|
134
|
+
|
|
135
|
+
button.focus();
|
|
136
|
+
expect(button).toHaveFocus();
|
|
137
|
+
|
|
138
|
+
await user.keyboard('{Enter}');
|
|
139
|
+
expect(button).toHaveAttribute('aria-expanded', 'false');
|
|
140
|
+
await user.keyboard(' ');
|
|
141
|
+
expect(button).toHaveAttribute('aria-expanded', 'true');
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('hides the content region (display:none) only when collapsed', async () => {
|
|
145
|
+
const user = userEvent.setup();
|
|
146
|
+
render(<Collapsible trigger="T">Body</Collapsible>);
|
|
147
|
+
const button = screen.getByRole('button');
|
|
148
|
+
const content = contentFor(button);
|
|
149
|
+
|
|
150
|
+
// Open: not display:none.
|
|
151
|
+
expect(content).not.toHaveStyle({display: 'none'});
|
|
152
|
+
await user.click(button);
|
|
153
|
+
// Collapsed: hidden via the contentHidden style.
|
|
154
|
+
expect(content).toHaveStyle({display: 'none'});
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it('rotates the chevron indicator between open and closed states', async () => {
|
|
158
|
+
const user = userEvent.setup();
|
|
159
|
+
render(<Collapsible trigger="T">Body</Collapsible>);
|
|
160
|
+
const button = screen.getByRole('button');
|
|
161
|
+
// The chevron lives in the last span of the trigger button.
|
|
162
|
+
const chevron = button.querySelectorAll('span')[1];
|
|
163
|
+
const openClass = chevron.getAttribute('class');
|
|
164
|
+
|
|
165
|
+
await user.click(button);
|
|
166
|
+
const closedClass = chevron.getAttribute('class');
|
|
167
|
+
expect(closedClass).not.toEqual(openClass);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
describe('controlled open state', () => {
|
|
172
|
+
it('reflects the isOpen prop', () => {
|
|
173
|
+
const {rerender} = render(
|
|
174
|
+
<Collapsible trigger="T" isOpen={false}>
|
|
175
|
+
Body
|
|
176
|
+
</Collapsible>,
|
|
177
|
+
);
|
|
178
|
+
expect(screen.getByRole('button')).toHaveAttribute(
|
|
179
|
+
'aria-expanded',
|
|
180
|
+
'false',
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
rerender(
|
|
184
|
+
<Collapsible trigger="T" isOpen={true}>
|
|
185
|
+
Body
|
|
186
|
+
</Collapsible>,
|
|
187
|
+
);
|
|
188
|
+
expect(screen.getByRole('button')).toHaveAttribute(
|
|
189
|
+
'aria-expanded',
|
|
190
|
+
'true',
|
|
191
|
+
);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
it('calls onOpenChange with the negated state on click', async () => {
|
|
195
|
+
const user = userEvent.setup();
|
|
196
|
+
const onOpenChange = vi.fn();
|
|
197
|
+
render(
|
|
198
|
+
<Collapsible trigger="T" isOpen={false} onOpenChange={onOpenChange}>
|
|
199
|
+
Body
|
|
200
|
+
</Collapsible>,
|
|
201
|
+
);
|
|
202
|
+
await user.click(screen.getByRole('button'));
|
|
203
|
+
expect(onOpenChange).toHaveBeenCalledTimes(1);
|
|
204
|
+
expect(onOpenChange).toHaveBeenCalledWith(true);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it('does not self-update when controlled without onOpenChange', async () => {
|
|
208
|
+
// A controlled instance is driven entirely by the isOpen prop; a click
|
|
209
|
+
// must not flip the visual state on its own.
|
|
210
|
+
const user = userEvent.setup();
|
|
211
|
+
render(
|
|
212
|
+
<Collapsible trigger="T" isOpen={false}>
|
|
213
|
+
Body
|
|
214
|
+
</Collapsible>,
|
|
215
|
+
);
|
|
216
|
+
const button = screen.getByRole('button');
|
|
217
|
+
await user.click(button);
|
|
218
|
+
expect(button).toHaveAttribute('aria-expanded', 'false');
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
it('stays put until the parent updates isOpen', async () => {
|
|
222
|
+
const user = userEvent.setup();
|
|
223
|
+
const onOpenChange = vi.fn();
|
|
224
|
+
const {rerender} = render(
|
|
225
|
+
<Collapsible trigger="T" isOpen={false} onOpenChange={onOpenChange}>
|
|
226
|
+
Body
|
|
227
|
+
</Collapsible>,
|
|
228
|
+
);
|
|
229
|
+
const button = screen.getByRole('button');
|
|
230
|
+
await user.click(button);
|
|
231
|
+
// Still closed — parent hasn't re-rendered with the new value yet.
|
|
232
|
+
expect(button).toHaveAttribute('aria-expanded', 'false');
|
|
233
|
+
|
|
234
|
+
rerender(
|
|
235
|
+
<Collapsible trigger="T" isOpen={true} onOpenChange={onOpenChange}>
|
|
236
|
+
Body
|
|
237
|
+
</Collapsible>,
|
|
238
|
+
);
|
|
239
|
+
expect(button).toHaveAttribute('aria-expanded', 'true');
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
describe('prop forwarding', () => {
|
|
244
|
+
it('forwards a ref to the root element', () => {
|
|
245
|
+
const ref = vi.fn();
|
|
246
|
+
render(
|
|
247
|
+
<Collapsible ref={ref} trigger="T">
|
|
248
|
+
c
|
|
249
|
+
</Collapsible>,
|
|
250
|
+
);
|
|
251
|
+
expect(ref).toHaveBeenCalledWith(expect.any(HTMLDivElement));
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
it('passes through data-testid and other DOM props to the root', () => {
|
|
255
|
+
render(
|
|
256
|
+
<Collapsible trigger="T" data-testid="root" data-custom="x">
|
|
257
|
+
c
|
|
258
|
+
</Collapsible>,
|
|
259
|
+
);
|
|
260
|
+
const root = screen.getByTestId('root');
|
|
261
|
+
expect(root).toHaveAttribute('data-custom', 'x');
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it('exposes a displayName for devtools', () => {
|
|
265
|
+
expect(Collapsible.displayName).toBe('Collapsible');
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
describe('inside CollapsibleGroup (single mode)', () => {
|
|
270
|
+
it('opens the item matching defaultValue and closes the rest', () => {
|
|
271
|
+
render(
|
|
272
|
+
<CollapsibleGroup type="single" defaultValue="b">
|
|
273
|
+
<Collapsible trigger="A" value="a">
|
|
274
|
+
Body A
|
|
275
|
+
</Collapsible>
|
|
276
|
+
<Collapsible trigger="B" value="b">
|
|
277
|
+
Body B
|
|
278
|
+
</Collapsible>
|
|
279
|
+
</CollapsibleGroup>,
|
|
280
|
+
);
|
|
281
|
+
const [a, b] = screen.getAllByRole('button');
|
|
282
|
+
expect(a).toHaveAttribute('aria-expanded', 'false');
|
|
283
|
+
expect(b).toHaveAttribute('aria-expanded', 'true');
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
it('opening one item closes the previously open item', async () => {
|
|
287
|
+
const user = userEvent.setup();
|
|
288
|
+
render(
|
|
289
|
+
<CollapsibleGroup type="single" defaultValue="a">
|
|
290
|
+
<Collapsible trigger="A" value="a">
|
|
291
|
+
Body A
|
|
292
|
+
</Collapsible>
|
|
293
|
+
<Collapsible trigger="B" value="b">
|
|
294
|
+
Body B
|
|
295
|
+
</Collapsible>
|
|
296
|
+
</CollapsibleGroup>,
|
|
297
|
+
);
|
|
298
|
+
const [a, b] = screen.getAllByRole('button');
|
|
299
|
+
expect(a).toHaveAttribute('aria-expanded', 'true');
|
|
300
|
+
|
|
301
|
+
await user.click(b);
|
|
302
|
+
expect(a).toHaveAttribute('aria-expanded', 'false');
|
|
303
|
+
expect(b).toHaveAttribute('aria-expanded', 'true');
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
it('clicking the open item closes it (single mode allows all-closed)', async () => {
|
|
307
|
+
const user = userEvent.setup();
|
|
308
|
+
render(
|
|
309
|
+
<CollapsibleGroup type="single" defaultValue="a">
|
|
310
|
+
<Collapsible trigger="A" value="a">
|
|
311
|
+
Body A
|
|
312
|
+
</Collapsible>
|
|
313
|
+
</CollapsibleGroup>,
|
|
314
|
+
);
|
|
315
|
+
const a = screen.getByRole('button');
|
|
316
|
+
await user.click(a);
|
|
317
|
+
expect(a).toHaveAttribute('aria-expanded', 'false');
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
it('fires the group onChange with the newly opened value', async () => {
|
|
321
|
+
const user = userEvent.setup();
|
|
322
|
+
const onChange = vi.fn();
|
|
323
|
+
render(
|
|
324
|
+
<CollapsibleGroup type="single" onChange={onChange}>
|
|
325
|
+
<Collapsible trigger="A" value="a">
|
|
326
|
+
Body A
|
|
327
|
+
</Collapsible>
|
|
328
|
+
</CollapsibleGroup>,
|
|
329
|
+
);
|
|
330
|
+
await user.click(screen.getByRole('button'));
|
|
331
|
+
expect(onChange).toHaveBeenCalledWith('a');
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
describe('inside CollapsibleGroup (multiple mode)', () => {
|
|
336
|
+
it('allows several items open at once', async () => {
|
|
337
|
+
const user = userEvent.setup();
|
|
338
|
+
render(
|
|
339
|
+
<CollapsibleGroup type="multiple" defaultValue={['a']}>
|
|
340
|
+
<Collapsible trigger="A" value="a">
|
|
341
|
+
Body A
|
|
342
|
+
</Collapsible>
|
|
343
|
+
<Collapsible trigger="B" value="b">
|
|
344
|
+
Body B
|
|
345
|
+
</Collapsible>
|
|
346
|
+
</CollapsibleGroup>,
|
|
347
|
+
);
|
|
348
|
+
const [a, b] = screen.getAllByRole('button');
|
|
349
|
+
expect(a).toHaveAttribute('aria-expanded', 'true');
|
|
350
|
+
expect(b).toHaveAttribute('aria-expanded', 'false');
|
|
351
|
+
|
|
352
|
+
await user.click(b);
|
|
353
|
+
// Opening B does not close A in multiple mode.
|
|
354
|
+
expect(a).toHaveAttribute('aria-expanded', 'true');
|
|
355
|
+
expect(b).toHaveAttribute('aria-expanded', 'true');
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
it('fires onChange with the full array of open values', async () => {
|
|
359
|
+
const user = userEvent.setup();
|
|
360
|
+
const onChange = vi.fn();
|
|
361
|
+
render(
|
|
362
|
+
<CollapsibleGroup
|
|
363
|
+
type="multiple"
|
|
364
|
+
defaultValue={['a']}
|
|
365
|
+
onChange={onChange}>
|
|
366
|
+
<Collapsible trigger="A" value="a">
|
|
367
|
+
Body A
|
|
368
|
+
</Collapsible>
|
|
369
|
+
<Collapsible trigger="B" value="b">
|
|
370
|
+
Body B
|
|
371
|
+
</Collapsible>
|
|
372
|
+
</CollapsibleGroup>,
|
|
373
|
+
);
|
|
374
|
+
const [, b] = screen.getAllByRole('button');
|
|
375
|
+
await user.click(b);
|
|
376
|
+
expect(onChange).toHaveBeenCalledWith(['a', 'b']);
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
describe('group presentation (dividers + density)', () => {
|
|
381
|
+
it('reflects group density as a data attribute on items when dividers are enabled', () => {
|
|
382
|
+
render(
|
|
383
|
+
<CollapsibleGroup type="single" hasDividers density="compact">
|
|
384
|
+
<Collapsible trigger="A" value="a" data-testid="item-a">
|
|
385
|
+
Body A
|
|
386
|
+
</Collapsible>
|
|
387
|
+
</CollapsibleGroup>,
|
|
388
|
+
);
|
|
389
|
+
const item = screen.getByTestId('item-a');
|
|
390
|
+
expect(item).toHaveAttribute('data-density', 'compact');
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
it('omits density data attribute when standalone (no group)', () => {
|
|
394
|
+
render(
|
|
395
|
+
<Collapsible trigger="A" data-testid="item">
|
|
396
|
+
Body
|
|
397
|
+
</Collapsible>,
|
|
398
|
+
);
|
|
399
|
+
const item = screen.getByTestId('item');
|
|
400
|
+
expect(item).not.toHaveAttribute('data-density');
|
|
401
|
+
});
|
|
402
|
+
});
|
|
403
|
+
});
|
|
@@ -4,15 +4,21 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file Collapsible.tsx
|
|
7
|
-
* @input Uses React, StyleX, useCollapsible hook, getIcon, theme tokens
|
|
7
|
+
* @input Uses React, StyleX, useCollapsible hook, CollapsibleGroupPresentationContext, getIcon, theme tokens
|
|
8
8
|
* @output Exports Collapsible component and CollapsibleProps
|
|
9
9
|
* @position Collapsible content primitive — trigger toggles visibility of children
|
|
10
10
|
*
|
|
11
11
|
* Collapsible is a standalone primitive that makes any content collapsible.
|
|
12
12
|
* It renders a trigger area (always visible) and a content area that toggles.
|
|
13
|
-
* Handles state management, accessibility (aria-expanded
|
|
13
|
+
* Handles state management, accessibility (aria-expanded + aria-controls linking
|
|
14
|
+
* the trigger to its content region), and chevron indicator.
|
|
14
15
|
*
|
|
15
16
|
* Works standalone or coordinated by CollapsibleGroup via the `value` prop.
|
|
17
|
+
* When the surrounding CollapsibleGroup sets `hasDividers`, each Collapsible
|
|
18
|
+
* draws its own row chrome (borderBlockStart suppressed on :first-child, plus
|
|
19
|
+
* density padding) from CollapsibleGroupPresentationContext — StyleX has no
|
|
20
|
+
* child selectors, so the group cannot draw it from outside. The presentation
|
|
21
|
+
* context is reset around children so nested collapsibles stay chrome-free.
|
|
16
22
|
*
|
|
17
23
|
* SYNC: When modified, update these files to stay in sync:
|
|
18
24
|
* - /packages/core/src/Collapsible/index.ts (exports)
|
|
@@ -21,9 +27,10 @@
|
|
|
21
27
|
* - /packages/cli/templates/blocks/components/Collapsible/ (showcase blocks)
|
|
22
28
|
*/
|
|
23
29
|
|
|
24
|
-
import type
|
|
30
|
+
import {use, useId, type ReactNode} from 'react';
|
|
25
31
|
import * as stylex from '@stylexjs/stylex';
|
|
26
32
|
import {
|
|
33
|
+
borderVars,
|
|
27
34
|
colorVars,
|
|
28
35
|
typographyVars,
|
|
29
36
|
fontWeightVars,
|
|
@@ -33,6 +40,7 @@ import {
|
|
|
33
40
|
easeVars,
|
|
34
41
|
} from '../theme/tokens.stylex';
|
|
35
42
|
import {useCollapsible} from './useCollapsible';
|
|
43
|
+
import {CollapsibleGroupPresentationContext} from './CollapsibleGroupContext';
|
|
36
44
|
import {getIcon} from '../Icon/globalIconRegistry';
|
|
37
45
|
import {mergeProps} from '../utils';
|
|
38
46
|
import type {BaseProps} from '../BaseProps';
|
|
@@ -57,6 +65,16 @@ const styles = stylex.create({
|
|
|
57
65
|
color: colorVars['--color-text-primary'],
|
|
58
66
|
textAlign: 'start',
|
|
59
67
|
paddingBlock: 0,
|
|
68
|
+
// `all: unset` above wipes the UA focus outline; restore a keyboard-only
|
|
69
|
+
// focus ring using the standard token/offset (WCAG 2.4.7).
|
|
70
|
+
outline: {
|
|
71
|
+
default: null,
|
|
72
|
+
':focus-visible': `2px solid ${colorVars['--color-accent']}`,
|
|
73
|
+
},
|
|
74
|
+
outlineOffset: {
|
|
75
|
+
default: '0',
|
|
76
|
+
':focus-visible': '2px',
|
|
77
|
+
},
|
|
60
78
|
},
|
|
61
79
|
// Capsize: trim leading from text triggers
|
|
62
80
|
triggerLabel: {
|
|
@@ -87,8 +105,42 @@ const styles = stylex.create({
|
|
|
87
105
|
content: {
|
|
88
106
|
paddingBlockStart: spacingVars['--spacing-1'],
|
|
89
107
|
},
|
|
108
|
+
// Group divider chrome — a hairline above every item except the first.
|
|
109
|
+
// The group's wrapper (or 'all' mode) owns the outer edges.
|
|
110
|
+
divided: {
|
|
111
|
+
borderBlockStartWidth: {
|
|
112
|
+
default: borderVars['--border-width'],
|
|
113
|
+
':first-child': '0',
|
|
114
|
+
},
|
|
115
|
+
borderBlockStartStyle: 'solid',
|
|
116
|
+
borderBlockStartColor: colorVars['--color-border'],
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
// Density padding for divided/padded accordion rows. paddingBlock mapping
|
|
121
|
+
// follows Table's density scale (spacing-1/2/3); content only pads its end
|
|
122
|
+
// so text doesn't sit on the divider below (block-start stays spacing-1).
|
|
123
|
+
const densityStyles = stylex.create({
|
|
124
|
+
triggerCompact: {paddingBlock: spacingVars['--spacing-1']},
|
|
125
|
+
triggerBalanced: {paddingBlock: spacingVars['--spacing-2']},
|
|
126
|
+
triggerSpacious: {paddingBlock: spacingVars['--spacing-3']},
|
|
127
|
+
contentCompact: {paddingBlockEnd: spacingVars['--spacing-1']},
|
|
128
|
+
contentBalanced: {paddingBlockEnd: spacingVars['--spacing-2']},
|
|
129
|
+
contentSpacious: {paddingBlockEnd: spacingVars['--spacing-3']},
|
|
90
130
|
});
|
|
91
131
|
|
|
132
|
+
const triggerDensity = {
|
|
133
|
+
compact: densityStyles.triggerCompact,
|
|
134
|
+
balanced: densityStyles.triggerBalanced,
|
|
135
|
+
spacious: densityStyles.triggerSpacious,
|
|
136
|
+
} as const;
|
|
137
|
+
|
|
138
|
+
const contentDensity = {
|
|
139
|
+
compact: densityStyles.contentCompact,
|
|
140
|
+
balanced: densityStyles.contentBalanced,
|
|
141
|
+
spacious: densityStyles.contentSpacious,
|
|
142
|
+
} as const;
|
|
143
|
+
|
|
92
144
|
export interface CollapsibleProps extends BaseProps {
|
|
93
145
|
/** Ref forwarded to the root element */
|
|
94
146
|
ref?: React.Ref<HTMLDivElement>;
|
|
@@ -192,14 +244,24 @@ export function Collapsible({
|
|
|
192
244
|
value,
|
|
193
245
|
});
|
|
194
246
|
|
|
247
|
+
const presentation = use(CollapsibleGroupPresentationContext);
|
|
248
|
+
const isDivided = presentation?.hasDividers ?? false;
|
|
249
|
+
const density = presentation?.density ?? null;
|
|
250
|
+
|
|
195
251
|
const chevronIcon = getIcon('chevronDown');
|
|
196
252
|
|
|
253
|
+
// Links the trigger to the region it shows/hides so assistive tech can move
|
|
254
|
+
// from the button to its controlled content (disclosure pattern).
|
|
255
|
+
const contentId = useId();
|
|
256
|
+
|
|
197
257
|
return (
|
|
198
258
|
<div
|
|
199
259
|
ref={ref}
|
|
200
260
|
{...mergeProps(
|
|
201
|
-
themeProps('collapsible'
|
|
202
|
-
|
|
261
|
+
themeProps('collapsible', {
|
|
262
|
+
density: density ?? undefined,
|
|
263
|
+
}),
|
|
264
|
+
stylex.props(styles.root, isDivided && styles.divided, xstyle),
|
|
203
265
|
className,
|
|
204
266
|
style,
|
|
205
267
|
)}
|
|
@@ -208,7 +270,11 @@ export function Collapsible({
|
|
|
208
270
|
type="button"
|
|
209
271
|
onClick={toggle}
|
|
210
272
|
aria-expanded={isOpen}
|
|
211
|
-
{
|
|
273
|
+
aria-controls={contentId}
|
|
274
|
+
{...stylex.props(
|
|
275
|
+
styles.trigger,
|
|
276
|
+
density != null && triggerDensity[density],
|
|
277
|
+
)}>
|
|
212
278
|
<span {...stylex.props(styles.triggerLabel)}>{trigger}</span>
|
|
213
279
|
<span
|
|
214
280
|
{...stylex.props(
|
|
@@ -219,10 +285,19 @@ export function Collapsible({
|
|
|
219
285
|
</span>
|
|
220
286
|
</button>
|
|
221
287
|
<div
|
|
222
|
-
{
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
288
|
+
id={contentId}
|
|
289
|
+
{...stylex.props(
|
|
290
|
+
styles.content,
|
|
291
|
+
density != null && contentDensity[density],
|
|
292
|
+
!isOpen && styles.contentHidden,
|
|
293
|
+
)}>
|
|
294
|
+
{presentation != null ? (
|
|
295
|
+
<CollapsibleGroupPresentationContext value={null}>
|
|
296
|
+
{children}
|
|
297
|
+
</CollapsibleGroupPresentationContext>
|
|
298
|
+
) : (
|
|
299
|
+
children
|
|
300
|
+
)}
|
|
226
301
|
</div>
|
|
227
302
|
</div>
|
|
228
303
|
);
|
|
@@ -7,7 +7,7 @@ export const docs = {
|
|
|
7
7
|
subComponentOf: 'Collapsible',
|
|
8
8
|
displayName: 'Collapsible Group',
|
|
9
9
|
isHiddenFromOverview: true,
|
|
10
|
-
description: 'Coordinates multiple Collapsible instances so only one (single mode) or any number (multiple mode) can be open at a time. Renders no wrapper DOM element.',
|
|
10
|
+
description: 'Coordinates multiple Collapsible instances so only one (single mode) or any number (multiple mode) can be open at a time. Renders no wrapper DOM element unless dividers are enabled.',
|
|
11
11
|
props: [
|
|
12
12
|
{
|
|
13
13
|
name: 'type',
|
|
@@ -30,6 +30,17 @@ export const docs = {
|
|
|
30
30
|
type: '(value: string | string[]) => void',
|
|
31
31
|
description: 'Callback invoked when the set of open items changes.',
|
|
32
32
|
},
|
|
33
|
+
{
|
|
34
|
+
name: 'hasDividers',
|
|
35
|
+
type: 'boolean',
|
|
36
|
+
description: "Whether to draw hairline dividers between the group's items. When set, the group renders a wrapper div and items default to 'balanced' density. Pair with bare Collapsible children; Card-wrapped items provide their own separation.",
|
|
37
|
+
default: 'false',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'density',
|
|
41
|
+
type: "'compact' | 'balanced' | 'spacious'",
|
|
42
|
+
description: "Row density controlling trigger and content block padding on the group's items. Defaults to 'balanced' when dividers are shown; otherwise items keep their default unpadded look.",
|
|
43
|
+
},
|
|
33
44
|
{
|
|
34
45
|
name: 'children',
|
|
35
46
|
type: 'ReactNode',
|
|
@@ -52,7 +63,7 @@ export const docsZh = {
|
|
|
52
63
|
name: 'CollapsibleGroup',
|
|
53
64
|
isHiddenFromOverview: true,
|
|
54
65
|
displayName: 'Collapsible Group',
|
|
55
|
-
description: '协调多个 Collapsible 实例,使同一时间只有一个(single 模式)或任意数量(multiple
|
|
66
|
+
description: '协调多个 Collapsible 实例,使同一时间只有一个(single 模式)或任意数量(multiple 模式)可以展开。除非启用 dividers,否则不渲染包裹 DOM 元素。',
|
|
56
67
|
props: [
|
|
57
68
|
{
|
|
58
69
|
name: 'type',
|
|
@@ -75,6 +86,17 @@ export const docsZh = {
|
|
|
75
86
|
type: '(value: string | string[]) => void',
|
|
76
87
|
description: '展开项目集合变更时调用的回调。',
|
|
77
88
|
},
|
|
89
|
+
{
|
|
90
|
+
name: 'hasDividers',
|
|
91
|
+
type: 'boolean',
|
|
92
|
+
description: "是否在组项目之间绘制细线分隔线。启用后组会渲染一个包裹 div,且项目默认使用 'balanced' 密度。适合搭配裸 Collapsible 子项使用;用 Card 包裹的项目自带视觉分隔。",
|
|
93
|
+
default: 'false',
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'density',
|
|
97
|
+
type: "'compact' | 'balanced' | 'spacious'",
|
|
98
|
+
description: "控制组内项目触发器和内容块内边距的行密度。显示分隔线时默认为 'balanced';否则项目保持默认的无内边距外观。",
|
|
99
|
+
},
|
|
78
100
|
{
|
|
79
101
|
name: 'children',
|
|
80
102
|
type: 'ReactNode',
|
|
@@ -88,12 +110,14 @@ export const docsDense = {
|
|
|
88
110
|
name: 'CollapsibleGroup',
|
|
89
111
|
isHiddenFromOverview: true,
|
|
90
112
|
displayName: 'Collapsible Group',
|
|
91
|
-
description: 'coordinates multiple Collapsible instances; single or multiple open. no wrapper DOM.',
|
|
113
|
+
description: 'coordinates multiple Collapsible instances; single or multiple open. no wrapper DOM unless dividers enabled.',
|
|
92
114
|
propDescriptions: {
|
|
93
115
|
type: 'one or many items open simultaneously',
|
|
94
116
|
defaultValue: 'default open item(s) (uncontrolled); string for single, array for multiple',
|
|
95
117
|
value: 'controlled open item(s)',
|
|
96
118
|
onChange: 'callback on open items change',
|
|
119
|
+
hasDividers: "draw hairline dividers between items; enables wrapper div + 'balanced' density; use bare Collapsible children",
|
|
120
|
+
density: "row padding 'compact' | 'balanced' | 'spacious'; defaults 'balanced' with dividers, else unpadded",
|
|
97
121
|
children: 'Collapsible instances to coordinate',
|
|
98
122
|
},
|
|
99
123
|
};
|