@astryxdesign/core 0.4.7 → 0.5.0-canary.009bcb3
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 +161 -1
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +45 -20
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +3 -2
- package/dist/AspectRatio/AspectRatio.d.ts +24 -0
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +23 -4
- package/dist/Avatar/Avatar.d.ts +25 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +58 -19
- package/dist/Avatar/index.d.ts +2 -2
- package/dist/Avatar/index.d.ts.map +1 -1
- package/dist/Avatar/index.js +1 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +8 -4
- package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
- package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +10 -6
- package/dist/Banner/Banner.d.ts +49 -15
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +62 -20
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +17 -4
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +11 -6
- package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +26 -7
- package/dist/Calendar/Calendar.d.ts +7 -3
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +21 -23
- package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
- package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
- package/dist/Calendar/getInitialFocusDate.js +62 -0
- package/dist/Calendar/styles.d.ts +5 -14
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +15 -15
- package/dist/Card/Card.d.ts +12 -12
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +17 -9
- package/dist/Card/index.d.ts +35 -1
- package/dist/Card/index.d.ts.map +1 -1
- package/dist/Card/index.js +21 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +3 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +2 -3
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +3 -3
- package/dist/Chat/ChatMessageList.d.ts +22 -3
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +6 -3
- package/dist/Chat/ChatTokenizedText.d.ts +2 -0
- package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
- package/dist/Chat/ChatTokenizedText.js +11 -6
- package/dist/Chat/useChatComposerTokens.js +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +10 -3
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +3 -3
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +15 -4
- package/dist/CodeBlock/highlightRanges.js +1 -1
- package/dist/CodeBlock/highlightStyles.js +13 -13
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +3 -2
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +3 -2
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +1 -3
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +4 -3
- package/dist/DateInput/DateInput.d.ts +43 -0
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +22 -2
- package/dist/DateInput/NativeDateField.d.ts +10 -0
- package/dist/DateInput/NativeDateField.d.ts.map +1 -0
- package/dist/DateInput/NativeDateField.js +494 -0
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +82 -23
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateInput/nativeDateSegments.d.ts +22 -0
- package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
- package/dist/DateInput/nativeDateSegments.js +111 -0
- package/dist/DateRangeInput/DateRangeInput.d.ts +4 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +406 -12
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/Dialog/Dialog.d.ts +21 -1
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +110 -58
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +4 -13
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +9 -1
- package/dist/Field/InputClearButton.d.ts +9 -3
- package/dist/Field/InputClearButton.d.ts.map +1 -1
- package/dist/Field/InputClearButton.js +14 -3
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +3 -2
- package/dist/Heading/Heading.d.ts.map +1 -1
- package/dist/Heading/Heading.js +6 -3
- package/dist/HoverCard/HoverCard.d.ts +6 -0
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +104 -3
- package/dist/HoverCard/useHoverCard.d.ts +19 -2
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +74 -26
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckboxIndicator.js +6 -2
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +4 -2
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +2 -19
- package/dist/Layer/LayerDepthContext.d.ts +52 -0
- package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
- package/dist/Layer/LayerDepthContext.js +66 -0
- package/dist/Layer/gestureCounter.d.ts +8 -0
- package/dist/Layer/gestureCounter.d.ts.map +1 -0
- package/dist/Layer/gestureCounter.js +53 -0
- package/dist/Layer/index.d.ts +3 -0
- package/dist/Layer/index.d.ts.map +1 -1
- package/dist/Layer/index.js +4 -0
- package/dist/Layer/layerStack.d.ts +98 -0
- package/dist/Layer/layerStack.d.ts.map +1 -0
- package/dist/Layer/layerStack.js +306 -0
- package/dist/Layer/useLayer.d.ts +23 -13
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +128 -8
- package/dist/Layer/useLayerDismissal.d.ts +93 -0
- package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
- package/dist/Layer/useLayerDismissal.js +91 -0
- package/dist/Lightbox/Lightbox.d.ts +1 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +103 -81
- package/dist/List/List.d.ts +1 -1
- package/dist/List/List.d.ts.map +1 -1
- package/dist/List/List.js +15 -4
- package/dist/Markdown/Markdown.d.ts +1 -1
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +20 -7
- package/dist/Markdown/index.d.ts +1 -1
- package/dist/Markdown/index.d.ts.map +1 -1
- package/dist/Markdown/parser.d.ts +38 -1
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +182 -32
- package/dist/MetadataList/MetadataListItem.d.ts +1 -1
- package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
- package/dist/MetadataList/MetadataListItem.js +4 -1
- package/dist/MobileNav/MobileNav.d.ts +6 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +61 -36
- package/dist/MultiSelector/MultiSelector.d.ts +32 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +73 -15
- package/dist/MultiSelector/hooks.d.ts +7 -1
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +3 -2
- package/dist/MultiSelector/index.d.ts +1 -1
- package/dist/MultiSelector/index.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.js +5 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +9 -5
- package/dist/NumberInput/NumberInput.d.ts +6 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +54 -104
- package/dist/NumberInput/numberInputCommit.d.ts +34 -0
- package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
- package/dist/NumberInput/numberInputCommit.js +71 -0
- package/dist/NumberInput/numberParser.d.ts +64 -0
- package/dist/NumberInput/numberParser.d.ts.map +1 -0
- package/dist/NumberInput/numberParser.js +350 -0
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +3 -2
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +3 -2
- package/dist/Overlay/Overlay.d.ts.map +1 -1
- package/dist/Overlay/Overlay.js +3 -2
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +1 -9
- package/dist/Popover/usePopover.d.ts +7 -41
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +40 -21
- package/dist/PowerSearch/PowerSearch.d.ts +8 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +19 -6
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +110 -27
- package/dist/PowerSearch/types.d.ts +2 -0
- package/dist/PowerSearch/types.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.js +14 -5
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +18 -5
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +3 -2
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +3 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +12 -3
- package/dist/Selector/Selector.d.ts +18 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +91 -18
- package/dist/Selector/hooks.d.ts +7 -1
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +3 -2
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +4 -3
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +8 -7
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +4 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +37 -5
- package/dist/Spinner/Spinner.d.ts +3 -3
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +130 -78
- package/dist/StatusDot/StatusDot.d.ts.map +1 -1
- package/dist/StatusDot/StatusDot.js +6 -1
- package/dist/Stepper/Step.d.ts +140 -0
- package/dist/Stepper/Step.d.ts.map +1 -0
- package/dist/Stepper/Step.js +1045 -0
- package/dist/Stepper/StepStatus.d.ts +24 -0
- package/dist/Stepper/StepStatus.d.ts.map +1 -0
- package/dist/Stepper/StepStatus.js +1 -0
- package/dist/Stepper/Stepper.d.ts +93 -0
- package/dist/Stepper/Stepper.d.ts.map +1 -0
- package/dist/Stepper/Stepper.js +184 -0
- package/dist/Stepper/StepperContext.d.ts +41 -0
- package/dist/Stepper/StepperContext.d.ts.map +1 -0
- package/dist/Stepper/StepperContext.js +34 -0
- package/dist/Stepper/index.d.ts +8 -0
- package/dist/Stepper/index.d.ts.map +1 -0
- package/dist/Stepper/index.js +7 -0
- package/dist/Stepper/stepper.stylex.d.ts +15 -0
- package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
- package/dist/Stepper/stepper.stylex.js +20 -0
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +8 -3
- package/dist/TabList/Tab.d.ts +15 -2
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +32 -7
- package/dist/TabList/TabList.d.ts +46 -7
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +353 -23
- package/dist/TabList/TabListContext.d.ts +11 -1
- package/dist/TabList/TabListContext.d.ts.map +1 -1
- package/dist/TabList/TabListContext.js +11 -2
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +3 -2
- package/dist/TabList/index.d.ts +2 -2
- package/dist/TabList/index.d.ts.map +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +10 -2
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +3 -6
- package/dist/Table/TableRow.d.ts +16 -5
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js +16 -5
- package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
- package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +26 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +54 -11
- package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
- package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
- package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +43 -5
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
- package/dist/Table/types.d.ts +22 -4
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -0
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +6 -3
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +16 -10
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +3 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +3 -2
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +15 -21
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +22 -7
- package/dist/Toast/ToastViewport.d.ts +1 -0
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +71 -18
- package/dist/Token/Token.d.ts +1 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +20 -9
- package/dist/Token/TokenLink.d.ts +1 -1
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +7 -4
- package/dist/Tokenizer/Tokenizer.d.ts +14 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +33 -21
- package/dist/Tooltip/Tooltip.d.ts +5 -0
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.d.ts +5 -0
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +39 -24
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +5 -4
- package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +31 -11
- package/dist/TopNav/TopNavMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +22 -7
- package/dist/TreeList/TreeList.d.ts +1 -1
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +7 -2
- package/dist/Typeahead/BaseTypeahead.d.ts +35 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +119 -37
- package/dist/Typeahead/Typeahead.d.ts +8 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +5 -2
- package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
- package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
- package/dist/Typeahead/TypeaheadItem.js +7 -2
- package/dist/astryx.css +113 -11
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useFocusTrap.d.ts +7 -4
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +60 -95
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +3 -18
- package/dist/hooks/useMergedRefs.d.ts +18 -0
- package/dist/hooks/useMergedRefs.d.ts.map +1 -0
- package/dist/hooks/useMergedRefs.js +25 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +46 -10
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +24 -4
- package/dist/theme/generateThemeRules.d.ts +21 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +26 -0
- package/dist/theme/syntax/tokens.d.ts +1 -1
- package/dist/theme/syntax/tokens.d.ts.map +1 -1
- package/dist/theme/syntax/tokens.js +5 -2
- package/dist/utils/groupItems.d.ts +5 -1
- package/dist/utils/groupItems.d.ts.map +1 -1
- package/dist/utils/groupItems.js +9 -9
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/isApplePlatform.d.ts +18 -0
- package/dist/utils/isApplePlatform.d.ts.map +1 -0
- package/dist/utils/isApplePlatform.js +37 -0
- package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
- package/dist/utils/sharedResizeObserver.js +10 -1
- package/dist/utils/timeParser.d.ts +1 -1
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +26 -12
- package/locales/af-ZA.json +6 -6
- package/locales/ar-SA.json +6 -6
- package/locales/ca-ES.json +5 -5
- package/locales/cs-CZ.json +6 -6
- package/locales/da-DK.json +6 -6
- package/locales/de-DE.json +6 -6
- package/locales/el-GR.json +6 -6
- package/locales/en.json +163 -11
- package/locales/es-ES.json +5 -5
- package/locales/fi-FI.json +6 -6
- package/locales/fr-FR.json +6 -6
- package/locales/he-IL.json +6 -6
- package/locales/hu-HU.json +6 -6
- package/locales/it-IT.json +6 -6
- package/locales/ja-JP.json +6 -6
- package/locales/ko-KR.json +6 -6
- package/locales/nl-NL.json +6 -6
- package/locales/no-NO.json +6 -6
- package/locales/pl-PL.json +6 -6
- package/locales/pseudo.json +114 -0
- package/locales/pt-BR.json +6 -6
- package/locales/pt-PT.json +6 -6
- package/locales/ro-RO.json +6 -6
- package/locales/ru-RU.json +6 -6
- package/locales/sr-SP.json +6 -6
- package/locales/sv-SE.json +6 -6
- package/locales/tr-TR.json +6 -6
- package/locales/uk-UA.json +6 -6
- package/locales/vi-VN.json +6 -6
- package/locales/zh-CN.json +6 -6
- package/locales/zh-TW.json +6 -6
- package/package.json +8 -3
- package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
- package/src/AlertDialog/AlertDialog.test.tsx +211 -2
- package/src/AlertDialog/AlertDialog.tsx +62 -20
- package/src/AppShell/AppShell.tsx +3 -2
- package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
- package/src/AspectRatio/AspectRatio.test.tsx +57 -10
- package/src/AspectRatio/AspectRatio.tsx +40 -1
- package/src/Avatar/Avatar.doc.mjs +14 -3
- package/src/Avatar/Avatar.test.tsx +97 -0
- package/src/Avatar/Avatar.tsx +125 -52
- package/src/Avatar/index.ts +2 -2
- package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
- package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
- package/src/AvatarGroup/AvatarGroup.tsx +15 -6
- package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
- package/src/Banner/Banner.doc.mjs +22 -11
- package/src/Banner/Banner.test.tsx +177 -25
- package/src/Banner/Banner.tsx +93 -27
- package/src/BottomSheet/BottomSheet.test.tsx +123 -0
- package/src/BottomSheet/BottomSheet.tsx +17 -4
- package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
- package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
- package/src/Button/Button.doc.mjs +24 -1
- package/src/Button/Button.test.tsx +32 -4
- package/src/Button/Button.tsx +12 -5
- package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
- package/src/ButtonGroup/ButtonGroup.test.tsx +404 -1
- package/src/ButtonGroup/ButtonGroup.tsx +23 -5
- package/src/Calendar/Calendar.doc.mjs +7 -6
- package/src/Calendar/Calendar.test.tsx +143 -0
- package/src/Calendar/Calendar.tsx +30 -26
- package/src/Calendar/getInitialFocusDate.test.ts +94 -0
- package/src/Calendar/getInitialFocusDate.ts +93 -0
- package/src/Calendar/styles.ts +49 -31
- package/src/Card/Card.doc.mjs +10 -7
- package/src/Card/Card.test.tsx +113 -19
- package/src/Card/Card.tsx +67 -89
- package/src/Card/index.ts +36 -1
- package/src/Carousel/Carousel.tsx +3 -2
- package/src/Chat/ChatComposerInput.tsx +5 -1
- package/src/Chat/ChatLayout.tsx +3 -2
- package/src/Chat/ChatMessageList.doc.mjs +9 -1
- package/src/Chat/ChatMessageList.test.tsx +46 -0
- package/src/Chat/ChatMessageList.tsx +28 -4
- package/src/Chat/ChatTokenizedText.tsx +17 -10
- package/src/Chat/useChatComposerTokens.ts +1 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
- package/src/CheckboxInput/CheckboxInput.tsx +8 -2
- package/src/ClickableCard/ClickableCard.tsx +3 -2
- package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
- package/src/CodeBlock/CodeBlock.test.tsx +37 -0
- package/src/CodeBlock/CodeBlock.tsx +20 -4
- package/src/CodeBlock/highlightRanges.ts +1 -1
- package/src/CodeBlock/highlightStyles.ts +13 -13
- package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
- package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
- package/src/ComplexSelector/ComplexSelector.test.tsx +32 -0
- package/src/ComplexSelector/ComplexSelector.tsx +1 -3
- package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
- package/src/ContextMenu/ContextMenu.tsx +4 -3
- package/src/DateInput/DateInput.doc.mjs +16 -0
- package/src/DateInput/DateInput.tsx +55 -2
- package/src/DateInput/DateInputTouch.test.tsx +146 -32
- package/src/DateInput/NativeDateField.test.tsx +635 -0
- package/src/DateInput/NativeDateField.tsx +641 -0
- package/src/DateInput/TouchDateField.tsx +108 -24
- package/src/DateInput/index.ts +1 -0
- package/src/DateInput/nativeDateSegments.ts +127 -0
- package/src/DateRangeInput/DateRangeInput.doc.mjs +2 -2
- package/src/DateRangeInput/DateRangeInput.test.tsx +22 -0
- package/src/DateRangeInput/DateRangeInput.tsx +4 -2
- package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
- package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
- package/src/DateTimeInput/DateTimeInput.tsx +556 -24
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/Dialog.doc.mjs +8 -3
- package/src/Dialog/Dialog.test.tsx +429 -2
- package/src/Dialog/Dialog.tsx +133 -58
- package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
- package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
- package/src/DropdownMenu/DropdownMenu.tsx +4 -13
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
- package/src/Field/Field.doc.mjs +13 -2
- package/src/Field/FieldLabel.test.tsx +29 -0
- package/src/Field/FieldLabel.tsx +7 -0
- package/src/Field/InputClearButton.test.tsx +15 -1
- package/src/Field/InputClearButton.tsx +28 -4
- package/src/FileInput/FileInput.tsx +3 -2
- package/src/Heading/Heading.test.tsx +23 -1
- package/src/Heading/Heading.tsx +6 -3
- package/src/HoverCard/HoverCard.doc.mjs +13 -2
- package/src/HoverCard/HoverCard.test.tsx +154 -4
- package/src/HoverCard/HoverCard.tsx +143 -3
- package/src/HoverCard/useHoverCard.tsx +104 -33
- package/src/Indicator/CheckboxIndicator.tsx +14 -8
- package/src/Indicator/Indicator.doc.mjs +2 -0
- package/src/Item/Item.tsx +5 -4
- package/src/Kbd/Kbd.tsx +2 -19
- package/src/Layer/LayerDepthContext.tsx +62 -0
- package/src/Layer/gestureCounter.ts +57 -0
- package/src/Layer/index.ts +9 -0
- package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
- package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
- package/src/Layer/layerStack.ts +362 -0
- package/src/Layer/useLayer.test.tsx +324 -15
- package/src/Layer/useLayer.tsx +164 -8
- package/src/Layer/useLayerDismissal.test.tsx +469 -0
- package/src/Layer/useLayerDismissal.ts +173 -0
- package/src/Layout/Layout.doc.mjs +2 -2
- package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
- package/src/Lightbox/Lightbox.doc.mjs +12 -0
- package/src/Lightbox/Lightbox.tsx +124 -102
- package/src/Link/Link.doc.mjs +39 -0
- package/src/List/List.test.tsx +38 -0
- package/src/List/List.tsx +8 -1
- package/src/Markdown/Markdown.doc.mjs +5 -0
- package/src/Markdown/Markdown.test.tsx +37 -0
- package/src/Markdown/Markdown.tsx +16 -5
- package/src/Markdown/incremental.test.ts +16 -2
- package/src/Markdown/index.ts +1 -0
- package/src/Markdown/parser.perf.test.ts +96 -1
- package/src/Markdown/parser.test.ts +178 -2
- package/src/Markdown/parser.ts +253 -32
- package/src/MetadataList/MetadataList.test.tsx +75 -2
- package/src/MetadataList/MetadataListItem.tsx +5 -2
- package/src/MobileNav/MobileNav.tsx +62 -36
- package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +49 -1
- package/src/MultiSelector/MultiSelector.test.tsx +311 -0
- package/src/MultiSelector/MultiSelector.tsx +151 -15
- package/src/MultiSelector/hooks.ts +9 -2
- package/src/MultiSelector/index.ts +1 -0
- package/src/NavIcon/NavIcon.doc.mjs +8 -2
- package/src/NavIcon/NavIcon.test.tsx +9 -0
- package/src/NavIcon/NavIcon.tsx +5 -1
- package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
- package/src/NavMenu/NavHeadingMenu.tsx +9 -5
- package/src/NumberInput/NumberInput.doc.mjs +31 -7
- package/src/NumberInput/NumberInput.test.tsx +436 -8
- package/src/NumberInput/NumberInput.tsx +62 -114
- package/src/NumberInput/numberInputCommit.test.ts +72 -0
- package/src/NumberInput/numberInputCommit.ts +103 -0
- package/src/NumberInput/numberParser.docblock.test.ts +234 -0
- package/src/NumberInput/numberParser.test.ts +222 -0
- package/src/NumberInput/numberParser.ts +403 -0
- package/src/Outline/Outline.tsx +3 -2
- package/src/OverflowList/OverflowList.tsx +3 -2
- package/src/Overlay/Overlay.tsx +3 -2
- package/src/Pagination/Pagination.test.tsx +3 -2
- package/src/Popover/Popover.test.tsx +14 -0
- package/src/Popover/Popover.tsx +1 -9
- package/src/Popover/usePopover.tsx +57 -32
- package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
- package/src/PowerSearch/PowerSearch.test.tsx +240 -1
- package/src/PowerSearch/PowerSearch.tsx +34 -5
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +288 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
- package/src/PowerSearch/PowerSearchValueEditor.test.tsx +111 -1
- package/src/PowerSearch/PowerSearchValueEditor.tsx +124 -10
- package/src/PowerSearch/types.ts +2 -0
- package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
- package/src/PowerSearch/usePowerSearchSource.ts +13 -3
- package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
- package/src/ProgressBar/ProgressBar.test.tsx +24 -0
- package/src/ProgressBar/ProgressBar.tsx +28 -8
- package/src/Resizable/ResizeHandle.tsx +3 -2
- package/src/SegmentedControl/SegmentedControl.tsx +3 -2
- package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
- package/src/SelectableCard/SelectableCard.tsx +19 -2
- package/src/Selector/Selector.doc.mjs +26 -1
- package/src/Selector/Selector.test.tsx +346 -1
- package/src/Selector/Selector.tsx +148 -21
- package/src/Selector/hooks.ts +17 -2
- package/src/SideNav/SideNav.doc.mjs +6 -6
- package/src/SideNav/SideNav.tsx +4 -2
- package/src/SideNav/SideNavHeading.tsx +12 -12
- package/src/SideNav/SideNavItem.tsx +4 -2
- package/src/Slider/Slider.test.tsx +106 -1
- package/src/Slider/Slider.tsx +55 -3
- package/src/Spinner/Spinner.test.tsx +147 -1
- package/src/Spinner/Spinner.tsx +120 -101
- package/src/StatusDot/StatusDot.doc.mjs +8 -2
- package/src/StatusDot/StatusDot.test.tsx +9 -0
- package/src/StatusDot/StatusDot.tsx +7 -1
- package/src/Stepper/Step.doc.mjs +98 -0
- package/src/Stepper/Step.tsx +1638 -0
- package/src/Stepper/StepStatus.ts +26 -0
- package/src/Stepper/Stepper.doc.mjs +370 -0
- package/src/Stepper/Stepper.test.tsx +1024 -0
- package/src/Stepper/Stepper.tsx +258 -0
- package/src/Stepper/StepperContext.ts +71 -0
- package/src/Stepper/index.ts +18 -0
- package/src/Stepper/stepper.stylex.ts +19 -0
- package/src/Switch/Switch.doc.mjs +2 -0
- package/src/Switch/Switch.test.tsx +10 -0
- package/src/Switch/Switch.tsx +6 -2
- package/src/TabList/Tab.doc.mjs +13 -1
- package/src/TabList/Tab.tsx +67 -7
- package/src/TabList/TabList.doc.mjs +22 -6
- package/src/TabList/TabList.test.tsx +559 -0
- package/src/TabList/TabList.tsx +490 -22
- package/src/TabList/TabListContext.ts +13 -2
- package/src/TabList/TabMenu.tsx +3 -2
- package/src/TabList/index.ts +6 -2
- package/src/Table/BaseTable.tsx +12 -4
- package/src/Table/Table.doc.mjs +9 -2
- package/src/Table/Table.test.tsx +132 -14
- package/src/Table/Table.tsx +3 -8
- package/src/Table/TableBody.doc.mjs +40 -0
- package/src/Table/TableFooter.doc.mjs +40 -0
- package/src/Table/TableHeader.doc.mjs +40 -0
- package/src/Table/TableRow.tsx +16 -5
- package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
- package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
- package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +67 -12
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
- package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
- package/src/Table/plugins/selection/useTableSelection.test.tsx +138 -0
- package/src/Table/plugins/selection/useTableSelection.tsx +63 -7
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
- package/src/Table/types.ts +22 -4
- package/src/Table/useBaseTablePlugins.ts +5 -0
- package/src/Table/useTableGroupedRows.doc.mjs +5 -4
- package/src/Table/useTablePagination.doc.mjs +7 -0
- package/src/Table/useTableRowStatus.doc.mjs +1 -1
- package/src/Table/useTableSelection.doc.mjs +31 -0
- package/src/Text/Text.test.tsx +67 -1
- package/src/Text/Text.tsx +6 -3
- package/src/TextArea/TextArea.doc.mjs +12 -2
- package/src/TextArea/TextArea.test.tsx +11 -0
- package/src/TextArea/TextArea.tsx +37 -24
- package/src/TextInput/TextInput.doc.mjs +10 -0
- package/src/TextInput/TextInput.tsx +3 -2
- package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
- package/src/TimeInput/TimeInput.tsx +2 -2
- package/src/Timestamp/Timestamp.test.tsx +58 -0
- package/src/Timestamp/Timestamp.tsx +12 -10
- package/src/Toast/Toast.doc.mjs +26 -12
- package/src/Toast/Toast.tsx +28 -4
- package/src/Toast/ToastViewport.test.tsx +536 -8
- package/src/Toast/ToastViewport.tsx +81 -12
- package/src/Token/Token.test.tsx +95 -0
- package/src/Token/Token.tsx +15 -10
- package/src/Token/TokenLink.tsx +14 -5
- package/src/Tokenizer/Tokenizer.doc.mjs +43 -3
- package/src/Tokenizer/Tokenizer.test.tsx +161 -0
- package/src/Tokenizer/Tokenizer.tsx +53 -24
- package/src/Toolbar/Toolbar.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.test.tsx +32 -0
- package/src/Tooltip/Tooltip.tsx +5 -0
- package/src/Tooltip/useTooltip.tsx +47 -24
- package/src/TopNav/TopNavHeading.tsx +5 -4
- package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
- package/src/TopNav/TopNavMegaMenu.tsx +47 -5
- package/src/TopNav/TopNavMenu.test.tsx +133 -1
- package/src/TopNav/TopNavMenu.tsx +38 -7
- package/src/TreeList/TreeList.test.tsx +49 -0
- package/src/TreeList/TreeList.tsx +7 -2
- package/src/Typeahead/BaseTypeahead.doc.mjs +24 -0
- package/src/Typeahead/BaseTypeahead.tsx +181 -39
- package/src/Typeahead/Typeahead.doc.mjs +11 -0
- package/src/Typeahead/Typeahead.test.tsx +203 -0
- package/src/Typeahead/Typeahead.tsx +12 -2
- package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
- package/src/Typeahead/TypeaheadItem.tsx +8 -1
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useAnnounce.doc.mjs +96 -0
- package/src/hooks/useContainerReveal.doc.mjs +2 -2
- package/src/hooks/useDevWarning.doc.mjs +96 -0
- package/src/hooks/useFocusTrap.test.tsx +14 -0
- package/src/hooks/useFocusTrap.ts +62 -111
- package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
- package/src/hooks/useHotkeys.ts +3 -18
- package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
- package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
- package/src/hooks/useInteractiveRole.doc.mjs +119 -0
- package/src/hooks/useLongPress.doc.mjs +123 -0
- package/src/hooks/useMergedRefs.doc.mjs +79 -0
- package/src/hooks/useMergedRefs.test.tsx +62 -0
- package/src/hooks/useMergedRefs.ts +36 -0
- package/src/hooks/useTypeahead.doc.mjs +153 -0
- package/src/index.ts +1 -0
- package/src/raw-import.d.ts +14 -0
- package/src/theme/MediaTheme.doc.mjs +5 -5
- package/src/theme/Theme.test.tsx +104 -2
- package/src/theme/Theme.tsx +49 -14
- package/src/theme/defineTheme.test.ts +23 -0
- package/src/theme/derivedVarRegistry.test.ts +26 -3
- package/src/theme/derivedVarRegistry.ts +23 -4
- package/src/theme/generateThemeRules.test.ts +99 -1
- package/src/theme/generateThemeRules.ts +28 -0
- package/src/theme/syntax/tokens.ts +5 -2
- package/src/utils/groupItems.ts +12 -6
- package/src/utils/index.ts +1 -1
- package/src/utils/isApplePlatform.test.ts +61 -0
- package/src/utils/isApplePlatform.ts +37 -0
- package/src/utils/sharedResizeObserver.ts +10 -2
- package/src/utils/timeParser.test.ts +6 -1
- package/src/utils/timeParser.ts +35 -13
- package/src/__tests__/inputWidthContract.test.tsx +0 -69
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import {describe, it, expect} from 'vitest';
|
|
15
|
-
import {
|
|
15
|
+
import type {ReactNode} from 'react';
|
|
16
|
+
import {render, screen, fireEvent} from '@testing-library/react';
|
|
17
|
+
import userEvent from '@testing-library/user-event';
|
|
16
18
|
import {transformSync} from '@babel/core';
|
|
17
19
|
import stylexBabelPlugin from '@stylexjs/babel-plugin';
|
|
18
20
|
import {readFileSync} from 'node:fs';
|
|
@@ -611,5 +613,406 @@ describe('ButtonGroup', () => {
|
|
|
611
613
|
none.querySelector('[role="group"]')!.className,
|
|
612
614
|
);
|
|
613
615
|
});
|
|
616
|
+
|
|
617
|
+
it('exposes the elevation to a theme as a data attribute', () => {
|
|
618
|
+
render(
|
|
619
|
+
<ButtonGroup label="Actions" elevation="high">
|
|
620
|
+
<Button label="One" />
|
|
621
|
+
</ButtonGroup>,
|
|
622
|
+
);
|
|
623
|
+
|
|
624
|
+
expect(screen.getByRole('group')).toHaveAttribute(
|
|
625
|
+
'data-elevation',
|
|
626
|
+
'high',
|
|
627
|
+
);
|
|
628
|
+
});
|
|
629
|
+
|
|
630
|
+
it('reports flat on a member, since the group owns the surface', () => {
|
|
631
|
+
render(
|
|
632
|
+
<ButtonGroup label="Actions" elevation="high">
|
|
633
|
+
<Button label="One" elevation="high" />
|
|
634
|
+
</ButtonGroup>,
|
|
635
|
+
);
|
|
636
|
+
|
|
637
|
+
expect(screen.getByRole('button', {name: 'One'})).toHaveAttribute(
|
|
638
|
+
'data-elevation',
|
|
639
|
+
'none',
|
|
640
|
+
);
|
|
641
|
+
});
|
|
642
|
+
});
|
|
643
|
+
|
|
644
|
+
// ===========================================================================
|
|
645
|
+
// Keyboard navigation
|
|
646
|
+
//
|
|
647
|
+
// The group wires useListFocus, so arrow keys move focus between members.
|
|
648
|
+
// The last two tests cover the boundary: a member can own a layer, whose
|
|
649
|
+
// keys belong to that layer, and the group itself can sit inside a layer,
|
|
650
|
+
// whose keys are still the group's own. Both must hold at once.
|
|
651
|
+
// ===========================================================================
|
|
652
|
+
describe('keyboard navigation', () => {
|
|
653
|
+
const clipboard = (
|
|
654
|
+
<ButtonGroup label="Actions">
|
|
655
|
+
<Button label="Copy" />
|
|
656
|
+
<Button label="Cut" />
|
|
657
|
+
<Button label="Paste" />
|
|
658
|
+
</ButtonGroup>
|
|
659
|
+
);
|
|
660
|
+
|
|
661
|
+
it('moves focus between members with the arrow keys, wrapping at the end', async () => {
|
|
662
|
+
const user = userEvent.setup();
|
|
663
|
+
render(clipboard);
|
|
664
|
+
|
|
665
|
+
screen.getByRole('button', {name: 'Copy'}).focus();
|
|
666
|
+
|
|
667
|
+
await user.keyboard('{ArrowRight}');
|
|
668
|
+
expect(screen.getByRole('button', {name: 'Cut'})).toHaveFocus();
|
|
669
|
+
|
|
670
|
+
await user.keyboard('{ArrowRight}{ArrowRight}');
|
|
671
|
+
expect(screen.getByRole('button', {name: 'Copy'})).toHaveFocus();
|
|
672
|
+
|
|
673
|
+
await user.keyboard('{ArrowLeft}');
|
|
674
|
+
expect(screen.getByRole('button', {name: 'Paste'})).toHaveFocus();
|
|
675
|
+
});
|
|
676
|
+
|
|
677
|
+
it('jumps to the first and last member with Home and End', async () => {
|
|
678
|
+
const user = userEvent.setup();
|
|
679
|
+
render(clipboard);
|
|
680
|
+
|
|
681
|
+
screen.getByRole('button', {name: 'Cut'}).focus();
|
|
682
|
+
|
|
683
|
+
await user.keyboard('{End}');
|
|
684
|
+
expect(screen.getByRole('button', {name: 'Paste'})).toHaveFocus();
|
|
685
|
+
|
|
686
|
+
await user.keyboard('{Home}');
|
|
687
|
+
expect(screen.getByRole('button', {name: 'Copy'})).toHaveFocus();
|
|
688
|
+
});
|
|
689
|
+
|
|
690
|
+
it('uses the vertical arrows when the group is vertical', async () => {
|
|
691
|
+
const user = userEvent.setup();
|
|
692
|
+
render(
|
|
693
|
+
<ButtonGroup label="Actions" orientation="vertical">
|
|
694
|
+
<Button label="Copy" />
|
|
695
|
+
<Button label="Cut" />
|
|
696
|
+
</ButtonGroup>,
|
|
697
|
+
);
|
|
698
|
+
|
|
699
|
+
screen.getByRole('button', {name: 'Copy'}).focus();
|
|
700
|
+
|
|
701
|
+
await user.keyboard('{ArrowDown}');
|
|
702
|
+
expect(screen.getByRole('button', {name: 'Cut'})).toHaveFocus();
|
|
703
|
+
|
|
704
|
+
await user.keyboard('{ArrowUp}');
|
|
705
|
+
expect(screen.getByRole('button', {name: 'Copy'})).toHaveFocus();
|
|
706
|
+
});
|
|
707
|
+
|
|
708
|
+
it('follows visual direction in RTL', async () => {
|
|
709
|
+
const user = userEvent.setup();
|
|
710
|
+
// dir sits on the group because jsdom resolves computed direction from
|
|
711
|
+
// the element's own attribute, not from an ancestor.
|
|
712
|
+
render(
|
|
713
|
+
<ButtonGroup label="Actions" dir="rtl">
|
|
714
|
+
<Button label="Copy" />
|
|
715
|
+
<Button label="Cut" />
|
|
716
|
+
<Button label="Paste" />
|
|
717
|
+
</ButtonGroup>,
|
|
718
|
+
);
|
|
719
|
+
screen.getByRole('button', {name: 'Copy'}).focus();
|
|
720
|
+
|
|
721
|
+
await user.keyboard('{ArrowLeft}');
|
|
722
|
+
expect(screen.getByRole('button', {name: 'Cut'})).toHaveFocus();
|
|
723
|
+
|
|
724
|
+
await user.keyboard('{ArrowRight}');
|
|
725
|
+
expect(screen.getByRole('button', {name: 'Copy'})).toHaveFocus();
|
|
726
|
+
});
|
|
727
|
+
|
|
728
|
+
it('skips a disabled member', async () => {
|
|
729
|
+
const user = userEvent.setup();
|
|
730
|
+
render(
|
|
731
|
+
<ButtonGroup label="Actions">
|
|
732
|
+
<Button label="Copy" />
|
|
733
|
+
<Button label="Cut" isDisabled />
|
|
734
|
+
<Button label="Paste" />
|
|
735
|
+
</ButtonGroup>,
|
|
736
|
+
);
|
|
737
|
+
|
|
738
|
+
screen.getByRole('button', {name: 'Copy'}).focus();
|
|
739
|
+
|
|
740
|
+
await user.keyboard('{ArrowRight}');
|
|
741
|
+
expect(screen.getByRole('button', {name: 'Paste'})).toHaveFocus();
|
|
742
|
+
});
|
|
743
|
+
|
|
744
|
+
it('leaves arrow keys to a member\u2019s open menu', async () => {
|
|
745
|
+
const user = userEvent.setup();
|
|
746
|
+
render(
|
|
747
|
+
<ButtonGroup label="Approve action">
|
|
748
|
+
<Button label="Allow once" />
|
|
749
|
+
<DropdownMenu
|
|
750
|
+
hasChevron={false}
|
|
751
|
+
button={{label: 'Allow options', isIconOnly: true}}
|
|
752
|
+
items={[{label: 'Allow for 30 minutes'}, {label: 'Always allow'}]}
|
|
753
|
+
/>
|
|
754
|
+
</ButtonGroup>,
|
|
755
|
+
);
|
|
756
|
+
|
|
757
|
+
await user.click(screen.getByRole('button', {name: /Allow options/}));
|
|
758
|
+
const item = screen.getByRole('menuitem', {
|
|
759
|
+
name: 'Allow for 30 minutes',
|
|
760
|
+
hidden: true,
|
|
761
|
+
});
|
|
762
|
+
item.focus();
|
|
763
|
+
|
|
764
|
+
// Assert positively: the menu item keeps focus. `.not.toHaveFocus()` on
|
|
765
|
+
// the group's buttons would also pass if the group had thrown focus
|
|
766
|
+
// somewhere else entirely.
|
|
767
|
+
fireEvent.keyDown(item, {key: 'ArrowRight'});
|
|
768
|
+
expect(item).toHaveFocus();
|
|
769
|
+
|
|
770
|
+
fireEvent.keyDown(item, {key: 'ArrowLeft'});
|
|
771
|
+
expect(item).toHaveFocus();
|
|
772
|
+
|
|
773
|
+
// End belongs to the menu's own list focus, so it lands on the last menu
|
|
774
|
+
// item rather than the group's last button.
|
|
775
|
+
fireEvent.keyDown(item, {key: 'End'});
|
|
776
|
+
expect(
|
|
777
|
+
screen.getByRole('menuitem', {name: 'Always allow', hidden: true}),
|
|
778
|
+
).toHaveFocus();
|
|
779
|
+
});
|
|
780
|
+
|
|
781
|
+
it('leaves a link member in the arrow order', async () => {
|
|
782
|
+
const user = userEvent.setup();
|
|
783
|
+
render(
|
|
784
|
+
<ButtonGroup label="Docs actions">
|
|
785
|
+
<Button label="Save" />
|
|
786
|
+
<Button label="Docs" href="https://example.com" />
|
|
787
|
+
<Button label="Print" />
|
|
788
|
+
</ButtonGroup>,
|
|
789
|
+
);
|
|
790
|
+
|
|
791
|
+
screen.getByRole('button', {name: 'Save'}).focus();
|
|
792
|
+
|
|
793
|
+
await user.keyboard('{ArrowRight}');
|
|
794
|
+
expect(screen.getByRole('link', {name: 'Docs'})).toHaveFocus();
|
|
795
|
+
|
|
796
|
+
await user.keyboard('{ArrowRight}');
|
|
797
|
+
expect(screen.getByRole('button', {name: 'Print'})).toHaveFocus();
|
|
798
|
+
});
|
|
799
|
+
|
|
800
|
+
it('still moves between its own members when the group sits inside a popover', async () => {
|
|
801
|
+
const user = userEvent.setup();
|
|
802
|
+
// A group rendered inside a Popover, ContextMenu, HoverCard or Toast has
|
|
803
|
+
// a `[popover]` ancestor, because that is how useLayer mounts a layer.
|
|
804
|
+
// A bare `popover` div is the same DOM fact without the layer harness.
|
|
805
|
+
render(
|
|
806
|
+
<div popover="manual">
|
|
807
|
+
<ButtonGroup label="Actions">
|
|
808
|
+
<Button label="Copy" />
|
|
809
|
+
<Button label="Cut" />
|
|
810
|
+
<Button label="Paste" />
|
|
811
|
+
</ButtonGroup>
|
|
812
|
+
</div>,
|
|
813
|
+
);
|
|
814
|
+
|
|
815
|
+
// A closed popover is display:none in jsdom, so its contents read as
|
|
816
|
+
// inaccessible; focus and key handling still work on them.
|
|
817
|
+
const button = (name: string) =>
|
|
818
|
+
screen.getByRole('button', {name, hidden: true});
|
|
819
|
+
|
|
820
|
+
button('Copy').focus();
|
|
821
|
+
|
|
822
|
+
await user.keyboard('{ArrowRight}');
|
|
823
|
+
expect(button('Cut')).toHaveFocus();
|
|
824
|
+
|
|
825
|
+
await user.keyboard('{End}');
|
|
826
|
+
expect(button('Paste')).toHaveFocus();
|
|
827
|
+
|
|
828
|
+
await user.keyboard('{Home}');
|
|
829
|
+
expect(button('Copy')).toHaveFocus();
|
|
830
|
+
});
|
|
831
|
+
});
|
|
832
|
+
|
|
833
|
+
// ===========================================================================
|
|
834
|
+
// Roving tabindex
|
|
835
|
+
//
|
|
836
|
+
// The group is a single tab stop: exactly one enabled member carries
|
|
837
|
+
// tabindex="0", the rest carry -1, and the stop moves with arrow navigation.
|
|
838
|
+
// Entering and leaving is asserted through the real tab order as well as the
|
|
839
|
+
// attribute, because the attribute alone says nothing about a member the
|
|
840
|
+
// itemSelector missed — such a member stays natively tabbable and quietly
|
|
841
|
+
// adds a second stop.
|
|
842
|
+
// ===========================================================================
|
|
843
|
+
describe('roving tabindex', () => {
|
|
844
|
+
const tabIndexOf = (name: string) =>
|
|
845
|
+
screen.getByRole('button', {name}).getAttribute('tabindex');
|
|
846
|
+
|
|
847
|
+
const bracketed = (group: ReactNode) => (
|
|
848
|
+
<>
|
|
849
|
+
<button type="button">before</button>
|
|
850
|
+
{group}
|
|
851
|
+
<button type="button">after</button>
|
|
852
|
+
</>
|
|
853
|
+
);
|
|
854
|
+
|
|
855
|
+
const clipboard = (
|
|
856
|
+
<ButtonGroup label="Actions">
|
|
857
|
+
<Button label="Copy" />
|
|
858
|
+
<Button label="Cut" />
|
|
859
|
+
<Button label="Paste" />
|
|
860
|
+
</ButtonGroup>
|
|
861
|
+
);
|
|
862
|
+
|
|
863
|
+
it('gives the group one tab stop, on the first member', () => {
|
|
864
|
+
render(clipboard);
|
|
865
|
+
|
|
866
|
+
expect(tabIndexOf('Copy')).toBe('0');
|
|
867
|
+
expect(tabIndexOf('Cut')).toBe('-1');
|
|
868
|
+
expect(tabIndexOf('Paste')).toBe('-1');
|
|
869
|
+
});
|
|
870
|
+
|
|
871
|
+
it('takes one Tab to enter and one to leave', async () => {
|
|
872
|
+
const user = userEvent.setup();
|
|
873
|
+
render(bracketed(clipboard));
|
|
874
|
+
|
|
875
|
+
await user.tab();
|
|
876
|
+
expect(screen.getByRole('button', {name: 'before'})).toHaveFocus();
|
|
877
|
+
|
|
878
|
+
await user.tab();
|
|
879
|
+
expect(screen.getByRole('button', {name: 'Copy'})).toHaveFocus();
|
|
880
|
+
|
|
881
|
+
await user.tab();
|
|
882
|
+
expect(screen.getByRole('button', {name: 'after'})).toHaveFocus();
|
|
883
|
+
});
|
|
884
|
+
|
|
885
|
+
it('moves the tab stop with arrow navigation', async () => {
|
|
886
|
+
const user = userEvent.setup();
|
|
887
|
+
render(clipboard);
|
|
888
|
+
|
|
889
|
+
screen.getByRole('button', {name: 'Copy'}).focus();
|
|
890
|
+
await user.keyboard('{ArrowRight}');
|
|
891
|
+
|
|
892
|
+
expect(tabIndexOf('Copy')).toBe('-1');
|
|
893
|
+
expect(tabIndexOf('Cut')).toBe('0');
|
|
894
|
+
});
|
|
895
|
+
|
|
896
|
+
it('never parks the tab stop on a disabled member', () => {
|
|
897
|
+
render(
|
|
898
|
+
<ButtonGroup label="Actions">
|
|
899
|
+
<Button label="Copy" isDisabled />
|
|
900
|
+
<Button label="Cut" />
|
|
901
|
+
<Button label="Paste" />
|
|
902
|
+
</ButtonGroup>,
|
|
903
|
+
);
|
|
904
|
+
|
|
905
|
+
expect(tabIndexOf('Copy')).toBe('-1');
|
|
906
|
+
expect(tabIndexOf('Cut')).toBe('0');
|
|
907
|
+
});
|
|
908
|
+
|
|
909
|
+
it('repairs the tab stop when the member holding it unmounts', () => {
|
|
910
|
+
const {rerender} = render(
|
|
911
|
+
<ButtonGroup label="Actions">
|
|
912
|
+
<Button label="Copy" />
|
|
913
|
+
<Button label="Cut" />
|
|
914
|
+
</ButtonGroup>,
|
|
915
|
+
);
|
|
916
|
+
expect(tabIndexOf('Copy')).toBe('0');
|
|
917
|
+
|
|
918
|
+
rerender(
|
|
919
|
+
<ButtonGroup label="Actions">
|
|
920
|
+
<Button label="Cut" />
|
|
921
|
+
</ButtonGroup>,
|
|
922
|
+
);
|
|
923
|
+
|
|
924
|
+
expect(tabIndexOf('Cut')).toBe('0');
|
|
925
|
+
});
|
|
926
|
+
|
|
927
|
+
it('repairs the tab stop when the member holding it becomes disabled', () => {
|
|
928
|
+
const {rerender} = render(
|
|
929
|
+
<ButtonGroup label="Actions">
|
|
930
|
+
<Button label="Copy" />
|
|
931
|
+
<Button label="Cut" />
|
|
932
|
+
</ButtonGroup>,
|
|
933
|
+
);
|
|
934
|
+
expect(tabIndexOf('Copy')).toBe('0');
|
|
935
|
+
|
|
936
|
+
rerender(
|
|
937
|
+
<ButtonGroup label="Actions">
|
|
938
|
+
<Button label="Copy" isDisabled />
|
|
939
|
+
<Button label="Cut" />
|
|
940
|
+
</ButtonGroup>,
|
|
941
|
+
);
|
|
942
|
+
|
|
943
|
+
expect(tabIndexOf('Copy')).toBe('-1');
|
|
944
|
+
expect(tabIndexOf('Cut')).toBe('0');
|
|
945
|
+
});
|
|
946
|
+
|
|
947
|
+
it('counts a link member as the tab stop', async () => {
|
|
948
|
+
const user = userEvent.setup();
|
|
949
|
+
render(
|
|
950
|
+
bracketed(
|
|
951
|
+
<ButtonGroup label="Docs actions">
|
|
952
|
+
<Button label="Docs" href="https://example.com" />
|
|
953
|
+
<Button label="Print" />
|
|
954
|
+
</ButtonGroup>,
|
|
955
|
+
),
|
|
956
|
+
);
|
|
957
|
+
|
|
958
|
+
expect(
|
|
959
|
+
screen.getByRole('link', {name: 'Docs'}).getAttribute('tabindex'),
|
|
960
|
+
).toBe('0');
|
|
961
|
+
expect(tabIndexOf('Print')).toBe('-1');
|
|
962
|
+
|
|
963
|
+
await user.tab();
|
|
964
|
+
await user.tab();
|
|
965
|
+
expect(screen.getByRole('link', {name: 'Docs'})).toHaveFocus();
|
|
966
|
+
|
|
967
|
+
await user.tab();
|
|
968
|
+
expect(screen.getByRole('button', {name: 'after'})).toHaveFocus();
|
|
969
|
+
});
|
|
970
|
+
|
|
971
|
+
it('contributes no tab stop when the whole group is disabled', async () => {
|
|
972
|
+
const user = userEvent.setup();
|
|
973
|
+
render(
|
|
974
|
+
bracketed(
|
|
975
|
+
<ButtonGroup label="Actions" isDisabled>
|
|
976
|
+
<Button label="Copy" />
|
|
977
|
+
<Button label="Cut" />
|
|
978
|
+
</ButtonGroup>,
|
|
979
|
+
),
|
|
980
|
+
);
|
|
981
|
+
|
|
982
|
+
await user.tab();
|
|
983
|
+
expect(screen.getByRole('button', {name: 'before'})).toHaveFocus();
|
|
984
|
+
|
|
985
|
+
await user.tab();
|
|
986
|
+
expect(screen.getByRole('button', {name: 'after'})).toHaveFocus();
|
|
987
|
+
});
|
|
988
|
+
|
|
989
|
+
it('leaves the tab stop on its own members when a member owns an open menu', async () => {
|
|
990
|
+
const user = userEvent.setup();
|
|
991
|
+
render(
|
|
992
|
+
<ButtonGroup label="Approve action">
|
|
993
|
+
<Button label="Allow once" />
|
|
994
|
+
<DropdownMenu
|
|
995
|
+
hasChevron={false}
|
|
996
|
+
button={{label: 'Allow options', isIconOnly: true}}
|
|
997
|
+
items={[{label: 'Allow for 30 minutes'}, {label: 'Always allow'}]}
|
|
998
|
+
/>
|
|
999
|
+
</ButtonGroup>,
|
|
1000
|
+
);
|
|
1001
|
+
|
|
1002
|
+
const trigger = screen.getByRole('button', {name: /Allow options/});
|
|
1003
|
+
expect(tabIndexOf('Allow once')).toBe('0');
|
|
1004
|
+
expect(trigger.getAttribute('tabindex')).toBe('-1');
|
|
1005
|
+
|
|
1006
|
+
await user.click(trigger);
|
|
1007
|
+
|
|
1008
|
+
// The menu's own items are a different list level (the boundary), so the
|
|
1009
|
+
// group must not stamp them or hand them its tab stop.
|
|
1010
|
+
const item = screen.getByRole('menuitem', {
|
|
1011
|
+
name: 'Allow for 30 minutes',
|
|
1012
|
+
hidden: true,
|
|
1013
|
+
});
|
|
1014
|
+
expect(item.getAttribute('tabindex')).not.toBe('0');
|
|
1015
|
+
expect(tabIndexOf('Allow once')).toBe('0');
|
|
1016
|
+
});
|
|
614
1017
|
});
|
|
615
1018
|
});
|
|
@@ -28,12 +28,13 @@ import {radiusVars, shadowVars} from '../theme/tokens.stylex';
|
|
|
28
28
|
import type {Elevation} from '../utils/types';
|
|
29
29
|
import {SizeProvider, useSize} from '../SizeContext/SizeContext';
|
|
30
30
|
import {useListFocus} from '../hooks/useListFocus';
|
|
31
|
-
import {mergeProps,
|
|
31
|
+
import {mergeProps, composeEventHandlers} from '../utils';
|
|
32
32
|
import type {BaseProps} from '../BaseProps';
|
|
33
33
|
import {ButtonGroupContext} from './ButtonGroupContext';
|
|
34
34
|
import type {ButtonGroupOrientation} from './ButtonGroupContext';
|
|
35
35
|
import {themeProps} from '../utils/themeProps';
|
|
36
36
|
|
|
37
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
37
38
|
// =============================================================================
|
|
38
39
|
// Props
|
|
39
40
|
// =============================================================================
|
|
@@ -130,6 +131,10 @@ const elevationStyles = stylex.create({
|
|
|
130
131
|
* Children automatically detect the group via context and apply position-aware
|
|
131
132
|
* styles in pure CSS.
|
|
132
133
|
*
|
|
134
|
+
* The group is a single tab stop: arrow keys move between members along the
|
|
135
|
+
* orientation, Home/End jump to the ends, focus wraps, and disabled members are
|
|
136
|
+
* skipped (the APG roving tabindex technique, via `useListFocus`).
|
|
137
|
+
*
|
|
133
138
|
* Members that render their own layer — a Button with a `tooltip`, or a
|
|
134
139
|
* DropdownMenu — compose correctly, including as the trailing member.
|
|
135
140
|
*
|
|
@@ -166,13 +171,25 @@ export function ButtonGroup({
|
|
|
166
171
|
ref,
|
|
167
172
|
'data-testid': testId,
|
|
168
173
|
onKeyDown,
|
|
174
|
+
onFocus,
|
|
169
175
|
...props
|
|
170
176
|
}: ButtonGroupProps): ReactNode {
|
|
171
177
|
const size = useSize(sizeProp, 'md');
|
|
172
178
|
|
|
173
|
-
const {listRef, handleKeyDown} = useListFocus<HTMLDivElement>({
|
|
174
|
-
|
|
179
|
+
const {listRef, handleKeyDown, handleFocus} = useListFocus<HTMLDivElement>({
|
|
180
|
+
// Roving rewrites `tabindex` on every item, so the selector cannot key off
|
|
181
|
+
// a value: `[tabindex="0"]` would drop each member the moment it is
|
|
182
|
+
// stamped -1. `a[href]` catches a Button rendered with `href`.
|
|
183
|
+
itemSelector: 'button, a[href], [tabindex]',
|
|
184
|
+
// A member's layer renders inline inside the group (useLayer does not
|
|
185
|
+
// portal it), so a key pressed in an open DropdownMenu bubbles here. The
|
|
186
|
+
// boundary is the group's own root or any layer, whichever is nearer to
|
|
187
|
+
// the target. Naming the group's own root is what keeps a group rendered
|
|
188
|
+
// inside a Popover or Toast working: bailing on any [popover] ancestor
|
|
189
|
+
// instead would swallow every arrow key it owns.
|
|
190
|
+
boundarySelector: '[role="group"], [popover]',
|
|
175
191
|
orientation,
|
|
192
|
+
hasRovingTabIndex: true,
|
|
176
193
|
});
|
|
177
194
|
|
|
178
195
|
const contextValue = useMemo(
|
|
@@ -184,10 +201,10 @@ export function ButtonGroup({
|
|
|
184
201
|
<ButtonGroupContext value={contextValue}>
|
|
185
202
|
<SizeProvider value={size}>
|
|
186
203
|
<div
|
|
187
|
-
ref={
|
|
204
|
+
ref={useMergedRefs(ref, listRef)}
|
|
188
205
|
{...props}
|
|
189
206
|
{...mergeProps(
|
|
190
|
-
themeProps('button-group', {size, orientation}),
|
|
207
|
+
themeProps('button-group', {size, orientation, elevation}),
|
|
191
208
|
stylex.props(
|
|
192
209
|
styles.group,
|
|
193
210
|
orientation === 'vertical' && styles.vertical,
|
|
@@ -200,6 +217,7 @@ export function ButtonGroup({
|
|
|
200
217
|
role="group"
|
|
201
218
|
aria-label={label}
|
|
202
219
|
onKeyDown={composeEventHandlers(onKeyDown, handleKeyDown)}
|
|
220
|
+
onFocus={composeEventHandlers(onFocus, handleFocus)}
|
|
203
221
|
aria-disabled={isDisabled || undefined}
|
|
204
222
|
data-testid={testId}>
|
|
205
223
|
{children}
|
|
@@ -78,12 +78,13 @@ export const docs = {
|
|
|
78
78
|
name: 'minRangeSpan',
|
|
79
79
|
type: 'number',
|
|
80
80
|
description:
|
|
81
|
-
'Range mode: min days a range must span, both endpoints counted (2 forbids a single-day range). Default 1.',
|
|
81
|
+
'Range mode: min days a range must span, both endpoints counted (2 forbids a single-day range). Clicking the start again commits a one-day range when allowed, or cancels the in-progress selection when the minimum is longer. Default 1.',
|
|
82
82
|
},
|
|
83
83
|
{
|
|
84
84
|
name: 'focusDate',
|
|
85
85
|
type: 'ISODateString',
|
|
86
|
-
description:
|
|
86
|
+
description:
|
|
87
|
+
'Controlled visible month. Unset, the calendar opens on the selected date, else on today clamped into the min/max window.',
|
|
87
88
|
},
|
|
88
89
|
{
|
|
89
90
|
name: 'onFocusDateChange',
|
|
@@ -155,8 +156,8 @@ export const docsZh = {
|
|
|
155
156
|
{name: 'max', type: 'ISODateString', description: '可选择的最晚日期。'},
|
|
156
157
|
{name: 'dateConstraints', type: 'Array<(date: Date) => boolean>', description: '自定义约束函数。'},
|
|
157
158
|
{name: 'maxRangeSpan', type: 'number', description: '范围模式:范围最多可跨越的天数,含首尾两端(7 = 7 天窗口)。选定起始日后限制窗口大小。'},
|
|
158
|
-
{name: 'minRangeSpan', type: 'number', description: '范围模式:范围最少需跨越的天数,含首尾两端(2
|
|
159
|
-
{name: 'focusDate', type: 'ISODateString', description: '
|
|
159
|
+
{name: 'minRangeSpan', type: 'number', description: '范围模式:范围最少需跨越的天数,含首尾两端(2 表示禁止单日范围)。再次点击开始日期时,若最小范围允许则提交单日范围;否则取消进行中的选择。默认为 1。'},
|
|
160
|
+
{name: 'focusDate', type: 'ISODateString', description: '受控可见月份。未设置时,日历打开时显示已选日期所在月份;若无选中值,则显示今天,并将其限制在 min/max 范围内。'},
|
|
160
161
|
{name: 'onFocusDateChange', type: '(focusDate: ISODateString) => void', description: '导航回调函数。'},
|
|
161
162
|
{name: 'handleRef', type: 'React.Ref<CalendarHandle>', description: '日历导航的命令式句柄,包括 navigateTo()。'},
|
|
162
163
|
{name: 'hasOutsideDays', type: 'boolean', description: '显示相邻月份的日期。', default: 'true'},
|
|
@@ -220,8 +221,8 @@ export const docsDense = {
|
|
|
220
221
|
max: 'maximum selectable date',
|
|
221
222
|
dateConstraints: 'custom constraint fns',
|
|
222
223
|
maxRangeSpan: 'range mode: max days a range may span, both ends counted (7 = 7-day window)',
|
|
223
|
-
minRangeSpan: 'range mode: min days a range must span, both ends counted (default 1)',
|
|
224
|
-
focusDate: 'controlled visible month',
|
|
224
|
+
minRangeSpan: 'range mode: min days a range must span, both ends counted; repeated start click commits one day when allowed, otherwise cancels (default 1)',
|
|
225
|
+
focusDate: 'controlled visible month (default: selected date, else today clamped into min/max)',
|
|
225
226
|
onFocusDateChange: 'navigation callback',
|
|
226
227
|
handleRef: 'imperative navigation handle',
|
|
227
228
|
hasOutsideDays: 'show days from adjacent months',
|