@astryxdesign/core 0.1.4 → 0.1.5-canary.76e6697
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +141 -0
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +20 -18
- package/dist/AlertDialog/useImperativeAlertDialog.d.ts +0 -2
- package/dist/AlertDialog/useImperativeAlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/useImperativeAlertDialog.js +3 -5
- package/dist/AppShell/AppShell.d.ts +1 -1
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +55 -53
- package/dist/AspectRatio/AspectRatio.d.ts +48 -10
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +33 -12
- package/dist/AspectRatio/index.d.ts +1 -1
- package/dist/AspectRatio/index.d.ts.map +1 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +28 -26
- package/dist/Avatar/AvatarStatusDot.js +6 -6
- package/dist/AvatarGroup/AvatarGroup.js +6 -6
- package/dist/AvatarGroup/AvatarGroupOverflow.js +7 -7
- package/dist/Badge/Badge.js +3 -3
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +32 -25
- package/dist/Blockquote/Blockquote.js +7 -7
- package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
- package/dist/Breadcrumbs/Breadcrumbs.js +7 -7
- package/dist/Button/Button.js +19 -19
- package/dist/ButtonGroup/ButtonGroup.js +7 -7
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +68 -48
- package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
- package/dist/Calendar/styles.d.ts +2 -2
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +2 -2
- package/dist/Card/Card.d.ts +4 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +18 -10
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +24 -21
- package/dist/Center/Center.js +3 -3
- package/dist/Chat/ChatComposer.js +23 -23
- package/dist/Chat/ChatComposerDrawer.js +14 -14
- package/dist/Chat/ChatComposerInput.d.ts +1 -1
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +27 -15
- package/dist/Chat/ChatDictationButton.d.ts +1 -1
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +13 -11
- package/dist/Chat/ChatLayout.js +17 -17
- package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +12 -10
- package/dist/Chat/ChatMessage.js +12 -12
- package/dist/Chat/ChatMessageBubble.js +7 -7
- package/dist/Chat/ChatMessageList.js +14 -14
- package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatMessageMetadata.js +14 -12
- package/dist/Chat/ChatPastedTextToken.js +13 -13
- package/dist/Chat/ChatSendButton.js +3 -3
- package/dist/Chat/ChatSystemMessage.d.ts +1 -1
- package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
- package/dist/Chat/ChatSystemMessage.js +17 -17
- package/dist/Chat/ChatTokenizedText.d.ts +1 -1
- package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
- package/dist/Chat/ChatTokenizedText.js +24 -15
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +81 -74
- package/dist/Chat/index.d.ts +1 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +15 -15
- package/dist/CheckboxInput/CheckboxInput.d.ts +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +25 -23
- package/dist/CheckboxList/CheckboxList.js +9 -9
- package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +8 -6
- package/dist/Citation/Citation.js +10 -10
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +32 -9
- package/dist/Code/Code.js +3 -3
- package/dist/CodeBlock/CodeBlock.d.ts +10 -1
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +88 -52
- package/dist/Collapsible/Collapsible.d.ts +9 -3
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +109 -22
- package/dist/Collapsible/CollapsibleGroup.d.ts +37 -7
- package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroup.js +64 -12
- package/dist/Collapsible/CollapsibleGroupContext.d.ts +24 -0
- package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroupContext.js +26 -3
- package/dist/Collapsible/index.d.ts +1 -0
- package/dist/Collapsible/index.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.d.ts +4 -1
- package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.js +20 -6
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +36 -34
- package/dist/CommandPalette/CommandPaletteEmpty.js +3 -3
- package/dist/CommandPalette/CommandPaletteFooter.js +16 -16
- package/dist/CommandPalette/CommandPaletteGroup.js +5 -5
- package/dist/CommandPalette/CommandPaletteInput.js +13 -13
- package/dist/CommandPalette/CommandPaletteItem.js +3 -3
- package/dist/CommandPalette/CommandPaletteList.js +3 -3
- package/dist/ContextMenu/ContextMenu.d.ts +7 -2
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +76 -43
- package/dist/DateInput/DateInput.js +18 -18
- package/dist/DateRangeInput/DateRangeInput.js +21 -21
- package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +30 -26
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +9 -9
- package/dist/Dialog/DialogHeader.js +16 -16
- package/dist/Dialog/useImperativeDialog.js +3 -3
- package/dist/Divider/Divider.js +7 -7
- package/dist/DropdownMenu/DropdownMenu.js +10 -10
- package/dist/DropdownMenu/DropdownMenuItem.d.ts +2 -17
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
- package/dist/DropdownMenu/renderDropdownItems.js +10 -10
- package/dist/EmptyState/EmptyState.js +9 -9
- package/dist/Field/Field.js +17 -17
- package/dist/Field/FieldLabel.js +15 -15
- package/dist/Field/InputClearButton.js +5 -5
- package/dist/FieldStatus/FieldStatus.js +3 -3
- package/dist/FileInput/FileInput.js +29 -29
- package/dist/FormLayout/FormLayout.js +5 -5
- package/dist/Grid/Grid.d.ts +4 -3
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +29 -12
- package/dist/Grid/GridSpan.js +3 -3
- package/dist/HStack/HStack.js +3 -3
- package/dist/Heading/Heading.js +10 -10
- package/dist/HoverCard/HoverCard.js +9 -9
- package/dist/HoverCard/useHoverCard.d.ts +5 -1
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +3 -3
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +16 -12
- package/dist/Icon/defaultIcons.js +116 -116
- package/dist/IconButton/IconButton.js +3 -3
- package/dist/InputGroup/InputGroup.js +11 -11
- package/dist/InputGroup/InputGroupText.js +3 -3
- package/dist/Item/Item.js +18 -18
- package/dist/Kbd/Kbd.js +5 -5
- package/dist/Layer/LayerProvider.js +7 -7
- package/dist/Layer/useLayer.d.ts +29 -2
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +44 -31
- package/dist/Layout/Layout.js +21 -21
- package/dist/Layout/LayoutContent.js +3 -3
- package/dist/Layout/LayoutFooter.js +5 -5
- package/dist/Layout/LayoutHeader.js +5 -5
- package/dist/Layout/LayoutPanel.js +3 -3
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +55 -31
- package/dist/Lightbox/useLightbox.d.ts +0 -1
- package/dist/Lightbox/useLightbox.d.ts.map +1 -1
- package/dist/Lightbox/useLightbox.js +3 -4
- package/dist/Link/Link.d.ts +0 -2
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +15 -17
- package/dist/Link/LinkProvider.js +3 -3
- package/dist/Link/useLinkify.js +3 -3
- package/dist/List/List.js +11 -11
- package/dist/List/ListItem.js +11 -11
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +102 -102
- package/dist/MetadataList/MetadataList.js +10 -10
- package/dist/MetadataList/MetadataListItem.js +15 -15
- package/dist/MobileNav/MobileNav.d.ts +1 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +26 -23
- package/dist/MobileNav/MobileNavToggle.js +5 -5
- package/dist/MoreMenu/MoreMenu.js +3 -3
- package/dist/MultiSelector/MultiSelector.js +56 -56
- package/dist/NavIcon/NavIcon.js +3 -3
- package/dist/NavMenu/NavHeadingMenu.js +5 -5
- package/dist/NavMenu/NavHeadingMenuItem.js +8 -8
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +48 -32
- package/dist/Outline/Outline.js +15 -15
- package/dist/OverflowList/OverflowList.js +8 -8
- package/dist/Overlay/Overlay.js +3 -3
- package/dist/Overlay/OverlayScrim.js +5 -5
- package/dist/Overlay/useOverlay.d.ts +0 -3
- package/dist/Overlay/useOverlay.d.ts.map +1 -1
- package/dist/Overlay/useOverlay.js +3 -6
- package/dist/Pagination/Pagination.d.ts +1 -1
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +125 -72
- package/dist/Popover/Popover.js +16 -16
- package/dist/Popover/usePopover.js +7 -7
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +110 -92
- package/dist/PowerSearch/PowerSearchEditPopover.js +84 -84
- package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
- package/dist/PowerSearch/PowerSearchToken.js +5 -5
- package/dist/PowerSearch/PowerSearchValueEditor.js +54 -54
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +25 -18
- package/dist/RadioList/RadioList.js +7 -7
- package/dist/RadioList/RadioListItem.d.ts +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +24 -21
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +28 -10
- package/dist/Section/Section.js +5 -5
- package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +32 -10
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +18 -12
- package/dist/SelectableCard/SelectableCard.js +5 -5
- package/dist/Selector/Selector.js +46 -46
- package/dist/Selector/SelectorOption.js +3 -3
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +38 -34
- package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +8 -6
- package/dist/SideNav/SideNavHeading.js +87 -87
- package/dist/SideNav/SideNavItem.js +42 -42
- package/dist/SideNav/SideNavSection.d.ts +1 -1
- package/dist/SideNav/SideNavSection.d.ts.map +1 -1
- package/dist/SideNav/SideNavSection.js +18 -16
- package/dist/Skeleton/Skeleton.js +3 -3
- package/dist/Slider/Slider.js +23 -23
- package/dist/Spinner/Spinner.js +9 -9
- package/dist/StatusDot/StatusDot.js +5 -5
- package/dist/Switch/Switch.d.ts +8 -4
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +34 -29
- package/dist/TabList/Tab.js +18 -18
- package/dist/TabList/TabList.js +5 -5
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +57 -30
- package/dist/TabList/tab.markers.stylex.d.ts +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +50 -39
- package/dist/Table/Table.js +7 -7
- package/dist/Table/TableBody.d.ts +1 -1
- package/dist/Table/TableBody.d.ts.map +1 -1
- package/dist/Table/TableBody.js +9 -5
- package/dist/Table/TableCell.js +3 -3
- package/dist/Table/TableFooter.d.ts +1 -1
- package/dist/Table/TableFooter.d.ts.map +1 -1
- package/dist/Table/TableFooter.js +9 -5
- package/dist/Table/TableHeader.d.ts +1 -1
- package/dist/Table/TableHeader.d.ts.map +1 -1
- package/dist/Table/TableHeader.js +9 -5
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/TableRow.js +5 -5
- package/dist/Table/index.d.ts +2 -0
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -0
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +14 -11
- package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
- package/dist/Table/plugins/groupedRows/index.d.ts +3 -0
- package/dist/Table/plugins/groupedRows/index.d.ts.map +1 -0
- package/dist/Table/plugins/groupedRows/index.js +3 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +78 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +250 -0
- package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/paginateData.js +5 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +23 -23
- package/dist/Table/plugins/selection/useTableSelection.js +18 -18
- package/dist/Table/plugins/selection/useTableSelectionState.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelectionState.js +11 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +17 -17
- package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortableState.js +8 -4
- package/dist/Table/tableContextMenu.js +9 -9
- package/dist/Text/Text.js +10 -10
- package/dist/TextArea/TextArea.js +14 -14
- package/dist/TextInput/TextInput.js +15 -15
- package/dist/Thumbnail/Thumbnail.d.ts +3 -2
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +30 -29
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +26 -21
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +37 -26
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +25 -17
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +23 -11
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +44 -4
- package/dist/ToggleButton/ToggleButton.js +12 -12
- package/dist/ToggleButton/ToggleButtonGroup.js +5 -5
- package/dist/Token/Token.js +21 -21
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +36 -34
- package/dist/Toolbar/Toolbar.js +18 -18
- package/dist/Tooltip/Tooltip.js +11 -11
- package/dist/Tooltip/useTooltip.d.ts +5 -1
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +3 -3
- package/dist/TopNav/TopNav.js +32 -32
- package/dist/TopNav/TopNavHeading.js +67 -67
- package/dist/TopNav/TopNavItem.js +5 -5
- package/dist/TopNav/TopNavMegaMenu.js +30 -30
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +25 -14
- package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
- package/dist/TopNav/TopNavMenu.js +32 -32
- package/dist/TreeList/TreeList.js +8 -8
- package/dist/TreeList/TreeListBranches.js +11 -11
- package/dist/TreeList/TreeListItem.js +30 -30
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +23 -20
- package/dist/Typeahead/Typeahead.js +12 -12
- package/dist/Typeahead/TypeaheadItem.js +10 -10
- package/dist/VStack/VStack.js +3 -3
- package/dist/VisuallyHidden/VisuallyHidden.d.ts +0 -3
- package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
- package/dist/VisuallyHidden/VisuallyHidden.js +0 -3
- package/dist/astryx.css +7 -0
- package/dist/astryx.umd.js +63 -63
- package/dist/astryx.umd.js.map +4 -4
- package/dist/docs-types.d.ts +8 -2
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/hooks/focusableSelector.d.ts +1 -1
- package/dist/hooks/focusableSelector.d.ts.map +1 -1
- package/dist/hooks/focusableSelector.js +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useFocusTrap.d.ts +3 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +38 -1
- package/dist/hooks/useHotkeys.d.ts +51 -0
- package/dist/hooks/useHotkeys.d.ts.map +1 -0
- package/dist/hooks/useHotkeys.js +160 -0
- package/dist/hooks/useInteractiveRole.d.ts +6 -2
- package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
- package/dist/hooks/useInteractiveRole.js +6 -2
- package/dist/hooks/useKeyboardHint.js +9 -9
- package/dist/hooks/useStreamingText.d.ts +3 -1
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +14 -5
- package/dist/theme/MediaTheme.js +3 -3
- package/dist/theme/Theme.js +7 -7
- package/dist/theme/defineTheme.d.ts +1 -1
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/expandColorScale.d.ts.map +1 -1
- package/dist/theme/expandColorScale.js +10 -3
- package/dist/theme/hct.d.ts +0 -15
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +9 -9
- package/dist/theme/syntax/SyntaxTheme.js +5 -5
- package/dist/theme/tokens.d.ts +10 -2
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +220 -4
- package/dist/theme/useTheme.d.ts +3 -2
- package/dist/theme/useTheme.d.ts.map +1 -1
- package/dist/theme/useTheme.js +73 -6
- package/dist/utils/color.d.ts +42 -0
- package/dist/utils/color.d.ts.map +1 -0
- package/dist/utils/color.js +150 -0
- package/dist/utils/composeEventHandlers.d.ts +30 -0
- package/dist/utils/composeEventHandlers.d.ts.map +1 -0
- package/dist/utils/composeEventHandlers.js +40 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -1
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +8 -5
- package/package.json +4 -4
- package/src/AlertDialog/AlertDialog.doc.mjs +4 -0
- package/src/AlertDialog/AlertDialog.tsx +2 -0
- package/src/AlertDialog/useImperativeAlertDialog.tsx +0 -2
- package/src/AppShell/AppShell.tsx +2 -0
- package/src/AspectRatio/AspectRatio.doc.mjs +28 -1
- package/src/AspectRatio/AspectRatio.test.tsx +142 -1
- package/src/AspectRatio/AspectRatio.tsx +70 -10
- package/src/AspectRatio/index.ts +5 -1
- package/src/Avatar/Avatar.doc.mjs +11 -0
- package/src/Avatar/Avatar.test.tsx +32 -1
- package/src/Avatar/Avatar.tsx +14 -22
- package/src/Avatar/AvatarStatusDot.tsx +2 -2
- package/src/AvatarGroup/AvatarGroup.doc.mjs +1 -0
- package/src/AvatarGroup/AvatarGroup.tsx +2 -2
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -2
- package/src/Banner/Banner.doc.mjs +8 -0
- package/src/Banner/Banner.test.tsx +38 -0
- package/src/Banner/Banner.tsx +8 -1
- package/src/Calendar/Calendar.doc.mjs +1 -1
- package/src/Calendar/Calendar.test.tsx +122 -17
- package/src/Calendar/Calendar.tsx +26 -5
- package/src/Calendar/dayCellUtils.ts +3 -1
- package/src/Calendar/styles.ts +12 -2
- package/src/Card/Card.doc.mjs +1 -1
- package/src/Card/Card.tsx +16 -6
- package/src/Carousel/Carousel.doc.mjs +12 -12
- package/src/Carousel/Carousel.test.tsx +13 -0
- package/src/Carousel/Carousel.tsx +4 -2
- package/src/Chat/Chat.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.test.tsx +27 -1
- package/src/Chat/ChatComposerInput.tsx +20 -15
- package/src/Chat/ChatDictationButton.test.tsx +43 -0
- package/src/Chat/ChatDictationButton.tsx +4 -4
- package/src/Chat/ChatLayoutScrollButton.test.tsx +33 -0
- package/src/Chat/ChatLayoutScrollButton.tsx +3 -1
- package/src/Chat/ChatMessageMetadata.test.tsx +32 -0
- package/src/Chat/ChatMessageMetadata.tsx +4 -6
- package/src/Chat/ChatSystemMessage.test.tsx +26 -11
- package/src/Chat/ChatSystemMessage.tsx +7 -7
- package/src/Chat/ChatTokenizedText.test.tsx +29 -16
- package/src/Chat/ChatTokenizedText.tsx +15 -8
- package/src/Chat/ChatToolCalls.test.tsx +55 -0
- package/src/Chat/ChatToolCalls.tsx +10 -12
- package/src/Chat/index.ts +1 -4
- package/src/Chat/useTriggerMenu.tsx +1 -4
- package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -3
- package/src/CheckboxInput/CheckboxInput.test.tsx +71 -4
- package/src/CheckboxInput/CheckboxInput.tsx +2 -0
- package/src/CheckboxList/CheckboxList.test.tsx +19 -0
- package/src/CheckboxList/CheckboxListItem.tsx +11 -2
- package/src/Citation/Citation.doc.mjs +5 -0
- package/src/ClickableCard/ClickableCard.tsx +45 -2
- package/src/CodeBlock/CodeBlock.doc.mjs +7 -2
- package/src/CodeBlock/CodeBlock.test.tsx +122 -3
- package/src/CodeBlock/CodeBlock.tsx +62 -4
- package/src/Collapsible/Collapsible.doc.mjs +8 -4
- package/src/Collapsible/Collapsible.test.tsx +403 -0
- package/src/Collapsible/Collapsible.tsx +85 -10
- package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
- package/src/Collapsible/CollapsibleGroup.test.tsx +314 -0
- package/src/Collapsible/CollapsibleGroup.tsx +97 -9
- package/src/Collapsible/CollapsibleGroupContext.tsx +34 -2
- package/src/Collapsible/index.ts +1 -0
- package/src/Collapsible/useCollapsible.ts +20 -6
- package/src/CommandPalette/CommandPalette.doc.mjs +5 -0
- package/src/CommandPalette/CommandPalette.tsx +5 -3
- package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
- package/src/CommandPalette/CommandPaletteGroup.doc.mjs +10 -0
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +6 -0
- package/src/CommandPalette/CommandPaletteItem.doc.mjs +6 -0
- package/src/CommandPalette/CommandPaletteList.doc.mjs +9 -0
- package/src/ContextMenu/ContextMenu.doc.mjs +15 -0
- package/src/ContextMenu/ContextMenu.test.tsx +87 -0
- package/src/ContextMenu/ContextMenu.tsx +87 -28
- package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
- package/src/DateInput/DateInput.test.tsx +11 -20
- package/src/DateRangeInput/DateRangeInput.doc.mjs +9 -6
- package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
- package/src/DateTimeInput/DateTimeInput.doc.mjs +3 -2
- package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
- package/src/DateTimeInput/DateTimeInput.tsx +8 -2
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/Dialog.doc.mjs +4 -0
- package/src/Dialog/DialogHeader.doc.mjs +45 -0
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenu.test.tsx +22 -2
- package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
- package/src/EmptyState/EmptyState.doc.mjs +1 -1
- package/src/Field/Field.test.tsx +1 -4
- package/src/Field/FieldLabel.test.tsx +2 -2
- package/src/FieldStatus/FieldStatus.test.tsx +282 -0
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
- package/src/Grid/Grid.test.tsx +43 -18
- package/src/Grid/Grid.tsx +26 -9
- package/src/HoverCard/HoverCard.doc.mjs +6 -6
- package/src/HoverCard/useHoverCard.doc.mjs +5 -5
- package/src/HoverCard/useHoverCard.tsx +9 -2
- package/src/Icon/Icon.test.tsx +41 -29
- package/src/Icon/Icon.tsx +6 -2
- package/src/InputGroup/InputGroup.doc.mjs +1 -0
- package/src/InputGroup/InputGroup.tsx +2 -2
- package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
- package/src/Item/Item.tsx +1 -1
- package/src/Layer/useLayer.doc.mjs +2 -2
- package/src/Layer/useLayer.test.tsx +221 -2
- package/src/Layer/useLayer.tsx +69 -30
- package/src/Layout/Layout.test.tsx +285 -0
- package/src/Layout/LayoutContent.doc.mjs +12 -0
- package/src/Layout/LayoutPanel.doc.mjs +40 -0
- package/src/Layout/LayoutSlots.test.tsx +364 -0
- package/src/Lightbox/Lightbox.doc.mjs +5 -0
- package/src/Lightbox/Lightbox.test.tsx +123 -2
- package/src/Lightbox/Lightbox.tsx +29 -1
- package/src/Lightbox/useLightbox.tsx +0 -1
- package/src/Link/Link.tsx +0 -2
- package/src/Markdown/Markdown.tsx +9 -7
- package/src/Markdown/parser.perf.test.ts +34 -12
- package/src/MobileNav/MobileNav.test.tsx +56 -0
- package/src/MobileNav/MobileNav.tsx +13 -8
- package/src/NavMenu/NavMenu.doc.mjs +15 -0
- package/src/NumberInput/NumberInput.test.tsx +48 -3
- package/src/NumberInput/NumberInput.tsx +32 -15
- package/src/Outline/Outline.doc.mjs +2 -0
- package/src/Outline/parseOutlineFromMarkdown.test.ts +80 -0
- package/src/OverflowList/OverflowList.test.tsx +416 -0
- package/src/Overlay/Overlay.doc.mjs +6 -0
- package/src/Overlay/Overlay.test.tsx +356 -0
- package/src/Overlay/useOverlay.tsx +0 -3
- package/src/Pagination/Pagination.test.tsx +162 -0
- package/src/Pagination/Pagination.tsx +80 -26
- package/src/Popover/Popover.doc.mjs +6 -6
- package/src/Popover/Popover.test.tsx +65 -0
- package/src/Popover/usePopover.doc.mjs +1 -1
- package/src/PowerSearch/PowerSearch.doc.mjs +2 -2
- package/src/PowerSearch/PowerSearch.test.tsx +109 -1
- package/src/PowerSearch/PowerSearch.tsx +37 -16
- package/src/ProgressBar/ProgressBar.doc.mjs +2 -0
- package/src/ProgressBar/ProgressBar.test.tsx +30 -0
- package/src/ProgressBar/ProgressBar.tsx +12 -5
- package/src/RadioList/RadioList.test.tsx +19 -0
- package/src/RadioList/RadioListItem.tsx +9 -4
- package/src/Resizable/ResizeHandle.test.tsx +218 -0
- package/src/Resizable/ResizeHandle.tsx +22 -4
- package/src/SegmentedControl/SegmentedControl.doc.mjs +1 -1
- package/src/SegmentedControl/SegmentedControl.test.tsx +192 -0
- package/src/SegmentedControl/SegmentedControl.tsx +27 -5
- package/src/SegmentedControl/SegmentedControlItem.tsx +9 -4
- package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
- package/src/Selector/Selector.test.tsx +27 -1
- package/src/SideNav/SideNav.doc.mjs +7 -1
- package/src/SideNav/SideNav.test.tsx +66 -0
- package/src/SideNav/SideNav.tsx +6 -2
- package/src/SideNav/SideNavCollapseButton.tsx +4 -3
- package/src/SideNav/SideNavSection.tsx +6 -4
- package/src/SizeContext/SizeContext.test.tsx +226 -0
- package/src/Switch/Switch.doc.mjs +7 -7
- package/src/Switch/Switch.test.tsx +102 -3
- package/src/Switch/Switch.tsx +20 -7
- package/src/TabList/TabList.test.tsx +185 -1
- package/src/TabList/TabMenu.tsx +45 -9
- package/src/Table/BaseTable.tsx +13 -2
- package/src/Table/Table.doc.mjs +6 -1
- package/src/Table/Table.test.tsx +87 -0
- package/src/Table/TableBody.tsx +15 -2
- package/src/Table/TableFooter.tsx +15 -2
- package/src/Table/TableHeader.tsx +15 -2
- package/src/Table/index.ts +5 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +13 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +3 -1
- package/src/Table/plugins/groupedRows/index.ts +7 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +231 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +349 -0
- package/src/Table/plugins/pagination/paginateData.ts +5 -1
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +1 -1
- package/src/Table/plugins/selection/useTableSelectionState.test.tsx +23 -0
- package/src/Table/plugins/selection/useTableSelectionState.tsx +11 -6
- package/src/Table/plugins/sortable/useTableSortableState.test.tsx +35 -1
- package/src/Table/plugins/sortable/useTableSortableState.tsx +8 -4
- package/src/Table/useTableGroupedRows.doc.mjs +71 -0
- package/src/TextArea/TextArea.test.tsx +3 -3
- package/src/TextInput/TextInput.test.tsx +3 -3
- package/src/Thumbnail/Thumbnail.test.tsx +36 -2
- package/src/Thumbnail/Thumbnail.tsx +4 -2
- package/src/TimeInput/TimeInput.test.tsx +37 -0
- package/src/TimeInput/TimeInput.tsx +11 -1
- package/src/Timestamp/Timestamp.doc.mjs +1 -1
- package/src/Timestamp/Timestamp.test.tsx +52 -0
- package/src/Timestamp/Timestamp.tsx +30 -16
- package/src/Toast/Toast.tsx +11 -3
- package/src/Toast/ToastViewport.test.tsx +64 -0
- package/src/Toast/ToastViewport.tsx +12 -0
- package/src/Toast/useToast.test.tsx +258 -0
- package/src/Toast/useToast.tsx +41 -0
- package/src/ToggleButton/ToggleButton.doc.mjs +1 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.test.tsx +54 -0
- package/src/Tokenizer/Tokenizer.tsx +5 -4
- package/src/Tooltip/Tooltip.doc.mjs +6 -6
- package/src/Tooltip/useTooltip.doc.mjs +5 -5
- package/src/Tooltip/useTooltip.tsx +12 -2
- package/src/TopNav/TopNav.doc.mjs +1 -1
- package/src/TopNav/TopNav.test.tsx +23 -7
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +9 -2
- package/src/TreeList/TreeList.doc.mjs +2 -2
- package/src/Typeahead/BaseTypeahead.doc.mjs +19 -0
- package/src/Typeahead/BaseTypeahead.tsx +5 -2
- package/src/Typeahead/Typeahead.doc.mjs +1 -1
- package/src/Typeahead/Typeahead.test.tsx +45 -1
- package/src/VisuallyHidden/VisuallyHidden.tsx +0 -3
- package/src/__tests__/TestIcon.tsx +26 -0
- package/src/__tests__/fastRoleQueries.ts +66 -0
- package/src/docPropReferences.test.ts +178 -0
- package/src/docs-types.ts +9 -1
- package/src/hooks/focusableSelector.ts +1 -1
- package/src/hooks/index.ts +3 -0
- package/src/hooks/useFocusTrap.doc.mjs +4 -2
- package/src/hooks/useFocusTrap.test.tsx +149 -1
- package/src/hooks/useFocusTrap.ts +50 -1
- package/src/hooks/useHotkeys.doc.mjs +52 -0
- package/src/hooks/useHotkeys.test.ts +245 -0
- package/src/hooks/useHotkeys.ts +203 -0
- package/src/hooks/useInteractiveRole.ts +12 -4
- package/src/hooks/useStreamingText.test.ts +54 -19
- package/src/hooks/useStreamingText.ts +16 -5
- package/src/hooks/useTreeFocus.test.tsx +1 -3
- package/src/reset.css +29 -0
- package/src/theme/SyntaxTheme.doc.mjs +4 -4
- package/src/theme/defineTheme.ts +4 -13
- package/src/theme/derivedVarRegistry.test.ts +2 -2
- package/src/theme/expandColorScale.test.ts +29 -0
- package/src/theme/expandColorScale.ts +11 -6
- package/src/theme/hct.ts +9 -17
- package/src/theme/themingTargets.test.ts +353 -0
- package/src/theme/tokens.test.ts +182 -9
- package/src/theme/tokens.ts +239 -4
- package/src/theme/useTheme.test.tsx +126 -2
- package/src/theme/useTheme.ts +87 -6
- package/src/utils/color.test.ts +133 -0
- package/src/utils/color.ts +148 -0
- package/src/utils/composeEventHandlers.test.ts +71 -0
- package/src/utils/composeEventHandlers.ts +44 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/mergeProps.test.ts +166 -0
- package/src/utils/sharedResizeObserver.test.ts +2 -2
- package/src/utils/timeParser.test.ts +13 -0
- package/src/utils/timeParser.ts +8 -5
- package/dist/Carousel/carousel.markers.stylex.d.ts +0 -7
- package/dist/Carousel/carousel.markers.stylex.d.ts.map +0 -1
- package/dist/Carousel/carousel.markers.stylex.js +0 -12
- package/src/Carousel/carousel.markers.stylex.ts +0 -10
|
@@ -21,7 +21,7 @@ export const docs = {
|
|
|
21
21
|
targets: [
|
|
22
22
|
{className: 'astryx-side-nav', visualProps: ['mode']},
|
|
23
23
|
{className: 'astryx-side-nav-heading'},
|
|
24
|
-
{className: 'astryx-side-nav-item'},
|
|
24
|
+
{className: 'astryx-side-nav-item', visualProps: ['size'], states: ['selected']},
|
|
25
25
|
{className: 'astryx-side-nav-section'},
|
|
26
26
|
],
|
|
27
27
|
},
|
|
@@ -102,6 +102,12 @@ export const docs = {
|
|
|
102
102
|
description: 'Enables collapse behavior. true for uncontrolled with default toggle button, or an object for controlled mode and advanced config (defaultIsCollapsed, isCollapsed + onCollapsedChange, hasButton, buttonLabel).',
|
|
103
103
|
default: 'false',
|
|
104
104
|
},
|
|
105
|
+
{
|
|
106
|
+
name: 'resizable',
|
|
107
|
+
type: 'boolean | { defaultWidth?: number; minWidth?: number; maxWidth?: number; autoSaveId?: string; onWidthChange?: (width: number) => void }',
|
|
108
|
+
description: 'Enables a resize handle at the inline-end edge. true for defaults (260px initial, 180-480px range), or a ResizableConfig object (defaultWidth, minWidth, maxWidth, autoSaveId for localStorage persistence, onWidthChange). The handle is hidden while collapsed.',
|
|
109
|
+
default: 'false',
|
|
110
|
+
},
|
|
105
111
|
{
|
|
106
112
|
name: 'handleRef',
|
|
107
113
|
type: 'Ref<SideNavImperativeCollapseHandle>',
|
|
@@ -162,6 +162,61 @@ describe('SideNav', () => {
|
|
|
162
162
|
screen.getByRole('button', {name: 'Expand sidebar'}),
|
|
163
163
|
).toBeInTheDocument();
|
|
164
164
|
});
|
|
165
|
+
|
|
166
|
+
it('does not render an empty footer container when collapsible.hasButton is false', () => {
|
|
167
|
+
render(
|
|
168
|
+
<SideNav data-testid="nav" collapsible={{hasButton: false}}>
|
|
169
|
+
Content
|
|
170
|
+
</SideNav>,
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
// The built-in collapse button is opted out (consumers render their own
|
|
174
|
+
// SideNavCollapseButton in the header), so it must not appear...
|
|
175
|
+
expect(
|
|
176
|
+
screen.queryByRole('button', {name: 'Collapse sidebar'}),
|
|
177
|
+
).not.toBeInTheDocument();
|
|
178
|
+
|
|
179
|
+
// ...and no empty sticky-bottom container should be left behind. With no
|
|
180
|
+
// footer/footerIcons and no built-in button, the scrollable content region
|
|
181
|
+
// is the nav's only child.
|
|
182
|
+
const nav = screen.getByTestId('nav');
|
|
183
|
+
expect(nav.children).toHaveLength(1);
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
it('fires a consumer onClick on the collapse button in addition to toggling', async () => {
|
|
187
|
+
const user = userEvent.setup();
|
|
188
|
+
const onClick = vi.fn();
|
|
189
|
+
|
|
190
|
+
function Example() {
|
|
191
|
+
const [isCollapsed, setIsCollapsed] = useState(false);
|
|
192
|
+
const handleRef = useRef<SideNavImperativeCollapseHandle>(null);
|
|
193
|
+
return (
|
|
194
|
+
<>
|
|
195
|
+
<SideNavCollapseButton handleRef={handleRef} onClick={onClick} />
|
|
196
|
+
<SideNav
|
|
197
|
+
handleRef={handleRef}
|
|
198
|
+
collapsible={{
|
|
199
|
+
isCollapsed,
|
|
200
|
+
onCollapsedChange: setIsCollapsed,
|
|
201
|
+
hasButton: false,
|
|
202
|
+
}}>
|
|
203
|
+
<SideNavSection title="Main">
|
|
204
|
+
<SideNavItem label="Dashboard" icon={StubIcon} />
|
|
205
|
+
</SideNavSection>
|
|
206
|
+
</SideNav>
|
|
207
|
+
</>
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
render(<Example />);
|
|
212
|
+
await user.click(screen.getByRole('button', {name: 'Collapse sidebar'}));
|
|
213
|
+
|
|
214
|
+
expect(onClick).toHaveBeenCalledTimes(1);
|
|
215
|
+
// Toggle still ran: the label flipped to "Expand sidebar".
|
|
216
|
+
expect(
|
|
217
|
+
screen.getByRole('button', {name: 'Expand sidebar'}),
|
|
218
|
+
).toBeInTheDocument();
|
|
219
|
+
});
|
|
165
220
|
});
|
|
166
221
|
|
|
167
222
|
// =============================================================================
|
|
@@ -734,6 +789,17 @@ describe('SideNavSection', () => {
|
|
|
734
789
|
const group = screen.getByRole('group');
|
|
735
790
|
expect(group.style.marginTop).toBe('16px');
|
|
736
791
|
});
|
|
792
|
+
|
|
793
|
+
it('forwards arbitrary pass-through attributes (id, aria-*) to root element', () => {
|
|
794
|
+
render(
|
|
795
|
+
<SideNavSection title="Main" id="section-1" aria-describedby="hint">
|
|
796
|
+
<SideNavItem label="Dashboard" />
|
|
797
|
+
</SideNavSection>,
|
|
798
|
+
);
|
|
799
|
+
const group = screen.getByRole('group');
|
|
800
|
+
expect(group).toHaveAttribute('id', 'section-1');
|
|
801
|
+
expect(group).toHaveAttribute('aria-describedby', 'hint');
|
|
802
|
+
});
|
|
737
803
|
});
|
|
738
804
|
|
|
739
805
|
// =============================================================================
|
package/src/SideNav/SideNav.tsx
CHANGED
|
@@ -490,6 +490,10 @@ export function SideNav({
|
|
|
490
490
|
// =========================================================================
|
|
491
491
|
const hasStickyTop = !!(header || topContent);
|
|
492
492
|
const hasStickyBottom = !!(footer || footerIcons);
|
|
493
|
+
// The built-in collapse button only renders when collapse is enabled and it
|
|
494
|
+
// hasn't been opted out via `collapsible.hasButton: false` (e.g. when the
|
|
495
|
+
// consumer places a SideNavCollapseButton in the header instead).
|
|
496
|
+
const showCollapseButton = isCollapsible && hasCollapseButton;
|
|
493
497
|
|
|
494
498
|
// When resizable, override the nav width via inline style
|
|
495
499
|
const resizableNavStyle: React.CSSProperties | undefined = isResizable
|
|
@@ -532,7 +536,7 @@ export function SideNav({
|
|
|
532
536
|
)}>
|
|
533
537
|
{children}
|
|
534
538
|
</div>
|
|
535
|
-
{(hasStickyBottom ||
|
|
539
|
+
{(hasStickyBottom || showCollapseButton) && (
|
|
536
540
|
<div
|
|
537
541
|
{...stylex.props(
|
|
538
542
|
styles.stickyBottom,
|
|
@@ -544,7 +548,7 @@ export function SideNav({
|
|
|
544
548
|
styles.footerRow,
|
|
545
549
|
collapsed && styles.footerRowCollapsed,
|
|
546
550
|
)}>
|
|
547
|
-
{
|
|
551
|
+
{showCollapseButton && <SideNavCollapseButton />}
|
|
548
552
|
{footerIcons}
|
|
549
553
|
</div>
|
|
550
554
|
</div>
|
|
@@ -23,6 +23,7 @@ import {durationVars, easeVars} from '../theme/tokens.stylex';
|
|
|
23
23
|
import {getIcon} from '../Icon/globalIconRegistry';
|
|
24
24
|
import {Button} from '../Button';
|
|
25
25
|
import type {BaseProps} from '../BaseProps';
|
|
26
|
+
import {composeEventHandlers} from '../utils';
|
|
26
27
|
import {
|
|
27
28
|
useSideNavCollapse,
|
|
28
29
|
type SideNavCollapseState,
|
|
@@ -101,6 +102,7 @@ export function SideNavCollapseButton({
|
|
|
101
102
|
handleRef,
|
|
102
103
|
label,
|
|
103
104
|
children,
|
|
105
|
+
onClick: onClickProp,
|
|
104
106
|
...props
|
|
105
107
|
}: SideNavCollapseButtonProps) {
|
|
106
108
|
const {isCollapsed, toggle, isCollapsible} =
|
|
@@ -119,7 +121,7 @@ export function SideNavCollapseButton({
|
|
|
119
121
|
label={label ?? (isCollapsed ? 'Expand sidebar' : 'Collapse sidebar')}
|
|
120
122
|
variant="ghost"
|
|
121
123
|
{...props}
|
|
122
|
-
onClick={toggle}
|
|
124
|
+
onClick={composeEventHandlers(onClickProp, toggle)}
|
|
123
125
|
icon={
|
|
124
126
|
children ?? (
|
|
125
127
|
<span
|
|
@@ -140,8 +142,7 @@ SideNavCollapseButton.displayName = 'SideNavCollapseButton';
|
|
|
140
142
|
|
|
141
143
|
function useSideNavCollapseState(
|
|
142
144
|
handleRef:
|
|
143
|
-
|
|
144
|
-
| undefined,
|
|
145
|
+
React.RefObject<SideNavImperativeCollapseHandle | null> | undefined,
|
|
145
146
|
): SideNavCollapseState {
|
|
146
147
|
const contextCollapseState = useSideNavCollapse();
|
|
147
148
|
|
|
@@ -145,6 +145,7 @@ export function SideNavSection({
|
|
|
145
145
|
className,
|
|
146
146
|
style,
|
|
147
147
|
'data-testid': testId,
|
|
148
|
+
...rest
|
|
148
149
|
}: SideNavSectionProps) {
|
|
149
150
|
const {isCollapsed} = useSideNavCollapse();
|
|
150
151
|
const id = useId();
|
|
@@ -183,15 +184,16 @@ export function SideNavSection({
|
|
|
183
184
|
return (
|
|
184
185
|
<div
|
|
185
186
|
ref={ref}
|
|
186
|
-
role="group"
|
|
187
|
-
aria-labelledby={titleId}
|
|
188
|
-
data-testid={testId}
|
|
189
187
|
{...mergeProps(
|
|
190
188
|
themeProps('side-nav-section'),
|
|
191
189
|
stylex.props(styles.root, xstyle),
|
|
192
190
|
className,
|
|
193
191
|
style,
|
|
194
|
-
)}
|
|
192
|
+
)}
|
|
193
|
+
{...rest}
|
|
194
|
+
role="group"
|
|
195
|
+
aria-labelledby={titleId}
|
|
196
|
+
data-testid={testId}>
|
|
195
197
|
<div
|
|
196
198
|
{...mergeProps(stylex.props(styles.header), {
|
|
197
199
|
style: shouldHideHeader ? visuallyHiddenStyle : undefined,
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file SizeContext.test.tsx
|
|
5
|
+
* @input Uses vitest, @testing-library/react, SizeContext module
|
|
6
|
+
* @output Characterization tests for SizeContext / useSize / SizeProvider
|
|
7
|
+
* @position Testing; validates the size-cascade resolution contract
|
|
8
|
+
*
|
|
9
|
+
* SYNC: When SizeContext.ts changes, update tests to match new behavior
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import {describe, it, expect} from 'vitest';
|
|
13
|
+
import {renderHook, render, screen} from '@testing-library/react';
|
|
14
|
+
import {createElement, type ReactNode} from 'react';
|
|
15
|
+
import {
|
|
16
|
+
SizeContext,
|
|
17
|
+
SizeProvider,
|
|
18
|
+
useSize,
|
|
19
|
+
type ElementSize,
|
|
20
|
+
} from './SizeContext';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Wrap children in a SizeProvider set to `size`. Passing `null` mimics
|
|
24
|
+
* "no container is providing a size".
|
|
25
|
+
*/
|
|
26
|
+
function withProvider(size: ElementSize | null) {
|
|
27
|
+
return function Wrapper({children}: {children: ReactNode}) {
|
|
28
|
+
return <SizeProvider value={size}>{children}</SizeProvider>;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
describe('SizeContext', () => {
|
|
33
|
+
describe('context identity', () => {
|
|
34
|
+
it('defaults to null when read outside any provider', () => {
|
|
35
|
+
const {result} = renderHook(() => useSize());
|
|
36
|
+
// No provider + no prop + no explicit default → the 'md' fallback.
|
|
37
|
+
expect(result.current).toBe('md');
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('exposes a displayName for devtools', () => {
|
|
41
|
+
expect(SizeContext.displayName).toBe('SizeContext');
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('SizeProvider is the context Provider itself', () => {
|
|
45
|
+
expect(SizeProvider).toBe(SizeContext.Provider);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
describe('useSize — resolution priority', () => {
|
|
50
|
+
it('returns the default "md" with no prop and no provider', () => {
|
|
51
|
+
const {result} = renderHook(() => useSize());
|
|
52
|
+
expect(result.current).toBe('md');
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('honors an explicit defaultSize when neither prop nor context is set', () => {
|
|
56
|
+
const {result} = renderHook(() => useSize(undefined, 'lg'));
|
|
57
|
+
expect(result.current).toBe('lg');
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('returns the explicit size prop when provided', () => {
|
|
61
|
+
const {result} = renderHook(() => useSize('sm'));
|
|
62
|
+
expect(result.current).toBe('sm');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('prop wins over the explicit default', () => {
|
|
66
|
+
const {result} = renderHook(() => useSize('sm', 'lg'));
|
|
67
|
+
expect(result.current).toBe('sm');
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('inherits the size from an enclosing provider when no prop is passed', () => {
|
|
71
|
+
const {result} = renderHook(() => useSize(), {
|
|
72
|
+
wrapper: withProvider('lg'),
|
|
73
|
+
});
|
|
74
|
+
expect(result.current).toBe('lg');
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('prop wins over the inherited provider size', () => {
|
|
78
|
+
const {result} = renderHook(() => useSize('sm'), {
|
|
79
|
+
wrapper: withProvider('lg'),
|
|
80
|
+
});
|
|
81
|
+
expect(result.current).toBe('sm');
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('inherited context wins over the explicit default fallback', () => {
|
|
85
|
+
const {result} = renderHook(() => useSize(undefined, 'sm'), {
|
|
86
|
+
wrapper: withProvider('lg'),
|
|
87
|
+
});
|
|
88
|
+
expect(result.current).toBe('lg');
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('falls back to default when the provider value is explicitly null', () => {
|
|
92
|
+
const {result} = renderHook(() => useSize(undefined, 'sm'), {
|
|
93
|
+
wrapper: withProvider(null),
|
|
94
|
+
});
|
|
95
|
+
expect(result.current).toBe('sm');
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('falls back to "md" when provider is null and no default is given', () => {
|
|
99
|
+
const {result} = renderHook(() => useSize(), {
|
|
100
|
+
wrapper: withProvider(null),
|
|
101
|
+
});
|
|
102
|
+
expect(result.current).toBe('md');
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
describe('useSize — every standard ElementSize resolves', () => {
|
|
107
|
+
const sizes: ElementSize[] = ['sm', 'md', 'lg'];
|
|
108
|
+
|
|
109
|
+
it.each(sizes)('resolves explicit prop "%s"', size => {
|
|
110
|
+
const {result} = renderHook(() => useSize(size));
|
|
111
|
+
expect(result.current).toBe(size);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it.each(sizes)('resolves inherited provider "%s"', size => {
|
|
115
|
+
const {result} = renderHook(() => useSize(), {
|
|
116
|
+
wrapper: withProvider(size),
|
|
117
|
+
});
|
|
118
|
+
expect(result.current).toBe(size);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
describe('useSize — nested providers', () => {
|
|
123
|
+
it('resolves to the nearest provider', () => {
|
|
124
|
+
function Nested({children}: {children: ReactNode}) {
|
|
125
|
+
return (
|
|
126
|
+
<SizeProvider value="sm">
|
|
127
|
+
<SizeProvider value="lg">{children}</SizeProvider>
|
|
128
|
+
</SizeProvider>
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
const {result} = renderHook(() => useSize(), {wrapper: Nested});
|
|
132
|
+
expect(result.current).toBe('lg');
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it('a prop still overrides the nearest provider', () => {
|
|
136
|
+
function Nested({children}: {children: ReactNode}) {
|
|
137
|
+
return (
|
|
138
|
+
<SizeProvider value="sm">
|
|
139
|
+
<SizeProvider value="lg">{children}</SizeProvider>
|
|
140
|
+
</SizeProvider>
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
const {result} = renderHook(() => useSize('md'), {wrapper: Nested});
|
|
144
|
+
expect(result.current).toBe('md');
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
describe('useSize — generic (non-ElementSize) values', () => {
|
|
149
|
+
it('supports a custom string union via the type parameter', () => {
|
|
150
|
+
type Custom = 'compact' | 'comfortable';
|
|
151
|
+
const {result} = renderHook(() =>
|
|
152
|
+
useSize<Custom>('compact', 'comfortable'),
|
|
153
|
+
);
|
|
154
|
+
expect(result.current).toBe('compact');
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it('returns the custom default when no prop is given', () => {
|
|
158
|
+
type Custom = 'compact' | 'comfortable';
|
|
159
|
+
const {result} = renderHook(() =>
|
|
160
|
+
useSize<Custom>(undefined, 'comfortable'),
|
|
161
|
+
);
|
|
162
|
+
expect(result.current).toBe('comfortable');
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it('empty-string prop is a real value and does NOT fall through to default', () => {
|
|
166
|
+
// '' ?? x === '' because nullish coalescing only catches null/undefined.
|
|
167
|
+
const {result} = renderHook(() => useSize('' as ElementSize, 'lg'));
|
|
168
|
+
expect(result.current).toBe('');
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
describe('integration — components consuming the cascade', () => {
|
|
173
|
+
function SizedProbe({size}: {size?: ElementSize}) {
|
|
174
|
+
const resolved = useSize(size);
|
|
175
|
+
return <span data-testid="probe">{resolved}</span>;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
it('a child with no size prop reads the container size', () => {
|
|
179
|
+
render(
|
|
180
|
+
<SizeProvider value="lg">
|
|
181
|
+
<SizedProbe />
|
|
182
|
+
</SizeProvider>,
|
|
183
|
+
);
|
|
184
|
+
expect(screen.getByTestId('probe')).toHaveTextContent('lg');
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it('sibling children resolve independently against the same provider', () => {
|
|
188
|
+
render(
|
|
189
|
+
<SizeProvider value="lg">
|
|
190
|
+
<span data-testid="a">
|
|
191
|
+
<SizedProbe />
|
|
192
|
+
</span>
|
|
193
|
+
<span data-testid="b">
|
|
194
|
+
<SizedProbe size="sm" />
|
|
195
|
+
</span>
|
|
196
|
+
</SizeProvider>,
|
|
197
|
+
);
|
|
198
|
+
expect(screen.getByTestId('a')).toHaveTextContent('lg');
|
|
199
|
+
expect(screen.getByTestId('b')).toHaveTextContent('sm');
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
it('re-renders with the new size when the provider value changes', () => {
|
|
203
|
+
const {rerender} = render(
|
|
204
|
+
<SizeProvider value="sm">
|
|
205
|
+
<SizedProbe />
|
|
206
|
+
</SizeProvider>,
|
|
207
|
+
);
|
|
208
|
+
expect(screen.getByTestId('probe')).toHaveTextContent('sm');
|
|
209
|
+
|
|
210
|
+
rerender(
|
|
211
|
+
<SizeProvider value="lg">
|
|
212
|
+
<SizedProbe />
|
|
213
|
+
</SizeProvider>,
|
|
214
|
+
);
|
|
215
|
+
expect(screen.getByTestId('probe')).toHaveTextContent('lg');
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it('works with createElement (no JSX) call form', () => {
|
|
219
|
+
const {result} = renderHook(() => useSize(), {
|
|
220
|
+
wrapper: ({children}: {children: ReactNode}) =>
|
|
221
|
+
createElement(SizeProvider, {value: 'sm'}, children),
|
|
222
|
+
});
|
|
223
|
+
expect(result.current).toBe('sm');
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
});
|
|
@@ -124,10 +124,10 @@ export const docs = {
|
|
|
124
124
|
},
|
|
125
125
|
{
|
|
126
126
|
name: 'labelSpacing',
|
|
127
|
-
type: "'
|
|
127
|
+
type: "'hug' | 'spread'",
|
|
128
128
|
description:
|
|
129
|
-
'Spacing behavior between label and switch. "spread" pushes them to opposite ends of the container (full width).',
|
|
130
|
-
default: "'
|
|
129
|
+
'Spacing behavior between label and switch. "hug" places them next to each other; "spread" pushes them to opposite ends of the container (full width). "default" is a deprecated alias for "hug".',
|
|
130
|
+
default: "'hug'",
|
|
131
131
|
},
|
|
132
132
|
],
|
|
133
133
|
theming: {
|
|
@@ -270,10 +270,10 @@ export const docsZh = {
|
|
|
270
270
|
},
|
|
271
271
|
{
|
|
272
272
|
name: 'labelSpacing',
|
|
273
|
-
type: "'
|
|
273
|
+
type: "'hug' | 'spread'",
|
|
274
274
|
description:
|
|
275
|
-
'标签和开关之间的间距行为。"spread" 将它们推到容器的两端(全宽)。',
|
|
276
|
-
default: "'
|
|
275
|
+
'标签和开关之间的间距行为。"hug" 将它们并排放置;"spread" 将它们推到容器的两端(全宽)。"default" 是 "hug" 的已弃用别名。',
|
|
276
|
+
default: "'hug'",
|
|
277
277
|
},
|
|
278
278
|
],
|
|
279
279
|
theming: {
|
|
@@ -329,6 +329,6 @@ export const docsDense = {
|
|
|
329
329
|
labelIcon: 'Icon before label text.',
|
|
330
330
|
labelTooltip: 'Tooltip text in info icon at label end.',
|
|
331
331
|
labelPosition: 'Which side label appears; "start" places before switch.',
|
|
332
|
-
labelSpacing: 'Spacing behavior; "spread" pushes to opposite ends (full width).',
|
|
332
|
+
labelSpacing: 'Spacing behavior; "hug" places next to each other, "spread" pushes to opposite ends (full width). "default" is deprecated alias for "hug".',
|
|
333
333
|
},
|
|
334
334
|
};
|
|
@@ -470,11 +470,84 @@ describe('Switch', () => {
|
|
|
470
470
|
expect(screen.getByRole('switch')).toBeDisabled();
|
|
471
471
|
});
|
|
472
472
|
});
|
|
473
|
+
describe('labelSpacing', () => {
|
|
474
|
+
const getField = (container: HTMLElement) =>
|
|
475
|
+
container.querySelector<HTMLElement>('.astryx-switch-field')!;
|
|
476
|
+
|
|
477
|
+
it('omits the data attribute for the default hug spacing', () => {
|
|
478
|
+
const {container} = render(
|
|
479
|
+
<Switch label="Notify" value={false} onChange={() => {}} />,
|
|
480
|
+
);
|
|
481
|
+
expect(getField(container)).not.toHaveAttribute('data-label-spacing');
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
it('reflects spread spacing as a data attribute and variant class', () => {
|
|
485
|
+
const {container} = render(
|
|
486
|
+
<Switch
|
|
487
|
+
label="Notify"
|
|
488
|
+
value={false}
|
|
489
|
+
onChange={() => {}}
|
|
490
|
+
labelSpacing="spread"
|
|
491
|
+
/>,
|
|
492
|
+
);
|
|
493
|
+
expect(getField(container)).toHaveAttribute(
|
|
494
|
+
'data-label-spacing',
|
|
495
|
+
'spread',
|
|
496
|
+
);
|
|
497
|
+
expect(getField(container).className).toContain('spread');
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
it('renders explicit hug the same as the default', () => {
|
|
501
|
+
const {container: implicit} = render(
|
|
502
|
+
<Switch label="Notify" value={false} onChange={() => {}} />,
|
|
503
|
+
);
|
|
504
|
+
const {container: explicit} = render(
|
|
505
|
+
<Switch
|
|
506
|
+
label="Notify"
|
|
507
|
+
value={false}
|
|
508
|
+
onChange={() => {}}
|
|
509
|
+
labelSpacing="hug"
|
|
510
|
+
/>,
|
|
511
|
+
);
|
|
512
|
+
expect(getField(explicit)).not.toHaveAttribute('data-label-spacing');
|
|
513
|
+
expect(getField(explicit).className).toBe(getField(implicit).className);
|
|
514
|
+
});
|
|
515
|
+
|
|
516
|
+
it("treats the deprecated 'default' value as an alias for hug", () => {
|
|
517
|
+
const {container: hug} = render(
|
|
518
|
+
<Switch
|
|
519
|
+
label="Notify"
|
|
520
|
+
value={false}
|
|
521
|
+
onChange={() => {}}
|
|
522
|
+
labelSpacing="hug"
|
|
523
|
+
/>,
|
|
524
|
+
);
|
|
525
|
+
const {container: deprecated} = render(
|
|
526
|
+
<Switch
|
|
527
|
+
label="Notify"
|
|
528
|
+
value={false}
|
|
529
|
+
onChange={() => {}}
|
|
530
|
+
labelSpacing="default"
|
|
531
|
+
/>,
|
|
532
|
+
);
|
|
533
|
+
expect(getField(deprecated)).not.toHaveAttribute('data-label-spacing');
|
|
534
|
+
expect(getField(deprecated).className).toBe(getField(hug).className);
|
|
535
|
+
// The switch row keeps the hug layout, not the spread justification.
|
|
536
|
+
expect(getField(deprecated).firstElementChild?.className).toBe(
|
|
537
|
+
getField(hug).firstElementChild?.className,
|
|
538
|
+
);
|
|
539
|
+
});
|
|
540
|
+
});
|
|
473
541
|
describe('form participation', () => {
|
|
474
542
|
it('submits under htmlName when on', () => {
|
|
475
543
|
const {container} = render(
|
|
476
544
|
<form>
|
|
477
|
-
<Switch
|
|
545
|
+
<Switch
|
|
546
|
+
label="Notify"
|
|
547
|
+
htmlName="notify"
|
|
548
|
+
value={true}
|
|
549
|
+
onChange={() => {}}
|
|
550
|
+
/>
|
|
478
551
|
</form>,
|
|
479
552
|
);
|
|
480
553
|
const data = new FormData(container.querySelector('form')!);
|
|
@@ -494,13 +567,20 @@ describe('Switch', () => {
|
|
|
494
567
|
/>
|
|
495
568
|
</form>,
|
|
496
569
|
);
|
|
497
|
-
expect([
|
|
570
|
+
expect([
|
|
571
|
+
...new FormData(container.querySelector('form')!).keys(),
|
|
572
|
+
]).toEqual([]);
|
|
498
573
|
});
|
|
499
574
|
|
|
500
575
|
it('submits nothing when off or when htmlName is omitted', () => {
|
|
501
576
|
const {container} = render(
|
|
502
577
|
<form>
|
|
503
|
-
<Switch
|
|
578
|
+
<Switch
|
|
579
|
+
label="Off"
|
|
580
|
+
htmlName="off"
|
|
581
|
+
value={false}
|
|
582
|
+
onChange={() => {}}
|
|
583
|
+
/>
|
|
504
584
|
<Switch label="Unnamed" value={true} onChange={() => {}} />
|
|
505
585
|
</form>,
|
|
506
586
|
);
|
|
@@ -508,4 +588,23 @@ describe('Switch', () => {
|
|
|
508
588
|
expect([...data.keys()]).toEqual([]);
|
|
509
589
|
});
|
|
510
590
|
});
|
|
591
|
+
|
|
592
|
+
describe('rest forwarding', () => {
|
|
593
|
+
it('forwards data-testid, id, and aria-* to the root element', () => {
|
|
594
|
+
const {container} = render(
|
|
595
|
+
<Switch
|
|
596
|
+
label="Notifications"
|
|
597
|
+
value={false}
|
|
598
|
+
onChange={() => {}}
|
|
599
|
+
data-testid="my-switch"
|
|
600
|
+
id="switch-1"
|
|
601
|
+
aria-label="Toggle notifications"
|
|
602
|
+
/>,
|
|
603
|
+
);
|
|
604
|
+
const root = container.querySelector('[data-testid="my-switch"]');
|
|
605
|
+
expect(root).not.toBeNull();
|
|
606
|
+
expect(root).toHaveAttribute('id', 'switch-1');
|
|
607
|
+
expect(root).toHaveAttribute('aria-label', 'Toggle notifications');
|
|
608
|
+
});
|
|
609
|
+
});
|
|
511
610
|
});
|
package/src/Switch/Switch.tsx
CHANGED
|
@@ -185,7 +185,11 @@ const styles = stylex.create({
|
|
|
185
185
|
|
|
186
186
|
export type SwitchLabelPosition = 'start' | 'end';
|
|
187
187
|
|
|
188
|
-
export type SwitchLabelSpacing =
|
|
188
|
+
export type SwitchLabelSpacing =
|
|
189
|
+
| 'hug'
|
|
190
|
+
| 'spread'
|
|
191
|
+
/** @deprecated Use `'hug'` instead. */
|
|
192
|
+
| 'default';
|
|
189
193
|
|
|
190
194
|
export interface SwitchProps extends Omit<BaseProps, 'onChange'> {
|
|
191
195
|
/** Ref forwarded to the root element */
|
|
@@ -297,9 +301,11 @@ export interface SwitchProps extends Omit<BaseProps, 'onChange'> {
|
|
|
297
301
|
labelPosition?: SwitchLabelPosition;
|
|
298
302
|
/**
|
|
299
303
|
* Spacing behavior between label and switch.
|
|
300
|
-
* - '
|
|
304
|
+
* - 'hug': Label and switch are positioned next to each other
|
|
301
305
|
* - 'spread': Label and switch are pushed to opposite ends
|
|
302
|
-
*
|
|
306
|
+
*
|
|
307
|
+
* 'default' is a deprecated alias for 'hug'.
|
|
308
|
+
* @default 'hug'
|
|
303
309
|
*/
|
|
304
310
|
labelSpacing?: SwitchLabelSpacing;
|
|
305
311
|
/**
|
|
@@ -350,13 +356,14 @@ export function Switch({
|
|
|
350
356
|
labelIcon,
|
|
351
357
|
labelTooltip,
|
|
352
358
|
labelPosition = 'end',
|
|
353
|
-
labelSpacing = '
|
|
359
|
+
labelSpacing = 'hug',
|
|
354
360
|
status,
|
|
355
361
|
width,
|
|
356
362
|
xstyle,
|
|
357
363
|
className,
|
|
358
364
|
style,
|
|
359
365
|
ref,
|
|
366
|
+
...rest
|
|
360
367
|
}: SwitchProps) {
|
|
361
368
|
const id = useId();
|
|
362
369
|
const descriptionID = useId();
|
|
@@ -368,6 +375,10 @@ export function Switch({
|
|
|
368
375
|
|
|
369
376
|
const isOn = optimisticValue === true;
|
|
370
377
|
|
|
378
|
+
// 'default' is a deprecated alias for 'hug' (#2889).
|
|
379
|
+
const resolvedLabelSpacing: SwitchLabelSpacing =
|
|
380
|
+
labelSpacing === 'default' ? 'hug' : labelSpacing;
|
|
381
|
+
|
|
371
382
|
// Disabled-reason tooltip. Disabled controls swallow pointer events, so the
|
|
372
383
|
// tooltip listeners attach to the switch row (which already exists) and the
|
|
373
384
|
// native checkbox stays perceivable via aria-disabled instead of the disabled
|
|
@@ -487,12 +498,14 @@ export function Switch({
|
|
|
487
498
|
{...mergeProps(
|
|
488
499
|
themeProps('switch-field', {
|
|
489
500
|
labelPosition: labelPosition !== 'end' ? labelPosition : undefined,
|
|
490
|
-
labelSpacing:
|
|
501
|
+
labelSpacing:
|
|
502
|
+
resolvedLabelSpacing !== 'hug' ? resolvedLabelSpacing : undefined,
|
|
491
503
|
}),
|
|
492
504
|
stylex.props(width != null && dynamicWidthStyles.width(width), xstyle),
|
|
493
505
|
className,
|
|
494
506
|
style,
|
|
495
|
-
)}
|
|
507
|
+
)}
|
|
508
|
+
{...rest}>
|
|
496
509
|
<div
|
|
497
510
|
ref={el => {
|
|
498
511
|
// Interaction (hover/focus) listeners for the disabled-message
|
|
@@ -505,7 +518,7 @@ export function Switch({
|
|
|
505
518
|
}}
|
|
506
519
|
{...stylex.props(
|
|
507
520
|
styles.container,
|
|
508
|
-
|
|
521
|
+
resolvedLabelSpacing === 'spread' && styles.containerSpread,
|
|
509
522
|
!isDisabled && switchScope,
|
|
510
523
|
)}>
|
|
511
524
|
{' '}
|