@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
|
@@ -28,18 +28,19 @@ import React, {
|
|
|
28
28
|
type ReactNode,
|
|
29
29
|
} from 'react';
|
|
30
30
|
import * as stylex from '@stylexjs/stylex';
|
|
31
|
-
import {
|
|
31
|
+
import {usePopoverInternal} from '../Popover/usePopover';
|
|
32
32
|
import {useTooltip} from '../Tooltip';
|
|
33
33
|
import {Icon, renderIconSlot, type IconType} from '../Icon';
|
|
34
34
|
import type {IconName} from '../Icon';
|
|
35
35
|
import {
|
|
36
36
|
Field,
|
|
37
|
-
InputClearButton,
|
|
38
37
|
inputStatusBorderStyles,
|
|
39
38
|
inputStatusHoverShadowStyles,
|
|
40
39
|
inputWrapperStyles,
|
|
41
40
|
type FieldStatusVariant,
|
|
42
41
|
} from '../Field';
|
|
42
|
+
import {useKeepLayerOpenProps} from '../Layer/useLayer';
|
|
43
|
+
import {InternalInputClearButton} from '../Field/InputClearButton';
|
|
43
44
|
import {Divider} from '../Divider';
|
|
44
45
|
import {Spinner} from '../Spinner';
|
|
45
46
|
import {PanelSearchInput} from '../Field/PanelSearchInput';
|
|
@@ -424,6 +425,11 @@ export type MultiSelectorStatusType = 'warning' | 'error' | 'success';
|
|
|
424
425
|
|
|
425
426
|
export type {MultiSelectorStatus};
|
|
426
427
|
|
|
428
|
+
export interface MultiSelectorSelectedItem {
|
|
429
|
+
value: string;
|
|
430
|
+
label: string;
|
|
431
|
+
}
|
|
432
|
+
|
|
427
433
|
export interface MultiSelectorProps<
|
|
428
434
|
T extends MultiSelectorOptionType = MultiSelectorOptionType,
|
|
429
435
|
> extends Omit<BaseProps, 'onChange' | 'defaultValue'> {
|
|
@@ -599,6 +605,25 @@ export interface MultiSelectorProps<
|
|
|
599
605
|
*/
|
|
600
606
|
searchPlaceholder?: string;
|
|
601
607
|
|
|
608
|
+
/**
|
|
609
|
+
* Content shown in the panel when there are no options to show, and
|
|
610
|
+
* announced in a polite live region when the panel opens. Not shown while
|
|
611
|
+
* `isLoading` — the options have not arrived yet.
|
|
612
|
+
* @default 'No options'
|
|
613
|
+
*/
|
|
614
|
+
emptyText?: ReactNode;
|
|
615
|
+
|
|
616
|
+
/**
|
|
617
|
+
* Content shown in the panel when a search query matches no options, and
|
|
618
|
+
* announced in a polite live region at the same time.
|
|
619
|
+
*
|
|
620
|
+
* The panel message is `role="presentation"`, so the live region is the only
|
|
621
|
+
* route to assistive tech: a string is announced verbatim, a richer node
|
|
622
|
+
* falls back to the default text since it cannot be spoken.
|
|
623
|
+
* @default 'No results found'
|
|
624
|
+
*/
|
|
625
|
+
emptySearchText?: ReactNode;
|
|
626
|
+
|
|
602
627
|
/**
|
|
603
628
|
* How to display selected items in the trigger.
|
|
604
629
|
* - 'count': "3 selected"
|
|
@@ -608,6 +633,17 @@ export interface MultiSelectorProps<
|
|
|
608
633
|
*/
|
|
609
634
|
triggerDisplay?: 'count' | 'labels' | 'badges';
|
|
610
635
|
|
|
636
|
+
/**
|
|
637
|
+
* Formats the trigger text when triggerDisplay is 'count' or 'labels'.
|
|
638
|
+
* Receives the selected items (value plus resolved label, in selection
|
|
639
|
+
* order) and returns the full trigger text; the count is `items.length`.
|
|
640
|
+
* Not called when nothing is selected — the placeholder shows instead — and
|
|
641
|
+
* not called for triggerDisplay 'badges', which renders Badge elements
|
|
642
|
+
* rather than text.
|
|
643
|
+
* @default items => `${items.length} selected` for 'count', "A, B, C, +N" for 'labels'
|
|
644
|
+
*/
|
|
645
|
+
formatValue?: (items: MultiSelectorSelectedItem[]) => string;
|
|
646
|
+
|
|
611
647
|
/**
|
|
612
648
|
* Maximum number of badges to show before showing "+N".
|
|
613
649
|
* Only used when triggerDisplay is 'badges'.
|
|
@@ -710,7 +746,10 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
710
746
|
selectAllLabel: selectAllLabelFromProps,
|
|
711
747
|
hasSearch = false,
|
|
712
748
|
searchPlaceholder: searchPlaceholderFromProps,
|
|
749
|
+
emptyText: emptyTextFromProps,
|
|
750
|
+
emptySearchText: emptySearchTextFromProps,
|
|
713
751
|
triggerDisplay = 'count',
|
|
752
|
+
formatValue,
|
|
714
753
|
maxBadges = 3,
|
|
715
754
|
renderOption,
|
|
716
755
|
indicatorPosition = 'start',
|
|
@@ -730,6 +769,9 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
730
769
|
selectAllLabelFromProps ?? t('@astryx.multiSelector.selectAll');
|
|
731
770
|
const searchPlaceholder =
|
|
732
771
|
searchPlaceholderFromProps ?? t('@astryx.multiSelector.searchPlaceholder');
|
|
772
|
+
const emptyText = emptyTextFromProps ?? t('@astryx.multiSelector.empty');
|
|
773
|
+
const emptySearchText =
|
|
774
|
+
emptySearchTextFromProps ?? t('@astryx.multiSelector.emptySearchResults');
|
|
733
775
|
const size = useSize(sizeProp, 'md');
|
|
734
776
|
const effectiveStatusVariant =
|
|
735
777
|
variant === 'ghost' && statusVariant === 'attached'
|
|
@@ -804,6 +846,19 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
804
846
|
// Announce selection-count changes politely (comboboxes-7 announce path).
|
|
805
847
|
// Toggling options / select-all previously produced no audible feedback.
|
|
806
848
|
const announce = useAnnounce();
|
|
849
|
+
|
|
850
|
+
// The panel's empty message is role="presentation" and reaches assistive tech
|
|
851
|
+
// only through this live region, so the region has to speak whatever the
|
|
852
|
+
// panel shows. A ReactNode override cannot be spoken; fall back to the
|
|
853
|
+
// catalog copy for that case rather than announcing nothing.
|
|
854
|
+
const emptyAnnouncement =
|
|
855
|
+
typeof emptyText === 'string'
|
|
856
|
+
? emptyText
|
|
857
|
+
: t('@astryx.multiSelector.empty');
|
|
858
|
+
const emptySearchAnnouncement =
|
|
859
|
+
typeof emptySearchText === 'string'
|
|
860
|
+
? emptySearchText
|
|
861
|
+
: t('@astryx.multiSelector.emptySearchResults');
|
|
807
862
|
const announceSelection = useCallback(
|
|
808
863
|
(nextValue: string[]) => {
|
|
809
864
|
const total = selectableItems.length;
|
|
@@ -889,7 +944,7 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
889
944
|
triggerRef.current?.focus();
|
|
890
945
|
}, [announce]);
|
|
891
946
|
|
|
892
|
-
const popover =
|
|
947
|
+
const popover = usePopoverInternal({
|
|
893
948
|
hasLightDismiss: true,
|
|
894
949
|
onHide: handleLayerHide,
|
|
895
950
|
hasCloseButton: false,
|
|
@@ -901,6 +956,7 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
901
956
|
// `usePopover` owns — not on the scrolling list inside it.
|
|
902
957
|
surfaceTarget: 'multi-selector-popup',
|
|
903
958
|
});
|
|
959
|
+
const keepOpenProps = useKeepLayerOpenProps(popover.id, popover.isOpen);
|
|
904
960
|
|
|
905
961
|
// Open dropdown on mount when isDefaultOpen is true
|
|
906
962
|
useEffect(() => {
|
|
@@ -923,16 +979,54 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
923
979
|
announce('');
|
|
924
980
|
return;
|
|
925
981
|
}
|
|
982
|
+
// While isLoading the panel deliberately shows nothing, so announcing a
|
|
983
|
+
// result would put a claim in the one channel the screen has gone quiet
|
|
984
|
+
// for.
|
|
985
|
+
if (isLoading) {
|
|
986
|
+
announce('');
|
|
987
|
+
return;
|
|
988
|
+
}
|
|
926
989
|
const count = filterOptionsByQuery(selectableItems, nextQuery).length;
|
|
927
990
|
announce(
|
|
928
991
|
count === 0
|
|
929
|
-
?
|
|
992
|
+
? emptySearchAnnouncement
|
|
930
993
|
: t('@astryx.multiSelector.resultCount', {count}),
|
|
931
994
|
);
|
|
932
995
|
},
|
|
933
|
-
[announce, selectableItems, t],
|
|
996
|
+
[announce, isLoading, selectableItems, emptySearchAnnouncement, t],
|
|
934
997
|
);
|
|
935
998
|
|
|
999
|
+
// The panel's empty message is role="presentation", so this region is the
|
|
1000
|
+
// only route to assistive tech. It has to watch the STATE rather than the
|
|
1001
|
+
// open event: the panel can become empty either on open or when a fetch
|
|
1002
|
+
// lands with nothing in it, and an open-only announcement leaves the second
|
|
1003
|
+
// case silent while the message sits on screen. The ref makes it fire once
|
|
1004
|
+
// per arrival at that state rather than on every re-render.
|
|
1005
|
+
const announcedEmptyRef = useRef<string | null>(null);
|
|
1006
|
+
useEffect(() => {
|
|
1007
|
+
const isPanelEmpty =
|
|
1008
|
+
popover.isOpen &&
|
|
1009
|
+
!isLoading &&
|
|
1010
|
+
searchQuery === '' &&
|
|
1011
|
+
selectableItems.length === 0;
|
|
1012
|
+
if (!isPanelEmpty) {
|
|
1013
|
+
announcedEmptyRef.current = null;
|
|
1014
|
+
return;
|
|
1015
|
+
}
|
|
1016
|
+
if (announcedEmptyRef.current === emptyAnnouncement) {
|
|
1017
|
+
return;
|
|
1018
|
+
}
|
|
1019
|
+
announcedEmptyRef.current = emptyAnnouncement;
|
|
1020
|
+
announce(emptyAnnouncement);
|
|
1021
|
+
}, [
|
|
1022
|
+
popover.isOpen,
|
|
1023
|
+
isLoading,
|
|
1024
|
+
searchQuery,
|
|
1025
|
+
selectableItems.length,
|
|
1026
|
+
emptyAnnouncement,
|
|
1027
|
+
announce,
|
|
1028
|
+
]);
|
|
1029
|
+
|
|
936
1030
|
// Handle toggle
|
|
937
1031
|
// Clear all selected values. Shared by the clear button and the keyboard
|
|
938
1032
|
// Delete/Backspace path so clearing is reachable without a mouse.
|
|
@@ -1070,6 +1164,7 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1070
1164
|
onKeyDown,
|
|
1071
1165
|
onItemMouseEnter,
|
|
1072
1166
|
} = useMultiCombobox({
|
|
1167
|
+
wasJustDismissed: popover.wasJustDismissed,
|
|
1073
1168
|
selectableItems: sortedItems,
|
|
1074
1169
|
isDisabled,
|
|
1075
1170
|
isOpen: popover.isOpen,
|
|
@@ -1107,13 +1202,18 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1107
1202
|
}, [popover.isOpen, highlightedIndex, getItemId]);
|
|
1108
1203
|
|
|
1109
1204
|
// Build trigger display content
|
|
1110
|
-
const
|
|
1205
|
+
const selectedItems = useMemo(() => {
|
|
1111
1206
|
return optimisticValue.map(v => {
|
|
1112
1207
|
const item = selectableItems.find(i => i.value === v);
|
|
1113
|
-
return item?.label ?? v;
|
|
1208
|
+
return {value: v, label: item?.label ?? v};
|
|
1114
1209
|
});
|
|
1115
1210
|
}, [optimisticValue, selectableItems]);
|
|
1116
1211
|
|
|
1212
|
+
const selectedLabels = useMemo(
|
|
1213
|
+
() => selectedItems.map(item => item.label),
|
|
1214
|
+
[selectedItems],
|
|
1215
|
+
);
|
|
1216
|
+
|
|
1117
1217
|
const renderTriggerContent = useCallback(() => {
|
|
1118
1218
|
if (optimisticValue.length === 0) {
|
|
1119
1219
|
return <span {...stylex.props(styles.triggerText)}>{placeholder}</span>;
|
|
@@ -1123,7 +1223,8 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1123
1223
|
case 'count':
|
|
1124
1224
|
return (
|
|
1125
1225
|
<span {...stylex.props(styles.triggerText)}>
|
|
1126
|
-
{
|
|
1226
|
+
{formatValue?.(selectedItems) ??
|
|
1227
|
+
`${optimisticValue.length} selected`}
|
|
1127
1228
|
</span>
|
|
1128
1229
|
);
|
|
1129
1230
|
|
|
@@ -1134,7 +1235,11 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1134
1235
|
remaining > 0
|
|
1135
1236
|
? `${displayed.join(', ')}, +${remaining}`
|
|
1136
1237
|
: displayed.join(', ');
|
|
1137
|
-
return
|
|
1238
|
+
return (
|
|
1239
|
+
<span {...stylex.props(styles.triggerText)}>
|
|
1240
|
+
{formatValue?.(selectedItems) ?? text}
|
|
1241
|
+
</span>
|
|
1242
|
+
);
|
|
1138
1243
|
}
|
|
1139
1244
|
|
|
1140
1245
|
case 'badges': {
|
|
@@ -1154,7 +1259,15 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1154
1259
|
);
|
|
1155
1260
|
}
|
|
1156
1261
|
}
|
|
1157
|
-
}, [
|
|
1262
|
+
}, [
|
|
1263
|
+
optimisticValue,
|
|
1264
|
+
triggerDisplay,
|
|
1265
|
+
selectedItems,
|
|
1266
|
+
selectedLabels,
|
|
1267
|
+
placeholder,
|
|
1268
|
+
formatValue,
|
|
1269
|
+
maxBadges,
|
|
1270
|
+
]);
|
|
1158
1271
|
|
|
1159
1272
|
// Render search input
|
|
1160
1273
|
const renderSearch = useCallback(() => {
|
|
@@ -1381,7 +1494,10 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1381
1494
|
// message out of the listbox's accessibility tree (role="listbox" only
|
|
1382
1495
|
// permits option/group children); the no-results outcome is announced
|
|
1383
1496
|
// via the result-count live region instead.
|
|
1384
|
-
|
|
1497
|
+
// While isLoading the options have not arrived yet, so asserting either
|
|
1498
|
+
// message would be a claim the component cannot make; the trigger's
|
|
1499
|
+
// spinner covers it.
|
|
1500
|
+
if (realItemCount === 0 && !isLoading) {
|
|
1385
1501
|
elements.push(
|
|
1386
1502
|
<div
|
|
1387
1503
|
key="empty"
|
|
@@ -1390,7 +1506,7 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1390
1506
|
themeProps('multi-selector-empty-state'),
|
|
1391
1507
|
stylex.props(styles.emptyState),
|
|
1392
1508
|
)}>
|
|
1393
|
-
|
|
1509
|
+
{searchQuery ? emptySearchText : emptyText}
|
|
1394
1510
|
</div>,
|
|
1395
1511
|
);
|
|
1396
1512
|
return elements;
|
|
@@ -1420,8 +1536,17 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1420
1536
|
// A standalone divider between groups would orphan itself once its
|
|
1421
1537
|
// neighbors are filtered out, so skip it while searching.
|
|
1422
1538
|
if (!isSearching) {
|
|
1539
|
+
// role="listbox" only permits option/group children; the divider
|
|
1540
|
+
// carries no information the options don't, so it's hidden from
|
|
1541
|
+
// the accessibility tree entirely rather than exposing
|
|
1542
|
+
// role="separator" as a disallowed listbox child (axe
|
|
1543
|
+
// aria-required-children).
|
|
1423
1544
|
elements.push(
|
|
1424
|
-
<Divider
|
|
1545
|
+
<Divider
|
|
1546
|
+
key={`divider-${i}`}
|
|
1547
|
+
aria-hidden="true"
|
|
1548
|
+
xstyle={styles.divider}
|
|
1549
|
+
/>,
|
|
1425
1550
|
);
|
|
1426
1551
|
}
|
|
1427
1552
|
} else if (isSection(option)) {
|
|
@@ -1471,7 +1596,16 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1471
1596
|
flushPending();
|
|
1472
1597
|
|
|
1473
1598
|
return elements;
|
|
1474
|
-
}, [
|
|
1599
|
+
}, [
|
|
1600
|
+
options,
|
|
1601
|
+
renderItem,
|
|
1602
|
+
sortedItems,
|
|
1603
|
+
searchQuery,
|
|
1604
|
+
hasSelectAll,
|
|
1605
|
+
isLoading,
|
|
1606
|
+
emptyText,
|
|
1607
|
+
emptySearchText,
|
|
1608
|
+
]);
|
|
1475
1609
|
|
|
1476
1610
|
// The detached message box renders its own leading status icon, so the
|
|
1477
1611
|
// on-field icon would duplicate it — keep the chevron indicator instead.
|
|
@@ -1573,7 +1707,8 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1573
1707
|
))}
|
|
1574
1708
|
{isBusy && <Spinner size="sm" />}
|
|
1575
1709
|
{hasClear && value.length > 0 && !isDisabled && (
|
|
1576
|
-
<
|
|
1710
|
+
<InternalInputClearButton
|
|
1711
|
+
{...keepOpenProps}
|
|
1577
1712
|
label={t('@astryx.multiSelector.clearAll', {label})}
|
|
1578
1713
|
onClick={handleClear}
|
|
1579
1714
|
iconClassName={stableClassName('multi-selector-clear-icon')}
|
|
@@ -1592,6 +1727,7 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1592
1727
|
type="button"
|
|
1593
1728
|
aria-label={t(STATUS_BUTTON_LABEL_KEY[status.type])}
|
|
1594
1729
|
aria-describedby={statusTooltip.describedBy}
|
|
1730
|
+
{...keepOpenProps}
|
|
1595
1731
|
onClick={e => e.stopPropagation()}
|
|
1596
1732
|
{...stylex.props(
|
|
1597
1733
|
focusOutlineStyles.focusVisible,
|
|
@@ -34,6 +34,12 @@ interface UseMultiComboboxOptions {
|
|
|
34
34
|
* The Delete/Backspace clear path is skipped when false.
|
|
35
35
|
*/
|
|
36
36
|
hasValue?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Whether the browser's light dismiss just closed the popup. The trigger
|
|
39
|
+
* click that follows belongs to that same press, so acting on it would
|
|
40
|
+
* reopen the popup the user just closed.
|
|
41
|
+
*/
|
|
42
|
+
wasJustDismissed?: () => boolean;
|
|
37
43
|
listboxId: string;
|
|
38
44
|
}
|
|
39
45
|
|
|
@@ -62,6 +68,7 @@ export function useMultiCombobox({
|
|
|
62
68
|
onToggle,
|
|
63
69
|
onClear,
|
|
64
70
|
hasValue = false,
|
|
71
|
+
wasJustDismissed,
|
|
65
72
|
listboxId,
|
|
66
73
|
}: UseMultiComboboxOptions): UseMultiComboboxResult {
|
|
67
74
|
const [highlightedIndex, setHighlightedIndex] = useState<number>(-1);
|
|
@@ -87,7 +94,7 @@ export function useMultiCombobox({
|
|
|
87
94
|
}, [onClose]);
|
|
88
95
|
|
|
89
96
|
const onTriggerClick = useCallback(() => {
|
|
90
|
-
if (isDisabled) {
|
|
97
|
+
if (isDisabled || wasJustDismissed?.()) {
|
|
91
98
|
return;
|
|
92
99
|
}
|
|
93
100
|
if (isOpen) {
|
|
@@ -98,7 +105,7 @@ export function useMultiCombobox({
|
|
|
98
105
|
setHighlightedIndex(0);
|
|
99
106
|
}
|
|
100
107
|
}
|
|
101
|
-
}, [isDisabled, isOpen, onOpen, closeAndReset, hasSearch]);
|
|
108
|
+
}, [isDisabled, wasJustDismissed, isOpen, onOpen, closeAndReset, hasSearch]);
|
|
102
109
|
|
|
103
110
|
const onItemMouseEnter = useCallback(
|
|
104
111
|
(item: MultiSelectorOptionData, index: number) => {
|
|
@@ -22,7 +22,10 @@ export const docs = {
|
|
|
22
22
|
],
|
|
23
23
|
theming: {
|
|
24
24
|
targets: [
|
|
25
|
-
{className: 'astryx-
|
|
25
|
+
{className: 'astryx-nav-icon'},
|
|
26
|
+
// Still emitted beside the names above, so themes written against
|
|
27
|
+
// them keep working. Drop in the next major.
|
|
28
|
+
{className: 'astryx-navicon', deprecatedFor: 'nav-icon'},
|
|
26
29
|
],
|
|
27
30
|
},
|
|
28
31
|
usage: {
|
|
@@ -51,7 +54,10 @@ export const docsZh = {
|
|
|
51
54
|
],
|
|
52
55
|
theming: {
|
|
53
56
|
targets: [
|
|
54
|
-
{className: 'astryx-
|
|
57
|
+
{className: 'astryx-nav-icon'},
|
|
58
|
+
// Still emitted beside the names above, so themes written against
|
|
59
|
+
// them keep working. Drop in the next major.
|
|
60
|
+
{className: 'astryx-navicon', deprecatedFor: 'nav-icon'},
|
|
55
61
|
],
|
|
56
62
|
},
|
|
57
63
|
usage: {
|
|
@@ -30,3 +30,12 @@ describe('NavIcon', () => {
|
|
|
30
30
|
expect(screen.getByTestId('nav-icon')).toBeInTheDocument();
|
|
31
31
|
});
|
|
32
32
|
});
|
|
33
|
+
|
|
34
|
+
describe('NavIcon theme target names', () => {
|
|
35
|
+
it('renders the deprecated class beside the current one', () => {
|
|
36
|
+
render(<NavIcon icon={<span>Icon</span>} data-testid="nav-icon" />);
|
|
37
|
+
const root = screen.getByTestId('nav-icon');
|
|
38
|
+
expect(root).toHaveClass('astryx-nav-icon');
|
|
39
|
+
expect(root).toHaveClass('astryx-navicon');
|
|
40
|
+
});
|
|
41
|
+
});
|
package/src/NavIcon/NavIcon.tsx
CHANGED
|
@@ -79,7 +79,11 @@ export function NavIcon({
|
|
|
79
79
|
<span
|
|
80
80
|
ref={ref}
|
|
81
81
|
{...mergeProps(
|
|
82
|
-
themeProps('
|
|
82
|
+
themeProps('nav-icon', undefined, {
|
|
83
|
+
// `navicon` ran the compound name together; themes styling it keep
|
|
84
|
+
// working until the next major.
|
|
85
|
+
legacyNames: ['navicon'],
|
|
86
|
+
}),
|
|
83
87
|
stylex.props(styles.base, xstyle),
|
|
84
88
|
className,
|
|
85
89
|
style,
|
|
@@ -321,3 +321,33 @@ describe('context forwarding', () => {
|
|
|
321
321
|
expect(closeMenu).toHaveBeenCalledOnce();
|
|
322
322
|
});
|
|
323
323
|
});
|
|
324
|
+
|
|
325
|
+
describe('NavHeadingMenu pass-through props', () => {
|
|
326
|
+
it('forwards pass-through props to the menu element', () => {
|
|
327
|
+
render(
|
|
328
|
+
<NavHeadingMenu aria-label="Products" id="products" data-source="nav">
|
|
329
|
+
<NavHeadingMenuItem label="First" />
|
|
330
|
+
</NavHeadingMenu>,
|
|
331
|
+
);
|
|
332
|
+
const menu = screen.getByRole('menu');
|
|
333
|
+
expect(menu).toHaveAttribute('aria-label', 'Products');
|
|
334
|
+
expect(menu).toHaveAttribute('id', 'products');
|
|
335
|
+
expect(menu).toHaveAttribute('data-source', 'nav');
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
it('runs a caller onKeyDown alongside the menu keyboard model', async () => {
|
|
339
|
+
const user = userEvent.setup();
|
|
340
|
+
const onKeyDown = vi.fn();
|
|
341
|
+
render(
|
|
342
|
+
<NavHeadingMenu onKeyDown={onKeyDown}>
|
|
343
|
+
<NavHeadingMenuItem label="First" />
|
|
344
|
+
<NavHeadingMenuItem label="Second" />
|
|
345
|
+
</NavHeadingMenu>,
|
|
346
|
+
);
|
|
347
|
+
const items = screen.getAllByRole('menuitem');
|
|
348
|
+
items[0].focus();
|
|
349
|
+
await user.keyboard('{ArrowDown}');
|
|
350
|
+
expect(onKeyDown).toHaveBeenCalled();
|
|
351
|
+
expect(items[1]).toHaveFocus();
|
|
352
|
+
});
|
|
353
|
+
});
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
import React, {useCallback, useMemo, type ReactNode} from 'react';
|
|
16
16
|
import * as stylex from '@stylexjs/stylex';
|
|
17
17
|
import {spacingVars} from '../theme/tokens.stylex';
|
|
18
|
-
import {
|
|
18
|
+
import {composeEventHandlers, mergeProps} from '../utils';
|
|
19
19
|
import type {BaseProps} from '../BaseProps';
|
|
20
20
|
import {useListFocus} from '../hooks/useListFocus';
|
|
21
21
|
import {useTypeahead} from '../hooks/useTypeahead';
|
|
@@ -26,6 +26,7 @@ import {
|
|
|
26
26
|
type NavHeadingMenuSize,
|
|
27
27
|
} from './NavMenuContext';
|
|
28
28
|
|
|
29
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
29
30
|
const styles = stylex.create({
|
|
30
31
|
root: {
|
|
31
32
|
display: 'flex',
|
|
@@ -95,6 +96,8 @@ export function NavHeadingMenu({
|
|
|
95
96
|
className,
|
|
96
97
|
style: styleProp,
|
|
97
98
|
'data-testid': testId,
|
|
99
|
+
onKeyDown: onKeyDownProp,
|
|
100
|
+
...rest
|
|
98
101
|
}: NavHeadingMenuProps) {
|
|
99
102
|
const closeCtx = useNavHeadingCloseContext();
|
|
100
103
|
const closeMenu = closeCtx?.closeMenu;
|
|
@@ -162,16 +165,17 @@ export function NavHeadingMenu({
|
|
|
162
165
|
return (
|
|
163
166
|
<NavHeadingMenuContext value={ctx}>
|
|
164
167
|
<div
|
|
165
|
-
ref={
|
|
166
|
-
role="menu"
|
|
167
|
-
onKeyDown={listKeyDown}
|
|
168
|
+
ref={useMergedRefs(ref, listRef)}
|
|
168
169
|
data-testid={testId}
|
|
169
170
|
{...mergeProps(
|
|
170
171
|
themeProps('nav-heading-menu', {size}),
|
|
171
172
|
stylex.props(styles.root, sizeStyles[size], xstyle),
|
|
172
173
|
className,
|
|
173
174
|
inlineStyle,
|
|
174
|
-
)}
|
|
175
|
+
)}
|
|
176
|
+
{...rest}
|
|
177
|
+
role="menu"
|
|
178
|
+
onKeyDown={composeEventHandlers(onKeyDownProp, listKeyDown)}>
|
|
175
179
|
{children}
|
|
176
180
|
</div>
|
|
177
181
|
</NavHeadingMenuContext>
|
|
@@ -35,7 +35,7 @@ export const docs = {
|
|
|
35
35
|
name: 'onChange',
|
|
36
36
|
type: '(value: number) => void',
|
|
37
37
|
description:
|
|
38
|
-
'Callback fired when
|
|
38
|
+
'Callback fired when a valid text edit commits on blur or Enter, or when a step or clear control changes the value.',
|
|
39
39
|
required: true,
|
|
40
40
|
},
|
|
41
41
|
{
|
|
@@ -61,6 +61,11 @@ export const docs = {
|
|
|
61
61
|
description:
|
|
62
62
|
'Whether the field is optional (mutually exclusive with isRequired).',
|
|
63
63
|
},
|
|
64
|
+
{
|
|
65
|
+
name: 'onKeyDown',
|
|
66
|
+
type: '(e: KeyboardEvent<HTMLInputElement>) => void',
|
|
67
|
+
description: 'Callback fired on keydown events on the input.',
|
|
68
|
+
},
|
|
64
69
|
{
|
|
65
70
|
name: 'isRequired',
|
|
66
71
|
type: 'boolean',
|
|
@@ -123,12 +128,14 @@ export const docs = {
|
|
|
123
128
|
{
|
|
124
129
|
name: 'min',
|
|
125
130
|
type: 'number | null',
|
|
126
|
-
description:
|
|
131
|
+
description:
|
|
132
|
+
'Minimum value allowed. A smaller entry commits at this value on blur or Enter.',
|
|
127
133
|
},
|
|
128
134
|
{
|
|
129
135
|
name: 'max',
|
|
130
136
|
type: 'number | null',
|
|
131
|
-
description:
|
|
137
|
+
description:
|
|
138
|
+
'Maximum value allowed. A larger entry commits at this value on blur or Enter.',
|
|
132
139
|
},
|
|
133
140
|
{
|
|
134
141
|
name: 'step',
|
|
@@ -237,6 +244,11 @@ export const docs = {
|
|
|
237
244
|
description:
|
|
238
245
|
'A form input for numeric values with built-in validation, min/max constraints, and step controls. Use NumberInput for quantities, measurements, percentages, and similar inputs.',
|
|
239
246
|
bestPractices: [
|
|
247
|
+
{
|
|
248
|
+
guidance: true,
|
|
249
|
+
description:
|
|
250
|
+
"Let people paste formatted numbers: a pasted 1,234,234,234 is read under the field's locale and commits as 1234234234 on blur. Typing is never intercepted.",
|
|
251
|
+
},
|
|
240
252
|
{
|
|
241
253
|
guidance: true,
|
|
242
254
|
description:
|
|
@@ -318,7 +330,8 @@ export const docsZh = {
|
|
|
318
330
|
{
|
|
319
331
|
name: 'onChange',
|
|
320
332
|
type: '(value: number) => void',
|
|
321
|
-
description:
|
|
333
|
+
description:
|
|
334
|
+
'有效文本编辑在失焦或按 Enter 时提交;步进或清除控件更改值时也会触发回调。',
|
|
322
335
|
required: true,
|
|
323
336
|
},
|
|
324
337
|
{
|
|
@@ -400,12 +413,12 @@ export const docsZh = {
|
|
|
400
413
|
{
|
|
401
414
|
name: 'min',
|
|
402
415
|
type: 'number | null',
|
|
403
|
-
description: '
|
|
416
|
+
description: '允许的最小值。更小的输入会在失焦或按 Enter 时提交为该值。',
|
|
404
417
|
},
|
|
405
418
|
{
|
|
406
419
|
name: 'max',
|
|
407
420
|
type: 'number | null',
|
|
408
|
-
description: '
|
|
421
|
+
description: '允许的最大值。更大的输入会在失焦或按 Enter 时提交为该值。',
|
|
409
422
|
},
|
|
410
423
|
{
|
|
411
424
|
name: 'step',
|
|
@@ -504,6 +517,11 @@ export const docsZh = {
|
|
|
504
517
|
description:
|
|
505
518
|
'A form input for numeric values with built-in validation, min/max constraints, and step controls. Use NumberInput for quantities, measurements, percentages, and similar inputs.',
|
|
506
519
|
bestPractices: [
|
|
520
|
+
{
|
|
521
|
+
guidance: true,
|
|
522
|
+
description:
|
|
523
|
+
'可以直接粘贴带格式的数字:粘贴 1,234,234,234 会按字段所在区域设置解析,失去焦点时提交为 1234234234。输入过程中不会拦截按键。',
|
|
524
|
+
},
|
|
507
525
|
{
|
|
508
526
|
guidance: true,
|
|
509
527
|
description:
|
|
@@ -573,6 +591,11 @@ export const docsDense = {
|
|
|
573
591
|
description:
|
|
574
592
|
'A form input for numeric values with built-in validation, min/max constraints, and step controls. Use NumberInput for quantities, measurements, percentages, and similar inputs.',
|
|
575
593
|
bestPractices: [
|
|
594
|
+
{
|
|
595
|
+
guidance: true,
|
|
596
|
+
description:
|
|
597
|
+
"Pasted formatted numbers parse: 1,234,234,234 commits as 1234234234 under the field's locale. Typing is never intercepted.",
|
|
598
|
+
},
|
|
576
599
|
{
|
|
577
600
|
guidance: true,
|
|
578
601
|
description:
|
|
@@ -635,7 +658,8 @@ export const docsDense = {
|
|
|
635
658
|
propDescriptions: {
|
|
636
659
|
label: 'Label text (always rendered for accessibility).',
|
|
637
660
|
value: 'Current input value.',
|
|
638
|
-
onChange:
|
|
661
|
+
onChange:
|
|
662
|
+
'Callback when a valid text edit commits on blur/Enter, or a step/clear control changes the value.',
|
|
639
663
|
size: 'Size variant.',
|
|
640
664
|
isLabelHidden: 'Visually hide label (still accessible to screen readers).',
|
|
641
665
|
description: 'Text between label + input.',
|