@astryxdesign/core 0.1.4-canary.fd7ab46 → 0.1.4
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/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +18 -20
- 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 +53 -55
- package/dist/AspectRatio/AspectRatio.d.ts +10 -48
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +12 -33
- 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 +25 -27
- 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 +25 -32
- 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 +48 -68
- 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 +2 -4
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +10 -18
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +21 -24
- package/dist/Carousel/carousel.markers.stylex.d.ts +7 -0
- package/dist/Carousel/carousel.markers.stylex.d.ts.map +1 -0
- package/dist/Carousel/carousel.markers.stylex.js +12 -0
- 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 +15 -27
- package/dist/Chat/ChatDictationButton.d.ts +1 -1
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +11 -13
- 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 +10 -12
- 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 +12 -14
- 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 +15 -24
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +74 -81
- 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 +23 -25
- 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 +6 -8
- package/dist/Citation/Citation.js +10 -10
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +9 -32
- package/dist/Code/Code.js +3 -3
- package/dist/CodeBlock/CodeBlock.d.ts +1 -10
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +52 -88
- package/dist/Collapsible/Collapsible.d.ts +3 -9
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +22 -110
- package/dist/Collapsible/CollapsibleGroup.d.ts +7 -39
- package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroup.js +12 -73
- package/dist/Collapsible/CollapsibleGroupContext.d.ts +0 -31
- package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroupContext.js +3 -33
- package/dist/Collapsible/index.d.ts +0 -1
- package/dist/Collapsible/index.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.d.ts +1 -4
- package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.js +6 -20
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +34 -36
- 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 +2 -7
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +43 -76
- package/dist/DateInput/DateInput.js +18 -18
- package/dist/DateRangeInput/DateRangeInput.js +21 -21
- package/dist/DateTimeInput/DateTimeInput.d.ts +2 -5
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +26 -30
- 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 +17 -2
- 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 +3 -4
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +12 -29
- 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 +1 -5
- 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 +12 -16
- 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 +2 -29
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +31 -44
- 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 +31 -55
- 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/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.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 +32 -48
- 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 +72 -125
- 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 +92 -110
- 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 +18 -25
- 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 +21 -24
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +10 -28
- 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 +10 -32
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +12 -18
- 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 +34 -38
- package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +6 -8
- 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 +16 -18
- 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 +4 -8
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +29 -34
- 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 +30 -57
- package/dist/TabList/tab.markers.stylex.d.ts +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +39 -50
- 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 +5 -9
- 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 +5 -9
- package/dist/Table/TableHeader.d.ts +1 -1
- package/dist/Table/TableHeader.d.ts.map +1 -1
- package/dist/Table/TableHeader.js +5 -9
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/TableRow.js +5 -5
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +11 -14
- 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 +1 -5
- package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +22 -22
- 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 +1 -11
- 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 +4 -8
- 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 +2 -3
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +29 -30
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +21 -26
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +26 -37
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +17 -25
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +11 -23
- 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.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +34 -36
- package/dist/Toolbar/Toolbar.js +18 -18
- package/dist/Tooltip/Tooltip.js +11 -11
- package/dist/Tooltip/useTooltip.d.ts +1 -5
- 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 +14 -25
- 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 +20 -23
- 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 +0 -7
- package/dist/astryx.umd.js +60 -60
- package/dist/astryx.umd.js.map +4 -4
- package/dist/docs-types.d.ts +2 -8
- 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 +0 -2
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +0 -1
- package/dist/hooks/useFocusTrap.d.ts +0 -3
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +1 -38
- package/dist/hooks/useInteractiveRole.d.ts +2 -6
- package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
- package/dist/hooks/useInteractiveRole.js +2 -6
- package/dist/hooks/useKeyboardHint.js +9 -9
- package/dist/hooks/useStreamingText.d.ts +1 -3
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +5 -14
- 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 +3 -10
- package/dist/theme/hct.d.ts +15 -0
- 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 +2 -10
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +4 -220
- package/dist/utils/index.d.ts +0 -3
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -3
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +5 -8
- package/package.json +3 -3
- package/src/AlertDialog/AlertDialog.doc.mjs +0 -4
- package/src/AlertDialog/AlertDialog.tsx +0 -2
- package/src/AppShell/AppShell.tsx +0 -2
- package/src/AspectRatio/AspectRatio.doc.mjs +1 -28
- package/src/AspectRatio/AspectRatio.test.tsx +1 -142
- package/src/AspectRatio/AspectRatio.tsx +10 -70
- package/src/AspectRatio/index.ts +1 -5
- package/src/Avatar/Avatar.doc.mjs +0 -11
- package/src/Avatar/Avatar.test.tsx +1 -32
- package/src/Avatar/Avatar.tsx +20 -12
- package/src/Banner/Banner.doc.mjs +0 -8
- package/src/Banner/Banner.test.tsx +0 -38
- package/src/Banner/Banner.tsx +1 -8
- package/src/Calendar/Calendar.doc.mjs +1 -1
- package/src/Calendar/Calendar.test.tsx +17 -122
- package/src/Calendar/Calendar.tsx +5 -26
- package/src/Calendar/dayCellUtils.ts +1 -3
- package/src/Calendar/styles.ts +2 -12
- package/src/Card/Card.tsx +6 -16
- package/src/Carousel/Carousel.doc.mjs +12 -12
- package/src/Carousel/Carousel.test.tsx +0 -13
- package/src/Carousel/Carousel.tsx +2 -4
- package/src/Carousel/carousel.markers.stylex.ts +10 -0
- package/src/Chat/Chat.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.test.tsx +1 -27
- package/src/Chat/ChatComposerInput.tsx +15 -20
- package/src/Chat/ChatDictationButton.tsx +4 -4
- package/src/Chat/ChatLayoutScrollButton.tsx +1 -3
- package/src/Chat/ChatMessageMetadata.tsx +6 -4
- package/src/Chat/ChatSystemMessage.test.tsx +11 -26
- package/src/Chat/ChatSystemMessage.tsx +7 -7
- package/src/Chat/ChatTokenizedText.test.tsx +16 -29
- package/src/Chat/ChatTokenizedText.tsx +8 -15
- package/src/Chat/ChatToolCalls.test.tsx +0 -55
- package/src/Chat/ChatToolCalls.tsx +12 -10
- package/src/Chat/index.ts +4 -1
- package/src/Chat/useTriggerMenu.tsx +4 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -3
- package/src/CheckboxInput/CheckboxInput.test.tsx +4 -71
- package/src/CheckboxInput/CheckboxInput.tsx +0 -2
- package/src/CheckboxList/CheckboxList.test.tsx +0 -19
- package/src/CheckboxList/CheckboxListItem.tsx +2 -11
- package/src/Citation/Citation.doc.mjs +0 -5
- package/src/ClickableCard/ClickableCard.tsx +2 -45
- package/src/CodeBlock/CodeBlock.doc.mjs +2 -7
- package/src/CodeBlock/CodeBlock.test.tsx +3 -122
- package/src/CodeBlock/CodeBlock.tsx +4 -62
- package/src/Collapsible/Collapsible.doc.mjs +4 -8
- package/src/Collapsible/Collapsible.tsx +10 -86
- package/src/Collapsible/CollapsibleGroup.doc.mjs +3 -27
- package/src/Collapsible/CollapsibleGroup.test.tsx +0 -318
- package/src/Collapsible/CollapsibleGroup.tsx +9 -107
- package/src/Collapsible/CollapsibleGroupContext.tsx +2 -42
- package/src/Collapsible/index.ts +0 -4
- package/src/Collapsible/useCollapsible.ts +6 -20
- package/src/CommandPalette/CommandPalette.doc.mjs +0 -4
- package/src/CommandPalette/CommandPalette.tsx +3 -5
- package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +0 -5
- package/src/CommandPalette/CommandPaletteGroup.doc.mjs +0 -10
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +0 -6
- package/src/CommandPalette/CommandPaletteItem.doc.mjs +0 -6
- package/src/CommandPalette/CommandPaletteList.doc.mjs +0 -9
- package/src/ContextMenu/ContextMenu.doc.mjs +0 -15
- package/src/ContextMenu/ContextMenu.test.tsx +0 -87
- package/src/ContextMenu/ContextMenu.tsx +28 -87
- package/src/ContextMenu/ContextMenuItem.doc.mjs +0 -6
- package/src/DateInput/DateInput.test.tsx +20 -11
- package/src/DateRangeInput/DateRangeInput.test.tsx +44 -31
- package/src/DateTimeInput/DateTimeInput.doc.mjs +2 -3
- package/src/DateTimeInput/DateTimeInput.test.tsx +16 -118
- package/src/DateTimeInput/DateTimeInput.tsx +2 -8
- package/src/DateTimeInput/index.ts +0 -1
- package/src/Dialog/Dialog.doc.mjs +0 -4
- package/src/Dialog/DialogHeader.doc.mjs +0 -45
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenu.test.tsx +2 -22
- package/src/DropdownMenu/DropdownMenuItem.tsx +17 -5
- package/src/Field/Field.test.tsx +4 -1
- package/src/Field/FieldLabel.test.tsx +2 -2
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +3 -0
- package/src/Grid/Grid.test.tsx +18 -43
- package/src/Grid/Grid.tsx +9 -26
- package/src/HoverCard/HoverCard.doc.mjs +6 -6
- package/src/HoverCard/useHoverCard.doc.mjs +5 -5
- package/src/HoverCard/useHoverCard.tsx +2 -9
- package/src/Icon/Icon.test.tsx +29 -41
- package/src/Icon/Icon.tsx +2 -6
- package/src/InputGroup/InputGroup.tsx +2 -2
- package/src/Item/Item.tsx +1 -1
- package/src/Layer/useLayer.doc.mjs +2 -2
- package/src/Layer/useLayer.test.tsx +2 -221
- package/src/Layer/useLayer.tsx +30 -69
- package/src/Layout/LayoutContent.doc.mjs +0 -12
- package/src/Layout/LayoutPanel.doc.mjs +0 -40
- package/src/Lightbox/Lightbox.doc.mjs +0 -5
- package/src/Lightbox/Lightbox.test.tsx +2 -123
- package/src/Lightbox/Lightbox.tsx +1 -29
- package/src/Markdown/Markdown.tsx +7 -9
- package/src/Markdown/parser.perf.test.ts +12 -34
- package/src/NavMenu/NavMenu.doc.mjs +0 -15
- package/src/NumberInput/NumberInput.test.tsx +3 -48
- package/src/NumberInput/NumberInput.tsx +15 -32
- package/src/Overlay/Overlay.doc.mjs +0 -6
- package/src/Pagination/Pagination.test.tsx +0 -162
- package/src/Pagination/Pagination.tsx +26 -80
- package/src/Popover/Popover.doc.mjs +6 -6
- package/src/Popover/Popover.test.tsx +0 -65
- package/src/Popover/usePopover.doc.mjs +1 -1
- package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
- package/src/PowerSearch/PowerSearch.test.tsx +1 -109
- package/src/PowerSearch/PowerSearch.tsx +16 -37
- package/src/ProgressBar/ProgressBar.test.tsx +0 -30
- package/src/ProgressBar/ProgressBar.tsx +5 -12
- package/src/RadioList/RadioList.test.tsx +0 -19
- package/src/RadioList/RadioListItem.tsx +4 -9
- package/src/Resizable/ResizeHandle.tsx +4 -22
- package/src/SegmentedControl/SegmentedControl.doc.mjs +1 -1
- package/src/SegmentedControl/SegmentedControl.test.tsx +0 -192
- package/src/SegmentedControl/SegmentedControl.tsx +5 -27
- package/src/SegmentedControl/SegmentedControlItem.tsx +4 -9
- package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
- package/src/Selector/Selector.test.tsx +1 -27
- package/src/SideNav/SideNav.doc.mjs +1 -7
- package/src/SideNav/SideNav.test.tsx +0 -66
- package/src/SideNav/SideNav.tsx +2 -6
- package/src/SideNav/SideNavCollapseButton.tsx +3 -4
- package/src/SideNav/SideNavSection.tsx +4 -6
- package/src/Switch/Switch.doc.mjs +7 -7
- package/src/Switch/Switch.test.tsx +3 -102
- package/src/Switch/Switch.tsx +7 -20
- package/src/TabList/TabList.test.tsx +1 -185
- package/src/TabList/TabMenu.tsx +9 -45
- package/src/Table/BaseTable.tsx +2 -13
- package/src/Table/Table.test.tsx +0 -87
- package/src/Table/TableBody.tsx +2 -15
- package/src/Table/TableFooter.tsx +2 -15
- package/src/Table/TableHeader.tsx +2 -15
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +0 -13
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +1 -3
- package/src/Table/plugins/pagination/paginateData.ts +1 -5
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +0 -13
- package/src/Table/plugins/selection/useTableSelectionState.test.tsx +0 -23
- package/src/Table/plugins/selection/useTableSelectionState.tsx +6 -11
- package/src/Table/plugins/sortable/useTableSortableState.test.tsx +1 -35
- package/src/Table/plugins/sortable/useTableSortableState.tsx +4 -8
- package/src/TextArea/TextArea.test.tsx +3 -3
- package/src/TextInput/TextInput.test.tsx +3 -3
- package/src/Thumbnail/Thumbnail.test.tsx +2 -36
- package/src/Thumbnail/Thumbnail.tsx +2 -4
- package/src/TimeInput/TimeInput.test.tsx +0 -37
- package/src/TimeInput/TimeInput.tsx +1 -11
- package/src/Timestamp/Timestamp.doc.mjs +1 -1
- package/src/Timestamp/Timestamp.test.tsx +0 -52
- package/src/Timestamp/Timestamp.tsx +16 -30
- package/src/Toast/Toast.tsx +3 -11
- package/src/Toast/ToastViewport.test.tsx +0 -64
- package/src/Toast/ToastViewport.tsx +0 -12
- package/src/ToggleButton/ToggleButton.doc.mjs +0 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.test.tsx +0 -54
- package/src/Tokenizer/Tokenizer.tsx +4 -5
- package/src/Tooltip/Tooltip.doc.mjs +6 -6
- package/src/Tooltip/useTooltip.doc.mjs +5 -5
- package/src/Tooltip/useTooltip.tsx +2 -12
- package/src/TopNav/TopNav.doc.mjs +1 -1
- package/src/TopNav/TopNav.test.tsx +7 -23
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +2 -9
- package/src/TreeList/TreeList.doc.mjs +2 -2
- package/src/Typeahead/BaseTypeahead.doc.mjs +0 -19
- package/src/Typeahead/BaseTypeahead.tsx +2 -5
- package/src/Typeahead/Typeahead.doc.mjs +1 -1
- package/src/Typeahead/Typeahead.test.tsx +1 -45
- package/src/docs-types.ts +1 -9
- package/src/hooks/focusableSelector.ts +1 -1
- package/src/hooks/index.ts +0 -3
- package/src/hooks/useFocusTrap.doc.mjs +2 -4
- package/src/hooks/useFocusTrap.test.tsx +1 -149
- package/src/hooks/useFocusTrap.ts +1 -50
- package/src/hooks/useInteractiveRole.ts +4 -12
- package/src/hooks/useStreamingText.test.ts +19 -54
- package/src/hooks/useStreamingText.ts +5 -16
- package/src/hooks/useTreeFocus.test.tsx +3 -1
- package/src/reset.css +0 -29
- package/src/theme/SyntaxTheme.doc.mjs +4 -4
- package/src/theme/defineTheme.ts +13 -4
- package/src/theme/derivedVarRegistry.test.ts +2 -2
- package/src/theme/expandColorScale.test.ts +0 -29
- package/src/theme/expandColorScale.ts +6 -11
- package/src/theme/hct.ts +17 -9
- package/src/theme/tokens.test.ts +9 -182
- package/src/theme/tokens.ts +4 -239
- package/src/theme/useTheme.test.tsx +0 -20
- package/src/utils/index.ts +0 -4
- package/src/utils/sharedResizeObserver.test.ts +2 -2
- package/src/utils/timeParser.test.ts +0 -13
- package/src/utils/timeParser.ts +5 -8
- package/dist/hooks/useHotkeys.d.ts +0 -51
- package/dist/hooks/useHotkeys.d.ts.map +0 -1
- package/dist/hooks/useHotkeys.js +0 -160
- package/dist/utils/color.d.ts +0 -42
- package/dist/utils/color.d.ts.map +0 -1
- package/dist/utils/color.js +0 -150
- package/dist/utils/composeEventHandlers.d.ts +0 -30
- package/dist/utils/composeEventHandlers.d.ts.map +0 -1
- package/dist/utils/composeEventHandlers.js +0 -40
- package/src/Chat/ChatDictationButton.test.tsx +0 -43
- package/src/Chat/ChatLayoutScrollButton.test.tsx +0 -33
- package/src/Chat/ChatMessageMetadata.test.tsx +0 -32
- package/src/Collapsible/Collapsible.test.tsx +0 -405
- package/src/FieldStatus/FieldStatus.test.tsx +0 -282
- package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +0 -185
- package/src/Layout/Layout.test.tsx +0 -285
- package/src/Layout/LayoutSlots.test.tsx +0 -364
- package/src/Outline/parseOutlineFromMarkdown.test.ts +0 -80
- package/src/OverflowList/OverflowList.test.tsx +0 -416
- package/src/Overlay/Overlay.test.tsx +0 -356
- package/src/Resizable/ResizeHandle.test.tsx +0 -218
- package/src/SizeContext/SizeContext.test.tsx +0 -226
- package/src/__tests__/TestIcon.tsx +0 -26
- package/src/__tests__/fastRoleQueries.ts +0 -66
- package/src/docPropReferences.test.ts +0 -178
- package/src/hooks/useHotkeys.doc.mjs +0 -52
- package/src/hooks/useHotkeys.test.ts +0 -245
- package/src/hooks/useHotkeys.ts +0 -203
- package/src/utils/color.test.ts +0 -133
- package/src/utils/color.ts +0 -148
- package/src/utils/composeEventHandlers.test.ts +0 -71
- package/src/utils/composeEventHandlers.ts +0 -44
- package/src/utils/mergeProps.test.ts +0 -166
|
@@ -1,405 +0,0 @@
|
|
|
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 dividers and density as data attributes on items', () => {
|
|
382
|
-
render(
|
|
383
|
-
<CollapsibleGroup type="single" dividers="between" 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-dividers', 'between');
|
|
391
|
-
expect(item).toHaveAttribute('data-density', 'compact');
|
|
392
|
-
});
|
|
393
|
-
|
|
394
|
-
it('omits divider data attributes when standalone (no group)', () => {
|
|
395
|
-
render(
|
|
396
|
-
<Collapsible trigger="A" data-testid="item">
|
|
397
|
-
Body
|
|
398
|
-
</Collapsible>,
|
|
399
|
-
);
|
|
400
|
-
const item = screen.getByTestId('item');
|
|
401
|
-
expect(item).not.toHaveAttribute('data-dividers');
|
|
402
|
-
expect(item).not.toHaveAttribute('data-density');
|
|
403
|
-
});
|
|
404
|
-
});
|
|
405
|
-
});
|
|
@@ -1,282 +0,0 @@
|
|
|
1
|
-
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @file FieldStatus.test.tsx
|
|
5
|
-
* @input Uses vitest, @testing-library/react, FieldStatus component
|
|
6
|
-
* @output Characterization coverage for FieldStatus behavior
|
|
7
|
-
* @position Testing; validates FieldStatus.tsx implementation
|
|
8
|
-
*
|
|
9
|
-
* SYNC: When FieldStatus.tsx changes, update tests to match new behavior
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import {describe, it, expect, vi} from 'vitest';
|
|
13
|
-
import {render, screen} from '@testing-library/react';
|
|
14
|
-
import * as stylex from '@stylexjs/stylex';
|
|
15
|
-
import {FieldStatus} from './FieldStatus';
|
|
16
|
-
|
|
17
|
-
const testStyles = stylex.create({
|
|
18
|
-
custom: {color: 'rebeccapurple'},
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
describe('FieldStatus', () => {
|
|
22
|
-
it('renders the message text', () => {
|
|
23
|
-
render(<FieldStatus type="error" message="This field is required" />);
|
|
24
|
-
expect(screen.getByText('This field is required')).toBeInTheDocument();
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('renders the message inside a <div>', () => {
|
|
28
|
-
render(<FieldStatus type="error" message="Boom" data-testid="fs" />);
|
|
29
|
-
expect(screen.getByTestId('fs').tagName).toBe('DIV');
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
describe('role semantics', () => {
|
|
33
|
-
// Errors are urgent — they get role="alert" so assistive tech interrupts.
|
|
34
|
-
it('uses role="alert" for error status', () => {
|
|
35
|
-
render(<FieldStatus type="error" message="msg" />);
|
|
36
|
-
expect(screen.getByRole('alert')).toHaveTextContent('msg');
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
// Non-error statuses are advisory — role="status" is a polite live region.
|
|
40
|
-
it('uses role="status" for warning status', () => {
|
|
41
|
-
render(<FieldStatus type="warning" message="msg" data-testid="fs" />);
|
|
42
|
-
expect(screen.getByTestId('fs')).toHaveAttribute('role', 'status');
|
|
43
|
-
expect(screen.queryByRole('alert')).not.toBeInTheDocument();
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('uses role="status" for success status', () => {
|
|
47
|
-
render(<FieldStatus type="success" message="msg" data-testid="fs" />);
|
|
48
|
-
expect(screen.getByTestId('fs')).toHaveAttribute('role', 'status');
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
describe('aria-live politeness', () => {
|
|
53
|
-
// Error → assertive so screen readers announce immediately.
|
|
54
|
-
it('sets aria-live="assertive" for error', () => {
|
|
55
|
-
render(<FieldStatus type="error" message="msg" data-testid="fs" />);
|
|
56
|
-
expect(screen.getByTestId('fs')).toHaveAttribute(
|
|
57
|
-
'aria-live',
|
|
58
|
-
'assertive',
|
|
59
|
-
);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it('sets aria-live="polite" for warning', () => {
|
|
63
|
-
render(<FieldStatus type="warning" message="msg" data-testid="fs" />);
|
|
64
|
-
expect(screen.getByTestId('fs')).toHaveAttribute('aria-live', 'polite');
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it('sets aria-live="polite" for success', () => {
|
|
68
|
-
render(<FieldStatus type="success" message="msg" data-testid="fs" />);
|
|
69
|
-
expect(screen.getByTestId('fs')).toHaveAttribute('aria-live', 'polite');
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
// The element is a live region, never hidden from assistive tech.
|
|
73
|
-
it('does not mark itself aria-hidden', () => {
|
|
74
|
-
render(<FieldStatus type="error" message="msg" data-testid="fs" />);
|
|
75
|
-
expect(screen.getByTestId('fs')).not.toHaveAttribute('aria-hidden');
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
describe('theme class + data attribute reflection', () => {
|
|
80
|
-
it('renders the stable astryx-field-status class', () => {
|
|
81
|
-
render(<FieldStatus type="error" message="msg" data-testid="fs" />);
|
|
82
|
-
expect(screen.getByTestId('fs')).toHaveClass('astryx-field-status');
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
it('reflects the type as a class token and data-type attribute', () => {
|
|
86
|
-
render(<FieldStatus type="warning" message="msg" data-testid="fs" />);
|
|
87
|
-
const el = screen.getByTestId('fs');
|
|
88
|
-
expect(el).toHaveClass('warning');
|
|
89
|
-
expect(el).toHaveAttribute('data-type', 'warning');
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('reflects the variant as a class token and data-variant attribute', () => {
|
|
93
|
-
render(
|
|
94
|
-
<FieldStatus
|
|
95
|
-
type="error"
|
|
96
|
-
message="msg"
|
|
97
|
-
variant="detached"
|
|
98
|
-
data-testid="fs"
|
|
99
|
-
/>,
|
|
100
|
-
);
|
|
101
|
-
const el = screen.getByTestId('fs');
|
|
102
|
-
expect(el).toHaveClass('detached');
|
|
103
|
-
expect(el).toHaveAttribute('data-variant', 'detached');
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it('defaults data-variant to "attached"', () => {
|
|
107
|
-
render(<FieldStatus type="error" message="msg" data-testid="fs" />);
|
|
108
|
-
const el = screen.getByTestId('fs');
|
|
109
|
-
expect(el).toHaveAttribute('data-variant', 'attached');
|
|
110
|
-
expect(el).toHaveClass('attached');
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
describe('color styling per status type', () => {
|
|
115
|
-
// Each status type maps to a distinct color treatment. The rendered class
|
|
116
|
-
// list must therefore differ between types — a regression that collapsed
|
|
117
|
-
// them onto one color would be caught here.
|
|
118
|
-
it('applies distinct StyleX classes for each type', () => {
|
|
119
|
-
const {rerender} = render(
|
|
120
|
-
<FieldStatus type="error" message="msg" data-testid="fs" />,
|
|
121
|
-
);
|
|
122
|
-
const errorClass = screen.getByTestId('fs').getAttribute('class');
|
|
123
|
-
|
|
124
|
-
rerender(<FieldStatus type="warning" message="msg" data-testid="fs" />);
|
|
125
|
-
const warningClass = screen.getByTestId('fs').getAttribute('class');
|
|
126
|
-
|
|
127
|
-
rerender(<FieldStatus type="success" message="msg" data-testid="fs" />);
|
|
128
|
-
const successClass = screen.getByTestId('fs').getAttribute('class');
|
|
129
|
-
|
|
130
|
-
expect(errorClass).not.toEqual(warningClass);
|
|
131
|
-
expect(warningClass).not.toEqual(successClass);
|
|
132
|
-
expect(errorClass).not.toEqual(successClass);
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
it('applies distinct StyleX classes for each variant', () => {
|
|
136
|
-
const {rerender} = render(
|
|
137
|
-
<FieldStatus
|
|
138
|
-
type="error"
|
|
139
|
-
message="msg"
|
|
140
|
-
variant="attached"
|
|
141
|
-
data-testid="fs"
|
|
142
|
-
/>,
|
|
143
|
-
);
|
|
144
|
-
const attachedClass = screen.getByTestId('fs').getAttribute('class');
|
|
145
|
-
|
|
146
|
-
rerender(
|
|
147
|
-
<FieldStatus
|
|
148
|
-
type="error"
|
|
149
|
-
message="msg"
|
|
150
|
-
variant="detached"
|
|
151
|
-
data-testid="fs"
|
|
152
|
-
/>,
|
|
153
|
-
);
|
|
154
|
-
const detachedClass = screen.getByTestId('fs').getAttribute('class');
|
|
155
|
-
|
|
156
|
-
expect(attachedClass).not.toEqual(detachedClass);
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
describe('prop forwarding', () => {
|
|
161
|
-
it('forwards a ref to the root element', () => {
|
|
162
|
-
const ref = vi.fn();
|
|
163
|
-
render(<FieldStatus ref={ref} type="error" message="msg" />);
|
|
164
|
-
expect(ref).toHaveBeenCalledWith(expect.any(HTMLDivElement));
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
it('applies the id attribute', () => {
|
|
168
|
-
render(
|
|
169
|
-
<FieldStatus
|
|
170
|
-
type="error"
|
|
171
|
-
message="msg"
|
|
172
|
-
id="email-error"
|
|
173
|
-
data-testid="fs"
|
|
174
|
-
/>,
|
|
175
|
-
);
|
|
176
|
-
expect(screen.getByTestId('fs')).toHaveAttribute('id', 'email-error');
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
it('passes through arbitrary DOM props', () => {
|
|
180
|
-
render(
|
|
181
|
-
<FieldStatus
|
|
182
|
-
type="error"
|
|
183
|
-
message="msg"
|
|
184
|
-
data-testid="fs"
|
|
185
|
-
data-custom="xyz"
|
|
186
|
-
/>,
|
|
187
|
-
);
|
|
188
|
-
expect(screen.getByTestId('fs')).toHaveAttribute('data-custom', 'xyz');
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
it('merges a consumer className with the stable class', () => {
|
|
192
|
-
render(
|
|
193
|
-
<FieldStatus
|
|
194
|
-
type="error"
|
|
195
|
-
message="msg"
|
|
196
|
-
className="my-status"
|
|
197
|
-
data-testid="fs"
|
|
198
|
-
/>,
|
|
199
|
-
);
|
|
200
|
-
const el = screen.getByTestId('fs');
|
|
201
|
-
expect(el).toHaveClass('my-status');
|
|
202
|
-
expect(el).toHaveClass('astryx-field-status');
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
it('merges a consumer inline style', () => {
|
|
206
|
-
render(
|
|
207
|
-
<FieldStatus
|
|
208
|
-
type="error"
|
|
209
|
-
message="msg"
|
|
210
|
-
style={{marginTop: '10px'}}
|
|
211
|
-
data-testid="fs"
|
|
212
|
-
/>,
|
|
213
|
-
);
|
|
214
|
-
expect(screen.getByTestId('fs')).toHaveStyle({marginTop: '10px'});
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
it('applies an xstyle as an extra class', () => {
|
|
218
|
-
const {rerender} = render(
|
|
219
|
-
<FieldStatus type="error" message="msg" data-testid="fs" />,
|
|
220
|
-
);
|
|
221
|
-
const withoutXstyle = screen.getByTestId('fs').getAttribute('class');
|
|
222
|
-
|
|
223
|
-
// xstyle values are compiled StyleX styles; passing one adds classes.
|
|
224
|
-
rerender(
|
|
225
|
-
<FieldStatus
|
|
226
|
-
type="error"
|
|
227
|
-
message="msg"
|
|
228
|
-
data-testid="fs"
|
|
229
|
-
xstyle={testStyles.custom}
|
|
230
|
-
/>,
|
|
231
|
-
);
|
|
232
|
-
const withXstyle = screen.getByTestId('fs').getAttribute('class');
|
|
233
|
-
expect(withXstyle).not.toEqual(withoutXstyle);
|
|
234
|
-
});
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
describe('dynamic updates', () => {
|
|
238
|
-
it('updates the rendered message on rerender', () => {
|
|
239
|
-
const {rerender} = render(
|
|
240
|
-
<FieldStatus type="error" message="First" data-testid="fs" />,
|
|
241
|
-
);
|
|
242
|
-
expect(screen.getByTestId('fs')).toHaveTextContent('First');
|
|
243
|
-
|
|
244
|
-
rerender(<FieldStatus type="error" message="Second" data-testid="fs" />);
|
|
245
|
-
expect(screen.getByTestId('fs')).toHaveTextContent('Second');
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
// Switching from error to a non-error type must relax both the role and
|
|
249
|
-
// the live-region politeness in lockstep.
|
|
250
|
-
it('relaxes role and aria-live when type changes from error', () => {
|
|
251
|
-
const {rerender} = render(
|
|
252
|
-
<FieldStatus type="error" message="msg" data-testid="fs" />,
|
|
253
|
-
);
|
|
254
|
-
let el = screen.getByTestId('fs');
|
|
255
|
-
expect(el).toHaveAttribute('role', 'alert');
|
|
256
|
-
expect(el).toHaveAttribute('aria-live', 'assertive');
|
|
257
|
-
|
|
258
|
-
rerender(<FieldStatus type="success" message="msg" data-testid="fs" />);
|
|
259
|
-
el = screen.getByTestId('fs');
|
|
260
|
-
expect(el).toHaveAttribute('role', 'status');
|
|
261
|
-
expect(el).toHaveAttribute('aria-live', 'polite');
|
|
262
|
-
});
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
describe('edge cases', () => {
|
|
266
|
-
it('renders an empty message without crashing', () => {
|
|
267
|
-
render(<FieldStatus type="error" message="" data-testid="fs" />);
|
|
268
|
-
const el = screen.getByTestId('fs');
|
|
269
|
-
expect(el).toBeInTheDocument();
|
|
270
|
-
expect(el).toHaveTextContent('');
|
|
271
|
-
});
|
|
272
|
-
|
|
273
|
-
it('renders message content verbatim, including whitespace-only strings', () => {
|
|
274
|
-
render(<FieldStatus type="warning" message=" " data-testid="fs" />);
|
|
275
|
-
expect(screen.getByTestId('fs').textContent).toBe(' ');
|
|
276
|
-
});
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
it('exposes a displayName for devtools', () => {
|
|
280
|
-
expect(FieldStatus.displayName).toBe('FieldStatus');
|
|
281
|
-
});
|
|
282
|
-
});
|