@astryxdesign/core 0.1.3 → 0.1.4-canary.01e5b29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -0
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +20 -18
- package/dist/AlertDialog/useImperativeAlertDialog.js +3 -3
- package/dist/AppShell/AppShell.d.ts +1 -1
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +55 -53
- package/dist/AspectRatio/AspectRatio.js +5 -5
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +27 -25
- package/dist/Avatar/AvatarStatusDot.js +5 -5
- package/dist/AvatarGroup/AvatarGroup.js +5 -5
- package/dist/AvatarGroup/AvatarGroupOverflow.js +5 -5
- package/dist/Badge/Badge.js +3 -3
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +32 -25
- package/dist/Blockquote/Blockquote.js +7 -7
- package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
- package/dist/Breadcrumbs/Breadcrumbs.js +7 -7
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +47 -26
- package/dist/ButtonGroup/ButtonGroup.js +7 -7
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +108 -64
- package/dist/Calendar/dayCellUtils.d.ts +67 -5
- package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
- package/dist/Calendar/dayCellUtils.js +139 -18
- package/dist/Calendar/styles.d.ts +2 -2
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +2 -2
- package/dist/Card/Card.d.ts +4 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +18 -10
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +20 -19
- package/dist/Center/Center.js +3 -3
- package/dist/Chat/ChatComposer.js +23 -23
- package/dist/Chat/ChatComposerDrawer.js +14 -14
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +27 -15
- package/dist/Chat/ChatDictationButton.d.ts +1 -1
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +13 -11
- package/dist/Chat/ChatLayout.js +17 -17
- package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +12 -10
- package/dist/Chat/ChatMessage.js +12 -12
- package/dist/Chat/ChatMessageBubble.js +7 -7
- package/dist/Chat/ChatMessageList.js +14 -14
- package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatMessageMetadata.js +14 -12
- package/dist/Chat/ChatPastedTextToken.js +13 -13
- package/dist/Chat/ChatSendButton.js +3 -3
- package/dist/Chat/ChatSystemMessage.d.ts +1 -1
- package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
- package/dist/Chat/ChatSystemMessage.js +17 -17
- package/dist/Chat/ChatTokenizedText.d.ts +1 -1
- package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
- package/dist/Chat/ChatTokenizedText.js +24 -15
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +81 -74
- package/dist/Chat/index.d.ts +1 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +15 -15
- package/dist/CheckboxInput/CheckboxInput.d.ts +6 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +32 -24
- package/dist/CheckboxList/CheckboxList.js +9 -9
- package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +8 -6
- package/dist/Citation/Citation.js +10 -10
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +32 -9
- package/dist/Code/Code.d.ts +15 -1
- package/dist/Code/Code.d.ts.map +1 -1
- package/dist/Code/Code.js +35 -5
- package/dist/Code/index.d.ts +1 -1
- package/dist/Code/index.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.d.ts +10 -1
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +88 -52
- package/dist/CodeBlock/index.d.ts +1 -1
- package/dist/CodeBlock/index.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.d.ts +9 -3
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +110 -22
- package/dist/Collapsible/CollapsibleGroup.d.ts +39 -7
- package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroup.js +73 -12
- package/dist/Collapsible/CollapsibleGroupContext.d.ts +31 -0
- package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroupContext.js +33 -3
- package/dist/Collapsible/index.d.ts +1 -0
- package/dist/Collapsible/index.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.d.ts +4 -1
- package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.js +20 -6
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +36 -34
- package/dist/CommandPalette/CommandPaletteEmpty.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteEmpty.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteEmpty.js +27 -7
- package/dist/CommandPalette/CommandPaletteFooter.js +16 -16
- package/dist/CommandPalette/CommandPaletteGroup.js +5 -5
- package/dist/CommandPalette/CommandPaletteInput.js +13 -13
- package/dist/CommandPalette/CommandPaletteItem.js +3 -3
- package/dist/CommandPalette/CommandPaletteList.js +3 -3
- package/dist/ContextMenu/ContextMenu.d.ts +9 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +16 -11
- package/dist/DateInput/DateInput.js +18 -18
- package/dist/DateRangeInput/DateRangeInput.js +23 -23
- package/dist/DateTimeInput/DateTimeInput.d.ts +5 -7
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +30 -26
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +9 -9
- package/dist/Dialog/DialogHeader.js +16 -16
- package/dist/Dialog/useImperativeDialog.js +3 -3
- package/dist/Divider/Divider.d.ts +0 -22
- package/dist/Divider/Divider.d.ts.map +1 -1
- package/dist/Divider/Divider.js +7 -7
- package/dist/DropdownMenu/DropdownMenu.js +10 -10
- package/dist/DropdownMenu/DropdownMenuItem.d.ts +2 -17
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
- package/dist/DropdownMenu/renderDropdownItems.js +10 -10
- package/dist/EmptyState/EmptyState.js +9 -9
- package/dist/Field/Field.js +17 -17
- package/dist/Field/FieldLabel.js +15 -15
- package/dist/Field/InputClearButton.js +5 -5
- package/dist/FieldStatus/FieldStatus.js +3 -3
- package/dist/FileInput/FileInput.js +29 -29
- package/dist/FormLayout/FormLayout.js +5 -5
- package/dist/Grid/Grid.d.ts +4 -3
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +29 -12
- package/dist/Grid/GridSpan.js +3 -3
- package/dist/HStack/HStack.js +3 -3
- package/dist/Heading/Heading.js +10 -10
- package/dist/HoverCard/HoverCard.js +9 -9
- package/dist/HoverCard/useHoverCard.js +3 -3
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +16 -12
- package/dist/Icon/defaultIcons.js +116 -116
- package/dist/IconButton/IconButton.js +3 -3
- package/dist/InputGroup/InputGroup.js +11 -11
- package/dist/InputGroup/InputGroupText.js +3 -3
- package/dist/Item/Item.js +18 -18
- package/dist/Kbd/Kbd.js +5 -5
- package/dist/Layer/LayerProvider.js +7 -7
- package/dist/Layer/useLayer.js +5 -5
- package/dist/Layout/Layout.js +21 -21
- package/dist/Layout/LayoutContent.js +3 -3
- package/dist/Layout/LayoutFooter.js +5 -5
- package/dist/Layout/LayoutHeader.js +5 -5
- package/dist/Layout/LayoutPanel.js +3 -3
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +55 -31
- package/dist/Lightbox/useLightbox.js +3 -3
- package/dist/Link/Link.js +15 -15
- package/dist/Link/LinkProvider.js +3 -3
- package/dist/Link/useLinkify.js +3 -3
- package/dist/List/List.js +11 -11
- package/dist/List/ListItem.js +11 -11
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +102 -102
- package/dist/Markdown/parser.d.ts +7 -0
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +300 -6
- package/dist/MetadataList/MetadataList.js +10 -10
- package/dist/MetadataList/MetadataListItem.js +15 -15
- package/dist/MobileNav/MobileNav.js +15 -15
- package/dist/MobileNav/MobileNavToggle.js +5 -5
- package/dist/MoreMenu/MoreMenu.js +3 -3
- package/dist/MultiSelector/MultiSelector.d.ts +7 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +64 -55
- package/dist/NavIcon/NavIcon.js +3 -3
- package/dist/NavMenu/NavHeadingMenu.js +5 -5
- package/dist/NavMenu/NavHeadingMenuItem.js +8 -8
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +48 -32
- package/dist/Outline/Outline.js +15 -15
- package/dist/OverflowList/OverflowList.js +8 -8
- package/dist/Overlay/Overlay.js +3 -3
- package/dist/Overlay/OverlayScrim.js +5 -5
- package/dist/Overlay/useOverlay.js +3 -3
- package/dist/Pagination/Pagination.d.ts +1 -1
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +125 -72
- package/dist/Popover/Popover.js +16 -16
- package/dist/Popover/usePopover.js +7 -7
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +110 -92
- package/dist/PowerSearch/PowerSearchEditPopover.js +84 -84
- package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
- package/dist/PowerSearch/PowerSearchToken.js +5 -5
- package/dist/PowerSearch/PowerSearchValueEditor.js +54 -54
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +25 -18
- package/dist/RadioList/RadioList.d.ts +7 -1
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +10 -8
- package/dist/RadioList/RadioListItem.d.ts +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +30 -22
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +28 -10
- package/dist/Section/Section.js +5 -5
- package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +32 -10
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +18 -12
- package/dist/SelectableCard/SelectableCard.js +5 -5
- package/dist/Selector/Selector.d.ts +6 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +54 -45
- package/dist/Selector/SelectorOption.js +3 -3
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +38 -34
- package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +8 -6
- package/dist/SideNav/SideNavHeading.js +87 -87
- package/dist/SideNav/SideNavItem.js +42 -42
- package/dist/SideNav/SideNavSection.d.ts +1 -1
- package/dist/SideNav/SideNavSection.d.ts.map +1 -1
- package/dist/SideNav/SideNavSection.js +18 -16
- package/dist/Skeleton/Skeleton.js +3 -3
- package/dist/Slider/Slider.d.ts +6 -0
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +31 -22
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +10 -10
- package/dist/StatusDot/StatusDot.js +5 -5
- package/dist/Switch/Switch.d.ts +13 -4
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +41 -30
- package/dist/TabList/Tab.js +18 -18
- package/dist/TabList/TabList.js +5 -5
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +57 -30
- package/dist/TabList/tab.markers.stylex.d.ts +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +51 -39
- package/dist/Table/Table.js +7 -7
- package/dist/Table/TableBody.d.ts +1 -1
- package/dist/Table/TableBody.d.ts.map +1 -1
- package/dist/Table/TableBody.js +9 -5
- package/dist/Table/TableCell.d.ts.map +1 -1
- package/dist/Table/TableCell.js +76 -7
- package/dist/Table/TableFooter.d.ts +1 -1
- package/dist/Table/TableFooter.d.ts.map +1 -1
- package/dist/Table/TableFooter.js +9 -5
- package/dist/Table/TableHeader.d.ts +1 -1
- package/dist/Table/TableHeader.d.ts.map +1 -1
- package/dist/Table/TableHeader.js +9 -5
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/TableRow.js +5 -5
- package/dist/Table/index.d.ts +2 -0
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -0
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +14 -11
- package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
- package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/paginateData.js +5 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
- package/dist/Table/plugins/rowExpansion/index.d.ts +3 -0
- package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -0
- package/dist/Table/plugins/rowExpansion/index.js +3 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +90 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +398 -0
- package/dist/Table/plugins/selection/useTableSelection.js +18 -18
- package/dist/Table/plugins/selection/useTableSelectionState.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelectionState.js +11 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +17 -17
- package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortableState.js +8 -4
- package/dist/Table/tableContextMenu.d.ts +5 -1
- package/dist/Table/tableContextMenu.d.ts.map +1 -1
- package/dist/Table/tableContextMenu.js +19 -12
- package/dist/Text/Text.d.ts +1 -1
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +14 -13
- package/dist/Text/text.stylex.d.ts +35 -0
- package/dist/Text/text.stylex.d.ts.map +1 -1
- package/dist/Text/text.stylex.js +52 -1
- package/dist/TextArea/TextArea.js +14 -14
- package/dist/TextInput/TextInput.js +15 -15
- package/dist/Thumbnail/Thumbnail.d.ts +3 -2
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +30 -29
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +26 -21
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +37 -26
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +25 -17
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +23 -11
- package/dist/Toast/useToast.js +4 -4
- package/dist/ToggleButton/ToggleButton.js +12 -12
- package/dist/ToggleButton/ToggleButtonGroup.js +5 -5
- package/dist/Token/Token.js +21 -21
- package/dist/Tokenizer/Tokenizer.d.ts +6 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +38 -29
- package/dist/Toolbar/Toolbar.js +18 -18
- package/dist/Tooltip/Tooltip.js +11 -11
- package/dist/Tooltip/useTooltip.js +3 -3
- package/dist/TopNav/TopNav.js +32 -32
- package/dist/TopNav/TopNavHeading.js +67 -67
- package/dist/TopNav/TopNavItem.js +5 -5
- package/dist/TopNav/TopNavMegaMenu.js +30 -30
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +25 -14
- package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
- package/dist/TopNav/TopNavMenu.js +32 -32
- package/dist/TreeList/TreeList.js +8 -8
- package/dist/TreeList/TreeListBranches.js +11 -11
- package/dist/TreeList/TreeListItem.js +30 -30
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +23 -20
- package/dist/Typeahead/Typeahead.js +12 -12
- package/dist/Typeahead/TypeaheadItem.js +10 -10
- package/dist/VStack/VStack.js +3 -3
- package/dist/astryx.css +23 -0
- package/dist/astryx.umd.js +60 -58
- package/dist/astryx.umd.js.map +4 -4
- package/dist/docs-types.d.ts +13 -1
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/hooks/focusableSelector.d.ts +1 -1
- package/dist/hooks/focusableSelector.d.ts.map +1 -1
- package/dist/hooks/focusableSelector.js +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useFocusTrap.d.ts +3 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +38 -1
- package/dist/hooks/useHotkeys.d.ts +51 -0
- package/dist/hooks/useHotkeys.d.ts.map +1 -0
- package/dist/hooks/useHotkeys.js +160 -0
- package/dist/hooks/useInteractiveRole.d.ts +6 -2
- package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
- package/dist/hooks/useInteractiveRole.js +6 -2
- package/dist/hooks/useKeyboardHint.js +9 -9
- package/dist/hooks/useStreamingText.d.ts +3 -1
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +14 -5
- package/dist/theme/MediaTheme.js +3 -3
- package/dist/theme/Theme.js +7 -7
- package/dist/theme/defineTheme.d.ts +1 -1
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/expandColorScale.d.ts.map +1 -1
- package/dist/theme/expandColorScale.js +10 -3
- package/dist/theme/hct.d.ts +0 -15
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +9 -9
- package/dist/theme/syntax/SyntaxTheme.js +5 -5
- package/dist/theme/tokens.d.ts +10 -2
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +220 -4
- package/dist/utils/color.d.ts +42 -0
- package/dist/utils/color.d.ts.map +1 -0
- package/dist/utils/color.js +150 -0
- package/dist/utils/composeEventHandlers.d.ts +30 -0
- package/dist/utils/composeEventHandlers.d.ts.map +1 -0
- package/dist/utils/composeEventHandlers.js +40 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -1
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +8 -5
- package/package.json +3 -3
- package/src/AlertDialog/AlertDialog.tsx +2 -0
- package/src/AppShell/AppShell.tsx +2 -0
- package/src/AspectRatio/AspectRatio.doc.mjs +1 -1
- package/src/Avatar/Avatar.doc.mjs +13 -2
- package/src/Avatar/Avatar.test.tsx +32 -1
- package/src/Avatar/Avatar.tsx +12 -20
- package/src/Banner/Banner.doc.mjs +8 -0
- package/src/Banner/Banner.test.tsx +38 -0
- package/src/Banner/Banner.tsx +8 -1
- package/src/Button/Button.tsx +39 -6
- package/src/ButtonGroup/ButtonGroup.doc.mjs +1 -1
- package/src/Calendar/Calendar.doc.mjs +1 -1
- package/src/Calendar/Calendar.test.tsx +201 -17
- package/src/Calendar/Calendar.tsx +79 -26
- package/src/Calendar/dayCellUtils.test.ts +306 -1
- package/src/Calendar/dayCellUtils.ts +206 -13
- package/src/Calendar/styles.ts +12 -2
- package/src/Card/Card.doc.mjs +1 -1
- package/src/Card/Card.tsx +16 -6
- package/src/Carousel/Carousel.doc.mjs +12 -12
- package/src/Carousel/Carousel.test.tsx +13 -0
- package/src/Carousel/Carousel.tsx +1 -0
- package/src/Chat/Chat.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.test.tsx +24 -0
- package/src/Chat/ChatComposerInput.tsx +17 -1
- package/src/Chat/ChatDictationButton.test.tsx +43 -0
- package/src/Chat/ChatDictationButton.tsx +4 -4
- package/src/Chat/ChatLayoutScrollButton.test.tsx +33 -0
- package/src/Chat/ChatLayoutScrollButton.tsx +3 -1
- package/src/Chat/ChatMessageMetadata.test.tsx +32 -0
- package/src/Chat/ChatMessageMetadata.tsx +4 -6
- package/src/Chat/ChatSystemMessage.test.tsx +26 -11
- package/src/Chat/ChatSystemMessage.tsx +7 -7
- package/src/Chat/ChatTokenizedText.test.tsx +29 -16
- package/src/Chat/ChatTokenizedText.tsx +15 -8
- package/src/Chat/ChatToolCalls.test.tsx +55 -0
- package/src/Chat/ChatToolCalls.tsx +10 -12
- package/src/Chat/index.ts +1 -4
- package/src/Chat/useChatNewMessages.test.tsx +4 -4
- package/src/CheckboxInput/CheckboxInput.doc.mjs +12 -4
- package/src/CheckboxInput/CheckboxInput.test.tsx +103 -0
- package/src/CheckboxInput/CheckboxInput.tsx +13 -0
- package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
- package/src/CheckboxList/CheckboxList.test.tsx +19 -0
- package/src/CheckboxList/CheckboxListItem.tsx +11 -2
- package/src/Citation/Citation.doc.mjs +5 -0
- package/src/ClickableCard/ClickableCard.tsx +45 -2
- package/src/Code/Code.test.tsx +54 -0
- package/src/Code/Code.tsx +48 -4
- package/src/Code/index.ts +1 -1
- package/src/CodeBlock/CodeBlock.doc.mjs +7 -2
- package/src/CodeBlock/CodeBlock.test.tsx +122 -3
- package/src/CodeBlock/CodeBlock.tsx +62 -4
- package/src/CodeBlock/index.ts +1 -1
- package/src/Collapsible/Collapsible.doc.mjs +8 -4
- package/src/Collapsible/Collapsible.test.tsx +405 -0
- package/src/Collapsible/Collapsible.tsx +86 -10
- package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
- package/src/Collapsible/CollapsibleGroup.test.tsx +318 -0
- package/src/Collapsible/CollapsibleGroup.tsx +107 -9
- package/src/Collapsible/CollapsibleGroupContext.tsx +42 -2
- package/src/Collapsible/index.ts +4 -0
- package/src/Collapsible/useCollapsible.ts +20 -6
- package/src/CommandPalette/CommandPalette.tsx +5 -3
- package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
- package/src/CommandPalette/CommandPaletteEmpty.tsx +15 -1
- package/src/CommandPalette/CommandPaletteGroup.doc.mjs +10 -0
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +6 -0
- package/src/CommandPalette/CommandPaletteItem.doc.mjs +6 -0
- package/src/CommandPalette/CommandPaletteList.doc.mjs +9 -0
- package/src/ContextMenu/ContextMenu.doc.mjs +15 -0
- package/src/ContextMenu/ContextMenu.test.tsx +15 -0
- package/src/ContextMenu/ContextMenu.tsx +19 -1
- package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
- package/src/DateInput/DateInput.doc.mjs +6 -1
- package/src/DateInput/DateInput.test.tsx +11 -20
- package/src/DateRangeInput/DateRangeInput.doc.mjs +1 -1
- package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
- package/src/DateRangeInput/DateRangeInput.tsx +2 -2
- package/src/DateTimeInput/DateTimeInput.doc.mjs +4 -3
- package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
- package/src/DateTimeInput/DateTimeInput.tsx +9 -8
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/DialogHeader.doc.mjs +45 -0
- package/src/Divider/Divider.tsx +1 -23
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenu.test.tsx +5 -3
- package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
- package/src/EmptyState/EmptyState.doc.mjs +1 -1
- package/src/Field/Field.doc.mjs +1 -1
- package/src/Field/FieldLabel.test.tsx +2 -2
- package/src/FieldStatus/FieldStatus.test.tsx +282 -0
- package/src/FileInput/FileInput.doc.mjs +1 -1
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
- package/src/Grid/Grid.doc.mjs +3 -3
- package/src/Grid/Grid.test.tsx +43 -18
- package/src/Grid/Grid.tsx +26 -9
- package/src/Icon/Icon.test.tsx +41 -29
- package/src/Icon/Icon.tsx +6 -2
- package/src/InputGroup/InputGroup.tsx +2 -2
- package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
- package/src/Item/Item.tsx +1 -1
- package/src/Layout/Layout.test.tsx +285 -0
- package/src/Layout/LayoutContent.doc.mjs +12 -0
- package/src/Layout/LayoutPanel.doc.mjs +40 -0
- package/src/Layout/LayoutSlots.test.tsx +364 -0
- package/src/Layout/__tests__/edgeCompensation.test.tsx +72 -0
- package/src/Lightbox/Lightbox.doc.mjs +5 -0
- package/src/Lightbox/Lightbox.test.tsx +123 -2
- package/src/Lightbox/Lightbox.tsx +29 -1
- package/src/Markdown/Markdown.test.tsx +23 -0
- package/src/Markdown/Markdown.tsx +9 -7
- package/src/Markdown/incremental.test.ts +36 -0
- package/src/Markdown/parser.perf.test.ts +34 -12
- package/src/Markdown/parser.test.ts +210 -0
- package/src/Markdown/parser.ts +301 -6
- package/src/MobileNav/MobileNav.doc.mjs +20 -0
- package/src/MultiSelector/MultiSelector.doc.mjs +14 -1
- package/src/MultiSelector/MultiSelector.test.tsx +33 -0
- package/src/MultiSelector/MultiSelector.tsx +20 -0
- package/src/NavMenu/NavMenu.doc.mjs +15 -0
- package/src/NumberInput/NumberInput.test.tsx +48 -3
- package/src/NumberInput/NumberInput.tsx +32 -15
- package/src/Outline/parseOutlineFromMarkdown.test.ts +80 -0
- package/src/OverflowList/OverflowList.test.tsx +416 -0
- package/src/Overlay/Overlay.doc.mjs +6 -0
- package/src/Overlay/Overlay.test.tsx +356 -0
- package/src/Pagination/Pagination.test.tsx +162 -0
- package/src/Pagination/Pagination.tsx +80 -26
- package/src/Popover/Popover.test.tsx +65 -0
- package/src/PowerSearch/PowerSearch.doc.mjs +4 -4
- package/src/PowerSearch/PowerSearch.test.tsx +109 -1
- package/src/PowerSearch/PowerSearch.tsx +37 -16
- package/src/ProgressBar/ProgressBar.test.tsx +30 -0
- package/src/ProgressBar/ProgressBar.tsx +12 -5
- package/src/RadioList/RadioList.doc.mjs +7 -1
- package/src/RadioList/RadioList.test.tsx +65 -0
- package/src/RadioList/RadioList.tsx +10 -1
- package/src/RadioList/RadioListItem.tsx +13 -4
- package/src/Resizable/ResizeHandle.test.tsx +218 -0
- package/src/Resizable/ResizeHandle.tsx +22 -4
- package/src/Section/Section.test.tsx +4 -10
- package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
- package/src/SegmentedControl/SegmentedControl.test.tsx +192 -0
- package/src/SegmentedControl/SegmentedControl.tsx +27 -5
- package/src/SegmentedControl/SegmentedControlItem.tsx +9 -4
- package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
- package/src/Selector/Selector.doc.mjs +12 -1
- package/src/Selector/Selector.test.tsx +30 -0
- package/src/Selector/Selector.tsx +18 -0
- package/src/SideNav/SideNav.doc.mjs +7 -1
- package/src/SideNav/SideNav.test.tsx +66 -0
- package/src/SideNav/SideNav.tsx +6 -2
- package/src/SideNav/SideNavCollapseButton.tsx +4 -3
- package/src/SideNav/SideNavSection.tsx +6 -4
- package/src/SizeContext/SizeContext.test.tsx +226 -0
- package/src/Slider/Slider.doc.mjs +14 -2
- package/src/Slider/Slider.test.tsx +30 -0
- package/src/Slider/Slider.tsx +20 -0
- package/src/Spinner/Spinner.tsx +1 -0
- package/src/Switch/Switch.doc.mjs +21 -9
- package/src/Switch/Switch.test.tsx +137 -0
- package/src/Switch/Switch.tsx +32 -7
- package/src/TabList/TabList.doc.mjs +3 -3
- package/src/TabList/TabList.test.tsx +185 -1
- package/src/TabList/TabMenu.tsx +45 -9
- package/src/Table/BaseTable.tsx +16 -3
- package/src/Table/Table.test.tsx +87 -0
- package/src/Table/TableBody.tsx +15 -2
- package/src/Table/TableCell.tsx +87 -8
- package/src/Table/TableFooter.tsx +15 -2
- package/src/Table/TableHeader.tsx +15 -2
- package/src/Table/index.ts +5 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +13 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +3 -1
- package/src/Table/plugins/pagination/paginateData.ts +5 -1
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
- package/src/Table/plugins/rowExpansion/index.ts +7 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +155 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +590 -0
- package/src/Table/plugins/selection/useTableSelectionState.test.tsx +23 -0
- package/src/Table/plugins/selection/useTableSelectionState.tsx +11 -6
- package/src/Table/plugins/sortable/useTableSortableState.test.tsx +35 -1
- package/src/Table/plugins/sortable/useTableSortableState.tsx +8 -4
- package/src/Table/tableContextMenu.test.tsx +27 -3
- package/src/Table/tableContextMenu.tsx +20 -2
- package/src/Table/useTablePagination.doc.mjs +4 -1
- package/src/Table/useTableRowExpansion.doc.mjs +80 -0
- package/src/Table/useTableSortable.doc.mjs +4 -1
- package/src/Text/Text.doc.mjs +2 -2
- package/src/Text/Text.test.tsx +11 -0
- package/src/Text/Text.tsx +4 -2
- package/src/Text/text.stylex.ts +41 -0
- package/src/TextArea/TextArea.doc.mjs +1 -1
- package/src/TextArea/TextArea.test.tsx +3 -3
- package/src/TextInput/TextInput.doc.mjs +1 -1
- package/src/TextInput/TextInput.test.tsx +3 -3
- package/src/Thumbnail/Thumbnail.test.tsx +36 -2
- package/src/Thumbnail/Thumbnail.tsx +4 -2
- package/src/TimeInput/TimeInput.doc.mjs +11 -6
- package/src/TimeInput/TimeInput.test.tsx +37 -0
- package/src/TimeInput/TimeInput.tsx +11 -1
- package/src/Timestamp/Timestamp.doc.mjs +1 -1
- package/src/Timestamp/Timestamp.test.tsx +52 -0
- package/src/Timestamp/Timestamp.tsx +30 -16
- package/src/Toast/Toast.tsx +11 -3
- package/src/Toast/ToastViewport.test.tsx +64 -0
- package/src/Toast/ToastViewport.tsx +12 -0
- package/src/ToggleButton/ToggleButton.doc.mjs +1 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +16 -4
- package/src/Tokenizer/Tokenizer.test.tsx +33 -0
- package/src/Tokenizer/Tokenizer.tsx +19 -0
- package/src/Toolbar/Toolbar.test.tsx +1 -1
- package/src/TopNav/TopNav.doc.mjs +1 -1
- package/src/TopNav/TopNav.test.tsx +18 -0
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +9 -2
- package/src/TreeList/TreeList.doc.mjs +2 -2
- package/src/Typeahead/BaseTypeahead.doc.mjs +19 -0
- package/src/Typeahead/BaseTypeahead.tsx +5 -2
- package/src/Typeahead/Typeahead.doc.mjs +7 -2
- package/src/Typeahead/Typeahead.test.tsx +45 -1
- package/src/__tests__/TestIcon.tsx +26 -0
- package/src/__tests__/fastRoleQueries.ts +66 -0
- package/src/docPropReferences.test.ts +178 -0
- package/src/docs-types.ts +14 -0
- package/src/hooks/focusableSelector.ts +1 -1
- package/src/hooks/index.ts +3 -0
- package/src/hooks/useFocusTrap.doc.mjs +4 -2
- package/src/hooks/useFocusTrap.test.tsx +149 -1
- package/src/hooks/useFocusTrap.ts +50 -1
- package/src/hooks/useHotkeys.doc.mjs +52 -0
- package/src/hooks/useHotkeys.test.ts +245 -0
- package/src/hooks/useHotkeys.ts +203 -0
- package/src/hooks/useInteractiveRole.ts +12 -4
- package/src/hooks/useKeyboardHint.doc.mjs +6 -6
- package/src/hooks/useStreamingText.test.ts +54 -19
- package/src/hooks/useStreamingText.ts +16 -5
- package/src/theme/SyntaxTheme.doc.mjs +4 -4
- package/src/theme/defineTheme.ts +4 -13
- package/src/theme/derivedVarRegistry.test.ts +2 -2
- package/src/theme/expandColorScale.test.ts +29 -0
- package/src/theme/expandColorScale.ts +11 -6
- package/src/theme/hct.ts +9 -17
- package/src/theme/tokens.test.ts +182 -9
- package/src/theme/tokens.ts +239 -4
- package/src/theme/useTheme.test.tsx +20 -0
- package/src/utils/color.test.ts +133 -0
- package/src/utils/color.ts +148 -0
- package/src/utils/composeEventHandlers.test.ts +71 -0
- package/src/utils/composeEventHandlers.ts +44 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/mergeProps.test.ts +166 -0
- package/src/utils/sharedResizeObserver.test.ts +2 -2
- package/src/utils/timeParser.test.ts +13 -0
- package/src/utils/timeParser.ts +8 -5
package/src/Icon/Icon.test.tsx
CHANGED
|
@@ -11,48 +11,48 @@
|
|
|
11
11
|
|
|
12
12
|
import {describe, it, expect, vi} from 'vitest';
|
|
13
13
|
import {render, screen} from '@testing-library/react';
|
|
14
|
-
import {
|
|
14
|
+
import {TestIcon} from '../__tests__/TestIcon';
|
|
15
15
|
import {Icon} from './Icon';
|
|
16
16
|
|
|
17
17
|
describe('Icon', () => {
|
|
18
18
|
it('renders the icon component', () => {
|
|
19
|
-
render(<Icon icon={
|
|
19
|
+
render(<Icon icon={TestIcon} data-testid="icon" />);
|
|
20
20
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
21
21
|
});
|
|
22
22
|
|
|
23
23
|
it('renders as an SVG element', () => {
|
|
24
|
-
render(<Icon icon={
|
|
24
|
+
render(<Icon icon={TestIcon} data-testid="icon" />);
|
|
25
25
|
const icon = screen.getByTestId('icon');
|
|
26
26
|
expect(icon.tagName.toLowerCase()).toBe('svg');
|
|
27
27
|
});
|
|
28
28
|
|
|
29
29
|
it('applies aria-hidden by default', () => {
|
|
30
|
-
render(<Icon icon={
|
|
30
|
+
render(<Icon icon={TestIcon} data-testid="icon" />);
|
|
31
31
|
expect(screen.getByTestId('icon')).toHaveAttribute('aria-hidden', 'true');
|
|
32
32
|
});
|
|
33
33
|
|
|
34
34
|
it('renders with different color variants', () => {
|
|
35
35
|
const {rerender} = render(
|
|
36
|
-
<Icon icon={
|
|
36
|
+
<Icon icon={TestIcon} color="primary" data-testid="icon" />,
|
|
37
37
|
);
|
|
38
38
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
39
39
|
|
|
40
|
-
rerender(<Icon icon={
|
|
40
|
+
rerender(<Icon icon={TestIcon} color="secondary" data-testid="icon" />);
|
|
41
41
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
42
42
|
|
|
43
|
-
rerender(<Icon icon={
|
|
43
|
+
rerender(<Icon icon={TestIcon} color="accent" data-testid="icon" />);
|
|
44
44
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
45
45
|
|
|
46
|
-
rerender(<Icon icon={
|
|
46
|
+
rerender(<Icon icon={TestIcon} color="success" data-testid="icon" />);
|
|
47
47
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
48
48
|
|
|
49
|
-
rerender(<Icon icon={
|
|
49
|
+
rerender(<Icon icon={TestIcon} color="error" data-testid="icon" />);
|
|
50
50
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
51
51
|
|
|
52
|
-
rerender(<Icon icon={
|
|
52
|
+
rerender(<Icon icon={TestIcon} color="warning" data-testid="icon" />);
|
|
53
53
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
54
54
|
|
|
55
|
-
rerender(<Icon icon={
|
|
55
|
+
rerender(<Icon icon={TestIcon} color="inherit" data-testid="icon" />);
|
|
56
56
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
57
57
|
});
|
|
58
58
|
|
|
@@ -70,50 +70,41 @@ describe('Icon', () => {
|
|
|
70
70
|
'purple',
|
|
71
71
|
] as const;
|
|
72
72
|
const {rerender} = render(
|
|
73
|
-
<Icon
|
|
74
|
-
icon={HomeIcon}
|
|
75
|
-
color={nonSemanticColors[0]}
|
|
76
|
-
data-testid="icon"
|
|
77
|
-
/>,
|
|
73
|
+
<Icon icon={TestIcon} color={nonSemanticColors[0]} data-testid="icon" />,
|
|
78
74
|
);
|
|
79
75
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
80
76
|
|
|
81
77
|
for (const c of nonSemanticColors.slice(1)) {
|
|
82
|
-
rerender(<Icon icon={
|
|
78
|
+
rerender(<Icon icon={TestIcon} color={c} data-testid="icon" />);
|
|
83
79
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
84
80
|
}
|
|
85
81
|
});
|
|
86
82
|
|
|
87
83
|
it('renders with different size variants', () => {
|
|
88
84
|
const {rerender} = render(
|
|
89
|
-
<Icon icon={
|
|
85
|
+
<Icon icon={TestIcon} size="xsm" data-testid="icon" />,
|
|
90
86
|
);
|
|
91
87
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
92
88
|
|
|
93
|
-
rerender(<Icon icon={
|
|
89
|
+
rerender(<Icon icon={TestIcon} size="sm" data-testid="icon" />);
|
|
94
90
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
95
91
|
|
|
96
|
-
rerender(<Icon icon={
|
|
92
|
+
rerender(<Icon icon={TestIcon} size="md" data-testid="icon" />);
|
|
97
93
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
98
94
|
|
|
99
|
-
rerender(<Icon icon={
|
|
95
|
+
rerender(<Icon icon={TestIcon} size="lg" data-testid="icon" />);
|
|
100
96
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
101
97
|
});
|
|
102
98
|
|
|
103
99
|
it('forwards ref correctly', () => {
|
|
104
100
|
const ref = vi.fn();
|
|
105
|
-
render(<Icon icon={
|
|
101
|
+
render(<Icon icon={TestIcon} ref={ref} />);
|
|
106
102
|
expect(ref).toHaveBeenCalledWith(expect.any(SVGSVGElement));
|
|
107
103
|
});
|
|
108
104
|
|
|
109
105
|
it('passes additional SVG props', () => {
|
|
110
106
|
render(
|
|
111
|
-
<Icon
|
|
112
|
-
icon={HomeIcon}
|
|
113
|
-
data-testid="icon"
|
|
114
|
-
role="img"
|
|
115
|
-
aria-label="Home"
|
|
116
|
-
/>,
|
|
107
|
+
<Icon icon={TestIcon} data-testid="icon" role="img" aria-label="Home" />,
|
|
117
108
|
);
|
|
118
109
|
const icon = screen.getByTestId('icon');
|
|
119
110
|
expect(icon).toHaveAttribute('role', 'img');
|
|
@@ -121,8 +112,29 @@ describe('Icon', () => {
|
|
|
121
112
|
});
|
|
122
113
|
|
|
123
114
|
it('uses default color and size when not specified', () => {
|
|
124
|
-
render(<Icon icon={
|
|
115
|
+
render(<Icon icon={TestIcon} data-testid="icon" />);
|
|
125
116
|
// The component should render without errors with defaults
|
|
126
117
|
expect(screen.getByTestId('icon')).toBeInTheDocument();
|
|
127
118
|
});
|
|
119
|
+
|
|
120
|
+
it('applies aria-hidden by default in string (registry) mode', () => {
|
|
121
|
+
render(<Icon icon="check" data-testid="icon" />);
|
|
122
|
+
expect(screen.getByTestId('icon')).toHaveAttribute('aria-hidden', 'true');
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('lets a string-mode icon be made meaningful by overriding aria-hidden', () => {
|
|
126
|
+
render(
|
|
127
|
+
<Icon
|
|
128
|
+
icon="check"
|
|
129
|
+
data-testid="icon"
|
|
130
|
+
role="img"
|
|
131
|
+
aria-label="Done"
|
|
132
|
+
aria-hidden={false}
|
|
133
|
+
/>,
|
|
134
|
+
);
|
|
135
|
+
const icon = screen.getByTestId('icon');
|
|
136
|
+
expect(icon).toHaveAttribute('role', 'img');
|
|
137
|
+
expect(icon).toHaveAttribute('aria-label', 'Done');
|
|
138
|
+
expect(icon).toHaveAttribute('aria-hidden', 'false');
|
|
139
|
+
});
|
|
128
140
|
});
|
package/src/Icon/Icon.tsx
CHANGED
|
@@ -281,12 +281,16 @@ function IconFromRegistry({
|
|
|
281
281
|
|
|
282
282
|
return (
|
|
283
283
|
<span
|
|
284
|
+
// Decorative by default, but placed BEFORE the prop spread so consumers
|
|
285
|
+
// can override it (e.g. `aria-hidden={false}` + `role="img"` +
|
|
286
|
+
// `aria-label`) to expose a meaningful standalone icon. This matches
|
|
287
|
+
// component-mode Icon, which already sets aria-hidden before its spread.
|
|
288
|
+
aria-hidden="true"
|
|
284
289
|
{...(spanProps as React.HTMLAttributes<HTMLSpanElement>)}
|
|
285
290
|
{...mergeProps(
|
|
286
291
|
themeProps('icon', {size, color}),
|
|
287
292
|
stylex.props(styles.span, colorStyles[color], spanSizeStyles[size]),
|
|
288
|
-
)}
|
|
289
|
-
aria-hidden="true">
|
|
293
|
+
)}>
|
|
290
294
|
{resolvedIcon}
|
|
291
295
|
</span>
|
|
292
296
|
);
|
|
@@ -201,11 +201,11 @@ export function InputGroup({
|
|
|
201
201
|
labelTooltip={labelTooltip}>
|
|
202
202
|
<div
|
|
203
203
|
ref={ref}
|
|
204
|
+
data-testid={testId}
|
|
205
|
+
{...rest}
|
|
204
206
|
role="group"
|
|
205
207
|
aria-labelledby={labelID}
|
|
206
208
|
aria-describedby={describedByIDs}
|
|
207
|
-
data-testid={testId}
|
|
208
|
-
{...rest}
|
|
209
209
|
{...mergeProps(
|
|
210
210
|
themeProps('input-group', {
|
|
211
211
|
size,
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file InteractiveRoleContext.test.tsx
|
|
5
|
+
* @input Uses vitest, @testing-library/react, InteractiveRoleContext + useInteractiveRole
|
|
6
|
+
* @output Characterization tests for the interactive-role override context
|
|
7
|
+
* @position Testing; validates the role-override contract and its consumption
|
|
8
|
+
* by useInteractiveRole
|
|
9
|
+
*
|
|
10
|
+
* SYNC: When InteractiveRoleContext.ts changes, update tests to match new behavior
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {describe, it, expect} from 'vitest';
|
|
14
|
+
import {renderHook} from '@testing-library/react';
|
|
15
|
+
import {createElement, type ReactNode} from 'react';
|
|
16
|
+
import {
|
|
17
|
+
InteractiveRoleContext,
|
|
18
|
+
useInteractiveRoleContext,
|
|
19
|
+
} from './InteractiveRoleContext';
|
|
20
|
+
import {
|
|
21
|
+
useInteractiveRole,
|
|
22
|
+
type InteractiveRole,
|
|
23
|
+
} from '../hooks/useInteractiveRole';
|
|
24
|
+
|
|
25
|
+
/** Wrap children in an InteractiveRoleContext provider set to `role`. */
|
|
26
|
+
function withRole(role: InteractiveRole | null) {
|
|
27
|
+
return function Wrapper({children}: {children: ReactNode}) {
|
|
28
|
+
return (
|
|
29
|
+
<InteractiveRoleContext value={role}>{children}</InteractiveRoleContext>
|
|
30
|
+
);
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
describe('InteractiveRoleContext', () => {
|
|
35
|
+
describe('context primitive', () => {
|
|
36
|
+
it('defaults to null when read with no provider', () => {
|
|
37
|
+
const {result} = renderHook(() => useInteractiveRoleContext());
|
|
38
|
+
expect(result.current).toBeNull();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('exposes a displayName for devtools', () => {
|
|
42
|
+
expect(InteractiveRoleContext.displayName).toBe('InteractiveRoleContext');
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('returns the provided role override', () => {
|
|
46
|
+
const {result} = renderHook(() => useInteractiveRoleContext(), {
|
|
47
|
+
wrapper: withRole('button'),
|
|
48
|
+
});
|
|
49
|
+
expect(result.current).toBe('button');
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('returns null when a provider explicitly supplies null', () => {
|
|
53
|
+
const {result} = renderHook(() => useInteractiveRoleContext(), {
|
|
54
|
+
wrapper: withRole(null),
|
|
55
|
+
});
|
|
56
|
+
expect(result.current).toBeNull();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it.each(['link', 'button', 'inert'] as const)(
|
|
60
|
+
'passes through the "%s" override verbatim',
|
|
61
|
+
role => {
|
|
62
|
+
const {result} = renderHook(() => useInteractiveRoleContext(), {
|
|
63
|
+
wrapper: withRole(role),
|
|
64
|
+
});
|
|
65
|
+
expect(result.current).toBe(role);
|
|
66
|
+
},
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
it('resolves to the nearest provider when nested', () => {
|
|
70
|
+
function Nested({children}: {children: ReactNode}) {
|
|
71
|
+
return (
|
|
72
|
+
<InteractiveRoleContext value="link">
|
|
73
|
+
<InteractiveRoleContext value="button">
|
|
74
|
+
{children}
|
|
75
|
+
</InteractiveRoleContext>
|
|
76
|
+
</InteractiveRoleContext>
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
const {result} = renderHook(() => useInteractiveRoleContext(), {
|
|
80
|
+
wrapper: Nested,
|
|
81
|
+
});
|
|
82
|
+
expect(result.current).toBe('button');
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('supports the createElement (no-JSX) provider form', () => {
|
|
86
|
+
const {result} = renderHook(() => useInteractiveRoleContext(), {
|
|
87
|
+
wrapper: ({children}: {children: ReactNode}) =>
|
|
88
|
+
createElement(InteractiveRoleContext, {value: 'button'}, children),
|
|
89
|
+
});
|
|
90
|
+
expect(result.current).toBe('button');
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
// useInteractiveRole is the real consumer of this context; these tests pin
|
|
95
|
+
// down how the context signal participates in the role-resolution priority.
|
|
96
|
+
describe('consumption via useInteractiveRole', () => {
|
|
97
|
+
it('href alone resolves to "link"', () => {
|
|
98
|
+
const {result} = renderHook(() =>
|
|
99
|
+
useInteractiveRole({href: '/somewhere'}),
|
|
100
|
+
);
|
|
101
|
+
expect(result.current).toBe('link');
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('onClick alone resolves to "button"', () => {
|
|
105
|
+
const {result} = renderHook(() =>
|
|
106
|
+
useInteractiveRole({onClick: () => {}}),
|
|
107
|
+
);
|
|
108
|
+
expect(result.current).toBe('button');
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('nothing interactive resolves to "inert"', () => {
|
|
112
|
+
const {result} = renderHook(() => useInteractiveRole({}));
|
|
113
|
+
expect(result.current).toBe('inert');
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('context override is used when neither href nor onClick is set', () => {
|
|
117
|
+
const {result} = renderHook(() => useInteractiveRole({}), {
|
|
118
|
+
wrapper: withRole('button'),
|
|
119
|
+
});
|
|
120
|
+
expect(result.current).toBe('button');
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('href wins over a context override (navigation has top priority)', () => {
|
|
124
|
+
const {result} = renderHook(() => useInteractiveRole({href: '/x'}), {
|
|
125
|
+
wrapper: withRole('button'),
|
|
126
|
+
});
|
|
127
|
+
expect(result.current).toBe('link');
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('onClick wins over a context override', () => {
|
|
131
|
+
const {result} = renderHook(
|
|
132
|
+
() => useInteractiveRole({onClick: () => {}}),
|
|
133
|
+
{wrapper: withRole('link')},
|
|
134
|
+
);
|
|
135
|
+
expect(result.current).toBe('button');
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
// NOTE — documents current behavior. The `isDisabled` JSDoc says a disabled
|
|
139
|
+
// href "falls back to button", but the implementation only *skips* the link
|
|
140
|
+
// branch when disabled — it does not force a button. With no onClick and no
|
|
141
|
+
// context override, a disabled href therefore resolves to "inert", not
|
|
142
|
+
// "button". (The doc-promised "button" fallback only holds when an onClick
|
|
143
|
+
// or a context override is also present — see the two tests below.)
|
|
144
|
+
it('a disabled href with nothing else resolves to "inert" (not "button" as the JSDoc implies)', () => {
|
|
145
|
+
const {result} = renderHook(() =>
|
|
146
|
+
useInteractiveRole({href: '/x', isDisabled: true}),
|
|
147
|
+
);
|
|
148
|
+
expect(result.current).toBe('inert');
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
it('a disabled href with an onClick resolves to "button" via the onClick branch', () => {
|
|
152
|
+
const {result} = renderHook(() =>
|
|
153
|
+
useInteractiveRole({href: '/x', isDisabled: true, onClick: () => {}}),
|
|
154
|
+
);
|
|
155
|
+
expect(result.current).toBe('button');
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it('a disabled href with a context override falls through to that override', () => {
|
|
159
|
+
const {result} = renderHook(
|
|
160
|
+
() => useInteractiveRole({href: '/x', isDisabled: true}),
|
|
161
|
+
{wrapper: withRole('button')},
|
|
162
|
+
);
|
|
163
|
+
expect(result.current).toBe('button');
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it('an "inert" context override is honored when nothing else is interactive', () => {
|
|
167
|
+
const {result} = renderHook(() => useInteractiveRole({}), {
|
|
168
|
+
wrapper: withRole('inert'),
|
|
169
|
+
});
|
|
170
|
+
expect(result.current).toBe('inert');
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
it('a null onClick is treated as absent (falls through to inert)', () => {
|
|
174
|
+
const {result} = renderHook(() => useInteractiveRole({onClick: null}));
|
|
175
|
+
expect(result.current).toBe('inert');
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it('a null onClick still yields to a context override', () => {
|
|
179
|
+
const {result} = renderHook(() => useInteractiveRole({onClick: null}), {
|
|
180
|
+
wrapper: withRole('button'),
|
|
181
|
+
});
|
|
182
|
+
expect(result.current).toBe('button');
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
});
|
package/src/Item/Item.tsx
CHANGED
|
@@ -470,9 +470,9 @@ export function Item({
|
|
|
470
470
|
return (
|
|
471
471
|
<Component
|
|
472
472
|
ref={ref as React.Ref<never>}
|
|
473
|
+
{...restProps}
|
|
473
474
|
aria-selected={isSelected || undefined}
|
|
474
475
|
aria-disabled={isDisabled || undefined}
|
|
475
|
-
{...restProps}
|
|
476
476
|
{...mergeProps(
|
|
477
477
|
themeProps('item', {density, align}),
|
|
478
478
|
stylex.props(
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Layout.test.tsx
|
|
5
|
+
* @input Uses vitest, @testing-library/react, Layout + layout contexts
|
|
6
|
+
* @output Characterization tests for the Layout page-shell component
|
|
7
|
+
* @position Testing; validates slot rendering, context provisioning, and
|
|
8
|
+
* divider/padding/height wiring
|
|
9
|
+
*
|
|
10
|
+
* SYNC: When Layout.tsx changes, update tests to match new behavior
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {describe, it, expect} from 'vitest';
|
|
14
|
+
import {render, screen} from '@testing-library/react';
|
|
15
|
+
import {use, createRef} from 'react';
|
|
16
|
+
import {Layout} from './Layout';
|
|
17
|
+
import {LayoutHeader} from './LayoutHeader';
|
|
18
|
+
import {LayoutFooter} from './LayoutFooter';
|
|
19
|
+
import {LayoutAreaContext} from './LayoutAreaContext';
|
|
20
|
+
import {LayoutSlotsContext} from './LayoutSlotsContext';
|
|
21
|
+
|
|
22
|
+
/** Reports which layout area it is rendered inside. */
|
|
23
|
+
function AreaProbe({testid}: {testid: string}) {
|
|
24
|
+
const area = use(LayoutAreaContext);
|
|
25
|
+
return <span data-testid={testid}>{String(area)}</span>;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Reports the current LayoutSlots record as JSON. */
|
|
29
|
+
function SlotsProbe() {
|
|
30
|
+
const slots = use(LayoutSlotsContext);
|
|
31
|
+
return <span data-testid="slots">{JSON.stringify(slots)}</span>;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** The Layout root is the outermost element rendered by the component. */
|
|
35
|
+
function root(container: HTMLElement): HTMLElement {
|
|
36
|
+
return container.firstElementChild as HTMLElement;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
describe('Layout', () => {
|
|
40
|
+
describe('content / children resolution', () => {
|
|
41
|
+
it('renders the content prop', () => {
|
|
42
|
+
render(<Layout content={<div>main body</div>} />);
|
|
43
|
+
expect(screen.getByText('main body')).toBeInTheDocument();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('renders children as a shorthand for the content slot', () => {
|
|
47
|
+
render(
|
|
48
|
+
<Layout>
|
|
49
|
+
<div>child body</div>
|
|
50
|
+
</Layout>,
|
|
51
|
+
);
|
|
52
|
+
expect(screen.getByText('child body')).toBeInTheDocument();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('content wins when both content and children are provided', () => {
|
|
56
|
+
render(
|
|
57
|
+
<Layout content={<div>from-content</div>}>
|
|
58
|
+
<div>from-children</div>
|
|
59
|
+
</Layout>,
|
|
60
|
+
);
|
|
61
|
+
expect(screen.getByText('from-content')).toBeInTheDocument();
|
|
62
|
+
expect(screen.queryByText('from-children')).not.toBeInTheDocument();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('renders an empty shell without crashing when no slots are given', () => {
|
|
66
|
+
const {container} = render(<Layout />);
|
|
67
|
+
expect(root(container)).toBeInTheDocument();
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
describe('slots', () => {
|
|
72
|
+
it('renders all four surrounding slots plus content', () => {
|
|
73
|
+
render(
|
|
74
|
+
<Layout
|
|
75
|
+
header={<div>the-header</div>}
|
|
76
|
+
start={<div>the-start</div>}
|
|
77
|
+
end={<div>the-end</div>}
|
|
78
|
+
footer={<div>the-footer</div>}
|
|
79
|
+
content={<div>the-content</div>}
|
|
80
|
+
/>,
|
|
81
|
+
);
|
|
82
|
+
expect(screen.getByText('the-header')).toBeInTheDocument();
|
|
83
|
+
expect(screen.getByText('the-start')).toBeInTheDocument();
|
|
84
|
+
expect(screen.getByText('the-end')).toBeInTheDocument();
|
|
85
|
+
expect(screen.getByText('the-footer')).toBeInTheDocument();
|
|
86
|
+
expect(screen.getByText('the-content')).toBeInTheDocument();
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('does not render an area wrapper for an omitted slot', () => {
|
|
90
|
+
render(<Layout content={<AreaProbe testid="content" />} />);
|
|
91
|
+
// Only the content probe exists; header/start/end/footer probes absent.
|
|
92
|
+
expect(screen.getByTestId('content')).toHaveTextContent('content');
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
describe('LayoutAreaContext provisioning', () => {
|
|
97
|
+
it('tags each slot with its area name', () => {
|
|
98
|
+
render(
|
|
99
|
+
<Layout
|
|
100
|
+
header={<AreaProbe testid="h" />}
|
|
101
|
+
start={<AreaProbe testid="s" />}
|
|
102
|
+
end={<AreaProbe testid="e" />}
|
|
103
|
+
footer={<AreaProbe testid="f" />}
|
|
104
|
+
content={<AreaProbe testid="c" />}
|
|
105
|
+
/>,
|
|
106
|
+
);
|
|
107
|
+
expect(screen.getByTestId('h')).toHaveTextContent('header');
|
|
108
|
+
expect(screen.getByTestId('s')).toHaveTextContent('start');
|
|
109
|
+
expect(screen.getByTestId('e')).toHaveTextContent('end');
|
|
110
|
+
expect(screen.getByTestId('f')).toHaveTextContent('footer');
|
|
111
|
+
expect(screen.getByTestId('c')).toHaveTextContent('content');
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
describe('LayoutSlotsContext provisioning', () => {
|
|
116
|
+
it('reports which slots are filled to descendants', () => {
|
|
117
|
+
render(
|
|
118
|
+
<Layout
|
|
119
|
+
header={<div>h</div>}
|
|
120
|
+
start={<div>s</div>}
|
|
121
|
+
content={<SlotsProbe />}
|
|
122
|
+
/>,
|
|
123
|
+
);
|
|
124
|
+
const slots = JSON.parse(screen.getByTestId('slots').textContent ?? '{}');
|
|
125
|
+
expect(slots).toEqual({
|
|
126
|
+
hasHeader: true,
|
|
127
|
+
hasFooter: false,
|
|
128
|
+
hasStart: true,
|
|
129
|
+
hasEnd: false,
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it('reports all-false when only content is present', () => {
|
|
134
|
+
render(<Layout content={<SlotsProbe />} />);
|
|
135
|
+
const slots = JSON.parse(screen.getByTestId('slots').textContent ?? '{}');
|
|
136
|
+
expect(slots).toEqual({
|
|
137
|
+
hasHeader: false,
|
|
138
|
+
hasFooter: false,
|
|
139
|
+
hasStart: false,
|
|
140
|
+
hasEnd: false,
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('reports every slot filled', () => {
|
|
145
|
+
render(
|
|
146
|
+
<Layout
|
|
147
|
+
header={<div>h</div>}
|
|
148
|
+
footer={<div>f</div>}
|
|
149
|
+
start={<div>s</div>}
|
|
150
|
+
end={<div>e</div>}
|
|
151
|
+
content={<SlotsProbe />}
|
|
152
|
+
/>,
|
|
153
|
+
);
|
|
154
|
+
const slots = JSON.parse(screen.getByTestId('slots').textContent ?? '{}');
|
|
155
|
+
expect(slots).toEqual({
|
|
156
|
+
hasHeader: true,
|
|
157
|
+
hasFooter: true,
|
|
158
|
+
hasStart: true,
|
|
159
|
+
hasEnd: true,
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
describe('theme props (class + data attributes)', () => {
|
|
165
|
+
it('renders the astryx-layout class on the root', () => {
|
|
166
|
+
const {container} = render(<Layout content={<div>x</div>} />);
|
|
167
|
+
expect(root(container).className).toContain('astryx-layout');
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it('defaults data-height to "fill"', () => {
|
|
171
|
+
const {container} = render(<Layout content={<div>x</div>} />);
|
|
172
|
+
expect(root(container).getAttribute('data-height')).toBe('fill');
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('reflects height="auto" as data-height', () => {
|
|
176
|
+
const {container} = render(
|
|
177
|
+
<Layout height="auto" content={<div>x</div>} />,
|
|
178
|
+
);
|
|
179
|
+
expect(root(container).getAttribute('data-height')).toBe('auto');
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
describe('defaultHasDividers → LayoutDividerContext', () => {
|
|
184
|
+
it('makes headers default to having a divider', () => {
|
|
185
|
+
render(
|
|
186
|
+
<Layout
|
|
187
|
+
defaultHasDividers
|
|
188
|
+
header={<LayoutHeader>H</LayoutHeader>}
|
|
189
|
+
content={<div>c</div>}
|
|
190
|
+
/>,
|
|
191
|
+
);
|
|
192
|
+
const header = screen.getByText('H').closest('[data-divider]');
|
|
193
|
+
expect(header).not.toBeNull();
|
|
194
|
+
expect(header?.getAttribute('data-divider')).toBe('true');
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it('makes footers default to having a divider', () => {
|
|
198
|
+
const {container} = render(
|
|
199
|
+
<Layout
|
|
200
|
+
defaultHasDividers
|
|
201
|
+
footer={<LayoutFooter>F</LayoutFooter>}
|
|
202
|
+
content={<div>c</div>}
|
|
203
|
+
/>,
|
|
204
|
+
);
|
|
205
|
+
expect(
|
|
206
|
+
container.querySelector('.astryx-layout-footer[data-divider]'),
|
|
207
|
+
).not.toBeNull();
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it('does not force dividers when defaultHasDividers is unset', () => {
|
|
211
|
+
const {container} = render(
|
|
212
|
+
<Layout
|
|
213
|
+
header={<LayoutHeader>H</LayoutHeader>}
|
|
214
|
+
content={<div>c</div>}
|
|
215
|
+
/>,
|
|
216
|
+
);
|
|
217
|
+
expect(
|
|
218
|
+
container.querySelector('.astryx-layout-header[data-divider]'),
|
|
219
|
+
).toBeNull();
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
it('an explicit hasDivider={false} on a header overrides the context default', () => {
|
|
223
|
+
const {container} = render(
|
|
224
|
+
<Layout
|
|
225
|
+
defaultHasDividers
|
|
226
|
+
header={<LayoutHeader hasDivider={false}>H</LayoutHeader>}
|
|
227
|
+
content={<div>c</div>}
|
|
228
|
+
/>,
|
|
229
|
+
);
|
|
230
|
+
expect(
|
|
231
|
+
container.querySelector('.astryx-layout-header[data-divider]'),
|
|
232
|
+
).toBeNull();
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
describe('padding / contentWidth', () => {
|
|
237
|
+
it('accepts a numeric padding step without crashing', () => {
|
|
238
|
+
const {container} = render(<Layout padding={4} content={<div>c</div>} />);
|
|
239
|
+
expect(root(container)).toBeInTheDocument();
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
it('accepts padding={0} (full bleed) without crashing', () => {
|
|
243
|
+
const {container} = render(<Layout padding={0} content={<div>c</div>} />);
|
|
244
|
+
expect(root(container)).toBeInTheDocument();
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
it('accepts a numeric contentWidth without crashing', () => {
|
|
248
|
+
const {container} = render(
|
|
249
|
+
<Layout contentWidth={640} content={<div>c</div>} />,
|
|
250
|
+
);
|
|
251
|
+
expect(root(container)).toBeInTheDocument();
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
it('accepts a string contentWidth without crashing', () => {
|
|
255
|
+
const {container} = render(
|
|
256
|
+
<Layout contentWidth="60ch" content={<div>c</div>} />,
|
|
257
|
+
);
|
|
258
|
+
expect(root(container)).toBeInTheDocument();
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
describe('styling & ref', () => {
|
|
263
|
+
it('forwards ref to the root div', () => {
|
|
264
|
+
const ref = createRef<HTMLDivElement>();
|
|
265
|
+
render(<Layout ref={ref} content={<div>c</div>} />);
|
|
266
|
+
expect(ref.current).toBeInstanceOf(HTMLDivElement);
|
|
267
|
+
expect(ref.current?.className).toContain('astryx-layout');
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
it('merges a caller className onto the root', () => {
|
|
271
|
+
const {container} = render(
|
|
272
|
+
<Layout className="my-layout" content={<div>c</div>} />,
|
|
273
|
+
);
|
|
274
|
+
expect(root(container).className).toContain('my-layout');
|
|
275
|
+
expect(root(container).className).toContain('astryx-layout');
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
it('merges a caller inline style onto the root', () => {
|
|
279
|
+
const {container} = render(
|
|
280
|
+
<Layout style={{outline: '1px solid red'}} content={<div>c</div>} />,
|
|
281
|
+
);
|
|
282
|
+
expect(root(container).style.outline).toBe('1px solid red');
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
});
|