@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
|
@@ -19,10 +19,15 @@
|
|
|
19
19
|
* - `::backdrop` pseudo-element
|
|
20
20
|
* - Body scroll lock
|
|
21
21
|
* - Focus trapping
|
|
22
|
-
*
|
|
22
|
+
*
|
|
23
|
+
* Escape is owned by the shared dismissal stack (`useLayerDismissal`), so a
|
|
24
|
+
* drawer opened over another layer takes the press and nothing behind it
|
|
25
|
+
* closes. The native `cancel` event still handles the dismissals the browser
|
|
26
|
+
* starts itself, such as the Android back gesture.
|
|
23
27
|
*
|
|
24
28
|
* SYNC: When modified, update these files to stay in sync:
|
|
25
29
|
* - /packages/core/src/MobileNav/index.ts (exports if types change)
|
|
30
|
+
* - /packages/core/src/Layer/useLayerDismissal.ts (dismissal stack)
|
|
26
31
|
* - /packages/core/src/hooks/scrollbarGutter.ts (shared scroll-lock gutter)
|
|
27
32
|
* - /packages/cli/assets/templates/blocks/components/MobileNav/ (showcase blocks)
|
|
28
33
|
*/
|
|
@@ -52,12 +57,15 @@ import {
|
|
|
52
57
|
holdScrollbarGutter,
|
|
53
58
|
type ScrollbarGutterHold,
|
|
54
59
|
} from '../hooks/scrollbarGutter';
|
|
55
|
-
import {mergeProps,
|
|
60
|
+
import {mergeProps, composeEventHandlers} from '../utils';
|
|
56
61
|
import {overlayPaddingReset} from '../Layout/padding.stylex';
|
|
62
|
+
import {LayerDepthProvider} from '../Layer/LayerDepthContext';
|
|
63
|
+
import {useLayerDismissal} from '../Layer/useLayerDismissal';
|
|
57
64
|
import type {BaseProps} from '../BaseProps';
|
|
58
65
|
import {themeProps} from '../utils/themeProps';
|
|
59
66
|
import {useTranslator} from '../i18n';
|
|
60
67
|
|
|
68
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
61
69
|
// =============================================================================
|
|
62
70
|
// Styles
|
|
63
71
|
// =============================================================================
|
|
@@ -536,13 +544,28 @@ export function MobileNav({
|
|
|
536
544
|
};
|
|
537
545
|
}, []);
|
|
538
546
|
|
|
539
|
-
|
|
547
|
+
const {shouldDismissOnCloseRequest} = useLayerDismissal({
|
|
548
|
+
isActive: isOpen,
|
|
549
|
+
onDismiss: () => onOpenChange(false),
|
|
550
|
+
});
|
|
551
|
+
|
|
552
|
+
// The native `cancel` event is the browser's own close-watcher firing: an
|
|
553
|
+
// Android back gesture, or a close request the stack never saw a press for.
|
|
554
|
+
// Escape presses the stack owns never arrive here — it preventDefault()s
|
|
555
|
+
// those, which suppresses the close watcher.
|
|
556
|
+
//
|
|
557
|
+
// Always preventDefault so the browser cannot close a controlled <dialog>
|
|
558
|
+
// behind React's back, then answer with the stack's own rules: top-most
|
|
559
|
+
// only, and never while an IME composition is in progress.
|
|
540
560
|
const handleCancel = useCallback(
|
|
541
561
|
(event: React.SyntheticEvent<HTMLDialogElement>) => {
|
|
542
562
|
event.preventDefault();
|
|
563
|
+
if (!shouldDismissOnCloseRequest()) {
|
|
564
|
+
return;
|
|
565
|
+
}
|
|
543
566
|
onOpenChange(false);
|
|
544
567
|
},
|
|
545
|
-
[onOpenChange],
|
|
568
|
+
[onOpenChange, shouldDismissOnCloseRequest],
|
|
546
569
|
);
|
|
547
570
|
|
|
548
571
|
// Handle clicks on the dialog backdrop area (outside the drawer)
|
|
@@ -561,7 +584,7 @@ export function MobileNav({
|
|
|
561
584
|
|
|
562
585
|
return (
|
|
563
586
|
<dialog
|
|
564
|
-
ref={
|
|
587
|
+
ref={useMergedRefs(ref, dialogRef)}
|
|
565
588
|
id={dialogId}
|
|
566
589
|
{...mergeProps(
|
|
567
590
|
themeProps('mobile-nav', {side: resolvedSide}),
|
|
@@ -586,38 +609,41 @@ export function MobileNav({
|
|
|
586
609
|
}
|
|
587
610
|
onClick={composeEventHandlers(onClickProp, handleDialogClick)}
|
|
588
611
|
onCancel={handleCancel}>
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
612
|
+
<LayerDepthProvider>
|
|
613
|
+
{/* Drawer panel — tabIndex so showModal() focuses the drawer, not the close button */}
|
|
614
|
+
<div
|
|
615
|
+
tabIndex={-1}
|
|
616
|
+
{...stylex.props(
|
|
617
|
+
styles.drawer,
|
|
618
|
+
dynamicStyles.width(width),
|
|
619
|
+
isStart && styles.drawerStart,
|
|
620
|
+
isStart && isOpen && styles.drawerStartOpen,
|
|
621
|
+
!isStart && styles.drawerEnd,
|
|
622
|
+
!isStart && isOpen && styles.drawerEndOpen,
|
|
623
|
+
)}>
|
|
624
|
+
{/* Header — content + close button */}
|
|
625
|
+
<div
|
|
626
|
+
{...stylex.props(styles.header, !header && styles.headerNoTitle)}>
|
|
627
|
+
{typeof header === 'string' ? (
|
|
628
|
+
<Heading level={2} xstyle={styles.headerText}>
|
|
629
|
+
{header}
|
|
630
|
+
</Heading>
|
|
631
|
+
) : (
|
|
632
|
+
(header ?? null)
|
|
633
|
+
)}
|
|
634
|
+
<Button
|
|
635
|
+
variant="ghost"
|
|
636
|
+
label={t('@astryx.mobileNav.closeNavigation')}
|
|
637
|
+
icon={<Icon icon="close" color="inherit" />}
|
|
638
|
+
onClick={() => onOpenChange(false)}
|
|
639
|
+
isIconOnly
|
|
640
|
+
/>
|
|
641
|
+
</div>
|
|
642
|
+
|
|
643
|
+
{/* Scrollable content */}
|
|
644
|
+
<div {...stylex.props(styles.content)}>{children}</div>
|
|
616
645
|
</div>
|
|
617
|
-
|
|
618
|
-
{/* Scrollable content */}
|
|
619
|
-
<div {...stylex.props(styles.content)}>{children}</div>
|
|
620
|
-
</div>
|
|
646
|
+
</LayerDepthProvider>
|
|
621
647
|
</dialog>
|
|
622
648
|
);
|
|
623
649
|
}
|
|
@@ -46,7 +46,8 @@ export const docs = {
|
|
|
46
46
|
type: 'boolean',
|
|
47
47
|
description: 'Whether the menu trigger is disabled.',
|
|
48
48
|
default: 'false',
|
|
49
|
-
},
|
|
49
|
+
},
|
|
50
|
+
{
|
|
50
51
|
name: 'placement',
|
|
51
52
|
type: "'above' | 'below' | 'start' | 'end'",
|
|
52
53
|
description:
|
|
@@ -60,6 +61,11 @@ export const docs = {
|
|
|
60
61
|
"Alignment along the placement axis. Use 'end' to align the menu with the trigger's trailing edge, which is usually what an overflow menu wants.",
|
|
61
62
|
default: "'start'",
|
|
62
63
|
},
|
|
64
|
+
{
|
|
65
|
+
name: 'onOpenChange',
|
|
66
|
+
type: '(isOpen: boolean) => void',
|
|
67
|
+
description: 'Callback fired when the menu opens or closes.',
|
|
68
|
+
},
|
|
63
69
|
{
|
|
64
70
|
name: 'xstyle',
|
|
65
71
|
type: 'StyleXStyles',
|
|
@@ -25,7 +25,10 @@ export const docs = {
|
|
|
25
25
|
visualProps: ['variant', 'size', 'status'],
|
|
26
26
|
states: ['disabled'],
|
|
27
27
|
},
|
|
28
|
-
{
|
|
28
|
+
{
|
|
29
|
+
className: 'astryx-multi-selector-clear-icon',
|
|
30
|
+
deprecatedFor: 'input-clear-icon',
|
|
31
|
+
},
|
|
29
32
|
{className: 'astryx-multi-selector-empty-state'},
|
|
30
33
|
{className: 'astryx-multi-selector-search'},
|
|
31
34
|
{className: 'astryx-multi-selector-section-heading'},
|
|
@@ -103,6 +106,12 @@ export const docs = {
|
|
|
103
106
|
description: 'How to display selected items in the trigger.',
|
|
104
107
|
default: "'count'",
|
|
105
108
|
},
|
|
109
|
+
{
|
|
110
|
+
name: 'formatValue',
|
|
111
|
+
type: '(items: {value: string; label: string}[]) => string',
|
|
112
|
+
description:
|
|
113
|
+
'Formats the trigger text when triggerDisplay="count" or "labels". Receives the selected items (value plus resolved label); the count is items.length. Not used by triggerDisplay="badges".',
|
|
114
|
+
},
|
|
106
115
|
{
|
|
107
116
|
name: 'maxBadges',
|
|
108
117
|
type: 'number',
|
|
@@ -133,6 +142,20 @@ export const docs = {
|
|
|
133
142
|
description: 'Placeholder text for the search input.',
|
|
134
143
|
default: "'Search...'",
|
|
135
144
|
},
|
|
145
|
+
{
|
|
146
|
+
name: 'emptyText',
|
|
147
|
+
type: 'ReactNode',
|
|
148
|
+
description:
|
|
149
|
+
'Content shown in the dropdown panel when there are no options to show, and announced in a polite live region when the panel opens (a string override is announced verbatim; a richer node falls back to the default text). Not shown while isLoading.',
|
|
150
|
+
default: "'No options'",
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: 'emptySearchText',
|
|
154
|
+
type: 'ReactNode',
|
|
155
|
+
description:
|
|
156
|
+
'Content shown in the dropdown panel when a search query matches no options, and announced in a polite live region at the same time (a string override is announced verbatim; a richer node falls back to the default text).',
|
|
157
|
+
default: "'No results found'",
|
|
158
|
+
},
|
|
136
159
|
{
|
|
137
160
|
name: 'isDisabled',
|
|
138
161
|
type: 'boolean',
|
|
@@ -207,6 +230,23 @@ export const docs = {
|
|
|
207
230
|
description:
|
|
208
231
|
'Width of the field (number = pixels, string used as-is, e.g. "100%"). Sizes the whole field (label, control, and status) so they stay aligned.',
|
|
209
232
|
},
|
|
233
|
+
{
|
|
234
|
+
name: 'startIcon',
|
|
235
|
+
type: 'IconType | ReactNode',
|
|
236
|
+
description: 'Icon displayed at the start of the selector trigger.',
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
name: 'hasClear',
|
|
240
|
+
type: 'boolean',
|
|
241
|
+
description: 'Shows a clear button when values are selected.',
|
|
242
|
+
default: 'false',
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
name: 'isDefaultOpen',
|
|
246
|
+
type: 'boolean',
|
|
247
|
+
description: 'Whether the dropdown starts open on mount.',
|
|
248
|
+
default: 'false',
|
|
249
|
+
},
|
|
210
250
|
{
|
|
211
251
|
name: 'xstyle',
|
|
212
252
|
type: 'StyleXStyles',
|
|
@@ -284,12 +324,16 @@ export const docsZh = {
|
|
|
284
324
|
placeholder: '未选择值时显示的占位文本。',
|
|
285
325
|
size: '选择器的尺寸变体。',
|
|
286
326
|
triggerDisplay: '在触发器中显示选中项的方式。',
|
|
327
|
+
formatValue:
|
|
328
|
+
'格式化 triggerDisplay="count" 或 "labels" 时的触发器文本。接收选中项(value 及解析后的 label),数量为 items.length。triggerDisplay="badges" 不使用此属性。',
|
|
287
329
|
maxBadges:
|
|
288
330
|
'显示"+N"之前的最大徽章数。仅适用于 triggerDisplay="badges"。',
|
|
289
331
|
hasSelectAll: '是否显示全选复选框。',
|
|
290
332
|
selectAllLabel: '全选复选框的标签。',
|
|
291
333
|
hasSearch: '是否显示用于过滤选项的搜索输入。',
|
|
292
334
|
searchPlaceholder: '搜索输入的占位文本。',
|
|
335
|
+
emptyText: '没有可显示的选项时,下拉面板中显示的内容。',
|
|
336
|
+
emptySearchText: '搜索查询未匹配到任何选项时,下拉面板中显示的内容。',
|
|
293
337
|
isDisabled: '禁用选择器。',
|
|
294
338
|
htmlName:
|
|
295
339
|
'用于表单提交的 HTML name 属性。为每个已选值渲染一个隐藏输入,类似原生多选。',
|
|
@@ -420,11 +464,15 @@ export const docsDense = {
|
|
|
420
464
|
variant:
|
|
421
465
|
'visual trigger style: input bordered control or ghost toolbar control',
|
|
422
466
|
triggerDisplay: 'how to show selected in trigger',
|
|
467
|
+
formatValue:
|
|
468
|
+
'formats count/labels trigger text; receives selected items',
|
|
423
469
|
maxBadges: 'max badges before "+N"; badges mode only',
|
|
424
470
|
hasSelectAll: 'show select-all checkbox',
|
|
425
471
|
selectAllLabel: 'select-all label',
|
|
426
472
|
hasSearch: 'show search input',
|
|
427
473
|
searchPlaceholder: 'search placeholder',
|
|
474
|
+
emptyText: 'panel content when there are no options',
|
|
475
|
+
emptySearchText: 'panel content when the query matches nothing',
|
|
428
476
|
isDisabled: 'disables selector',
|
|
429
477
|
htmlName: 'HTML name attr; one hidden input per selected value.',
|
|
430
478
|
disabledMessage:
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
|
|
13
13
|
import {
|
|
14
|
+
act,
|
|
14
15
|
render,
|
|
15
16
|
screen,
|
|
16
17
|
fireEvent,
|
|
@@ -128,6 +129,90 @@ describe('MultiSelector', () => {
|
|
|
128
129
|
expect(screen.getByText('2 selected')).toBeInTheDocument();
|
|
129
130
|
});
|
|
130
131
|
|
|
132
|
+
it('formats the count display with formatValue', () => {
|
|
133
|
+
render(
|
|
134
|
+
<MultiSelector
|
|
135
|
+
label="Spaces"
|
|
136
|
+
options={defaultOptions}
|
|
137
|
+
value={['Apple', 'Banana']}
|
|
138
|
+
onChange={() => {}}
|
|
139
|
+
formatValue={items => `${items.length} spaces selected`}
|
|
140
|
+
/>,
|
|
141
|
+
);
|
|
142
|
+
expect(screen.getByText('2 spaces selected')).toBeInTheDocument();
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it('passes selected values and resolved labels to formatValue', () => {
|
|
146
|
+
const formatValue = vi.fn(
|
|
147
|
+
(items: {value: string; label: string}[]) =>
|
|
148
|
+
`${items[0].label} and ${items.length - 1} more`,
|
|
149
|
+
);
|
|
150
|
+
render(
|
|
151
|
+
<MultiSelector
|
|
152
|
+
label="Fruit"
|
|
153
|
+
options={[
|
|
154
|
+
{value: 'a', label: 'Apple'},
|
|
155
|
+
{value: 'b', label: 'Banana'},
|
|
156
|
+
]}
|
|
157
|
+
value={['a', 'b']}
|
|
158
|
+
onChange={() => {}}
|
|
159
|
+
formatValue={formatValue}
|
|
160
|
+
/>,
|
|
161
|
+
);
|
|
162
|
+
expect(formatValue).toHaveBeenCalledWith([
|
|
163
|
+
{value: 'a', label: 'Apple'},
|
|
164
|
+
{value: 'b', label: 'Banana'},
|
|
165
|
+
]);
|
|
166
|
+
expect(screen.getByText('Apple and 1 more')).toBeInTheDocument();
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('formats the labels display with formatValue', () => {
|
|
170
|
+
render(
|
|
171
|
+
<MultiSelector
|
|
172
|
+
label="Fruit"
|
|
173
|
+
options={defaultOptions}
|
|
174
|
+
value={['Apple', 'Banana', 'Orange']}
|
|
175
|
+
onChange={() => {}}
|
|
176
|
+
triggerDisplay="labels"
|
|
177
|
+
formatValue={items => items.map(item => item.label).join(' & ')}
|
|
178
|
+
/>,
|
|
179
|
+
);
|
|
180
|
+
expect(screen.getByText('Apple & Banana & Orange')).toBeInTheDocument();
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('ignores formatValue in badges display', () => {
|
|
184
|
+
render(
|
|
185
|
+
<MultiSelector
|
|
186
|
+
label="Fruit"
|
|
187
|
+
options={defaultOptions}
|
|
188
|
+
value={['Apple', 'Banana']}
|
|
189
|
+
onChange={() => {}}
|
|
190
|
+
triggerDisplay="badges"
|
|
191
|
+
formatValue={() => 'formatted'}
|
|
192
|
+
/>,
|
|
193
|
+
);
|
|
194
|
+
expect(screen.queryByText('formatted')).not.toBeInTheDocument();
|
|
195
|
+
const trigger = within(screen.getByRole('combobox'));
|
|
196
|
+
expect(trigger.getByText('Apple')).toBeInTheDocument();
|
|
197
|
+
expect(trigger.getByText('Banana')).toBeInTheDocument();
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it('shows the placeholder rather than calling formatValue when empty', () => {
|
|
201
|
+
const formatValue = vi.fn(() => 'formatted');
|
|
202
|
+
render(
|
|
203
|
+
<MultiSelector
|
|
204
|
+
label="Fruit"
|
|
205
|
+
options={defaultOptions}
|
|
206
|
+
value={[]}
|
|
207
|
+
onChange={() => {}}
|
|
208
|
+
placeholder="Pick fruits..."
|
|
209
|
+
formatValue={formatValue}
|
|
210
|
+
/>,
|
|
211
|
+
);
|
|
212
|
+
expect(screen.getByText('Pick fruits...')).toBeInTheDocument();
|
|
213
|
+
expect(formatValue).not.toHaveBeenCalled();
|
|
214
|
+
});
|
|
215
|
+
|
|
131
216
|
it('shows labels display', () => {
|
|
132
217
|
render(
|
|
133
218
|
<MultiSelector
|
|
@@ -353,6 +438,7 @@ describe('MultiSelector', () => {
|
|
|
353
438
|
|
|
354
439
|
await user.keyboard('{Tab}');
|
|
355
440
|
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
441
|
+
expect(screen.getByRole('button', {name: 'Next'})).toHaveFocus();
|
|
356
442
|
});
|
|
357
443
|
|
|
358
444
|
it('supports keyboard navigation with ArrowDown/ArrowUp', async () => {
|
|
@@ -826,6 +912,176 @@ describe('MultiSelector', () => {
|
|
|
826
912
|
expect(empty).toHaveAttribute('role', 'presentation');
|
|
827
913
|
});
|
|
828
914
|
|
|
915
|
+
it('renders emptySearchText in place of the default message', async () => {
|
|
916
|
+
const user = userEvent.setup();
|
|
917
|
+
render(
|
|
918
|
+
<MultiSelector
|
|
919
|
+
label="Fruit"
|
|
920
|
+
options={defaultOptions}
|
|
921
|
+
value={[]}
|
|
922
|
+
onChange={() => {}}
|
|
923
|
+
hasSearch
|
|
924
|
+
emptySearchText="Nothing like that here"
|
|
925
|
+
/>,
|
|
926
|
+
);
|
|
927
|
+
|
|
928
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
929
|
+
await user.type(screen.getByRole('combobox', h), 'xyz');
|
|
930
|
+
|
|
931
|
+
const listbox = screen.getByRole('listbox', h);
|
|
932
|
+
expect(
|
|
933
|
+
within(listbox).getByText('Nothing like that here'),
|
|
934
|
+
).toBeInTheDocument();
|
|
935
|
+
expect(
|
|
936
|
+
within(listbox).queryByText('No results found'),
|
|
937
|
+
).not.toBeInTheDocument();
|
|
938
|
+
});
|
|
939
|
+
|
|
940
|
+
it('renders emptyText, not emptySearchText, with no options and no query', async () => {
|
|
941
|
+
const user = userEvent.setup();
|
|
942
|
+
render(
|
|
943
|
+
<MultiSelector
|
|
944
|
+
label="Fruit"
|
|
945
|
+
options={[]}
|
|
946
|
+
value={[]}
|
|
947
|
+
onChange={() => {}}
|
|
948
|
+
hasSearch
|
|
949
|
+
emptySearchText="Nothing like that here"
|
|
950
|
+
/>,
|
|
951
|
+
);
|
|
952
|
+
|
|
953
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
954
|
+
|
|
955
|
+
const listbox = screen.getByRole('listbox', h);
|
|
956
|
+
expect(within(listbox).getByText('No options')).toBeInTheDocument();
|
|
957
|
+
expect(
|
|
958
|
+
within(listbox).queryByText('Nothing like that here'),
|
|
959
|
+
).not.toBeInTheDocument();
|
|
960
|
+
});
|
|
961
|
+
|
|
962
|
+
it('announces emptySearchText, not the catalog default', async () => {
|
|
963
|
+
const user = userEvent.setup();
|
|
964
|
+
render(
|
|
965
|
+
<MultiSelector
|
|
966
|
+
label="Fruit"
|
|
967
|
+
options={defaultOptions}
|
|
968
|
+
value={[]}
|
|
969
|
+
onChange={() => {}}
|
|
970
|
+
hasSearch
|
|
971
|
+
emptySearchText="Nothing like that here"
|
|
972
|
+
/>,
|
|
973
|
+
);
|
|
974
|
+
|
|
975
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
976
|
+
await user.type(screen.getByRole('combobox', h), 'xyz');
|
|
977
|
+
|
|
978
|
+
// The panel message is role="presentation", so the live region is the
|
|
979
|
+
// only thing a screen reader gets — it has to say the same words.
|
|
980
|
+
await waitFor(() =>
|
|
981
|
+
expect(politeRegion()?.textContent).toBe('Nothing like that here'),
|
|
982
|
+
);
|
|
983
|
+
});
|
|
984
|
+
|
|
985
|
+
it('announces the empty state when opened with no options', async () => {
|
|
986
|
+
const user = userEvent.setup();
|
|
987
|
+
render(
|
|
988
|
+
<MultiSelector
|
|
989
|
+
label="Fruit"
|
|
990
|
+
options={[]}
|
|
991
|
+
value={[]}
|
|
992
|
+
onChange={() => {}}
|
|
993
|
+
emptyText="Add a fruit first"
|
|
994
|
+
/>,
|
|
995
|
+
);
|
|
996
|
+
|
|
997
|
+
await user.click(screen.getByRole('combobox', {name: 'Fruit'}));
|
|
998
|
+
|
|
999
|
+
await waitFor(() =>
|
|
1000
|
+
expect(politeRegion()?.textContent).toBe('Add a fruit first'),
|
|
1001
|
+
);
|
|
1002
|
+
});
|
|
1003
|
+
|
|
1004
|
+
it('shows and announces nothing while isLoading', async () => {
|
|
1005
|
+
const user = userEvent.setup();
|
|
1006
|
+
render(
|
|
1007
|
+
<MultiSelector
|
|
1008
|
+
label="Fruit"
|
|
1009
|
+
options={[]}
|
|
1010
|
+
value={[]}
|
|
1011
|
+
onChange={() => {}}
|
|
1012
|
+
isLoading
|
|
1013
|
+
/>,
|
|
1014
|
+
);
|
|
1015
|
+
|
|
1016
|
+
await user.click(screen.getByRole('combobox', {name: 'Fruit'}));
|
|
1017
|
+
|
|
1018
|
+
// useAnnounce writes on the next animation frame, so an immediate read
|
|
1019
|
+
// would pass whether or not anything was announced.
|
|
1020
|
+
await act(
|
|
1021
|
+
async () =>
|
|
1022
|
+
void (await new Promise(resolve => requestAnimationFrame(resolve))),
|
|
1023
|
+
);
|
|
1024
|
+
|
|
1025
|
+
// The options have not arrived, so "No options" would be a claim the
|
|
1026
|
+
// component cannot make; the trigger's spinner carries the state.
|
|
1027
|
+
const listbox = screen.getByRole('listbox', h);
|
|
1028
|
+
expect(within(listbox).queryByText('No options')).not.toBeInTheDocument();
|
|
1029
|
+
expect(politeRegion()?.textContent ?? '').toBe('');
|
|
1030
|
+
});
|
|
1031
|
+
|
|
1032
|
+
it('announces nothing while isLoading, matching the silent panel', async () => {
|
|
1033
|
+
const user = userEvent.setup();
|
|
1034
|
+
render(
|
|
1035
|
+
<MultiSelector
|
|
1036
|
+
label="Fruit"
|
|
1037
|
+
options={defaultOptions}
|
|
1038
|
+
value={[]}
|
|
1039
|
+
onChange={() => {}}
|
|
1040
|
+
hasSearch
|
|
1041
|
+
isLoading
|
|
1042
|
+
emptySearchText="Nothing like that here"
|
|
1043
|
+
/>,
|
|
1044
|
+
);
|
|
1045
|
+
|
|
1046
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
1047
|
+
await user.type(screen.getByRole('combobox', h), 'xyz');
|
|
1048
|
+
|
|
1049
|
+
// useAnnounce writes on the next animation frame, so an immediate read
|
|
1050
|
+
// would pass whether or not anything was announced.
|
|
1051
|
+
await act(
|
|
1052
|
+
async () =>
|
|
1053
|
+
void (await new Promise(resolve => requestAnimationFrame(resolve))),
|
|
1054
|
+
);
|
|
1055
|
+
|
|
1056
|
+
// The panel is deliberately blank while loading; the live region is the
|
|
1057
|
+
// only channel left, so a result there would be a claim the screen
|
|
1058
|
+
// refuses to make.
|
|
1059
|
+
const listbox = screen.getByRole('listbox', h);
|
|
1060
|
+
expect(
|
|
1061
|
+
within(listbox).queryByText('Nothing like that here'),
|
|
1062
|
+
).not.toBeInTheDocument();
|
|
1063
|
+
expect(politeRegion()?.textContent ?? '').toBe('');
|
|
1064
|
+
});
|
|
1065
|
+
|
|
1066
|
+
it('renders emptyText when there are no options and no search input', async () => {
|
|
1067
|
+
const user = userEvent.setup();
|
|
1068
|
+
render(
|
|
1069
|
+
<MultiSelector
|
|
1070
|
+
label="Fruit"
|
|
1071
|
+
options={[]}
|
|
1072
|
+
value={[]}
|
|
1073
|
+
onChange={() => {}}
|
|
1074
|
+
emptyText="Add a fruit first"
|
|
1075
|
+
/>,
|
|
1076
|
+
);
|
|
1077
|
+
|
|
1078
|
+
// Without hasSearch the trigger itself is the combobox.
|
|
1079
|
+
await user.click(screen.getByRole('combobox', {name: 'Fruit'}));
|
|
1080
|
+
|
|
1081
|
+
const listbox = screen.getByRole('listbox', h);
|
|
1082
|
+
expect(within(listbox).getByText('Add a fruit first')).toBeInTheDocument();
|
|
1083
|
+
});
|
|
1084
|
+
|
|
829
1085
|
describe('result announcements', () => {
|
|
830
1086
|
it('announces the match count politely while searching', async () => {
|
|
831
1087
|
const user = userEvent.setup();
|
|
@@ -1981,6 +2237,27 @@ describe('MultiSelector list structure', () => {
|
|
|
1981
2237
|
Node.DOCUMENT_POSITION_FOLLOWING,
|
|
1982
2238
|
).toBeTruthy();
|
|
1983
2239
|
});
|
|
2240
|
+
|
|
2241
|
+
it('hides a standalone divider from the accessibility tree (#4994)', async () => {
|
|
2242
|
+
const user = userEvent.setup();
|
|
2243
|
+
render(
|
|
2244
|
+
<MultiSelector
|
|
2245
|
+
label="Fruit"
|
|
2246
|
+
options={['Apple', {type: 'divider'}, 'Banana']}
|
|
2247
|
+
value={[]}
|
|
2248
|
+
onChange={() => {}}
|
|
2249
|
+
/>,
|
|
2250
|
+
);
|
|
2251
|
+
await user.click(screen.getByRole('combobox'));
|
|
2252
|
+
|
|
2253
|
+
// role="listbox" only permits option/group children. The divider still
|
|
2254
|
+
// renders role="separator" (unchanged visual/DOM), but must be excluded
|
|
2255
|
+
// from the accessibility tree so it never reaches the listbox's exposed
|
|
2256
|
+
// children (axe aria-required-children).
|
|
2257
|
+
const divider = document.querySelector('[role="separator"]');
|
|
2258
|
+
expect(divider).toBeTruthy();
|
|
2259
|
+
expect(divider).toHaveAttribute('aria-hidden', 'true');
|
|
2260
|
+
});
|
|
1984
2261
|
});
|
|
1985
2262
|
|
|
1986
2263
|
describe('MultiSelector search affordances', () => {
|
|
@@ -2383,4 +2660,38 @@ describe('MultiSelector popup theme target', () => {
|
|
|
2383
2660
|
expect(popup).not.toBe(layer);
|
|
2384
2661
|
expect(layer.contains(popup)).toBe(true);
|
|
2385
2662
|
});
|
|
2663
|
+
|
|
2664
|
+
it('stays closed when the trigger click follows its own light dismiss (#5004)', async () => {
|
|
2665
|
+
const user = userEvent.setup();
|
|
2666
|
+
render(
|
|
2667
|
+
<MultiSelector
|
|
2668
|
+
label="Fruit"
|
|
2669
|
+
options={['Apple', 'Banana', 'Cherry']}
|
|
2670
|
+
value={[]}
|
|
2671
|
+
onChange={() => {}}
|
|
2672
|
+
/>,
|
|
2673
|
+
);
|
|
2674
|
+
const trigger = screen.getByRole('combobox');
|
|
2675
|
+
await user.click(trigger);
|
|
2676
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'true');
|
|
2677
|
+
|
|
2678
|
+
// The browser dismissed the popup on pointerup and queued the toggle. When
|
|
2679
|
+
// that event lands before the click — WebKit, or any engine under load —
|
|
2680
|
+
// the click used to read a closed popup and reopen it.
|
|
2681
|
+
fireEvent.pointerDown(trigger);
|
|
2682
|
+
const popover = document.querySelector('[popover]') as HTMLElement;
|
|
2683
|
+
act(() => {
|
|
2684
|
+
popover.dispatchEvent(
|
|
2685
|
+
Object.assign(new Event('toggle'), {
|
|
2686
|
+
oldState: 'open',
|
|
2687
|
+
newState: 'closed',
|
|
2688
|
+
}),
|
|
2689
|
+
);
|
|
2690
|
+
});
|
|
2691
|
+
// Synchronously: the click falls inside the one gesture the guard covers,
|
|
2692
|
+
// as it does in a browser a few milliseconds behind the dismissal.
|
|
2693
|
+
fireEvent.click(trigger);
|
|
2694
|
+
|
|
2695
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
2696
|
+
});
|
|
2386
2697
|
});
|